[rsyntaxtextarea] 01/08: Imported Upstream version 2.0.7
Benjamin Mesing
ben at alioth.debian.org
Mon Sep 30 20:11:02 UTC 2013
This is an automated email from the git hooks/post-receive script.
ben pushed a commit to branch master
in repository rsyntaxtextarea.
commit be7ee478c86658ecbda8f9ba3c0a0bb7c0ee5a55
Author: Benjamin Mesing <bensmail at gmx.net>
Date: Mon Sep 23 20:57:48 2013 +0200
Imported Upstream version 2.0.7
---
.classpath | 10 +
.project | 17 +
build.xml | 116 +
distfiles/RSyntaxTextArea.License.txt | 24 +
distfiles/readme.txt | 80 +
.../fife/ui/rsyntaxtextarea/ErrorStrip.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_ar.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_de.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_es.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_fr.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_hu.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_in.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_it.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_ja.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_ko.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_nl.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_pl.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_ru.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_tr.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties | 3 +
.../ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties | 3 +
.../ui/rsyntaxtextarea/RSyntaxTextArea.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_ar.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_de.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_es.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_fr.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_hu.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_in.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_it.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_ja.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_ko.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_nl.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_pl.properties | 15 +
.../RSyntaxTextArea_pt_BR.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_ru.properties | 14 +
.../rsyntaxtextarea/RSyntaxTextArea_tr.properties | 14 +
.../RSyntaxTextArea_zh_CN.properties | 14 +
.../RSyntaxTextArea_zh_TW.properties | 14 +
.../focusabletip/FocusableTip.properties | 1 +
.../focusabletip/FocusableTip_ar.properties | 1 +
.../focusabletip/FocusableTip_de.properties | 1 +
.../focusabletip/FocusableTip_es.properties | 1 +
.../focusabletip/FocusableTip_fr.properties | 1 +
.../focusabletip/FocusableTip_hu.properties | 1 +
.../focusabletip/FocusableTip_in.properties | 1 +
.../focusabletip/FocusableTip_it.properties | 1 +
.../focusabletip/FocusableTip_ja.properties | 1 +
.../focusabletip/FocusableTip_ko.properties | 1 +
.../focusabletip/FocusableTip_nl.properties | 1 +
.../focusabletip/FocusableTip_pl.properties | 1 +
.../focusabletip/FocusableTip_pt_BR.properties | 1 +
.../focusabletip/FocusableTip_ru.properties | 1 +
.../focusabletip/FocusableTip_tr.properties | 1 +
.../focusabletip/FocusableTip_zh_CN.properties | 1 +
.../focusabletip/FocusableTip_zh_TW.properties | 1 +
i18n/org/fife/ui/rtextarea/RTextArea.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_ar.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_de.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_es.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_fr.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_hu.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_in.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_it.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_ja.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_ko.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_nl.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_pl.properties | 29 +
.../fife/ui/rtextarea/RTextArea_pt_BR.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_ru.properties | 29 +
i18n/org/fife/ui/rtextarea/RTextArea_tr.properties | 29 +
.../fife/ui/rtextarea/RTextArea_zh_CN.properties | 29 +
.../fife/ui/rtextarea/RTextArea_zh_TW.properties | 29 +
src/org/fife/io/DocumentReader.java | 209 +
src/org/fife/io/UnicodeReader.java | 268 +
src/org/fife/io/UnicodeWriter.java | 253 +
src/org/fife/io/package.html | 5 +
src/org/fife/print/RPrintUtilities.java | 530 +
src/org/fife/print/package.html | 5 +
.../rsyntaxtextarea/AbstractJFlexCTokenMaker.java | 222 +
.../rsyntaxtextarea/AbstractJFlexTokenMaker.java | 52 +
.../ui/rsyntaxtextarea/AbstractTokenMaker.java | 67 +
.../rsyntaxtextarea/AbstractTokenMakerFactory.java | 132 +
.../ui/rsyntaxtextarea/ActiveLineRangeEvent.java | 68 +
.../rsyntaxtextarea/ActiveLineRangeListener.java | 44 +
.../ChangeableColorHighlightPainter.java | 67 +
.../ui/rsyntaxtextarea/CodeTemplateManager.java | 470 +
.../rsyntaxtextarea/DefaultOccurrenceMarker.java | 53 +
.../ui/rsyntaxtextarea/DefaultTokenFactory.java | 137 +
.../rsyntaxtextarea/DefaultTokenMakerFactory.java | 72 +
.../ui/rsyntaxtextarea/DefaultTokenPainter.java | 267 +
src/org/fife/ui/rsyntaxtextarea/DocumentRange.java | 62 +
src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java | 766 +
.../fife/ui/rsyntaxtextarea/FileFileLocation.java | 114 +
src/org/fife/ui/rsyntaxtextarea/FileLocation.java | 141 +
.../rsyntaxtextarea/FoldingAwareIconRowHeader.java | 247 +
src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java | 50 +
.../ui/rsyntaxtextarea/LinkGeneratorResult.java | 53 +
.../MarkOccurrencesHighlightPainter.java | 139 +
.../ui/rsyntaxtextarea/MarkOccurrencesSupport.java | 314 +
.../fife/ui/rsyntaxtextarea/OccurrenceMarker.java | 36 +
src/org/fife/ui/rsyntaxtextarea/ParserManager.java | 707 +
.../ui/rsyntaxtextarea/PopupWindowDecorator.java | 68 +
src/org/fife/ui/rsyntaxtextarea/RSTAView.java | 62 +
.../fife/ui/rsyntaxtextarea/RSyntaxDocument.java | 589 +
.../fife/ui/rsyntaxtextarea/RSyntaxTextArea.java | 3018 +++
.../RSyntaxTextAreaDefaultInputMap.java | 79 +
.../rsyntaxtextarea/RSyntaxTextAreaEditorKit.java | 1903 ++
.../RSyntaxTextAreaHighlighter.java | 449 +
.../fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java | 256 +
.../fife/ui/rsyntaxtextarea/RSyntaxUtilities.java | 1332 +
src/org/fife/ui/rsyntaxtextarea/RTfToText.java | 227 +
src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java | 484 +
.../fife/ui/rsyntaxtextarea/RtfTransferable.java | 91 +
.../SelectRegionLinkGeneratorResult.java | 59 +
.../SquiggleUnderlineHighlightPainter.java | 117 +
src/org/fife/ui/rsyntaxtextarea/Style.java | 192 +
.../fife/ui/rsyntaxtextarea/SyntaxConstants.java | 253 +
src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java | 675 +
src/org/fife/ui/rsyntaxtextarea/SyntaxView.java | 974 +
.../fife/ui/rsyntaxtextarea/TextEditorPane.java | 712 +
src/org/fife/ui/rsyntaxtextarea/Theme.java | 842 +
src/org/fife/ui/rsyntaxtextarea/Token.java | 1090 +
src/org/fife/ui/rsyntaxtextarea/TokenFactory.java | 67 +
src/org/fife/ui/rsyntaxtextarea/TokenMaker.java | 170 +
.../fife/ui/rsyntaxtextarea/TokenMakerBase.java | 298 +
.../fife/ui/rsyntaxtextarea/TokenMakerFactory.java | 124 +
src/org/fife/ui/rsyntaxtextarea/TokenMap.java | 276 +
.../fife/ui/rsyntaxtextarea/TokenOrientedView.java | 61 +
src/org/fife/ui/rsyntaxtextarea/TokenPainter.java | 96 +
src/org/fife/ui/rsyntaxtextarea/TokenTypes.java | 85 +
.../fife/ui/rsyntaxtextarea/URLFileLocation.java | 153 +
.../VisibleWhitespaceTokenPainter.java | 188 +
.../fife/ui/rsyntaxtextarea/WrappedSyntaxView.java | 1372 ++
.../ui/rsyntaxtextarea/WrappedSyntaxView2.java | 157 +
.../ui/rsyntaxtextarea/XmlOccurrenceMarker.java | 185 +
.../rsyntaxtextarea/focusabletip/FocusableTip.java | 344 +
.../ui/rsyntaxtextarea/focusabletip/SizeGrip.java | 249 +
.../ui/rsyntaxtextarea/focusabletip/TipUtil.java | 226 +
.../ui/rsyntaxtextarea/focusabletip/TipWindow.java | 334 +
.../rsyntaxtextarea/focusabletip/osx_sizegrip.png | Bin 0 -> 4876 bytes
.../ui/rsyntaxtextarea/focusabletip/package.html | 5 +
.../rsyntaxtextarea/folding/CurlyFoldParser.java | 317 +
src/org/fife/ui/rsyntaxtextarea/folding/Fold.java | 564 +
.../ui/rsyntaxtextarea/folding/FoldCollapser.java | 106 +
.../ui/rsyntaxtextarea/folding/FoldManager.java | 710 +
.../ui/rsyntaxtextarea/folding/FoldParser.java | 41 +
.../rsyntaxtextarea/folding/FoldParserManager.java | 120 +
.../fife/ui/rsyntaxtextarea/folding/FoldType.java | 59 +
.../ui/rsyntaxtextarea/folding/HtmlFoldParser.java | 402 +
.../ui/rsyntaxtextarea/folding/JsonFoldParser.java | 161 +
.../rsyntaxtextarea/folding/LatexFoldParser.java | 108 +
.../ui/rsyntaxtextarea/folding/LispFoldParser.java | 33 +
.../ui/rsyntaxtextarea/folding/NsisFoldParser.java | 156 +
.../ui/rsyntaxtextarea/folding/XmlFoldParser.java | 148 +
.../fife/ui/rsyntaxtextarea/folding/package.html | 5 +
.../modes/AbstractMarkupTokenMaker.java | 54 +
.../modes/ActionScriptTokenMaker.flex | 498 +
.../modes/ActionScriptTokenMaker.java | 2071 ++
.../modes/AssemblerX86TokenMaker.flex | 1035 +
.../modes/AssemblerX86TokenMaker.java | 1867 ++
.../ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex | 270 +
.../ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java | 725 +
.../rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex | 669 +
.../rsyntaxtextarea/modes/CPlusPlusTokenMaker.java | 2319 ++
.../ui/rsyntaxtextarea/modes/CSSTokenMaker.flex | 413 +
.../ui/rsyntaxtextarea/modes/CSSTokenMaker.java | 976 +
.../ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex | 517 +
.../ui/rsyntaxtextarea/modes/CSharpTokenMaker.java | 1600 ++
.../fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex | 643 +
.../fife/ui/rsyntaxtextarea/modes/CTokenMaker.java | 2072 ++
.../rsyntaxtextarea/modes/ClojureTokenMaker.flex | 568 +
.../rsyntaxtextarea/modes/ClojureTokenMaker.java | 2296 ++
.../ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex | 562 +
.../ui/rsyntaxtextarea/modes/DelphiTokenMaker.java | 1631 ++
.../ui/rsyntaxtextarea/modes/DtdTokenMaker.flex | 345 +
.../ui/rsyntaxtextarea/modes/DtdTokenMaker.java | 828 +
.../rsyntaxtextarea/modes/FortranTokenMaker.flex | 480 +
.../rsyntaxtextarea/modes/FortranTokenMaker.java | 1011 +
.../ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex | 888 +
.../ui/rsyntaxtextarea/modes/GroovyTokenMaker.java | 5269 ++++
.../ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex | 1187 +
.../ui/rsyntaxtextarea/modes/HTMLTokenMaker.java | 2984 +++
.../ui/rsyntaxtextarea/modes/JSPTokenMaker.flex | 1563 ++
.../ui/rsyntaxtextarea/modes/JSPTokenMaker.java | 5316 ++++
.../modes/JavaScriptTokenMaker.flex | 888 +
.../modes/JavaScriptTokenMaker.java | 2130 ++
.../ui/rsyntaxtextarea/modes/JavaTokenMaker.flex | 754 +
.../ui/rsyntaxtextarea/modes/JavaTokenMaker.java | 4966 ++++
.../ui/rsyntaxtextarea/modes/JsonTokenMaker.flex | 260 +
.../ui/rsyntaxtextarea/modes/JsonTokenMaker.java | 699 +
.../ui/rsyntaxtextarea/modes/LatexTokenMaker.flex | 268 +
.../ui/rsyntaxtextarea/modes/LatexTokenMaker.java | 716 +
.../ui/rsyntaxtextarea/modes/LispTokenMaker.flex | 432 +
.../ui/rsyntaxtextarea/modes/LispTokenMaker.java | 1308 +
.../ui/rsyntaxtextarea/modes/LuaTokenMaker.flex | 372 +
.../ui/rsyntaxtextarea/modes/LuaTokenMaker.java | 967 +
.../rsyntaxtextarea/modes/MakefileTokenMaker.flex | 336 +
.../rsyntaxtextarea/modes/MakefileTokenMaker.java | 863 +
.../ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex | 809 +
.../ui/rsyntaxtextarea/modes/MxmlTokenMaker.java | 2704 +++
.../ui/rsyntaxtextarea/modes/NSISTokenMaker.flex | 745 +
.../ui/rsyntaxtextarea/modes/NSISTokenMaker.java | 2979 +++
.../ui/rsyntaxtextarea/modes/PHPTokenMaker.flex | 2319 ++
.../ui/rsyntaxtextarea/modes/PHPTokenMaker.java |25424 ++++++++++++++++++++
.../ui/rsyntaxtextarea/modes/PerlTokenMaker.flex | 810 +
.../ui/rsyntaxtextarea/modes/PerlTokenMaker.java | 2106 ++
.../rsyntaxtextarea/modes/PlainTextTokenMaker.flex | 226 +
.../rsyntaxtextarea/modes/PlainTextTokenMaker.java | 643 +
.../modes/PropertiesFileTokenMaker.flex | 235 +
.../modes/PropertiesFileTokenMaker.java | 661 +
.../ui/rsyntaxtextarea/modes/PythonTokenMaker.flex | 441 +
.../ui/rsyntaxtextarea/modes/PythonTokenMaker.java | 1088 +
.../ui/rsyntaxtextarea/modes/RubyTokenMaker.flex | 763 +
.../ui/rsyntaxtextarea/modes/RubyTokenMaker.java | 1666 ++
.../ui/rsyntaxtextarea/modes/SASTokenMaker.flex | 675 +
.../ui/rsyntaxtextarea/modes/SASTokenMaker.java | 1488 ++
.../ui/rsyntaxtextarea/modes/SQLTokenMaker.flex | 463 +
.../ui/rsyntaxtextarea/modes/SQLTokenMaker.java | 1126 +
.../ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex | 386 +
.../ui/rsyntaxtextarea/modes/ScalaTokenMaker.java | 995 +
.../ui/rsyntaxtextarea/modes/TclTokenMaker.flex | 404 +
.../ui/rsyntaxtextarea/modes/TclTokenMaker.java | 1075 +
.../rsyntaxtextarea/modes/UnixShellTokenMaker.java | 1113 +
.../modes/VisualBasicTokenMaker.flex | 462 +
.../modes/VisualBasicTokenMaker.java | 1619 ++
.../modes/WindowsBatchTokenMaker.java | 603 +
.../ui/rsyntaxtextarea/modes/XMLTokenMaker.flex | 485 +
.../ui/rsyntaxtextarea/modes/XMLTokenMaker.java | 992 +
src/org/fife/ui/rsyntaxtextarea/modes/package.html | 5 +
src/org/fife/ui/rsyntaxtextarea/package.html | 5 +
.../ui/rsyntaxtextarea/parser/AbstractParser.java | 95 +
.../rsyntaxtextarea/parser/DefaultParseResult.java | 145 +
.../parser/DefaultParserNotice.java | 268 +
.../parser/ExtendedHyperlinkListener.java | 38 +
.../ui/rsyntaxtextarea/parser/ParseResult.java | 84 +
src/org/fife/ui/rsyntaxtextarea/parser/Parser.java | 76 +
.../ui/rsyntaxtextarea/parser/ParserNotice.java | 130 +
.../ui/rsyntaxtextarea/parser/TaskTagParser.java | 158 +
.../ui/rsyntaxtextarea/parser/ToolTipInfo.java | 95 +
.../fife/ui/rsyntaxtextarea/parser/XmlParser.java | 229 +
.../fife/ui/rsyntaxtextarea/parser/package.html | 9 +
.../templates/AbstractCodeTemplate.java | 132 +
.../ui/rsyntaxtextarea/templates/CodeTemplate.java | 73 +
.../templates/StaticCodeTemplate.java | 262 +
.../fife/ui/rsyntaxtextarea/templates/package.html | 5 +
.../fife/ui/rtextarea/AbstractGutterComponent.java | 114 +
.../ui/rtextarea/BackgroundPainterStrategy.java | 44 +
.../BufferedImageBackgroundPainterStrategy.java | 98 +
.../ui/rtextarea/ChangeableHighlightPainter.java | 440 +
.../rtextarea/ColorBackgroundPainterStrategy.java | 108 +
src/org/fife/ui/rtextarea/ConfigurableCaret.java | 722 +
src/org/fife/ui/rtextarea/FoldIndicator.java | 685 +
src/org/fife/ui/rtextarea/Gutter.java | 965 +
src/org/fife/ui/rtextarea/GutterIconInfo.java | 53 +
src/org/fife/ui/rtextarea/IconGroup.java | 245 +
src/org/fife/ui/rtextarea/IconRowHeader.java | 864 +
.../rtextarea/ImageBackgroundPainterStrategy.java | 171 +
.../fife/ui/rtextarea/LineHighlightManager.java | 207 +
src/org/fife/ui/rtextarea/LineNumberList.java | 710 +
src/org/fife/ui/rtextarea/Macro.java | 392 +
src/org/fife/ui/rtextarea/RDocument.java | 65 +
.../fife/ui/rtextarea/RDocumentCharSequence.java | 118 +
src/org/fife/ui/rtextarea/RTADefaultInputMap.java | 151 +
.../fife/ui/rtextarea/RTATextTransferHandler.java | 480 +
src/org/fife/ui/rtextarea/RTextArea.java | 1707 ++
src/org/fife/ui/rtextarea/RTextAreaBase.java | 1179 +
src/org/fife/ui/rtextarea/RTextAreaEditorKit.java | 2582 ++
src/org/fife/ui/rtextarea/RTextAreaUI.java | 581 +
src/org/fife/ui/rtextarea/RTextScrollPane.java | 236 +
src/org/fife/ui/rtextarea/RUndoManager.java | 251 +
.../fife/ui/rtextarea/RecordableTextAction.java | 289 +
src/org/fife/ui/rtextarea/RegExReplaceInfo.java | 85 +
src/org/fife/ui/rtextarea/SearchContext.java | 244 +
src/org/fife/ui/rtextarea/SearchEngine.java | 833 +
src/org/fife/ui/rtextarea/ToolTipSupplier.java | 39 +
.../VolatileImageBackgroundPainterStrategy.java | 136 +
src/org/fife/ui/rtextarea/package.html | 5 +
src/org/fife/util/DynamicIntArray.java | 423 +
src/org/fife/util/package.html | 5 +
src/theme.dtd | 78 +
test/org/fife/ui/rtextarea/SearchEngineTest.java | 647 +
test/org/fife/ui/rtextarea/text.txt | 1 +
themes/dark.xml | 78 +
themes/default-alt.xml | 78 +
themes/default.xml | 78 +
themes/eclipse.xml | 78 +
themes/idea.xml | 78 +
themes/vs.xml | 78 +
289 files changed, 156740 insertions(+)
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..75d073c
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="i18n"/>
+ <classpathentry kind="src" path="test"/>
+ <classpathentry kind="src" path="themes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..e31ac69
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>RSyntaxTextArea</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..0d47079
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+ This is the Ant build script for rsyntaxtextarea.jar.
+ Available targets include:
+
+ 1. compile: Compiles all org.fife classes into ${class-dir}.
+ 2. make-jar: Creates the jar file.
+ 3. make-source-zip: Creates a source zip file.
+ 3. make-javadoc: Creates the javadoc for RSyntaxTextArea.
+
+ Author: Robert Futrell
+ Version: 1.4
+ Date: 20feb2009
+
+-->
+
+
+<project name="RSyntaxTextArea" default="make-jar" basedir=".">
+
+ <description>RSyntaxTextArea build file</description>
+
+
+ <!-- Set global properties for this build. -->
+ <property name="version" value="2.0.7"/>
+ <property name="source-dir" location="src"/>
+ <property name="class-dir" location="ant-classes"/>
+ <property name="dist-dir" location="dist"/>
+ <property name="doc-dir" location="javadoc"/>
+ <property name="debug" value="true"/>
+ <property name="debuglevel" value="lines,vars,source"/>
+ <property name="java-level" value="1.4"/>
+
+
+ <!-- Compiles the classes. -->
+ <target name="compile" description="Compile the source">
+ <delete includeEmptyDirs="true" quiet="true" dir="${class-dir}"/>
+ <mkdir dir="${class-dir}"/>
+ <echo>NOTE: *** RSyntaxTextArea is built with a 1.4.2 JDK!</echo>
+ <echo>NOTE: *** If you build with Java 5 or newer, you will receive a compile error</echo>
+ <echo>NOTE: *** about an XmlParser.java method missing IOException in its throws</echo>
+ <echo>NOTE: *** clause. This is caused by a binary incompatibility between Java</echo>
+ <echo>NOTE: *** 1.4 and Java 5. To remedy this, either build with 1.4.2, or add</echo>
+ <echo>NOTE: *** IOException to the throws clause.</echo>
+ <javac srcdir="${source-dir}" destdir="${class-dir}"
+ deprecation="yes" debug="${debug}" debuglevel="${debuglevel}"
+ source="${java-level}" target="${java-level}" includeantruntime="false"/>
+ </target>
+
+
+ <!-- Creates the jar file. -->
+ <target name="make-jar" depends="compile"
+ description="Create RSyntaxTextArea jar">
+ <delete includeEmptyDirs="true" quiet="true" dir="${dist-dir}"/>
+ <mkdir dir="${dist-dir}"/>
+ <jar destfile="${dist-dir}/rsyntaxtextarea.jar">
+ <fileset dir="${class-dir}"/>
+ <fileset dir="i18n"/>
+ <fileset dir="${source-dir}">
+ <include name="theme.dtd"/>
+ </fileset>
+ <manifest>
+ <attribute name="Specification-Title" value="RSyntaxTextArea"/>
+ <attribute name="Specification-Version" value="${version}"/>
+ <attribute name="Implementation-Title" value="org.fife.ui"/>
+ <attribute name="Implementation-Version" value="${version}"/>
+ <section name="RTextArea">
+ <attribute name="Specification-Title" value="RTextArea"/>
+ <attribute name="Specification-Version" value="${version}"/>
+ <attribute name="Implementation-Title" value="org.fife.ui.rtextarea"/>
+ <attribute name="Implementation-Version" value="${version}"/>
+ </section>
+ <section name="RSyntaxTextArea">
+ <attribute name="Specification-Title" value="RSyntaxTextArea-Core"/>
+ <attribute name="Specification-Version" value="${version}"/>
+ <attribute name="Implementation-Title" value="org.fife.ui.rsyntaxtextarea"/>
+ <attribute name="Implementation-Version" value="${version}"/>
+ </section>
+ </manifest>
+ </jar>
+ <copy todir="${dist-dir}">
+ <fileset dir="distfiles"/>
+ </copy>
+ </target>
+
+
+ <!-- Builds the source zip file. -->
+ <target name="make-source-zip" description="Builds the source zip file">
+ <zip destfile="./rsyntaxtextarea_${version}_Source.zip">
+ <fileset dir=".">
+ <include name="distfiles/**"/>
+ <include name="src/**"/>
+ <include name="i18n/**"/>
+ <include name="test/**"/>
+ <include name="themes/**"/>
+ <include name="build.xml"/>
+ <include name=".project"/>
+ <include name=".classpath"/>
+ </fileset>
+ </zip>
+ </target>
+
+
+ <!-- Builds the javadoc. -->
+ <target name="make-javadoc" depends="compile">
+ <javadoc destdir="${doc-dir}" author="true" version="true"
+ breakiterator="yes">
+ <packageset dir="${source-dir}" defaultexcludes="yes">
+ <include name="org/**"/>
+ </packageset>
+ </javadoc>
+ </target>
+
+
+</project>
diff --git a/distfiles/RSyntaxTextArea.License.txt b/distfiles/RSyntaxTextArea.License.txt
new file mode 100644
index 0000000..260c1c8
--- /dev/null
+++ b/distfiles/RSyntaxTextArea.License.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2012, Robert Futrell
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the author nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/distfiles/readme.txt b/distfiles/readme.txt
new file mode 100644
index 0000000..7a76b3c
--- /dev/null
+++ b/distfiles/readme.txt
@@ -0,0 +1,80 @@
+RSyntaxTextArea Readme
+----------------------
+Please contact me if you are using RSyntaxTextArea in your project! I like
+to know when people are finding it useful. Please send mail to:
+robert -at- fifesoft dot com.
+
+
+* About RSyntaxTextArea
+
+ RSyntaxTextArea is a syntax highlighting text component, written in Swing.
+ It allows applications to easily embed syntax highlighting for most common
+ programming languages. Most other standard programmer's editor features are
+ built-in: auto-indent, bracket matching, undo/redo, etc. Auto-completion
+ is available as an add-on library (see http://fifesoft.com/autocomplete).
+
+* License
+
+ RSyntaxTextArea is licensed under a modified BSD license. Please see the
+ included RSyntaxTextArea.License.txt file.
+
+* Compiling
+
+ If you wish to compile RSyntaxTextArea from source, the easiest way to do so
+ is via the included Ant build script. The default target builds the jar.
+
+ cd RSyntaxTextArea
+ ant
+
+ Note that RSyntaxTextArea should be built with a 1.4 JDK, to ensure strict
+ compatibility when running in a 1.4 JVM. If you choose to compile with
+ Java 5 or later, you will run into the following compiler error:
+
+ [javac] ...\XmlParser.java:216: unreported exception java.io.IOException;
+ must be caught or declared to be thrown
+ [javac] return super.resolveEntity(publicId, systemId);
+
+ This occurs because Java 5 changed the signature of the resolveEntity()
+ method to also throw IOExceptions. Simply adding IOException to the throws
+ clause of the method in XmlParser.java will clear up the problem.
+
+ In a future release, RSyntaxTextArea may drop support for Java 1.4, at which
+ time the XmlParser class will of course be modified to compile cleanly with
+ Java 5 compilers.
+
+* Feedback
+
+ I hope you find RSyntaxTextArea useful. Bug reports, feature requests, and
+ just general questions are always welcome. Ways you can submit feedback:
+
+ * http://forum.fifesoft.com (preferred)
+ Has a forum for RSyntaxTextArea and related projects, where you can
+ ask questions and get feedback quickly.
+
+ * http://sourceforge.net/projects/rsyntaxtextarea
+ Has a tracker for bug reports, feature requests, etc.
+
+ * http://fifesoft.com/rsyntaxtextarea
+ Project home page, which contains general information and example
+ source code.
+
+* Thanks
+
+ Translations:
+
+ * Arabic: Mawaheb, Linostar
+ * Chinese: Terrance, peter_barnes, Sunquan, sonyichi, zvest
+ * Chinese (Traditional): kin Por Fok, liou xiao
+ * Dutch: Roel, Sebastiaan, lovepuppy
+ * French: Pat, PivWan
+ * German: Domenic, bikerpete
+ * Hungarian: Zityi, flatron
+ * Indonesian: azis, Sonny
+ * Italian: Luca, stepagweb
+ * Japanese: Josh, izumi, tomoM
+ * Korean: Changkyoon sbrownii
+ * Polish: Chris, Maciej Mrug
+ * Portuguese (Brazil): Pat, Marcos Parmeggiani, Leandro
+ * Russian: Nadiya, Vladimir
+ * Spanish: Leonardo, phrodo, daloporhecho
+ * Turkish: Cahit, Burak
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties
new file mode 100644
index 0000000..dc270ad
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ar.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=\u0647\u0646\u0627\u0643 \u0639\u062f\u0629 \u062a\u062d\u062f\u064a\u062f\u0627\u062a \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0633\u0637\u0631:
+OccurrenceOf=\u0639\u062f\u062f \u0645\u0631\u0627\u062a \u062d\u062f\u0648\u062b"{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties
new file mode 100644
index 0000000..8b1d447
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_de.properties
@@ -0,0 +1,3 @@
+Line=Zeile: {0}
+MultipleMarkers=Mehrfache Markierungen in dieser Zeile:
+OccurrenceOf=Auftreten von "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties
new file mode 100644
index 0000000..bdf08b6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_es.properties
@@ -0,0 +1,3 @@
+Line=Linea: {0}
+MultipleMarkers=M\u00faltiples marcadores en esta linea:
+OccurrenceOf=Ocurrencia de "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties
new file mode 100644
index 0000000..27e90a6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_fr.properties
@@ -0,0 +1,3 @@
+Line=Ligne: {0}
+MultipleMarkers=Plusieurs rep\u00e8res sur cette ligne:
+OccurrenceOf=Pr\u00e9sence de "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties
new file mode 100644
index 0000000..b787770
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_hu.properties
@@ -0,0 +1,3 @@
+Line=Sor: {0}
+MultipleMarkers=T\u00f6bb jel\u00f6l\u0151 ebben a sorban:
+OccurrenceOf=A(z) "{0}" el\u0151fordul\u00e1sa
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_in.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties
new file mode 100644
index 0000000..8951e0e
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_it.properties
@@ -0,0 +1,3 @@
+Line=Linea: {0}
+MultipleMarkers=Multipli punti a questa linea:
+OccurrenceOf=Occorrenze di "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties
new file mode 100644
index 0000000..4fe16db
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ja.properties
@@ -0,0 +1,3 @@
+Line=\u884c: {0}
+MultipleMarkers=\u3053\u306e\u884c\u306e\u4e2d\u306b\u3044\u304f\u3064\u306e\u30de\u30fc\u30ab\u30fc\u306f\u3042\u308a\u307e\u3059:
+OccurrenceOf=\u51fa\u73fe\u56de\u6570 "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties
new file mode 100644
index 0000000..eef6808
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ko.properties
@@ -0,0 +1,3 @@
+Line=\ud589: {0}
+MultipleMarkers=\uc774 \ud589\uc5d0 \ubcf5\uc218\uc758 \ub9c8\ucee4 \uc874\uc7ac:
+OccurrenceOf="{0}" \ubc1c\uc0dd
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_nl.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties
new file mode 100644
index 0000000..a281a0b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pl.properties
@@ -0,0 +1,3 @@
+Line=Linia: {0}
+MultipleMarkers=Wiele znacznik w tej linii:
+OccurrenceOf=Wyst\u0119powanie "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties
new file mode 100644
index 0000000..0e23c96
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties
@@ -0,0 +1,3 @@
+Line=Linha: {0}
+MultipleMarkers=M\u00faltiplos marcadores nesta linha:
+OccurrenceOf=Ocorr\u00eancia de: "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties
new file mode 100644
index 0000000..87257da
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_ru.properties
@@ -0,0 +1,3 @@
+Line=\u0421\u0442\u0440\u043e\u043a\u0430: {0}
+MultipleMarkers=\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435:
+OccurrenceOf=\u0412\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties
new file mode 100644
index 0000000..d096eba
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_tr.properties
@@ -0,0 +1,3 @@
+Line=Sat\u0131r: {0}
+MultipleMarkers=Bu sat\u0131rda birden fazla i\u015faret\u00e7i:
+OccurrenceOf="{0}"\u0131n bulunmas\u0131
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties
new file mode 100644
index 0000000..70ac061
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties
@@ -0,0 +1,3 @@
+Line=\u884c: {0}
+MultipleMarkers=\u6b64\u884c\u6709\u591a\u6807\u8bb0
+OccurrenceOf=\u6709"{0}"\u51fa\u73b0
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties
new file mode 100644
index 0000000..bac1c28
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties
@@ -0,0 +1,3 @@
+Line=Line: {0}
+MultipleMarkers=Multiple markers at this line:
+OccurrenceOf=Occurrence of "{0}"
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties
new file mode 100644
index 0000000..fe97708
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u0637\u0648\u064a
+
+Action.ToggleCurrentFold.Name=\u063a\u064a\u0651\u0631 \u0648\u0636\u0639\u064a\u0629 \u0627\u0644\u0637\u0648\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u063a\u064a\u064a\u0631 \u0648\u0636\u0639\u064a\u0629 \u0627\u0644\u0637\u0648\u064a\u0629 \u0641\u064a \u0645\u0648\u0642\u0639 \u0627\u0644\u0645\u0624\u0634\u0631 \u0627\u0644\u062d\u0627\u0644\u064a
+Action.CollapseAllFolds.Name=\u0642\u0644\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0642\u0644\u064a\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.CollapseCommentFolds.Name=\u0642\u0644\u0635 \u062c\u0645\u064a\u0639 \u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0642\u0644\u064a\u0635 \u062c\u0645\u064a\u0639 \u0637\u064a\u0627\u062a \u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a
+Action.ExpandAllFolds.Name=\u0648\u0633\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u0645\u0646 \u0623\u062c\u0644 \u062a\u0648\u0633\u064a\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0637\u064a\u0627\u062a.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties
new file mode 100644
index 0000000..fb0a440
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Klappung
+
+Action.ToggleCurrentFold.Name=Aktuellen Block umschalten
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Schaltet den Block an der Position der Schreibmarke um.
+Action.CollapseAllFolds.Name=Action.CollapseAllFolds.Name=Alle Bl\u00f6cke zuklappen
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Klappt alle Bl\u00f6cke zu.
+Action.CollapseCommentFolds.Name=Alle Kommentarbl\u00f6cke zuklappen
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Klappt alle Kommentarbl\u00f6cke zu.
+Action.ExpandAllFolds.Name=Alle Bl\u00f6cke aufklappen
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Klappt alle Bl\u00f6cke auf.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties
new file mode 100644
index 0000000..693396d
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Ver Fold (solapa) actual
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Mostrar el fold en la posici\u00f3n del cursor
+Action.CollapseAllFolds.Name=Ocultar todos los folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Oculta todos los folds
+Action.CollapseCommentFolds.Name=Ocultar todos los comentarios
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Oculta todos los comentarios
+Action.ExpandAllFolds.Name=Expandir todos las solapas (folds)
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expande todas las solapas (folds)
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties
new file mode 100644
index 0000000..a662148
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Pliage
+
+Action.ToggleCurrentFold.Name=Active ou d\u00e9sactive le pli actuel
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Active ou d\u00e9sactive le pli \u00e0 la position du curseur.
+Action.CollapseAllFolds.Name=Comprimer tous les plis
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Comprime tous les plis.
+Action.CollapseCommentFolds.Name=Comprimer tous les commentaires
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Comprime tous les plis commentaires.
+Action.ExpandAllFolds.Name=D\u00e9comrpimer tous les plis
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=D\u00e9comrpime tous les plis.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties
new file mode 100644
index 0000000..e867551
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u00d6sszevon\u00e1s
+
+Action.ToggleCurrentFold.Name=A jelenlegi \u00f6sszevon\u00e1s megjelen\u00edt\u00e9se/rejt\u00e9se.
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Megjelen\u00edti, illetve elt\u00fcnteti az \u00f6sszevon\u00e1st a kurzor poz\u00edci\u00f3j\u00e1ban.
+Action.CollapseAllFolds.Name=\u00d6sszevon\u00e1sok rejt\u00e9se.
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u00d6sszevon\u00e1sok rejt\u00e9se.
+Action.CollapseCommentFolds.Name=Az \u00f6sszes megjegyz\u00e9s elrejt\u00e9se
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Megjegyz\u00e9s \u00f6sszevon\u00e1sok rejt\u00e9se.
+Action.ExpandAllFolds.Name=\u00d6sszevon\u00e1sok kiterjeszt\u00e9se
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u00d6sszevon\u00e1sok kiterjeszt\u00e9se.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties
new file mode 100644
index 0000000..c1befc1
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Imposta il fold corrente
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Imposta il fold alla posizione corrente.
+Action.CollapseAllFolds.Name=Raggruppa tutti i fold
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Raggruppa tutti i fold.
+Action.CollapseCommentFolds.Name=Raggruppa tutti i commenti
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Raggruppa tutti i commenti.
+Action.ExpandAllFolds.Name=Espandi tutti i fold
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Espandi tutti i fold.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties
new file mode 100644
index 0000000..a39353b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u30d5\u30a9\u30eb\u30c7\u30a3\u30f3\u30b0
+
+Action.ToggleCurrentFold.Name=\u30ad\u30e3\u30ec\u30c3\u30c8\u5074\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u30c8\u30b0\u30eb\u3059\u308b\u3002
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u30ad\u30e3\u30ec\u30c3\u30c8\u5074\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u30c8\u30b0\u30eb\u3059\u308b\u3002
+Action.CollapseAllFolds.Name=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u5168\u3066\u306e\u3075\u3049\u308b\u3069\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseCommentFolds.Name=\u5168\u3066\u306e\u30b3\u30e1\u30f3\u30c8\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u5168\u3066\u306e\u30b3\u30e1\u30f3\u30c8\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u6298\u308a\u305f\u305f\u3080
+Action.ExpandAllFolds.Name=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u5c55\u958b\u3059\u308b
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u5168\u3066\u306e\u30d5\u30a9\u30eb\u30c9\u3092\u5c55\u958b\u3059\u308b
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties
new file mode 100644
index 0000000..402e419
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\ucf54\ub4dc \uac10\ucd94\uae30
+
+Action.ToggleCurrentFold.Name=\ud604\uc7ac \ucf54\ub4dc \uac10\ucd94\uae30 \ud1a0\uae00
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\uce90\ub7ff \uc704\uce58\uc5d0\uc11c \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \ud1a0\uae00\ud569\ub2c8\ub2e4.
+Action.CollapseAllFolds.Name=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30 \uc811\uae30
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \uc811\uc2b5\ub2c8\ub2e4.
+Action.CollapseCommentFolds.Name=\ubaa8\ub4e0 \uc8fc\uc11d \uac10\ucd94\uae30 \uc811\uae30
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\ubaa8\ub4e0 \uc8fc\uc11d \uac10\ucd94\uae30\ub97c \uc811\uc2b5\ub2c8\ub2e4.
+Action.ExpandAllFolds.Name=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30 \ud3bc\uce58\uae30
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\ubaa8\ub4e0 \ucf54\ub4dc \uac10\ucd94\uae30\ub97c \ud3bc\uce69\ub2c8\ub2e4.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties
new file mode 100644
index 0000000..f775510
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties
@@ -0,0 +1,15 @@
+ContextMenu.Folding=Zwijanie
+
+Action.ToggleCurrentFold.Name=Reguluj zwini\u0119cie
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Ustawia zwini\u0119cie na pozycji karetki.
+Action.CollapseAllFolds.Name=Zwi\u0144 wszystkie zwini\u0119cia
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Zwija wszystkie zwini\u0119cia.
+Action.CollapseCommentFolds.Name=Zwi\u0144 wszystkie komentarze
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Zwija wszystkie zwini\u0119cia z komentarzami.
+Action.ExpandAllFolds.Name=Rozwi\u0144 zwini\u0119cia
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Rozwija wszystkie zwini\u0119cia.
+
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties
new file mode 100644
index 0000000..2fa67a7
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Dobramento de c\u00f3digo
+
+Action.ToggleCurrentFold.Name=Alternar o dobramento atual
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Alterna o dobramento na posi\u00e7\u00e3o do cursor.
+Action.CollapseAllFolds.Name=Recolher o dobramento de c\u00f3digo
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Recolher o dobramento de c\u00f3digo.
+Action.CollapseCommentFolds.Name=Recolher o dobramento de coment\u00e1rios
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Recolher o dobramento de coment\u00e1rios.
+Action.ExpandAllFolds.Name=Expandir o dobramento de c\u00f3digo
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expandir o dobramento de c\u00f3digo.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties
new file mode 100644
index 0000000..3cf3e36
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435
+
+Action.ToggleCurrentFold.Name=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u043b\u043e\u043a
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u0430
+Action.CollapseAllFolds.Name=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432
+Action.CollapseCommentFolds.Name=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0431\u043b\u043e\u043a\u0430
+Action.ExpandAllFolds.Name=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties
new file mode 100644
index 0000000..6a17e12
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Katlama
+
+Action.ToggleCurrentFold.Name=\u015eu Anki Kat\u0131 Geni\u015flet/Katla
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u0130\u015faret\u00e7inin bulundu\u011fu kat\u0131 geni\u015fletir/katlar.
+Action.CollapseAllFolds.Name=T\u00fcm Katlar\u0131 Katla
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=T\u00fcm katlar\u0131 katlar.
+Action.CollapseCommentFolds.Name=T\u00fcm Yorumlar\u0131 Katla
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=T\u00fcm yorumlar\u0131 katlar.
+Action.ExpandAllFolds.Name=T\u00fcm Katlar\u0131 Geni\u015flet
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=T\u00fcm katlar\u0131 geni\u015fletir.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties
new file mode 100644
index 0000000..72c9bd1
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=\u6298\u53e0
+
+Action.ToggleCurrentFold.Name=\u6298\u53e0/\u5f00\u542f\u672c\u533a\u6bb5
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=\u6298\u53e0/\u5f00\u542f\u63d2\u5165\u7b26\u6240\u5728\u4f4d\u7f6e.
+Action.CollapseAllFolds.Name=\u53d6\u6d88\u6240\u6709\u4ee3\u7801\u6298\u53e0
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=\u53d6\u6d88\u6240\u6709\u4ee3\u7801\u6298\u53e0.
+Action.CollapseCommentFolds.Name=\u53d6\u6d88\u6ce8\u91ca\u4ee3\u7801\u6298\u53e0
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=\u53d6\u6d88\u6ce8\u91ca\u4ee3\u7801\u6298\u53e0.
+Action.ExpandAllFolds.Name=\u6253\u5f00\u6240\u6709\u4ee3\u7801\u6298\u53e0
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=\u6253\u5f00\u6240\u6709\u4ee3\u7801\u6298\u53e0.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties
new file mode 100644
index 0000000..8cb34e6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties
@@ -0,0 +1,14 @@
+ContextMenu.Folding=Folding
+
+Action.ToggleCurrentFold.Name=Toggle Current Fold
+Action.ToggleCurrentFold.Mnemonic=F
+Action.ToggleCurrentFold.Desc=Toggles the fold at the caret position.
+Action.CollapseAllFolds.Name=Collapse All Folds
+Action.CollapseAllFolds.Mnemonic=O
+Action.CollapseAllFolds.Desc=Collapses all folds.
+Action.CollapseCommentFolds.Name=Collapse All Comments
+Action.CollapseCommentFolds.Mnemonic=C
+Action.CollapseCommentFolds.Desc=Collapses all comment folds.
+Action.ExpandAllFolds.Name=Expand All Folds
+Action.ExpandAllFolds.Mnemonic=E
+Action.ExpandAllFolds.Desc=Expands all folds.
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties
new file mode 100644
index 0000000..c062d89
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties
@@ -0,0 +1 @@
+FocusHotkey=\u0627\u0636\u063a\u0637 'F2' \u0645\u0646 \u0627\u062c\u0644 \u0627\u0644\u062a\u0631\u0643\u064a\u0632
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties
new file mode 100644
index 0000000..720e386
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties
@@ -0,0 +1 @@
+FocusHotkey=Zum Fokussieren 'F2' dr\u00fccken
\ No newline at end of file
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties
new file mode 100644
index 0000000..5fea661
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties
@@ -0,0 +1 @@
+FocusHotkey=Presionar 'F2' para enfocar
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties
new file mode 100644
index 0000000..66814c6
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' pour se concentrer
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties
new file mode 100644
index 0000000..b1fba5e
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties
@@ -0,0 +1 @@
+FocusHotkey=Nyomja meg az 'F2' billenty\u0171t a f\u00f3kuszba \u00e1ll\u00edt\u00e1shoz
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties
new file mode 100644
index 0000000..efb9eb8
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties
@@ -0,0 +1 @@
+FocusHotkey=Premi 'F2' per il focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties
new file mode 100644
index 0000000..3996d7d
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties
@@ -0,0 +1 @@
+FocusHotkey=\u30d5\u30a9\u30fc\u30ab\u30b9\u3092\u53d6\u5f97\u3059\u308b\u306b\u306f\u300c\uff26\uff12\u300d\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties
new file mode 100644
index 0000000..979d3e2
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties
@@ -0,0 +1 @@
+FocusHotkey=\ud3ec\ucee4\uc2a4\ub97c \uc8fc\ub824\uba74 'F2'\ub97c \ub204\ub974\uc138\uc694
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties
new file mode 100644
index 0000000..d688330
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties
@@ -0,0 +1 @@
+FocusHotkey=Naci\u015bnij 'F2' aby wy\u015bwietli\u0107
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties
new file mode 100644
index 0000000..7fc5504
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties
@@ -0,0 +1 @@
+FocusHotkey=Aperte 'F2' para focar
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties
new file mode 100644
index 0000000..7e003a3
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties
@@ -0,0 +1 @@
+FocusHotkey=\u041d\u0430\u0436\u0430\u0442\u044c 'F2' \u0434\u043b\u044f \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u043a\u0438
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties
new file mode 100644
index 0000000..fdee64f
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties
@@ -0,0 +1 @@
+FocusHotkey=Odaklanmak i\u00e7in 'F2'e bas\u0131n\u0131z
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties
new file mode 100644
index 0000000..b19534b
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties
@@ -0,0 +1 @@
+FocusHotkey=\u6309'F2' \u805a\u7126
diff --git a/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties
new file mode 100644
index 0000000..84a7e2c
--- /dev/null
+++ b/i18n/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties
@@ -0,0 +1 @@
+FocusHotkey=Press 'F2' for focus
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea.properties b/i18n/org/fife/ui/rtextarea/RTextArea.properties
new file mode 100644
index 0000000..ea20b6d
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copy
+Action.Copy.Desc=Copies current selection to the clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Removes current selection and places it on the clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Delete
+Action.Delete.Desc=Removes current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Places text on clipboard at current location in text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Select All
+Action.SelectAll.Desc=Selects all text in current text document.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Can't Undo
+Action.Undo.Desc=Takes back the last action.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Can't Redo
+Action.Redo.Desc=Re-applies the last action undone.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties
new file mode 100644
index 0000000..04d085c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ar.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=\u0646
+Action.Copy.Name=\u0646\u0633\u062e
+Action.Copy.Desc=\u0646\u0633\u062e \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Cut.Mnemonic=\u0642
+Action.Cut.Name=\u0642\u0635
+Action.Cut.Desc=\u0645\u0633\u062d \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a \u0648\u0646\u0642\u0644\u0647 \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629.
+
+Action.Delete.Mnemonic=\u062d
+Action.Delete.Name=\u062d\u0630\u0641
+Action.Delete.Desc=\u062d\u0630\u0641 \u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Paste.Mnemonic=\u0644
+Action.Paste.Name=\u0644\u0635\u0642
+Action.Paste.Desc=\u0644\u0635\u0642 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u062d\u0627\u0641\u0638\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0645\u0643\u0627\u0646.
+
+Action.SelectAll.Mnemonic=\u0643
+Action.SelectAll.Name=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0643\u0644
+Action.SelectAll.Desc=\u062a\u062d\u062f\u064a\u062f \u062c\u0645\u064a\u0639 \u0627\u0644\u0646\u0635 \u0641\u064a \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0627\u0644\u062d\u0627\u0644\u064a.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u0625\u0639\u0627\u062f\u0629 \u062a\u0646\u0641\u064a\u0630
+Action.CantUndo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Undo.Desc=\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u062a\u0631\u0627\u062c\u0639
+Action.CantRedo.Name=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639
+Action.Redo.Desc=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0622\u062e\u0631 \u062e\u0637\u0648\u0629.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_de.properties b/i18n/org/fife/ui/rtextarea/RTextArea_de.properties
new file mode 100644
index 0000000..57fbe2b
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_de.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopieren
+Action.Copy.Desc=Kopiert die aktuelle Auswahl in die Zwischenablage.
+
+Action.Cut.Mnemonic=U
+Action.Cut.Name=Ausschneiden
+Action.Cut.Desc=Ausschneiden in die Zwischenablage.
+
+Action.Delete.Mnemonic=L
+Action.Delete.Name=L\u00f6schen
+Action.Delete.Desc=Auswahl entfernen.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Einf\u00fcgen
+Action.Paste.Desc=Zwischenablage hier einf\u00fcgen.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alle ausw\u00e4hlen
+Action.SelectAll.Desc=W\u00e4hlt den gesamten Text aus.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=R\u00fcckg\u00e4ngig
+Action.CantUndo.Name=R\u00fcckg\u00e4ngig nicht m\u00f6glich
+Action.Undo.Desc=Macht die letzte Aktion r\u00fcckg\u00e4ngig.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Wiederholen
+Action.CantRedo.Name=Wiederholung nicht m\u00f6glich
+Action.Redo.Desc=Wiederholt die letzte Aktion.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_es.properties b/i18n/org/fife/ui/rtextarea/RTextArea_es.properties
new file mode 100644
index 0000000..55aceee
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_es.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia la selecci\u00f3n actual en el portapapeles.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cortar
+Action.Cut.Desc=Elimina la selecci\u00f3n actual y la p\u00f3ne en el portapapeles.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Eliminar
+Action.Delete.Desc=Elimina la selecci\u00f3n actual.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Pegar
+Action.Paste.Desc=P\u00f3ne el texto del portapapeles en la posici\u00f3n actual del archivo de texto.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Seleccionar todo
+Action.SelectAll.Desc=Selecciona todo el texto en el documento de texto actual.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Deshacer
+Action.CantUndo.Name=No se puede deshacer
+Action.Undo.Desc=Deshace la \u00faltima acci\u00f3n.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Rehacer
+Action.CantRedo.Name=No se puede rehacer
+Action.Redo.Desc=Rehace la \u00faltima acci\u00f3n deshecha.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties b/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties
new file mode 100644
index 0000000..bb56691
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_fr.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copier
+Action.Copy.Desc=Copie la s\u00e9lection dans le presse-papiers.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Couper
+Action.Cut.Desc=Coupe la s\u00e9lection et la place dans le presse-papiers.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Effacer
+Action.Delete.Desc=Efface la s\u00e9lection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Coller
+Action.Paste.Desc=Insert le contenu du presse-papiers \u00e0 l'emplacement courant.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=S\u00e9lectionner tout
+Action.SelectAll.Desc=S\u00e9lectionne tout le texte du document courant.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Annuler
+Action.CantUndo.Name=Annuler
+Action.Undo.Desc=Annule la derni\u00e8re action.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Refaire
+Action.CantRedo.Name=R\u00e9tablir
+Action.Redo.Desc=R\u00e9p\u00e8te la derni\u00e8re action annul\u00e9e.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties b/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties
new file mode 100644
index 0000000..7f512b4
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_hu.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=M\u00e1sol\u00e1s
+Action.Copy.Desc=A jelenleg kiv\u00e1lasztott r\u00e9sz m\u00e1sol\u00e1sa a v\u00e1g\u00f3lapra
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Kiv\u00e1g\u00e1s
+Action.Cut.Desc=A jelenleg kijel\u00f6lt r\u00e9sz elt\u00e1vol\u00edt\u00e1sa \u00e9s v\u00e1g\u00f3lapra helyez\u00e9se.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=T\u00f6rl\u00e9s
+Action.Delete.Desc=A jelenleg kijel\u00f6lt r\u00e9sz elt\u00e1vol\u00edt\u00e1sa.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Beilleszt\u00e9s
+Action.Paste.Desc=A sz\u00f6veges f\u00e1jl jelenlegi hely\u00e9n l\u00e9v\u0151 sz\u00f6veg v\u00e1g\u00f3lapra helyez\u00e9se.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Az \u00f6sszes kijel\u00f6l\u00e9se
+Action.SelectAll.Desc=Az \u00f6sszes sz\u00f6veg kijel\u00f6l\u00e9se a jelenlegi dokumentumban.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Visszavon\u00e1s
+Action.CantUndo.Name=Nem vonhat\u00f3 vissza
+Action.Undo.Desc=Az utols\u00f3 m\u0171velet visszavon\u00e1sa
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Ism\u00e9telt v\u00e9grehajt\u00e1s
+Action.CantRedo.Name=Nem hajthat\u00f3 v\u00e9gre \u00fajra
+Action.Redo.Desc=Az utolj\u00e1ra visszavont m\u0171velet ism\u00e9telt alkalmaz\u00e1sa.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_in.properties b/i18n/org/fife/ui/rtextarea/RTextArea_in.properties
new file mode 100644
index 0000000..e818893
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_in.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Salin
+Action.Copy.Desc=Salin current selection ke clipboard.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Cut
+Action.Cut.Desc=Hapus current selection dan letakkan dalam clipboard.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Hapus
+Action.Delete.Desc=Hapus current selection.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Paste
+Action.Paste.Desc=Letakkan text pada clipboard di lokasi saat ini dalam text file.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Pilih Semua
+Action.SelectAll.Desc=Pilih semua text dalam dokumen text saat ini.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Tidak Dapat Undo
+Action.Undo.Desc=Kembali ke aksi terakhir.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Tidak dapat Redo
+Action.Redo.Desc=Ulangi aksi terakhir yang di-undone.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_it.properties b/i18n/org/fife/ui/rtextarea/RTextArea_it.properties
new file mode 100644
index 0000000..661952c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_it.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copia
+Action.Copy.Desc=Copia la selezione corrente negli appunti.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Taglia
+Action.Cut.Desc=Rimuove la selezione corrente e la memorizza negli appunti.
+
+Action.Delete.Mnemonic=E
+Action.Delete.Name=Elimina
+Action.Delete.Desc=Rimuove la selezione corrente.
+
+Action.Paste.Mnemonic=I
+Action.Paste.Name=Incolla
+Action.Paste.Desc=Inserisce il testo presente negli appunti nella posizione corrente nel file di testo.
+
+Action.SelectAll.Mnemonic=E
+Action.SelectAll.Name=Seleziona tutto
+Action.SelectAll.Desc=Seleziona tutto il testo nel documento corrente.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Annulla
+Action.CantUndo.Name=Impossibile annullare
+Action.Undo.Desc=Annulla l'ultima azione.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Ripeti
+Action.CantRedo.Name=Impossibile ripristinare
+Action.Redo.Desc=Riapplica l'ultima azione annullata.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties
new file mode 100644
index 0000000..1d68418
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ja.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u30b3\u30d4\u30fc
+Action.Copy.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u30ab\u30c3\u30c8
+Action.Cut.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u3066\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u79fb\u3057\u307e\u3059
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u524a\u9664
+Action.Delete.Desc=\u30ab\u30ec\u30f3\u30c8\u9078\u629e\u3092\u524a\u9664\u3057\u307e\u3059
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u8cbc\u308a\u4ed8\u3051
+Action.Paste.Desc=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30ab\u30fc\u30bd\u30eb\u4f4d\u7f6e\u306b\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u3059\u3079\u3066\u9078\u629e
+Action.SelectAll.Desc=\u30ab\u30ec\u30f3\u30c8\u30c6\u30ad\u30b9\u30c8\u66f8\u985e\u306e\u30c6\u30ad\u30b9\u30c8\u3059\u3079\u3066\u3092\u9078\u629e\u3057\u307e\u3059
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u5143\u306b\u623b\u3059
+Action.CantUndo.Name=\u5143\u306b\u623b\u305b\u307e\u305b\u3093
+Action.Undo.Desc=\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u308a\u6d88\u3057\u307e\u3059
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u3084\u308a\u76f4\u3057
+Action.CantRedo.Name=\u518d\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093
+Action.Redo.Desc=\u53d6\u308a\u6d88\u3055\u308c\u305f\u524d\u56de\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u518d\u9069\u7528\u3057\u307e\u3059
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties
new file mode 100644
index 0000000..c330552
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ko.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\ubcf5\uc0ac\ud558\uae30
+Action.Copy.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud569\ub2c8\ub2e4.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\uc798\ub77c\ub0b4\uae30
+Action.Cut.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac\ud558\uace0 \uc0ad\uc81c\ud569\ub2c8\ub2e4.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\uc9c0\uc6b0\uae30
+Action.Delete.Desc=\ud604\uc7ac \uc120\ud0dd\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\ubd99\uc5ec\ub123\uae30
+Action.Paste.Desc=\ud074\ub9bd\ubcf4\ub4dc\uc5d0 \uc788\ub294 \ud14d\uc2a4\ud2b8\ub97c \ud604\uc7ac\uc758 \uc704\uce58\uc5d0 \ubd99\uc785\ub2c8\ub2e4.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\uc804\uccb4 \uc120\ud0dd
+Action.SelectAll.Desc=\ud604\uc7ac \ud14d\uc2a4\ud2b8 \ubb38\uc11c\uc758 \ubaa8\ub4e0 \ud14d\uc2a4\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\ub418\ub3cc\ub9ac\uae30
+Action.CantUndo.Name=\ub418\ub3cc\ub9b4 \uc218 \uc5c6\uc74c
+Action.Undo.Desc=\ub9c8\uc9c0\ub9c9 \ub3d9\uc791\uc744 \ucde8\uc18c\ud569\ub2c8\ub2e4.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\ub2e4\uc2dc\ud558\uae30
+Action.CantRedo.Name=\ub2e4\uc2dc \ud560\uc218 \uc5c6\uc74c
+Action.Redo.Desc=\ub418\ub3cc\ub9b0 \ub3d9\uc791\uc744 \ub2e4\uc2dc \uc801\uc6a9\ud569\ub2c8\ub2e4.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties b/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties
new file mode 100644
index 0000000..f9a5b67
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_nl.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopi\u00ebren
+Action.Copy.Desc=Kopieert de huidige selectie naar het prikbord.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Knippen
+Action.Cut.Desc=Haalt de huidige selectie weg en plaatst het op het prikbord
+
+Action.Delete.Mnemonic=V
+Action.Delete.Name=Verwijderen
+Action.Delete.Desc=Verwijdert huidige selectie.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Plakken
+Action.Paste.Desc=Plaatst tekst van het prikbordop de huidige locatie in het tekst bestand.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Alles selecteren
+Action.SelectAll.Desc=Selecteerd alle tekst in het huidige document.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=Ongedaan maken niet mogelijk
+Action.Undo.Desc=Haalt de laatste actie terug.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=Opnieuw uitvoeren niet mogelijk
+Action.Redo.Desc=Herhaalt de laatste teruggehaalde actie.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties b/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties
new file mode 100644
index 0000000..03f2f1c
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_pl.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Kopiuj
+Action.Copy.Desc=Kopiuje zaznaczenie do schowka.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Wytnij
+Action.Cut.Desc=Wycina zaznaczenie i umieszcza je w schowku.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Usu\u0144
+Action.Delete.Desc=Usuwa zaznaczenie.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Wklej
+Action.Paste.Desc=Wkleja zawarto\u015b\u0107 schowka w aktualnej pozycji.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Zaznacz wszystko
+Action.SelectAll.Desc=Zaznacza ca\u0142y tekst w otwartym dokumencie.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Cofnij
+Action.CantUndo.Name=Nie mo\u017cna cofn\u0105\u0107
+Action.Undo.Desc=Cofa ostatni\u0105 akcj\u0119.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Przywr\u00f3\u0107
+Action.CantRedo.Name=Nie mo\u017cna przywr\u00f3ci\u0107
+Action.Redo.Desc=Przywraca stan sprzed cofni\u0119cia akcji.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties b/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties
new file mode 100644
index 0000000..be626db
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_pt_BR.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=Copiar
+Action.Copy.Desc=Copia o texto selecionado para a \u00e1rea de transfer\u00eancia.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=Recortar
+Action.Cut.Desc=Remove o texto selecionado e o coloca na \u00e1rea de transfer\u00eancia.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=Excluir
+Action.Delete.Desc=Remove o texto selecionado.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=Colar
+Action.Paste.Desc=Coloca o texto da \u00e1rea de transfer\u00eancia na posi\u00e7\u00e3o atual do arquivo.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=Selecionar Tudo
+Action.SelectAll.Desc=Seleciona todo o texto no documento de texto atual.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Desfazer
+Action.CantUndo.Name=Imposs\u00edvel Desfazer
+Action.Undo.Desc=Desfaz a \u00faltima a\u00e7\u00e3o.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Refazer
+Action.CantRedo.Name=Imposs\u00edvel Refazer
+Action.Redo.Desc=Refaz a \u00faltima a\u00e7\u00e3o desfeita.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties b/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties
new file mode 100644
index 0000000..cb9cce7
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_ru.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=\u041a
+Action.Copy.Name=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+Action.Copy.Desc=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Cut.Mnemonic=\u0412
+Action.Cut.Name=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+Action.Cut.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430.
+
+Action.Delete.Mnemonic=\u0423
+Action.Delete.Name=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+Action.Delete.Desc=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430.
+
+Action.Paste.Mnemonic=\u0421
+Action.Paste.Name=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+Action.Paste.Desc=\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435.
+
+Action.SelectAll.Mnemonic=\u042b
+Action.SelectAll.Name=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+Action.SelectAll.Desc=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+Action.CantUndo.Name=\u041e\u0442\u043c\u0435\u043d\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430
+Action.Undo.Desc=\u041e\u0442\u043a\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c
+Action.CantRedo.Name=\u041f\u043e\u0432\u0442\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
+Action.Redo.Desc=\u0412\u044b\u0437\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties b/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties
new file mode 100644
index 0000000..4e35c2d
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_tr.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=K
+Action.Copy.Name=Kopyala
+Action.Copy.Desc=Secileni ClipBoarda Kopyalar.
+
+Action.Cut.Mnemonic=X
+Action.Cut.Name=Kes
+Action.Cut.Desc=Secileni Kaldirip ClipBoarda Yerlestirir.
+
+Action.Delete.Mnemonic=S
+Action.Delete.Name=Sil
+Action.Delete.Desc=Secileni Kaldir.
+
+Action.Paste.Mnemonic=Y
+Action.Paste.Name=Yapistir
+Action.Paste.Desc=Metni Metin Dosyasindaki Su Anki Yere Yapistir.
+
+Action.SelectAll.Mnemonic=T
+Action.SelectAll.Name=Tumunu Sec
+Action.SelectAll.Desc=Metin Belgesindeki Butun Metini Secer.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Geri Al
+Action.CantUndo.Name=Geri Alinamaz
+Action.Undo.Desc=Son Eylemi Geri Alir.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Tekrar Yap
+Action.CantRedo.Name=Yeniden Yapilamaz
+Action.Redo.Desc=Geri Alinan Eylemi Yeniden Uygular.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties b/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties
new file mode 100644
index 0000000..31a1247
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_zh_CN.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u590d\u5236
+Action.Copy.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u5c06\u5f53\u524d\u9009\u62e9\u590d\u5236\u5230\u526a\u8d34\u677f\u5e76\u4ece\u6587\u672c\u533a\u57df\u5220\u9664.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u5220\u9664
+Action.Delete.Desc=\u5220\u9664\u5f53\u524d\u9009\u62e9\u533a\u57df.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8d34
+Action.Paste.Desc=\u5c06\u5f53\u524d\u526a\u8d34\u677f\u5185\u5bb9\u590d\u5236\u5230\u6587\u672c\u533a\u57df.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9009
+Action.SelectAll.Desc=\u9009\u62e9\u5f53\u524d\u6587\u6863\u4e2d\u5168\u90e8\u5185\u5bb9.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=\u590d\u539f
+Action.CantUndo.Name=\u65e0\u6cd5\u64a4\u9500
+Action.Undo.Desc=\u64a4\u9500\u4e0a\u6b21\u64cd\u4f5c.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=\u91cd\u65b0\u64cd\u4f5c
+Action.CantRedo.Name=\u65e0\u6cd5\u91cd\u590d
+Action.Redo.Desc=\u6267\u884c\u4e0b\u4e2a\u64cd\u4f5c.
diff --git a/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties b/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties
new file mode 100644
index 0000000..e690b17
--- /dev/null
+++ b/i18n/org/fife/ui/rtextarea/RTextArea_zh_TW.properties
@@ -0,0 +1,29 @@
+Action.Copy.Mnemonic=C
+Action.Copy.Name=\u8907\u88fd
+Action.Copy.Desc=\u62f7\u8c9d\u73fe\u9078\u9805\u5165\u526a\u8cbc\u677f.
+
+Action.Cut.Mnemonic=T
+Action.Cut.Name=\u526a\u5207
+Action.Cut.Desc=\u522a\u9664\u9078\u64c7\u4e26\u653e\u5165\u526a\u8cbc\u677f.
+
+Action.Delete.Mnemonic=D
+Action.Delete.Name=\u522a\u9664
+Action.Delete.Desc=\u522a\u9664\u7576\u524d\u9078\u9805.
+
+Action.Paste.Mnemonic=P
+Action.Paste.Name=\u7c98\u8cbc
+Action.Paste.Desc=\u5c07\u526a\u8cbc\u677f\u4e2d\u7684\u6587\u672c\u653e\u5165\u7576\u524d\u4f4d\u7f6e.
+
+Action.SelectAll.Mnemonic=A
+Action.SelectAll.Name=\u5168\u9078
+Action.SelectAll.Desc=\u5168\u9078\u73fe\u6a94\u6848\u6240\u6709\u6587\u5b57.
+
+Action.Undo.Mnemonic=U
+Action.Undo.Name=Undo
+Action.CantUndo.Name=\u7121\u6cd5\u64a4\u92b7
+Action.Undo.Desc=\u53d6\u6d88\u6700\u5f8c\u4e00\u6b21\u884c\u52d5.
+
+Action.Redo.Mnemonic=R
+Action.Redo.Name=Redo
+Action.CantRedo.Name=\u7121\u6cd5\u91cd\u505a
+Action.Redo.Desc=\u91cd\u8907\u6700\u5f8c\u53d6\u6d88\u7684\u884c\u52d5.
diff --git a/src/org/fife/io/DocumentReader.java b/src/org/fife/io/DocumentReader.java
new file mode 100644
index 0000000..a096c96
--- /dev/null
+++ b/src/org/fife/io/DocumentReader.java
@@ -0,0 +1,209 @@
+/*
+ * 02/24/2004
+ *
+ * DocumentReader.java - A reader for javax.swing.text.Document
+ * objects.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.Reader;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+
+/**
+ * A <code>Reader</code> for <code>javax.swing.text.Document</code> objects.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class DocumentReader extends Reader {
+
+ /**
+ * The stream's position in the document.
+ */
+ private long position;
+
+ /**
+ * A remembered position in the document.
+ */
+ private long mark;
+
+ /**
+ * The document we're working on.
+ */
+ private Document document;
+
+ /**
+ * Used for fast character access.
+ */
+ private Segment segment;
+
+
+ /**
+ * Constructor.
+ *
+ * @param document The document we're 'reading'.
+ */
+ public DocumentReader(Document document) {
+ position = 0;
+ mark = -1;
+ this.document = document;
+ this.segment = new Segment();
+ }
+
+
+ /**
+ * This currently does nothing...
+ */
+ public void close() {
+ }
+
+
+ /**
+ * Marks the present position in the stream. Subsequent calls to
+ * <code>reset()</code> will reposition the stream to this point.
+ *
+ * @param readAheadLimit Ignored.
+ */
+ public void mark(int readAheadLimit) {
+ mark = position;
+ }
+
+
+ /**
+ * Tells whether this reader supports the <code>mark</code> operation.
+ * This always returns <code>true</code> for <code>DocumentReader</code>.
+ */
+ public boolean markSupported() {
+ return true;
+ }
+
+
+ /**
+ * Reads the single character at the current position in the document.
+ */
+ public int read() {
+ if(position>=document.getLength()) {
+ return -1; // Read past end of document.
+ }
+ try {
+ document.getText((int)position,1, segment);
+ position++;
+ return segment.array[segment.offset];
+ } catch (BadLocationException ble) {
+ /* Should never happen?? */
+ ble.printStackTrace();
+ return -1;
+ }
+ }
+
+
+ /**
+ * Read <code>array.length</code> characters from the beginning
+ * of the document into <code>array</code>.
+ *
+ * @param array The array to read characters into.
+ * @return The number of characters read.
+ */
+ public int read(char array[]) {
+ return read(array, 0, array.length);
+ }
+
+
+ /**
+ * Reads characters into a portion of an array.
+ *
+ * @param cbuf The destination buffer.
+ * @param off Offset at which to start storing characters.
+ * @param len Maximum number of characters to read.
+ * @return The number of characters read, or <code>-1</code> if the
+ * end of the stream (document) has been reached.
+ */
+ public int read(char cbuf[], int off, int len) {
+ int k;
+ if(position>=document.getLength()) {
+ return -1; // Read past end of document.
+ }
+ k = len;
+ if((position+k)>=document.getLength())
+ k = document.getLength() - (int)position;
+ if(off + k >= cbuf.length)
+ k = cbuf.length - off;
+ try {
+ document.getText((int)position, k, segment);
+ position += k;
+ System.arraycopy(segment.array,segment.offset,
+ cbuf,off,
+ k);
+ return k;
+ } catch (BadLocationException ble) {
+ /* Should never happen ? */
+ return -1;
+ }
+ }
+
+
+ /**
+ * Tells whether this reader is ready to be read without
+ * blocking for input. <code>DocumentReader</code> will
+ * always return true.
+ *
+ * @return <code>true</code> if the next read operation will
+ * return without blocking.
+ */
+ public boolean ready() {
+ return true;
+ }
+
+
+ /**
+ * Resets the stream. If the stream has been marked, then attempt to
+ * reposition it at the mark. If the stream has not been marked, then
+ * move it to the beginning of the document.
+ */
+ public void reset() {
+ if(mark==-1) {
+ position = 0;
+ }
+ else {
+ position = mark;
+ mark = -1;
+ }
+ }
+
+
+ /**
+ * Skips characters. This will not 'skip' past the end of the document.
+ *
+ * @param n The number of characters to skip.
+ * @return The number of characters actually skipped.
+ */
+ public long skip(long n) {
+ if (position+n<=document.getLength()) {
+ position += n;
+ return n;
+ }
+ long temp = position;
+ position = document.getLength();
+ return document.getLength() - temp;
+ }
+
+
+ /**
+ * Move to the specified position in the document. If <code>pos</code>
+ * is greater than the document's length, the stream's position is moved
+ * to the end of the document.
+ *
+ * @param pos The position in the document to move to.
+ */
+ public void seek(long pos) {
+ position = Math.min(pos, document.getLength());
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/UnicodeReader.java b/src/org/fife/io/UnicodeReader.java
new file mode 100644
index 0000000..d534940
--- /dev/null
+++ b/src/org/fife/io/UnicodeReader.java
@@ -0,0 +1,268 @@
+/*
+ * 09/23/2004
+ *
+ * UnicodeReader.java - A reader for Unicode input streams that is capable of
+ * discerning which particular encoding is being used via the BOM.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PushbackInputStream;
+import java.io.Reader;
+
+
+/**
+ * A reader capable of identifying Unicode streams by their BOMs. This class
+ * will recognize the following encodings:
+ * <ul>
+ * <li>UTF-8
+ * <li>UTF-16LE
+ * <li>UTF-16BE
+ * <li>UTF-32LE
+ * <li>UTF-32BE
+ * </ul>
+ * If the stream is not found to be any of the above, then a default encoding
+ * is used for reading. The user can specify this default encoding, or a system
+ * default will be used.<p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeReader</code> with a <code>java.io.BufferedReader</code>.<p>
+ *
+ * This class is mostly ripped off from the workaround in the description of
+ * Java Bug 4508058.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class UnicodeReader extends Reader {
+
+ /**
+ * The input stream from which we're really reading.
+ */
+ private InputStreamReader internalIn = null;
+
+ /**
+ * The encoding being used. We keep our own instead of using the string
+ * returned by <code>java.io.InputStreamReader</code> since that class
+ * does not return user-friendly names.
+ */
+ private String encoding;
+
+ /**
+ * The size of a BOM.
+ */
+ private static final int BOM_SIZE = 4;
+
+
+ /**
+ * This utility constructor is here because you will usually use a
+ * <code>UnicodeReader</code> on files.<p>
+ * Creates a reader using the encoding specified by the BOM in the file;
+ * if there is no recognized BOM, then a system default encoding is used.
+ *
+ * @param file The file from which you want to read.
+ * @throws IOException If an error occurs when checking for/reading the
+ * BOM.
+ * @throws FileNotFoundException If the file does not exist, is a
+ * directory, or cannot be opened for reading.
+ * @throws SecurityException If a security manager exists and its
+ * checkRead method denies read access to the file.
+ */
+ public UnicodeReader(String file) throws IOException,
+ FileNotFoundException, SecurityException {
+ this(new File(file));
+ }
+
+
+ /**
+ * This utility constructor is here because you will usually use a
+ * <code>UnicodeReader</code> on files.<p>
+ * Creates a reader using the encoding specified by the BOM in the file;
+ * if there is no recognized BOM, then a system default encoding is used.
+ *
+ * @param file The file from which you want to read.
+ * @throws IOException If an error occurs when checking for/reading the
+ * BOM.
+ * @throws FileNotFoundException If the file does not exist, is a
+ * directory, or cannot be opened for reading.
+ * @throws SecurityException If a security manager exists and its
+ * checkRead method denies read access to the file.
+ */
+ public UnicodeReader(File file) throws IOException, FileNotFoundException,
+ SecurityException {
+ this(new FileInputStream(file));
+ }
+
+
+ /**
+ * This utility constructor is here because you will usually use a
+ * <code>UnicodeReader</code> on files.<p>
+ * Creates a reader using the encoding specified by the BOM in the file;
+ * if there is no recognized BOM, then a specified default encoding is
+ * used.
+ *
+ * @param file The file from which you want to read.
+ * @param defaultEncoding The encoding to use if no BOM is found. If
+ * this value is <code>null</code>, a system default is used.
+ * @throws IOException If an error occurs when checking for/reading the
+ * BOM.
+ * @throws FileNotFoundException If the file does not exist, is a
+ * directory, or cannot be opened for reading.
+ * @throws SecurityException If a security manager exists and its
+ * checkRead method denies read access to the file.
+ */
+ public UnicodeReader(File file, String defaultEncoding)
+ throws IOException, FileNotFoundException,
+ SecurityException {
+ this(new FileInputStream(file), defaultEncoding);
+ }
+
+
+ /**
+ * Creates a reader using the encoding specified by the BOM in the file;
+ * if there is no recognized BOM, then a system default encoding is used.
+ *
+ * @param in The input stream from which to read.
+ * @throws IOException If an error occurs when checking for/reading the
+ * BOM.
+ */
+ public UnicodeReader(InputStream in) throws IOException {
+ this(in, null);
+ }
+
+
+ /**
+ * Creates a reader using the encoding specified by the BOM in the file;
+ * if there is no recognized BOM, then <code>defaultEncoding</code> is
+ * used.
+ *
+ * @param in The input stream from which to read.
+ * @param defaultEncoding The encoding to use if no recognized BOM is
+ * found. If this value is <code>null</code>, a system default
+ * is used.
+ * @throws IOException If an error occurs when checking for/reading the
+ * BOM.
+ */
+ public UnicodeReader(InputStream in, String defaultEncoding)
+ throws IOException {
+ init(in, defaultEncoding);
+ }
+
+
+ /**
+ * Closes this reader.
+ */
+ public void close() throws IOException {
+ internalIn.close();
+ }
+
+
+ /**
+ * Returns the encoding being used to read this input stream (i.e., the
+ * encoding of the file). If a BOM was recognized, then the specific
+ * Unicode type is returned; otherwise, either the default encoding passed
+ * into the constructor or the system default is returned.
+ *
+ * @return The encoding of the stream.
+ */
+ public String getEncoding() {
+ return encoding;
+ }
+
+
+ /**
+ * Read-ahead four bytes and check for BOM marks. Extra bytes are
+ * unread back to the stream, only BOM bytes are skipped.
+ *
+ * @param defaultEncoding The encoding to use if no BOM was recognized. If
+ * this value is <code>null</code>, then a system default is used.
+ * @throws IOException If an error occurs when trying to read a BOM.
+ */
+ protected void init(InputStream in, String defaultEncoding)
+ throws IOException {
+
+ PushbackInputStream tempIn = new PushbackInputStream(in, BOM_SIZE);
+
+ byte bom[] = new byte[BOM_SIZE];
+ int n, unread;
+ n = tempIn.read(bom, 0, bom.length);
+
+ if ((bom[0]==(byte)0x00) && (bom[1]==(byte)0x00) &&
+ (bom[2]==(byte)0xFE) && (bom[3]==(byte)0xFF)) {
+ encoding = "UTF-32BE";
+ unread = n - 4;
+ }
+
+ else if (n==BOM_SIZE && // Last 2 bytes are 0; could be an empty UTF-16
+ (bom[0]==(byte)0xFF) && (bom[1]==(byte)0xFE) &&
+ (bom[2]==(byte)0x00) && (bom[3]==(byte)0x00)) {
+ encoding = "UTF-32LE";
+ unread = n - 4;
+ }
+
+ else if ((bom[0]==(byte)0xEF) &&
+ (bom[1]==(byte)0xBB) &&
+ (bom[2]==(byte)0xBF)) {
+ encoding = "UTF-8";
+ unread = n - 3;
+ }
+
+ else if ((bom[0]==(byte)0xFE) && (bom[1] == (byte)0xFF)) {
+ encoding = "UTF-16BE";
+ unread = n - 2;
+ }
+
+ else if ((bom[0]==(byte)0xFF) && (bom[1]== (byte)0xFE)) {
+ encoding = "UTF-16LE";
+ unread = n - 2;
+ }
+
+ else {
+ // Unicode BOM mark not found, unread all bytes
+ encoding = defaultEncoding;
+ unread = n;
+ }
+
+ if (unread > 0)
+ tempIn.unread(bom, (n - unread), unread);
+ else if (unread < -1)
+ tempIn.unread(bom, 0, 0);
+
+ // Use given encoding
+ if (encoding == null) {
+ internalIn = new InputStreamReader(tempIn);
+ encoding = internalIn.getEncoding(); // Get the default.
+ }
+ else {
+ internalIn = new InputStreamReader(tempIn, encoding);
+ }
+
+ }
+
+
+ /**
+ * Read characters into a portion of an array. This method will block until
+ * some input is available, an I/O error occurs, or the end of the stream
+ * is reached.
+ *
+ * @param cbuf The buffer into which to read.
+ * @param off The offset at which to start storing characters.
+ * @param len The maximum number of characters to read.
+ *
+ * @return The number of characters read, or <code>-1</code> if the end
+ * of the stream has been reached.
+ */
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ return internalIn.read(cbuf, off, len);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/UnicodeWriter.java b/src/org/fife/io/UnicodeWriter.java
new file mode 100644
index 0000000..40dd8e4
--- /dev/null
+++ b/src/org/fife/io/UnicodeWriter.java
@@ -0,0 +1,253 @@
+/*
+ * 09/24/2004
+ *
+ * UnicodeWriter.java - Writes Unicode output with the proper BOM.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.io;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+
+/**
+ * Writes Unicode text to an output stream. If the specified encoding is a
+ * Unicode, then the text is preceded by the proper Unicode BOM. If it is any
+ * other encoding, this class behaves just like <code>OutputStreamWriter</code>.
+ * This class is here because Java's <code>OutputStreamWriter</code> apparently
+ * doesn't believe in writing BOMs.
+ * <p>
+ *
+ * For optimum performance, it is recommended that you wrap all instances of
+ * <code>UnicodeWriter</code> with a <code>java.io.BufferedWriter</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ */
+public class UnicodeWriter extends Writer {
+
+ /**
+ * If this system property evaluates to "<code>false</code>", ignoring
+ * case, files written out as UTF-8 will not have a BOM written for them.
+ * Otherwise (even if the property is not set), UTF-8 files will have a
+ * BOM written.
+ */
+ public static final String PROPERTY_WRITE_UTF8_BOM =
+ "UnicodeWriter.writeUtf8BOM";
+
+
+ /**
+ * The writer actually doing the writing.
+ */
+ private OutputStreamWriter internalOut;
+
+ private static final byte[] UTF8_BOM = new byte[] {
+ (byte)0xEF,
+ (byte)0xBB,
+ (byte)0xBF
+ };
+
+ private static final byte[] UTF16LE_BOM = new byte[] {
+ (byte)0xFF,
+ (byte)0xFE
+ };
+
+ private static final byte[] UTF16BE_BOM = new byte[] {
+ (byte)0xFE,
+ (byte)0xFF
+ };
+
+ private static final byte[] UTF32LE_BOM = new byte[] {
+ (byte)0xFF,
+ (byte)0xFE,
+ (byte)0x00,
+ (byte)0x00
+ };
+
+ private static final byte[] UTF32BE_BOM = new byte[] {
+ (byte)0x00,
+ (byte)0x00,
+ (byte)0xFE,
+ (byte)0xFF
+ };
+
+
+ /**
+ * This is a utility constructor since the vast majority of the time, this
+ * class will be used to write Unicode files.
+ *
+ * @param fileName The file to which to write the Unicode output.
+ * @param encoding The encoding to use.
+ * @throws UnsupportedEncodingException If the specified encoding is not
+ * supported.
+ * @throws IOException If an IO exception occurs.
+ */
+ public UnicodeWriter(String fileName, String encoding)
+ throws UnsupportedEncodingException, IOException {
+ this(new FileOutputStream(fileName), encoding);
+ }
+
+
+
+ /**
+ * This is a utility constructor since the vast majority of the time, this
+ * class will be used to write Unicode files.
+ *
+ * @param file The file to which to write the Unicode output.
+ * @param encoding The encoding to use.
+ * @throws UnsupportedEncodingException If the specified encoding is not
+ * supported.
+ * @throws IOException If an IO exception occurs.
+ */
+ public UnicodeWriter(File file, String encoding)
+ throws UnsupportedEncodingException, IOException {
+ this(new FileOutputStream(file), encoding);
+ }
+
+
+
+ /**
+ * Creates a new writer.
+ *
+ * @param out The output stream to write.
+ * @param encoding The encoding to use.
+ * @throws UnsupportedEncodingException If the specified encoding is not
+ * supported.
+ * @throws IOException If an IO exception occurs.
+ */
+ public UnicodeWriter(OutputStream out, String encoding)
+ throws UnsupportedEncodingException, IOException {
+ init(out, encoding);
+ }
+
+
+ /**
+ * Closes this writer.
+ *
+ * @throws IOException If an IO exception occurs.
+ */
+ public void close() throws IOException {
+ internalOut.close();
+ }
+
+
+ /**
+ * Flushes the stream.
+ *
+ * @throws IOException If an IO exception occurs.
+ */
+ public void flush() throws IOException {
+ internalOut.flush();
+ }
+
+
+ /**
+ * Returns the encoding being used to write this output stream (i.e., the
+ * encoding of the file).
+ *
+ * @return The encoding of the stream.
+ */
+ public String getEncoding() {
+ return internalOut.getEncoding();
+ }
+
+
+ /**
+ * Returns whether UTF-8 files should have a BOM in them when written.
+ *
+ * @return Whether to write a BOM for UTF-8 files.
+ */
+ public static boolean getWriteUtf8BOM() {
+ String prop = System.getProperty(PROPERTY_WRITE_UTF8_BOM);
+ if (prop!=null && Boolean.valueOf(prop).equals(Boolean.FALSE)) {
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * Initializes the internal output stream and writes the BOM if the
+ * specified encoding is a Unicode encoding.
+ *
+ * @param out The output stream we are writing.
+ * @param encoding The encoding in which to write.
+ * @throws UnsupportedEncodingException If the specified encoding isn't
+ * supported.
+ * @throws IOException If an I/O error occurs while writing a BOM.
+ */
+ private void init(OutputStream out, String encoding)
+ throws UnsupportedEncodingException, IOException {
+
+ internalOut = new OutputStreamWriter(out, encoding);
+
+ // Write the proper BOM if they specified a Unicode encoding.
+ // NOTE: Creating an OutputStreamWriter with encoding "UTF-16" DOES
+ // DOES write out the BOM; "UTF-16LE", "UTF-16BE", "UTF-32", "UTF-32LE"
+ // and "UTF-32BE" don't.
+ if ("UTF-8".equals(encoding)) {
+ if (getWriteUtf8BOM()) {
+ out.write(UTF8_BOM, 0, UTF8_BOM.length);
+ }
+ }
+ else if ("UTF-16LE".equals(encoding)) {
+ out.write(UTF16LE_BOM, 0, UTF16LE_BOM.length);
+ }
+ else if (/*"UTF-16".equals(encoding) || */"UTF-16BE".equals(encoding)) {
+ out.write(UTF16BE_BOM, 0, UTF16BE_BOM.length);
+ }
+ else if ("UTF-32LE".equals(encoding)) {
+ out.write(UTF32LE_BOM, 0, UTF32LE_BOM.length);
+ }
+ else if ("UTF-32".equals(encoding) || "UTF-32BE".equals(encoding)) {
+ out.write(UTF32BE_BOM, 0, UTF32BE_BOM.length);
+ }
+
+ }
+
+
+ /**
+ * Writes a portion of an array of characters.
+ *
+ * @param cbuf The buffer of characters.
+ * @param off The offset from which to start writing characters.
+ * @param len The number of characters to write.
+ * @throws IOException If an I/O error occurs.
+ */
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ internalOut.write(cbuf, off, len);
+ }
+
+
+ /**
+ * Writes a single character.
+ *
+ * @param c An integer specifying the character to write.
+ * @throws IOException If an IO error occurs.
+ */
+ public void write(int c) throws IOException {
+ internalOut.write(c);
+ }
+
+
+ /**
+ * Writes a portion of a string.
+ *
+ * @param str The string from which to write.
+ * @param off The offset from which to start writing characters.
+ * @param len The number of characters to write.
+ * @throws IOException If an IO error occurs.
+ */
+ public void write(String str, int off, int len) throws IOException {
+ internalOut.write(str, off, len);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/io/package.html b/src/org/fife/io/package.html
new file mode 100644
index 0000000..b998767
--- /dev/null
+++ b/src/org/fife/io/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ Utility I/O classes.
+ </body>
+</html>
diff --git a/src/org/fife/print/RPrintUtilities.java b/src/org/fife/print/RPrintUtilities.java
new file mode 100644
index 0000000..fc68f2d
--- /dev/null
+++ b/src/org/fife/print/RPrintUtilities.java
@@ -0,0 +1,530 @@
+/*
+ * 11/14/2003
+ *
+ * RPrintUtilities.java - A collection of static methods useful for printing
+ * text from Swing text components.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.print;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Segment;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.print.*;
+
+
+
+/**
+ * A collection of static methods useful for printing text from Swing text components.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class RPrintUtilities {
+
+ private static int currentDocLineNumber; // The line number in the document we are currently on.
+ private static int numDocLines; // The number of lines in the current document.
+ private static Element rootElement; // The first Element (line) in the current document.
+
+ // The characters at which to break a line if implementing word wrap.
+ private static final char [] breakChars = { ' ', '\t', ',', '.', ';', '?', '!' };
+
+ // These variables are 'global' because RPrintTabExpander uses them.
+ private static int xOffset; // The x-offset (for the page margin) when printing.
+ private static int tabSizeInSpaces; // The length of a tab, in spaces.
+ private static FontMetrics fm; // The metrics of the font currently being used to print.
+
+
+ /**
+ * Returns the position closest to, but before, position <code>maxCharsPerLine</code> in
+ * <code>line</code> of one of the chars in <code>breakChars</code>, or simply returns
+ * <code>maxCharsPerLine-1</code> if none of the <code>breakChars</code> comes before
+ * that position. This position represents the logical line break for this <code>java.lang.String</code>
+ * if it is being printed in a monospaced font when lines can only be <code>maxCharsPerLine</code>
+ * characters long.
+ *
+ * @param line The text being printed.
+ * @param maxCharsPerLine Only up-to this many characters from
+ * <code>line</code> can be printed on one line.
+ * @return The logical position at which to stop printing <code>line</code>
+ * to simulate word wrap.
+ */
+ private static int getLineBreakPoint(String line, final int maxCharsPerLine) {
+
+ int breakPoint = -1;
+ for (int i=0; i<breakChars.length; i++) {
+ int breakCharPos = line.lastIndexOf(breakChars[i], maxCharsPerLine-1);
+ if (breakCharPos > breakPoint)
+ breakPoint = breakCharPos;
+ }
+
+ return (breakPoint==-1 ? maxCharsPerLine-1 : breakPoint);
+
+ }
+
+
+ /**
+ * Prints a <code>Document</code> using a monospaced font, and does no word wrapping (ie,
+ * words will wrap mid-word to the next line). This method is expected to be called from
+ * Printable 'print(Graphics g)' functions.
+ *
+ * @param g The graphics context to write to.
+ * @param doc The <code>javax.swing.text.Document</code> to print.
+ * @param fontSize the point size to use for the monospaced font.
+ * @param pageIndex The page number to print.
+ * @param pageFormat The format to print the page with.
+ * @param tabSize The number of spaces to expand tabs to.
+ *
+ * @see #printDocumentMonospacedWordWrap
+ */
+ public static int printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex,
+ PageFormat pageFormat, int tabSize) {
+
+ g.setColor(Color.BLACK);
+ g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+ // Initialize our static variables (these are used by our tab expander below).
+ tabSizeInSpaces = tabSize;
+ fm = g.getFontMetrics();
+
+ // Create our tab expander.
+ //RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+ // Get width and height of characters in this monospaced font.
+ int fontWidth = fm.charWidth('w'); // Any character will do as font is monospaced.
+ int fontHeight = fm.getHeight();
+
+ int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+ int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+ final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+ // The (x,y) coordinate to print at (in pixels, not characters).
+ // Since y is the baseline of where we'll start printing (not the top-left
+ // corner), we offset it by the font's ascent ( + 1 just for good measure).
+ xOffset = (int)pageFormat.getImageableX();
+ int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+ // A counter to keep track of the number of lines that WOULD HAVE been
+ // printed if we were printing all lines.
+ int numPrintedLines = 0;
+
+ // Keep going while there are more lines in the document.
+ currentDocLineNumber = 0; // The line number of the document we're currently on.
+ rootElement = doc.getDefaultRootElement(); // To shorten accesses in our loop.
+ numDocLines = rootElement.getElementCount(); // The number of lines in our document.
+ while (currentDocLineNumber<numDocLines) {
+
+ // Get the line we are going to print.
+ String curLineString;
+ Element currentLine = rootElement.getElement(currentDocLineNumber);
+ int startOffs = currentLine.getStartOffset();
+ try {
+ curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ // Get rid of newlines, because they end up as boxes if you don't; this is a monospaced font.
+ curLineString = curLineString.replaceAll("\n", "");
+
+ // Replace tabs with how many spaces they should be.
+ if (tabSizeInSpaces == 0) {
+ curLineString = curLineString.replaceAll("\t", "");
+ }
+ else {
+ int tabIndex = curLineString.indexOf('\t');
+ while (tabIndex > -1) {
+ int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+ String replacementString = "";
+ for (int i=0; i<spacesNeeded; i++)
+ replacementString += ' ';
+ // Note that "\t" is actually a regex for this method.
+ curLineString = curLineString.replaceFirst("\t", replacementString);
+ tabIndex = curLineString.indexOf('\t');
+ }
+ }
+
+ // If this document line is too long to fit on one printed line on the page,
+ // break it up into multpile lines.
+ while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+ numPrintedLines++;
+ if (numPrintedLines > STARTING_LINE_NUMBER) {
+ g.drawString(curLineString.substring(0,MAX_CHARS_PER_LINE), xOffset,y);
+ y += fontHeight;
+ if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+ return Printable.PAGE_EXISTS;
+ }
+
+ curLineString = curLineString.substring(MAX_CHARS_PER_LINE, curLineString.length());
+
+ }
+
+ currentDocLineNumber += 1; // We have printed one more line from the document.
+
+ numPrintedLines++;
+ if (numPrintedLines>STARTING_LINE_NUMBER) {
+ g.drawString(curLineString, xOffset,y);
+ y += fontHeight;
+ if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+ return Printable.PAGE_EXISTS;
+ }
+
+
+ }
+
+ // Now, the whole document has been "printed." Decide if this page had any text on it or not.
+ if (numPrintedLines > STARTING_LINE_NUMBER)
+ return Printable.PAGE_EXISTS;
+ return Printable.NO_SUCH_PAGE;
+
+ }
+
+
+ /**
+ * Prints a <code>Document</code> using a monospaced font, word wrapping on
+ * the characters ' ', '\t', '\n', ',', '.', and ';'. This method is
+ * expected to be called from Printable 'print(Graphics g)' functions.
+ *
+ * @param g The graphics context to write to.
+ * @param doc The <code>javax.swing.text.Document</code> to print.
+ * @param fontSize the point size to use for the monospaced font.
+ * @param pageIndex The page number to print.
+ * @param pageFormat The format to print the page with.
+ * @param tabSize The number of spaces to expand tabs to.
+ *
+ * @see #printDocumentMonospaced
+ */
+ public static int printDocumentMonospacedWordWrap(Graphics g, Document doc,
+ int fontSize, int pageIndex,
+ PageFormat pageFormat, int tabSize) {
+
+ g.setColor(Color.BLACK);
+ g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
+
+ // Initialize our static variables (these are used by our tab expander below).
+ tabSizeInSpaces = tabSize;
+ fm = g.getFontMetrics();
+
+ // Create our tab expander.
+ //RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+ // Get width and height of characters in this monospaced font.
+ int fontWidth = fm.charWidth('w'); // Any character will do here, since font is monospaced.
+ int fontHeight = fm.getHeight();
+
+ int MAX_CHARS_PER_LINE = (int)pageFormat.getImageableWidth() / fontWidth;
+ int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+ final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+ // The (x,y) coordinate to print at (in pixels, not characters).
+ // Since y is the baseline of where we'll start printing (not the top-left
+ // corner), we offset it by the font's ascent ( + 1 just for good measure).
+ xOffset = (int)pageFormat.getImageableX();
+ int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+ // A counter to keep track of the number of lines that WOULD HAVE been
+ // printed if we were printing all lines.
+ int numPrintedLines = 0;
+
+ // Keep going while there are more lines in the document.
+ currentDocLineNumber = 0; // The line number of the document we're currently on.
+ rootElement = doc.getDefaultRootElement(); // To shorten accesses in our loop.
+ numDocLines = rootElement.getElementCount(); // The number of lines in our document.
+ while (currentDocLineNumber<numDocLines) {
+
+ // Get the line we are going to print.
+ String curLineString;
+ Element currentLine = rootElement.getElement(currentDocLineNumber);
+ int startOffs = currentLine.getStartOffset();
+ try {
+ curLineString = doc.getText(startOffs, currentLine.getEndOffset()-startOffs);
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ // Remove newlines, because they end up as boxes if you don't; this is a monospaced font.
+ curLineString = curLineString.replaceAll("\n", "");
+
+ // Replace tabs with how many spaces they should be.
+ if (tabSizeInSpaces == 0) {
+ curLineString = curLineString.replaceAll("\t", "");
+ }
+ else {
+ int tabIndex = curLineString.indexOf('\t');
+ while (tabIndex > -1) {
+ int spacesNeeded = tabSizeInSpaces - (tabIndex % tabSizeInSpaces);
+ String replacementString = "";
+ for (int i=0; i<spacesNeeded; i++)
+ replacementString += ' ';
+ // Note that "\t" is actually a regex for this method.
+ curLineString = curLineString.replaceFirst("\t", replacementString);
+ tabIndex = curLineString.indexOf('\t');
+ }
+ }
+
+ // If this document line is too long to fit on one printed line on the page,
+ // break it up into multpile lines.
+ while (curLineString.length() > MAX_CHARS_PER_LINE) {
+
+ int breakPoint = getLineBreakPoint(curLineString, MAX_CHARS_PER_LINE) + 1;
+
+ numPrintedLines++;
+ if (numPrintedLines > STARTING_LINE_NUMBER) {
+ g.drawString(curLineString.substring(0,breakPoint), xOffset,y);
+ y += fontHeight;
+ if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+ return Printable.PAGE_EXISTS;
+ }
+
+ curLineString = curLineString.substring(breakPoint, curLineString.length());
+
+ }
+
+ currentDocLineNumber += 1; // We have printed one more line from the document.
+
+ numPrintedLines++;
+ if (numPrintedLines>STARTING_LINE_NUMBER) {
+ g.drawString(curLineString, xOffset,y);
+ y += fontHeight;
+ if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+ return Printable.PAGE_EXISTS;
+ }
+
+
+ }
+
+ // Now, the whole document has been "printed." Decide if this page had any text on it or not.
+ if (numPrintedLines > STARTING_LINE_NUMBER)
+ return Printable.PAGE_EXISTS;
+ return Printable.NO_SUCH_PAGE;
+
+ }
+
+
+ /**
+ * Prints a <code>Document</code> using the specified font, word wrapping
+ * on the characters ' ', '\t', '\n', ',', '.', and ';'. This method is
+ * expected to be called from Printable 'print(Graphics g)' functions.
+ *
+ * @param g The graphics context to write to.
+ * @param textComponent The <code>javax.swing.text.JTextComponent</code>
+ * whose text you're printing.
+ * @param font The font to use for printing. If <code>null</code>, then
+ * <code>textComponent</code>'s font is used.
+ * @param pageIndex The page number to print.
+ * @param pageFormat The format to print the page with.
+ * @param tabSize The number of spaces to convert tabs to.
+ *
+ */
+ public static int printDocumentWordWrap(Graphics g, JTextComponent textComponent,
+ Font font, int pageIndex,
+ PageFormat pageFormat,
+ int tabSize) {
+
+ // Initialize our graphics object.
+ g.setColor(Color.BLACK);
+ g.setFont(font!=null ? font : textComponent.getFont());
+
+ // Initialize our static variables (these are used by our tab expander below).
+ tabSizeInSpaces = tabSize;
+ fm = g.getFontMetrics();
+ int fontHeight = fm.getHeight();
+
+ final int LINE_LENGTH_IN_PIXELS = (int)pageFormat.getImageableWidth();
+ final int MAX_LINES_PER_PAGE = (int)pageFormat.getImageableHeight() / fontHeight;
+
+ final int STARTING_LINE_NUMBER = MAX_LINES_PER_PAGE * pageIndex;
+
+ // Create our tab expander.
+ RPrintTabExpander tabExpander = new RPrintTabExpander();
+
+ // The (x,y) coordinate to print at (in pixels, not characters).
+ // Since y is the baseline of where we'll start printing (not the top-left
+ // corner), we offset it by the font's ascent ( + 1 just for good measure).
+ xOffset = (int)pageFormat.getImageableX();
+ int y = (int)pageFormat.getImageableY() + fm.getAscent() + 1;
+
+ // A counter to keep track of the number of lines that WOULD HAVE been
+ // printed if we were printing all lines.
+ int numPrintedLines = 0;
+
+ // Keep going while there are more lines in the document.
+ Document doc = textComponent.getDocument();
+ rootElement = doc.getDefaultRootElement();
+ numDocLines = rootElement.getElementCount(); // The number of lines in our document.
+ currentDocLineNumber = 0; // The line number of the document we're currently on.
+ int startingOffset = 0; // Used when a line is so long it has to be wrapped.
+ while (currentDocLineNumber<numDocLines) {
+
+ Segment currentLineSeg = new Segment();
+
+ // Get the current line (as an Element), and its starting and ending offset in doc.
+ Element currentLine = rootElement.getElement(currentDocLineNumber);
+ int currentLineStart = currentLine.getStartOffset();
+ int currentLineEnd = currentLine.getEndOffset();
+
+ // Put the chars of this line in currentLineSeg, but only starting at our desired offset
+ // (because this line may be the second part of a wrapped line, so we'd start after the part
+ // that has already been printed).
+ try {
+ doc.getText(currentLineStart+startingOffset, currentLineEnd-(currentLineStart+startingOffset),
+ currentLineSeg);
+ } catch (BadLocationException ble) {
+ System.err.println("BadLocationException in print (where there shouldn't be one!): " + ble);
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ // Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+ currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+ // Figger out how long the line is, in pixels.
+ int currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+ // If it'll fit by itself on a printed line, great.
+ if (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS) {
+ currentDocLineNumber += 1; // We (will) have printed one more line from the document.
+ startingOffset = 0; // Start at the first character in the new document line.
+ }
+
+ // If it won't fit on a printed line by itself (i.e., it needs to be wrapped)...
+ else {
+
+ // Loop while the current line is too long to fit on a printed line.
+ int currentPos = -1;
+ while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS) {
+
+//System.err.println("'" + currentLineSeg + "' - " + currentLineLengthInPixels + "/" + LINE_LENGTH_IN_PIXELS);
+
+ // Remove any spaces and/or tabs from the end of the segment (would cause problems if you left 'em).
+ currentLineSeg = removeEndingWhitespace(currentLineSeg);
+
+ // currentPos will be the last position in the current text of a "line break character."
+ currentPos = -1;
+ String currentLineString = currentLineSeg.toString();
+ for (int i=0; i<breakChars.length; i++) {
+ // "+1" below so we include the character on the line.
+ int pos = currentLineString.lastIndexOf(breakChars[i]) + 1;
+ //if (pos>-1 && pos>currentPos)
+ // currentPos = pos;
+ if (pos>0 && pos>currentPos & pos!=currentLineString.length())
+ currentPos = pos;
+ }
+
+ // If we didn't find a line break character, we'll simply break the line at
+ // the last character that fits on a printed line.
+ // So here, we set currentPos to be the position of the last character that fits
+ // on the current printed line.
+ if (currentPos == -1) {
+
+ // Fix currentLineSeg so that it contains exactly enough text to fit in
+ // LINE_LENGTH_IN_PIXELS pixels...
+ currentPos = 0;
+ do {
+ currentPos++;
+ try {
+ doc.getText(currentLineStart+startingOffset, currentPos, currentLineSeg);
+ } catch (BadLocationException ble) {
+ System.err.println(ble);
+ return Printable.NO_SUCH_PAGE;
+ }
+ currentLineLengthInPixels = Utilities.
+ getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+ } while (currentLineLengthInPixels <= LINE_LENGTH_IN_PIXELS);
+ currentPos--;
+
+ }
+
+ try {
+ doc.getText((currentLineStart+startingOffset), currentPos, currentLineSeg);
+ } catch (BadLocationException ble) {
+ System.err.println("BadLocationException in print (a):");
+ System.err.println("==> currentLineStart: " + currentLineStart +
+ "; startingOffset: " + startingOffset + "; currentPos: " + currentPos);
+ System.err.println("==> Range: " + (currentLineStart+startingOffset) + " - " +
+ (currentLineStart+startingOffset+currentPos));
+ ble.printStackTrace();
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0);
+ } // End of while (currentLineLengthInPixels > LINE_LENGTH_IN_PIXELS).
+
+ startingOffset += currentPos; // Where to start (offset from line's start), since this line wraps.
+
+ } // End of else.
+
+ numPrintedLines++;
+ if (numPrintedLines>STARTING_LINE_NUMBER) {
+ //g.drawString(currentLineSeg.toString(), xOffset,y);
+ Utilities.drawTabbedText(currentLineSeg, xOffset,y, g, tabExpander, 0);
+ y += fontHeight;
+ if (numPrintedLines==STARTING_LINE_NUMBER+MAX_LINES_PER_PAGE)
+ return Printable.PAGE_EXISTS;
+ }
+
+ }
+
+ // Now, the whole document has been "printed." Decide if this page had any text on it or not.
+ if (numPrintedLines > STARTING_LINE_NUMBER)
+ return Printable.PAGE_EXISTS;
+ return Printable.NO_SUCH_PAGE;
+
+ }
+
+
+ /**
+ * Removes any spaces or tabs from the end of the segment.
+ *
+ * @param segment The segment from which to remove tailing whitespace.
+ * @return <code>segment</code> with trailing whitespace removed.
+ */
+ private static Segment removeEndingWhitespace(Segment segment) {
+ int toTrim = 0;
+ char currentChar = segment.setIndex(segment.getEndIndex()-1);
+ while ((currentChar==' ' || currentChar=='\t') && currentChar!=Segment.DONE) {
+ toTrim++;
+ currentChar = segment.previous();
+ }
+ String stringVal = segment.toString();
+ String newStringVal = stringVal.substring(0,stringVal.length()-toTrim);
+ return new Segment(newStringVal.toCharArray(), 0, newStringVal.length());
+ }
+
+
+ /**
+ * A tab expander for the document currently being printed with the
+ * font being used for the printing.
+ */
+ private static class RPrintTabExpander implements TabExpander {
+
+ RPrintTabExpander() {
+ }
+
+ public float nextTabStop(float x, int tabOffset) {
+ if (tabSizeInSpaces == 0)
+ return x;
+ int tabSizeInPixels = tabSizeInSpaces * fm.charWidth(' ');
+ int ntabs = (((int) x) - xOffset) / tabSizeInPixels;
+ return xOffset + ((ntabs + 1) * tabSizeInPixels);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/print/package.html b/src/org/fife/print/package.html
new file mode 100644
index 0000000..bd2990a
--- /dev/null
+++ b/src/org/fife/print/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ Utility methods for printing text in a <code>JTextComponent</code>.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java
new file mode 100644
index 0000000..905c43e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java
@@ -0,0 +1,222 @@
+/*
+ * 01/25/2009
+ *
+ * AbstractJFlexCTokenMaker.java - Base class for token makers that use curly
+ * braces to denote code blocks, such as C, C++, Java, Perl, etc.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rtextarea.RTextArea;
+
+
+
+/**
+ * Base class for JFlex-based token makers using C-style syntax. This class
+ * knows how to auto-indent after opening braces and parens.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
+
+ protected static final Action INSERT_BREAK_ACTION = new InsertBreakAction();
+
+
+ /**
+ * Returns <code>true</code> always as C-style languages use curly braces
+ * to denote code blocks.
+ *
+ * @return <code>true</code> always.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return true;
+ }
+
+
+ /**
+ * Returns an action to handle "insert break" key presses (i.e. Enter).
+ * An action is returned that handles newlines differently in multi-line
+ * comments.
+ *
+ * @return The action.
+ */
+ public Action getInsertBreakAction() {
+ return INSERT_BREAK_ACTION;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.FUNCTION;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getShouldIndentNextLineAfter(Token t) {
+ if (t!=null && t.textCount==1) {
+ char ch = t.text[t.textOffset];
+ return ch=='{' || ch=='(';
+ }
+ return false;
+ }
+
+
+ /**
+ * Action that knows how to special-case inserting a newline in a
+ * multi-line comment for languages like C and Java.
+ */
+ private static class InsertBreakAction extends
+ RSyntaxTextAreaEditorKit.InsertBreakAction {
+
+ private static final Pattern p =
+ Pattern.compile("([ \\t]*)(/?[\\*]+)([ \\t]*)");
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)getTextComponent(e);
+ RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+ int line = textArea.getCaretLineNumber();
+ int type = doc.getLastTokenTypeOnLine(line);
+ if (type<0) {
+ type = doc.getClosestStandardTokenTypeForInternalType(type);
+ }
+
+ // Only in MLC's should we try this
+ if (type==Token.COMMENT_DOCUMENTATION ||
+ type==Token.COMMENT_MULTILINE) {
+ insertBreakInMLC(e, rsta, line);
+ }
+ else {
+ handleInsertBreak(rsta, true);
+ }
+
+ }
+
+
+ /**
+ * Returns whether the MLC token containing <code>offs</code> appears
+ * to have a "nested" comment (i.e., contains "<code>/*</code>"
+ * somewhere inside of it). This implies that it is likely a "new" MLC
+ * and needs to be closed. While not foolproof, this is usually good
+ * enough of a sign.
+ *
+ * @param textArea
+ * @param line
+ * @param offs
+ * @return Whether a comment appears to be nested inside this one.
+ */
+ private boolean appearsNested(RSyntaxTextArea textArea,
+ int line, int offs) {
+
+ final int firstLine = line; // Remember the line we start at.
+
+ while (line<textArea.getLineCount()) {
+ Token t = textArea.getTokenListForLine(line);
+ int i = 0;
+ // If examining the first line, start at offs.
+ if (line++==firstLine) {
+ t = RSyntaxUtilities.getTokenAtOffset(t, offs);
+ if (t==null) { // offs was at end of the line
+ continue;
+ }
+ i = t.documentToToken(offs);
+ }
+ else {
+ i = t.textOffset;
+ }
+ while (i<t.textOffset+t.textCount-1) {
+ if (t.text[i]=='/' && t.text[i+1]=='*') {
+ return true;
+ }
+ i++;
+ }
+ // If tokens come after this one on this line, our MLC ended.
+ if (t.getNextToken()!=null) {
+ return false;
+ }
+ }
+
+ return true; // No match - MLC goes to the end of the file
+
+ }
+
+ private void insertBreakInMLC(ActionEvent e, RSyntaxTextArea textArea,
+ int line) {
+
+ Matcher m = null;
+ int start = -1;
+ int end = -1;
+ try {
+ start = textArea.getLineStartOffset(line);
+ end = textArea.getLineEndOffset(line);
+ String text = textArea.getText(start, end-start);
+ m = p.matcher(text);
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ ble.printStackTrace();
+ return;
+ }
+
+ if (m.lookingAt()) {
+
+ String leadingWS = m.group(1);
+ String mlcMarker = m.group(2);
+
+ // If the caret is "inside" any leading whitespace or MLC
+ // marker, move it to the end of the line.
+ int dot = textArea.getCaretPosition();
+ if (dot>=start &&
+ dot<start+leadingWS.length()+mlcMarker.length()) {
+ // If we're in the whitespace before the very start of the
+ // MLC though, just insert a normal newline
+ if (mlcMarker.charAt(0)=='/') {
+ handleInsertBreak(textArea, true);
+ return;
+ }
+ textArea.setCaretPosition(end-1);
+ }
+
+ boolean firstMlcLine = mlcMarker.charAt(0)=='/';
+ boolean nested = appearsNested(textArea, line,
+ start+leadingWS.length()+2);
+ String header = leadingWS +
+ (firstMlcLine ? " * " : "*") +
+ m.group(3);
+ textArea.replaceSelection("\n" + header);
+ if (nested) {
+ dot = textArea.getCaretPosition(); // Has changed
+ textArea.insert("\n" + leadingWS + " */", dot);
+ textArea.setCaretPosition(dot);
+ }
+
+ }
+ else {
+ handleInsertBreak(textArea, true);
+ }
+
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java
new file mode 100644
index 0000000..8d562f8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java
@@ -0,0 +1,52 @@
+/*
+ * 03/23/2005
+ *
+ * AbstractJFlexTokenMaker.java - Base class for token makers generated from
+ * programs such as JFlex.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for JFlex-generated token makers. This class attempts to factor
+ * out all common code from these classes. Many methods <em>almost</em> could
+ * be factored out into this class, but cannot because they reference JFlex
+ * variables that we cannot access from this class.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public abstract class AbstractJFlexTokenMaker extends TokenMakerBase {
+
+ protected Segment s;
+
+ protected int start; // Just for states.
+ protected int offsetShift; // As parser always starts at 0, but our line doesn't.
+
+
+ /**
+ * Declared here so we can define overloads that refer to this method.
+ *
+ * @param newState The new JFlex state to enter.
+ */
+ public abstract void yybegin(int newState);
+
+
+ /**
+ * Starts a new JFlex state and changes the current language index.
+ *
+ * @param state The new JFlex state to enter.
+ * @param languageIndex The new language index.
+ */
+ protected void yybegin(int state, int languageIndex) {
+ yybegin(state);
+ setLanguageIndex(languageIndex);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java
new file mode 100644
index 0000000..0651519
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMaker.java
@@ -0,0 +1,67 @@
+/*
+ * 11/07/2004
+ *
+ * AbstractTokenMaker.java - An abstract implementation of TokenMaker.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An abstract implementation of the
+ * {@link org.fife.ui.rsyntaxtextarea.TokenMaker} interface. It should
+ * be overridden for every language for which you want to provide
+ * syntax highlighting.<p>
+ *
+ * @see Token
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public abstract class AbstractTokenMaker extends TokenMakerBase {
+
+ /**
+ * Hash table of words to highlight and what token type they are.
+ * The keys are the words to highlight, and their values are the
+ * token types, for example, <code>Token.RESERVED_WORD</code> or
+ * <code>Token.FUNCTION</code>.
+ */
+ protected TokenMap wordsToHighlight;
+
+
+ /**
+ * Constructor.
+ */
+ public AbstractTokenMaker() {
+ wordsToHighlight = getWordsToHighlight();
+ }
+
+
+ /**
+ * Returns the words to highlight for this programming language.
+ *
+ * @return A <code>TokenMap</code> containing the words to highlight for
+ * this programming language.
+ */
+ public abstract TokenMap getWordsToHighlight();
+
+
+ /**
+ * Removes the token last added from the linked list of tokens. The
+ * programmer should never have to call this directly; it can be called
+ * by subclasses of <code>TokenMaker</code> if necessary.
+ */
+ public void removeLastToken() {
+ if (previousToken==null) {
+ firstToken = currentToken = null;
+ }
+ else {
+ currentToken = previousToken;
+ currentToken.setNextToken(null);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java
new file mode 100644
index 0000000..a44a60f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java
@@ -0,0 +1,132 @@
+/*
+ * 12/14/08
+ *
+ * AbstractTokenMakerFactory.java - Base class for TokenMaker implementations.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Base class for {@link TokenMakerFactory} implementations. A mapping from
+ * language keys to the names of {@link TokenMaker} classes is stored.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
+
+ /**
+ * A mapping from keys to the names of {@link TokenMaker} implementation
+ * class names. When {@link #getTokenMaker(String)} is called with a key
+ * defined in this map, a <code>TokenMaker</code> of the corresponding type
+ * is returned.
+ */
+ private Map tokenMakerMap;
+
+
+ /**
+ * Constructor.
+ */
+ protected AbstractTokenMakerFactory() {
+ tokenMakerMap = new HashMap();
+ initTokenMakerMap();
+ }
+
+
+ /**
+ * Returns a {@link TokenMaker} for the specified key.
+ *
+ * @param key The key.
+ * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+ * if none matches the specified key.
+ */
+ protected TokenMaker getTokenMakerImpl(String key) {
+ TokenMakerCreator tmc = (TokenMakerCreator)tokenMakerMap.get(key);
+ if (tmc!=null) {
+ try {
+ return tmc.create();
+ } catch (RuntimeException re) { // FindBugs
+ throw re;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Populates the mapping from keys to instances of
+ * <code>TokenMakerCreator</code>s. Subclasses should override this method
+ * and call one of the <code>putMapping</code> overloads to register
+ * {@link TokenMaker}s for syntax constants.
+ *
+ * @see #putMapping(String, String)
+ * @see #putMapping(String, String, ClassLoader)
+ */
+ protected abstract void initTokenMakerMap();
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Set keySet() {
+ return tokenMakerMap.keySet();
+ }
+
+
+ /**
+ * Adds a mapping from a key to a <code>TokenMaker</code> implementation
+ * class name.
+ *
+ * @param key The key.
+ * @param className The <code>TokenMaker</code> class name.
+ * @see #putMapping(String, String, ClassLoader)
+ */
+ public void putMapping(String key, String className) {
+ putMapping(key, className, null);
+ }
+
+
+ /**
+ * Adds a mapping from a key to a <code>TokenMaker</code> implementation
+ * class name.
+ *
+ * @param key The key.
+ * @param className The <code>TokenMaker</code> class name.
+ * @param cl The class loader to use when loading the class.
+ * @see #putMapping(String, String)
+ */
+ public void putMapping(String key, String className, ClassLoader cl) {
+ tokenMakerMap.put(key, new TokenMakerCreator(className, cl));
+ }
+
+
+ /**
+ * Wrapper that handles the creation of TokenMaker instances.
+ */
+ private static class TokenMakerCreator {
+
+ private String className;
+ private ClassLoader cl;
+
+ public TokenMakerCreator(String className, ClassLoader cl) {
+ this.className = className;
+ this.cl = cl!=null ? cl : getClass().getClassLoader();
+ }
+
+ public TokenMaker create() throws Exception {
+ return (TokenMaker)Class.forName(className, true, cl).newInstance();
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java
new file mode 100644
index 0000000..b77f7cc
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeEvent.java
@@ -0,0 +1,68 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeEvent.java - Notifies listeners of an "active line range"
+ * change in an RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventObject;
+
+
+/**
+ * The event fired by {@link RSyntaxTextArea}s when the active line range
+ * changes.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ActiveLineRangeEvent extends EventObject {
+
+ private int min;
+ private int max;
+
+
+ /**
+ * Constructor.
+ *
+ * @param source The text area.
+ * @param min The first line in the active line range, or
+ * <code>-1</code> if the line range is being cleared.
+ * @param max The last line in the active line range, or
+ * <code>-1</code> if the line range is being cleared.
+ */
+ public ActiveLineRangeEvent(RSyntaxTextArea source, int min, int max) {
+ super(source);
+ this.min = min;
+ this.max = max;
+ }
+
+
+ /**
+ * Returns the last line in the active line range.
+ *
+ * @return The last line, or <code>-1</code> if the range is being
+ * cleared.
+ * @see #getMin()
+ */
+ public int getMax() {
+ return max;
+ }
+
+
+ /**
+ * Returns the first line in the active line range.
+ *
+ * @return The first line, or <code>-1</code> if the range is being
+ * cleared.
+ * @see #getMax()
+ */
+ public int getMin() {
+ return min;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java
new file mode 100644
index 0000000..2c4930c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ActiveLineRangeListener.java
@@ -0,0 +1,44 @@
+/*
+ * 02/06/2011
+ *
+ * ActiveLineRangeListener.java - Listens for "active line range" changes
+ * in an RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.EventListener;
+
+
+/**
+ * Listens for "active line range" events from an <code>RSyntaxTextArea</code>.
+ * If a text area contains some semantic knowledge of the programming language
+ * being edited, it may broadcast {@link ActiveLineRangeEvent}s whenever the
+ * caret moves into a new "block" of code. Listeners can listen for these
+ * events and respond accordingly.<p>
+ *
+ * See the <code>RSTALanguageSupport</code> project at
+ * <a href="http://fifesoft.com">http://fifesoft.com</a> for some
+ * <code>LanguageSupport</code> implementations that may broadcast these
+ * events. Note that if an RSTA/LanguageSupport does not support broadcasting
+ * these events, the listener will simply never receive any notifications.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ActiveLineRangeListener extends EventListener {
+
+
+ /**
+ * Called whenever the "active line range" changes.
+ *
+ * @param e Information about the line range change. If there is no longer
+ * an "active line range," the "minimum" and "maximum" line values
+ * should both be <code>-1</code>.
+ */
+ public void activeLineRangeChanged(ActiveLineRangeEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java
new file mode 100644
index 0000000..6ccdf7e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java
@@ -0,0 +1,67 @@
+/*
+ * 07/23/2009
+ *
+ * ChangeableColorHighlightPainter.java - A highlighter whose color you can
+ * change.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
+
+
+/**
+ * A highlighter whose color you can change.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class ChangeableColorHighlightPainter extends DefaultHighlightPainter {
+
+ /**
+ * DefaultHighlightPainter doesn't allow changing color, so we must cache
+ * ours here.
+ */
+ private Color color;
+
+
+ /**
+ * Constructor.
+ *
+ * @param color The initial color to use. This cannot be <code>null</code>.
+ */
+ public ChangeableColorHighlightPainter(Color color) {
+ super(color);
+ setColor(color);
+ }
+
+
+ /**
+ * Returns the color to paint with.
+ *
+ * @return The color.
+ * @see #setColor(Color)
+ */
+ public Color getColor() {
+ return color;
+ }
+
+
+ /**
+ * Sets the color to paint the bounding boxes with.
+ *
+ * @param color The new color. This cannot be <code>null</code>.
+ * @see #getColor()
+ */
+ public void setColor(Color color) {
+ if (color==null) {
+ throw new IllegalArgumentException("color cannot be null");
+ }
+ this.color = color;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java b/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java
new file mode 100644
index 0000000..696c710
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/CodeTemplateManager.java
@@ -0,0 +1,470 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplateManager.java - manages code templates.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import javax.swing.KeyStroke;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+
+
+/**
+ * Manages "code templates."<p>
+ *
+ * All methods in this class are synchronized for thread safety, but as a
+ * best practice, you should probably only modify the templates known to a
+ * <code>CodeTemplateManager</code> on the EDT. Modifying a
+ * <code>CodeTemplate</code> retrieved from a <code>CodeTemplateManager</code>
+ * while <em>not</em> on the EDT could cause problems.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class CodeTemplateManager {
+
+ private int maxTemplateIDLength;
+ private List templates;
+
+ private KeyStroke insertTrigger;
+ private String insertTriggerString;
+ private Segment s;
+ private TemplateComparator comparator;
+ private File directory;
+
+ private static final int mask = InputEvent.CTRL_MASK|InputEvent.SHIFT_MASK;
+ static final KeyStroke TEMPLATE_KEYSTROKE = KeyStroke.
+ getKeyStroke(KeyEvent.VK_SPACE, mask);
+
+
+ /**
+ * Constructor.
+ */
+ public CodeTemplateManager() {
+
+ // Default insert trigger is a space.
+ // FIXME: See notes in RSyntaxTextAreaDefaultInputMap.
+ setInsertTrigger(TEMPLATE_KEYSTROKE);
+
+ s = new Segment();
+ comparator = new TemplateComparator();
+ templates = new ArrayList();
+
+ }
+
+
+ /**
+ * Registers the specified template with this template manager.
+ *
+ * @param template The template to register.
+ * @throws IllegalArgumentException If <code>template</code> is
+ * <code>null</code>.
+ * @see #removeTemplate(CodeTemplate)
+ * @see #removeTemplate(String)
+ */
+ public synchronized void addTemplate(CodeTemplate template) {
+ if (template==null) {
+ throw new IllegalArgumentException("template cannot be null");
+ }
+ templates.add(template);
+ sortTemplates();
+ }
+
+
+ /**
+ * Returns the keystroke that is the "insert trigger" for templates;
+ * that is, the character that, when inserted into an instance of
+ * <code>RSyntaxTextArea</code>, triggers the search for
+ * a template matching the token ending at the caret position.
+ *
+ * @return The insert trigger.
+ * @see #getInsertTriggerString()
+ * @see #setInsertTrigger(KeyStroke)
+ */
+ /*
+ * FIXME: This text IS what's inserted if the trigger character is pressed
+ * in a text area but no template matches, but it is NOT the trigger
+ * character used in the text areas. This is because space (" ") is
+ * hard-coded into RSyntaxTextAreaDefaultInputMap.java. We need to make
+ * this dynamic somehow. See RSyntaxTextAreaDefaultInputMap.java.
+ */
+ public KeyStroke getInsertTrigger() {
+ return insertTrigger;
+ }
+
+
+ /**
+ * Returns the "insert trigger" for templates; that is, the character
+ * that, when inserted into an instance of <code>RSyntaxTextArea</code>,
+ * triggers the search for a template matching the token ending at the
+ * caret position.
+ *
+ * @return The insert trigger character.
+ * @see #getInsertTrigger()
+ * @see #setInsertTrigger(KeyStroke)
+ */
+ /*
+ * FIXME: This text IS what's inserted if the trigger character is pressed
+ * in a text area but no template matches, but it is NOT the trigger
+ * character used in the text areas. This is because space (" ") is
+ * hard-coded into RSyntaxTextAreaDefaultInputMap.java. We need to make
+ * this dynamic somehow. See RSyntaxTextAreaDefaultInputMap.java.
+ */
+ public String getInsertTriggerString() {
+ return insertTriggerString;
+ }
+
+
+ /**
+ * Returns the template that should be inserted at the current caret
+ * position, assuming the trigger character was pressed.
+ *
+ * @param textArea The text area that's getting text inserted into it.
+ * @return A template that should be inserted, if appropriate, or
+ * <code>null</code> if no template should be inserted.
+ */
+ public synchronized CodeTemplate getTemplate(RSyntaxTextArea textArea) {
+ int caretPos = textArea.getCaretPosition();
+ int charsToGet = Math.min(caretPos, maxTemplateIDLength);
+ try {
+ Document doc = textArea.getDocument();
+ doc.getText(caretPos-charsToGet, charsToGet, s);
+ int index = Collections.binarySearch(templates, s, comparator);
+ return index>=0 ? (CodeTemplate)templates.get(index) : null;
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ throw new InternalError("Error in CodeTemplateManager");
+ }
+ }
+
+
+ /**
+ * Returns the number of templates this manager knows about.
+ *
+ * @return The template count.
+ */
+ public synchronized int getTemplateCount() {
+ return templates.size();
+ }
+
+
+ /**
+ * Returns the templates currently available.
+ *
+ * @return The templates available.
+ */
+ public synchronized CodeTemplate[] getTemplates() {
+ CodeTemplate[] temp = new CodeTemplate[templates.size()];
+ return (CodeTemplate[])templates.toArray(temp);
+ }
+
+
+ /**
+ * Returns whether the specified character is a valid character for a
+ * <code>CodeTemplate</code> id.
+ *
+ * @param ch The character to check.
+ * @return Whether the character is a valid template character.
+ */
+ public static final boolean isValidChar(char ch) {
+ return RSyntaxUtilities.isLetterOrDigit(ch) || ch=='_';
+ }
+
+
+ /**
+ * Returns the specified code template.
+ *
+ * @param template The template to remove.
+ * @return <code>true</code> if the template was removed, <code>false</code>
+ * if the template was not in this template manager.
+ * @throws IllegalArgumentException If <code>template</code> is
+ * <code>null</code>.
+ * @see #removeTemplate(String)
+ * @see #addTemplate(CodeTemplate)
+ */
+ public synchronized boolean removeTemplate(CodeTemplate template) {
+
+ if (template==null) {
+ throw new IllegalArgumentException("template cannot be null");
+ }
+
+ // TODO: Do a binary search
+ return templates.remove(template);
+
+ }
+
+
+ /**
+ * Returns the code template with the specified id.
+ *
+ * @param id The id to check for.
+ * @return The code template that was removed, or <code>null</code> if
+ * there was no template with the specified ID.
+ * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+ * @see #removeTemplate(CodeTemplate)
+ * @see #addTemplate(CodeTemplate)
+ */
+ public synchronized CodeTemplate removeTemplate(String id) {
+
+ if (id==null) {
+ throw new IllegalArgumentException("id cannot be null");
+ }
+
+ // TODO: Do a binary search
+ for (Iterator i=templates.iterator(); i.hasNext(); ) {
+ CodeTemplate template = (CodeTemplate)i.next();
+ if (id.equals(template.getID())) {
+ i.remove();
+ return template;
+ }
+ }
+
+ return null;
+
+ }
+
+
+ /**
+ * Replaces the current set of available templates with the ones
+ * specified.
+ *
+ * @param newTemplates The new set of templates. Note that we will
+ * be taking a shallow copy of these and sorting them.
+ */
+ public synchronized void replaceTemplates(CodeTemplate[] newTemplates) {
+ templates.clear();
+ if (newTemplates!=null) {
+ for (int i=0; i<newTemplates.length; i++) {
+ templates.add(newTemplates[i]);
+ }
+ }
+ sortTemplates(); // Also recomputes maxTemplateIDLength.
+ }
+
+
+ /**
+ * Saves all templates as XML files in the current template directory.
+ *
+ * @return Whether or not the save was successful.
+ */
+ public synchronized boolean saveTemplates() {
+
+ if (templates==null)
+ return true;
+ if (directory==null || !directory.isDirectory())
+ return false;
+
+ // Blow away all old XML files to start anew, as some might be from
+ // templates we're removed from the template manager.
+ File[] oldXMLFiles = directory.listFiles(new XMLFileFilter());
+ if (oldXMLFiles==null)
+ return false; // Either an IOException or it isn't a directory.
+ int count = oldXMLFiles.length;
+ for (int i=0; i<count; i++) {
+ /*boolean deleted = */oldXMLFiles[i].delete();
+ }
+
+ // Save all current templates as XML.
+ boolean wasSuccessful = true;
+ for (Iterator i=templates.iterator(); i.hasNext(); ) {
+ CodeTemplate template = (CodeTemplate)i.next();
+ File xmlFile = new File(directory, template.getID() + ".xml");
+ try {
+ XMLEncoder e = new XMLEncoder(new BufferedOutputStream(
+ new FileOutputStream(xmlFile)));
+ e.writeObject(template);
+ e.close();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ wasSuccessful = false;
+ }
+ }
+
+ return wasSuccessful;
+
+ }
+
+
+ /**
+ * Sets the "trigger" character for templates.
+ *
+ * @param trigger The trigger character to set for templates. This means
+ * that when this character is pressed in an
+ * <code>RSyntaxTextArea</code>, the last-typed token is found,
+ * and is checked against all template ID's to see if a template
+ * should be inserted. If a template ID matches, that template is
+ * inserted; if not, the trigger character is inserted. If this
+ * parameter is <code>null</code>, no change is made to the trigger
+ * character.
+ * @see #getInsertTrigger()
+ * @see #getInsertTriggerString()
+ */
+ /*
+ * FIXME: The trigger set here IS inserted when no matching template
+ * is found, but a space character (" ") is always used as the "trigger"
+ * to look for templates. This is because it is hard-coded in
+ * RSyntaxTextArea's input map this way. We need to change this.
+ * See RSyntaxTextAreaDefaultInputMap.java.
+ */
+ public void setInsertTrigger(KeyStroke trigger) {
+ if (trigger!=null) {
+ insertTrigger = trigger;
+ insertTriggerString = Character.toString(trigger.getKeyChar());
+ }
+ }
+
+
+ /**
+ * Sets the directory in which to look for templates. Calling this
+ * method adds any new templates found in the specified directory to
+ * the templates already registered.
+ *
+ * @param dir The new directory in which to look for templates.
+ * @return The new number of templates in this template manager, or
+ * <code>-1</code> if the specified directory does not exist.
+ */
+ public synchronized int setTemplateDirectory(File dir) {
+
+ if (dir!=null && dir.isDirectory()) {
+
+ this.directory = dir;
+
+ File[] files = dir.listFiles(new XMLFileFilter());
+ int newCount = files==null ? 0 : files.length;
+ int oldCount = templates.size();
+
+ List temp = new ArrayList(oldCount+newCount);
+ temp.addAll(templates);
+
+ for (int i=0; i<newCount; i++) {
+ try {
+ XMLDecoder d = new XMLDecoder(new BufferedInputStream(
+ new FileInputStream(files[i])));
+ Object obj = d.readObject();
+ if (!(obj instanceof CodeTemplate)) {
+ throw new IOException("Not a CodeTemplate: " +
+ files[i].getAbsolutePath());
+ }
+ temp.add(obj);
+ d.close();
+ } catch (/*IO, NoSuchElement*/Exception e) {
+ // NoSuchElementException can be thrown when reading
+ // an XML file not in the format expected by XMLDecoder.
+ // (e.g. CodeTemplates in an old format).
+ e.printStackTrace();
+ }
+ }
+ templates = temp;
+ sortTemplates();
+
+ return getTemplateCount();
+
+ }
+
+ return -1;
+
+ }
+
+
+ /**
+ * Removes any null entries in the current set of templates (if
+ * any), sorts the remaining templates, and computes the new
+ * maximum template ID length.
+ */
+ private synchronized void sortTemplates() {
+
+ // Get the maximum length of a template ID.
+ maxTemplateIDLength = 0;
+
+ // Remove any null entries (should only happen because of
+ // IOExceptions, etc. when loading from files), and sort
+ // the remaining list.
+ for (Iterator i=templates.iterator(); i.hasNext(); ) {
+ CodeTemplate temp = (CodeTemplate)i.next();
+ if (temp==null || temp.getID()==null) {
+ i.remove();
+ }
+ else {
+ maxTemplateIDLength = Math.max(maxTemplateIDLength,
+ temp.getID().length());
+ }
+ }
+
+ Collections.sort(templates);
+
+ }
+
+
+ /**
+ * A comparator that takes a <code>CodeTemplate</code> as its first
+ * parameter and a <code>Segment</code> as its second, and knows
+ * to compare the template's ID to the segment's text.
+ */
+ private static class TemplateComparator implements Comparator, Serializable{
+
+ public int compare(Object template, Object segment) {
+
+ // Get template start index (0) and length.
+ CodeTemplate t = (CodeTemplate)template;
+ final char[] templateArray = t.getID().toCharArray();
+ int i = 0;
+ int len1 = templateArray.length;
+
+ // Find "token" part of segment and get its offset and length.
+ Segment s = (Segment)segment;
+ char[] segArray = s.array;
+ int len2 = s.count;
+ int j = s.offset + len2 - 1;
+ while (j>=s.offset && isValidChar(segArray[j])) {
+ j--;
+ }
+ j++;
+ int segShift = j - s.offset;
+ len2 -= segShift;
+
+ int n = Math.min(len1, len2);
+ while (n-- != 0) {
+ char c1 = templateArray[i++];
+ char c2 = segArray[j++];
+ if (c1 != c2)
+ return c1 - c2;
+ }
+ return len1 - len2;
+
+ }
+
+ }
+
+
+ /**
+ * A file filter for File.listFiles() (NOT for JFileChoosers!) that
+ * accepts only XML files.
+ */
+ private static class XMLFileFilter implements FileFilter {
+ public boolean accept(File f) {
+ return f.getName().toLowerCase().endsWith(".xml");
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java
new file mode 100644
index 0000000..4e06104
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java
@@ -0,0 +1,53 @@
+/*
+ * 03/09/2013
+ *
+ * DefaultOccurrenceMarker - Marks occurrences of the current token for most
+ * languages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * The default implementation of {@link OccurrenceMarker}. It goes through
+ * the document and marks all instances of the specified token.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultOccurrenceMarker implements OccurrenceMarker {
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void markOccurrences(RSyntaxDocument doc, Token t,
+ RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p) {
+
+ char[] lexeme = t.getLexeme().toCharArray();
+ int type = t.type;
+ int lineCount = doc.getDefaultRootElement().getElementCount();
+
+ for (int i=0; i<lineCount; i++) {
+ Token temp = doc.getTokenListForLine(i);
+ while (temp!=null && temp.isPaintable()) {
+ if (temp.is(type, lexeme)) {
+ try {
+ int end = temp.offset + temp.textCount;
+ h.addMarkedOccurrenceHighlight(temp.offset, end, p);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ temp = temp.getNextToken();
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java
new file mode 100644
index 0000000..fe8580c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenFactory.java
@@ -0,0 +1,137 @@
+/*
+ * 10/28/2004
+ *
+ * DefaultTokenFactory.java - Default token factory.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * This class generates tokens for a {@link TokenMaker}. This class is here
+ * because it reuses tokens when they aren't needed anymore to prevent
+ * This class doesn't actually create new tokens every time
+ * <code>createToken</code> is called. Instead, it internally keeps a stack of
+ * available already-created tokens. When more tokens are needed to properly
+ * display a line, more tokens are added to the available stack. This saves
+ * from needless repetitive memory allocation. However, it makes it IMPERATIVE
+ * that users call <code>resetTokenList</code> when creating a new token list so
+ * that the token maker can keep an accurate list of available tokens.<p>
+ *
+ * NOTE: This class should only be used by {@link TokenMaker}; nobody else
+ * needs it!
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+class DefaultTokenFactory implements TokenFactory {
+
+ private int size;
+ private int increment;
+ private Token[] tokenList;
+ private int currentFreeToken;
+
+ protected static final int DEFAULT_START_SIZE = 30;
+ protected static final int DEFAULT_INCREMENT = 10;
+
+
+ /**
+ * Constructor.
+ */
+ public DefaultTokenFactory() {
+ this(DEFAULT_START_SIZE, DEFAULT_INCREMENT);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param size The initial number of tokens in this factory.
+ * @param increment How many tokens to increment by when the stack gets
+ * empty.
+ */
+ public DefaultTokenFactory(int size, int increment) {
+
+ this.size = size;
+ this.increment = increment;
+ this.currentFreeToken = 0;
+
+ // Give us some tokens to initially work with.
+ tokenList = new Token[size];
+ for (int i=0; i<size; i++) {
+ tokenList[i] = new Token();
+ }
+
+ }
+
+
+ /**
+ * Adds tokens to the internal token list. This is called whenever a
+ * request is made and no more tokens are available.
+ */
+ private final void augmentTokenList() {
+ Token[] temp = new Token[size + increment];
+ System.arraycopy(tokenList,0, temp,0, size);
+ size += increment;
+ tokenList = temp;
+ for (int i=0; i<increment; i++) {
+ tokenList[size-i-1] = new Token();
+ }
+ //System.err.println("... size up to: " + size);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Token createToken() {
+ Token token = tokenList[currentFreeToken];
+ token.text = null;
+ token.type = Token.NULL;
+ token.offset = -1;
+ token.setNextToken(null);
+ currentFreeToken++;
+ if (currentFreeToken==size)
+ augmentTokenList();
+ return token;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Token createToken(final Segment line, final int beg,
+ final int end, final int startOffset, final int type) {
+ return createToken(line.array, beg,end, startOffset, type);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Token createToken(final char[] line, final int beg,
+ final int end, final int startOffset, final int type) {
+ Token token = tokenList[currentFreeToken];
+ token.set(line, beg,end, startOffset, type);
+ currentFreeToken++;
+ if (currentFreeToken==size)
+ augmentTokenList();
+ return token;
+ }
+
+
+ /**
+ * Resets the state of this token maker. This method should be called
+ * by the <code>TokenMaker</code> every time a token list is generated for
+ * a new line so the tokens can be reused.
+ */
+ public void resetAllTokens() {
+ currentFreeToken = 0;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java
new file mode 100644
index 0000000..1205189
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java
@@ -0,0 +1,72 @@
+/*
+ * 12/14/2008
+ *
+ * DefaultTokenMakerFactory.java - The default TokenMaker factory.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * The default implementation of <code>TokenMakerFactory</code>. This factory
+ * can create {@link TokenMaker}s for all languages known to
+ * {@link RSyntaxTextArea}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultTokenMakerFactory extends AbstractTokenMakerFactory
+ implements SyntaxConstants {
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void initTokenMakerMap() {
+
+ String pkg = "org.fife.ui.rsyntaxtextarea.modes.";
+
+ putMapping(SYNTAX_STYLE_NONE, pkg + "PlainTextTokenMaker");
+ putMapping(SYNTAX_STYLE_ACTIONSCRIPT, pkg + "ActionScriptTokenMaker");
+ putMapping(SYNTAX_STYLE_ASSEMBLER_X86, pkg + "AssemblerX86TokenMaker");
+ putMapping(SYNTAX_STYLE_BBCODE, pkg + "BBCodeTokenMaker");
+ putMapping(SYNTAX_STYLE_C, pkg + "CTokenMaker");
+ putMapping(SYNTAX_STYLE_CLOJURE, pkg + "ClojureTokenMaker");
+ putMapping(SYNTAX_STYLE_CPLUSPLUS, pkg + "CPlusPlusTokenMaker");
+ putMapping(SYNTAX_STYLE_CSHARP, pkg + "CSharpTokenMaker");
+ putMapping(SYNTAX_STYLE_CSS, pkg + "CSSTokenMaker");
+ putMapping(SYNTAX_STYLE_DELPHI, pkg + "DelphiTokenMaker");
+ putMapping(SYNTAX_STYLE_DTD, pkg + "DtdTokenMaker");
+ putMapping(SYNTAX_STYLE_FORTRAN, pkg + "FortranTokenMaker");
+ putMapping(SYNTAX_STYLE_GROOVY, pkg + "GroovyTokenMaker");
+ putMapping(SYNTAX_STYLE_HTML, pkg + "HTMLTokenMaker");
+ putMapping(SYNTAX_STYLE_JAVA, pkg + "JavaTokenMaker");
+ putMapping(SYNTAX_STYLE_JAVASCRIPT, pkg + "JavaScriptTokenMaker");
+ putMapping(SYNTAX_STYLE_JSON, pkg + "JsonTokenMaker");
+ putMapping(SYNTAX_STYLE_JSP, pkg + "JSPTokenMaker");
+ putMapping(SYNTAX_STYLE_LATEX, pkg + "LatexTokenMaker");
+ putMapping(SYNTAX_STYLE_LISP, pkg + "LispTokenMaker");
+ putMapping(SYNTAX_STYLE_LUA, pkg + "LuaTokenMaker");
+ putMapping(SYNTAX_STYLE_MAKEFILE, pkg + "MakefileTokenMaker");
+ putMapping(SYNTAX_STYLE_MXML, pkg + "MxmlTokenMaker");
+ putMapping(SYNTAX_STYLE_NSIS, pkg + "NSISTokenMaker");
+ putMapping(SYNTAX_STYLE_PERL, pkg + "PerlTokenMaker");
+ putMapping(SYNTAX_STYLE_PHP, pkg + "PHPTokenMaker");
+ putMapping(SYNTAX_STYLE_PROPERTIES_FILE,pkg + "PropertiesFileTokenMaker");
+ putMapping(SYNTAX_STYLE_PYTHON, pkg + "PythonTokenMaker");
+ putMapping(SYNTAX_STYLE_RUBY, pkg + "RubyTokenMaker");
+ putMapping(SYNTAX_STYLE_SAS, pkg + "SASTokenMaker");
+ putMapping(SYNTAX_STYLE_SCALA, pkg + "ScalaTokenMaker");
+ putMapping(SYNTAX_STYLE_SQL, pkg + "SQLTokenMaker");
+ putMapping(SYNTAX_STYLE_TCL, pkg + "TclTokenMaker");
+ putMapping(SYNTAX_STYLE_UNIX_SHELL, pkg + "UnixShellTokenMaker");
+ putMapping(SYNTAX_STYLE_VISUAL_BASIC, pkg + "VisualBasicTokenMaker");
+ putMapping(SYNTAX_STYLE_WINDOWS_BATCH, pkg + "WindowsBatchTokenMaker");
+ putMapping(SYNTAX_STYLE_XML, pkg + "XMLTokenMaker");
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java
new file mode 100644
index 0000000..878530e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DefaultTokenPainter.java
@@ -0,0 +1,267 @@
+/*
+ * 03/16/2013
+ *
+ * DefaultTokenPainter - Standard implementation of a token painter.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * Standard implementation of a token painter.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class DefaultTokenPainter implements TokenPainter {
+
+ /**
+ * Rectangle used for filling token backgrounds.
+ */
+ private Rectangle2D.Float bgRect;
+
+ /**
+ * Micro-optimization; buffer used to compute tab width. If the width is
+ * correct it's not re-allocated, to prevent lots of very small garbage.
+ * Only used when painting tab lines.
+ */
+ private static char[] tabBuf;
+
+
+ public DefaultTokenPainter() {
+ bgRect = new Rectangle2D.Float();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public final float paint(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e) {
+ return paint(token, g, x,y, host, e, 0);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public float paint(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart) {
+ return paintImpl(token, g, x, y, host, e, clipStart, false);
+ }
+
+
+ /**
+ * Paints the background of a token.
+ *
+ * @param x The x-coordinate of the token.
+ * @param y The y-coordinate of the token.
+ * @param width The width of the token (actually, the width of the part of
+ * the token to paint).
+ * @param height The height of the token.
+ * @param g The graphics context with which to paint.
+ * @param fontAscent The ascent of the token's font.
+ * @param host The text area.
+ * @param color The color with which to paint.
+ * @param xor Whether the color should be XOR'd against the editor's
+ * background. This should be <code>true</code> when the selected
+ * text color is being ignored.
+ */
+ protected void paintBackground(float x, float y, float width, float height,
+ Graphics2D g, int fontAscent, RSyntaxTextArea host,
+ Color color, boolean xor) {
+ // RSyntaxTextArea's bg can be null, so we must check for this.
+ Color temp = host.getBackground();
+ if (xor) { // XOR painting is pretty slow on Windows
+ g.setXORMode(temp!=null ? temp : Color.WHITE);
+ }
+ g.setColor(color);
+ bgRect.setRect(x,y-fontAscent, width,height);
+ //g.fill(bgRect);
+ g.fillRect((int)x, (int)(y-fontAscent), (int)width, (int)height);
+ if (xor) {
+ g.setPaintMode();
+ }
+ }
+
+
+ /**
+ * Does the dirty-work of actually painting the token.
+ */
+ protected float paintImpl(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart,
+ boolean selected) {
+
+ int origX = (int)x;
+ int end = token.textOffset + token.textCount;
+ float nextX = x;
+ int flushLen = 0;
+ int flushIndex = token.textOffset;
+ Color fg, bg;
+ if (selected) {
+ fg = host.getSelectedTextColor();
+ bg = null;
+ }
+ else {
+ fg = host.getForegroundForToken(token);
+ bg = host.getBackgroundForToken(token);
+ }
+ g.setFont(host.getFontForTokenType(token.type));
+ FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+
+ for (int i=token.textOffset; i<end; i++) {
+ switch (token.text[i]) {
+ case '\t':
+ nextX = e.nextTabStop(
+ x+fm.charsWidth(token.text, flushIndex,flushLen), 0);
+ if (bg!=null) {
+ paintBackground(x,y, nextX-x,fm.getHeight(),
+ g, fm.getAscent(), host, bg, !selected);
+ }
+ if (flushLen > 0) {
+ g.setColor(fg);
+ g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+ flushLen = 0;
+ }
+ flushIndex = i + 1;
+ x = nextX;
+ break;
+ default:
+ flushLen += 1;
+ break;
+ }
+ }
+
+ nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+
+ if (flushLen>0 && nextX>=clipStart) {
+ if (bg!=null) {
+ paintBackground(x,y, nextX-x,fm.getHeight(),
+ g, fm.getAscent(), host, bg, !selected);
+ }
+ g.setColor(fg);
+ g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+ }
+
+ if (host.getUnderlineForToken(token)) {
+ g.setColor(fg);
+ int y2 = (int)(y+1);
+ g.drawLine(origX,y2, (int)nextX,y2);
+ }
+
+ // Don't check if it's whitespace - some TokenMakers may return types
+ // other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+ // This also allows us to paint tab lines for MLC's.
+ if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+ paintTabLines(token, origX, (int)y, (int)nextX, g, e, host);
+ }
+
+ return nextX;
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public float paintSelected(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e) {
+ return paintSelected(token, g, x, y, host, e, 0);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public float paintSelected(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart) {
+ return paintImpl(token, g, x, y, host, e, clipStart, true);
+ }
+
+
+ /**
+ * Paints dotted "tab" lines; that is, lines that show where your caret
+ * would go to on the line if you hit "tab". This visual effect is usually
+ * done in the leading whitespace token(s) of lines.
+ *
+ * @param token The token to render.
+ * @param x The starting x-offset of this token. It is assumed that this
+ * is the left margin of the text area (may be non-zero due to
+ * insets), since tab lines are only painted for leading whitespace.
+ * @param y The baseline where this token was painted.
+ * @param endX The ending x-offset of this token.
+ * @param g The graphics context.
+ * @param e Used to expand tabs.
+ * @param host The text area.
+ */
+ protected void paintTabLines(Token token, int x, int y, int endX,
+ Graphics2D g, TabExpander e, RSyntaxTextArea host) {
+
+ // We allow tab lines to be painted in more than just Token.WHITESPACE,
+ // i.e. for MLC's and Token.IDENTIFIERS (for TokenMakers that return
+ // whitespace as identifiers for performance). But we only paint tab
+ // lines for the leading whitespace in the token. So, if this isn't a
+ // WHITESPACE token, figure out the leading whitespace's length.
+ if (token.type!=Token.WHITESPACE) {
+ int offs = token.textOffset;
+ for (; offs<token.textOffset+token.textCount; offs++) {
+ if (!RSyntaxUtilities.isWhitespace(token.text[offs])) {
+ break; // MLC text, etc.
+ }
+ }
+ int len = offs - token.textOffset;
+ if (len<2) { // Must be at least two spaces to see tab line
+ return;
+ }
+ //endX = x + (int)getWidthUpTo(len, host, e, x);
+ endX = (int)token.getWidthUpTo(len, host, e, 0);
+ }
+
+ // Get the length of a tab.
+ FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+ int tabSize = host.getTabSize();
+ if (tabBuf==null || tabBuf.length<tabSize) {
+ tabBuf = new char[tabSize];
+ for (int i=0; i<tabSize; i++) {
+ tabBuf[i] = ' ';
+ }
+ }
+ // Note different token types (MLC's, whitespace) could possibly be
+ // using different fonts, which means we can't cache the actual width
+ // of a tab as it may be different per-token-type. We could keep a
+ // per-token-type cache, but we'd have to clear it whenever they
+ // modified token styles.
+ int tabW = fm.charsWidth(tabBuf, 0, tabSize);
+
+ // Draw any tab lines. Here we're assuming that "x" is the left
+ // margin of the editor.
+ g.setColor(host.getTabLineColor());
+ int x0 = x + tabW;
+ int y0 = y - fm.getAscent();
+ if ((y0&1)>0) {
+ // Only paint on even y-pixels to prevent doubling up between lines
+ y0++;
+ }
+ while (x0<endX) {
+ int y1 = y0;
+ int y2 = y0 + host.getLineHeight();
+ while (y1<y2) {
+ g.drawLine(x0, y1, x0, y1);
+ y1 += 2;
+ }
+ //g.drawLine(x0,y0, x0,y0+host.getLineHeight());
+ x0 += tabW;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java b/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java
new file mode 100644
index 0000000..6008ced
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/DocumentRange.java
@@ -0,0 +1,62 @@
+/*
+ * 08/11/2009
+ *
+ * DocumentRange.java - A range of text in a document.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * A range of text in a document.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class DocumentRange {
+
+ private int startOffs;
+ private int endOffs;
+
+
+ public DocumentRange(int startOffs, int endOffs) {
+ this.startOffs = startOffs;
+ this.endOffs = endOffs;
+ }
+
+
+ /**
+ * Gets the end offset of the range.
+ *
+ * @return The end offset.
+ * @see #getStartOffset()
+ */
+ public int getEndOffset() {
+ return endOffs;
+ }
+
+
+ /**
+ * Gets the starting offset of the range.
+ *
+ * @return The starting offset.
+ * @see #getEndOffset()
+ */
+ public int getStartOffset() {
+ return startOffs;
+ }
+
+
+ /**
+ * Returns a string representation of this object.
+ *
+ * @return A string representation of this object.
+ */
+ public String toString() {
+ return "[DocumentRange: " + startOffs + "-" + endOffs + "]";
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java b/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java
new file mode 100644
index 0000000..88b34a4
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ErrorStrip.java
@@ -0,0 +1,766 @@
+/*
+ * 08/10/2009
+ *
+ * ErrorStrip.java - A component that can visually show Parser messages (syntax
+ * errors, etc.) in an RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JComponent;
+import javax.swing.ToolTipManager;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.TaskTagParser.TaskNotice;
+
+
+/**
+ * A component to sit alongside an {@link RSyntaxTextArea} that displays
+ * colored markers for locations of interest (parser errors, marked
+ * occurrences, etc.).<p>
+ *
+ * <code>ErrorStrip</code>s display <code>ParserNotice</code>s from
+ * {@link Parser}s. Currently, the only way to get lines flagged in this
+ * component is to register a <code>Parser</code> on an RSyntaxTextArea and
+ * return <code>ParserNotice</code>s for each line to display an icon for.
+ * The severity of each notice must be at least the threshold set by
+ * {@link #setLevelThreshold(int)} to be displayed in this error strip. The
+ * default threshold is {@link ParserNotice#WARNING}.<p>
+ *
+ * An <code>ErrorStrip</code> can be added to a UI like so:
+ * <pre>
+ * textArea = createTextArea();
+ * textArea.addParser(new MyParser(textArea)); // Identifies lines to display
+ * scrollPane = new RTextScrollPane(textArea, true);
+ * ErrorStrip es = new ErrorStrip(textArea);
+ * JPanel temp = new JPanel(new BorderLayout());
+ * temp.add(scrollPane);
+ * temp.add(es, BorderLayout.LINE_END);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+/*
+ * Possible improvements:
+ * 1. Handle marked occurrence changes separately from parser changes.
+ * For each property change, call a method that removes the notices
+ * being reloaded from the Markers (removing any Markers that are now
+ * "empty").
+ * 2. When 1.4 support is dropped, replace new Integer(int) with
+ * Integer.valueOf(int).
+ */
+public class ErrorStrip extends JComponent {
+
+ /**
+ * The text area.
+ */
+ private RSyntaxTextArea textArea;
+
+ /**
+ * Listens for events in this component.
+ */
+ private Listener listener;
+
+ /**
+ * Whether "marked occurrences" in the text area should be shown in this
+ * error strip.
+ */
+ private boolean showMarkedOccurrences;
+
+ /**
+ * Mapping of colors to brighter colors. This is kept to prevent
+ * unnecessary creation of the same Colors over and over.
+ */
+ private Map brighterColors;
+
+ /**
+ * Only notices of this severity (or worse) will be displayed in this
+ * error strip.
+ */
+ private int levelThreshold;
+
+ /**
+ * Whether the caret marker's location should be rendered.
+ */
+ private boolean followCaret;
+
+ /**
+ * The color to use for the caret marker.
+ */
+ private Color caretMarkerColor;
+
+ /**
+ * Where we paint the caret marker.
+ */
+ private int caretLineY;
+
+ /**
+ * The last location of the caret marker.
+ */
+ private int lastLineY;
+
+ /**
+ * The preferred width of this component.
+ */
+ private static final int PREFERRED_WIDTH = 14;
+
+ private static final String MSG = "org.fife.ui.rsyntaxtextarea.ErrorStrip";
+ private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The text area we are examining.
+ */
+ public ErrorStrip(RSyntaxTextArea textArea) {
+ this.textArea = textArea;
+ listener = new Listener();
+ ToolTipManager.sharedInstance().registerComponent(this);
+ setLayout(null); // Manually layout Markers as they can overlap
+ addMouseListener(listener);
+ setShowMarkedOccurrences(true);
+ setLevelThreshold(ParserNotice.WARNING);
+ setFollowCaret(true);
+ setCaretMarkerColor(Color.BLACK);
+ }
+
+
+ /**
+ * Overridden so we only start listening for parser notices when this
+ * component (and presumably the text area) are visible.
+ */
+ public void addNotify() {
+ super.addNotify();
+ textArea.addCaretListener(listener);
+ textArea.addPropertyChangeListener(
+ RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+ textArea.addPropertyChangeListener(
+ RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+ textArea.addPropertyChangeListener(
+ RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+ refreshMarkers();
+ }
+
+
+ /**
+ * Manually manages layout since this component uses no layout manager.
+ */
+ public void doLayout() {
+ for (int i=0; i<getComponentCount(); i++) {
+ Marker m = (Marker)getComponent(i);
+ m.updateLocation();
+ }
+ listener.caretUpdate(null); // Force recalculation of caret line pos
+ }
+
+
+ /**
+ * Returns a "brighter" color.
+ *
+ * @param c The color.
+ * @return A brighter color.
+ */
+ private Color getBrighterColor(Color c) {
+ if (brighterColors==null) {
+ brighterColors = new HashMap(5); // Usually small
+ }
+ Color brighter = (Color)brighterColors.get(c);
+ if (brighter==null) {
+ // Don't use c.brighter() as it doesn't work well for blue, and
+ // also doesn't return something brighter "enough."
+ int r = possiblyBrighter(c.getRed());
+ int g = possiblyBrighter(c.getGreen());
+ int b = possiblyBrighter(c.getBlue());
+ brighter = new Color(r, g, b);
+ brighterColors.put(c, brighter);
+ }
+ return brighter;
+ }
+
+
+ /**
+ * returns the color to use when painting the caret marker.
+ *
+ * @return The caret marker color.
+ * @see #setCaretMarkerColor(Color)
+ */
+ public Color getCaretMarkerColor() {
+ return caretMarkerColor;
+ }
+
+
+ /**
+ * Returns whether the caret's position should be drawn.
+ *
+ * @return Whether the caret's position should be drawn.
+ * @see #setFollowCaret(boolean)
+ */
+ public boolean getFollowCaret() {
+ return followCaret;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Dimension getPreferredSize() {
+ int height = textArea.getPreferredScrollableViewportSize().height;
+ return new Dimension(PREFERRED_WIDTH, height);
+ }
+
+
+ /**
+ * Returns the minimum severity a parser notice must be for it to be
+ * displayed in this error strip. This will be one of the constants
+ * defined in the <code>ParserNotice</code> class.
+ *
+ * @return The minimum severity.
+ * @see #setLevelThreshold(int)
+ */
+ public int getLevelThreshold() {
+ return levelThreshold;
+ }
+
+
+ /**
+ * Returns whether marked occurrences are shown in this error strip.
+ *
+ * @return Whether marked occurrences are shown.
+ * @see #setShowMarkedOccurrences(boolean)
+ */
+ public boolean getShowMarkedOccurrences() {
+ return showMarkedOccurrences;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getToolTipText(MouseEvent e) {
+ String text = null;
+ int line = yToLine(e.getY());
+ if (line>-1) {
+ text = msg.getString("Line");
+ // TODO: 1.5: Use Integer.valueOf(line)
+ text = MessageFormat.format(text,
+ new Object[] { new Integer(line+1) });
+ }
+ return text;
+ }
+
+
+ /**
+ * Returns the y-offset in this component corresponding to a line in the
+ * text component.
+ *
+ * @param line The line.
+ * @return The y-offset.
+ * @see #yToLine(int)
+ */
+ private int lineToY(int line) {
+ int h = textArea.getVisibleRect().height;
+ float lineCount = textArea.getLineCount();
+ return (int)((line/lineCount) * h) - 2;
+ }
+
+
+ /**
+ * Overridden to (possibly) draw the caret's position.
+ *
+ * @param g The graphics context.
+ */
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ if (caretLineY>-1) {
+ g.setColor(getCaretMarkerColor());
+ g.fillRect(0, caretLineY, getWidth(), 2);
+ }
+ }
+
+
+ /**
+ * Returns a possibly brighter component for a color.
+ *
+ * @param i An RGB component for a color (0-255).
+ * @return A possibly brighter value for the component.
+ */
+ private static final int possiblyBrighter(int i) {
+ if (i<255) {
+ i += (int)((255-i)*0.8f);
+ }
+ return i;
+ }
+
+
+ /**
+ * Refreshes the markers displayed in this error strip.
+ */
+ private void refreshMarkers() {
+
+ removeAll(); // listener is removed in Marker.removeNotify()
+ Map markerMap = new HashMap();
+
+ List notices = textArea.getParserNotices();
+ for (Iterator i=notices.iterator(); i.hasNext(); ) {
+ ParserNotice notice = (ParserNotice)i.next();
+ if (notice.getLevel()<=levelThreshold ||
+ (notice instanceof TaskNotice)) {
+ // 1.5: Use Integer.valueOf(notice.getLine())
+ Integer key = new Integer(notice.getLine());
+ Marker m = (Marker)markerMap.get(key);
+ if (m==null) {
+ m = new Marker(notice);
+ m.addMouseListener(listener);
+ markerMap.put(key, m);
+ add(m);
+ }
+ else {
+ m.addNotice(notice);
+ }
+ }
+ }
+
+ if (getShowMarkedOccurrences() && textArea.getMarkOccurrences()) {
+ List occurrences = textArea.getMarkedOccurrences();
+ for (Iterator i=occurrences.iterator(); i.hasNext(); ) {
+ DocumentRange range = (DocumentRange)i.next();
+ int line = 0;
+ try {
+ line = textArea.getLineOfOffset(range.getStartOffset());
+ } catch (BadLocationException ble) { // Never happens
+ continue;
+ }
+ ParserNotice notice = new MarkedOccurrenceNotice(range);
+ // 1.5: Use Integer.valueOf(notice.getLine())
+ Integer key = new Integer(line);
+ Marker m = (Marker)markerMap.get(key);
+ if (m==null) {
+ m = new Marker(notice);
+ m.addMouseListener(listener);
+ markerMap.put(key, m);
+ add(m);
+ }
+ else {
+ if (!m.containsMarkedOccurence()) {
+ m.addNotice(notice);
+ }
+ }
+ }
+ }
+
+ revalidate();
+ repaint();
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void removeNotify() {
+ super.removeNotify();
+ textArea.removeCaretListener(listener);
+ textArea.removePropertyChangeListener(
+ RSyntaxTextArea.PARSER_NOTICES_PROPERTY, listener);
+ textArea.removePropertyChangeListener(
+ RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY, listener);
+ textArea.removePropertyChangeListener(
+ RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY, listener);
+ }
+
+
+ /**
+ * Sets the color to use when painting the caret marker.
+ *
+ * @param color The new caret marker color.
+ * @see #getCaretMarkerColor()
+ */
+ public void setCaretMarkerColor(Color color) {
+ if (color!=null) {
+ caretMarkerColor = color;
+ listener.caretUpdate(null); // Force repaint
+ }
+ }
+
+
+ /**
+ * Toggles whether the caret's current location should be drawn.
+ *
+ * @param follow Whether the caret's current location should be followed.
+ * @see #getFollowCaret()
+ */
+ public void setFollowCaret(boolean follow) {
+ if (followCaret!=follow) {
+ if (followCaret) {
+ repaint(0,caretLineY, getWidth(),2); // Erase
+ }
+ caretLineY = -1;
+ lastLineY = -1;
+ followCaret = follow;
+ listener.caretUpdate(null); // Possibly repaint
+ }
+ }
+
+
+ /**
+ * Sets the minimum severity a parser notice must be for it to be displayed
+ * in this error strip. This should be one of the constants defined in
+ * the <code>ParserNotice</code> class. The default value is
+ * {@link ParserNotice#WARNING}.
+ *
+ * @param level The new severity threshold.
+ * @see #getLevelThreshold()
+ * @see ParserNotice
+ */
+ public void setLevelThreshold(int level) {
+ levelThreshold = level;
+ if (isDisplayable()) {
+ refreshMarkers();
+ }
+ }
+
+
+ /**
+ * Sets whether marked occurrences are shown in this error strip.
+ *
+ * @param show Whether to show marked occurrences.
+ * @see #getShowMarkedOccurrences()
+ */
+ public void setShowMarkedOccurrences(boolean show) {
+ if (show!=showMarkedOccurrences) {
+ showMarkedOccurrences = show;
+ if (isDisplayable()) { // Skip this when we're first created
+ refreshMarkers();
+ }
+ }
+ }
+
+
+ /**
+ * Returns the line in the text area corresponding to a y-offset in this
+ * component.
+ *
+ * @param y The y-offset.
+ * @return The line.
+ * @see #lineToY(int)
+ */
+ private final int yToLine(int y) {
+ int line = -1;
+ int h = textArea.getVisibleRect().height;
+ if (y<h) {
+ float at = y/(float)h;
+ line = (int)(textArea.getLineCount()*at);
+ }
+ return line;
+ }
+
+
+ /**
+ * Listens for events in the error strip and its markers.
+ */
+ private class Listener extends MouseAdapter
+ implements PropertyChangeListener, CaretListener {
+
+ private Rectangle visibleRect = new Rectangle();
+
+ public void caretUpdate(CaretEvent e) {
+ if (getFollowCaret()) {
+ int line = textArea.getCaretLineNumber();
+ float percent = line / ((float)textArea.getLineCount());
+ textArea.computeVisibleRect(visibleRect);
+ caretLineY = (int)(visibleRect.height*percent);
+ if (caretLineY!=lastLineY) {
+ repaint(0,lastLineY, getWidth(), 2); // Erase old position
+ repaint(0,caretLineY, getWidth(), 2);
+ lastLineY = caretLineY;
+ }
+ }
+ }
+
+ public void mouseClicked(MouseEvent e) {
+
+ Component source = (Component)e.getSource();
+ if (source instanceof Marker) {
+ ((Marker)source).mouseClicked(e);
+ return;
+ }
+
+ int line = yToLine(e.getY());
+ if (line>-1) {
+ try {
+ int offs = textArea.getLineStartOffset(line);
+ textArea.setCaretPosition(offs);
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+
+ String propName = e.getPropertyName();
+
+ // If they change whether marked occurrences are visible in editor
+ if (RSyntaxTextArea.MARK_OCCURRENCES_PROPERTY.equals(propName)) {
+ if (getShowMarkedOccurrences()) {
+ refreshMarkers();
+ }
+ }
+
+ // If parser notices changed.
+ else if (RSyntaxTextArea.PARSER_NOTICES_PROPERTY.equals(propName)) {
+ refreshMarkers();
+ }
+
+ // If marked occurrences changed.
+ else if (RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY.
+ equals(propName)) {
+ if (getShowMarkedOccurrences()) {
+ refreshMarkers();
+ }
+ }
+
+ }
+
+ }
+
+
+private static final Color COLOR = new Color(220, 220, 220);
+ /**
+ * A notice that wraps a "marked occurrence."
+ */
+ private class MarkedOccurrenceNotice implements ParserNotice {
+
+ private DocumentRange range;
+
+ public MarkedOccurrenceNotice(DocumentRange range) {
+ this.range = range;
+ }
+
+ public int compareTo(Object o) {
+ return 0; // Value doesn't matter
+ }
+
+ public boolean containsPosition(int pos) {
+ return pos>=range.getStartOffset() && pos<range.getEndOffset();
+ }
+
+ public boolean equals(Object o) {
+ // FindBugs - Define equals() when defining compareTo()
+ return compareTo(o)==0;
+ }
+
+ public Color getColor() {
+ return COLOR;
+ //return textArea.getMarkOccurrencesColor();
+ }
+
+ public int getLength() {
+ return range.getEndOffset() - range.getStartOffset();
+ }
+
+ public int getLevel() {
+ return INFO; // Won't matter
+ }
+
+ public int getLine() {
+ try {
+ return textArea.getLineOfOffset(range.getStartOffset());
+ } catch (BadLocationException ble) {
+ return 0;
+ }
+ }
+
+ public String getMessage() {
+ String text = null;
+ try {
+ String word = textArea.getText(range.getStartOffset(),
+ getLength());
+ text = msg.getString("OccurrenceOf");
+ text = MessageFormat.format(text, new String[] { word });
+ } catch (BadLocationException ble) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ return text;
+ }
+
+ public int getOffset() {
+ return range.getStartOffset();
+ }
+
+ public Parser getParser() {
+ return null;
+ }
+
+ public boolean getShowInEditor() {
+ return false; // Value doesn't matter
+ }
+
+ public String getToolTipText() {
+ return null;
+ }
+
+ public int hashCode() { // FindBugs, since we override equals()
+ return 0; // Value doesn't matter for us.
+ }
+
+ }
+
+
+ /**
+ * A "marker" in this error strip, representing one or more notices.
+ */
+ private class Marker extends JComponent {
+
+ private List notices;
+
+ public Marker(ParserNotice notice) {
+ notices = new ArrayList(1); // Usually just 1
+ addNotice(notice);
+ setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ setSize(getPreferredSize());
+ ToolTipManager.sharedInstance().registerComponent(this);
+ }
+
+ public void addNotice(ParserNotice notice) {
+ notices.add(notice);
+ }
+
+ public boolean containsMarkedOccurence() {
+ boolean result = false;
+ for (int i=0; i<notices.size(); i++) {
+ if (notices.get(i) instanceof MarkedOccurrenceNotice) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ public Color getColor() {
+ // Return the color for the highest-level parser.
+ Color c = null;
+ int lowestLevel = Integer.MAX_VALUE; // ERROR is 0
+ for (Iterator i=notices.iterator(); i.hasNext(); ) {
+ ParserNotice notice = (ParserNotice)i.next();
+ if (notice.getLevel()<lowestLevel) {
+ lowestLevel = notice.getLevel();
+ c = notice.getColor();
+ }
+ }
+ return c;
+ }
+
+ public Dimension getPreferredSize() {
+ int w = PREFERRED_WIDTH - 4; // 2-pixel empty border
+ return new Dimension(w, 5);
+ }
+
+ public String getToolTipText() {
+
+ String text = null;
+
+ if (notices.size()==1) {
+ text = ((ParserNotice)notices.get(0)).getMessage();
+ }
+ else { // > 1
+ StringBuffer sb = new StringBuffer("<html>");
+ sb.append(msg.getString("MultipleMarkers"));
+ sb.append("<br>");
+ for (int i=0; i<notices.size(); i++) {
+ ParserNotice pn = (ParserNotice)notices.get(i);
+ sb.append(" - ");
+ sb.append(pn.getMessage());
+ sb.append("<br>");
+ }
+ text = sb.toString();
+ }
+
+ return text;
+
+ }
+
+ protected void mouseClicked(MouseEvent e) {
+ ParserNotice pn = (ParserNotice)notices.get(0);
+ int offs = pn.getOffset();
+ int len = pn.getLength();
+ if (offs>-1 && len>-1) { // These values are optional
+ textArea.setSelectionStart(offs);
+ textArea.setSelectionEnd(offs+len);
+ }
+ else {
+ int line = pn.getLine();
+ try {
+ offs = textArea.getLineStartOffset(line);
+ textArea.setCaretPosition(offs);
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+ }
+
+ protected void paintComponent(Graphics g) {
+
+ // TODO: Give "priorities" and always pick color of a notice with
+ // highest priority (e.g. parsing errors will usually be red).
+
+ Color borderColor = getColor();
+ if (borderColor==null) {
+ borderColor = Color.DARK_GRAY;
+ }
+ Color fillColor = getBrighterColor(borderColor);
+
+ int w = getWidth();
+ int h = getHeight();
+
+ g.setColor(fillColor);
+ g.fillRect(0,0, w,h);
+
+ g.setColor(borderColor);
+ g.drawRect(0,0, w-1,h-1);
+
+ }
+
+ public void removeNotify() {
+ super.removeNotify();
+ ToolTipManager.sharedInstance().unregisterComponent(this);
+ removeMouseListener(listener);
+ }
+
+ public void updateLocation() {
+ int line = ((ParserNotice)notices.get(0)).getLine();
+ int y = lineToY(line);
+ setLocation(2, y);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java b/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java
new file mode 100644
index 0000000..8f02c92
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FileFileLocation.java
@@ -0,0 +1,114 @@
+/*
+ * 11/13/2008
+ *
+ * FileFileLocation.java - The location of a local file.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The location of a local file.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class FileFileLocation extends FileLocation {
+
+ /**
+ * The file. This may or may not actually exist.
+ */
+ private File file;
+
+
+ /**
+ * Constructor.
+ *
+ * @param file The local file.
+ */
+ public FileFileLocation(File file) {
+ try {
+ // Useful on Windows and OS X.
+ this.file = file.getCanonicalFile();
+ } catch (IOException ioe) {
+ this.file = file;
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected long getActualLastModified() {
+ return file.lastModified();
+ }
+
+
+ /**
+ * Returns the full path to the file.
+ *
+ * @return The full path to the file.
+ * @see #getFileName()
+ */
+ public String getFileFullPath() {
+ return file.getAbsolutePath();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getFileName() {
+ return file.getName();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected InputStream getInputStream() throws IOException {
+ return new FileInputStream(file);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected OutputStream getOutputStream() throws IOException {
+ return new FileOutputStream(file);
+ }
+
+
+ /**
+ * Always returns <code>true</code>.
+ *
+ * @return <code>true</code> always.
+ * @see #isLocalAndExists()
+ */
+ public boolean isLocal() {
+ return true;
+ }
+
+
+ /**
+ * Since file locations of this type are guaranteed to be local, this
+ * method returns whether the file exists.
+ *
+ * @return Whether this local file actually exists.
+ * @see #isLocal()
+ */
+ public boolean isLocalAndExists() {
+ return file.exists();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FileLocation.java b/src/org/fife/ui/rsyntaxtextarea/FileLocation.java
new file mode 100644
index 0000000..eac7319
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FileLocation.java
@@ -0,0 +1,141 @@
+/*
+ * 11/13/2008
+ *
+ * FileLocation.java - Holds the location of a local or remote file.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * Holds the location of a local or remote file. This provides a common way
+ * to read, write, and check properties of both local and remote files.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class FileLocation {
+
+
+ /**
+ * Creates a {@link FileLocation} instance for the specified local file.
+ *
+ * @param fileFullPath The full path to a local file.
+ * @return The file's location.
+ */
+ public static FileLocation create(String fileFullPath) {
+ return new FileFileLocation(new File(fileFullPath));
+ }
+
+
+ /**
+ * Creates a {@link FileLocation} instance for the specified local file.
+ *
+ * @param file A local file.
+ * @return The file's location.
+ */
+ public static FileLocation create(File file) {
+ return new FileFileLocation(file);
+ }
+
+
+ /**
+ * Creates a {@link FileLocation} instance for the specified file.
+ *
+ * @param url The URL of a file.
+ * @return The file's location.
+ */
+ public static FileLocation create(URL url) {
+ if ("file".equalsIgnoreCase(url.getProtocol())) {
+ return new FileFileLocation(new File(url.getPath()));
+ }
+ return new URLFileLocation(url);
+ }
+
+
+ /**
+ * Returns the last time this file was modified, or
+ * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+ * computed (such as for a remote file).
+ *
+ * @return The last time this file was modified.
+ */
+ protected abstract long getActualLastModified();
+
+
+ /**
+ * Returns the full path to the file. This will be stripped of
+ * sensitive information such as passwords for remote files.
+ *
+ * @return The full path to the file.
+ * @see #getFileName()
+ */
+ public abstract String getFileFullPath();
+
+
+ /**
+ * Returns the name of the file.
+ *
+ * @return The name of the file.
+ * @see #getFileFullPath()
+ */
+ public abstract String getFileName();
+
+
+ /**
+ * Opens an input stream for reading from this file.
+ *
+ * @return The input stream.
+ * @throws IOException If the file does not exist, or some other IO error
+ * occurs.
+ */
+ protected abstract InputStream getInputStream() throws IOException;
+
+
+ /**
+ * Opens an output stream for writing this file.
+ *
+ * @return An output stream.
+ * @throws IOException If an IO error occurs.
+ */
+ protected abstract OutputStream getOutputStream() throws IOException;
+
+
+ /**
+ * Returns whether this file location is a local file.
+ *
+ * @return Whether this is a local file.
+ * @see #isLocalAndExists()
+ */
+ public abstract boolean isLocal();
+
+
+ /**
+ * Returns whether this file location is a local file that already
+ * exists.
+ *
+ * @return Whether this file is local and actually exists.
+ * @see #isLocal()
+ */
+ public abstract boolean isLocalAndExists();
+
+
+ /**
+ * Returns whether this file location is a remote location.
+ *
+ * @return Whether this is a remote file location.
+ */
+ public boolean isRemote() {
+ return !isLocal();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java b/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java
new file mode 100644
index 0000000..77efeef
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java
@@ -0,0 +1,247 @@
+/*
+ * 03/07/2012
+ *
+ * FoldingAwareIconRowHeader - Icon row header that paints itself correctly
+ * even when code folding is enabled.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Point;
+import javax.swing.Icon;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.GutterIconInfo;
+import org.fife.ui.rtextarea.IconRowHeader;
+
+
+/**
+ * A row header component that takes code folding into account when painting
+ * itself.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldingAwareIconRowHeader extends IconRowHeader {
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The parent text area.
+ */
+ public FoldingAwareIconRowHeader(RSyntaxTextArea textArea) {
+ super(textArea);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void paintComponent(Graphics g) {
+
+ // When line wrap is not enabled, take the faster code path.
+ if (textArea==null) {
+ return;
+ }
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ FoldManager fm = rsta.getFoldManager();
+ if (!fm.isCodeFoldingSupportedAndEnabled()) {
+ super.paintComponent(g);
+ return;
+ }
+
+ visibleRect = g.getClipBounds(visibleRect);
+ if (visibleRect==null) { // ???
+ visibleRect = getVisibleRect();
+ }
+ //System.out.println("IconRowHeader repainting: " + visibleRect);
+ if (visibleRect==null) {
+ return;
+ }
+
+ g.setColor(getBackground());
+ g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+ if (textArea.getLineWrap()) {
+ paintComponentWrapped(g);
+ return;
+ }
+
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ textAreaInsets = textArea.getInsets(textAreaInsets);
+
+ // Get the first line to paint.
+ int cellHeight = textArea.getLineHeight();
+ int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+
+ // Get where to start painting (top of the row).
+ // We need to be "scrolled up" up just enough for the missing part of
+ // the first line.
+ int y = topLine*cellHeight + textAreaInsets.top;
+
+ // AFTER calculating visual offset to paint at, account for folding.
+ topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+ // Paint the active line range.
+ if (activeLineRangeStart>-1 && activeLineRangeEnd>-1) {
+ Color activeLineRangeColor = getActiveLineRangeColor();
+ g.setColor(activeLineRangeColor);
+ try {
+
+ int realY1 = rsta.yForLine(activeLineRangeStart);
+ if (realY1>-1) { // Not in a collapsed fold...
+
+ int y1 = realY1;//Math.max(y, realY1);
+
+ int y2 = rsta.yForLine(activeLineRangeEnd);
+ if (y2==-1) { // In a collapsed fold
+ y2 = y1;
+ }
+ y2 += cellHeight - 1;
+
+ if (y2<visibleRect.y || y1>visibleRect.y+visibleRect.height) {
+ //System.out.println("... nothing to paint, bailing...");
+ return;
+ }
+ y1 = Math.max(y, realY1);
+ y2 = Math.min(y2, visibleRect.y+visibleRect.height);
+ //System.out.println(y1 + "... " + y2 + "; " + realY1 + ", " + visibleRect);
+
+ int j = y1;
+ while (j<=y2) {
+ int yEnd = Math.min(y2, j+getWidth());
+ int xEnd = yEnd-j;
+ g.drawLine(0,j, xEnd,yEnd);
+ j += 2;
+ }
+
+ int i = 2;
+ while (i<getWidth()) {
+ int yEnd = y1 + getWidth() - i;
+ g.drawLine(i,y1, getWidth(),yEnd);
+ i += 2;
+ }
+
+ if (realY1>=y && realY1<visibleRect.y+visibleRect.height) {
+ g.drawLine(0,realY1, getWidth(),realY1);
+ }
+ if (y2>=y && y2<visibleRect.y+visibleRect.height) {
+ g.drawLine(0,y2, getWidth(),y2);
+ }
+
+ }
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+
+ // Paint icons
+ if (trackingIcons!=null) {
+ int lastLine = textArea.getLineCount() - 1;
+ for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+ GutterIconInfo ti = getTrackingIcon(i);
+ int offs = ti.getMarkedOffset();
+ if (offs>=0 && offs<=doc.getLength()) {
+ int line = root.getElementIndex(offs);
+ if (line<=lastLine && line>=topLine) {
+ try {
+ Icon icon = ti.getIcon();
+ if (icon!=null) {
+ int lineY = rsta.yForLine(line);
+ if (lineY>=y && lineY<=visibleRect.y+visibleRect.height) {
+ int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+ icon.paintIcon(this, g, 0, y2);
+ lastLine = line-1; // Paint only 1 icon per line
+ }
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ else if (line<topLine) {
+ break; // All other lines are above us, so quit now
+ }
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * Paints icons when line wrapping is enabled. Note that this does not
+ * override the parent class's implementation to avoid this version being
+ * called when line wrapping is disabled.
+ */
+ private void paintComponentWrapped(Graphics g) {
+
+ // The variables we use are as follows:
+ // - visibleRect is the "visible" area of the text area; e.g.
+ // [0,100, 300,100+(lineCount*cellHeight)-1].
+ // actualTop.y is the topmost-pixel in the first logical line we
+ // paint. Note that we may well not paint this part of the logical
+ // line, as it may be broken into many physical lines, with the first
+ // few physical lines scrolled past. Note also that this is NOT the
+ // visible rect of this line number list; this line number list has
+ // visible rect == [0,0, insets.left-1,visibleRect.height-1].
+
+ // We avoid using modelToView/viewToModel where possible, as these
+ // methods trigger a parsing of the line into syntax tokens, which is
+ // costly. It's cheaper to just grab the child views' bounds.
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+// boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int topPosition = textArea.viewToModel(
+ new Point(visibleRect.x,visibleRect.y));
+ int topLine = root.getElementIndex(topPosition);
+
+ int topY = visibleRect.y;
+ int bottomY = visibleRect.y + visibleRect.height;
+ int cellHeight = textArea.getLineHeight();
+
+ // Paint icons
+ if (trackingIcons!=null) {
+ int lastLine = textArea.getLineCount() - 1;
+ for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+ GutterIconInfo ti = getTrackingIcon(i);
+ int offs = ti.getMarkedOffset();
+ if (offs>=0 && offs<=doc.getLength()) {
+ int line = root.getElementIndex(offs);
+ if (line<=lastLine && line>=topLine) {
+ try {
+ int lineY = rsta.yForLine(line);
+ if (lineY>=topY && lineY<bottomY) {
+ Icon icon = ti.getIcon();
+ if (icon!=null) {
+ int y2 = lineY + (cellHeight-icon.getIconHeight())/2;
+ ti.getIcon().paintIcon(this, g, 0, y2);
+ lastLine = line-1; // Paint only 1 icon per line
+ }
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ else if (line<topLine) {
+ break; // All other lines are above us, so quit now
+ }
+ }
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java b/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java
new file mode 100644
index 0000000..2084025
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/LinkGenerator.java
@@ -0,0 +1,50 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Generates hyperlinks in a document. If one of these is installed on an
+ * <code>RSyntaxTextArea</code> it is queried when the mouse is moved and
+ * hyperlinks are enabled. If the user is not hovering over a "real" hyperlink
+ * (e.g. "http://www.google.com"), the link generator is asked if a text region
+ * at the mouse position should be considered a hyperlink. If so, a result
+ * object is returned, describing exactly what region of text is the link, and
+ * where it goes to.<p>
+ *
+ * This interface is typically used by applications providing advanced support
+ * for programming languages, such as IDEs. For example, an implementation of
+ * this class could identify the token under the mouse position as a "variable,"
+ * and the hyperlink returned would select the variable's declaration in the
+ * document.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface LinkGenerator {
+
+
+ /**
+ * If a region of text under the mouse position should be considered a
+ * hyperlink, a result object is returned. This object describes what
+ * region of text is the link, and what action to perform if the link is
+ * clicked.
+ *
+ * @param textArea The text component.
+ * @param offs The offset in the document under the mouse position.
+ * @return The link information, or <code>null</code> if no link is at the
+ * specified offset.
+ */
+ public LinkGeneratorResult isLinkAtOffset(RSyntaxTextArea textArea,
+ int offs);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java b/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java
new file mode 100644
index 0000000..26aa793
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/LinkGeneratorResult.java
@@ -0,0 +1,53 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.event.HyperlinkEvent;
+
+
+/**
+ * A result object from a {@link LinkGenerator}. Implementations of this class
+ * specify what action to execute when the user clicks on the "link" specified
+ * by the <code>LinkGenerator</code>. Typically, this will do something like
+ * select another region of text in the document (the declaration of the
+ * variable at the mouse position), or open another file in the parent
+ * application, etc.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SelectRegionLinkGeneratorResult
+ */
+public interface LinkGeneratorResult {
+
+
+ /**
+ * Executes the action associated with this object. If the result is a
+ * URL to open, a standard hyperlink event can be returned. Alternatively,
+ * <code>null</code> can be returned and the action performed in this
+ * method itself.
+ *
+ * @return The hyperlink event to broadcast from the text area, or
+ * <code>null</code> if the action's behavior occurs in this method
+ * directly.
+ */
+ public HyperlinkEvent execute();
+
+
+ /**
+ * Returns the starting offset of the link specified by the parent
+ * <code>LinkGenerator</code>.
+ *
+ * @return The offset.
+ */
+ public int getSourceOffset();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java
new file mode 100644
index 0000000..784823b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java
@@ -0,0 +1,139 @@
+/*
+ * 10/01/2009
+ *
+ * MarkOccurrencesHighlightPainter.java - Renders "marked occurrences."
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that renders "mark occurrences."
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+/*
+ * NOTE: This implementation is a "hack" so typing at the "end" of the highlight
+ * does not extend it to include the newly-typed chars, which is the standard
+ * behavior of Swing Highlights.
+ */
+class MarkOccurrencesHighlightPainter extends ChangeableColorHighlightPainter {
+
+ private Color borderColor;
+ private boolean paintBorder;
+
+
+ /**
+ * Creates a highlight painter that defaults to blue.
+ */
+ public MarkOccurrencesHighlightPainter() {
+ super(Color.BLUE);
+ }
+
+
+ /**
+ * Returns whether a border is painted around marked occurrences.
+ *
+ * @return Whether a border is painted.
+ * @see #setPaintBorder(boolean)
+ * @see #getColor()
+ */
+ public boolean getPaintBorder() {
+ return paintBorder;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Shape paintLayer(Graphics g, int p0, int p1, Shape viewBounds,
+ JTextComponent c, View view) {
+
+ g.setColor(getColor());
+ p1++; // Workaround for Java Highlight issues.
+
+ // This special case isn't needed for most standard Swing Views (which
+ // always return a width of 1 for modelToView() calls), but it is
+ // needed for RSTA views, which actually return the width of chars for
+ // modelToView calls. But this should be faster anyway, as we
+ // short-circuit and do only one modelToView() for one offset.
+ if (p0==p1) {
+ try {
+ Shape s = view.modelToView(p0, viewBounds,
+ Position.Bias.Forward);
+ Rectangle r = s.getBounds();
+ g.drawLine(r.x, r.y, r.x, r.y+r.height);
+ return r;
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ return null;
+ }
+ }
+
+ if (p0 == view.getStartOffset() && p1 == view.getEndOffset()) {
+ // Contained in view, can just use bounds.
+ Rectangle alloc;
+ if (viewBounds instanceof Rectangle) {
+ alloc = (Rectangle) viewBounds;
+ } else {
+ alloc = viewBounds.getBounds();
+ }
+ g.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+ return alloc;
+ }
+
+ // Should only render part of View.
+ try {
+ // --- determine locations ---
+ Shape shape = view.modelToView(p0, Position.Bias.Forward, p1,
+ Position.Bias.Backward, viewBounds);
+ Rectangle r = (shape instanceof Rectangle) ? (Rectangle) shape
+ : shape.getBounds();
+ g.fillRect(r.x, r.y, r.width, r.height);
+ if (paintBorder) {
+ g.setColor(borderColor);
+ g.drawRect(r.x,r.y, r.width-1,r.height-1);
+ }
+ return r;
+ } catch (BadLocationException e) { // Never happens
+ e.printStackTrace();
+ return null;
+ }
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setColor(Color c) {
+ super.setColor(c);
+ borderColor = c.darker();
+ }
+
+
+ /**
+ * Toggles whether a border is painted around highlights.
+ *
+ * @param paint Whether to paint a border.
+ * @see #getPaintBorder()
+ * @see #setColor(Color)
+ */
+ public void setPaintBorder(boolean paint) {
+ this.paintBorder = paint;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java
new file mode 100644
index 0000000..a12e4ca
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/MarkOccurrencesSupport.java
@@ -0,0 +1,314 @@
+/*
+ * 01/06/2009
+ *
+ * MarkOccurrencesSupport.java - Handles marking all occurrences of the
+ * currently selected identifier in a text area.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.Timer;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+
+
+/**
+ * Marks all occurrences of the token at the current caret position, if it is
+ * an identifier.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see OccurrenceMarker
+ */
+class MarkOccurrencesSupport implements CaretListener, ActionListener {
+
+ private RSyntaxTextArea textArea;
+ private Timer timer;
+ private MarkOccurrencesHighlightPainter p;
+
+ /**
+ * The default color used to mark occurrences.
+ */
+ public static final Color DEFAULT_COLOR = new Color(224, 224, 224);
+
+ /**
+ * The default delay.
+ */
+ private static final int DEFAULT_DELAY_MS = 1000;
+
+
+ /**
+ * Constructor. Creates a listener with a 1 second delay.
+ */
+ public MarkOccurrencesSupport() {
+ this(DEFAULT_DELAY_MS);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param delay The delay between when the caret last moves and when the
+ * text should be scanned for matching occurrences. This should
+ * be in milliseconds.
+ */
+ public MarkOccurrencesSupport(int delay) {
+ this(delay, DEFAULT_COLOR);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param delay The delay between when the caret last moves and when the
+ * text should be scanned for matching occurrences. This should
+ * be in milliseconds.
+ * @param color The color to use to mark the occurrences. This cannot be
+ * <code>null</code>.
+ */
+ public MarkOccurrencesSupport(int delay, Color color) {
+ timer = new Timer(delay, this);
+ timer.setRepeats(false);
+ p = new MarkOccurrencesHighlightPainter();
+ setColor(color);
+ }
+
+
+ /**
+ * Called after the caret has been moved and a fixed time delay has
+ * elapsed. This locates and highlights all occurrences of the identifier
+ * at the caret position, if any.
+ *
+ * @param e The event.
+ */
+ public void actionPerformed(ActionEvent e) {
+
+ // Don't do anything if they are selecting text.
+ Caret c = textArea.getCaret();
+ if (c.getDot()!=c.getMark()) {
+ return;
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ OccurrenceMarker occurrenceMarker = doc.getOccurrenceMarker();
+ boolean occurrencesChanged = false;
+
+ if (occurrenceMarker!=null) {
+
+ doc.readLock();
+ try {
+
+ // Get the token at the caret position.
+ int line = textArea.getCaretLineNumber();
+ Token tokenList = textArea.getTokenListForLine(line);
+ int dot = c.getDot();
+ Token t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+ if (t==null /* EOL */ || !isValidType(t) || isNonWordChar(t)) {
+ // Try to the "left" of the caret.
+ dot--;
+ try {
+ if (dot>=textArea.getLineStartOffset(line)) {
+ t = RSyntaxUtilities.getTokenAtOffset(tokenList, dot);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+
+ if (t!=null && isValidType(t) && !isNonWordChar(t)) {
+ removeHighlights();
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ occurrenceMarker.markOccurrences(doc, t, h, p);
+ //textArea.repaint();
+ // TODO: Do a textArea.repaint() instead of repainting each
+ // marker as it's added if count is huge
+ occurrencesChanged = true;
+ }
+
+ } finally {
+ doc.readUnlock();
+ //time = System.currentTimeMillis() - time;
+ //System.out.println("MarkOccurrencesSupport took: " + time + " ms");
+ }
+
+ }
+
+ if (occurrencesChanged) {
+ textArea.fireMarkedOccurrencesChanged();
+ }
+
+ }
+
+
+ /**
+ * Called when the caret moves in the text area.
+ *
+ * @param e The event.
+ */
+ public void caretUpdate(CaretEvent e) {
+ timer.restart();
+ }
+
+
+ /**
+ * Returns the color being used to mark occurrences.
+ *
+ * @return The color being used.
+ * @see #setColor(Color)
+ */
+ public Color getColor() {
+ return p.getColor();
+ }
+
+
+ /**
+ * Returns the delay, in milliseconds.
+ *
+ * @return The delay.
+ * @see #setDelay(int)
+ */
+ public int getDelay() {
+ return timer.getDelay();
+ }
+
+
+ /**
+ * Returns whether a border is painted around marked occurrences.
+ *
+ * @return Whether a border is painted.
+ * @see #setPaintBorder(boolean)
+ * @see #getColor()
+ */
+ public boolean getPaintBorder() {
+ return p.getPaintBorder();
+ }
+
+
+ /**
+ * Installs this listener on a text area. If it is already installed on
+ * another text area, it is uninstalled first.
+ *
+ * @param textArea The text area to install on.
+ */
+ public void install(RSyntaxTextArea textArea) {
+ if (this.textArea!=null) {
+ uninstall();
+ }
+ this.textArea = textArea;
+ textArea.addCaretListener(this);
+ if (textArea.getMarkOccurrencesColor()!=null) {
+ setColor(textArea.getMarkOccurrencesColor());
+ }
+ }
+
+
+ /**
+ * Returns whether the specified token is a single non-word char (e.g. not
+ * in <tt>[A-Za-z]</tt>. This is a HACK to work around the fact that many
+ * standard token makers return things like semicolons and periods as
+ * {@link Token#IDENTIFIER}s just to make the syntax highlighting coloring
+ * look a little better.
+ *
+ * @param t The token to check. This cannot be <tt>null</tt>.
+ * @return Whether the token is a single non-word char.
+ */
+ private static final boolean isNonWordChar(Token t) {
+ return t.textCount==1 &&
+ !RSyntaxUtilities.isLetter(t.text[t.textOffset]);
+ }
+
+
+ /**
+ * Returns whether the specified token is a type that we can do a
+ * "mark occurrences" on.
+ *
+ * @param t The token.
+ * @return Whether we should mark all occurrences of this token.
+ */
+ private boolean isValidType(Token t) {
+ return textArea.getMarkOccurrencesOfTokenType(t.type);
+ }
+
+
+ /**
+ * Removes all highlights added to the text area by this listener.
+ */
+ private void removeHighlights() {
+ if (textArea!=null) {
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ h.clearMarkOccurrencesHighlights();
+ }
+ }
+
+
+ /**
+ * Sets the color to use when marking occurrences.
+ *
+ * @param color The color to use.
+ * @see #getColor()
+ * @see #setPaintBorder(boolean)
+ */
+ public void setColor(Color color) {
+ p.setColor(color);
+ if (textArea!=null) {
+ removeHighlights();
+ caretUpdate(null); // Force a highlight repaint.
+ }
+ }
+
+
+ /**
+ * Sets the delay between the last caret position change and when the
+ * text is scanned for matching identifiers. A delay is needed to prevent
+ * repeated scanning while the user is typing.
+ *
+ * @param delay The new delay.
+ * @see #getDelay()
+ */
+ public void setDelay(int delay) {
+ timer.setDelay(delay);
+ }
+
+
+ /**
+ * Toggles whether a border is painted around marked highlights.
+ *
+ * @param paint Whether to paint a border.
+ * @see #getPaintBorder()
+ * @see #setColor(Color)
+ */
+ public void setPaintBorder(boolean paint) {
+ if (paint!=p.getPaintBorder()) {
+ p.setPaintBorder(paint);
+ if (textArea!=null) {
+ textArea.repaint();
+ }
+ }
+ }
+
+
+ /**
+ * Uninstalls this listener from the current text area. Does nothing if
+ * it not currently installed on any text area.
+ *
+ * @see #install(RSyntaxTextArea)
+ */
+ public void uninstall() {
+ if (textArea!=null) {
+ removeHighlights();
+ textArea.removeCaretListener(this);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java
new file mode 100644
index 0000000..43ae8e7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/OccurrenceMarker.java
@@ -0,0 +1,36 @@
+/*
+ * 03/09/2013
+ *
+ * OccurrenceMarker - Marks occurrences of the current token.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An <code>OccurrenceMarker</code> is called when the caret stops moving after
+ * a short period. If the current {@link TokenMaker} returns an instance of
+ * this class, it is told to mark all occurrences of the identifier at the
+ * caret position.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface OccurrenceMarker {
+
+
+ /**
+ * Called when occurrences of a token should be marked.
+ *
+ * @param doc The document.
+ * @param t The document whose relevant occurrences should be marked.
+ * @param h The highlighter to add the highlights to.
+ * @param p The painter for the highlights.
+ */
+ public void markOccurrences(RSyntaxDocument doc, Token t,
+ RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/ParserManager.java b/src/org/fife/ui/rsyntaxtextarea/ParserManager.java
new file mode 100644
index 0000000..9c619ce
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/ParserManager.java
@@ -0,0 +1,707 @@
+/*
+ * 09/26/2005
+ *
+ * ParserManager.java - Manages the parsing of an RSyntaxTextArea's document,
+ * if necessary.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Timer;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+
+
+
+/**
+ * Manages running a parser object for an <code>RSyntaxTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+class ParserManager implements DocumentListener, ActionListener,
+ HyperlinkListener {
+
+ private RSyntaxTextArea textArea;
+ private List parsers;
+ private Timer timer;
+ private boolean running;
+ private Parser parserForTip;
+ private Position firstOffsetModded;
+ private Position lastOffsetModded;
+
+ /**
+ * Mapping of notices to their highlights in the editor. Can't use a Map
+ * since parsers could return two <code>ParserNotice</code>s that compare
+ * equally via <code>equals()</code>. Real-world example: The Perl
+ * compiler will return 2+ identical error messages if the same error is
+ * committed in a single line more than once.
+ */
+ private List noticeHighlightPairs;
+
+ /**
+ * Painter used to underline errors.
+ */
+ private SquiggleUnderlineHighlightPainter parserErrorHighlightPainter =
+ new SquiggleUnderlineHighlightPainter(Color.RED);
+
+ /**
+ * If this system property is set to <code>true</code>, debug messages
+ * will be printed to stdout to help diagnose parsing issues.
+ */
+ private static final String PROPERTY_DEBUG_PARSING = "rsta.debugParsing";
+
+ /**
+ * Whether to print debug messages while running parsers.
+ */
+ private static final boolean DEBUG_PARSING;
+
+ /**
+ * The default delay between the last key press and when the document
+ * is parsed, in milliseconds.
+ */
+ private static final int DEFAULT_DELAY_MS = 1250;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The text area whose document the parser will be
+ * parsing.
+ */
+ public ParserManager(RSyntaxTextArea textArea) {
+ this(DEFAULT_DELAY_MS, textArea);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param delay The delay between the last key press and when the document
+ * is parsed.
+ * @param textArea The text area whose document the parser will be
+ * parsing.
+ */
+ public ParserManager(int delay, RSyntaxTextArea textArea) {
+ this.textArea = textArea;
+ textArea.getDocument().addDocumentListener(this);
+ parsers = new ArrayList(1); // Usually small
+ timer = new Timer(delay, this);
+ timer.setRepeats(false);
+ running = true;
+ }
+
+
+ /**
+ * Called when the timer fires (e.g. it's time to parse the document).
+ *
+ * @param e The event.
+ */
+ public void actionPerformed(ActionEvent e) {
+
+ // Sanity check - should have >1 parser if event is fired.
+ int parserCount = getParserCount();
+ if (parserCount==0) {
+ return;
+ }
+
+ long begin = 0;
+ if (DEBUG_PARSING) {
+ begin = System.currentTimeMillis();
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+ Element root = doc.getDefaultRootElement();
+ int firstLine = firstOffsetModded==null ? 0 : root.getElementIndex(firstOffsetModded.getOffset());
+ int lastLine = lastOffsetModded==null ? root.getElementCount()-1 : root.getElementIndex(lastOffsetModded.getOffset());
+ firstOffsetModded = lastOffsetModded = null;
+ if (DEBUG_PARSING) {
+ System.out.println("[DEBUG]: Minimum lines to parse: " + firstLine + "-" + lastLine);
+ }
+
+ String style = textArea.getSyntaxEditingStyle();
+ doc.readLock();
+ try {
+ for (int i=0; i<parserCount; i++) {
+ Parser parser = getParser(i);
+ if (parser.isEnabled()) {
+ ParseResult res = parser.parse(doc, style);
+ addParserNoticeHighlights(res);
+ }
+ else {
+ clearParserNoticeHighlights(parser);
+ }
+ }
+ textArea.fireParserNoticesChange();
+ } finally {
+ doc.readUnlock();
+ }
+
+ if (DEBUG_PARSING) {
+ float time = (System.currentTimeMillis()-begin)/1000f;
+ System.out.println("Total parsing time: " + time + " seconds");
+ }
+
+ }
+
+
+ /**
+ * Adds a parser for the text area.
+ *
+ * @param parser The new parser. If this is <code>null</code>, nothing
+ * happens.
+ * @see #getParser(int)
+ * @see #removeParser(Parser)
+ */
+ public void addParser(Parser parser) {
+ if (parser!=null && !parsers.contains(parser)) {
+ if (running) {
+ timer.stop();
+ }
+ parsers.add(parser);
+ if (parsers.size()==1) {
+ // Okay to call more than once.
+ ToolTipManager.sharedInstance().registerComponent(textArea);
+ }
+ if (running) {
+ timer.restart();
+ }
+ }
+ }
+
+
+ /**
+ * Adds highlights for a list of parser notices. Any current notices
+ * from the same Parser, in the same parsed range, are removed.
+ *
+ * @param res The result of a parsing.
+ * @see #clearParserNoticeHighlights()
+ */
+ private void addParserNoticeHighlights(ParseResult res) {
+
+ // Parsers are supposed to return at least empty ParseResults, but
+ // we'll be defensive here.
+ if (res==null) {
+ return;
+ }
+
+ if (DEBUG_PARSING) {
+ System.out.println("[DEBUG]: Adding parser notices from " +
+ res.getParser());
+ }
+
+ if (noticeHighlightPairs==null) {
+ noticeHighlightPairs = new ArrayList();
+ }
+
+ removeParserNotices(res);
+
+ List notices = res.getNotices();
+ if (notices.size()>0) { // Guaranteed non-null
+
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+
+ for (Iterator i=notices.iterator(); i.hasNext(); ) {
+ ParserNotice notice = (ParserNotice)i.next();
+ if (DEBUG_PARSING) {
+ System.out.println("[DEBUG]: ... adding: " + notice);
+ }
+ try {
+ Object highlight = null;
+ if (notice.getShowInEditor()) {
+ highlight = h.addParserHighlight(notice,
+ parserErrorHighlightPainter);
+ }
+ noticeHighlightPairs.add(new NoticeHighlightPair(notice, highlight));
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+ }
+
+ }
+
+ if (DEBUG_PARSING) {
+ System.out.println("[DEBUG]: Done adding parser notices from " +
+ res.getParser());
+ }
+
+ }
+
+
+ /**
+ * Called when the document is modified.
+ *
+ * @param e The document event.
+ */
+ public void changedUpdate(DocumentEvent e) {
+ }
+
+
+ private void clearParserNoticeHighlights() {
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ if (h!=null) {
+ h.clearParserHighlights();
+ }
+ if (noticeHighlightPairs!=null) {
+ noticeHighlightPairs.clear();
+ }
+ }
+
+
+ /**
+ * Removes all parser notice highlights for a specific parser.
+ *
+ * @param parser The parser whose highlights to remove.
+ */
+ private void clearParserNoticeHighlights(Parser parser) {
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ if (h!=null) {
+ h.clearParserHighlights(parser);
+ }
+ if (noticeHighlightPairs!=null) {
+ for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+ NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+ if (pair.notice.getParser()==parser) {
+ i.remove();
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Removes all parsers and any highlights they have created.
+ *
+ * @see #addParser(Parser)
+ */
+ public void clearParsers() {
+ timer.stop();
+ clearParserNoticeHighlights();
+ parsers.clear();
+ textArea.fireParserNoticesChange();
+ }
+
+
+ /**
+ * Forces the given {@link Parser} to re-parse the content of this text
+ * area.<p>
+ *
+ * This method can be useful when a <code>Parser</code> can be configured
+ * as to what notices it returns. For example, if a Java language parser
+ * can be configured to set whether no serialVersionUID is a warning,
+ * error, or ignored, this method can be called after changing the expected
+ * notice type to have the document re-parsed.
+ *
+ * @param parser The index of the <code>Parser</code> to re-run.
+ * @see #getParser(int)
+ */
+ public void forceReparsing(int parser) {
+ Parser p = getParser(parser);
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ String style = textArea.getSyntaxEditingStyle();
+ doc.readLock();
+ try {
+ if (p.isEnabled()) {
+ ParseResult res = p.parse(doc, style);
+ addParserNoticeHighlights(res);
+ }
+ else {
+ clearParserNoticeHighlights(p);
+ }
+ textArea.fireParserNoticesChange();
+ } finally {
+ doc.readUnlock();
+ }
+ }
+
+
+ /**
+ * Returns the delay between the last "concurrent" edit and when the
+ * document is re-parsed.
+ *
+ * @return The delay, in milliseconds.
+ * @see #setDelay(int)
+ */
+ public int getDelay() {
+ return timer.getDelay();
+ }
+
+
+ /**
+ * Returns the specified parser.
+ *
+ * @param index The index of the parser.
+ * @return The parser.
+ * @see #getParserCount()
+ * @see #addParser(Parser)
+ * @see #removeParser(Parser)
+ */
+ public Parser getParser(int index) {
+ return (Parser)parsers.get(index);
+ }
+
+
+ /**
+ * Returns the number of registered parsers.
+ *
+ * @return The number of registered parsers.
+ */
+ public int getParserCount() {
+ return parsers.size();
+ }
+
+
+ /**
+ * Returns a list of the current parser notices for this text area.
+ * This method (like most Swing methods) should only be called on the
+ * EDT.
+ *
+ * @return The list of notices. This will be an empty list if there are
+ * none.
+ */
+ public List getParserNotices() {
+ List notices = new ArrayList();
+ if (noticeHighlightPairs!=null) {
+ for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+ NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+ notices.add(pair.notice);
+ }
+ }
+ return notices;
+ }
+
+
+ /**
+ * Returns the tool tip to display for a mouse event at the given
+ * location. This method is overridden to give a registered parser a
+ * chance to display a tool tip (such as an error description when the
+ * mouse is over an error highlight).
+ *
+ * @param e The mouse event.
+ * @return The tool tip to display, and possibly a hyperlink event handler.
+ */
+ public ToolTipInfo getToolTipText(MouseEvent e) {
+
+ String tip = null;
+ HyperlinkListener listener = null;
+ parserForTip = null;
+
+// try {
+ int pos = textArea.viewToModel(e.getPoint());
+ /*
+ Highlighter.Highlight[] highlights = textArea.getHighlighter().
+ getHighlights();
+ for (int i=0; i<highlights.length; i++) {
+ Highlighter.Highlight h = highlights[i];
+ //if (h instanceof ParserNoticeHighlight) {
+ // ParserNoticeHighlight pnh = (ParserNoticeHighlight)h;
+ int start = h.getStartOffset();
+ int end = h.getEndOffset();
+ if (start<=pos && end>=pos) {
+ //return pnh.getMessage();
+ return textArea.getText(start, end-start);
+ }
+ //}
+ }
+ */
+ if (noticeHighlightPairs!=null) {
+ for (int j=0; j<noticeHighlightPairs.size(); j++) {
+ NoticeHighlightPair pair =
+ (NoticeHighlightPair)noticeHighlightPairs.get(j);
+ ParserNotice notice = pair.notice;
+ if (notice.containsPosition(pos)) {
+ tip = notice.getToolTipText();
+ parserForTip = notice.getParser();
+ if (parserForTip instanceof HyperlinkListener) {
+ listener = (HyperlinkListener)parserForTip;
+ }
+ break;
+ }
+ }
+ }
+// } catch (BadLocationException ble) {
+// ble.printStackTrace(); // Should never happen.
+// }
+
+ URL imageBase = parserForTip==null ? null : parserForTip.getImageBase();
+ return new ToolTipInfo(tip, listener, imageBase);
+
+ }
+
+
+ /**
+ * Called when the document is modified.
+ *
+ * @param e The document event.
+ */
+ public void handleDocumentEvent(DocumentEvent e) {
+ if (running && parsers.size()>0) {
+ timer.restart();
+ }
+ }
+
+
+ /**
+ * Called when the user clicks a hyperlink in a {@link FocusableTip}.
+ *
+ * @param e The event.
+ */
+ public void hyperlinkUpdate(HyperlinkEvent e) {
+ if (parserForTip!=null && parserForTip.getHyperlinkListener()!=null) {
+ parserForTip.getHyperlinkListener().linkClicked(textArea, e);
+ }
+ }
+
+
+ /**
+ * Called when the document is modified.
+ *
+ * @param e The document event.
+ */
+ public void insertUpdate(DocumentEvent e) {
+
+ // Keep track of the first and last offset modified. Some parsers are
+ // smart and will only re-parse this section of the file.
+ try {
+ int offs = e.getOffset();
+ if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+ firstOffsetModded = e.getDocument().createPosition(offs);
+ }
+ offs = e.getOffset() + e.getLength();
+ if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+ lastOffsetModded = e.getDocument().createPosition(offs);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Shouldn't happen
+ }
+
+ handleDocumentEvent(e);
+
+ }
+
+
+ /**
+ * Removes a parser.
+ *
+ * @param parser The parser to remove.
+ * @return Whether the parser was found.
+ * @see #addParser(Parser)
+ * @see #getParser(int)
+ */
+ public boolean removeParser(Parser parser) {
+ removeParserNotices(parser);
+ boolean removed = parsers.remove(parser);
+ if (removed) {
+ textArea.fireParserNoticesChange();
+ }
+ return removed;
+ }
+
+
+ /**
+ * Removes all parser notices (and clears highlights in the editor) from
+ * a particular parser.
+ *
+ * @param parser The parser.
+ */
+ private void removeParserNotices(Parser parser) {
+ if (noticeHighlightPairs!=null) {
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+ NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+ if (pair.notice.getParser()==parser && pair.highlight!=null) {
+ h.removeParserHighlight(pair.highlight);
+ i.remove();
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Removes any currently stored notices (and the corresponding highlights
+ * from the editor) from the same Parser, and in the given line range,
+ * as in the results.
+ *
+ * @param res The results.
+ */
+ private void removeParserNotices(ParseResult res) {
+ if (noticeHighlightPairs!=null) {
+ RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter)
+ textArea.getHighlighter();
+ for (Iterator i=noticeHighlightPairs.iterator(); i.hasNext(); ) {
+ NoticeHighlightPair pair = (NoticeHighlightPair)i.next();
+ boolean removed = false;
+ if (shouldRemoveNotice(pair.notice, res)) {
+ if (pair.highlight!=null) {
+ h.removeParserHighlight(pair.highlight);
+ }
+ i.remove();
+ removed = true;
+ }
+ if (DEBUG_PARSING) {
+ String text = removed ? "[DEBUG]: ... notice removed: " :
+ "[DEBUG]: ... notice not removed: ";
+ System.out.println(text + pair.notice);
+ }
+ }
+
+ }
+
+ }
+
+
+ /**
+ * Called when the document is modified.
+ *
+ * @param e The document event.
+ */
+ public void removeUpdate(DocumentEvent e) {
+
+ // Keep track of the first and last offset modified. Some parsers are
+ // smart and will only re-parse this section of the file. Note that
+ // for removals, only the line at the removal start needs to be
+ // re-parsed.
+ try {
+ int offs = e.getOffset();
+ if (firstOffsetModded==null || offs<firstOffsetModded.getOffset()) {
+ firstOffsetModded = e.getDocument().createPosition(offs);
+ }
+ if (lastOffsetModded==null || offs>lastOffsetModded.getOffset()) {
+ lastOffsetModded = e.getDocument().createPosition(offs);
+ }
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+
+ handleDocumentEvent(e);
+
+ }
+
+
+ /**
+ * Restarts parsing the document.
+ *
+ * @see #stopParsing()
+ */
+ public void restartParsing() {
+ timer.restart();
+ running = true;
+ }
+
+
+ /**
+ * Sets the delay between the last "concurrent" edit and when the document
+ * is re-parsed.
+ *
+ * @param millis The new delay, in milliseconds. This must be greater
+ * than <code>0</code>.
+ * @see #getDelay()
+ */
+ public void setDelay(int millis) {
+ if (running) {
+ timer.stop();
+ }
+ timer.setDelay(millis);
+ if (running) {
+ timer.start();
+ }
+ }
+
+
+ /**
+ * Returns whether a parser notice should be removed, based on a parse
+ * result.
+ *
+ * @param notice The notice in question.
+ * @param res The result.
+ * @return Whether the notice should be removed.
+ */
+ private final boolean shouldRemoveNotice(ParserNotice notice,
+ ParseResult res) {
+
+ if (DEBUG_PARSING) {
+ System.out.println("[DEBUG]: ... ... shouldRemoveNotice " +
+ notice + ": " + (notice.getParser()==res.getParser()));
+ }
+
+ // NOTE: We must currently remove all notices for the parser. Parser
+ // implementors are required to parse the entire document each parsing
+ // request, as RSTA is not yet sophisticated enough to determine the
+ // minimum range of text to parse (and ParserNotices' locations aren't
+ // updated when the Document is mutated, which would be a requirement
+ // for this as well).
+ // return same_parser && (in_reparsed_range || in_deleted_end_of_doc)
+ return notice.getParser()==res.getParser();
+
+ }
+
+
+ /**
+ * Stops parsing the document.
+ *
+ * @see #restartParsing()
+ */
+ public void stopParsing() {
+ timer.stop();
+ running = false;
+ }
+
+
+ /**
+ * Mapping of a parser notice to its highlight in the editor.
+ */
+ private static class NoticeHighlightPair {
+
+ public ParserNotice notice;
+ public Object highlight;
+
+ public NoticeHighlightPair(ParserNotice notice, Object highlight) {
+ this.notice = notice;
+ this.highlight = highlight;
+ }
+
+ }
+
+
+ static {
+ boolean debugParsing = false;
+ try {
+ debugParsing = Boolean.getBoolean(PROPERTY_DEBUG_PARSING);
+ } catch (AccessControlException ace) {
+ // Likely an applet's security manager.
+ debugParsing = false; // FindBugs
+ }
+ DEBUG_PARSING = debugParsing;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java b/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java
new file mode 100644
index 0000000..47697b5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/PopupWindowDecorator.java
@@ -0,0 +1,68 @@
+/*
+ * 01/11/2011
+ *
+ * PopupWindowDecorator.java - Hook allowing hosting applications to decorate
+ * JWindows created by the AutoComplete library.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.JWindow;
+
+
+/**
+ * A hook allowing hosting applications to decorate JWindows created by the
+ * AutoComplete library. For example, you could use the
+ * <a href="http://jgoodies.com/">JGoodies</a> library to add drop shadows
+ * to the windows.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class PopupWindowDecorator {
+
+ /**
+ * The singleton instance of this class.
+ */
+ private static PopupWindowDecorator decorator;
+
+
+ /**
+ * Callback called whenever an appropriate JWindow is created by the
+ * AutoComplete library. Implementations can decorate the window however
+ * they see fit.
+ *
+ * @param window The newly-created window.
+ */
+ public abstract void decorate(JWindow window);
+
+
+ /**
+ * Returns the singleton instance of this class. This should only be
+ * called on the EDT.
+ *
+ * @return The singleton instance of this class, or <code>null</code>
+ * for none.
+ * @see #set(PopupWindowDecorator)
+ */
+ public static PopupWindowDecorator get() {
+ return decorator;
+ }
+
+
+ /**
+ * Sets the singleton instance of this class. This should only be called
+ * on the EDT.
+ *
+ * @param decorator The new instance of this class. This may be
+ * <code>null</code>.
+ * @see #get()
+ */
+ public static void set(PopupWindowDecorator decorator) {
+ PopupWindowDecorator.decorator = decorator;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSTAView.java b/src/org/fife/ui/rsyntaxtextarea/RSTAView.java
new file mode 100644
index 0000000..aeb9ed5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSTAView.java
@@ -0,0 +1,62 @@
+/*
+ * 02/10/2009
+ *
+ * RSTAView.java - An <code>RSyntaxTextArea</code> view.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Rectangle;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * Utility methods for RSyntaxTextArea's views.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+interface RSTAView {
+
+
+ /**
+ * Returns the y-coordinate of the specified line.<p>
+ *
+ * This method is quicker than using traditional
+ * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+ * computed.
+ *
+ * @param alloc The area the text area can render into.
+ * @param line The line number.
+ * @return The y-coordinate of the top of the line, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>line</code> isn't a valid line
+ * number for this document.
+ */
+ public int yForLine(Rectangle alloc, int line) throws BadLocationException;
+
+
+ /**
+ * Returns the y-coordinate of the line containing a specified offset.<p>
+ *
+ * This method is quicker than using traditional
+ * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+ * computed.
+ *
+ * @param alloc The area the text area can render into.
+ * @param offs The offset info the document.
+ * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>offs</code> isn't a valid offset
+ * into the document.
+ */
+ public int yForLineContaining(Rectangle alloc, int offs)
+ throws BadLocationException;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java
new file mode 100644
index 0000000..f8d9062
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxDocument.java
@@ -0,0 +1,589 @@
+/*
+ * 10/16/2004
+ *
+ * RSyntaxDocument.java - A document capable of syntax highlighting, used by
+ * RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.swing.Action;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.modes.AbstractMarkupTokenMaker;
+import org.fife.ui.rtextarea.RDocument;
+import org.fife.util.DynamicIntArray;
+
+
+/**
+ * The document used by {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}.
+ * This document is like <code>javax.swing.text.PlainDocument</code> except that
+ * it also keeps track of syntax highlighting in the document. It has a "style"
+ * attribute associated with it that determines how syntax highlighting is done
+ * (i.e., what language is being highlighted).<p>
+ *
+ * Instances of <code>RSyntaxTextArea</code> will only accept instances of
+ * <code>RSyntaxDocument</code>, since it is this document that keeps
+ * track of syntax highlighting. All others will cause an exception to be
+ * thrown.<p>
+ *
+ * To change the language being syntax highlighted at any time, you merely have
+ * to call {@link #setSyntaxStyle}. Other than that, this document can be
+ * treated like any other save one caveat: all <code>DocumentEvent</code>s of
+ * type <code>CHANGE</code> use their offset and length values to represent the
+ * first and last lines, respectively, that have had their syntax coloring
+ * change. This is really a hack to increase the speed of the painting code
+ * and should really be corrected, but oh well.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxDocument extends RDocument implements SyntaxConstants {
+
+ /**
+ * Creates a {@link TokenMaker} appropriate for a given programming
+ * language.
+ */
+ private transient TokenMakerFactory tokenMakerFactory;
+
+ /**
+ * Splits text into tokens for the current programming language.
+ */
+ private transient TokenMaker tokenMaker;
+
+ /**
+ * The current syntax style. Only cached to keep this class serializable.
+ */
+ private String syntaxStyle;
+
+ /**
+ * Array of values representing the "last token type" on each line. This
+ * is used in cases such as multi-line comments: if the previous line
+ * ended with an (unclosed) multi-line comment, we can use this knowledge
+ * and start the current line's syntax highlighting in multi-line comment
+ * state.
+ */
+ protected transient DynamicIntArray lastTokensOnLines;
+
+ private transient Segment s;
+
+
+ /**
+ * Constructs a plain text document. A default root element is created,
+ * and the tab size set to 5.
+ *
+ * @param syntaxStyle The syntax highlighting scheme to use.
+ */
+ public RSyntaxDocument(String syntaxStyle) {
+ this(null, syntaxStyle);
+ }
+
+
+ /**
+ * Constructs a plain text document. A default root element is created,
+ * and the tab size set to 5.
+ *
+ * @param tmf The <code>TokenMakerFactory</code> for this document. If
+ * this is <code>null</code>, a default factory is used.
+ * @param syntaxStyle The syntax highlighting scheme to use.
+ */
+ public RSyntaxDocument(TokenMakerFactory tmf, String syntaxStyle) {
+ putProperty(tabSizeAttribute, new Integer(5));
+ lastTokensOnLines = new DynamicIntArray(400);
+ lastTokensOnLines.add(Token.NULL); // Initial (empty) line.
+ s = new Segment();
+ setTokenMakerFactory(tmf);
+ setSyntaxStyle(syntaxStyle);
+ }
+
+
+ /**
+ * Alerts all listeners to this document of an insertion. This is
+ * overridden so we can update our syntax highlighting stuff.<p>
+ * The syntax highlighting stuff has to be here instead of in
+ * <code>insertUpdate</code> because <code>insertUpdate</code> is not
+ * called by the undo/redo actions, but this method is.
+ *
+ * @param e The change.
+ */
+ protected void fireInsertUpdate(DocumentEvent e) {
+
+ /*
+ * Now that the text is actually inserted into the content and
+ * element structure, we can update our token elements and "last
+ * tokens on lines" structure.
+ */
+
+ Element lineMap = getDefaultRootElement();
+ DocumentEvent.ElementChange change = e.getChange(lineMap);
+ Element[] added = change==null ? null : change.getChildrenAdded();
+
+ int numLines = lineMap.getElementCount();
+ int line = lineMap.getElementIndex(e.getOffset());
+ int previousLine = line - 1;
+ int previousTokenType = (previousLine>-1 ?
+ lastTokensOnLines.get(previousLine) : Token.NULL);
+
+ // If entire lines were added...
+ if (added!=null && added.length>0) {
+
+ Element[] removed = change.getChildrenRemoved();
+ int numRemoved = removed!=null ? removed.length : 0;
+
+ int endBefore = line + added.length - numRemoved;
+ //System.err.println("... adding lines: " + line + " - " + (endBefore-1));
+ //System.err.println("... ... added: " + added.length + ", removed:" + numRemoved);
+ for (int i=line; i<endBefore; i++) {
+
+ setSharedSegment(i); // Loads line i's text into s.
+
+ int tokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+ lastTokensOnLines.add(i, tokenType);
+ //System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+ previousTokenType = tokenType;
+
+ } // End of for (int i=line; i<endBefore; i++).
+
+ // Update last tokens for lines below until they stop changing.
+ updateLastTokensBelow(endBefore, numLines, previousTokenType);
+
+ } // End of if (added!=null && added.length>0).
+
+ // Otherwise, text was inserted on a single line...
+ else {
+
+ // Update last tokens for lines below until they stop changing.
+ updateLastTokensBelow(line, numLines, previousTokenType);
+
+ } // End of else.
+
+ // Let all listeners know about the insertion.
+ super.fireInsertUpdate(e);
+
+ }
+
+
+ /**
+ * This method is called AFTER the content has been inserted into the
+ * document and the element structure has been updated.<p>
+ * The syntax-highlighting updates need to be done here (as opposed to
+ * an override of <code>postRemoveUpdate</code>) as this method is called
+ * in response to undo/redo events, whereas <code>postRemoveUpdate</code>
+ * is not.<p>
+ * Now that the text is actually inserted into the content and element
+ * structure, we can update our token elements and "last tokens on
+ * lines" structure.
+ *
+ * @param chng The change that occurred.
+ * @see #removeUpdate
+ */
+ protected void fireRemoveUpdate(DocumentEvent chng) {
+
+ Element lineMap = getDefaultRootElement();
+ int numLines = lineMap.getElementCount();
+
+ DocumentEvent.ElementChange change = chng.getChange(lineMap);
+ Element[] removed = change==null ? null : change.getChildrenRemoved();
+
+ // If entire lines were removed...
+ if (removed!=null && removed.length>0) {
+
+ int line = change.getIndex(); // First line entirely removed.
+ int previousLine = line - 1; // Line before that.
+ int previousTokenType = (previousLine>-1 ?
+ lastTokensOnLines.get(previousLine) : Token.NULL);
+
+ Element[] added = change.getChildrenAdded();
+ int numAdded = added==null ? 0 : added.length;
+
+ // Remove the cached last-token values for the removed lines.
+ int endBefore = line + removed.length - numAdded;
+ //System.err.println("... removing lines: " + line + " - " + (endBefore-1));
+ //System.err.println("... added: " + numAdded + ", removed: " + removed.length);
+
+ lastTokensOnLines.removeRange(line, endBefore); // Removing values for lines [line-(endBefore-1)].
+ //System.err.println("--------- lastTokensOnLines.size() == " + lastTokensOnLines.getSize());
+
+ // Update last tokens for lines below until they've stopped changing.
+ updateLastTokensBelow(line, numLines, previousTokenType);
+
+ } // End of if (removed!=null && removed.size()>0).
+
+ // Otherwise, text was removed from just one line...
+ else {
+
+ int line = lineMap.getElementIndex(chng.getOffset());
+ if (line>=lastTokensOnLines.getSize())
+ return; // If we're editing the last line in a document...
+
+ int previousLine = line - 1;
+ int previousTokenType = (previousLine>-1 ?
+ lastTokensOnLines.get(previousLine) : Token.NULL);
+ //System.err.println("previousTokenType for line : " + previousLine + " is " + previousTokenType);
+ // Update last tokens for lines below until they've stopped changing.
+ updateLastTokensBelow(line, numLines, previousTokenType);
+
+ }
+
+ // Let all of our listeners know about the removal.
+ super.fireRemoveUpdate(chng);
+
+ }
+
+
+ /**
+ * Returns the closest {@link TokenTypes "standard" token type} for a given
+ * "internal" token type (e.g. one whose value is <code>< 0</code>).
+ *
+ * @param type The token type.
+ * @return The closest "standard" token type. If a mapping is not defined
+ * for this language, then <code>type</code> is returned.
+ */
+ public int getClosestStandardTokenTypeForInternalType(int type) {
+ return tokenMaker.getClosestStandardTokenTypeForInternalType(type);
+ }
+
+
+ /**
+ * Returns whether closing markup tags should be automatically completed.
+ * This method only returns <code>true</code> if
+ * {@link #getLanguageIsMarkup()} also returns <code>true</code>.
+ *
+ * @return Whether markup closing tags should be automatically completed.
+ * @see #getLanguageIsMarkup()
+ */
+ public boolean getCompleteMarkupCloseTags() {
+ // TODO: Remove terrible dependency on AbstractMarkupTokenMaker
+ return getLanguageIsMarkup() &&
+ ((AbstractMarkupTokenMaker)tokenMaker).getCompleteCloseTags();
+ }
+
+
+ /**
+ * Returns whether the current programming language uses curly braces
+ * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+ *
+ * @return Whether curly braces denote code blocks.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return tokenMaker.getCurlyBracesDenoteCodeBlocks();
+ }
+
+
+ /**
+ * Returns whether the current language is a markup language, such as
+ * HTML, XML or PHP.
+ *
+ * @return Whether the current language is a markup language.
+ */
+ public boolean getLanguageIsMarkup() {
+ return tokenMaker.isMarkupLanguage();
+ }
+
+
+ /**
+ * Returns the token type of the last token on the given line.
+ *
+ * @param line The line to inspect.
+ * @return The token type of the last token on the specified line. If
+ * the line is invalid, an exception is thrown.
+ */
+ public int getLastTokenTypeOnLine(int line) {
+ return lastTokensOnLines.get(line);
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in the current programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out. A <code>null</code> value for either means there
+ * is no string to add for that part. A value of
+ * <code>null</code> for the array means this language
+ * does not support commenting/uncommenting lines.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return tokenMaker.getLineCommentStartAndEnd();
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ boolean getMarkOccurrencesOfTokenType(int type) {
+ return tokenMaker.getMarkOccurrencesOfTokenType(type);
+ }
+
+
+ /**
+ * Returns the occurrence marker for the current language.
+ *
+ * @return The occurrence marker.
+ */
+ OccurrenceMarker getOccurrenceMarker() {
+ return tokenMaker.getOccurrenceMarker();
+ }
+
+
+ /**
+ * This method returns whether auto indentation should be done if Enter
+ * is pressed at the end of the specified line.
+ *
+ * @param line The line to check.
+ * @return Whether an extra indentation should be done.
+ */
+ public boolean getShouldIndentNextLine(int line) {
+ Token t = getTokenListForLine(line);
+ t = t.getLastNonCommentNonWhitespaceToken();
+ return tokenMaker.getShouldIndentNextLineAfter(t);
+ }
+
+
+ /**
+ * Returns a token list for the specified segment of text representing
+ * the specified line number. This method is basically a wrapper for
+ * <code>tokenMaker.getTokenList</code> that takes into account the last
+ * token on the previous line to assure token accuracy.
+ *
+ * @param line The line number of <code>text</code> in the document, >= 0.
+ * @return A token list representing the specified line.
+ */
+ public final Token getTokenListForLine(int line) {
+ Element map = getDefaultRootElement();
+ Element elem = map.getElement(line);
+ int startOffset = elem.getStartOffset();
+ //int endOffset = (line==map.getElementCount()-1 ? elem.getEndOffset() - 1:
+ // elem.getEndOffset() - 1);
+ int endOffset = elem.getEndOffset() - 1; // Why always "-1"?
+ try {
+ getText(startOffset,endOffset-startOffset, s);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ return null;
+ }
+ int initialTokenType = line==0 ? Token.NULL :
+ getLastTokenTypeOnLine(line-1);
+ return tokenMaker.getTokenList(s, initialTokenType, startOffset);
+ }
+
+
+ boolean insertBreakSpecialHandling(ActionEvent e) {
+ Action a = tokenMaker.getInsertBreakAction();
+ if (a!=null) {
+ a.actionPerformed(e);
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Deserializes a document.
+ *
+ * @param in The stream to read from.
+ * @throws ClassNotFoundException
+ * @throws IOException
+ */
+ private void readObject(ObjectInputStream in)
+ throws ClassNotFoundException, IOException {
+
+ in.defaultReadObject();
+
+ // Install default TokenMakerFactory. To support custom TokenMakers,
+ // both JVM's should install default TokenMakerFactories that support
+ // the language they want to use beforehand.
+ setTokenMakerFactory(null);
+
+ // Handle other transient stuff
+ this.s = new Segment();
+ int lineCount = getDefaultRootElement().getElementCount();
+ lastTokensOnLines = new DynamicIntArray(lineCount);
+ setSyntaxStyle(syntaxStyle); // Actually install (transient) TokenMaker
+
+ }
+
+
+ /**
+ * Makes our private <code>Segment s</code> point to the text in our
+ * document referenced by the specified element. Note that
+ * <code>line</code> MUST be a valid line number in the document.
+ *
+ * @param line The line number you want to get.
+ */
+ private final void setSharedSegment(int line) {
+
+ Element map = getDefaultRootElement();
+ //int numLines = map.getElementCount();
+
+ Element element = map.getElement(line);
+ if (element==null)
+ throw new InternalError("Invalid line number: " + line);
+ int startOffset = element.getStartOffset();
+ //int endOffset = (line==numLines-1 ?
+ // element.getEndOffset()-1 : element.getEndOffset() - 1);
+ int endOffset = element.getEndOffset()-1; // Why always "-1"?
+ try {
+ getText(startOffset, endOffset-startOffset, s);
+ } catch (BadLocationException ble) {
+ throw new InternalError("Text range not in document: " +
+ startOffset + "-" + endOffset);
+ }
+
+ }
+
+
+ /**
+ * Sets the syntax style being used for syntax highlighting in this
+ * document. What styles are supported by a document is determined by its
+ * {@link TokenMakerFactory}. By default, all <code>RSyntaxDocument</code>s
+ * support all languages built into <code>RSyntaxTextArea</code>.
+ *
+ * @param styleKey The new style to use, such as
+ * {@link SyntaxConstants#SYNTAX_STYLE_JAVA}. If this style is not
+ * known or supported by this document, then
+ * {@link SyntaxConstants#SYNTAX_STYLE_NONE} is used.
+ * @see #setSyntaxStyle(TokenMaker)
+ */
+ public void setSyntaxStyle(String styleKey) {
+ tokenMaker = tokenMakerFactory.getTokenMaker(styleKey);
+ updateSyntaxHighlightingInformation();
+ this.syntaxStyle = styleKey;
+ }
+
+
+ /**
+ * Sets the syntax style being used for syntax highlighting in this
+ * document. You should call this method if you've created a custom token
+ * maker for a language not normally supported by
+ * <code>RSyntaxTextArea</code>.
+ *
+ * @param tokenMaker The new token maker to use.
+ * @see #setSyntaxStyle(String)
+ */
+ public void setSyntaxStyle(TokenMaker tokenMaker) {
+ this.tokenMaker = tokenMaker;
+ updateSyntaxHighlightingInformation();
+ }
+
+
+ /**
+ * Sets the token maker factory used by this document.
+ *
+ * @param tmf The <code>TokenMakerFactory</code> for this document. If
+ * this is <code>null</code>, a default factory is used.
+ */
+ public void setTokenMakerFactory(TokenMakerFactory tmf) {
+ tokenMakerFactory = tmf!=null ? tmf :
+ TokenMakerFactory.getDefaultInstance();
+ }
+
+
+ /**
+ * Loops through the last-tokens-on-lines array from a specified point
+ * onward, updating last-token values until they stop changing. This
+ * should be called when lines are updated/inserted/removed, as doing
+ * so may cause lines below to change color.
+ *
+ * @param line The first line to check for a change in last-token value.
+ * @param numLines The number of lines in the document.
+ * @param previousTokenType The last-token value of the line just before
+ * <code>line</code>.
+ * @return The last line that needs repainting.
+ */
+ private int updateLastTokensBelow(int line, int numLines, int previousTokenType) {
+
+ int firstLine = line;
+
+ // Loop through all lines past our starting point. Update even the last
+ // line's info, even though there aren't any lines after it that depend
+ // on it changing for them to be changed, as its state may be used
+ // elsewhere in the library.
+ int end = numLines;
+ //System.err.println("--- end==" + end + " (numLines==" + numLines + ")");
+ while (line<end) {
+
+ setSharedSegment(line); // Sets s's text to that of line 'line' in the document.
+
+ int oldTokenType = lastTokensOnLines.get(line);
+ int newTokenType = tokenMaker.getLastTokenTypeOnLine(s, previousTokenType);
+ //System.err.println("---------------- line " + line + "; oldTokenType==" + oldTokenType + ", newTokenType==" + newTokenType + ", s=='" + s + "'");
+
+ // If this line's end-token value didn't change, stop here. Note
+ // that we're saying this line needs repainting; this is because
+ // the beginning of this line did indeed change color, but the
+ // end didn't.
+ if (oldTokenType==newTokenType) {
+ //System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+ fireChangedUpdate(new DefaultDocumentEvent(firstLine, line, DocumentEvent.EventType.CHANGE));
+ return line;
+ }
+
+ // If the line's end-token value did change, update it and
+ // keep going.
+ // NOTE: "setUnsafe" is okay here as the bounds checking was
+ // already done in lastTokensOnLines.get(line) above.
+ lastTokensOnLines.setUnsafe(line, newTokenType);
+ previousTokenType = newTokenType;
+ line++;
+
+ } // End of while (line<numLines).
+
+ // If any lines had their token types changed, fire a changed update
+ // for them. The view will repaint the area covered by the lines.
+ // FIXME: We currently cheat and send the line range that needs to be
+ // repainted as the "offset and length" of the change, since this is
+ // what the view needs. We really should send the actual offset and
+ // length.
+ if (line>firstLine) {
+ //System.err.println("... ... ... repainting lines " + firstLine + "-" + line);
+ fireChangedUpdate(new DefaultDocumentEvent(firstLine, line,
+ DocumentEvent.EventType.CHANGE));
+ }
+
+ return line;
+
+ }
+
+
+ /**
+ * Updates internal state information; e.g. the "last tokens on lines"
+ * data. After this, a changed update is fired to let listeners know that
+ * the document's structure has changed.<p>
+ *
+ * This is called internally whenever the syntax style changes.
+ */
+ protected void updateSyntaxHighlightingInformation() {
+
+ // Reinitialize the "last token on each line" array. Note that since
+ // the actual text in the document isn't changing, the number of lines
+ // is the same.
+ Element map = getDefaultRootElement();
+ int numLines = map.getElementCount();
+ int lastTokenType = Token.NULL;
+ for (int i=0; i<numLines; i++) {
+ setSharedSegment(i);
+ lastTokenType = tokenMaker.getLastTokenTypeOnLine(s, lastTokenType);
+ lastTokensOnLines.set(i, lastTokenType);
+ }
+
+ // Let everybody know that syntax styles have (probably) changed.
+ fireChangedUpdate(new DefaultDocumentEvent(
+ 0, numLines-1, DocumentEvent.EventType.CHANGE));
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java
new file mode 100644
index 0000000..3b6383a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextArea.java
@@ -0,0 +1,3018 @@
+/*
+ * 01/27/2004
+ *
+ * RSyntaxTextArea.java - An extension of RTextArea that adds
+ * the ability to syntax highlight certain programming languages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.font.FontRenderContext;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import javax.swing.Timer;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.EventListenerList;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ToolTipInfo;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+import org.fife.ui.rtextarea.RTextScrollPane;
+import org.fife.ui.rtextarea.RecordableTextAction;
+
+
+
+/**
+ * An extension of <code>RTextArea</code> that adds syntax highlighting
+ * of certain programming languages to its list of features. Languages
+ * currently supported include:
+ *
+ * <table>
+ * <tr>
+ * <td style="vertical-align: top">
+ * <ul>
+ * <li>ActionScript
+ * <li>Assembler (X86)
+ * <li>BBCode
+ * <li>C
+ * <li>C++
+ * <li>CSS
+ * <li>C#
+ * <li>Clojure
+ * <li>Delphi
+ * <li>DTD
+ * <li>Fortran
+ * <li>Groovy
+ * <li>HTML
+ * <li>Java
+ * <li>JavaScript
+ * <li>JSP
+ * </ul>
+ * </td>
+ * <td style="vertical-align: top">
+ * <ul>
+ * <li>LaTeX
+ * <li>Lisp
+ * <li>Lua
+ * <li>Make
+ * <li>MXML
+ * <li>NSIS
+ * <li>Perl
+ * <li>PHP
+ * <li>Ruby
+ * <li>SAS
+ * <li>Scala
+ * <li>SQL
+ * <li>Tcl
+ * <li>UNIX shell scripts
+ * <li>Windows batch
+ * <li>XML files
+ * </ul>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Other added features include:
+ * <ul style="columns: 2 12em; column-gap: 1em">
+ * <li>Code folding
+ * <li>Bracket matching
+ * <li>Auto-indentation
+ * <li>Copy as RTF
+ * <li>Clickable hyperlinks (if the language scanner being used supports it)
+ * <li>A pluggable "parser" system that can be used to implement syntax
+ * validation, spell checking, etc.
+ * </ul>
+ *
+ * It is recommended that you use an instance of
+ * {@link org.fife.ui.rtextarea.RTextScrollPane} instead of a regular
+ * <code>JScrollPane</code> as this class allows you to add line numbers and
+ * bookmarks easily to your text area.
+ *
+ * @author Robert Futrell
+ * @version 2.0.7
+ * @see TextEditorPane
+ */
+public class RSyntaxTextArea extends RTextArea implements SyntaxConstants {
+
+ public static final String ANIMATE_BRACKET_MATCHING_PROPERTY = "RSTA.animateBracketMatching";
+ public static final String ANTIALIAS_PROPERTY = "RSTA.antiAlias";
+ public static final String AUTO_INDENT_PROPERTY = "RSTA.autoIndent";
+ public static final String BRACKET_MATCHING_PROPERTY = "RSTA.bracketMatching";
+ public static final String CLEAR_WHITESPACE_LINES_PROPERTY = "RSTA.clearWhitespaceLines";
+ public static final String CLOSE_CURLY_BRACES_PROPERTY = "RSTA.closeCurlyBraces";
+ public static final String CLOSE_MARKUP_TAGS_PROPERTY = "RSTA.closeMarkupTags";
+ public static final String CODE_FOLDING_PROPERTY = "RSTA.codeFolding";
+ public static final String EOL_VISIBLE_PROPERTY = "RSTA.eolMarkersVisible";
+ public static final String FOCUSABLE_TIPS_PROPERTY = "RSTA.focusableTips";
+ public static final String FRACTIONAL_FONTMETRICS_PROPERTY = "RSTA.fractionalFontMetrics";
+ public static final String HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY = "RSTA.highlightSecondaryLanguages";
+ public static final String HYPERLINKS_ENABLED_PROPERTY = "RSTA.hyperlinksEnabled";
+ public static final String MARK_OCCURRENCES_PROPERTY = "RSTA.markOccurrences";
+ public static final String MARKED_OCCURRENCES_CHANGED_PROPERTY = "RSTA.markedOccurrencesChanged";
+ public static final String PAINT_MATCHED_BRACKET_PAIR_PROPERTY = "RSTA.paintMatchedBracketPair";
+ public static final String PARSER_NOTICES_PROPERTY = "RSTA.parserNotices";
+ public static final String SYNTAX_SCHEME_PROPERTY = "RSTA.syntaxScheme";
+ public static final String SYNTAX_STYLE_PROPERTY = "RSTA.syntaxStyle";
+ public static final String TAB_LINE_COLOR_PROPERTY = "RSTA.tabLineColor";
+ public static final String TAB_LINES_PROPERTY = "RSTA.tabLines";
+ public static final String USE_SELECTED_TEXT_COLOR_PROPERTY = "RSTA.useSelectedTextColor";
+ public static final String VISIBLE_WHITESPACE_PROPERTY = "RSTA.visibleWhitespace";
+
+ private static final Color DEFAULT_BRACKET_MATCH_BG_COLOR = new Color(234,234,255);
+ private static final Color DEFAULT_BRACKET_MATCH_BORDER_COLOR = new Color(0,0,128);
+ private static final Color DEFAULT_SELECTION_COLOR = new Color(200,200,255);
+
+ private static final String MSG = "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+
+ private JMenu foldingMenu;
+ private static RecordableTextAction toggleCurrentFoldAction;
+ private static RecordableTextAction collapseAllCommentFoldsAction;
+ private static RecordableTextAction collapseAllFoldsAction;
+ private static RecordableTextAction expandAllFoldsAction;
+
+ /** The key for the syntax style to be highlighting. */
+ private String syntaxStyleKey;
+
+ /** The colors used for syntax highlighting. */
+ private SyntaxScheme syntaxScheme;
+
+ /** Handles code templates. */
+ private static CodeTemplateManager codeTemplateManager;
+
+ /** Whether or not templates are enabled. */
+ private static boolean templatesEnabled;
+
+ /**
+ * The rectangle surrounding the "matched bracket" if bracket matching
+ * is enabled.
+ */
+ private Rectangle match;
+
+ /**
+ * The rectangle surrounding the current offset if both bracket matching and
+ * "match both brackets" are enabled.
+ */
+ private Rectangle dotRect;
+
+ /**
+ * Used to store the location of the bracket at the caret position (either
+ * just before or just after it) and the location of its match.
+ */
+ private Point bracketInfo;
+
+ /**
+ * Colors used for the "matched bracket" if bracket matching is enabled.
+ */
+ private Color matchedBracketBGColor;
+ private Color matchedBracketBorderColor;
+
+ /** The location of the last matched bracket. */
+ private int lastBracketMatchPos;
+
+ /** Whether or not bracket matching is enabled. */
+ private boolean bracketMatchingEnabled;
+
+ /** Whether or not bracket matching is animated. */
+ private boolean animateBracketMatching;
+
+ /** Whether <b>both</b> brackets are highlighted when bracket matching. */
+ private boolean paintMatchedBracketPair;
+
+ private BracketMatchingTimer bracketRepaintTimer;
+
+ /**
+ * Whether or not auto-indent is on.
+ */
+ private boolean autoIndentEnabled;
+
+ /**
+ * Whether curly braces should be closed on Enter key presses, (if the
+ * current language supports it).
+ */
+ private boolean closeCurlyBraces;
+
+ /**
+ * Whether closing markup tags should be automatically completed when
+ * "<code></</code>" is typed (if the current language is a markup
+ * language).
+ */
+ private boolean closeMarkupTags;
+
+ /**
+ * Whether or not lines with nothing but whitespace are "made empty."
+ */
+ private boolean clearWhitespaceLines;
+
+ /** Whether we are displaying visible whitespace (spaces and tabs). */
+ private boolean whitespaceVisible;
+
+ /** Whether EOL markers should be visible at the end of each line. */
+ private boolean eolMarkersVisible;
+
+ /** Whether tab lines are enabled. */
+ private boolean paintTabLines;
+
+ /** The color to use when painting tab lines. */
+ private Color tabLineColor;
+
+ /**
+ * Whether hyperlinks are enabled (must be supported by the syntax
+ * scheme being used).
+ */
+ private boolean hyperlinksEnabled;
+
+ /** The color to use when painting hyperlinks. */
+ private Color hyperlinkFG;
+
+ /**
+ * Mask used to determine if the correct key is being held down to scan
+ * for hyperlinks (ctrl, meta, etc.).
+ */
+ private int linkScanningMask;
+
+ /** Whether secondary languages have their backgrounds colored. */
+ private boolean highlightSecondaryLanguages;
+
+ /** Whether the "selected text" color should be used with selected text. */
+ private boolean useSelectedTextColor;
+
+ /** Used during "Copy as RTF" operations. */
+ private RtfGenerator rtfGenerator;
+
+ /** Handles "mark occurrences" support. */
+ private MarkOccurrencesSupport markOccurrencesSupport;
+
+ /** The color used to render "marked occurrences." */
+ private Color markOccurrencesColor;
+
+ /** Whether a border should be painted around marked occurrences. */
+ private boolean paintMarkOccurrencesBorder;
+
+ /** Metrics of the text area's font. */
+ private FontMetrics defaultFontMetrics;
+
+ /** Manages running the parser. */
+ private ParserManager parserManager;
+
+ /**
+ * Whether the editor is currently scanning for hyperlinks on mouse
+ * movement.
+ */
+ private boolean isScanningForLinks;
+
+ private int hoveredOverLinkOffset;
+
+ private LinkGenerator linkGenerator;
+ private LinkGeneratorResult linkGeneratorResult;
+
+ private FoldManager foldManager;
+
+ /** Whether "focusable" tool tips are used instead of standard ones. */
+ private boolean useFocusableTips;
+
+ /** The last focusable tip displayed. */
+ private FocusableTip focusableTip;
+
+ /** Cached desktop anti-aliasing hints, if anti-aliasing is enabled. */
+ private Map aaHints;
+
+ /** Renders tokens. */
+ private TokenPainter tokenPainter;
+
+private int lineHeight; // Height of a line of text; same for default, bold & italic.
+private int maxAscent;
+private boolean fractionalFontMetricsEnabled;
+
+ private Color[] secondaryLanguageBackgrounds;
+
+
+ /**
+ * Constructor.
+ */
+ public RSyntaxTextArea() {
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ */
+ public RSyntaxTextArea(RSyntaxDocument doc) {
+ super(doc);
+ init();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ */
+ public RSyntaxTextArea(String text) {
+ super(text);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RSyntaxTextArea(int rows, int cols) {
+ super(rows, cols);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RSyntaxTextArea(String text, int rows, int cols) {
+ super(text, rows, cols);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RSyntaxTextArea(RSyntaxDocument doc, String text,int rows,int cols) {
+ super(doc, text, rows, cols);
+ init();
+ }
+
+
+ /**
+ * Creates a new <code>RSyntaxTextArea</code>.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ */
+ public RSyntaxTextArea(int textMode) {
+ super(textMode);
+ init();
+ }
+
+
+ /**
+ * Adds an "active line range" listener to this text area.
+ *
+ * @param l The listener to add.
+ * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+ */
+ public void addActiveLineRangeListener(ActiveLineRangeListener l) {
+ listenerList.add(ActiveLineRangeListener.class, l);
+ }
+
+
+ /**
+ * Adds a hyperlink listener to this text area.
+ *
+ * @param l The listener to add.
+ * @see #removeHyperlinkListener(HyperlinkListener)
+ */
+ public void addHyperlinkListener(HyperlinkListener l) {
+ listenerList.add(HyperlinkListener.class, l);
+ }
+
+
+ /**
+ * Updates the font metrics the first time we're displayed.
+ */
+ public void addNotify() {
+
+ super.addNotify();
+
+ // We know we've just been connected to a screen resource (by
+ // definition), so initialize our font metrics objects.
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+
+ // Re-start parsing if we were removed from one container and added
+ // to another
+ if (parserManager!=null) {
+ parserManager.restartParsing();
+ }
+
+ }
+
+
+ /**
+ * Adds the parser to "validate" the source code in this text area. This
+ * can be anything from a spell checker to a "compiler" that verifies
+ * source code.
+ *
+ * @param parser The new parser. A value of <code>null</code> will
+ * do nothing.
+ * @see #getParser(int)
+ * @see #getParserCount()
+ * @see #removeParser(Parser)
+ */
+ public void addParser(Parser parser) {
+ if (parserManager==null) {
+ parserManager = new ParserManager(this);
+ }
+ parserManager.addParser(parser);
+ }
+
+
+ /**
+ * Appends a submenu with code folding options to this text component's
+ * popup menu.
+ *
+ * @param popup The popup menu to append to.
+ * @see #createPopupMenu()
+ */
+ protected void appendFoldingMenu(JPopupMenu popup) {
+ popup.addSeparator();
+ ResourceBundle bundle = ResourceBundle.getBundle(MSG);
+ foldingMenu = new JMenu(bundle.getString("ContextMenu.Folding"));
+ foldingMenu.add(createPopupMenuItem(toggleCurrentFoldAction));
+ foldingMenu.add(createPopupMenuItem(collapseAllCommentFoldsAction));
+ foldingMenu.add(createPopupMenuItem(collapseAllFoldsAction));
+ foldingMenu.add(createPopupMenuItem(expandAllFoldsAction));
+ popup.add(foldingMenu);
+
+ }
+
+
+ /**
+ * Recalculates the height of a line in this text area and the
+ * maximum ascent of all fonts displayed.
+ */
+ private void calculateLineHeight() {
+
+ lineHeight = maxAscent = 0;
+
+ // Each token style.
+ for (int i=0; i<syntaxScheme.getStyleCount(); i++) {
+ Style ss = syntaxScheme.getStyle(i);
+ if (ss!=null && ss.font!=null) {
+ FontMetrics fm = getFontMetrics(ss.font);
+ int height = fm.getHeight();
+ if (height>lineHeight)
+ lineHeight = height;
+ int ascent = fm.getMaxAscent();
+ if (ascent>maxAscent)
+ maxAscent = ascent;
+ }
+ }
+
+ // The text area's (default) font).
+ Font temp = getFont();
+ FontMetrics fm = getFontMetrics(temp);
+ int height = fm.getHeight();
+ if (height>lineHeight) {
+ lineHeight = height;
+ }
+ int ascent = fm.getMaxAscent();
+ if (ascent>maxAscent) {
+ maxAscent = ascent;
+ }
+
+ }
+
+
+ /**
+ * Removes all parsers from this text area.
+ *
+ * @see #removeParser(Parser)
+ */
+ public void clearParsers() {
+ if (parserManager!=null) {
+ parserManager.clearParsers();
+ }
+ }
+
+
+ /**
+ * Clones a token list. This is necessary as tokens are reused in
+ * {@link RSyntaxDocument}, so we can't simply use the ones we
+ * are handed from it.
+ *
+ * @param t The token list to clone.
+ * @return The clone of the token list.
+ */
+ private Token cloneTokenList(Token t) {
+
+ if (t==null) {
+ return null;
+ }
+
+ Token clone = new Token();
+ clone.copyFrom(t);
+ Token cloneEnd = clone;
+
+ while ((t=t.getNextToken())!=null) {
+ Token temp = new Token();
+ temp.copyFrom(t);
+ cloneEnd.setNextToken(temp);
+ cloneEnd = temp;
+ }
+
+ return clone;
+
+ }
+
+
+ /**
+ * Overridden to toggle the enabled state of various
+ * RSyntaxTextArea-specific menu items.
+ *
+ * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+ * will want to override this method, especially if you removed any of the
+ * menu items in the default popup menu.
+ *
+ * @param popupMenu The popup menu. This will never be <code>null</code>.
+ * @see #createPopupMenu()
+ * @see #setPopupMenu(JPopupMenu)
+ */
+ protected void configurePopupMenu(JPopupMenu popupMenu) {
+
+ super.configurePopupMenu(popupMenu);
+
+ // They may have overridden createPopupMenu()...
+ if (popupMenu!=null && popupMenu.getComponentCount()>0 &&
+ foldingMenu!=null) {
+ foldingMenu.setEnabled(foldManager.
+ isCodeFoldingSupportedAndEnabled());
+ }
+ }
+
+
+ /**
+ * Copies the currently selected text to the system clipboard, with
+ * any necessary style information (font, foreground color and background
+ * color). Does nothing for <code>null</code> selections.
+ */
+ public void copyAsRtf() {
+
+ int selStart = getSelectionStart();
+ int selEnd = getSelectionEnd();
+ if (selStart==selEnd) {
+ return;
+ }
+
+ // Make sure there is a system clipboard, and that we can write
+ // to it.
+ SecurityManager sm = System.getSecurityManager();
+ if (sm!=null) {
+ try {
+ sm.checkSystemClipboardAccess();
+ } catch (SecurityException se) {
+ UIManager.getLookAndFeel().provideErrorFeedback(null);
+ return;
+ }
+ }
+ Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+ // Create the RTF selection.
+ RtfGenerator gen = getRTFGenerator();
+ Token tokenList = getTokenListFor(selStart, selEnd);
+ for (Token t=tokenList; t!=null; t=t.getNextToken()) {
+ if (t.isPaintable()) {
+ if (t.textCount==1 && t.text[t.textOffset]=='\n') {
+ gen.appendNewline();
+ }
+ else {
+ Font font = getFontForTokenType(t.type);
+ Color bg = getBackgroundForToken(t);
+ boolean underline = getUnderlineForToken(t);
+ // Small optimization - don't print fg color if this
+ // is a whitespace color. Saves on RTF size.
+ if (t.isWhitespace()) {
+ gen.appendToDocNoFG(t.getLexeme(), font, bg, underline);
+ }
+ else {
+ Color fg = getForegroundForToken(t);
+ gen.appendToDoc(t.getLexeme(), font, fg, bg, underline);
+ }
+ }
+ }
+ }
+
+ // Set the system clipboard contents to the RTF selection.
+ RtfTransferable contents = new RtfTransferable(gen.getRtf().getBytes());
+ //System.out.println("*** " + new String(gen.getRtf().getBytes()));
+ try {
+ cb.setContents(contents, null);
+ } catch (IllegalStateException ise) {
+ UIManager.getLookAndFeel().provideErrorFeedback(null);
+ return;
+ }
+
+ }
+
+
+ /**
+ * Returns the document to use for an <code>RSyntaxTextArea</code>
+ *
+ * @return The document.
+ */
+ protected Document createDefaultModel() {
+ return new RSyntaxDocument(SYNTAX_STYLE_NONE);
+ }
+
+
+ /**
+ * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+ *
+ * @return The caret event/mouse listener.
+ */
+ protected RTAMouseListener createMouseListener() {
+ return new RSyntaxTextAreaMutableCaretEvent(this);
+ }
+
+
+ /**
+ * Overridden to add menu items related to cold folding.
+ *
+ * @return The popup menu.
+ * @see #appendFoldingMenu(JPopupMenu)
+ */
+ protected JPopupMenu createPopupMenu() {
+ JPopupMenu popup = super.createPopupMenu();
+ appendFoldingMenu(popup);
+ return popup;
+ }
+
+
+ /**
+ * See createPopupMenuActions() in RTextArea.
+ * TODO: Remove these horrible hacks and move localizing of actions into
+ * the editor kits, where it should be! The context menu should contain
+ * actions from the editor kits.
+ */
+ private static void createRstaPopupMenuActions() {
+
+ ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+ toggleCurrentFoldAction = new RSyntaxTextAreaEditorKit.
+ ToggleCurrentFoldAction();
+ toggleCurrentFoldAction.setProperties(msg, "Action.ToggleCurrentFold");
+
+ collapseAllCommentFoldsAction = new RSyntaxTextAreaEditorKit.
+ CollapseAllCommentFoldsAction();
+ collapseAllCommentFoldsAction.setProperties(msg, "Action.CollapseCommentFolds");
+
+ collapseAllFoldsAction = new RSyntaxTextAreaEditorKit.CollapseAllFoldsAction(true);
+ expandAllFoldsAction = new RSyntaxTextAreaEditorKit.ExpandAllFoldsAction(true);
+
+ }
+
+
+ /**
+ * Returns the a real UI to install on this text area.
+ *
+ * @return The UI.
+ */
+ protected RTextAreaUI createRTextAreaUI() {
+ return new RSyntaxTextAreaUI(this);
+ }
+
+
+ /**
+ * If the caret is on a bracket, this method finds the matching bracket,
+ * and if it exists, highlights it.
+ */
+ protected final void doBracketMatching() {
+
+ // We always need to repaint the "matched bracket" highlight if it
+ // exists.
+ if (match!=null) {
+ repaint(match);
+ if (dotRect!=null) {
+ repaint(dotRect);
+ }
+ }
+
+ // If a matching bracket is found, get its bounds and paint it!
+ int lastCaretBracketPos = bracketInfo==null ? -1 : bracketInfo.x;
+ bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(this,
+ bracketInfo);
+ if (bracketInfo.y>-1 &&
+ (bracketInfo.y!=lastBracketMatchPos ||
+ bracketInfo.x!=lastCaretBracketPos)) {
+ try {
+ match = modelToView(bracketInfo.y);
+ if (match!=null) { // Happens if we're not yet visible
+ if (getPaintMatchedBracketPair()) {
+ dotRect = modelToView(bracketInfo.x);
+ }
+ else {
+ dotRect = null;
+ }
+ if (getAnimateBracketMatching()) {
+ bracketRepaintTimer.restart();
+ }
+ repaint(match);
+ if (dotRect!=null) {
+ repaint(dotRect);
+ }
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Shouldn't happen.
+ }
+ }
+ else if (bracketInfo.y==-1) {
+ // Set match to null so the old value isn't still repainted.
+ match = null;
+ dotRect = null;
+ bracketRepaintTimer.stop();
+ }
+ lastBracketMatchPos = bracketInfo.y;
+
+ }
+
+
+ /**
+ * Notifies all listeners that a caret change has occurred.
+ *
+ * @param e The caret event.
+ */
+ protected void fireCaretUpdate(CaretEvent e) {
+ super.fireCaretUpdate(e);
+ if (isBracketMatchingEnabled()) {
+ doBracketMatching();
+ }
+ }
+
+
+ /**
+ * Notifies all listeners that the active line range has changed.
+ *
+ * @param min The minimum "active" line, or <code>-1</code>.
+ * @param max The maximum "active" line, or <code>-1</code>.
+ */
+ private void fireActiveLineRangeEvent(int min, int max) {
+ ActiveLineRangeEvent e = null; // Lazily created
+ // Guaranteed to return a non-null array
+ Object[] listeners = listenerList.getListenerList();
+ // Process the listeners last to first, notifying
+ // those that are interested in this event
+ for (int i = listeners.length-2; i>=0; i-=2) {
+ if (listeners[i]==ActiveLineRangeListener.class) {
+ if (e==null) {
+ e = new ActiveLineRangeEvent(this, min, max);
+ }
+ ((ActiveLineRangeListener)listeners[i+1]).activeLineRangeChanged(e);
+ }
+ }
+ }
+
+
+ /**
+ * Notifies all listeners that have registered interest for notification
+ * on this event type. The listener list is processed last to first.
+ *
+ * @param e The event to fire.
+ * @see EventListenerList
+ */
+ private void fireHyperlinkUpdate(HyperlinkEvent e) {
+ // Guaranteed to return a non-null array
+ Object[] listeners = listenerList.getListenerList();
+ // Process the listeners last to first, notifying
+ // those that are interested in this event
+ for (int i = listeners.length-2; i>=0; i-=2) {
+ if (listeners[i]==HyperlinkListener.class) {
+ ((HyperlinkListener)listeners[i+1]).hyperlinkUpdate(e);
+ }
+ }
+ }
+
+
+ /**
+ * Notifies listeners that the marked occurrences for this text area
+ * have changed.
+ */
+ void fireMarkedOccurrencesChanged() {
+ firePropertyChange(RSyntaxTextArea.MARKED_OCCURRENCES_CHANGED_PROPERTY,
+ null, null);
+ }
+
+
+ /**
+ * Fires a notification that the parser notices for this text area have
+ * changed.
+ */
+ void fireParserNoticesChange() {
+ firePropertyChange(PARSER_NOTICES_PROPERTY, null, null);
+ }
+
+
+ /**
+ * Called whenever a fold is collapsed or expanded. This causes the
+ * text editor to revalidate. This method is here because of poor design
+ * and should be removed.
+ *
+ * @param fold The fold that was collapsed or expanded.
+ */
+ public void foldToggled(Fold fold) {
+ match = null; // TODO: Update the bracket rect rather than hide it
+ dotRect = null;
+ possiblyUpdateCurrentLineHighlightLocation();
+ revalidate();
+ repaint();
+ }
+
+
+ /**
+ * Forces the given {@link Parser} to re-parse the content of this text
+ * area.<p>
+ *
+ * This method can be useful when a <code>Parser</code> can be configured
+ * as to what notices it returns. For example, if a Java language parser
+ * can be configured to set whether no serialVersionUID is a warning,
+ * error, or ignored, this method can be called after changing the expected
+ * notice type to have the document re-parsed.
+ *
+ * @param parser The index of the <code>Parser</code> to re-run.
+ * @see #getParser(int)
+ */
+ public void forceReparsing(int parser) {
+ parserManager.forceReparsing(parser);
+ }
+
+
+ /**
+ * Forces re-parsing with a specific parser. Note that if this parser is
+ * not installed on this text area, nothing will happen.
+ *
+ * @param parser The parser that should re-parse this text area's contents.
+ * This should be installed on this text area.
+ * @return Whether the parser was installed on this text area.
+ * @see #forceReparsing(int)
+ */
+ public boolean forceReparsing(Parser parser) {
+ for (int i=0; i<getParserCount(); i++) {
+ if (getParser(i)==parser) {
+ forceReparsing(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether bracket matching should be animated.
+ *
+ * @return Whether bracket matching should be animated.
+ * @see #setAnimateBracketMatching(boolean)
+ */
+ public boolean getAnimateBracketMatching() {
+ return animateBracketMatching;
+ }
+
+
+ /**
+ * Returns whether anti-aliasing is enabled in this editor.
+ *
+ * @return Whether anti-aliasing is enabled in this editor.
+ * @see #setAntiAliasingEnabled(boolean)
+ * @see #getFractionalFontMetricsEnabled()
+ */
+ public boolean getAntiAliasingEnabled() {
+ return aaHints!=null;
+ }
+
+
+ /**
+ * Returns the background color for a token.
+ *
+ * @param token The token.
+ * @return The background color to use for that token. If this value is
+ * is <code>null</code> then this token has no special background
+ * color.
+ * @see #getForegroundForToken(Token)
+ */
+ public Color getBackgroundForToken(Token token) {
+ Color c = null;
+ if (getHighlightSecondaryLanguages()) {
+ // 1-indexed, since 0 == main language.
+ int languageIndex = token.getLanguageIndex() - 1;
+ if (languageIndex>=0 &&
+ languageIndex<secondaryLanguageBackgrounds.length) {
+ c = secondaryLanguageBackgrounds[languageIndex];
+ }
+ }
+ if (c==null) {
+ c = syntaxScheme.getStyle(token.type).background;
+ }
+ // Don't default to this.getBackground(), as Tokens simply don't
+ // paint a background if they get a null Color.
+ return c;
+ }
+
+
+ /**
+ * Returns whether curly braces should be automatically closed when a
+ * newline is entered after an opening curly brace. Note that this
+ * property is only honored for languages that use curly braces to denote
+ * code blocks.
+ *
+ * @return Whether curly braces should be automatically closed.
+ * @see #setCloseCurlyBraces(boolean)
+ */
+ public boolean getCloseCurlyBraces() {
+ return closeCurlyBraces;
+ }
+
+
+ /**
+ * Returns whether closing markup tags should be automatically completed
+ * when "<code></</code>" is typed. Note that this property is only
+ * honored for markup languages, such as HTML, XML and PHP.
+ *
+ * @return Whether closing markup tags should be automatically completed.
+ * @see #setCloseMarkupTags(boolean)
+ */
+ public boolean getCloseMarkupTags() {
+ return closeMarkupTags;
+ }
+
+
+ /**
+ * Returns the code template manager for all instances of
+ * <code>RSyntaxTextArea</code>. The manager is lazily created.
+ *
+ * @return The code template manager.
+ * @see #setTemplatesEnabled(boolean)
+ */
+ public static synchronized CodeTemplateManager getCodeTemplateManager() {
+ if (codeTemplateManager==null) {
+ codeTemplateManager = new CodeTemplateManager();
+ }
+ return codeTemplateManager;
+ }
+
+
+ /**
+ * Returns the default bracket-match background color.
+ *
+ * @return The color.
+ * @see #getDefaultBracketMatchBorderColor
+ */
+ public static final Color getDefaultBracketMatchBGColor() {
+ return DEFAULT_BRACKET_MATCH_BG_COLOR;
+ }
+
+
+ /**
+ * Returns the default bracket-match border color.
+ *
+ * @return The color.
+ * @see #getDefaultBracketMatchBGColor
+ */
+ public static final Color getDefaultBracketMatchBorderColor() {
+ return DEFAULT_BRACKET_MATCH_BORDER_COLOR;
+ }
+
+
+ /**
+ * Returns the default selection color for this text area. This
+ * color was chosen because it's light and <code>RSyntaxTextArea</code>
+ * does not change text color between selected/unselected text for
+ * contrast like regular <code>JTextArea</code>s do.
+ *
+ * @return The default selection color.
+ */
+ public static Color getDefaultSelectionColor() {
+ return DEFAULT_SELECTION_COLOR;
+ }
+
+
+ /**
+ * Returns the "default" syntax highlighting color scheme. The colors
+ * used are somewhat standard among syntax highlighting text editors.
+ *
+ * @return The default syntax highlighting color scheme.
+ * @see #restoreDefaultSyntaxScheme()
+ * @see #getSyntaxScheme()
+ * @see #setSyntaxScheme(SyntaxScheme)
+ */
+ public SyntaxScheme getDefaultSyntaxScheme() {
+ return new SyntaxScheme(getFont());
+ }
+
+
+ /**
+ * Returns whether an EOL marker should be drawn at the end of each line.
+ *
+ * @return Whether EOL markers should be visible.
+ * @see #setEOLMarkersVisible(boolean)
+ * @see #isWhitespaceVisible()
+ */
+ public boolean getEOLMarkersVisible() {
+ return eolMarkersVisible;
+ }
+
+
+ /**
+ * Returns the fold manager for this text area.
+ *
+ * @return The fold manager.
+ */
+ public FoldManager getFoldManager() {
+ return foldManager;
+ }
+
+
+ /**
+ * Returns the font for tokens of the specified type.
+ *
+ * @param type The type of token.
+ * @return The font to use for that token type.
+ * @see #getFontMetricsForTokenType(int)
+ */
+ public Font getFontForTokenType(int type) {
+ Font f = syntaxScheme.getStyle(type).font;
+ return f!=null ? f : getFont();
+ }
+
+
+ /**
+ * Returns the font metrics for tokens of the specified type.
+ *
+ * @param type The type of token.
+ * @return The font metrics to use for that token type.
+ * @see #getFontForTokenType(int)
+ */
+ public FontMetrics getFontMetricsForTokenType(int type) {
+ FontMetrics fm = syntaxScheme.getStyle(type).fontMetrics;
+ return fm!=null ? fm : defaultFontMetrics;
+ }
+
+
+ /**
+ * Returns the foreground color to use when painting a token.
+ *
+ * @param t The token.
+ * @return The foreground color to use for that token. This
+ * value is never <code>null</code>.
+ * @see #getBackgroundForToken(Token)
+ */
+ public Color getForegroundForToken(Token t) {
+ if (getHyperlinksEnabled() && hoveredOverLinkOffset==t.offset &&
+ (t.isHyperlink() || linkGeneratorResult!=null)) {
+ return hyperlinkFG;
+ }
+ return getForegroundForTokenType(t.type);
+ }
+
+
+ /**
+ * Returns the foreground color to use when painting a token. This does
+ * not take into account whether the token is a hyperlink.
+ *
+ * @param type The token type.
+ * @return The foreground color to use for that token. This
+ * value is never <code>null</code>.
+ * @see #getForegroundForToken(Token)
+ */
+ public Color getForegroundForTokenType(int type) {
+ Color fg = syntaxScheme.getStyle(type).foreground;
+ return fg!=null ? fg : getForeground();
+ }
+
+
+ /**
+ * Returns whether fractional font metrics are enabled for this text area.
+ *
+ * @return Whether fractional font metrics are enabled.
+ * @see #setFractionalFontMetricsEnabled
+ * @see #getAntiAliasingEnabled()
+ */
+ public boolean getFractionalFontMetricsEnabled() {
+ return fractionalFontMetricsEnabled;
+ }
+
+
+ /**
+ * Returns a <code>Graphics2D</code> version of the specified graphics
+ * that has been initialized with the proper rendering hints.
+ *
+ * @param g The graphics context for which to get a
+ * <code>Graphics2D</code>.
+ * @return The <code>Graphics2D</code>.
+ */
+ private final Graphics2D getGraphics2D(Graphics g) {
+ Graphics2D g2d = (Graphics2D)g;
+ if (aaHints!=null) {
+ g2d.addRenderingHints(aaHints);
+ }
+ if (fractionalFontMetricsEnabled) {
+ g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
+ RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ }
+ return g2d;
+ }
+
+
+ /**
+ * Returns whether "secondary" languages should have their backgrounds
+ * colored differently to visually differentiate them. This feature
+ * imposes a fair performance penalty.
+ *
+ * @return Whether secondary languages have their backgrounds colored
+ * differently.
+ * @see #setHighlightSecondaryLanguages(boolean)
+ * @see #getSecondaryLanguageBackground(int)
+ * @see #getSecondaryLanguageCount()
+ * @see #setSecondaryLanguageBackground(int, Color)
+ */
+ public boolean getHighlightSecondaryLanguages() {
+ return highlightSecondaryLanguages;
+ }
+
+
+ /**
+ * Returns the color to use when painting hyperlinks.
+ *
+ * @return The color to use when painting hyperlinks.
+ * @see #setHyperlinkForeground(Color)
+ * @see #getHyperlinksEnabled()
+ */
+ public Color getHyperlinkForeground() {
+ return hyperlinkFG;
+ }
+
+
+ /**
+ * Returns whether hyperlinks are enabled for this text area.
+ *
+ * @return Whether hyperlinks are enabled for this text area.
+ * @see #setHyperlinksEnabled(boolean)
+ */
+ public boolean getHyperlinksEnabled() {
+ return hyperlinksEnabled;
+ }
+
+
+ /**
+ * Returns the last visible offset in this text area. This may not be the
+ * length of the document if code folding is enabled.
+ *
+ * @return The last visible offset in this text area.
+ */
+ public int getLastVisibleOffset() {
+ if (isCodeFoldingEnabled()) {
+ int lastVisibleLine = foldManager.getLastVisibleLine();
+ if (lastVisibleLine<getLineCount()-1) { // Not the last line
+ try {
+ return getLineEndOffset(lastVisibleLine) - 1;
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+ }
+ }
+ return getDocument().getLength();
+ }
+
+
+ /**
+ * Returns the height to use for a line of text in this text area.
+ *
+ * @return The height of a line of text in this text area.
+ */
+ public int getLineHeight() {
+ //System.err.println("... getLineHeight() returning " + lineHeight);
+ return lineHeight;
+ }
+
+
+ public LinkGenerator getLinkGenerator() {
+ return linkGenerator;
+ }
+
+
+ /**
+ * Returns a list of "marked occurrences" in the text area. If there are
+ * no marked occurrences, this will be an empty list.
+ *
+ * @return The list of marked occurrences.
+ */
+ public List getMarkedOccurrences() {
+ return ((RSyntaxTextAreaHighlighter)getHighlighter()).
+ getMarkedOccurrences();
+ }
+
+
+ /**
+ * Returns whether "Mark Occurrences" is enabled.
+ *
+ * @return Whether "Mark Occurrences" is enabled.
+ * @see #setMarkOccurrences(boolean)
+ */
+ public boolean getMarkOccurrences() {
+ return markOccurrencesSupport!=null;
+ }
+
+
+ /**
+ * Returns the color used to "mark occurrences."
+ *
+ * @return The mark occurrences color.
+ * @see #setMarkOccurrencesColor(Color)
+ */
+ public Color getMarkOccurrencesColor() {
+ return markOccurrencesColor;
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ boolean getMarkOccurrencesOfTokenType(int type) {
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ return doc.getMarkOccurrencesOfTokenType(type);
+ }
+
+
+ /**
+ * Gets the color used as the background for a matched bracket.
+ *
+ * @return The color used. If this is <code>null</code>, no special
+ * background is painted behind a matched bracket.
+ * @see #setMatchedBracketBGColor
+ * @see #getMatchedBracketBorderColor
+ */
+ public Color getMatchedBracketBGColor() {
+ return matchedBracketBGColor;
+ }
+
+
+ /**
+ * Gets the color used as the border for a matched bracket.
+ *
+ * @return The color used.
+ * @see #setMatchedBracketBorderColor
+ * @see #getMatchedBracketBGColor
+ */
+ public Color getMatchedBracketBorderColor() {
+ return matchedBracketBorderColor;
+ }
+
+
+ /**
+ * Returns the caret's offset's rectangle, or <code>null</code> if there
+ * is currently no matched bracket, bracket matching is disabled, or "paint
+ * both matched brackets" is disabled. This should never be called by the
+ * programmer directly.
+ *
+ * @return The rectangle surrounding the matched bracket.
+ * @see #getMatchRectangle()
+ */
+ Rectangle getDotRectangle() {
+ return dotRect;
+ }
+
+
+ /**
+ * Returns the matched bracket's rectangle, or <code>null</code> if there
+ * is currently no matched bracket. This should never be called by the
+ * programmer directly.
+ *
+ * @return The rectangle surrounding the matched bracket.
+ * @see #getDotRectangle()
+ */
+ Rectangle getMatchRectangle() {
+ return match;
+ }
+
+
+ /**
+ * Overridden to return the max ascent for any font used in the editor.
+ *
+ * @return The max ascent value.
+ */
+ public int getMaxAscent() {
+ return maxAscent;
+ }
+
+
+ /**
+ * Returns whether the bracket at the caret position is painted as a
+ * "match" when a matched bracket is found. Note that this property does
+ * nothing if {@link #isBracketMatchingEnabled()} returns
+ * <code>false</code>.
+ *
+ * @return Whether both brackets in a bracket pair are highlighted when
+ * bracket matching is enabled.
+ * @see #setPaintMatchedBracketPair(boolean)
+ * @see #isBracketMatchingEnabled()
+ * @see #setBracketMatchingEnabled(boolean)
+ */
+ public boolean getPaintMatchedBracketPair() {
+ return paintMatchedBracketPair;
+ }
+
+
+ /**
+ * Returns whether tab lines are painted.
+ *
+ * @return Whether tab lines are painted.
+ * @see #setPaintTabLines(boolean)
+ * @see #getTabLineColor()
+ */
+ public boolean getPaintTabLines() {
+ return paintTabLines;
+ }
+
+
+ /**
+ * Returns the specified parser.
+ *
+ * @param index The {@link Parser} to retrieve.
+ * @return The <code>Parser</code>.
+ * @see #getParserCount()
+ * @see #addParser(Parser)
+ */
+ public Parser getParser(int index) {
+ return parserManager.getParser(index);
+ }
+
+
+ /**
+ * Returns the number of parsers operating on this text area.
+ *
+ * @return The parser count.
+ * @see #addParser(Parser)
+ */
+ public int getParserCount() {
+ return parserManager==null ? 0 : parserManager.getParserCount();
+ }
+
+
+ /**
+ * Returns a list of the current parser notices for this text area.
+ * This method (like most Swing methods) should only be called on the
+ * EDT.
+ *
+ * @return The list of notices. This will be an empty list if there are
+ * none.
+ */
+ public List getParserNotices() {
+ return parserManager==null ? Collections.EMPTY_LIST :
+ parserManager.getParserNotices();
+ }
+
+
+ /**
+ * Returns the RTF generator for this text area, lazily creating it
+ * if necessary.
+ *
+ * @return The RTF generator.
+ */
+ private RtfGenerator getRTFGenerator() {
+ if (rtfGenerator==null) {
+ rtfGenerator = new RtfGenerator();
+ }
+ else {
+ rtfGenerator.reset();
+ }
+ return rtfGenerator;
+ }
+
+
+ /**
+ * If auto-indent is enabled, this method returns whether a new line after
+ * this one should be indented (based on the standard indentation rules for
+ * the current programming language). For example, in Java, for a line
+ * containing:
+ *
+ * <pre>
+ * for (int i=0; i<10; i++) {
+ * </pre>
+ *
+ * the following line should be indented.
+ *
+ * @param line The line to check.
+ * @return Whether a line inserted after this one should be auto-indented.
+ * If auto-indentation is disabled, this will always return
+ * <code>false</code>.
+ * @see #isAutoIndentEnabled()
+ */
+ public boolean getShouldIndentNextLine(int line) {
+ if (isAutoIndentEnabled()) {
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ return doc.getShouldIndentNextLine(line);
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns what type of syntax highlighting this editor is doing.
+ *
+ * @return The style being used, such as
+ * {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+ * @see #setSyntaxEditingStyle(String)
+ * @see SyntaxConstants
+ */
+ public String getSyntaxEditingStyle() {
+ return syntaxStyleKey;
+ }
+
+
+ /**
+ * Returns all of the colors currently being used in syntax highlighting
+ * by this text component.
+ *
+ * @return An instance of <code>SyntaxScheme</code> that represents
+ * the colors currently being used for syntax highlighting.
+ * @see #setSyntaxScheme(SyntaxScheme)
+ */
+ public SyntaxScheme getSyntaxScheme() {
+ return syntaxScheme;
+ }
+
+
+ /**
+ * Returns the color used to paint tab lines.
+ *
+ * @return The color used to paint tab lines.
+ * @see #setTabLineColor(Color)
+ * @see #getPaintTabLines()
+ * @see #setPaintTabLines(boolean)
+ */
+ public Color getTabLineColor() {
+ return tabLineColor;
+ }
+
+
+ /**
+ * Returns whether a border is painted around marked occurrences.
+ *
+ * @return Whether a border is painted.
+ * @see #setPaintMarkOccurrencesBorder(boolean)
+ * @see #getMarkOccurrencesColor()
+ * @see #getMarkOccurrences()
+ */
+ public boolean getPaintMarkOccurrencesBorder() {
+ return paintMarkOccurrencesBorder;
+ }
+
+
+ /**
+ * Returns the background color for the specified secondary language.
+ *
+ * @param index The language index. Note that these are 1-based, not
+ * 0-based, and should be in the range
+ * <code>1-getSecondaryLanguageCount()</code>, inclusive.
+ * @return The color, or <code>null</code> if none.
+ * @see #getSecondaryLanguageCount()
+ * @see #setSecondaryLanguageBackground(int, Color)
+ * @see #getHighlightSecondaryLanguages()
+ */
+ public Color getSecondaryLanguageBackground(int index) {
+ return secondaryLanguageBackgrounds[index];
+ }
+
+
+ /**
+ * Returns the number of secondary language backgrounds.
+ *
+ * @return The number of secondary language backgrounds.
+ * @see #getSecondaryLanguageBackground(int)
+ * @see #setSecondaryLanguageBackground(int, Color)
+ * @see #getHighlightSecondaryLanguages()
+ */
+ public int getSecondaryLanguageCount() {
+ return secondaryLanguageBackgrounds.length;
+ }
+
+
+ /**
+ * Returns whether or not templates are enabled for all instances
+ * of <code>RSyntaxTextArea</code>.
+ *
+ * @return Whether templates are enabled.
+ * @see #saveTemplates()
+ * @see #setTemplateDirectory(String)
+ * @see #setTemplatesEnabled(boolean)
+ */
+ public static synchronized boolean getTemplatesEnabled() {
+ return templatesEnabled;
+ }
+
+
+ /**
+ * Returns a token list for the given range in the document.
+ *
+ * @param startOffs The starting offset in the document.
+ * @param endOffs The end offset in the document.
+ * @return The first token in the token list.
+ */
+ private Token getTokenListFor(int startOffs, int endOffs) {
+
+ Token tokenList = null;
+ Token lastToken = null;
+
+ Element map = getDocument().getDefaultRootElement();
+ int startLine = map.getElementIndex(startOffs);
+ int endLine = map.getElementIndex(endOffs);
+
+ for (int line=startLine; line<=endLine; line++) {
+ Token t = getTokenListForLine(line);
+ t = cloneTokenList(t);
+ if (tokenList==null) {
+ tokenList = t;
+ lastToken = tokenList;
+ }
+ else {
+ lastToken.setNextToken(t);
+ }
+ while (lastToken.getNextToken()!=null &&
+ lastToken.getNextToken().isPaintable()) {
+ lastToken = lastToken.getNextToken();
+ }
+ if (line<endLine) {
+ // Document offset MUST be correct to prevent exceptions
+ // in getTokenListFor()
+ int docOffs = map.getElement(line).getEndOffset()-1;
+ t = new Token(new char[] { '\n' }, 0,0, docOffs,
+ Token.WHITESPACE);
+ lastToken.setNextToken(t);
+ lastToken = t;
+ }
+ }
+
+ // Trim the beginning and end of the token list so that it starts
+ // at startOffs and ends at endOffs.
+
+ // Be careful and check that startOffs is actually in the list.
+ // startOffs can be < the token list's start if the end "newline"
+ // character of a line is the first character selected (the token
+ // list returned for that line will be null, so the first token in
+ // the final token list will be from the next line and have a
+ // starting offset > startOffs?).
+ if (startOffs>=tokenList.offset) {
+ while (!tokenList.containsPosition(startOffs)) {
+ tokenList = tokenList.getNextToken();
+ }
+ tokenList.makeStartAt(startOffs);
+ }
+
+ Token temp = tokenList;
+ // Be careful to check temp for null here. It is possible that no
+ // token contains endOffs, if endOffs is at the end of a line.
+ while (temp!=null && !temp.containsPosition(endOffs)) {
+ temp = temp.getNextToken();
+ }
+ if (temp!=null) {
+ temp.textCount = endOffs - temp.offset;
+ temp.setNextToken(null);
+ }
+
+ return tokenList;
+
+ }
+
+
+ /**
+ * Returns a list of tokens representing the given line.
+ *
+ * @param line The line number to get tokens for.
+ * @return A linked list of tokens representing the line's text.
+ */
+ public Token getTokenListForLine(int line) {
+ return ((RSyntaxDocument)getDocument()).getTokenListForLine(line);
+ }
+
+
+ /**
+ * Returns the painter to use for rendering tokens.
+ *
+ * @return The painter to use for rendering tokens.
+ */
+ TokenPainter getTokenPainter() {
+ return tokenPainter;
+ }
+
+
+ /**
+ * Returns the tool tip to display for a mouse event at the given
+ * location. This method is overridden to give a registered parser a
+ * chance to display a tool tip (such as an error description when the
+ * mouse is over an error highlight).
+ *
+ * @param e The mouse event.
+ */
+ public String getToolTipText(MouseEvent e) {
+
+ // Check parsers for tool tips first.
+ String text = null;
+ URL imageBase = null;
+ if (parserManager!=null) {
+ ToolTipInfo info = parserManager.getToolTipText(e);
+ if (info!=null) { // Should always be true
+ text = info.getToolTipText(); // May be null
+ imageBase = info.getImageBase(); // May be null
+ }
+ }
+ if (text==null) {
+ text = super.getToolTipText(e);
+ }
+
+ // Do we want to use "focusable" tips?
+ if (getUseFocusableTips()) {
+ if (text!=null) {
+ if (focusableTip==null) {
+ focusableTip = new FocusableTip(this, parserManager);
+ }
+ focusableTip.setImageBase(imageBase);
+ focusableTip.toolTipRequested(e, text);
+ }
+ // No tool tip text at new location - hide tip window if one is
+ // currently visible
+ else if (focusableTip!=null) {
+ focusableTip.possiblyDisposeOfTipWindow();
+ }
+ return null;
+ }
+
+ return text; // Standard tool tips
+
+ }
+
+
+ /**
+ * Returns whether the specified token should be underlined.
+ * A token is underlined if its syntax style includes underlining,
+ * or if it is a hyperlink and hyperlinks are enabled.
+ *
+ * @param t The token.
+ * @return Whether the specified token should be underlined.
+ */
+ public boolean getUnderlineForToken(Token t) {
+ return (getHyperlinksEnabled() &&
+ (t.isHyperlink() ||
+ (linkGeneratorResult!=null && linkGeneratorResult.getSourceOffset()==t.offset))) ||
+ syntaxScheme.getStyle(t.type).underline;
+ }
+
+
+ /**
+ * Returns whether "focusable" tool tips are used instead of standard
+ * ones. Focusable tool tips are tool tips that the user can click on,
+ * resize, copy from, and click links in.
+ *
+ * @return Whether to use focusable tool tips.
+ * @see #setUseFocusableTips(boolean)
+ * @see FocusableTip
+ */
+ public boolean getUseFocusableTips() {
+ return useFocusableTips;
+ }
+
+
+ /**
+ * Returns whether selected text should use the "selected text color"
+ * property set via {@link #setSelectedTextColor(Color)}. This is the
+ * typical behavior of text components. By default, RSyntaxTextArea does
+ * not do this, so that token styles are visible even in selected regions
+ * of text.
+ *
+ * @return Whether the "selected text" color is used when painting text
+ * in selected regions.
+ * @see #setUseSelectedTextColor(boolean)
+ */
+ public boolean getUseSelectedTextColor() {
+ return useSelectedTextColor;
+ }
+
+
+ /**
+ * Called by constructors to initialize common properties of the text
+ * editor.
+ */
+ protected void init() {
+
+ tokenPainter = new DefaultTokenPainter();
+
+ // NOTE: Our actions are created here instead of in a static block
+ // so they are only created when the first RTextArea is instantiated,
+ // not before. There have been reports of users calling static getters
+ // (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+ // cause these actions to be created and (possibly) incorrectly
+ // localized, if they were in a static block.
+ if (toggleCurrentFoldAction==null) {
+ createRstaPopupMenuActions();
+ }
+
+ // Set some RSyntaxTextArea default values.
+ syntaxStyleKey = SYNTAX_STYLE_NONE;
+ setMatchedBracketBGColor(getDefaultBracketMatchBGColor());
+ setMatchedBracketBorderColor(getDefaultBracketMatchBorderColor());
+ setBracketMatchingEnabled(true);
+ setAnimateBracketMatching(true);
+ lastBracketMatchPos = -1;
+ setSelectionColor(getDefaultSelectionColor());
+ setTabLineColor(null);
+ setMarkOccurrencesColor(MarkOccurrencesSupport.DEFAULT_COLOR);
+
+ foldManager = new FoldManager(this);
+
+ // Set auto-indent related stuff.
+ setAutoIndentEnabled(true);
+ setCloseCurlyBraces(true);
+ setCloseMarkupTags(true);
+ setClearWhitespaceLinesEnabled(true);
+
+ setHyperlinksEnabled(true);
+ setLinkScanningMask(InputEvent.CTRL_DOWN_MASK);
+ setHyperlinkForeground(Color.BLUE);
+ isScanningForLinks = false;
+ setUseFocusableTips(true);
+
+ //setAntiAliasingEnabled(true);
+ setDefaultAntiAliasingState();
+ restoreDefaultSyntaxScheme();
+
+ setHighlightSecondaryLanguages(true);
+ secondaryLanguageBackgrounds = new Color[3];
+ secondaryLanguageBackgrounds[0] = new Color(0xfff0cc);
+ secondaryLanguageBackgrounds[1] = new Color(0xdafeda);
+ secondaryLanguageBackgrounds[2] = new Color(0xffe0f0);
+
+ }
+
+
+ /**
+ * Returns whether or not auto-indent is enabled.
+ *
+ * @return Whether or not auto-indent is enabled.
+ * @see #setAutoIndentEnabled(boolean)
+ */
+ public boolean isAutoIndentEnabled() {
+ return autoIndentEnabled;
+ }
+
+
+ /**
+ * Returns whether or not bracket matching is enabled.
+ *
+ * @return <code>true</code> iff bracket matching is enabled.
+ * @see #setBracketMatchingEnabled
+ */
+ public final boolean isBracketMatchingEnabled() {
+ return bracketMatchingEnabled;
+ }
+
+
+ /**
+ * Returns whether or not lines containing nothing but whitespace are made
+ * into blank lines when Enter is pressed in them.
+ *
+ * @return Whether or not whitespace-only lines are cleared when
+ * the user presses Enter on them.
+ * @see #setClearWhitespaceLinesEnabled(boolean)
+ */
+ public boolean isClearWhitespaceLinesEnabled() {
+ return clearWhitespaceLines;
+ }
+
+
+ /**
+ * Returns whether code folding is enabled. Note that only certain
+ * languages support code folding; those that do not will ignore this
+ * property.
+ *
+ * @return Whether code folding is enabled.
+ * @see #setCodeFoldingEnabled(boolean)
+ */
+ public boolean isCodeFoldingEnabled() {
+ return foldManager.isCodeFoldingEnabled();
+ }
+
+
+ /**
+ * Returns whether whitespace (spaces and tabs) is visible.
+ *
+ * @return Whether whitespace is visible.
+ * @see #setWhitespaceVisible(boolean)
+ * @see #getEOLMarkersVisible()
+ */
+ public boolean isWhitespaceVisible() {
+ return whitespaceVisible;
+ }
+
+
+ /**
+ * Returns the token at the specified position in the model.
+ *
+ * @param offs The position in the model.
+ * @return The token, or <code>null</code> if no token is at that
+ * position.
+ * @see #viewToToken(Point)
+ */
+ public Token modelToToken(int offs) {
+ if (offs>=0) {
+ try {
+ int line = getLineOfOffset(offs);
+ Token t = getTokenListForLine(line);
+ return RSyntaxUtilities.getTokenAtOffset(t, offs);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * The <code>paintComponent</code> method is overridden so we
+ * apply any necessary rendering hints to the Graphics object.
+ */
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(getGraphics2D(g));
+ }
+
+
+ private void refreshFontMetrics(Graphics2D g2d) {
+ // It is assumed that any rendering hints are already applied to g2d.
+ defaultFontMetrics = g2d.getFontMetrics(getFont());
+ syntaxScheme.refreshFontMetrics(g2d);
+ if (getLineWrap()==false) {
+ // HORRIBLE HACK! The un-wrapped view needs to refresh its cached
+ // longest line information.
+ SyntaxView sv = (SyntaxView)getUI().getRootView(this).getView(0);
+ sv.calculateLongestLine();
+ }
+ }
+
+
+ /**
+ * Removes an "active line range" listener from this text area.
+ *
+ * @param l The listener to remove.
+ * @see #removeActiveLineRangeListener(ActiveLineRangeListener)
+ */
+ public void removeActiveLineRangeListener(ActiveLineRangeListener l) {
+ listenerList.remove(ActiveLineRangeListener.class, l);
+ }
+
+
+ /**
+ * Removes a hyperlink listener from this text area.
+ *
+ * @param l The listener to remove.
+ * @see #addHyperlinkListener(HyperlinkListener)
+ */
+ public void removeHyperlinkListener(HyperlinkListener l) {
+ listenerList.remove(HyperlinkListener.class, l);
+ }
+
+
+ /**
+ * Overridden so we stop this text area's parsers, if any.
+ */
+ public void removeNotify() {
+ if (parserManager!=null) {
+ parserManager.stopParsing();
+ }
+ super.removeNotify();
+ }
+
+
+ /**
+ * Removes a parser from this text area.
+ *
+ * @param parser The {@link Parser} to remove.
+ * @return Whether the parser was found and removed.
+ * @see #clearParsers()
+ * @see #addParser(Parser)
+ * @see #getParser(int)
+ */
+ public boolean removeParser(Parser parser) {
+ boolean removed = false;
+ if (parserManager!=null) {
+ removed = parserManager.removeParser(parser);
+ }
+ return removed;
+ }
+
+
+ /**
+ * Sets the colors used for syntax highlighting to their defaults.
+ *
+ * @see #setSyntaxScheme(SyntaxScheme)
+ * @see #getSyntaxScheme()
+ * @see #getDefaultSyntaxScheme()
+ */
+ public void restoreDefaultSyntaxScheme() {
+ setSyntaxScheme(getDefaultSyntaxScheme());
+ }
+
+
+ /**
+ * Attempts to save all currently-known templates to the current template
+ * directory, as set by <code>setTemplateDirectory</code>. Templates
+ * will be saved as XML files with names equal to their abbreviations; for
+ * example, a template that expands on the word "forb" will be saved as
+ * <code>forb.xml</code>.
+ *
+ * @return Whether or not the save was successful. The save will
+ * be unsuccessful if the template directory does not exist or
+ * if it has not been set (i.e., you have not yet called
+ * <code>setTemplateDirectory</code>).
+ * @see #getTemplatesEnabled
+ * @see #setTemplateDirectory
+ * @see #setTemplatesEnabled
+ */
+ public static synchronized boolean saveTemplates() {
+ if (!getTemplatesEnabled()) {
+ return false;
+ }
+ return getCodeTemplateManager().saveTemplates();
+ }
+
+
+ /**
+ * Sets the "active line range." Note that this
+ * <code>RSyntaxTextArea</code> itself does nothing with this information,
+ * but if it is contained inside an {@link RTextScrollPane}, the active
+ * line range may be displayed in the icon area of the {@link Gutter}.<p>
+ *
+ * Note that basic users of <code>RSyntaxTextArea</code> will not call this
+ * method directly; rather, it is usually called by instances of
+ * <code>LanguageSupport</code> in the <code>RSTALangaugeSupport</code>
+ * library. See <a href="http://fifesoft.com">http://fifesoft.com</a>
+ * for more information about this library.
+ *
+ * @param min The "minimum" line in the active line range, or
+ * <code>-1</code> if the range is being cleared.
+ * @param max The "maximum" line in the active line range, or
+ * <code>-1</code> if the range is being cleared.
+ * @see #addActiveLineRangeListener(ActiveLineRangeListener)
+ */
+ public void setActiveLineRange(int min, int max) {
+ if (min==-1) {
+ max = -1; // Force max to be -1 if min is.
+ }
+ fireActiveLineRangeEvent(min, max);
+ }
+
+
+ /**
+ * Sets whether bracket matching should be animated. This fires a property
+ * change event of type {@link #ANIMATE_BRACKET_MATCHING_PROPERTY}.
+ *
+ * @param animate Whether to animate bracket matching.
+ * @see #getAnimateBracketMatching()
+ */
+ public void setAnimateBracketMatching(boolean animate) {
+ if (animate!=animateBracketMatching) {
+ animateBracketMatching = animate;
+ if (animate && bracketRepaintTimer==null) {
+ bracketRepaintTimer = new BracketMatchingTimer();
+ }
+ firePropertyChange(ANIMATE_BRACKET_MATCHING_PROPERTY,
+ !animate, animate);
+ }
+ }
+
+
+ /**
+ * Sets whether anti-aliasing is enabled in this editor. This method
+ * fires a property change event of type {@link #ANTIALIAS_PROPERTY}.
+ *
+ * @param enabled Whether anti-aliasing is enabled.
+ * @see #getAntiAliasingEnabled()
+ */
+ public void setAntiAliasingEnabled(boolean enabled) {
+
+ boolean currentlyEnabled = aaHints!=null;
+
+ if (enabled!=currentlyEnabled) {
+
+ if (enabled) {
+ aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+ // If the desktop query method comes up empty, use the standard
+ // Java2D greyscale method. Note this will likely NOT be as
+ // nice as what would be used if the getDesktopAntiAliasHints()
+ // call worked.
+ if (aaHints==null) {
+ aaHints = new HashMap();
+ aaHints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ }
+ }
+ else {
+ aaHints = null;
+ }
+
+ // We must be connected to a screen resource for our graphics
+ // to be non-null.
+ if (isDisplayable()) {
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+ }
+ firePropertyChange(ANTIALIAS_PROPERTY, !enabled, enabled);
+ repaint();
+
+ }
+
+ }
+
+
+ /**
+ * Sets whether or not auto-indent is enabled. This fires a property
+ * change event of type {@link #AUTO_INDENT_PROPERTY}.
+ *
+ * @param enabled Whether or not auto-indent is enabled.
+ * @see #isAutoIndentEnabled()
+ */
+ public void setAutoIndentEnabled(boolean enabled) {
+ if (autoIndentEnabled!=enabled) {
+ autoIndentEnabled = enabled;
+ firePropertyChange(AUTO_INDENT_PROPERTY, !enabled, enabled);
+ }
+ }
+
+
+ /**
+ * Sets whether bracket matching is enabled. This fires a property change
+ * event of type {@link #BRACKET_MATCHING_PROPERTY}.
+ *
+ * @param enabled Whether or not bracket matching should be enabled.
+ * @see #isBracketMatchingEnabled()
+ */
+ public void setBracketMatchingEnabled(boolean enabled) {
+ if (enabled!=bracketMatchingEnabled) {
+ bracketMatchingEnabled = enabled;
+ repaint();
+ firePropertyChange(BRACKET_MATCHING_PROPERTY, !enabled, enabled);
+ }
+ }
+
+
+ /**
+ * Sets whether or not lines containing nothing but whitespace are made
+ * into blank lines when Enter is pressed in them. This method fires
+ * a property change event of type {@link #CLEAR_WHITESPACE_LINES_PROPERTY}.
+ *
+ * @param enabled Whether or not whitespace-only lines are cleared when
+ * the user presses Enter on them.
+ * @see #isClearWhitespaceLinesEnabled()
+ */
+ public void setClearWhitespaceLinesEnabled(boolean enabled) {
+ if (enabled!=clearWhitespaceLines) {
+ clearWhitespaceLines = enabled;
+ firePropertyChange(CLEAR_WHITESPACE_LINES_PROPERTY,
+ !enabled, enabled);
+ }
+ }
+
+
+ /**
+ * Toggles whether curly braces should be automatically closed when a
+ * newline is entered after an opening curly brace. Note that this
+ * property is only honored for languages that use curly braces to denote
+ * code blocks.<p>
+ *
+ * This method fires a property change event of type
+ * {@link #CLOSE_CURLY_BRACES_PROPERTY}.
+ *
+ * @param close Whether curly braces should be automatically closed.
+ * @see #getCloseCurlyBraces()
+ */
+ public void setCloseCurlyBraces(boolean close) {
+ if (close!=closeCurlyBraces) {
+ closeCurlyBraces = close;
+ firePropertyChange(CLOSE_CURLY_BRACES_PROPERTY, !close, close);
+ }
+ }
+
+
+ /**
+ * Sets whether closing markup tags should be automatically completed
+ * when "<code></</code>" is typed. Note that this property is only
+ * honored for markup languages, such as HTML, XML and PHP.<p>
+ *
+ * This method fires a property change event of type
+ * {@link #CLOSE_MARKUP_TAGS_PROPERTY}.
+ *
+ * @param close Whether closing markup tags should be automatically
+ * completed.
+ * @see #getCloseMarkupTags()
+ */
+ public void setCloseMarkupTags(boolean close) {
+ if (close!=closeMarkupTags) {
+ closeMarkupTags = close;
+ firePropertyChange(CLOSE_MARKUP_TAGS_PROPERTY, !close, close);
+ }
+ }
+
+
+ /**
+ * Sets whether code folding is enabled. Note that only certain
+ * languages will support code folding out of the box. Those languages
+ * which do not support folding will ignore this property.<p>
+ * This method fires a property change event of type
+ * {@link #CODE_FOLDING_PROPERTY}.
+ *
+ * @param enabled Whether code folding should be enabled.
+ * @see #isCodeFoldingEnabled()
+ */
+ public void setCodeFoldingEnabled(boolean enabled) {
+ if (enabled!=foldManager.isCodeFoldingEnabled()) {
+ foldManager.setCodeFoldingEnabled(enabled);
+ firePropertyChange(CODE_FOLDING_PROPERTY, !enabled, enabled);
+ }
+ }
+
+
+ /**
+ * Sets anti-aliasing to whatever the user's desktop vaule is.
+ *
+ * @see #getAntiAliasingEnabled()
+ */
+ private final void setDefaultAntiAliasingState() {
+
+ // Most accurate technique, but not available on all OSes.
+ aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+ if (aaHints==null) {
+
+ aaHints = new HashMap();
+
+ // In Java 6+, you can figure out what text AA hint Swing uses for
+ // JComponents...
+ JLabel label = new JLabel();
+ FontMetrics fm = label.getFontMetrics(label.getFont());
+ Object hint = null;
+ //FontRenderContext frc = fm.getFontRenderContext();
+ //hint = fm.getAntiAliasingHint();
+ try {
+ Method m = FontMetrics.class.getMethod("getFontRenderContext", null);
+ FontRenderContext frc = (FontRenderContext)m.invoke(fm, null);
+ m = FontRenderContext.class.getMethod("getAntiAliasingHint", null);
+ hint = m.invoke(frc, null);
+ } catch (RuntimeException re) {
+ throw re; // FindBugs
+ } catch (Exception e) {
+ // Swallow, either Java 1.4 or 1.5, or running in an applet
+ }
+
+ // If not running Java 6+, default to AA enabled on Windows where
+ // the software AA is pretty fast, and default (e.g. disabled) on
+ // non-Windows. Note that OS X always uses AA no matter what
+ // rendering hints you give it, so this is a moot point there.
+ //System.out.println("Rendering hint: " + hint);
+ if (hint==null) {
+ String os = System.getProperty("os.name").toLowerCase();
+ if (os.indexOf("windows")>-1) {
+ hint = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
+ }
+ else {
+ hint = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
+ }
+ }
+ aaHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, hint);
+
+ }
+
+ // We must be connected to a screen resource for our graphics
+ // to be non-null.
+ if (isDisplayable()) {
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+ }
+ repaint();
+
+ }
+
+
+ /**
+ * Sets the document used by this text area. This is overridden so that
+ * only instances of {@link RSyntaxDocument} are accepted; for all
+ * others, an exception will be thrown.
+ *
+ * @param document The new document for this text area.
+ * @throws IllegalArgumentException If the document is not an
+ * <code>RSyntaxDocument</code>.
+ */
+ public void setDocument(Document document) {
+ if (!(document instanceof RSyntaxDocument))
+ throw new IllegalArgumentException("Documents for " +
+ "RSyntaxTextArea must be instances of " +
+ "RSyntaxDocument!");
+ super.setDocument(document);
+ }
+
+
+ /**
+ * Sets whether EOL markers are visible at the end of each line. This
+ * method fires a property change of type {@link #EOL_VISIBLE_PROPERTY}.
+ *
+ * @param visible Whether EOL markers are visible.
+ * @see #getEOLMarkersVisible()
+ * @see #setWhitespaceVisible(boolean)
+ */
+ public void setEOLMarkersVisible(boolean visible) {
+ if (visible!=eolMarkersVisible) {
+ eolMarkersVisible = visible;
+ repaint();
+ firePropertyChange(EOL_VISIBLE_PROPERTY, !visible, visible);
+ }
+ }
+
+
+ /**
+ * Sets the font used by this text area. Note that if some token styles
+ * are using a different font, they will not be changed by calling this
+ * method. To set different fonts on individual token types, use the
+ * text area's <code>SyntaxScheme</code>.
+ *
+ * @param font The font.
+ * @see SyntaxScheme#getStyle(int)
+ */
+ public void setFont(Font font) {
+
+ Font old = super.getFont();
+ super.setFont(font); // Do this first.
+
+ // Usually programmers keep a single font for all token types, but
+ // may use bold or italic for styling some.
+ SyntaxScheme scheme = getSyntaxScheme();
+ if (scheme!=null && old!=null) {
+ scheme.changeBaseFont(old, font);
+ calculateLineHeight();
+ }
+
+ // We must be connected to a screen resource for our
+ // graphics to be non-null.
+ if (isDisplayable()) {
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+ // Updates the margin line.
+ updateMarginLineX();
+ // Force the current line highlight to be repainted, even
+ // though the caret's location hasn't changed.
+ forceCurrentLineHighlightRepaint();
+ // Get line number border in text area to repaint again
+ // since line heights have updated.
+ firePropertyChange("font", old, font);
+ // So parent JScrollPane will have its scrollbars updated.
+ revalidate();
+ }
+
+ }
+
+
+ /**
+ * Sets whether fractional font metrics are enabled. This method fires
+ * a property change event of type {@link #FRACTIONAL_FONTMETRICS_PROPERTY}.
+ *
+ * @param enabled Whether fractional font metrics are enabled.
+ * @see #getFractionalFontMetricsEnabled()
+ */
+ public void setFractionalFontMetricsEnabled(boolean enabled) {
+ if (fractionalFontMetricsEnabled!=enabled) {
+ fractionalFontMetricsEnabled = enabled;
+ // We must be connected to a screen resource for our graphics to be
+ // non-null.
+ if (isDisplayable()) {
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+ }
+ firePropertyChange(FRACTIONAL_FONTMETRICS_PROPERTY,
+ !enabled, enabled);
+ }
+ }
+
+
+ /**
+ * Sets the highlighter used by this text area.
+ *
+ * @param h The highlighter.
+ * @throws IllegalArgumentException If <code>h</code> is not an instance
+ * of {@link RSyntaxTextAreaHighlighter}.
+ */
+ public void setHighlighter(Highlighter h) {
+ if (!(h instanceof RSyntaxTextAreaHighlighter)) {
+ throw new IllegalArgumentException("RSyntaxTextArea requires " +
+ "an RSyntaxTextAreaHighlighter for its Highlighter");
+ }
+ super.setHighlighter(h);
+ }
+
+
+ /**
+ * Sets whether "secondary" languages should have their backgrounds
+ * colored differently to visually differentiate them. This feature
+ * imposes a fair performance penalty. This method fires a property change
+ * event of type {@link #HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY}.
+ *
+ * @return Whether secondary languages have their backgrounds colored
+ * differently.
+ * @see #getHighlightSecondaryLanguages()
+ * @see #setSecondaryLanguageBackground(int, Color)
+ * @see #getSecondaryLanguageCount()
+ */
+ public void setHighlightSecondaryLanguages(boolean highlight) {
+ if (this.highlightSecondaryLanguages!=highlight) {
+ highlightSecondaryLanguages = highlight;
+ repaint();
+ firePropertyChange(HIGHLIGHT_SECONDARY_LANGUAGES_PROPERTY,
+ !highlight, highlight);
+ }
+ }
+
+
+ /**
+ * Sets the color to use when painting hyperlinks.
+ *
+ * @param fg The color to use when painting hyperlinks.
+ * @throws NullPointerException If <code>fg</code> is <code>null</code>.
+ * @see #getHyperlinkForeground()
+ * @see #setHyperlinksEnabled(boolean)
+ */
+ public void setHyperlinkForeground(Color fg) {
+ if (fg==null) {
+ throw new NullPointerException("fg cannot be null");
+ }
+ hyperlinkFG = fg;
+ }
+
+
+ /**
+ * Sets whether hyperlinks are enabled for this text area. This method
+ * fires a property change event of type
+ * {@link #HYPERLINKS_ENABLED_PROPERTY}.
+ *
+ * @param enabled Whether hyperlinks are enabled.
+ * @see #getHyperlinksEnabled()
+ */
+ public void setHyperlinksEnabled(boolean enabled) {
+ if (this.hyperlinksEnabled!=enabled) {
+ this.hyperlinksEnabled = enabled;
+ repaint();
+ firePropertyChange(HYPERLINKS_ENABLED_PROPERTY, !enabled, enabled);
+ }
+ }
+
+
+ public void setLinkGenerator(LinkGenerator generator) {
+ this.linkGenerator = generator;
+ }
+
+
+ /**
+ * Sets the mask for the key used to toggle whether we are scanning for
+ * hyperlinks with mouse hovering.
+ *
+ * @param mask The mask to use. This should be a value such as
+ * {@link InputEvent#CTRL_DOWN_MASK} or
+ * {@link InputEvent#META_DOWN_MASK}.
+ * For invalid values, behavior is undefined.
+ * @see InputEvent
+ */
+ public void setLinkScanningMask(int mask) {
+ if (mask==InputEvent.CTRL_DOWN_MASK ||
+ mask==InputEvent.META_DOWN_MASK ||
+ mask==InputEvent.ALT_DOWN_MASK ||
+ mask==InputEvent.SHIFT_DOWN_MASK) {
+ linkScanningMask = mask;
+ }
+ }
+
+
+ /**
+ * Toggles whether "mark occurrences" is enabled. This method fires a
+ * property change event of type {@link #MARK_OCCURRENCES_PROPERTY}.
+ *
+ * @param markOccurrences Whether "Mark Occurrences" should be enabled.
+ * @see #getMarkOccurrences()
+ * @see #setMarkOccurrencesColor(Color)
+ */
+ public void setMarkOccurrences(boolean markOccurrences) {
+ if (markOccurrences) {
+ if (markOccurrencesSupport==null) {
+ markOccurrencesSupport = new MarkOccurrencesSupport();
+ markOccurrencesSupport.install(this);
+ firePropertyChange(MARK_OCCURRENCES_PROPERTY, false, true);
+ }
+ }
+ else {
+ if (markOccurrencesSupport!=null) {
+ markOccurrencesSupport.uninstall();
+ markOccurrencesSupport = null;
+ firePropertyChange(MARK_OCCURRENCES_PROPERTY, true, false);
+ }
+ }
+ }
+
+
+ /**
+ * Sets the "mark occurrences" color.
+ *
+ * @param color The new color. This cannot be <code>null</code>.
+ * @see #getMarkOccurrencesColor()
+ * @see #setMarkOccurrences(boolean)
+ */
+ public void setMarkOccurrencesColor(Color color) {
+ markOccurrencesColor = color;
+ if (markOccurrencesSupport!=null) {
+ markOccurrencesSupport.setColor(color);
+ }
+ }
+
+
+ /**
+ * Sets the color used as the background for a matched bracket.
+ *
+ * @param color The color to use. If this is <code>null</code>, then no
+ * special background is painted behind a matched bracket.
+ * @see #getMatchedBracketBGColor
+ * @see #setMatchedBracketBorderColor
+ * @see #setPaintMarkOccurrencesBorder(boolean)
+ */
+ public void setMatchedBracketBGColor(Color color) {
+ matchedBracketBGColor = color;
+ if (match!=null) {
+ repaint();
+ }
+ }
+
+
+ /**
+ * Sets the color used as the border for a matched bracket.
+ *
+ * @param color The color to use.
+ * @see #getMatchedBracketBorderColor
+ * @see #setMatchedBracketBGColor
+ */
+ public void setMatchedBracketBorderColor(Color color) {
+ matchedBracketBorderColor = color;
+ if (match!=null) {
+ repaint();
+ }
+ }
+
+
+ /**
+ * Toggles whether a border should be painted around marked occurrences.
+ *
+ * @param paintBorder Whether to paint a border.
+ * @see #getPaintMarkOccurrencesBorder()
+ * @see #setMarkOccurrencesColor(Color)
+ * @see #setMarkOccurrences(boolean)
+ */
+ public void setPaintMarkOccurrencesBorder(boolean paintBorder) {
+ paintMarkOccurrencesBorder = paintBorder;
+ if (markOccurrencesSupport!=null) {
+ markOccurrencesSupport.setPaintBorder(paintBorder);
+ }
+ }
+
+
+ /**
+ * Sets whether the bracket at the caret position is painted as a "match"
+ * when a matched bracket is found. Note that this property does nothing
+ * if {@link #isBracketMatchingEnabled()} returns <code>false</code>.<p>
+ *
+ * This method fires a property change event of type
+ * {@link #PAINT_MATCHED_BRACKET_PAIR_PROPERTY}.
+ *
+ * @param paintPair Whether both brackets in a bracket pair should be
+ * highlighted when bracket matching is enabled.
+ * @see #getPaintMatchedBracketPair()
+ * @see #isBracketMatchingEnabled()
+ * @see #setBracketMatchingEnabled(boolean)
+ */
+ public void setPaintMatchedBracketPair(boolean paintPair) {
+ if (paintPair!=paintMatchedBracketPair) {
+ paintMatchedBracketPair = paintPair;
+ doBracketMatching();
+ repaint();
+ firePropertyChange(PAINT_MATCHED_BRACKET_PAIR_PROPERTY,
+ !paintMatchedBracketPair, paintMatchedBracketPair);
+ }
+ }
+
+
+ /**
+ * Toggles whether tab lines are painted. This method fires a property
+ * change event of type {@link #TAB_LINES_PROPERTY}.
+ *
+ * @param paint Whether tab lines are painted.
+ * @see #getPaintTabLines()
+ * @see #setTabLineColor(Color)
+ */
+ public void setPaintTabLines(boolean paint) {
+ if (paint!=paintTabLines) {
+ paintTabLines = paint;
+ repaint();
+ firePropertyChange(TAB_LINES_PROPERTY, !paint, paint);
+ }
+ }
+
+
+ /**
+ * Sets the background color to use for a secondary language.
+ *
+ * @param index The language index. Note that these are 1-based, not
+ * 0-based, and should be in the range
+ * <code>1-getSecondaryLanguageCount()</code>, inclusive.
+ * @param color The new color, or <code>null</code> for none.
+ * @see #getSecondaryLanguageBackground(int)
+ * @see #getSecondaryLanguageCount()
+ */
+ public void setSecondaryLanguageBackground(int index, Color color) {
+ index--;
+ Color old = secondaryLanguageBackgrounds[index];
+ if ((color==null && old!=null) || (color!=null && !color.equals(old))) {
+ secondaryLanguageBackgrounds[index] = color;
+ if (getHighlightSecondaryLanguages()) {
+ repaint();
+ }
+ }
+ }
+
+
+ /**
+ * Sets what type of syntax highlighting this editor is doing. This method
+ * fires a property change of type {@link #SYNTAX_STYLE_PROPERTY}.
+ *
+ * @param styleKey The syntax editing style to use, for example,
+ * {@link SyntaxConstants#SYNTAX_STYLE_NONE} or
+ * {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+ * @see #getSyntaxEditingStyle()
+ * @see SyntaxConstants
+ */
+ public void setSyntaxEditingStyle(String styleKey) {
+ if (styleKey==null) {
+ styleKey = SYNTAX_STYLE_NONE;
+ }
+ if (!styleKey.equals(syntaxStyleKey)) {
+ String oldStyle = syntaxStyleKey;
+ syntaxStyleKey = styleKey;
+ ((RSyntaxDocument)getDocument()).setSyntaxStyle(styleKey);
+ firePropertyChange(SYNTAX_STYLE_PROPERTY, oldStyle, styleKey);
+ setActiveLineRange(-1, -1);
+ }
+
+ }
+
+
+ /**
+ * Sets all of the colors used in syntax highlighting to the colors
+ * specified. This uses a shallow copy of the color scheme so that
+ * multiple text areas can share the same color scheme and have their
+ * properties changed simultaneously.<p>
+ *
+ * This method fires a property change event of type
+ * {@link #SYNTAX_SCHEME_PROPERTY}.
+ *
+ * @param scheme The instance of <code>SyntaxScheme</code> to use.
+ * @see #getSyntaxScheme()
+ */
+ public void setSyntaxScheme(SyntaxScheme scheme) {
+
+ // NOTE: We don't check whether colorScheme is the same as the
+ // current scheme because DecreaseFontSizeAction and
+ // IncreaseFontSizeAction need it this way.
+ // FIXME: Find a way around this.
+
+ SyntaxScheme old = this.syntaxScheme;
+ this.syntaxScheme = scheme;
+
+ // Recalculate the line height. We do this here instead of in
+ // refreshFontMetrics() as this method is called less often and we
+ // don't need the rendering hints to get the font's height.
+ calculateLineHeight();
+
+ if (isDisplayable()) {
+ refreshFontMetrics(getGraphics2D(getGraphics()));
+ }
+
+ // Updates the margin line.
+ updateMarginLineX();
+
+ // Force the current line highlight to be repainted, even though
+ // the caret's location hasn't changed.
+ forceCurrentLineHighlightRepaint();
+
+ // So encompassing JScrollPane will have its scrollbars updated.
+ revalidate();
+
+ firePropertyChange(SYNTAX_SCHEME_PROPERTY, old, this.syntaxScheme);
+
+ }
+
+
+ /**
+ * If templates are enabled, all currently-known templates are forgotten
+ * and all templates are loaded from all files in the specified directory
+ * ending in "*.xml". If templates aren't enabled, nothing happens.
+ *
+ * @param dir The directory containing files ending in extension
+ * <code>.xml</code> that contain templates to load.
+ * @return <code>true</code> if the load was successful;
+ * <code>false</code> if either templates aren't currently
+ * enabled or the load failed somehow (most likely, the
+ * directory doesn't exist).
+ * @see #getTemplatesEnabled
+ * @see #setTemplatesEnabled
+ * @see #saveTemplates
+ */
+ public static synchronized boolean setTemplateDirectory(String dir) {
+ if (getTemplatesEnabled() && dir!=null) {
+ File directory = new File(dir);
+ if (directory.isDirectory()) {
+ return getCodeTemplateManager().
+ setTemplateDirectory(directory)>-1;
+ }
+ boolean created = directory.mkdir();
+ if (created) {
+ return getCodeTemplateManager().
+ setTemplateDirectory(directory)>-1;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Enables or disables templates.<p>
+ *
+ * Templates are a set of "shorthand identifiers" that you can configure
+ * so that you only have to type a short identifier (such as "forb") to
+ * insert a larger amount of code into the document (such as:<p>
+ *
+ * <pre>
+ * for (<caret>) {
+ *
+ * }
+ * </pre>
+ *
+ * Templates are a shared resource among all instances of
+ * <code>RSyntaxTextArea</code>; that is, templates can only be
+ * enabled/disabled for all text areas globally, not individually, and
+ * all text areas have access of the same templates. This should not
+ * be an issue; rather, it should be beneficial as it promotes
+ * uniformity among all text areas in an application.
+ *
+ * @param enabled Whether or not templates should be enabled.
+ * @see #getTemplatesEnabled()
+ */
+ public static synchronized void setTemplatesEnabled(boolean enabled) {
+ templatesEnabled = enabled;
+ }
+
+
+ /**
+ * Sets the color use to paint tab lines. This method fires a property
+ * change event of type {@link #TAB_LINE_COLOR_PROPERTY}.
+ *
+ * @param c The color. If this value is <code>null</code>, the default
+ * (gray) is used.
+ * @see #getTabLineColor()
+ * @see #setPaintTabLines(boolean)
+ * @see #getPaintTabLines()
+ */
+ public void setTabLineColor(Color c) {
+
+ if (c==null) {
+ c = Color.gray;
+ }
+
+ if (!c.equals(tabLineColor)) {
+ Color old = tabLineColor;
+ tabLineColor = c;
+ if (getPaintTabLines()) {
+ repaint();
+ }
+ firePropertyChange(TAB_LINE_COLOR_PROPERTY, old, tabLineColor);
+ }
+
+ }
+
+
+ /**
+ * Sets whether "focusable" tool tips are used instead of standard ones.
+ * Focusable tool tips are tool tips that the user can click on,
+ * resize, copy from, and clink links in. This method fires a property
+ * change event of type {@link #FOCUSABLE_TIPS_PROPERTY}.
+ *
+ * @param use Whether to use focusable tool tips.
+ * @see #getUseFocusableTips()
+ * @see FocusableTip
+ */
+ public void setUseFocusableTips(boolean use) {
+ if (use!=useFocusableTips) {
+ useFocusableTips = use;
+ firePropertyChange(FOCUSABLE_TIPS_PROPERTY, !use, use);
+ }
+ }
+
+
+ /**
+ * Sets whether selected text should use the "selected text color" property
+ * (set via {@link #setSelectedTextColor(Color)}). This is the typical
+ * behavior of text components. By default, RSyntaxTextArea does not do
+ * this, so that token styles are visible even in selected regions of text.
+ * This method fires a property change event of type
+ * {@link #USE_SELECTED_TEXT_COLOR_PROPERTY}.
+ *
+ * @param use Whether to use the "selected text" color when painting text
+ * in selected regions.
+ * @see #getUseSelectedTextColor()
+ */
+ public void setUseSelectedTextColor(boolean use) {
+ if (use!=useSelectedTextColor) {
+ useSelectedTextColor = use;
+ firePropertyChange(USE_SELECTED_TEXT_COLOR_PROPERTY, !use, use);
+ }
+ }
+
+
+ /**
+ * Sets whether whitespace is visible. This method fires a property change
+ * of type {@link #VISIBLE_WHITESPACE_PROPERTY}.
+ *
+ * @param visible Whether whitespace should be visible.
+ * @see #isWhitespaceVisible()
+ */
+ public void setWhitespaceVisible(boolean visible) {
+ if (whitespaceVisible!=visible) {
+ this.whitespaceVisible = visible;
+ tokenPainter = visible ? new VisibleWhitespaceTokenPainter() :
+ (TokenPainter)new DefaultTokenPainter();
+ repaint();
+ firePropertyChange(VISIBLE_WHITESPACE_PROPERTY, !visible, visible);
+ }
+ }
+
+
+ /**
+ * Resets the editor state after the user clicks on a hyperlink or releases
+ * the hyperlink modifier.
+ */
+ private void stopScanningForLinks() {
+ if (isScanningForLinks) {
+ Cursor c = getCursor();
+ isScanningForLinks = false;
+ linkGeneratorResult = null;
+ hoveredOverLinkOffset = -1;
+ if (c!=null && c.getType()==Cursor.HAND_CURSOR) {
+ setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
+ repaint(); // TODO: Repaint just the affected line.
+ }
+ }
+ }
+
+
+ /**
+ * Returns the token at the specified position in the view.
+ *
+ * @param p The position in the view.
+ * @return The token, or <code>null</code> if no token is at that
+ * position.
+ * @see #modelToToken(int)
+ */
+ /*
+ * TODO: This is a little inefficient. This should convert view
+ * coordinates to the underlying token (if any). The way things currently
+ * are, we're calling getTokenListForLine() twice (once in viewToModel()
+ * and once here).
+ */
+ public Token viewToToken(Point p) {
+ return modelToToken(viewToModel(p));
+ }
+
+
+ /**
+ * A timer that animates the "bracket matching" animation.
+ */
+ private class BracketMatchingTimer extends Timer implements ActionListener {
+
+ private int pulseCount;
+
+ public BracketMatchingTimer() {
+ super(20, null);
+ addActionListener(this);
+ setCoalesce(false);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (isBracketMatchingEnabled()) {
+ if (match!=null) {
+ updateAndInvalidate(match);
+ }
+ if (dotRect!=null && getPaintMatchedBracketPair()) {
+ updateAndInvalidate(dotRect);
+ }
+ if (++pulseCount==8) {
+ pulseCount = 0;
+ stop();
+ }
+ }
+ }
+
+ private void init(Rectangle r) {
+ r.x += 3;
+ r.y += 3;
+ r.width -= 6;
+ r.height -= 6; // So animation can "grow" match
+ }
+
+ public void start() {
+ init(match);
+ if (dotRect!=null && getPaintMatchedBracketPair()) {
+ init(dotRect);
+ }
+ pulseCount = 0;
+ super.start();
+ }
+
+ private void updateAndInvalidate(Rectangle r) {
+ if (pulseCount<5) {
+ r.x--;
+ r.y--;
+ r.width += 2;
+ r.height += 2;
+ repaint(r.x,r.y, r.width,r.height);
+ }
+ else if (pulseCount<7) {
+ r.x++;
+ r.y++;
+ r.width -= 2;
+ r.height -= 2;
+ repaint(r.x-2,r.y-2, r.width+5,r.height+5);
+ }
+ }
+
+ }
+
+
+ /**
+ * Handles hyperlinks.
+ */
+ private class RSyntaxTextAreaMutableCaretEvent
+ extends RTextAreaMutableCaretEvent {
+
+ protected RSyntaxTextAreaMutableCaretEvent(RTextArea textArea) {
+ super(textArea);
+ }
+
+ private HyperlinkEvent createHyperlinkEvent() {
+ HyperlinkEvent he = null;
+ if (linkGeneratorResult!=null) {
+ he = linkGeneratorResult.execute();
+ linkGeneratorResult = null;
+ }
+ else {
+ Token t = modelToToken(hoveredOverLinkOffset);
+ URL url = null;
+ String desc = null;
+ try {
+ String temp = t.getLexeme();
+ // URI's need "http://" prefix for web URL's to work.
+ if (temp.startsWith("www.")) {
+ temp = "http://" + temp;
+ }
+ url = new URL(temp);
+ } catch (MalformedURLException mue) {
+ desc = mue.getMessage();
+ }
+ he = new HyperlinkEvent(RSyntaxTextArea.this,
+ HyperlinkEvent.EventType.ACTIVATED,
+ url, desc);
+ }
+ return he;
+ }
+
+ private final boolean equal(LinkGeneratorResult e1,
+ LinkGeneratorResult e2) {
+ return e1.getSourceOffset()==e2.getSourceOffset();
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ if (getHyperlinksEnabled() && isScanningForLinks &&
+ hoveredOverLinkOffset>-1) {
+ HyperlinkEvent he = createHyperlinkEvent();
+ if (he!=null) {
+ fireHyperlinkUpdate(he);
+ }
+ stopScanningForLinks();
+ }
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ super.mouseMoved(e);
+ if (getHyperlinksEnabled()) {
+ if ((e.getModifiersEx()&linkScanningMask)!=0) {
+ isScanningForLinks = true;
+ Token t = viewToToken(e.getPoint());
+ Cursor c2 = null;
+ if (t!=null && t.isHyperlink()) {
+ hoveredOverLinkOffset = t.offset;
+ c2 = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+ }
+ else if (t!=null && linkGenerator!=null) {
+ int offs = viewToModel(e.getPoint());
+ LinkGeneratorResult newResult = linkGenerator.
+ isLinkAtOffset(RSyntaxTextArea.this, offs);
+ if (newResult!=null) {
+ // Repaint if we're at a new link now.
+ if (linkGeneratorResult==null ||
+ !equal(newResult, linkGeneratorResult)) {
+ repaint();
+ }
+ linkGeneratorResult = newResult;
+ hoveredOverLinkOffset = t.offset;
+ c2 = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+ }
+ else {
+ // Repaint if we've moved off of a link.
+ if (linkGeneratorResult!=null) {
+ repaint();
+ }
+ c2 = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
+ hoveredOverLinkOffset = -1;
+ linkGeneratorResult = null;
+ }
+ }
+ else {
+ c2 = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
+ hoveredOverLinkOffset = -1;
+ linkGeneratorResult = null;
+ }
+ if (getCursor()!=c2) {
+ setCursor(c2);
+ // TODO: Repaint just the affected line(s).
+ repaint(); // Link either left or went into.
+ }
+ }
+ else {
+ if (isScanningForLinks) {
+ stopScanningForLinks();
+ }
+ }
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
new file mode 100644
index 0000000..f8866c8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
@@ -0,0 +1,79 @@
+/*
+ * 10/27/2004
+ *
+ * RSyntaxTextAreaDefaultInputMap.java - The default input map for
+ * RSyntaxTextAreas.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.KeyStroke;
+
+import org.fife.ui.rtextarea.RTADefaultInputMap;
+
+
+/**
+ * The default input map for an <code>RSyntaxTextArea</code>.
+ * Currently, the new key bindings include:
+ * <ul>
+ * <li>Shift+Tab indents the current line or currently selected lines
+ * to the left.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaDefaultInputMap extends RTADefaultInputMap {
+
+ /**
+ * Constructs the default input map for an <code>RSyntaxTextArea</code>.
+ */
+ public RSyntaxTextAreaDefaultInputMap() {
+
+ int defaultMod = getDefaultModifier();
+ //int ctrl = InputEvent.CTRL_MASK;
+ int shift = InputEvent.SHIFT_MASK;
+ //int alt = InputEvent.ALT_MASK;
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, shift), RSyntaxTextAreaEditorKit.rstaDecreaseIndentAction);
+ put(KeyStroke.getKeyStroke('}'), RSyntaxTextAreaEditorKit.rstaCloseCurlyBraceAction);
+
+ put(KeyStroke.getKeyStroke('/'), RSyntaxTextAreaEditorKit.rstaCloseMarkupTagAction);
+ int os = RSyntaxUtilities.getOS();
+ if (os==RSyntaxUtilities.OS_WINDOWS || os==RSyntaxUtilities.OS_MAC_OSX) {
+ // *nix causes trouble with CloseMarkupTagAction and ToggleCommentAction.
+ // It triggers both KEY_PRESSED ctrl+'/' and KEY_TYPED '/' events when the
+ // user presses ctrl+'/', but Windows and OS X do not. If we try to "move"
+ // the KEY_TYPED event for '/' to KEY_PRESSED, it'll work for Linux boxes
+ // with QWERTY keyboard layouts, but non-QUERTY users won't be able to type
+ // a '/' character at all then (!). Rather than try to hack together a
+ // solution by trying to detect the IM locale and do different things for
+ // different OSes & keyboard layouts, we do the simplest thing and
+ // (unfortunately) don't have a ToggleCommentAction for *nix out-of-the-box.
+ // Applications can add one easily enough if they want one.
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, defaultMod), RSyntaxTextAreaEditorKit.rstaToggleCommentAction);
+ }
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, defaultMod), RSyntaxTextAreaEditorKit.rstaGoToMatchingBracketAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, defaultMod), RSyntaxTextAreaEditorKit.rstaCollapseFoldAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, defaultMod), RSyntaxTextAreaEditorKit.rstaExpandFoldAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DIVIDE, defaultMod), RSyntaxTextAreaEditorKit.rstaCollapseAllFoldsAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_MULTIPLY, defaultMod), RSyntaxTextAreaEditorKit.rstaExpandAllFoldsAction);
+
+ // FIXME: The keystroke associated with this action should be dynamic and
+ // configurable and synchronized with the "trigger" defined in RSyntaxTextArea's
+ // CodeTemplateManager.
+ // NOTE: no modifiers => mapped to keyTyped. If we had "0" as a second
+ // second parameter, we'd get the template action (keyPressed) AND the
+ // default space action (keyTyped).
+ //put(KeyStroke.getKeyStroke(' '), RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+ put(CodeTemplateManager.TEMPLATE_KEYSTROKE, RSyntaxTextAreaEditorKit.rstaPossiblyInsertTemplateAction);
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java
new file mode 100644
index 0000000..519c7d1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java
@@ -0,0 +1,1903 @@
+/*
+ * 08/29/2004
+ *
+ * RSyntaxTextAreaEditorKit.java - The editor kit used by RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ResourceBundle;
+import java.util.Stack;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldCollapser;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rsyntaxtextarea.templates.CodeTemplate;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.IconRowHeader;
+import org.fife.ui.rtextarea.RecordableTextAction;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of <code>RTextAreaEditorKit</code> that adds functionality for
+ * programming-specific stuff. There are currently subclasses to handle:
+ *
+ * <ul>
+ * <li>Toggling code folds.</li>
+ * <li>Aligning "closing" curly braces with their matches, if the current
+ * programming language uses curly braces to identify code blocks.</li>
+ * <li>Copying the current selection as RTF.</li>
+ * <li>Block indentation (increasing the indent of one or multiple lines)</li>
+ * <li>Block un-indentation (decreasing the indent of one or multiple lines)
+ * </li>
+ * <li>Inserting a "code template" when a configurable key (e.g. a space) is
+ * pressed</li>
+ * <li>Decreasing the point size of all fonts in the text area</li>
+ * <li>Increasing the point size of all fonts in the text area</li>
+ * <li>Moving the caret to the "matching bracket" of the one at the current
+ * caret position</li>
+ * <li>Toggling whether the currently selected lines are commented out.</li>
+ * <li>Better selection of "words" on mouse double-clicks for programming
+ * languages.</li>
+ * <li>Better keyboard navigation via Ctrl+arrow keys for programming
+ * languages.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RSyntaxTextAreaEditorKit extends RTextAreaEditorKit {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String rstaCloseCurlyBraceAction = "RSTA.CloseCurlyBraceAction";
+ public static final String rstaCloseMarkupTagAction = "RSTA.CloseMarkupTagAction";
+ public static final String rstaCollapseAllFoldsAction = "RSTA.CollapseAllFoldsAction";
+ public static final String rstaCollapseAllCommentFoldsAction = "RSTA.CollapseAllCommentFoldsAction";
+ public static final String rstaCollapseFoldAction = "RSTA.CollapseFoldAction";
+ public static final String rstaCopyAsRtfAction = "RSTA.CopyAsRtfAction";
+ public static final String rstaDecreaseIndentAction = "RSTA.DecreaseIndentAction";
+ public static final String rstaExpandAllFoldsAction = "RSTA.ExpandAllFoldsAction";
+ public static final String rstaExpandFoldAction = "RSTA.ExpandFoldAction";
+ public static final String rstaGoToMatchingBracketAction = "RSTA.GoToMatchingBracketAction";
+ public static final String rstaPossiblyInsertTemplateAction = "RSTA.TemplateAction";
+ public static final String rstaToggleCommentAction = "RSTA.ToggleCommentAction";
+ public static final String rstaToggleCurrentFoldAction = "RSTA.ToggleCurrentFoldAction";
+
+ private static final String MSG = "org.fife.ui.rsyntaxtextarea.RSyntaxTextArea";
+ private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+ /**
+ * The actions that <code>RSyntaxTextAreaEditorKit</code> adds to those of
+ * <code>RTextAreaEditorKit</code>.
+ */
+ private static final Action[] defaultActions = {
+ new CloseCurlyBraceAction(),
+ new CloseMarkupTagAction(),
+ new BeginWordAction(beginWordAction, false),
+ new BeginWordAction(selectionBeginWordAction, true),
+ new ChangeFoldStateAction(rstaCollapseFoldAction, true),
+ new ChangeFoldStateAction(rstaExpandFoldAction, false),
+ new CollapseAllFoldsAction(),
+ new CopyAsRtfAction(),
+ //new DecreaseFontSizeAction(),
+ new DecreaseIndentAction(),
+ new DeletePrevWordAction(),
+ new EndAction(endAction, false),
+ new EndAction(selectionEndAction, true),
+ new EndWordAction(endWordAction, false),
+ new EndWordAction(endWordAction, true),
+ new ExpandAllFoldsAction(),
+ new GoToMatchingBracketAction(),
+ new InsertBreakAction(),
+ //new IncreaseFontSizeAction(),
+ new InsertTabAction(),
+ new NextWordAction(nextWordAction, false),
+ new NextWordAction(selectionNextWordAction, true),
+ new PossiblyInsertTemplateAction(),
+ new PreviousWordAction(previousWordAction, false),
+ new PreviousWordAction(selectionPreviousWordAction, true),
+ new SelectWordAction(),
+ new ToggleCommentAction(),
+ };
+
+
+ /**
+ * Constructor.
+ */
+ public RSyntaxTextAreaEditorKit() {
+ }
+
+
+ /**
+ * Returns the default document used by <code>RSyntaxTextArea</code>s.
+ *
+ * @return The document.
+ */
+ public Document createDefaultDocument() {
+ return new RSyntaxDocument(SyntaxConstants.SYNTAX_STYLE_NONE);
+ }
+
+
+ /**
+ * Overridden to return a row header that is aware of folding.
+ *
+ * @param textArea The text area.
+ * @return The icon row header.
+ */
+ public IconRowHeader createIconRowHeader(RTextArea textArea) {
+ return new FoldingAwareIconRowHeader((RSyntaxTextArea)textArea);
+ }
+
+
+ /**
+ * Fetches the set of commands that can be used
+ * on a text component that is using a model and
+ * view produced by this kit.
+ *
+ * @return the command list
+ */
+ public Action[] getActions() {
+ return TextAction.augmentList(super.getActions(),
+ RSyntaxTextAreaEditorKit.defaultActions);
+ }
+
+
+ /**
+ * Returns localized text for an action. There's definitely a better place
+ * for this functionality.
+ *
+ * @param key The key into the action resource bundle.
+ * @return The localized text.
+ */
+ public static String getString(String key) {
+ return msg.getString(key);
+ }
+
+
+ /**
+ * Positions the caret at the beginning of the word. This class is here
+ * to better handle finding the "beginning of the word" for programming
+ * languages.
+ */
+ protected static class BeginWordAction
+ extends RTextAreaEditorKit.BeginWordAction {
+
+ private Segment seg;
+
+ protected BeginWordAction(String name, boolean select) {
+ super(name, select);
+ seg = new Segment();
+ }
+
+ protected int getWordStart(RTextArea textArea, int offs)
+ throws BadLocationException {
+
+ if (offs==0) {
+ return offs;
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ int line = textArea.getLineOfOffset(offs);
+ int start = textArea.getLineStartOffset(line);
+ if (offs==start) {
+ return start;
+ }
+ int end = textArea.getLineEndOffset(line);
+ if (line!=textArea.getLineCount()-1) {
+ end--;
+ }
+ doc.getText(start, end-start, seg);
+
+ // Determine the "type" of char at offs - lower case, upper case,
+ // whitespace or other. We take special care here as we're starting
+ // in the middle of the Segment to check whether we're already at
+ // the "beginning" of a word.
+ int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+ seg.setIndex(firstIndex);
+ char ch = seg.current();
+ char nextCh = offs==end ? 0 : seg.array[seg.getIndex() + 1];
+
+ // The "word" is a group of letters and/or digits
+ if (Character.isLetterOrDigit(ch)) {
+ if (offs!=end && !Character.isLetterOrDigit(nextCh)) {
+ return offs;
+ }
+ do {
+ ch = seg.previous();
+ } while (Character.isLetterOrDigit(ch));
+ }
+
+ // The "word" is whitespace
+ else if (Character.isWhitespace(ch)) {
+ if (offs!=end && !Character.isWhitespace(nextCh)) {
+ return offs;
+ }
+ do {
+ ch = seg.previous();
+ } while (Character.isWhitespace(ch));
+ }
+
+ // Otherwise, the "word" a single "something else" char (operator,
+ // etc.).
+
+ offs -= firstIndex - seg.getIndex() + 1;//seg.getEndIndex() - seg.getIndex();
+ if (ch!=Segment.DONE && nextCh!='\n') {
+ offs++;
+ }
+
+ return offs;
+
+ }
+
+ }
+
+
+ /**
+ * Expands or collapses the nearest fold.
+ */
+ public static class ChangeFoldStateAction extends FoldRelatedAction {
+
+ private boolean collapse;
+
+ public ChangeFoldStateAction(String name, boolean collapse) {
+ super(name);
+ this.collapse = collapse;
+ }
+
+ public ChangeFoldStateAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ Fold fold = getClosestFold(rsta);
+ if (fold!=null) {
+ fold.setCollapsed(collapse);
+ }
+ possiblyRepaintGutter(textArea);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action that (optionally) aligns a closing curly brace with the line
+ * containing its matching opening curly brace.
+ */
+ public static class CloseCurlyBraceAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ private Point bracketInfo;
+ private Segment seg;
+
+ public CloseCurlyBraceAction() {
+ super(rstaCloseCurlyBraceAction);
+ seg = new Segment();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+ boolean alignCurlyBraces = rsta.isAutoIndentEnabled() &&
+ doc.getCurlyBracesDenoteCodeBlocks();
+
+ if (alignCurlyBraces) {
+ textArea.beginAtomicEdit();
+ }
+
+ try {
+
+ textArea.replaceSelection("}");
+
+ // If the user wants to align curly braces...
+ if (alignCurlyBraces) {
+
+ Element root = doc.getDefaultRootElement();
+ int dot = rsta.getCaretPosition() - 1; // Start before '{'
+ int line = root.getElementIndex(dot);
+ Element elem = root.getElement(line);
+ int start = elem.getStartOffset();
+
+ // Get the current line's text up to the '}' entered.
+ try {
+ doc.getText(start, dot-start, seg);
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ return;
+ }
+
+ // Only attempt to align if there's only whitespace up to
+ // the '}' entered.
+ for (int i=0; i<seg.count; i++) {
+ char ch = seg.array[seg.offset+i];
+ if (!Character.isWhitespace(ch)) {
+ return;
+ }
+ }
+
+ // Locate the matching '{' bracket, and replace the leading
+ // whitespace for the '}' to match that of the '{' char's line.
+ bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(
+ rsta, bracketInfo);
+ if (bracketInfo.y>-1) {
+ try {
+ String ws = RSyntaxUtilities.getLeadingWhitespace(
+ doc, bracketInfo.y);
+ rsta.replaceRange(ws, start, dot);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ return;
+ }
+ }
+
+ }
+
+ } finally {
+ if (alignCurlyBraces) {
+ textArea.endAtomicEdit();
+ }
+ }
+
+ }
+
+ public final String getMacroID() {
+ return rstaCloseCurlyBraceAction;
+ }
+
+ }
+
+
+ /**
+ * (Optionally) completes a closing markup tag.
+ */
+ public static class CloseMarkupTagAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public CloseMarkupTagAction() {
+ super(rstaCloseMarkupTagAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument();
+
+ Caret c = rsta.getCaret();
+ boolean selection = c.getDot()!=c.getMark();
+ rsta.replaceSelection("/");
+
+ // Don't automatically complete a tag if there was a selection
+ int dot = c.getDot();
+
+ if (doc.getLanguageIsMarkup() &&
+ doc.getCompleteMarkupCloseTags() &&
+ !selection && rsta.getCloseMarkupTags() && dot>1) {
+
+ try {
+
+ // Check actual char before token type, since it's quicker
+ char ch = doc.charAt(dot-2);
+ if (ch=='<' || ch=='[') {
+
+ Token t = doc.getTokenListForLine(
+ rsta.getCaretLineNumber());
+ t = RSyntaxUtilities.getTokenAtOffset(t, dot-1);
+ if (t!=null && t.type==Token.MARKUP_TAG_DELIMITER) {
+ //System.out.println("Huzzah - closing tag!");
+ String tagName = discoverTagName(doc, dot);
+ if (tagName!=null) {
+ rsta.replaceSelection(tagName + (char)(ch+2));
+ }
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ ble.printStackTrace();
+ }
+
+ }
+
+ }
+
+ /**
+ * Discovers the name of the tag being closed. Assumes standard
+ * SGML-style markup tags.
+ *
+ * @param doc The document to parse.
+ * @param dot The location of the caret. This should be right after
+ * the start of a closing tag token (e.g. "<code></</code>"
+ * or "<code>[</code>" in the case of BBCode).
+ * @return The name of the tag to close, or <code>null</code> if it
+ * could not be determined.
+ */
+ private String discoverTagName(RSyntaxDocument doc, int dot) {
+
+ Stack stack = new Stack();
+
+ Element root = doc.getDefaultRootElement();
+ int curLine = root.getElementIndex(dot);
+
+ for (int i=0; i<=curLine; i++) {
+
+ Token t = doc.getTokenListForLine(i);
+ while (t!=null && t.isPaintable()) {
+
+ if (t.type==Token.MARKUP_TAG_DELIMITER) {
+ if (t.isSingleChar('<') || t.isSingleChar('[')) {
+ t = t.getNextToken();
+ while (t!=null && t.isPaintable()) {
+ if (t.type==Token.MARKUP_TAG_NAME ||
+ // Being lenient here and also checking
+ // for attributes, in case they
+ // (incorrectly) have whitespace between
+ // the '<' char and the element name.
+ t.type==Token.MARKUP_TAG_ATTRIBUTE) {
+ stack.push(t.getLexeme());
+ break;
+ }
+ t = t.getNextToken();
+ }
+ }
+ else if (t.textCount==2 && t.text[t.textOffset]=='/' &&
+ (t.text[t.textOffset+1]=='>' ||
+ t.text[t.textOffset+1]==']')) {
+ if (!stack.isEmpty()) { // Always true for valid XML
+ stack.pop();
+ }
+ }
+ else if (t.textCount==2 &&
+ (t.text[t.textOffset]=='<' || t.text[t.textOffset]=='[') &&
+ t.text[t.textOffset+1]=='/') {
+ String tagName = null;
+ if (!stack.isEmpty()) { // Always true for valid XML
+ tagName = (String)stack.pop();
+ }
+ if (t.offset+t.textCount>=dot) {
+ return tagName;
+ }
+ }
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ return null; // Should never happen
+
+ }
+
+ public String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Collapses all comment folds.
+ */
+ public static class CollapseAllCommentFoldsAction extends FoldRelatedAction{
+
+ private static final long serialVersionUID = 1L;
+
+ public CollapseAllCommentFoldsAction() {
+ super(rstaCollapseAllCommentFoldsAction);
+ setProperties(msg, "Action.CollapseCommentFolds");
+ }
+
+ public CollapseAllCommentFoldsAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ FoldCollapser collapser = new FoldCollapser();
+ collapser.collapseFolds(rsta.getFoldManager());
+ possiblyRepaintGutter(textArea);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaCollapseAllCommentFoldsAction;
+ }
+
+ }
+
+
+ /**
+ * Collapses all folds.
+ */
+ public static class CollapseAllFoldsAction extends FoldRelatedAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public CollapseAllFoldsAction() {
+ this(false);
+ }
+
+ public CollapseAllFoldsAction(boolean localizedName) {
+ super(rstaCollapseAllFoldsAction);
+ if (localizedName) {
+ setProperties(msg, "Action.CollapseAllFolds");
+ }
+ }
+
+ public CollapseAllFoldsAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ FoldCollapser collapser = new FoldCollapser() {
+ public boolean getShouldCollapse(Fold fold) {
+ return true;
+ }
+ };
+ collapser.collapseFolds(rsta.getFoldManager());
+ possiblyRepaintGutter(textArea);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaCollapseAllFoldsAction;
+ }
+
+ }
+
+
+ /**
+ * Action for copying text as RTF.
+ */
+ public static class CopyAsRtfAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public CopyAsRtfAction() {
+ super(rstaCopyAsRtfAction);
+ }
+
+ public CopyAsRtfAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ ((RSyntaxTextArea)textArea).copyAsRtf();
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action for decreasing the font size of all fonts in the text area.
+ */
+ public static class DecreaseFontSizeAction
+ extends RTextAreaEditorKit.DecreaseFontSizeAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public DecreaseFontSizeAction() {
+ super();
+ }
+
+ public DecreaseFontSizeAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+ // All we need to do is update all of the fonts in syntax
+ // schemes, then call setSyntaxHighlightingColorScheme with the
+ // same scheme already being used. This relies on the fact that
+ // that method does not check whether the new scheme is different
+ // from the old scheme before updating.
+
+ boolean changed = false;
+ int count = scheme.getStyleCount();
+ for (int i=0; i<count; i++) {
+ Style ss = scheme.getStyle(i);
+ if (ss!=null) {
+ Font font = ss.font;
+ if (font!=null) {
+ float oldSize = font.getSize2D();
+ float newSize = oldSize - decreaseAmount;
+ if (newSize>=MINIMUM_SIZE) {
+ // Shrink by decreaseAmount.
+ ss.font = font.deriveFont(newSize);
+ changed = true;
+ }
+ else if (oldSize>MINIMUM_SIZE) {
+ // Can't shrink by full decreaseAmount, but
+ // can shrink a little bit.
+ ss.font = font.deriveFont(MINIMUM_SIZE);
+ changed = true;
+ }
+ }
+ }
+ }
+
+ // Do the text area's font also.
+ Font font = rsta.getFont();
+ float oldSize = font.getSize2D();
+ float newSize = oldSize - decreaseAmount;
+ if (newSize>=MINIMUM_SIZE) {
+ // Shrink by decreaseAmount.
+ rsta.setFont(font.deriveFont(newSize));
+ changed = true;
+ }
+ else if (oldSize>MINIMUM_SIZE) {
+ // Can't shrink by full decreaseAmount, but
+ // can shrink a little bit.
+ rsta.setFont(font.deriveFont(MINIMUM_SIZE));
+ changed = true;
+ }
+
+ // If we updated at least one font, update the screen. If
+ // all of the fonts were already the minimum size, beep.
+ if (changed) {
+ rsta.setSyntaxScheme(scheme);
+ // NOTE: This is a hack to get an encompassing
+ // RTextScrollPane to repaint its line numbers to account
+ // for a change in line height due to a font change. I'm
+ // not sure why we need to do this here but not when we
+ // change the syntax highlighting color scheme via the
+ // Options dialog... setSyntaxHighlightingColorScheme()
+ // calls revalidate() which won't repaint the scroll pane
+ // if scrollbars don't change, which is why we need this.
+ Component parent = rsta.getParent();
+ if (parent instanceof javax.swing.JViewport) {
+ parent = parent.getParent();
+ if (parent instanceof JScrollPane) {
+ parent.repaint();
+ }
+ }
+ }
+ else
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+ }
+
+ }
+
+
+ /**
+ * Action for when un-indenting lines (either the current line if there is
+ * selection, or all selected lines if there is one).
+ */
+ public static class DecreaseIndentAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ private Segment s;
+
+ public DecreaseIndentAction() {
+ this(rstaDecreaseIndentAction);
+ }
+
+ public DecreaseIndentAction(String name) {
+ super(name);
+ s = new Segment();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ Document document = textArea.getDocument();
+ Element map = document.getDefaultRootElement();
+ Caret c = textArea.getCaret();
+ int dot = c.getDot();
+ int mark = c.getMark();
+ int line1 = map.getElementIndex(dot);
+ int tabSize = textArea.getTabSize();
+
+ // If there is a selection, indent all lines in the selection.
+ // Otherwise, indent the line the caret is on.
+ if (dot!=mark) {
+ // Note that we cheaply reuse variables here, so don't
+ // take their names to mean what they are.
+ int line2 = map.getElementIndex(mark);
+ dot = Math.min(line1, line2);
+ mark = Math.max(line1, line2);
+ Element elem;
+ try {
+ for (line1=dot; line1<mark; line1++) {
+ elem = map.getElement(line1);
+ handleDecreaseIndent(elem, document, tabSize);
+ }
+ // Don't do the last line if the caret is at its
+ // beginning. We must call getDot() again and not just
+ // use 'dot' as the caret's position may have changed
+ // due to the insertion of the tabs above.
+ elem = map.getElement(mark);
+ int start = elem.getStartOffset();
+ if (Math.max(c.getDot(),c.getMark())!=start) {
+ handleDecreaseIndent(elem, document, tabSize);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ }
+ }
+ else {
+ Element elem = map.getElement(line1);
+ try {
+ handleDecreaseIndent(elem, document, tabSize);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ }
+ }
+
+ }
+
+ public final String getMacroID() {
+ return rstaDecreaseIndentAction;
+ }
+
+ /**
+ * Actually does the "de-indentation." This method finds where the
+ * given element's leading whitespace ends, then, if there is indeed
+ * leading whitespace, removes either the last char in it (if it is a
+ * tab), or removes up to the number of spaces equal to a tab in the
+ * specified document (i.e., if the tab size was 5 and there were 3
+ * spaces at the end of the leading whitespace, the three will be
+ * removed; if there were 8 spaces, only the first 5 would be
+ * removed).
+ *
+ * @param elem The element to "de-indent."
+ * @param doc The document containing the specified element.
+ * @param tabSize The size of a tab, in spaces.
+ */
+ private final void handleDecreaseIndent(Element elem, Document doc,
+ int tabSize)
+ throws BadLocationException {
+ int start = elem.getStartOffset();
+ int end = elem.getEndOffset() - 1; // Why always true??
+ doc.getText(start,end-start, s);
+ int i = s.offset;
+ end = i+s.count;
+ if (end>i) {
+ // If the first character is a tab, remove it.
+ if (s.array[i]=='\t') {
+ doc.remove(start, 1);
+ }
+ // Otherwise, see if the first character is a space. If it
+ // is, remove all contiguous whitespaces at the beginning of
+ // this line, up to the tab size.
+ else if (s.array[i]==' ') {
+ i++;
+ int toRemove = 1;
+ while (i<end && s.array[i]==' ' && toRemove<tabSize) {
+ i++;
+ toRemove++;
+ }
+ doc.remove(start, toRemove);
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * Deletes the previous word, but differentiates symbols from "words" to
+ * match the behavior of code editors.
+ */
+ public static class DeletePrevWordAction
+ extends RTextAreaEditorKit.DeletePrevWordAction {
+
+ private Segment seg = new Segment();
+
+ protected int getPreviousWordStart(RTextArea textArea, int offs)
+ throws BadLocationException {
+
+ if (offs==0) {
+ return offs;
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ int line = textArea.getLineOfOffset(offs);
+ int start = textArea.getLineStartOffset(line);
+ if (offs==start) {
+ return start-1; // Just delete the newline
+ }
+ int end = textArea.getLineEndOffset(line);
+ if (line!=textArea.getLineCount()-1) {
+ end--;
+ }
+ doc.getText(start, end-start, seg);
+
+ // Determine the "type" of char at offs - lower case, upper case,
+ // whitespace or other. We take special care here as we're starting
+ // in the middle of the Segment to check whether we're already at
+ // the "beginning" of a word.
+ int firstIndex = seg.getBeginIndex() + (offs-start) - 1;
+ seg.setIndex(firstIndex);
+ char ch = seg.current();
+
+ // Always strip off whitespace first
+ if (Character.isWhitespace(ch)) {
+ do {
+ ch = seg.previous();
+ } while (Character.isWhitespace(ch));
+ }
+
+ // The "word" is a group of letters and/or digits
+ if (Character.isLetterOrDigit(ch)) {
+ do {
+ ch = seg.previous();
+ } while (Character.isLetterOrDigit(ch));
+ }
+
+ // The "word" is a series of symbols.
+ else {
+ while (!Character.isWhitespace(ch) &&
+ !Character.isLetterOrDigit(ch)
+ && ch!=Segment.DONE) {
+ ch = seg.previous();
+ }
+ }
+
+ if (ch==Segment.DONE) {
+ return start; // Removed last "token" of the line
+ }
+ offs -= firstIndex - seg.getIndex();
+ return offs;
+
+ }
+
+ }
+
+
+ /**
+ * Moves the caret to the end of the document, taking into account code
+ * folding.
+ */
+ public static class EndAction extends RTextAreaEditorKit.EndAction {
+
+ public EndAction(String name, boolean select) {
+ super(name, select);
+ }
+
+ protected int getVisibleEnd(RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ return rsta.getLastVisibleOffset();
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the end of the word. This class is here to
+ * better handle finding the "end of the word" in programming languages.
+ */
+ protected static class EndWordAction
+ extends RTextAreaEditorKit.EndWordAction {
+
+ private Segment seg;
+
+ protected EndWordAction(String name, boolean select) {
+ super(name, select);
+ seg = new Segment();
+ }
+
+ protected int getWordEnd(RTextArea textArea, int offs)
+ throws BadLocationException {
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ if (offs==doc.getLength()) {
+ return offs;
+ }
+
+ int line = textArea.getLineOfOffset(offs);
+ int end = textArea.getLineEndOffset(line);
+ if (line!=textArea.getLineCount()-1) {
+ end--; // Hide newline
+ }
+ if (offs==end) {
+ return end;
+ }
+ doc.getText(offs, end-offs, seg);
+
+ // Determine the "type" of char at offs - letter/digit,
+ // whitespace or other
+ char ch = seg.first();
+
+ // The "word" is a group of letters and/or digits
+ if (Character.isLetterOrDigit(ch)) {
+ do {
+ ch = seg.next();
+ } while (Character.isLetterOrDigit(ch));
+ }
+
+ // The "word" is whitespace.
+ else if (Character.isWhitespace(ch)) {
+
+ do {
+ ch = seg.next();
+ } while (Character.isWhitespace(ch));
+ }
+
+ // Otherwise, the "word" is a single character of some other type
+ // (operator, etc.).
+
+ offs += seg.getIndex() - seg.getBeginIndex();
+ return offs;
+
+ }
+
+ }
+
+
+ /**
+ * Expands all folds.
+ */
+ public static class ExpandAllFoldsAction extends FoldRelatedAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public ExpandAllFoldsAction() {
+ this(false);
+ }
+
+ public ExpandAllFoldsAction(boolean localizedName) {
+ super(rstaExpandAllFoldsAction);
+ if (localizedName) {
+ setProperties(msg, "Action.ExpandAllFolds");
+ }
+ }
+
+ public ExpandAllFoldsAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ FoldManager fm = rsta.getFoldManager();
+ for (int i=0; i<fm.getFoldCount(); i++) {
+ expand(fm.getFold(i));
+ }
+ possiblyRepaintGutter(rsta);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ private void expand(Fold fold) {
+ fold.setCollapsed(false);
+ for (int i=0; i<fold.getChildCount(); i++) {
+ expand(fold.getChild(i));
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaExpandAllFoldsAction;
+ }
+
+ }
+
+
+ /**
+ * Base class for folding-related actions.
+ */
+ static abstract class FoldRelatedAction extends RecordableTextAction {
+
+ public FoldRelatedAction(String name) {
+ super(name);
+ }
+
+ public FoldRelatedAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ protected Fold getClosestFold(RSyntaxTextArea textArea) {
+ int offs = textArea.getCaretPosition();
+ int line = textArea.getCaretLineNumber();
+ FoldManager fm = textArea.getFoldManager();
+ Fold fold = fm.getFoldForLine(line);
+ if (fold==null) {
+ fold = fm.getDeepestOpenFoldContaining(offs);
+ }
+ return fold;
+ }
+
+ /**
+ * Repaints the gutter in a text area's scroll pane, if necessary.
+ *
+ * @param textArea The text area.
+ */
+ protected void possiblyRepaintGutter(RTextArea textArea) {
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ gutter.repaint();
+ }
+ }
+
+ }
+
+
+ /**
+ * Action for moving the caret to the "matching bracket" of the bracket
+ * at the caret position (either before or after).
+ */
+ public static class GoToMatchingBracketAction
+ extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ private Point bracketInfo;
+
+ public GoToMatchingBracketAction() {
+ super(rstaGoToMatchingBracketAction);
+ }
+
+ public GoToMatchingBracketAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ bracketInfo = RSyntaxUtilities.getMatchingBracketPosition(rsta,
+ bracketInfo);
+ if (bracketInfo.y>-1) {
+ // Go to the position AFTER the bracket so the previous
+ // bracket (which we were just on) is highlighted.
+ rsta.setCaretPosition(bracketInfo.y+1);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaGoToMatchingBracketAction;
+ }
+
+ }
+
+
+ /**
+ * Action for increasing the font size of all fonts in the text area.
+ */
+ public static class IncreaseFontSizeAction
+ extends RTextAreaEditorKit.IncreaseFontSizeAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public IncreaseFontSizeAction() {
+ super();
+ }
+
+ public IncreaseFontSizeAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ SyntaxScheme scheme = rsta.getSyntaxScheme();
+
+ // All we need to do is update all of the fonts in syntax
+ // schemes, then call setSyntaxHighlightingColorScheme with the
+ // same scheme already being used. This relies on the fact that
+ // that method does not check whether the new scheme is different
+ // from the old scheme before updating.
+
+ boolean changed = false;
+ int count = scheme.getStyleCount();
+ for (int i=0; i<count; i++) {
+ Style ss = scheme.getStyle(i);
+ if (ss!=null) {
+ Font font = ss.font;
+ if (font!=null) {
+ float oldSize = font.getSize2D();
+ float newSize = oldSize + increaseAmount;
+ if (newSize<=MAXIMUM_SIZE) {
+ // Grow by increaseAmount.
+ ss.font = font.deriveFont(newSize);
+ changed = true;
+ }
+ else if (oldSize<MAXIMUM_SIZE) {
+ // Can't grow by full increaseAmount, but
+ // can grow a little bit.
+ ss.font = font.deriveFont(MAXIMUM_SIZE);
+ changed = true;
+ }
+ }
+ }
+ }
+
+ // Do the text area's font also.
+ Font font = rsta.getFont();
+ float oldSize = font.getSize2D();
+ float newSize = oldSize + increaseAmount;
+ if (newSize<=MAXIMUM_SIZE) {
+ // Grow by increaseAmount.
+ rsta.setFont(font.deriveFont(newSize));
+ changed = true;
+ }
+ else if (oldSize<MAXIMUM_SIZE) {
+ // Can't grow by full increaseAmount, but
+ // can grow a little bit.
+ rsta.setFont(font.deriveFont(MAXIMUM_SIZE));
+ changed = true;
+ }
+
+ // If we updated at least one font, update the screen. If
+ // all of the fonts were already the minimum size, beep.
+ if (changed) {
+ rsta.setSyntaxScheme(scheme);
+ // NOTE: This is a hack to get an encompassing
+ // RTextScrollPane to repaint its line numbers to account
+ // for a change in line height due to a font change. I'm
+ // not sure why we need to do this here but not when we
+ // change the syntax highlighting color scheme via the
+ // Options dialog... setSyntaxHighlightingColorScheme()
+ // calls revalidate() which won't repaint the scroll pane
+ // if scrollbars don't change, which is why we need this.
+ Component parent = rsta.getParent();
+ if (parent instanceof javax.swing.JViewport) {
+ parent = parent.getParent();
+ if (parent instanceof JScrollPane) {
+ parent.repaint();
+ }
+ }
+ }
+ else
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+
+ }
+
+ }
+
+
+ /**
+ * Action for when the user presses the Enter key. This is here so we can
+ * be smart and "auto-indent" for programming languages.
+ */
+ public static class InsertBreakAction
+ extends RTextAreaEditorKit.InsertBreakAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ RSyntaxTextArea sta = (RSyntaxTextArea)textArea;
+ boolean noSelection= sta.getSelectionStart()==sta.getSelectionEnd();
+
+ // First, see if this language wants to handle inserting newlines
+ // itself.
+ boolean handled = false;
+ if (noSelection) {
+ RSyntaxDocument doc = (RSyntaxDocument)sta.getDocument();
+ handled = doc.insertBreakSpecialHandling(e);
+ }
+
+ // If not...
+ if (!handled) {
+ handleInsertBreak(sta, noSelection);
+ }
+
+ }
+
+ /**
+ * @return The first location in the string past <code>pos</code> that
+ * is NOT a whitespace char, or <code>-1</code> if only
+ * whitespace chars follow <code>pos</code> (or it is the end
+ * position in the string).
+ */
+ private static final int atEndOfLine(int pos, String s, int sLen) {
+ for (int i=pos; i<sLen; i++) {
+ if (!RSyntaxUtilities.isWhitespace(s.charAt(i)))
+ return i;
+ }
+ return -1;
+ }
+
+ private static final int getOpenBraceCount(RSyntaxDocument doc) {
+ int openCount = 0;
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+ for (int i=0; i<lineCount; i++) {
+ Token t = doc.getTokenListForLine(i);
+ while (t!=null && t.isPaintable()) {
+ if (t.type==Token.SEPARATOR && t.textCount==1) {
+ char ch = t.text[t.textOffset];
+ if (ch=='{') {
+ openCount++;
+ }
+ else if (ch=='}') {
+ openCount--;
+ }
+ }
+ t = t.getNextToken();
+ }
+ }
+ return openCount;
+ }
+
+ /**
+ * Actually inserts the newline into the document, and auto-indents
+ * if appropriate. This method can be called by token makers who
+ * implement a custom action for inserting newlines.
+ *
+ * @param textArea
+ * @param noSelection Whether there is no selection.
+ */
+ protected void handleInsertBreak(RSyntaxTextArea textArea,
+ boolean noSelection) {
+ // If we're auto-indenting...
+ if (noSelection && textArea.isAutoIndentEnabled()) {
+ insertNewlineWithAutoIndent(textArea);
+ }
+ else {
+ textArea.replaceSelection("\n");
+ if (noSelection) {
+ possiblyCloseCurlyBrace(textArea, null);
+ }
+ }
+ }
+
+ private void insertNewlineWithAutoIndent(RSyntaxTextArea sta) {
+
+ try {
+
+ int caretPos = sta.getCaretPosition();
+ Document doc = sta.getDocument();
+ Element map = doc.getDefaultRootElement();
+ int lineNum = map.getElementIndex(caretPos);
+ Element line = map.getElement(lineNum);
+ int start = line.getStartOffset();
+ int end = line.getEndOffset()-1; // Why always "-1"?
+ int len = end-start;
+ String s = doc.getText(start, len);
+
+ // endWS is the end of the leading whitespace of the
+ // current line.
+ String leadingWS = RSyntaxUtilities.getLeadingWhitespace(s);
+ StringBuffer sb = new StringBuffer("\n");
+ sb.append(leadingWS);
+
+ // If there is only whitespace between the caret and
+ // the EOL, pressing Enter auto-indents the new line to
+ // the same place as the previous line.
+ int nonWhitespacePos = atEndOfLine(caretPos-start, s, len);
+ if (nonWhitespacePos==-1) {
+ if (leadingWS.length()==len &&
+ sta.isClearWhitespaceLinesEnabled()) {
+ // If the line was nothing but whitespace, select it
+ // so its contents get removed.
+ sta.setSelectionStart(start);
+ sta.setSelectionEnd(end);
+ }
+ sta.replaceSelection(sb.toString());
+ }
+
+ // If there is non-whitespace between the caret and the
+ // EOL, pressing Enter takes that text to the next line
+ // and auto-indents it to the same place as the last
+ // line.
+ else {
+ sb.append(s.substring(nonWhitespacePos));
+ sta.replaceRange(sb.toString(), caretPos, end);
+ sta.setCaretPosition(caretPos + leadingWS.length()+1);
+ }
+
+ // Must do it after everything else, as the "smart indent"
+ // calculation depends on the previous line's state
+ // AFTER the Enter press (stuff may have been moved down).
+ if (sta.getShouldIndentNextLine(lineNum)) {
+ sta.replaceSelection("\t");
+ }
+
+ possiblyCloseCurlyBrace(sta, leadingWS);
+
+ } catch (BadLocationException ble) { // Never happens
+ sta.replaceSelection("\n");
+ ble.printStackTrace();
+ }
+
+ }
+
+ private void possiblyCloseCurlyBrace(RSyntaxTextArea textArea,
+ String leadingWS) {
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+ if (textArea.getCloseCurlyBraces() &&
+ doc.getCurlyBracesDenoteCodeBlocks()) {
+
+ int line = textArea.getCaretLineNumber();
+ Token t = doc.getTokenListForLine(line-1);
+ t = t.getLastNonCommentNonWhitespaceToken();
+
+ if (t!=null && t.isLeftCurly()) {
+
+ if (getOpenBraceCount(doc)>0) {
+ StringBuffer sb = new StringBuffer();
+ if (line==textArea.getLineCount()-1) {
+ sb.append('\n');
+ }
+ if (leadingWS!=null) {
+ sb.append(leadingWS);
+ }
+ sb.append("}\n");
+ int dot = textArea.getCaretPosition();
+ int end = textArea.getLineEndOffsetOfCurrentLine();
+ // Insert at end of line, not at dot: they may have
+ // pressed Enter in the middle of the line and brought
+ // some text (though it must be whitespace and/or
+ // comments) down onto the new line.
+ textArea.insert(sb.toString(), end);
+ textArea.setCaretPosition(dot); // Caret may have moved
+ }
+
+ }
+
+ }
+
+ }
+
+ }
+
+
+ /**
+ * Action for inserting tabs. This is extended to "block indent" a
+ * group of contiguous lines if they are selected.
+ */
+ public static class InsertTabAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public InsertTabAction() {
+ super(insertTabAction);
+ }
+
+ public InsertTabAction(String name) {
+ super(name);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ Document document = textArea.getDocument();
+ Element map = document.getDefaultRootElement();
+ Caret c = textArea.getCaret();
+ int dot = c.getDot();
+ int mark = c.getMark();
+ int dotLine = map.getElementIndex(dot);
+ int markLine = map.getElementIndex(mark);
+
+ // If there is a multi-line selection, indent all lines in
+ // the selection.
+ if (dotLine!=markLine) {
+ int first = Math.min(dotLine, markLine);
+ int last = Math.max(dotLine, markLine);
+ Element elem; int start;
+
+ // Since we're using Document.insertString(), we must mimic the
+ // soft tab behavior provided by RTextArea.replaceSelection().
+ String replacement = "\t";
+ if (textArea.getTabsEmulated()) {
+ StringBuffer sb = new StringBuffer();
+ int temp = textArea.getTabSize();
+ for (int i=0; i<temp; i++) {
+ sb.append(' ');
+ }
+ replacement = sb.toString();
+ }
+
+ textArea.beginAtomicEdit();
+ try {
+ for (int i=first; i<last; i++) {
+ elem = map.getElement(i);
+ start = elem.getStartOffset();
+ document.insertString(start, replacement, null);
+ }
+ // Don't do the last line if the caret is at its
+ // beginning. We must call getDot() again and not just
+ // use 'dot' as the caret's position may have changed
+ // due to the insertion of the tabs above.
+ elem = map.getElement(last);
+ start = elem.getStartOffset();
+ if (Math.max(c.getDot(), c.getMark())!=start) {
+ document.insertString(start, replacement, null);
+ }
+ } catch (BadLocationException ble) { // Never happens.
+ ble.printStackTrace();
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ } finally {
+ textArea.endAtomicEdit();
+ }
+ }
+ else {
+ textArea.replaceSelection("\t");
+ }
+
+ }
+
+ public final String getMacroID() {
+ return insertTabAction;
+ }
+
+ }
+
+
+ /**
+ * Action to move the selection and/or caret. Constructor indicates
+ * direction to use. This class overrides the behavior defined in
+ * {@link RTextAreaEditorKit} to better skip "words" in source code.
+ */
+ public static class NextWordAction
+ extends RTextAreaEditorKit.NextWordAction {
+
+ private Segment seg;
+
+ public NextWordAction(String nm, boolean select) {
+ super(nm, select);
+ seg = new Segment();
+ }
+
+ /**
+ * Overridden to do better with skipping "words" in code.
+ */
+ protected int getNextWord(RTextArea textArea, int offs)
+ throws BadLocationException {
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ if (offs==doc.getLength()) {
+ return offs;
+ }
+
+ Element root = doc.getDefaultRootElement();
+ int line = root.getElementIndex(offs);
+ int end = root.getElement(line).getEndOffset() - 1;
+ if (offs==end) {// If we're already at the end of the line...
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) { // Start of next visible line
+ FoldManager fm = rsta.getFoldManager();
+ int lineCount = root.getElementCount();
+ while (++line<lineCount && fm.isLineHidden(line));
+ if (line<lineCount) { // Found a lower visible line
+ offs = root.getElement(line).getStartOffset();
+ }
+ // No lower visible line - we're already at last visible offset
+ return offs;
+ }
+ else {
+ return offs+1; // Start of next line.
+ }
+ }
+ doc.getText(offs, end-offs, seg);
+
+ // Determine the "type" of char at offs - letter/digit,
+ // whitespace or other
+ char ch = seg.first();
+
+ // Skip the group of letters and/or digits
+ if (Character.isLetterOrDigit(ch)) {
+ do {
+ ch = seg.next();
+ } while (Character.isLetterOrDigit(ch));
+ }
+
+ // Skip groups of "anything else" (operators, etc.).
+ else if (!Character.isWhitespace(ch)) {
+ do {
+ ch = seg.next();
+ } while (ch!=Segment.DONE &&
+ !(Character.isLetterOrDigit(ch) ||
+ Character.isWhitespace(ch)));
+ }
+
+ // Skip any trailing whitespace
+ while (Character.isWhitespace(ch)) {
+ ch = seg.next();
+ }
+
+ offs += seg.getIndex() - seg.getBeginIndex();
+ return offs;
+
+ }
+
+ }
+
+
+ /**
+ * Action for when the user tries to insert a template (that is,
+ * they've typed a template ID and pressed the trigger character
+ * (a space) in an attempt to do the substitution).
+ */
+ public static class PossiblyInsertTemplateAction extends RecordableTextAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public PossiblyInsertTemplateAction() {
+ super(rstaPossiblyInsertTemplateAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled())
+ return;
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+
+ if (RSyntaxTextArea.getTemplatesEnabled()) {
+
+ Document doc = textArea.getDocument();
+ if (doc != null) {
+
+ try {
+
+ CodeTemplateManager manager = RSyntaxTextArea.
+ getCodeTemplateManager();
+ CodeTemplate template = manager==null ? null :
+ manager.getTemplate(rsta);
+
+ // A non-null template means modify the text to insert!
+ if (template!=null) {
+ template.invoke(rsta);
+ }
+
+ // No template - insert default text. This is
+ // exactly what DefaultKeyTypedAction does.
+ else {
+ doDefaultInsert(rsta);
+ }
+
+ } catch (BadLocationException ble) {
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ }
+
+
+ } // End of if (doc!=null).
+
+ } // End of if (textArea.getTemplatesEnabled()).
+
+ // If templates aren't enabled, just insert the text as usual.
+ else {
+ doDefaultInsert(rsta);
+ }
+
+ }
+
+ private final void doDefaultInsert(RTextArea textArea) {
+ // FIXME: We need a way to get the "trigger string" (i.e.,
+ // the text that was just typed); however, the text area's
+ // template manager might be null (if templates are disabled).
+ // Also, the manager's trigger string doesn't yet match up with
+ // that defined in RSyntaxTextAreaEditorKit.java (which is
+ // hardcoded as a space)...
+ //String str = manager.getInsertTriggerString();
+ //int mod = manager.getInsertTrigger().getModifiers();
+ //if (str!=null && str.length()>0 &&
+ // ((mod&ActionEvent.ALT_MASK)==(mod&ActionEvent.CTRL_MASK))) {
+ // char ch = str.charAt(0);
+ // if (ch>=0x20 && ch!=0x7F)
+ // textArea.replaceSelection(str);
+ //}
+ textArea.replaceSelection(" ");
+ }
+
+ public final String getMacroID() {
+ return rstaPossiblyInsertTemplateAction;
+ }
+
+ }
+
+
+ /**
+ * Action to move the selection and/or caret. Constructor indicates
+ * direction to use. This class overrides the behavior defined in
+ * {@link RTextAreaEditorKit} to better skip "words" in source code.
+ */
+ public static class PreviousWordAction
+ extends RTextAreaEditorKit.PreviousWordAction {
+
+ private Segment seg;
+
+ public PreviousWordAction(String nm, boolean select) {
+ super(nm, select);
+ seg = new Segment();
+ }
+
+ /**
+ * Overridden to do better with skipping "words" in code.
+ */
+ protected int getPreviousWord(RTextArea textArea, int offs)
+ throws BadLocationException {
+
+ if (offs==0) {
+ return offs;
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int line = root.getElementIndex(offs);
+ int start = root.getElement(line).getStartOffset();
+ if (offs==start) {// If we're already at the start of the line...
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) { // End of next visible line
+ FoldManager fm = rsta.getFoldManager();
+ while (--line>=0 && fm.isLineHidden(line));
+ if (line>=0) { // Found an earlier visible line
+ offs = root.getElement(line).getEndOffset() - 1;
+ }
+ // No earlier visible line - we must be at offs==0...
+ return offs;
+ }
+ else {
+ return start-1; // End of previous line.
+ }
+ }
+ doc.getText(start, offs-start, seg);
+
+ // Determine the "type" of char at offs - lower case, upper case,
+ // whitespace or other
+ char ch = seg.last();
+
+ // Skip any "leading" whitespace
+ while (Character.isWhitespace(ch)) {
+ ch = seg.previous();
+ }
+
+ // Skip the group of letters and/or digits
+ if (Character.isLetterOrDigit(ch)) {
+ do {
+ ch = seg.previous();
+ } while (Character.isLetterOrDigit(ch));
+ }
+
+ // Skip groups of "anything else" (operators, etc.).
+ else if (!Character.isWhitespace(ch)) {
+ do {
+ ch = seg.previous();
+ } while (ch!=Segment.DONE &&
+ !(Character.isLetterOrDigit(ch) ||
+ Character.isWhitespace(ch)));
+ }
+
+ offs -= seg.getEndIndex() - seg.getIndex();
+ if (ch!=Segment.DONE) {
+ offs++;
+ }
+
+ return offs;
+
+ }
+
+ }
+
+
+ /**
+ * Selects the word around the caret. This class is here to better
+ * handle selecting "words" in programming languages.
+ */
+ public static class SelectWordAction
+ extends RTextAreaEditorKit.SelectWordAction {
+
+ protected void createActions() {
+ start = new BeginWordAction("pigdog", false);
+ end = new EndWordAction("pigdog", true);
+ }
+
+ }
+
+
+ /**
+ * Action that toggles whether the currently selected lines are
+ * commented.
+ */
+ public static class ToggleCommentAction extends RecordableTextAction {
+
+ public ToggleCommentAction() {
+ super(rstaToggleCommentAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ String[] startEnd = doc.getLineCommentStartAndEnd();
+
+ if (startEnd==null) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ Element map = doc.getDefaultRootElement();
+ Caret c = textArea.getCaret();
+ int dot = c.getDot();
+ int mark = c.getMark();
+ int line1 = map.getElementIndex(dot);
+ int line2 = map.getElementIndex(mark);
+ int start = Math.min(line1, line2);
+ int end = Math.max(line1, line2);
+
+ // Don't toggle comment on last line if there is no
+ // text selected on it.
+ if (start!=end) {
+ Element elem = map.getElement(end);
+ if (Math.max(dot, mark)==elem.getStartOffset()) {
+ end--;
+ }
+ }
+
+ textArea.beginAtomicEdit();
+ try {
+ boolean add = getDoAdd(doc,map, start,end, startEnd);
+ for (line1=start; line1<=end; line1++) {
+ Element elem = map.getElement(line1);
+ handleToggleComment(elem, doc, startEnd, add);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ } finally {
+ textArea.endAtomicEdit();
+ }
+
+ }
+
+ private boolean getDoAdd(Document doc, Element map, int startLine,
+ int endLine, String[] startEnd)
+ throws BadLocationException {
+ boolean doAdd = false;
+ for (int i=startLine; i<=endLine; i++) {
+ Element elem = map.getElement(i);
+ int start = elem.getStartOffset();
+ String t = doc.getText(start, elem.getEndOffset()-start-1);
+ if (!t.startsWith(startEnd[0]) ||
+ (startEnd[1]!=null && !t.endsWith(startEnd[1]))) {
+ doAdd = true;
+ break;
+ }
+ }
+ return doAdd;
+ }
+
+ private void handleToggleComment(Element elem, Document doc,
+ String[] startEnd, boolean add) throws BadLocationException {
+ int start = elem.getStartOffset();
+ int end = elem.getEndOffset() - 1;
+ if (add) {
+ doc.insertString(start, startEnd[0], null);
+ if (startEnd[1]!=null) {
+ doc.insertString(end+startEnd[0].length(), startEnd[1],
+ null);
+ }
+ }
+ else {
+ doc.remove(start, startEnd[0].length());
+ if (startEnd[1]!=null) {
+ int temp = startEnd[1].length();
+ doc.remove(end-startEnd[0].length()-temp, temp);
+ }
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaToggleCommentAction;
+ }
+
+ }
+
+
+ /**
+ * Toggles the fold at the current caret position or line.
+ */
+ public static class ToggleCurrentFoldAction extends FoldRelatedAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public ToggleCurrentFoldAction() {
+ super(rstaToggleCurrentFoldAction);
+ setProperties(msg, "Action.ToggleCurrentFold");
+ }
+
+ public ToggleCurrentFoldAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ Fold fold = getClosestFold(rsta);
+ if (fold!=null) {
+ fold.toggleCollapsedState();
+ }
+ possiblyRepaintGutter(textArea);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(rsta);
+ }
+ }
+
+ public final String getMacroID() {
+ return rstaToggleCurrentFoldAction;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java
new file mode 100644
index 0000000..d170eb9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java
@@ -0,0 +1,449 @@
+/*
+ * 04/23/2009
+ *
+ * RSyntaxTextAreaHighlighter.java - Highlighter for RTextAreas.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.plaf.TextUI;
+import javax.swing.plaf.basic.BasicTextUI.BasicHighlighter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+import org.fife.ui.rsyntaxtextarea.parser.ParserNotice;
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * The highlighter implementation used by {@link RSyntaxTextArea}s. It knows to
+ * always paint "marked occurrences" highlights below selection highlights,
+ * and squiggle underline highlights above all other highlights.<p>
+ *
+ * Most of this code is copied from javax.swing.text.DefaultHighlighter;
+ * unfortunately, we cannot re-use much of it since it is package private.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RSyntaxTextAreaHighlighter extends BasicHighlighter {
+
+ /**
+ * The text component we are the highlighter for.
+ */
+ private RTextArea textArea;
+
+ /**
+ * Marked occurrences in the document (to be painted separately from
+ * other highlights).
+ */
+ private List markedOccurrences;
+
+ /**
+ * Highlights from document parsers. These should be painted "on top of"
+ * all other highlights to ensure they are always above the selection.
+ */
+ private List parserHighlights;
+
+ /**
+ * The default color used for parser notices when none is specified.
+ */
+ private static final Color DEFAULT_PARSER_NOTICE_COLOR = Color.RED;
+
+
+ /**
+ * Constructor.
+ */
+ public RSyntaxTextAreaHighlighter() {
+ markedOccurrences = new ArrayList();
+ parserHighlights = new ArrayList(0); // Often unused
+ }
+
+
+ /**
+ * Adds a special "marked occurrence" highlight.
+ *
+ * @param start
+ * @param end
+ * @param p
+ * @return A tag to reference the highlight later.
+ * @throws BadLocationException
+ * @see {@link #clearMarkOccurrencesHighlights()}
+ */
+ Object addMarkedOccurrenceHighlight(int start, int end,
+ MarkOccurrencesHighlightPainter p) throws BadLocationException {
+ Document doc = textArea.getDocument();
+ TextUI mapper = textArea.getUI();
+ // Always layered highlights for marked occurrences.
+ HighlightInfo i = new LayeredHighlightInfo();
+ i.painter = p;
+ i.p0 = doc.createPosition(start);
+ // HACK: Use "end-1" to prevent chars the user types at the "end" of
+ // the highlight to be absorbed into the highlight (default Highlight
+ // behavior).
+ i.p1 = doc.createPosition(end-1);
+ markedOccurrences.add(i);
+ mapper.damageRange(textArea, start, end);
+ return i;
+ }
+
+
+ /**
+ * Adds a special "marked occurrence" highlight.
+ *
+ * @param notice The notice from a {@link Parser}.
+ * @return A tag with which to reference the highlight.
+ * @throws BadLocationException
+ * @see {@link #clearParserHighlights()}
+ */
+ Object addParserHighlight(ParserNotice notice, HighlightPainter p)
+ throws BadLocationException {
+
+ Document doc = textArea.getDocument();
+ TextUI mapper = textArea.getUI();
+
+ int start = notice.getOffset();
+ int end = 0;
+ if (start==-1) { // Could just define an invalid line number
+ int line = notice.getLine();
+ Element root = doc.getDefaultRootElement();
+ if (line>=0 && line<root.getElementCount()) {
+ Element elem = root.getElement(line);
+ start = elem.getStartOffset();
+ end = elem.getEndOffset();
+ }
+ }
+ else {
+ end = start + notice.getLength();
+ }
+
+ // Always layered highlights for parser highlights.
+ HighlightInfo i = new LayeredHighlightInfo();
+ i.painter = p;
+ i.p0 = doc.createPosition(start);
+ i.p1 = doc.createPosition(end);
+ i.notice = notice;//i.color = notice.getColor();
+
+ parserHighlights.add(i);
+ mapper.damageRange(textArea, start, end);
+ return i;
+
+ }
+
+
+ /**
+ * Removes all "marked occurrences" highlights from the view.
+ *
+ * @see #addMarkedOccurrenceHighlight(int, int, MarkOccurrencesHighlightPainter)
+ */
+ void clearMarkOccurrencesHighlights() {
+ // Don't remove via the iterator; since our List is an ArrayList, this
+ // implies tons of System.arrayCopy()s
+ for (Iterator i=markedOccurrences.iterator(); i.hasNext(); ) {
+ repaintListHighlight(i.next());
+ }
+ markedOccurrences.clear();
+ }
+
+
+ /**
+ * Removes all parser highlights.
+ *
+ * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+ */
+ void clearParserHighlights() {
+ // Don't remove via an iterator; since our List is an ArrayList, this
+ // implies tons of System.arrayCopy()s
+ for (int i=0; i<parserHighlights.size(); i++) {
+ repaintListHighlight(parserHighlights.get(i));
+ }
+ parserHighlights.clear();
+ }
+
+
+ /**
+ * Removes all of the highlights for a specific parser.
+ *
+ * @param parser The parser.
+ */
+ public void clearParserHighlights(Parser parser) {
+
+ for (Iterator i=parserHighlights.iterator(); i.hasNext(); ) {
+
+ HighlightInfo info = (HighlightInfo)i.next();
+
+ if (info.notice.getParser()==parser) {
+ if (info instanceof LayeredHighlightInfo) {
+ LayeredHighlightInfo lhi = (LayeredHighlightInfo)info;
+ if (lhi.width > 0 && lhi.height > 0) {
+ textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+ }
+ }
+ else {
+ TextUI ui = textArea.getUI();
+ ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+ //safeDamageRange(info.p0, info.p1);
+ }
+ i.remove();
+ }
+
+ }
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void deinstall(JTextComponent c) {
+ this.textArea = null;
+ markedOccurrences.clear();
+ parserHighlights.clear();
+ }
+
+
+ /**
+ * Returns a list of "marked occurrences" in the text area. If there are
+ * no marked occurrences, this will be an empty list.
+ *
+ * @return The list of marked occurrences, or an empty list if none. The
+ * contents of this list will be of type {@link DocumentRange}.
+ */
+ public List getMarkedOccurrences() {
+ List list = new ArrayList(markedOccurrences.size());
+ for (Iterator i=markedOccurrences.iterator(); i.hasNext(); ) {
+ HighlightInfo info = (HighlightInfo)i.next();
+ int start = info.getStartOffset();
+ int end = info.getEndOffset() + 1; // HACK
+ DocumentRange range = new DocumentRange(start, end);
+ list.add(range);
+ }
+ return list;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void install(JTextComponent c) {
+ super.install(c);
+ this.textArea = (RTextArea)c;
+ }
+
+
+ /**
+ * Renders the highlights.
+ *
+ * @param g the graphics context
+ */
+ public void paint(Graphics g) {
+ paintList(g, markedOccurrences);
+ super.paint(g);
+ paintList(g, parserHighlights);
+ }
+
+
+ private void paintList(Graphics g, List highlights) {
+
+ int len = highlights.size();
+
+ for (int i = 0; i < len; i++) {
+ HighlightInfo info = (HighlightInfo)highlights.get(i);
+ if (!(info instanceof LayeredHighlightInfo)) {
+ // Avoid allocating unless we need it.
+ Rectangle a = textArea.getBounds();
+ Insets insets = textArea.getInsets();
+ a.x = insets.left;
+ a.y = insets.top;
+ a.width -= insets.left + insets.right;
+ a.height -= insets.top + insets.bottom;
+ for (; i < len; i++) {
+ info = (HighlightInfo)markedOccurrences.get(i);
+ if (!(info instanceof LayeredHighlightInfo)) {
+ Color c = info.getColor();
+ Highlighter.HighlightPainter p = info.getPainter();
+ if (c!=null && p instanceof ChangeableColorHighlightPainter) {
+ ((ChangeableColorHighlightPainter)p).setColor(c);
+ }
+ p.paint(g, info.getStartOffset(), info.getEndOffset(),
+ a, textArea);
+ }
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * When leaf Views (such as LabelView) are rendering they should
+ * call into this method. If a highlight is in the given region it will
+ * be drawn immediately.
+ *
+ * @param g Graphics used to draw
+ * @param p0 starting offset of view
+ * @param p1 ending offset of view
+ * @param viewBounds Bounds of View
+ * @param editor JTextComponent
+ * @param view View instance being rendered
+ */
+ public void paintLayeredHighlights(Graphics g, int p0, int p1,
+ Shape viewBounds, JTextComponent editor, View view) {
+ paintListLayered(g, p0,p1, viewBounds, editor, view, markedOccurrences);
+ super.paintLayeredHighlights(g, p0, p1, viewBounds, editor, view);
+ paintListLayered(g, p0,p1, viewBounds, editor, view, parserHighlights);
+ }
+
+
+ private void paintListLayered(Graphics g, int p0, int p1, Shape viewBounds,
+ JTextComponent editor, View view, List highlights) {
+ for (int i=highlights.size()-1; i>=0; i--) {
+ Object tag = highlights.get(i);
+ if (tag instanceof LayeredHighlightInfo) {
+ LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+ int start = lhi.getStartOffset();
+ int end = lhi.getEndOffset();
+ if ((p0 < start && p1 > start) ||
+ (p0 >= start && p0 < end)) {
+ lhi.paintLayeredHighlights(g, p0, p1, viewBounds,
+ editor, view);
+ }
+ }
+ }
+ }
+
+
+ private void repaintListHighlight(Object tag) {
+ if (tag instanceof LayeredHighlightInfo) {
+ LayeredHighlightInfo lhi = (LayeredHighlightInfo)tag;
+ if (lhi.width > 0 && lhi.height > 0) {
+ textArea.repaint(lhi.x, lhi.y, lhi.width, lhi.height);
+ }
+ }
+ else {
+ HighlightInfo info = (HighlightInfo) tag;
+ TextUI ui = textArea.getUI();
+ ui.damageRange(textArea, info.getStartOffset(),info.getEndOffset());
+ //safeDamageRange(info.p0, info.p1);
+ }
+ }
+
+
+ /**
+ * Removes a parser highlight from this view.
+ *
+ * @param tag The reference to the highlight.
+ * @see #addParserHighlight(ParserNotice, javax.swing.text.Highlighter.HighlightPainter)
+ */
+ void removeParserHighlight(Object tag) {
+ repaintListHighlight(tag);
+ parserHighlights.remove(tag);
+ }
+
+
+ private static class HighlightInfo implements Highlighter.Highlight {
+
+ private Position p0;
+ private Position p1;
+ protected Highlighter.HighlightPainter painter;
+ private ParserNotice notice;//Color color; // Used only by Parser highlights.
+
+ public Color getColor() {
+ //return color;
+ Color color = null;
+ if (notice!=null) {
+ color = notice.getColor();
+ if (color==null) {
+ color = DEFAULT_PARSER_NOTICE_COLOR;
+ }
+ }
+ return color;
+ }
+
+ public int getStartOffset() {
+ return p0.getOffset();
+ }
+
+ public int getEndOffset() {
+ return p1.getOffset();
+ }
+
+ public Highlighter.HighlightPainter getPainter() {
+ return painter;
+ }
+
+ }
+
+
+ private static class LayeredHighlightInfo extends HighlightInfo {
+
+ private int x;
+ private int y;
+ private int width;
+ private int height;
+
+ void union(Shape bounds) {
+ if (bounds == null) {
+ return;
+ }
+ Rectangle alloc = (bounds instanceof Rectangle) ?
+ (Rectangle)bounds : bounds.getBounds();
+ if (width == 0 || height == 0) {
+ x = alloc.x;
+ y = alloc.y;
+ width = alloc.width;
+ height = alloc.height;
+ }
+ else {
+ width = Math.max(x + width, alloc.x + alloc.width);
+ height = Math.max(y + height, alloc.y + alloc.height);
+ x = Math.min(x, alloc.x);
+ width -= x;
+ y = Math.min(y, alloc.y);
+ height -= y;
+ }
+ }
+
+ /**
+ * Restricts the region based on the receivers offsets and messages
+ * the painter to paint the region.
+ */
+ void paintLayeredHighlights(Graphics g, int p0, int p1,
+ Shape viewBounds, JTextComponent editor,
+ View view) {
+ int start = getStartOffset();
+ int end = getEndOffset();
+ // Restrict the region to what we represent
+ p0 = Math.max(start, p0);
+ p1 = Math.min(end, p1);
+ if (getColor()!=null &&
+ (painter instanceof ChangeableColorHighlightPainter)) {
+ ((ChangeableColorHighlightPainter)painter).setColor(getColor());
+ }
+ // Paint the appropriate region using the painter and union
+ // the effected region with our bounds.
+ union(((LayeredHighlighter.LayerPainter)painter).paintLayer
+ (g, p0, p1, viewBounds, editor, view));
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java
new file mode 100644
index 0000000..5e82cdd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java
@@ -0,0 +1,256 @@
+/*
+ * 02/24/2004
+ *
+ * RSyntaxTextAreaUI.java - UI for an RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.UIManager;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.InputMapUIResource;
+import javax.swing.text.*;
+
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextAreaUI;
+
+
+/**
+ * UI used by <code>RSyntaxTextArea</code>. This allows us to implement
+ * syntax highlighting.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RSyntaxTextAreaUI extends RTextAreaUI {
+
+ private static final String SHARED_ACTION_MAP_NAME = "RSyntaxTextAreaUI.actionMap";
+ private static final String SHARED_INPUT_MAP_NAME = "RSyntaxTextAreaUI.inputMap";
+ private static final EditorKit defaultKit = new RSyntaxTextAreaEditorKit();
+
+
+ public static ComponentUI createUI(JComponent ta) {
+ return new RSyntaxTextAreaUI(ta);
+ }
+
+
+ /**
+ * Constructor.
+ */
+ public RSyntaxTextAreaUI(JComponent rSyntaxTextArea) {
+ super(rSyntaxTextArea);
+ }
+
+
+ /**
+ * Creates the view for an element.
+ *
+ * @param elem The element.
+ * @return The view.
+ */
+ public View create(Element elem) {
+ RTextArea c = getRTextArea();
+ if (c instanceof RSyntaxTextArea) {
+ RSyntaxTextArea area = (RSyntaxTextArea) c;
+ View v;
+ if (area.getLineWrap())
+ v = new WrappedSyntaxView(elem);
+ else
+ v = new SyntaxView(elem);
+ return v;
+ }
+ return null;
+ }
+
+
+ /**
+ * Creates the highlighter to use for syntax text areas.
+ *
+ * @return The highlighter.
+ */
+ protected Highlighter createHighlighter() {
+ return new RSyntaxTextAreaHighlighter();
+ }
+
+
+ /**
+ * Returns the name to use to cache/fetch the shared action map. This
+ * should be overridden by subclasses if the subclass has its own custom
+ * editor kit to install, so its actions get picked up.
+ *
+ * @return The name of the cached action map.
+ */
+ protected String getActionMapName() {
+ return SHARED_ACTION_MAP_NAME;
+ }
+
+
+ /**
+ * Fetches the EditorKit for the UI.
+ *
+ * @param tc The text component for which this UI is installed.
+ * @return The editor capabilities.
+ * @see javax.swing.plaf.TextUI#getEditorKit
+ */
+ public EditorKit getEditorKit(JTextComponent tc) {
+ return defaultKit;
+ }
+
+
+ /**
+ * Get the InputMap to use for the UI.<p>
+ *
+ * This method is not named <code>getInputMap()</code> because there is
+ * a package-private method in <code>BasicTextAreaUI</code> with that name.
+ * Thus, creating a new method with that name causes certain compilers to
+ * issue warnings that you are not actually overriding the original method
+ * (since it is package-private).
+ */
+ protected InputMap getRTextAreaInputMap() {
+ InputMap map = new InputMapUIResource();
+ InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+ if (shared==null) {
+ shared = new RSyntaxTextAreaDefaultInputMap();
+ UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+ }
+ //KeyStroke[] keys = shared.allKeys();
+ //for (int i=0; i<keys.length; i++)
+ // System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+ map.setParent(shared);
+ return map;
+ }
+
+
+ /**
+ * Paints the text area's background.
+ *
+ * @param g The graphics component on which to paint.
+ */
+ protected void paintBackground(Graphics g) {
+ super.paintBackground(g);
+ paintMatchedBracket(g);
+ }
+
+
+ /**
+ * Paints the "matched bracket", if any.
+ *
+ * @param g The graphics context.
+ */
+ protected void paintMatchedBracket(Graphics g) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isBracketMatchingEnabled()) {
+ Rectangle match = rsta.getMatchRectangle();
+ if (match!=null) {
+ paintMatchedBracketImpl(g, rsta, match);
+ }
+ if (rsta.getPaintMatchedBracketPair()) {
+ Rectangle dotRect = rsta.getDotRectangle();
+ if (dotRect!=null) { // should always be true
+ paintMatchedBracketImpl(g, rsta, dotRect);
+ }
+ }
+ }
+ }
+
+
+ private void paintMatchedBracketImpl(Graphics g, RSyntaxTextArea rsta,
+ Rectangle r) {
+ // We must add "-1" to the height because otherwise we'll paint below
+ // the region that gets invalidated.
+ if (rsta.getAnimateBracketMatching()) {
+ Color bg = rsta.getMatchedBracketBGColor();
+ if (bg!=null) {
+ g.setColor(bg);
+ g.fillRoundRect(r.x,r.y, r.width,r.height-1, 5,5);
+ }
+ g.setColor(rsta.getMatchedBracketBorderColor());
+ g.drawRoundRect(r.x,r.y, r.width,r.height-1, 5,5);
+ }
+ else {
+ Color bg = rsta.getMatchedBracketBGColor();
+ if (bg!=null) {
+ g.setColor(bg);
+ g.fillRect(r.x,r.y, r.width,r.height-1);
+ }
+ g.setColor(rsta.getMatchedBracketBorderColor());
+ g.drawRect(r.x,r.y, r.width,r.height-1);
+ }
+ }
+
+
+ /**
+ * Gets called whenever a bound property is changed on this UI's
+ * <code>RSyntaxTextArea</code>.
+ *
+ * @param e The property change event.
+ */
+ protected void propertyChange(PropertyChangeEvent e) {
+
+ String name = e.getPropertyName();
+
+ // If they change the syntax scheme, we must do this so that
+ // WrappedSyntaxView(_TEST) updates its child views properly.
+ if (name.equals(RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY)) {
+ modelChanged();
+ }
+
+ // Everything else is general to all RTextAreas.
+ else {
+ super.propertyChange(e);
+ }
+
+ }
+
+
+ /**
+ * Updates the view. This should be called when the underlying
+ * <code>RSyntaxTextArea</code> changes its syntax editing style.
+ */
+ public void refreshSyntaxHighlighting() {
+ modelChanged();
+ }
+
+
+ /**
+ * Returns the y-coordinate of the specified line.<p>
+ *
+ * This method is quicker than using traditional
+ * <code>modelToView(int)</code> calls, as the entire bounding box isn't
+ * computed.
+ */
+ public int yForLine(int line) throws BadLocationException {
+ Rectangle alloc = getVisibleEditorRect();
+ if (alloc!=null) {
+ RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+ return view.yForLine(alloc, line);
+ }
+ return -1;
+ }
+
+
+ /**
+ * Returns the y-coordinate of the line containing a specified offset.<p>
+ *
+ * This is faster than calling <code>modelToView(offs).y</code>, so it is
+ * preferred if you do not need the actual bounding box.
+ */
+ public int yForLineContaining(int offs) throws BadLocationException {
+ Rectangle alloc = getVisibleEditorRect();
+ if (alloc!=null) {
+ RSTAView view = (RSTAView)getRootView(textArea).getView(0);
+ return view.yForLineContaining(alloc, offs);
+ }
+ return -1;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java b/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java
new file mode 100644
index 0000000..75d7ce5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RSyntaxUtilities.java
@@ -0,0 +1,1332 @@
+/*
+ * 08/06/2004
+ *
+ * RSyntaxUtilities.java - Utility methods used by RSyntaxTextArea and its
+ * views.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.Toolkit;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.RTextScrollPane;
+
+
+/**
+ * Utility methods used by <code>RSyntaxTextArea</code> and its associated
+ * classes.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class RSyntaxUtilities implements SwingConstants {
+
+ /**
+ * Integer constant representing a Windows-variant OS.
+ */
+ public static final int OS_WINDOWS = 1;
+
+ /**
+ * Integer constant representing Mac OS X.
+ */
+ public static final int OS_MAC_OSX = 2;
+
+ /**
+ * Integer constant representing Linux.
+ */
+ public static final int OS_LINUX = 4;
+
+ /**
+ * Integer constant representing an "unknown" OS. 99.99% of the
+ * time, this means some UNIX variant (AIX, SunOS, etc.).
+ */
+ public static final int OS_OTHER = 8;
+
+
+ private static final int OS = getOSImpl();
+
+ //private static final int DIGIT_MASK = 1;
+ private static final int LETTER_MASK = 2;
+ //private static final int WHITESPACE_MASK = 4;
+ //private static final int UPPER_CASE_MASK = 8;
+ private static final int HEX_CHARACTER_MASK = 16;
+ private static final int LETTER_OR_DIGIT_MASK = 32;
+ private static final int BRACKET_MASK = 64;
+ private static final int JAVA_OPERATOR_MASK = 128;
+
+ /**
+ * A lookup table used to quickly decide if a 16-bit Java char is a
+ * US-ASCII letter (A-Z or a-z), a digit, a whitespace char (either space
+ * (0x0020) or tab (0x0009)), etc. This method should be faster
+ * than <code>Character.isLetter</code>, <code>Character.isDigit</code>,
+ * and <code>Character.isWhitespace</code> because we know we are dealing
+ * with ASCII chars and so don't have to worry about code planes, etc.
+ */
+ private static final int[] dataTable = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, // 0-15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 4, 128, 0, 0, 0, 128, 128, 0, 64, 64, 128, 128, 0, 128, 0, 128, // 32-47
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 128, 0, 128, 128, 128, 128, // 48-63
+ 0, 58, 58, 58, 58, 58, 58, 42, 42, 42, 42, 42, 42, 42, 42, 42, // 64-79
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 0, 64, 128, 0, // 80-95
+ 0, 50, 50, 50, 50, 50, 50, 34, 34, 34, 34, 34, 34, 34, 34, 34, // 96-111
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 128, 64, 128, 0, // 112-127
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128-143
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240-255.
+ };
+
+ /**
+ * Used in bracket matching methods.
+ */
+ private static Segment charSegment = new Segment();
+
+ /**
+ * Used internally.
+ */
+ private static final char[] JS_KEYWORD_RETURN = { 'r', 'e', 't', 'u', 'r', 'n' };
+
+ /**
+ * Used internally.
+ */
+ private static final String BRACKETS = "{([})]";
+
+
+ /**
+ * Returns a string with characters that are special to HTML (such as
+ * <code><</code>, <code>></code> and <code>&</code>) replaced
+ * by their HTML escape sequences.
+ *
+ * @param s The input string.
+ * @param newlineReplacement What to replace newline characters with.
+ * If this is <code>null</code>, they are simply removed.
+ * @param inPreBlock Whether this HTML will be in within <code>pre</code>
+ * tags. If this is <code>true</code>, spaces will be kept as-is;
+ * otherwise, they will be converted to "<code> </code>".
+ * @return The escaped version of <code>s</code>.
+ */
+ public static final String escapeForHtml(String s,
+ String newlineReplacement, boolean inPreBlock) {
+
+ if (s==null) {
+ return null;
+ }
+ if (newlineReplacement==null) {
+ newlineReplacement = "";
+ }
+ final String tabString = " ";
+ boolean lastWasSpace = false;
+
+ // TODO: When updating to 1.5, replace with StringBuilder, and change
+ // loop to use new append(str, offs,len) method.
+ StringBuffer sb = new StringBuffer();
+
+ for (int i=0; i<s.length(); i++) {
+ char ch = s.charAt(i);
+ switch (ch) {
+ case ' ':
+ if (inPreBlock || !lastWasSpace) {
+ sb.append(' ');
+ }
+ else {
+ sb.append(" ");
+ }
+ lastWasSpace = true;
+ break;
+ case '\n':
+ sb.append(newlineReplacement);
+ lastWasSpace = false;
+ break;
+ case '&':
+ sb.append("&");
+ lastWasSpace = false;
+ break;
+ case '\t':
+ sb.append(tabString);
+ lastWasSpace = false;
+ break;
+ case '<':
+ sb.append("<");
+ lastWasSpace = false;
+ break;
+ case '>':
+ sb.append(">");
+ lastWasSpace = false;
+ break;
+ default:
+ sb.append(ch);
+ lastWasSpace = false;
+ break;
+ }
+ }
+
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Returns the rendering hints for text that will most accurately reflect
+ * those of the native windowing system.
+ *
+ * @return The rendering hints, or <code>null</code> if they cannot be
+ * determined.
+ */
+ public static Map getDesktopAntiAliasHints() {
+ return (Map)Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
+ }
+
+
+ /**
+ * Returns the color to use for the line underneath a folded region line.
+ *
+ * @param textArea The text area.
+ * @return The color to use.
+ */
+ public static Color getFoldedLineBottomColor(RSyntaxTextArea textArea) {
+ Color color = Color.gray;
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ color = gutter.getFoldIndicatorForeground();
+ }
+ return color;
+ }
+
+
+ /**
+ * Returns the gutter component of the scroll pane containing a text
+ * area, if any.
+ *
+ * @param textArea The text area.
+ * @return The gutter, or <code>null</code> if the text area is not in
+ * an {@link RTextScrollPane}.
+ * @see RTextScrollPane#getGutter()
+ */
+ public static Gutter getGutter(RTextArea textArea) {
+ Gutter gutter = null;
+ Container parent = textArea.getParent();
+ if (parent instanceof JViewport) {
+ parent = parent.getParent();
+ if (parent instanceof RTextScrollPane) {
+ RTextScrollPane sp = (RTextScrollPane)parent;
+ gutter = sp.getGutter(); // Should always be non-null
+ }
+ }
+ return gutter;
+ }
+
+
+ /**
+ * Returns the leading whitespace of a string.
+ *
+ * @param text The String to check.
+ * @return The leading whitespace.
+ * @see #getLeadingWhitespace(Document, int)
+ */
+ public static String getLeadingWhitespace(String text) {
+ int count = 0;
+ int len = text.length();
+ while (count<len && RSyntaxUtilities.isWhitespace(text.charAt(count))) {
+ count++;
+ }
+ return text.substring(0, count);
+ }
+
+
+ /**
+ * Returns the leading whitespace of a specific line in a document.
+ *
+ * @param doc The document.
+ * @param offs The offset whose line to get the leading whitespace for.
+ * @return The leading whitespace.
+ * @throws BadLocationException If <code>offs</code> is not a valid offset
+ * in the document.
+ * @see #getLeadingWhitespace(String)
+ */
+ public static String getLeadingWhitespace(Document doc, int offs)
+ throws BadLocationException {
+ Element root = doc.getDefaultRootElement();
+ int line = root.getElementIndex(offs);
+ Element elem = root.getElement(line);
+ int startOffs = elem.getStartOffset();
+ int endOffs = elem.getEndOffset() - 1;
+ String text = doc.getText(startOffs, endOffs-startOffs);
+ return getLeadingWhitespace(text);
+ }
+
+
+ private static final Element getLineElem(Document d, int offs) {
+ Element map = d.getDefaultRootElement();
+ int index = map.getElementIndex(offs);
+ Element elem = map.getElement(index);
+ if ((offs>=elem.getStartOffset()) && (offs<elem.getEndOffset())) {
+ return elem;
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns the bounding box (in the current view) of a specified position
+ * in the model. This method is designed for line-wrapped views to use,
+ * as it allows you to specify a "starting position" in the line, from
+ * which the x-value is assumed to be zero. The idea is that you specify
+ * the first character in a physical line as <code>p0</code>, as this is
+ * the character where the x-pixel value is 0.
+ *
+ * @param textArea The text area containing the text.
+ * @param s A segment in which to load the line. This is passed in so we
+ * don't have to reallocate a new <code>Segment</code> for each
+ * call.
+ * @param p0 The starting position in the physical line in the document.
+ * @param p1 The position for which to get the bounding box in the view.
+ * @param e How to expand tabs.
+ * @param rect The rectangle whose x- and width-values are changed to
+ * represent the bounding box of <code>p1</code>. This is reused
+ * to keep from needlessly reallocating Rectangles.
+ * @param x0 The x-coordinate (pixel) marking the left-hand border of the
+ * text. This is useful if the text area has a border, for example.
+ * @return The bounding box in the view of the character <code>p1</code>.
+ * @throws BadLocationException If <code>p0</code> or <code>p1</code> is
+ * not a valid location in the specified text area's document.
+ * @throws IllegalArgumentException If <code>p0</code> and <code>p1</code>
+ * are not on the same line.
+ */
+ public static Rectangle getLineWidthUpTo(RSyntaxTextArea textArea,
+ Segment s, int p0, int p1,
+ TabExpander e, Rectangle rect,
+ int x0)
+ throws BadLocationException {
+
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+
+ // Ensure p0 and p1 are valid document positions.
+ if (p0<0)
+ throw new BadLocationException("Invalid document position", p0);
+ else if (p1>doc.getLength())
+ throw new BadLocationException("Invalid document position", p1);
+
+ // Ensure p0 and p1 are in the same line, and get the start/end
+ // offsets for that line.
+ Element map = doc.getDefaultRootElement();
+ int lineNum = map.getElementIndex(p0);
+ // We do ">1" because p1 might be the first position on the next line
+ // or the last position on the previous one.
+ // if (lineNum!=map.getElementIndex(p1))
+ if (Math.abs(lineNum-map.getElementIndex(p1))>1)
+ throw new IllegalArgumentException("p0 and p1 are not on the " +
+ "same line (" + p0 + ", " + p1 + ").");
+
+ // Get the token list.
+ Token t = doc.getTokenListForLine(lineNum);
+
+ // Modify the token list 't' to begin at p0 (but still have correct
+ // token types, etc.), and get the x-location (in pixels) of the
+ // beginning of this new token list.
+ makeTokenListStartAt(t, p0, e, textArea, 0);
+
+ rect = t.listOffsetToView(textArea, e, p1, x0, rect);
+ return rect;
+
+ }
+
+
+ /**
+ * Returns the location of the bracket paired with the one at the current
+ * caret position.
+ *
+ * @param textArea The text area.
+ * @param input A point to use as the return value. If this is
+ * <code>null</code>, a new object is created and returned.
+ * @return A point representing the matched bracket info. The "x" field
+ * is the offset of the bracket at the caret position (either just
+ * before or just after the caret), and the "y" field is the offset
+ * of the matched bracket. Both "x" and "y" will be
+ * <code>-1</code> if there isn't a matching bracket (or the caret
+ * isn't on a bracket).
+ */
+ public static Point getMatchingBracketPosition(RSyntaxTextArea textArea,
+ Point input) {
+
+ if (input==null) {
+ input = new Point();
+ }
+ input.setLocation(-1, -1);
+
+ try {
+
+ // Actually position just BEFORE caret.
+ int caretPosition = textArea.getCaretPosition() - 1;
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ char bracket = 0;
+
+ // If the caret was at offset 0, we can't check "to its left."
+ if (caretPosition>=0) {
+ bracket = doc.charAt(caretPosition);
+ }
+
+ // Try to match a bracket "to the right" of the caret if one
+ // was not found on the left.
+ int index = BRACKETS.indexOf(bracket);
+ if (index==-1 && caretPosition<doc.getLength()-1) {
+ bracket = doc.charAt(++caretPosition);
+ }
+
+ // First, see if the char was a bracket (one of "{[()]}").
+ if (index==-1) {
+ index = BRACKETS.indexOf(bracket);
+ if (index==-1) {
+ return input;
+ }
+ }
+
+ // If it was, then make sure this bracket isn't sitting in
+ // the middle of a comment or string. If it isn't, then
+ // initialize some stuff so we can continue on.
+ char bracketMatch;
+ boolean goForward;
+ Element map = doc.getDefaultRootElement();
+ int curLine = map.getElementIndex(caretPosition);
+ Element line = map.getElement(curLine);
+ int start = line.getStartOffset();
+ int end = line.getEndOffset();
+ Token token = doc.getTokenListForLine(curLine);
+ token = RSyntaxUtilities.getTokenAtOffset(token, caretPosition);
+ // All brackets are always returned as "separators."
+ if (token.type!=Token.SEPARATOR) {
+ return input;
+ }
+ if (index<3) { // One of "{[("
+ goForward = true;
+ bracketMatch = BRACKETS.charAt(index + 3);
+ }
+ else { // One of ")]}"
+ goForward = false;
+ bracketMatch = BRACKETS.charAt(index - 3);
+ }
+
+ if (goForward) {
+
+ int lastLine = map.getElementCount();
+
+ // Start just after the found bracket since we're sure
+ // we're not in a comment.
+ start = caretPosition + 1;
+ int numEmbedded = 0;
+ boolean haveTokenList = false;
+
+ while (true) {
+
+ doc.getText(start,end-start, charSegment);
+ int segOffset = charSegment.offset;
+
+ for (int i=segOffset; i<segOffset+charSegment.count; i++) {
+
+ char ch = charSegment.array[i];
+
+ if (ch==bracket) {
+ if (haveTokenList==false) {
+ token = doc.getTokenListForLine(curLine);
+ haveTokenList = true;
+ }
+ int offset = start + (i-segOffset);
+ token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+ if (token.type==Token.SEPARATOR)
+ numEmbedded++;
+ }
+
+ else if (ch==bracketMatch) {
+ if (haveTokenList==false) {
+ token = doc.getTokenListForLine(curLine);
+ haveTokenList = true;
+ }
+ int offset = start + (i-segOffset);
+ token = RSyntaxUtilities.getTokenAtOffset(token, offset);
+ if (token.type==Token.SEPARATOR) {
+ if (numEmbedded==0) {
+ if (textArea.isCodeFoldingEnabled() &&
+ textArea.getFoldManager().isLineHidden(curLine)) {
+ return input; // Match hidden in a fold
+ }
+ input.setLocation(caretPosition, offset);
+ return input;
+ }
+ numEmbedded--;
+ }
+ }
+
+ } // End of for (int i=segOffset; i<segOffset+charSegment.count; i++).
+
+ // Bail out if we've gone through all lines and
+ // haven't found the match.
+ if (++curLine==lastLine)
+ return input;
+
+ // Otherwise, go through the next line.
+ haveTokenList = false;
+ line = map.getElement(curLine);
+ start = line.getStartOffset();
+ end = line.getEndOffset();
+
+ } // End of while (true).
+
+ } // End of if (goForward).
+
+
+ // Otherwise, we're going backward through the file
+ // (since we found '}', ')' or ']').
+ else { // goForward==false
+
+ // End just before the found bracket since we're sure
+ // we're not in a comment.
+ end = caretPosition;// - 1;
+ int numEmbedded = 0;
+ boolean haveTokenList = false;
+ Token t2;
+
+ while (true) {
+
+ doc.getText(start,end-start, charSegment);
+ int segOffset = charSegment.offset;
+ int iStart = segOffset + charSegment.count - 1;
+
+ for (int i=iStart; i>=segOffset; i--) {
+
+ char ch = charSegment.array[i];
+
+ if (ch==bracket) {
+ if (haveTokenList==false) {
+ token = doc.getTokenListForLine(curLine);
+ haveTokenList = true;
+ }
+ int offset = start + (i-segOffset);
+ t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+ if (t2.type==Token.SEPARATOR)
+ numEmbedded++;
+ }
+
+ else if (ch==bracketMatch) {
+ if (haveTokenList==false) {
+ token = doc.getTokenListForLine(curLine);
+ haveTokenList = true;
+ }
+ int offset = start + (i-segOffset);
+ t2 = RSyntaxUtilities.getTokenAtOffset(token, offset);
+ if (t2.type==Token.SEPARATOR) {
+ if (numEmbedded==0) {
+ input.setLocation(caretPosition, offset);
+ return input;
+ }
+ numEmbedded--;
+ }
+ }
+
+ }
+
+ // Bail out if we've gone through all lines and
+ // haven't found the match.
+ if (--curLine==-1) {
+ return input;
+ }
+
+ // Otherwise, get ready for going through the
+ // next line.
+ haveTokenList = false;
+ line = map.getElement(curLine);
+ start = line.getStartOffset();
+ end = line.getEndOffset();
+
+ } // End of while (true).
+
+ } // End of else.
+
+ } catch (BadLocationException ble) {
+ // Shouldn't ever happen.
+ ble.printStackTrace();
+ }
+
+ // Something went wrong...
+ return input;
+
+ }
+
+
+ /**
+ * Returns the next non-whitespace, non-comment token in a text area.
+ *
+ * @param t The next token in this line's token list.
+ * @param textArea The text area.
+ * @param line The current line index (the line index of <code>t</code>).
+ * @return The next non-whitespace, non-comment token, or <code>null</code>
+ * if there isn't one.
+ * @see #getPreviousImportantToken(RSyntaxTextArea, int)
+ */
+ public static final Token getNextImportantToken(Token t,
+ RSyntaxTextArea textArea, int line) {
+ while (t!=null && t.isPaintable() && t.isCommentOrWhitespace()) {
+ t = t.getNextToken();
+ }
+ if ((t==null || !t.isPaintable()) && line<textArea.getLineCount()-1) {
+ t = textArea.getTokenListForLine(++line);
+ return getNextImportantToken(t, textArea, line);
+ }
+ return t;
+ }
+
+
+ /**
+ * Provides a way to determine the next visually represented model
+ * location at which one might place a caret.
+ * Some views may not be visible,
+ * they might not be in the same order found in the model, or they just
+ * might not allow access to some of the locations in the model.<p>
+ *
+ * NOTE: You should only call this method if the passed-in
+ * <code>javax.swing.text.View</code> is an instance of
+ * {@link TokenOrientedView} and <code>javax.swing.text.TabExpander</code>;
+ * otherwise, a <code>ClassCastException</code> could be thrown.
+ *
+ * @param pos the position to convert >= 0
+ * @param a the allocated region in which to render
+ * @param direction the direction from the current position that can
+ * be thought of as the arrow keys typically found on a keyboard.
+ * This will be one of the following values:
+ * <ul>
+ * <li>SwingConstants.WEST
+ * <li>SwingConstants.EAST
+ * <li>SwingConstants.NORTH
+ * <li>SwingConstants.SOUTH
+ * </ul>
+ * @return the location within the model that best represents the next
+ * location visual position
+ * @exception BadLocationException
+ * @exception IllegalArgumentException if <code>direction</code>
+ * doesn't have one of the legal values above
+ */
+ public static int getNextVisualPositionFrom(int pos, Position.Bias b,
+ Shape a, int direction,
+ Position.Bias[] biasRet, View view)
+ throws BadLocationException {
+
+ RSyntaxTextArea target = (RSyntaxTextArea)view.getContainer();
+ biasRet[0] = Position.Bias.Forward;
+
+ // Do we want the "next position" above, below, to the left or right?
+ switch (direction) {
+
+ case NORTH:
+ case SOUTH:
+ if (pos == -1) {
+ pos = (direction == NORTH) ?
+ Math.max(0, view.getEndOffset() - 1) :
+ view.getStartOffset();
+ break;
+ }
+ Caret c = (target != null) ? target.getCaret() : null;
+ // YECK! Ideally, the x location from the magic caret
+ // position would be passed in.
+ Point mcp;
+ if (c != null)
+ mcp = c.getMagicCaretPosition();
+ else
+ mcp = null;
+ int x;
+ if (mcp == null) {
+ Rectangle loc = target.modelToView(pos);
+ x = (loc == null) ? 0 : loc.x;
+ }
+ else {
+ x = mcp.x;
+ }
+ if (direction == NORTH)
+ pos = getPositionAbove(target,pos,x,(TabExpander)view);
+ else
+ pos = getPositionBelow(target,pos,x,(TabExpander)view);
+ break;
+
+ case WEST:
+ if(pos == -1) {
+ pos = Math.max(0, view.getEndOffset() - 1);
+ }
+ else {
+ pos = Math.max(0, pos - 1);
+ if (target.isCodeFoldingEnabled()) {
+ int last = target.getLineOfOffset(pos+1);
+ int current = target.getLineOfOffset(pos);
+ if (last!=current) { // If moving up a line...
+ FoldManager fm = target.getFoldManager();
+ if (fm.isLineHidden(current)) {
+ while (--current>0 && fm.isLineHidden(current));
+ pos = target.getLineEndOffset(current) - 1;
+ }
+ }
+ }
+ }
+ break;
+
+ case EAST:
+ if(pos == -1) {
+ pos = view.getStartOffset();
+ }
+ else {
+ pos = Math.min(pos + 1, view.getDocument().getLength());
+ if (target.isCodeFoldingEnabled()) {
+ int last = target.getLineOfOffset(pos-1);
+ int current = target.getLineOfOffset(pos);
+ if (last!=current) { // If moving down a line...
+ FoldManager fm = target.getFoldManager();
+ if (fm.isLineHidden(current)) {
+ int lineCount = target.getLineCount();
+ while (++current<lineCount && fm.isLineHidden(current));
+ pos = current==lineCount ?
+ target.getLineEndOffset(last)-1 : // Was the last visible line
+ target.getLineStartOffset(current);
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ throw new IllegalArgumentException(
+ "Bad direction: " + direction);
+ }
+
+ return pos;
+
+ }
+
+
+ /**
+ * Determines the position in the model that is closest to the given
+ * view location in the row above. The component given must have a
+ * size to compute the result. If the component doesn't have a size
+ * a value of -1 will be returned.
+ *
+ * @param c the editor
+ * @param offs the offset in the document >= 0
+ * @param x the X coordinate >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
+ * a value of -1 will be returned.
+ * @exception BadLocationException if the offset is out of range
+ */
+ public static final int getPositionAbove(RSyntaxTextArea c, int offs,
+ float x, TabExpander e) throws BadLocationException {
+
+ TokenOrientedView tov = (TokenOrientedView)e;
+ Token token = tov.getTokenListForPhysicalLineAbove(offs);
+ if (token==null)
+ return -1;
+
+ // A line containing only Token.NULL is an empty line.
+ else if (token.type==Token.NULL) {
+ int line = c.getLineOfOffset(offs); // Sure to be >0 ??
+ return c.getLineStartOffset(line-1);
+ }
+
+ else {
+ return token.getListOffset(c, e, 0, x);
+ }
+
+ }
+
+
+ /**
+ * Determines the position in the model that is closest to the given
+ * view location in the row below. The component given must have a
+ * size to compute the result. If the component doesn't have a size
+ * a value of -1 will be returned.
+ *
+ * @param c the editor
+ * @param offs the offset in the document >= 0
+ * @param x the X coordinate >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
+ * a value of -1 will be returned.
+ * @exception BadLocationException if the offset is out of range
+ */
+ public static final int getPositionBelow(RSyntaxTextArea c, int offs,
+ float x, TabExpander e) throws BadLocationException {
+
+ TokenOrientedView tov = (TokenOrientedView)e;
+ Token token = tov.getTokenListForPhysicalLineBelow(offs);
+ if (token==null)
+ return -1;
+
+ // A line containing only Token.NULL is an empty line.
+ else if (token.type==Token.NULL) {
+ int line = c.getLineOfOffset(offs); // Sure to be > c.getLineCount()-1 ??
+// return c.getLineStartOffset(line+1);
+FoldManager fm = c.getFoldManager();
+line = fm.getVisibleLineBelow(line);
+return c.getLineStartOffset(line);
+ }
+
+ else {
+ return token.getListOffset(c, e, 0, x);
+ }
+
+ }
+
+
+ /**
+ * Returns the last non-whitespace, non-comment token, starting with the
+ * specified line.
+ *
+ * @param textArea The text area.
+ * @param line The line at which to start looking.
+ * @return The last non-whitespace, non-comment token, or <code>null</code>
+ * if there isn't one.
+ * @see #getNextImportantToken(Token, RSyntaxTextArea, int)
+ */
+ public static final Token getPreviousImportantToken(
+ RSyntaxTextArea textArea, int line){
+ if (line<0) {
+ return null;
+ }
+ Token t = textArea.getTokenListForLine(line);
+ if (t!=null) {
+ t = t.getLastNonCommentNonWhitespaceToken();
+ if (t!=null) {
+ return t;
+ }
+ }
+ return getPreviousImportantToken(textArea, line-1);
+ }
+
+
+ /**
+ * Returns the token at the specified index, or <code>null</code> if
+ * the given offset isn't in this token list's range.<br>
+ * Note that this method does NOT check to see if <code>tokenList</code>
+ * is null; callers should check for themselves.
+ *
+ * @param tokenList The list of tokens in which to search.
+ * @param offset The offset at which to get the token.
+ * @return The token at <code>offset</code>, or <code>null</code> if
+ * none of the tokens are at that offset.
+ */
+ public static final Token getTokenAtOffset(Token tokenList, int offset) {
+ for (Token t=tokenList; t!=null && t.isPaintable(); t=t.getNextToken()){
+ if (t.containsPosition(offset))
+ return t;
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns the end of the word at the given offset.
+ *
+ * @param textArea The text area.
+ * @param offs The offset into the text area's content.
+ * @return The end offset of the word.
+ * @throws BadLocationException If <code>offs</code> is invalid.
+ * @see #getWordStart(RSyntaxTextArea, int)
+ */
+ public static int getWordEnd(RSyntaxTextArea textArea, int offs)
+ throws BadLocationException {
+
+ Document doc = textArea.getDocument();
+ int endOffs = textArea.getLineEndOffsetOfCurrentLine();
+ int lineEnd = Math.min(endOffs, doc.getLength());
+ if (offs == lineEnd) { // End of the line.
+ return offs;
+ }
+
+ String s = doc.getText(offs, lineEnd-offs-1);
+ if (s!=null && s.length()>0) { // Should always be true
+ int i = 0;
+ int count = s.length();
+ char ch = s.charAt(i);
+ if (Character.isWhitespace(ch)) {
+ while (i<count && Character.isWhitespace(s.charAt(i++)));
+ }
+ else if (Character.isLetterOrDigit(ch)) {
+ while (i<count && Character.isLetterOrDigit(s.charAt(i++)));
+ }
+ else {
+ i = 2;
+ }
+ offs += i - 1;
+ }
+
+ return offs;
+
+ }
+
+ /**
+ * Returns the start of the word at the given offset.
+ *
+ * @param textArea The text area.
+ * @param offs The offset into the text area's content.
+ * @return The start offset of the word.
+ * @throws BadLocationException If <code>offs</code> is invalid.
+ * @see #getWordEnd(RSyntaxTextArea, int)
+ */
+ public static int getWordStart(RSyntaxTextArea textArea, int offs)
+ throws BadLocationException {
+
+ Document doc = textArea.getDocument();
+ Element line = getLineElem(doc, offs);
+ if (line == null) {
+ throw new BadLocationException("No word at " + offs, offs);
+ }
+
+ int lineStart = line.getStartOffset();
+ if (offs==lineStart) { // Start of the line.
+ return offs;
+ }
+
+ int endOffs = Math.min(offs+1, doc.getLength());
+ String s = doc.getText(lineStart, endOffs-lineStart);
+ if(s != null && s.length() > 0) {
+ int i = s.length() - 1;
+ char ch = s.charAt(i);
+ if (Character.isWhitespace(ch)) {
+ while (i>0 && Character.isWhitespace(s.charAt(i-1))) {
+ i--;
+ }
+ offs = lineStart + i;
+ }
+ else if (Character.isLetterOrDigit(ch)) {
+ while (i>0 && Character.isLetterOrDigit(s.charAt(i-1))) {
+ i--;
+ }
+ offs = lineStart + i;
+ }
+
+ }
+
+ return offs;
+
+ }
+
+
+ /**
+ * Determines the width of the given token list taking tabs
+ * into consideration. This is implemented in a 1.1 style coordinate
+ * system where ints are used and 72dpi is assumed.<p>
+ *
+ * This method also assumes that the passed-in token list begins at
+ * x-pixel <code>0</code> in the view (for tab purposes).
+ *
+ * @param tokenList The tokenList list representing the text.
+ * @param textArea The text area in which this token list resides.
+ * @param e The tab expander. This value cannot be <code>null</code>.
+ * @return The width of the token list, in pixels.
+ */
+ public static final float getTokenListWidth(Token tokenList,
+ RSyntaxTextArea textArea,
+ TabExpander e) {
+ return getTokenListWidth(tokenList, textArea, e, 0);
+ }
+
+
+ /**
+ * Determines the width of the given token list taking tabs
+ * into consideration. This is implemented in a 1.1 style coordinate
+ * system where ints are used and 72dpi is assumed.<p>
+ *
+ * @param tokenList The token list list representing the text.
+ * @param textArea The text area in which this token list resides.
+ * @param e The tab expander. This value cannot be <code>null</code>.
+ * @param x0 The x-pixel coordinate of the start of the token list.
+ * @return The width of the token list, in pixels.
+ * @see #getTokenListWidthUpTo
+ */
+ public static final float getTokenListWidth(final Token tokenList,
+ RSyntaxTextArea textArea,
+ TabExpander e, float x0) {
+ float width = x0;
+ for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+ width += t.getWidth(textArea, e, width);
+ }
+ return width - x0;
+ }
+
+
+ /**
+ * Determines the width of the given token list taking tabs into
+ * consideration and only up to the given index in the document
+ * (exclusive).
+ *
+ * @param tokenList The token list representing the text.
+ * @param textArea The text area in which this token list resides.
+ * @param e The tab expander. This value cannot be <code>null</code>.
+ * @param x0 The x-pixel coordinate of the start of the token list.
+ * @param upTo The document position at which you want to stop,
+ * exclusive. If this position is before the starting position
+ * of the token list, a width of <code>0</code> will be
+ * returned; similarly, if this position comes after the entire
+ * token list, the width of the entire token list is returned.
+ * @return The width of the token list, in pixels, up to, but not
+ * including, the character at position <code>upTo</code>.
+ * @see #getTokenListWidth
+ */
+ public static final float getTokenListWidthUpTo(final Token tokenList,
+ RSyntaxTextArea textArea, TabExpander e,
+ float x0, int upTo) {
+ float width = 0;
+ for (Token t=tokenList; t!=null&&t.isPaintable(); t=t.getNextToken()) {
+ if (t.containsPosition(upTo)) {
+ return width + t.getWidthUpTo(upTo-t.offset, textArea, e,
+ x0+width);
+ }
+ width += t.getWidth(textArea, e, x0+width);
+ }
+ return width;
+ }
+
+
+ /**
+ * Returns whether or not this character is a "bracket" to be matched by
+ * such programming languages as C, C++, and Java.
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a "bracket" - one of '(', ')',
+ * '[', ']', '{', and '}'.
+ */
+ public static final boolean isBracket(char ch) {
+ // We need the first condition as it might be that ch>255, and thus
+ // not in our table. '}' is the highest-valued char in the bracket
+ // set.
+ return ch<='}' && (dataTable[ch]&BRACKET_MASK)>0;
+ }
+
+
+ /**
+ * Returns whether or not a character is a digit (0-9).
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a digit.
+ */
+ public static final boolean isDigit(char ch) {
+ // We do it this way as we'd need to do two conditions anyway (first
+ // to check that ch<255 so it can index into our table, then whether
+ // that table position has the digit mask).
+ return ch>='0' && ch<='9';
+ }
+
+
+ /**
+ * Returns whether or not this character is a hex character. This method
+ * accepts both upper- and lower-case letters a-f.
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a hex character 0-9, a-f, or
+ * A-F.
+ */
+ public static final boolean isHexCharacter(char ch) {
+ // We need the first condition as it could be that ch>255 (and thus
+ // not a valid index into our table). 'f' is the highest-valued
+ // char that is a valid hex character.
+ return (ch<='f') && (dataTable[ch]&HEX_CHARACTER_MASK)>0;
+ }
+
+
+ /**
+ * Returns whether a character is a Java operator. Note that C and C++
+ * operators are the same as Java operators.
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a Java operator.
+ */
+ public static final boolean isJavaOperator(char ch) {
+ // We need the first condition as it could be that ch>255 (and thus
+ // not a valid index into our table). '~' is the highest-valued
+ // char that is a valid Java operator.
+ return (ch<='~') && (dataTable[ch]&JAVA_OPERATOR_MASK)>0;
+ }
+
+
+ /**
+ * Returns whether a character is a US-ASCII letter (A-Z or a-z).
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a US-ASCII letter.
+ */
+ public static final boolean isLetter(char ch) {
+ // We need the first condition as it could be that ch>255 (and thus
+ // not a valid index into our table).
+ return (ch<='z') && (dataTable[ch]&LETTER_MASK)>0;
+ }
+
+
+ /**
+ * Returns whether or not a character is a US-ASCII letter or a digit.
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a US-ASCII letter or a digit.
+ */
+ public static final boolean isLetterOrDigit(char ch) {
+ // We need the first condition as it could be that ch>255 (and thus
+ // not a valid index into our table).
+ return (ch<='z') && (dataTable[ch]&LETTER_OR_DIGIT_MASK)>0;
+ }
+
+
+ /**
+ * Returns whether or not a character is a whitespace character (either
+ * a space ' ' or tab '\t'). This checks for the Unicode character values
+ * 0x0020 and 0x0009.
+ *
+ * @param ch The character to check.
+ * @return Whether or not the character is a whitespace character.
+ */
+ public static final boolean isWhitespace(char ch) {
+ // We do it this way as we'd need to do two conditions anyway (first
+ // to check that ch<255 so it can index into our table, then whether
+ // that table position has the whitespace mask).
+ return ch==' ' || ch=='\t';
+ }
+
+
+ /**
+ * Modifies the passed-in token list to start at the specified offset.
+ * For example, if the token list covered positions 20-60 in the document
+ * (inclusive) like so:
+ * <pre>
+ * [token1] -> [token2] -> [token3] -> [token4]
+ * 20 30 31 40 41 50 51 60
+ * </pre>
+ * and you used this method to make the token list start at position 44,
+ * then the token list would be modified to be the following:
+ * <pre>
+ * [part-of-old-token3] -> [token4]
+ * 44 50 51 60
+ * </pre>
+ * Tokens that come before the specified position are forever lost, and
+ * the token containing that position is made to begin at that position if
+ * necessary. All token types remain the same as they were originally.<p>
+ *
+ * This method can be useful if you are only interested in part of a token
+ * list (i.e., the line it represents), but you don't want to modify the
+ * token list yourself.
+ *
+ * @param tokenList The list to make start at the specified position.
+ * This parameter is modified.
+ * @param pos The position at which the new token list is to start. If
+ * this position is not in the passed-in token list,
+ * returned token list will either be <code>null</code> or the
+ * unpaintable token(s) at the end of the passed-in token list.
+ * @param e How to expand tabs.
+ * @param textArea The text area from which the token list came.
+ * @param x0 The initial x-pixel position of the old token list.
+ * @return The width, in pixels, of the part of the token list "removed
+ * from the front." This way, you know the x-offset of the "new"
+ * token list.
+ */
+ public static float makeTokenListStartAt(Token tokenList, int pos,
+ TabExpander e,
+ final RSyntaxTextArea textArea,
+ float x0) {
+
+ Token t = tokenList;
+
+ // Loop through the token list until you find the one that contains
+ // pos. Remember the cumulative width of all of these tokens.
+ while (t!=null && t.isPaintable() && !t.containsPosition(pos)) {
+ x0 += t.getWidth(textArea, e, x0);
+ t = t.getNextToken();
+ }
+
+ // Make the token that contains pos start at pos.
+ if (t!=null && t.isPaintable() && t.offset!=pos) {
+ // Number of chars between p0 and token start.
+ int difference = pos - t.offset;
+ x0 += t.getWidthUpTo(t.textCount-difference+1, textArea, e, x0);
+ t.makeStartAt(pos);
+ }
+
+ // Make the passed-in token list point to the proper place.
+ // t can be null, for example, if line ends with unended MLC.
+ if (t!=null && t.isPaintable())
+ tokenList.copyFrom(t);
+ else
+ tokenList = null;
+ t = null;
+
+ // Return the x-offset (in pixels) of the newly-modified t.
+ return x0;
+
+ }
+
+
+ /**
+ * Returns whether a regular expression token can follow the specified
+ * token in JavaScript.
+ *
+ * @param t The token to check, which may be <code>null</code>.
+ * @return Whether a regular expression token may follow this one in
+ * JavaScript.
+ */
+ public static boolean regexCanFollowInJavaScript(Token t) {
+ char ch;
+ // We basically try to mimic Eclipse's JS editor's behavior here.
+ return t==null ||
+ //t.isOperator() ||
+ (t.textCount==1 && (
+ (ch=t.text[t.textOffset])=='=' ||
+ ch=='(' ||
+ ch==',' ||
+ ch=='?' ||
+ ch==':' ||
+ ch=='[' ||
+ ch=='!' ||
+ ch=='&'
+ )) ||
+ /* Operators "==", "===", "!=", "!==" */
+ (t.type==Token.OPERATOR &&
+ t.text[t.textOffset+t.textCount-1]=='=') ||
+ t.is(Token.RESERVED_WORD, JS_KEYWORD_RETURN);
+ }
+
+
+ /**
+ * If the character is an upper-case US-ASCII letter, it returns the
+ * lower-case version of that letter; otherwise, it just returns the
+ * character.
+ *
+ * @param ch The character to lower-case (if it is a US-ASCII upper-case
+ * character).
+ * @return The lower-case version of the character.
+ */
+ public static final char toLowerCase(char ch) {
+ // We can logical OR with 32 because A-Z are 65-90 in the ASCII table
+ // and none of them have the 6th bit (32) set, and a-z are 97-122 in
+ // the ASCII table, which is 32 over from A-Z.
+ // We do it this way as we'd need to do two conditions anyway (first
+ // to check that ch<255 so it can index into our table, then whether
+ // that table position has the upper-case mask).
+ if (ch>='A' && ch<='Z')
+ return (char)(ch | 0x20);
+ return ch;
+ }
+
+
+ /**
+ * Returns an integer constant representing the OS. This can be handy for
+ * special case situations such as Mac OS-X (special application
+ * registration) or Windows (allow mixed case, etc.).
+ *
+ * @return An integer constant representing the OS.
+ */
+ public static final int getOS() {
+ return OS;
+ }
+
+
+ /**
+ * Returns an integer constant representing the OS. This can be handy for
+ * special case situations such as Mac OS-X (special application
+ * registration) or Windows (allow mixed case, etc.).
+ *
+ * @return An integer constant representing the OS.
+ */
+ private static final int getOSImpl() {
+ int os = OS_OTHER;
+ String osName = System.getProperty("os.name");
+ if (osName!=null) { // Should always be true.
+ osName = osName.toLowerCase();
+ if (osName.indexOf("windows") > -1)
+ os = OS_WINDOWS;
+ else if (osName.indexOf("mac os x") > -1)
+ os = OS_MAC_OSX;
+ else if (osName.indexOf("linux") > -1)
+ os = OS_LINUX;
+ else
+ os = OS_OTHER;
+ }
+ return os;
+ }
+
+
+ /**
+ * Creates a regular expression pattern that matches a "wildcard" pattern.
+ *
+ * @param wildcard The wildcard pattern.
+ * @param matchCase Whether the pattern should be case sensitive.
+ * @param escapeStartChar Whether to escape a starting <code>'^'</code>
+ * character.
+ * @return The pattern.
+ */
+ public static Pattern wildcardToPattern(String wildcard, boolean matchCase,
+ boolean escapeStartChar) {
+
+ int flags = 0;
+ if (!matchCase) {
+ flags = Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE;
+ }
+
+ StringBuffer sb = new StringBuffer();
+ for (int i=0; i<wildcard.length(); i++) {
+ char ch = wildcard.charAt(i);
+ switch (ch) {
+ case '*':
+ sb.append(".*");
+ break;
+ case '?':
+ sb.append('.');
+ break;
+ case '^':
+ if (i>0 || escapeStartChar) {
+ sb.append('\\');
+ }
+ sb.append('^');
+ break;
+ case '\\':
+ case '.': case '|':
+ case '+': case '-':
+ case '$':
+ case '[': case ']':
+ case '{': case '}':
+ case '(': case ')':
+ sb.append('\\').append(ch);
+ break;
+ default:
+ sb.append(ch);
+ break;
+ }
+ }
+
+ Pattern p = null;
+ try {
+ p = Pattern.compile(sb.toString(), flags);
+ } catch (PatternSyntaxException pse) {
+ pse.printStackTrace();
+ p = Pattern.compile(".+");
+ }
+
+ return p;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RTfToText.java b/src/org/fife/ui/rsyntaxtextarea/RTfToText.java
new file mode 100644
index 0000000..7913656
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RTfToText.java
@@ -0,0 +1,227 @@
+/*
+ * 07/28/2008
+ *
+ * RtfToText.java - Returns the plain text version of RTF documents.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.*;
+
+
+/**
+ * Gets the plain text version of RTF documents.<p>
+ *
+ * This is used by <code>RtfTransferable</code> to return the plain text
+ * version of the transferable when the receiver does not support RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfToText {
+
+ private Reader r;
+ private StringBuffer sb;
+ private StringBuffer controlWord;
+ private int blockCount;
+ private boolean inControlWord;
+
+
+ /**
+ * Private constructor.
+ *
+ * @param r The reader to read RTF text from.
+ */
+ private RtfToText(Reader r) {
+ this.r = r;
+ sb = new StringBuffer();
+ controlWord = new StringBuffer();
+ blockCount = 0;
+ inControlWord = false;
+ }
+
+
+ /**
+ * Converts the RTF text read from this converter's <code>Reader</code>
+ * into plain text. It is the caller's responsibility to close the
+ * reader after this method is called.
+ *
+ * @return The plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ private String convert() throws IOException {
+
+ // Skip over first curly brace as the whole file is in '{' and '}'
+ int i = r.read();
+ if (i!='{') {
+ throw new IOException("Invalid RTF file");
+ }
+
+ while ((i=r.read())!=-1) {
+
+ char ch = (char)i;
+ switch (ch) {
+ case '{':
+ if (inControlWord && controlWord.length()==0) { // "\{"
+ sb.append('{');
+ controlWord.setLength(0);
+ inControlWord = false;
+ }
+ else {
+ blockCount++;
+ }
+ break;
+ case '}':
+ if (inControlWord && controlWord.length()==0) { // "\}"
+ sb.append('}');
+ controlWord.setLength(0);
+ inControlWord = false;
+ }
+ else {
+ blockCount--;
+ }
+ break;
+ case '\\':
+ if (blockCount==0) {
+ if (inControlWord) {
+ if (controlWord.length()==0) { // "\\"
+ sb.append('\\');
+ controlWord.setLength(0);
+ inControlWord = false;
+ }
+ else {
+ endControlWord();
+ inControlWord = true;
+ }
+ }
+ else {
+ inControlWord = true;
+ }
+ }
+ break;
+ case ' ':
+ if (blockCount==0) {
+ if (inControlWord) {
+ endControlWord();
+ }
+ else {
+ sb.append(' ');
+ }
+ }
+ break;
+ case '\r':
+ case '\n':
+ if (blockCount==0) {
+ if (inControlWord) {
+ endControlWord();
+ }
+ // Otherwise, ignore
+ }
+ break;
+ default:
+ if (blockCount==0) {
+ if (inControlWord) {
+ controlWord.append(ch);
+ }
+ else {
+ sb.append(ch);
+ }
+ }
+ break;
+ }
+
+ }
+
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Ends a control word. Checks whether it is a common one that affects
+ * the plain text output (such as "<code>par</code>" or "<code>tab</code>")
+ * and updates the text buffer accordingly.
+ */
+ private void endControlWord() {
+ String word = controlWord.toString();
+ if ("par".equals(word)) {
+ sb.append('\n');
+ }
+ else if ("tab".equals(word)) {
+ sb.append('\t');
+ }
+ controlWord.setLength(0);
+ inControlWord = false;
+ }
+
+
+ /**
+ * Converts the contents of the specified byte array representing
+ * an RTF document into plain text.
+ *
+ * @param rtf The byte array representing an RTF document.
+ * @return The contents of the RTF document, in plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ public static String getPlainText(byte[] rtf) throws IOException {
+ return getPlainText(new ByteArrayInputStream(rtf));
+ }
+
+
+ /**
+ * Converts the contents of the specified RTF file to plain text.
+ *
+ * @param file The RTF file to convert.
+ * @return The contents of the file, in plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ public static String getPlainText(File file) throws IOException {
+ return getPlainText(new BufferedReader(new FileReader(file)));
+ }
+
+
+ /**
+ * Converts the contents of the specified input stream to plain text.
+ * The input stream will be closed when this method returns.
+ *
+ * @param in The input stream to convert.
+ * @return The contents of the stream, in plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ public static String getPlainText(InputStream in) throws IOException {
+ return getPlainText(new InputStreamReader(in, "US-ASCII"));
+ }
+
+
+ /**
+ * Converts the contents of the specified <code>Reader</code> to plain text.
+ *
+ * @param r The <code>Reader</code>.
+ * @return The contents of the <code>Reader</code>, in plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ private static String getPlainText(Reader r) throws IOException {
+ try {
+ RtfToText converter = new RtfToText(r);
+ return converter.convert();
+ } finally {
+ r.close();
+ }
+ }
+
+
+ /**
+ * Converts the contents of the specified String to plain text.
+ *
+ * @param rtf A string whose contents represent an RTF document.
+ * @return The contents of the String, in plain text.
+ * @throws IOException If an IO error occurs.
+ */
+ public static String getPlainText(String rtf) throws IOException {
+ return getPlainText(new StringReader(rtf));
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java b/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java
new file mode 100644
index 0000000..1c70f38
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RtfGenerator.java
@@ -0,0 +1,484 @@
+/*
+ * 07/28/2008
+ *
+ * RtfGenerator.java - Generates RTF via a simple Java API.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Toolkit;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * Generates RTF text via a simple Java API.<p>
+ *
+ * The following RTF features are supported:
+ * <ul>
+ * <li>Fonts
+ * <li>Font sizes
+ * <li>Foreground and background colors
+ * <li>Bold, italic, and underline
+ * </ul>
+ *
+ * The RTF generated isn't really "optimized," but it will do, especially for
+ * small amounts of text, such as what's common when copy-and-pasting. It
+ * tries to be sufficient for the use case of copying syntax highlighted
+ * code:
+ * <ul>
+ * <li>It assumes that tokens changing foreground color often is fairly
+ * common.
+ * <li>It assumes that background highlighting is fairly uncommon.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RtfGenerator {
+
+ private List fontList;
+ private List colorList;
+ private StringBuffer document;
+ private boolean lastWasControlWord;
+ private int lastFontIndex;
+ private int lastFGIndex;
+ private boolean lastBold;
+ private boolean lastItalic;
+ private int lastFontSize;
+
+ /**
+ * Java2D assumes a 72 dpi screen resolution, but on Windows the screen
+ * resolution is either 96 dpi or 120 dpi, depending on your font display
+ * settings. This is an attempt to make the RTF generated match the
+ * size of what's displayed in the RSyntaxTextArea.
+ */
+ private int screenRes;
+
+ /**
+ * The default font size for RTF. This is point size, in half
+ * points.
+ */
+ private static final int DEFAULT_FONT_SIZE = 12;//24;
+
+
+ /**
+ * Constructor.
+ */
+ public RtfGenerator() {
+ fontList = new ArrayList(1); // Usually only 1.
+ colorList = new ArrayList(1); // Usually only 1.
+ document = new StringBuffer();
+ reset();
+ }
+
+
+ /**
+ * Adds a newline to the RTF document.
+ *
+ * @see #appendToDoc(String, Font, Color, Color)
+ */
+ public void appendNewline() {
+ document.append("\\par");
+ document.append('\n'); // Just for ease of reading RTF.
+ lastWasControlWord = false;
+ }
+
+
+ /**
+ * Appends styled text to the RTF document being generated.
+ *
+ * @param text The text to append.
+ * @param f The font of the text. If this is <code>null</code>, the
+ * default font is used.
+ * @param fg The foreground of the text. If this is <code>null</code>,
+ * the default foreground color is used.
+ * @param bg The background color of the text. If this is
+ * <code>null</code>, the default background color is used.
+ * @see #appendNewline()
+ */
+ public void appendToDoc(String text, Font f, Color fg, Color bg) {
+ appendToDoc(text, f, fg, bg, false);
+ }
+
+
+ /**
+ * Appends styled text to the RTF document being generated.
+ *
+ * @param text The text to append.
+ * @param f The font of the text. If this is <code>null</code>, the
+ * default font is used.
+ * @param bg The background color of the text. If this is
+ * <code>null</code>, the default background color is used.
+ * @param underline Whether the text should be underlined.
+ * @see #appendNewline()
+ */
+ public void appendToDocNoFG(String text, Font f, Color bg,
+ boolean underline) {
+ appendToDoc(text, f, null, bg, underline, false);
+ }
+
+
+ /**
+ * Appends styled text to the RTF document being generated.
+ *
+ * @param text The text to append.
+ * @param f The font of the text. If this is <code>null</code>, the
+ * default font is used.
+ * @param fg The foreground of the text. If this is <code>null</code>,
+ * the default foreground color is used.
+ * @param bg The background color of the text. If this is
+ * <code>null</code>, the default background color is used.
+ * @param underline Whether the text should be underlined.
+ * @see #appendNewline()
+ */
+ public void appendToDoc(String text, Font f, Color fg, Color bg,
+ boolean underline) {
+ appendToDoc(text, f, fg, bg, underline, true);
+ }
+
+
+ /**
+ * Appends styled text to the RTF document being generated.
+ *
+ * @param text The text to append.
+ * @param f The font of the text. If this is <code>null</code>, the
+ * default font is used.
+ * @param fg The foreground of the text. If this is <code>null</code>,
+ * the default foreground color is used.
+ * @param bg The background color of the text. If this is
+ * <code>null</code>, the default background color is used.
+ * @param underline Whether the text should be underlined.
+ * @param setFG Whether the foreground specified by <code>fg</code> should
+ * be honored (if it is non-<code>null</code>).
+ * @see #appendNewline()
+ */
+ public void appendToDoc(String text, Font f, Color fg, Color bg,
+ boolean underline, boolean setFG) {
+
+ if (text!=null) {
+
+ // Set font to use, if different from last addition.
+ int fontIndex = f==null ? 0 : (getFontIndex(fontList, f)+1);
+ if (fontIndex!=lastFontIndex) {
+ document.append("\\f").append(fontIndex);
+ lastFontIndex = fontIndex;
+ lastWasControlWord = true;
+ }
+
+ // Set styles to use.
+ if (f!=null) {
+ int fontSize = fixFontSize(f.getSize2D()*2); // Half points!
+ if (fontSize!=lastFontSize) {
+ document.append("\\fs").append(fontSize);
+ lastFontSize = fontSize;
+ lastWasControlWord = true;
+ }
+ if (f.isBold()!=lastBold) {
+ document.append(lastBold ? "\\b0" : "\\b");
+ lastBold = !lastBold;
+ lastWasControlWord = true;
+ }
+ if (f.isItalic()!=lastItalic) {
+ document.append(lastItalic ? "\\i0" : "\\i");
+ lastItalic = !lastItalic;
+ lastWasControlWord = true;
+ }
+ }
+ else { // No font specified - assume neither bold nor italic.
+ if (lastFontSize!=DEFAULT_FONT_SIZE) {
+ document.append("\\fs").append(DEFAULT_FONT_SIZE);
+ lastFontSize = DEFAULT_FONT_SIZE;
+ lastWasControlWord = true;
+ }
+ if (lastBold) {
+ document.append("\\b0");
+ lastBold = false;
+ lastWasControlWord = true;
+ }
+ if (lastItalic) {
+ document.append("\\i0");
+ lastItalic = false;
+ lastWasControlWord = true;
+ }
+ }
+ if (underline) {
+ document.append("\\ul");
+ lastWasControlWord = true;
+ }
+
+ // Set the foreground color.
+ if (setFG) {
+ int fgIndex = 0;
+ if (fg!=null) { // null => fg color index 0
+ fgIndex = getIndex(colorList, fg)+1;
+ }
+ if (fgIndex!=lastFGIndex) {
+ document.append("\\cf").append(fgIndex);
+ lastFGIndex = fgIndex;
+ lastWasControlWord = true;
+ }
+ }
+
+ // Set the background color.
+ if (bg!=null) {
+ int pos = getIndex(colorList, bg);
+ document.append("\\highlight").append(pos+1);
+ lastWasControlWord = true;
+ }
+
+ if (lastWasControlWord) {
+ document.append(' '); // Delimiter
+ lastWasControlWord = false;
+ }
+ escapeAndAdd(document, text);
+
+ // Reset everything that was set for this text fragment.
+ if (bg!=null) {
+ document.append("\\highlight0");
+ lastWasControlWord = true;
+ }
+ if (underline) {
+ document.append("\\ul0");
+ lastWasControlWord = true;
+ }
+
+ }
+
+ }
+
+
+ /**
+ * Appends some text to a buffer, with special care taken for special
+ * characters as defined by the RTF spec:
+ *
+ * <ul>
+ * <li>All tab characters are replaced with the string
+ * "<code>\tab</code>"
+ * <li>'\', '{' and '}' are changed to "\\", "\{" and "\}"
+ * </ul>
+ *
+ * @param text The text to append (with tab chars substituted).
+ * @param sb The buffer to append to.
+ */
+ private final void escapeAndAdd(StringBuffer sb, String text) {
+ // TODO: On the move to 1.5 use StringBuffer append() overloads that
+ // can take a CharSequence and a range of that CharSequence to speed
+ // things up.
+ //int last = 0;
+ int count = text.length();
+ for (int i=0; i<count; i++) {
+ char ch = text.charAt(i);
+ switch (ch) {
+ case '\t':
+ // Micro-optimization: for syntax highlighting with
+ // tab indentation, there are often multiple tabs
+ // back-to-back at the start of lines, so don't put
+ // spaces between each "\tab".
+ sb.append("\\tab");
+ while ((++i<count) && text.charAt(i)=='\t') {
+ sb.append("\\tab");
+ }
+ sb.append(' ');
+ i--; // We read one too far.
+ break;
+ case '\\':
+ case '{':
+ case '}':
+ sb.append('\\').append(ch);
+ break;
+ default:
+ sb.append(ch);
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * Returns a font point size, adjusted for the current screen resolution.<p>
+ *
+ * Java2D assumes 72 dpi. On systems with larger dpi (Windows, GTK, etc.),
+ * font rendering will appear too small if we simply return a Java "Font"
+ * object's getSize() value. We need to adjust it for the screen
+ * resolution.
+ *
+ * @param pointSize A Java Font's point size, as returned from
+ * <code>getSize2D()</code>.
+ * @return The font point size, adjusted for the current screen resolution.
+ * This will allow other applications to render fonts the same
+ * size as they appear in the Java application.
+ */
+ private int fixFontSize(float pointSize) {
+ if (screenRes!=72) { // Java2D assumes 72 dpi
+ pointSize = Math.round(pointSize*72f/screenRes);
+ }
+ return (int)pointSize;
+ }
+
+
+ private String getColorTableRtf() {
+
+ // Example:
+ // "{\\colortbl ;\\red255\\green0\\blue0;\\red0\\green0\\blue255; }"
+
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("{\\colortbl ;");
+ for (int i=0; i<colorList.size(); i++) {
+ Color c = (Color)colorList.get(i);
+ sb.append("\\red").append(c.getRed());
+ sb.append("\\green").append(c.getGreen());
+ sb.append("\\blue").append(c.getBlue());
+ sb.append(';');
+ }
+ sb.append("}");
+
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Returns the index of the specified font in a list of fonts. This
+ * method only checks for a font by its family name; its attributes such
+ * as bold and italic are ignored.<p>
+ *
+ * If the font is not in the list, it is added, and its new index is
+ * returned.
+ *
+ * @param list The list (possibly) containing the font.
+ * @param font The font to get the index of.
+ * @return The index of the font.
+ */
+ private static int getFontIndex(List list, Font font) {
+ String fontName = font.getFamily();
+ for (int i=0; i<list.size(); i++) {
+ Font font2 = (Font)list.get(i);
+ if (font2.getFamily().equals(fontName)) {
+ return i;
+ }
+ }
+ list.add(font);
+ return list.size()-1;
+ }
+
+
+ private String getFontTableRtf() {
+
+ // Example:
+ // "{\\fonttbl{\\f0\\fmodern\\fcharset0 Courier;}}"
+
+ StringBuffer sb = new StringBuffer();
+
+ // Workaround for text areas using the Java logical font "Monospaced"
+ // by default. There's no way to know what it's mapped to, so we
+ // just search for a monospaced font on the system.
+ String monoFamilyName = getMonospacedFontFamily();
+
+ sb.append("{\\fonttbl{\\f0\\fnil\\fcharset0 " + monoFamilyName + ";}");
+ for (int i=0; i<fontList.size(); i++) {
+ Font f = (Font)fontList.get(i);
+ String familyName = f.getFamily();
+ if (familyName.equals("Monospaced")) {
+ familyName = monoFamilyName;
+ }
+ sb.append("{\\f").append(i+1).append("\\fnil\\fcharset0 ");
+ sb.append(familyName).append(";}");
+ }
+ sb.append('}');
+
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Returns the index of the specified item in a list. If the item
+ * is not in the list, it is added, and its new index is returned.
+ *
+ * @param list The list (possibly) containing the item.
+ * @param item The item to get the index of.
+ * @return The index of the item.
+ */
+ private static int getIndex(List list, Object item) {
+ int pos = list.indexOf(item);
+ if (pos==-1) {
+ list.add(item);
+ pos = list.size()-1;
+ }
+ return pos;
+ }
+
+
+ /**
+ * Returns a good "default" monospaced font to use when Java's logical
+ * font "Monospaced" is found.
+ *
+ * @return The monospaced font family to use.
+ */
+ private static final String getMonospacedFontFamily() {
+ String family = RTextArea.getDefaultFont().getFamily();
+ if ("Monospaced".equals(family)) {
+ family = "Courier";
+ }
+ return family;
+ }
+
+
+ /**
+ * Returns the RTF document created by this generator.
+ *
+ * @return The RTF document, as a <code>String</code>.
+ */
+ public String getRtf() {
+
+ StringBuffer sb = new StringBuffer();
+ sb.append("{");
+
+ // Header
+ sb.append("\\rtf1\\ansi\\ansicpg1252");
+ sb.append("\\deff0"); // First font in font table is the default
+ sb.append("\\deflang1033");
+ sb.append("\\viewkind4"); // "Normal" view
+ sb.append("\\uc\\pard\\f0");
+ sb.append("\\fs20"); // Font size in half-points (default 24)
+ sb.append(getFontTableRtf()).append('\n');
+ sb.append(getColorTableRtf()).append('\n');
+
+ // Content
+ sb.append(document);
+
+ sb.append("}");
+
+ //System.err.println("*** " + sb.length());
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Resets this generator. All document information and content is
+ * cleared.
+ */
+ public void reset() {
+ fontList.clear();
+ colorList.clear();
+ document.setLength(0);
+ lastWasControlWord = false;
+ lastFontIndex = 0;
+ lastFGIndex = 0;
+ lastBold = false;
+ lastItalic = false;
+ lastFontSize = DEFAULT_FONT_SIZE;
+ screenRes = Toolkit.getDefaultToolkit().getScreenResolution();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java b/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java
new file mode 100644
index 0000000..4d30bb5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/RtfTransferable.java
@@ -0,0 +1,91 @@
+/*
+ * 07/28/2008
+ *
+ * RtfTransferable.java - Used during drag-and-drop to represent RTF text.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.datatransfer.*;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+
+
+/**
+ * Object used during copy/paste and DnD operations to represent RTF text.
+ * It can return the text being moved as either RTF or plain text. This
+ * class is basically the same as
+ * <code>java.awt.datatransfer.StringSelection</code>, except that it can also
+ * return the text as RTF.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RtfTransferable implements Transferable {
+
+ /**
+ * The RTF data, in bytes (the RTF is 7-bit ascii).
+ */
+ private byte[] data;
+
+
+ /**
+ * The "flavors" the text can be returned as.
+ */
+ private final DataFlavor[] FLAVORS = {
+ new DataFlavor("text/rtf", "RTF"),
+ DataFlavor.stringFlavor,
+ DataFlavor.plainTextFlavor // deprecated
+ };
+
+
+ /**
+ * Constructor.
+ *
+ * @param data The RTF data.
+ */
+ public RtfTransferable(byte[] data) {
+ this.data = data;
+ }
+
+
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ if (flavor.equals(FLAVORS[0])) { // RTF
+ return new ByteArrayInputStream(data==null ? new byte[0] : data);
+ }
+ else if (flavor.equals(FLAVORS[1])) { // stringFlavor
+ return data==null ? "" : RtfToText.getPlainText(data);
+ }
+ else if (flavor.equals(FLAVORS[2])) { // plainTextFlavor (deprecated)
+ String text = ""; // Valid if data==null
+ if (data!=null) {
+ text = RtfToText.getPlainText(data);
+ }
+ return new StringReader(text);
+ }
+ else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return (DataFlavor[])FLAVORS.clone();
+ }
+
+
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ for (int i=0; i<FLAVORS.length; i++) {
+ if (flavor.equals(FLAVORS[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java b/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java
new file mode 100644
index 0000000..f587d40
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java
@@ -0,0 +1,59 @@
+/*
+ * 02/16/2012
+ *
+ * Copyright (C) 2013 Robert Futrell
+ * robert_futrell at users.sourceforge.net
+ * http://fifesoft.com/rsyntaxtextarea
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.event.HyperlinkEvent;
+
+
+/**
+ * A link generator result that selects a region of text in the text area.
+ * This will typically be used by IDE-style applications, to provide support
+ * for "linking" the use of a variable in a document to its declaration.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see LinkGenerator
+ */
+public class SelectRegionLinkGeneratorResult implements LinkGeneratorResult {
+
+ private RSyntaxTextArea textArea;
+ private int sourceOffset;
+ private int selStart;
+ private int selEnd;
+
+
+ public SelectRegionLinkGeneratorResult(RSyntaxTextArea textArea,
+ int sourceOffset, int selStart, int selEnd) {
+ this.textArea = textArea;
+ this.sourceOffset = sourceOffset;
+ this.selStart = selStart;
+ this.selEnd = selEnd;
+ }
+
+
+ /**
+ * Selects the text in the text area.
+ */
+ public HyperlinkEvent execute() {
+ textArea.select(selStart, selEnd);
+ return null;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getSourceOffset() {
+ return sourceOffset;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java b/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java
new file mode 100644
index 0000000..0fb88a5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java
@@ -0,0 +1,117 @@
+/*
+ * 09/13/2005
+ *
+ * SquiggleUnderlineHighlightPainter.java - Highlighter that draws a squiggle
+ * underline under "highlighted" text, similar to error markers in Microsoft
+ * Visual Studio or Eclipse.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * Highlight painter that paints a squiggly underline underneath text, similar
+ * to what popular IDE's such as Visual Studio and Eclipse do to indicate
+ * errors, warnings, etc.<p>
+ *
+ * This class must be used as a <code>LayerPainter</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class SquiggleUnderlineHighlightPainter
+ extends ChangeableColorHighlightPainter {
+
+ private static final int AMT = 2;
+
+ /**
+ * Constructor.
+ *
+ * @param color The color of the squiggle. This cannot be
+ * <code>null</code>.
+ */
+ public SquiggleUnderlineHighlightPainter(Color color) {
+ super(color);
+ setColor(color);
+ }
+
+
+ /**
+ * Paints a portion of a highlight.
+ *
+ * @param g the graphics context
+ * @param offs0 the starting model offset >= 0
+ * @param offs1 the ending model offset >= offs1
+ * @param bounds the bounding box of the view, which is not
+ * necessarily the region to paint.
+ * @param c the editor
+ * @param view View painting for
+ * @return region drawing occurred in
+ */
+ public Shape paintLayer(Graphics g, int offs0, int offs1,
+ Shape bounds, JTextComponent c, View view) {
+
+ g.setColor(getColor());
+
+ if (offs0 == view.getStartOffset() && offs1 == view.getEndOffset()) {
+ // Contained in view, can just use bounds.
+ Rectangle alloc;
+ if (bounds instanceof Rectangle)
+ alloc = (Rectangle)bounds;
+ else
+ alloc = bounds.getBounds();
+ paintSquiggle(g, alloc);
+ return alloc;
+ }
+
+ // Otherwise, should only render part of View.
+ try {
+ // --- determine locations ---
+ Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+ offs1,Position.Bias.Backward,
+ bounds);
+ Rectangle r = (shape instanceof Rectangle) ?
+ (Rectangle)shape : shape.getBounds();
+ paintSquiggle(g, r);
+ return r;
+ } catch (BadLocationException e) {
+ e.printStackTrace(); // can't render
+ }
+
+ // Only if exception
+ return null;
+
+ }
+
+
+ /**
+ * Paints a squiggle underneath text in the specified rectangle.
+ *
+ * @param g The graphics context with which to paint.
+ * @param r The rectangle containing the text.
+ */
+ protected void paintSquiggle(Graphics g, Rectangle r) {
+ int x = r.x;
+ int y = r.y + r.height - 1;
+ int delta = -AMT;
+ while (x<r.x+r.width) {
+ g.drawLine(x,y, x+AMT,y+delta);
+ y += delta;
+ delta = -delta;
+ x += AMT;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Style.java b/src/org/fife/ui/rsyntaxtextarea/Style.java
new file mode 100644
index 0000000..cf86c46
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Style.java
@@ -0,0 +1,192 @@
+/*
+ * 08/06/2004
+ *
+ * Style.java - A set of traits for a particular token type to use while
+ * painting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import javax.swing.JPanel;
+
+
+/**
+ * The color and style information for a token type. Each token type in an
+ * <code>RSyntaxTextArea</code> has a corresponding <code>Style</code>; this
+ * <code>Style</code> tells us the following things:
+ *
+ * <ul>
+ * <li>What foreground color to use for tokens of this type.</li>
+ * <li>What background color to use.</li>
+ * <li>The font to use.</li>
+ * <li>Whether the token should be underlined.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class Style implements Cloneable {
+
+ public static final Color DEFAULT_FOREGROUND = Color.BLACK;
+ public static final Color DEFAULT_BACKGROUND = null;
+ public static final Font DEFAULT_FONT = null;
+
+ public Color foreground;
+ public Color background;
+ public boolean underline;
+ public Font font;
+
+ FontMetrics fontMetrics;
+
+
+ /**
+ * Creates a new style defaulting to black foreground, no
+ * background, and no styling.
+ */
+ public Style() {
+ this(DEFAULT_FOREGROUND);
+ }
+
+
+ /**
+ * Creates a new style with the specified foreground and no styling.
+ *
+ * @param fg The foreground color to use.
+ */
+ public Style(Color fg) {
+ this(fg, DEFAULT_BACKGROUND);
+ }
+
+
+ /**
+ * Creates a new style with the specified colors and no styling.
+ *
+ * @param fg The foreground color to use.
+ * @param bg The background color to use.
+ */
+ public Style(Color fg, Color bg) {
+ this(fg, bg, DEFAULT_FONT);
+ }
+
+
+ /**
+ * Creates a new style.
+ *
+ * @param fg The foreground color to use.
+ * @param bg The background color to use.
+ * @param font The font for this syntax scheme.
+ */
+ public Style(Color fg, Color bg, Font font) {
+ this(fg, bg, font, false);
+ }
+
+
+ /**
+ * Creates a new style.
+ *
+ * @param fg The foreground color to use.
+ * @param bg The background color to use.
+ * @param font The font for this syntax scheme.
+ * @param underline Whether or not to underline tokens with this style.
+ */
+ public Style(Color fg, Color bg, Font font, boolean underline) {
+ foreground = fg;
+ background = bg;
+ this.font = font;
+ this.underline = underline;
+ this.fontMetrics = font==null ? null :
+ new JPanel().getFontMetrics(font); // Default, no rendering hints!
+ }
+
+
+ /**
+ * Returns whether or not two (possibly <code>null</code>) objects are
+ * equal.
+ */
+ private boolean areEqual(Object o1, Object o2) {
+ return (o1==null && o2==null) || (o1!=null && o1.equals(o2));
+ }
+
+
+ /**
+ * Returns a deep copy of this object.
+ *
+ * @return The copy.
+ */
+ public Object clone() {
+ Style clone = null;
+ try {
+ clone = (Style)super.clone();
+ } catch (CloneNotSupportedException cnse) { // Never happens
+ cnse.printStackTrace();
+ return null;
+ }
+ clone.foreground = foreground;
+ clone.background = background;
+ clone.font = font;
+ clone.underline = underline;
+ clone.fontMetrics = fontMetrics;
+ return clone;
+ }
+
+
+ /**
+ * Returns whether or not two syntax schemes are equal.
+ *
+ * @param o2 The object with which to compare this syntax scheme.
+ * @return Whether or not these two syntax schemes represent the same
+ * scheme.
+ */
+ public boolean equals(Object o2) {
+ if (o2 instanceof Style) {
+ Style ss2 = (Style)o2;
+ if (this.underline==ss2.underline &&
+ areEqual(foreground, ss2.foreground) &&
+ areEqual(background, ss2.background) &&
+ areEqual(font, ss2.font) &&
+ areEqual(fontMetrics, ss2.fontMetrics))
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Computes the hash code to use when adding this syntax scheme to
+ * hash tables.<p>
+ *
+ * This method is implemented, since {@link #equals(Object)} is implemented,
+ * to keep FindBugs happy.
+ *
+ * @return The hash code.
+ */
+ public int hashCode() {
+ int hashCode = underline ? 1 : 0;
+ if (foreground!=null) {
+ hashCode ^= foreground.hashCode();
+ }
+ if (background!=null) {
+ hashCode ^= background.hashCode();
+ }
+ return hashCode;
+ }
+
+
+ /**
+ * Returns a string representation of this style.
+ *
+ * @return A string representation of this style.
+ */
+ public String toString() {
+ return "[Style: foreground: " + foreground +
+ ", background: " + background + ", underline: " +
+ underline + ", font: " + font + "]";
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java
new file mode 100644
index 0000000..f04768d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxConstants.java
@@ -0,0 +1,253 @@
+/*
+ * 03/08/2004
+ *
+ * SyntaxConstants.java - Constants used by RSyntaxTextArea and friends.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * Constants that define the different programming languages understood by
+ * <code>RSyntaxTextArea</code>. These constants are the values you can pass
+ * to {@link RSyntaxTextArea#setSyntaxEditingStyle(String)} to get syntax
+ * highlighting.<p>
+ *
+ * By default, all <code>RSyntaxTextArea</code>s can render all of these
+ * languages, but this can be changed (the list can be augmented or completely
+ * overwritten) on a per-text area basis. What languages can be rendered is
+ * actually managed by the {@link TokenMakerFactory} installed on the text
+ * area's {@link RSyntaxDocument}. By default, all
+ * <code>RSyntaxDocumenet</code>s have a factory installed capable of handling
+ * all of these languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface SyntaxConstants {
+
+ /**
+ * Style meaning don't syntax highlight anything.
+ */
+ public static final String SYNTAX_STYLE_NONE = "text/plain";
+
+
+ /**
+ * Style for highlighting ActionScript.
+ */
+ public static final String SYNTAX_STYLE_ACTIONSCRIPT = "text/actionscript";
+
+
+ /**
+ * Style for highlighting x86 assembler.
+ */
+ public static final String SYNTAX_STYLE_ASSEMBLER_X86 = "text/asm";
+
+
+ /**
+ * Style for highlighting BBCode.
+ */
+ public static final String SYNTAX_STYLE_BBCODE = "text/bbcode";
+
+
+ /**
+ * Style for highlighting C.
+ */
+ public static final String SYNTAX_STYLE_C = "text/c";
+
+
+ /**
+ * Style for highlighting Clojure.
+ */
+ public static final String SYNTAX_STYLE_CLOJURE = "text/clojure";
+
+
+ /**
+ * Style for highlighting C++.
+ */
+ public static final String SYNTAX_STYLE_CPLUSPLUS = "text/cpp";
+
+
+ /**
+ * Style for highlighting C#.
+ */
+ public static final String SYNTAX_STYLE_CSHARP = "text/cs";
+
+
+ /**
+ * Style for highlighting CSS.
+ */
+ public static final String SYNTAX_STYLE_CSS = "text/css";
+
+
+ /**
+ * Style for highlighting Delphi/Pascal.
+ */
+ public static final String SYNTAX_STYLE_DELPHI = "text/delphi";
+
+
+ /**
+ * Style for highlighting DTD files.
+ */
+ public static final String SYNTAX_STYLE_DTD = "text/dtd";
+
+
+ /**
+ * Style for highlighting Fortran.
+ */
+ public static final String SYNTAX_STYLE_FORTRAN = "text/fortran";
+
+
+ /**
+ * Style for highlighting Groovy.
+ */
+ public static final String SYNTAX_STYLE_GROOVY = "text/groovy";
+
+
+ /**
+ * Style for highlighting HTML.
+ */
+ public static final String SYNTAX_STYLE_HTML = "text/html";
+
+
+ /**
+ * Style for highlighting Java.
+ */
+ public static final String SYNTAX_STYLE_JAVA = "text/java";
+
+
+ /**
+ * Style for highlighting JavaScript.
+ */
+ public static final String SYNTAX_STYLE_JAVASCRIPT = "text/javascript";
+
+
+ /**
+ * Style for highlighting JSON.
+ */
+ public static final String SYNTAX_STYLE_JSON = "text/json";
+
+
+ /**
+ * Style for highlighting JSP.
+ */
+ public static final String SYNTAX_STYLE_JSP = "text/jsp";
+
+
+ /**
+ * Style for highlighting LaTeX.
+ */
+ public static final String SYNTAX_STYLE_LATEX = "text/latex";
+
+
+ /**
+ * Style for highlighting Lisp.
+ */
+ public static final String SYNTAX_STYLE_LISP = "text/lisp";
+
+
+ /**
+ * Style for highlighting Lua.
+ */
+ public static final String SYNTAX_STYLE_LUA = "text/lua";
+
+
+ /**
+ * Style for highlighting makefiles.
+ */
+ public static final String SYNTAX_STYLE_MAKEFILE = "text/makefile";
+
+
+ /**
+ * Style for highlighting MXML.
+ */
+ public static final String SYNTAX_STYLE_MXML = "text/mxml";
+
+
+ /**
+ * Style for highlighting NSIS install scripts.
+ */
+ public static final String SYNTAX_STYLE_NSIS = "text/nsis";
+
+
+ /**
+ * Style for highlighting Perl.
+ */
+ public static final String SYNTAX_STYLE_PERL = "text/perl";
+
+
+ /**
+ * Style for highlighting PHP.
+ */
+ public static final String SYNTAX_STYLE_PHP = "text/php";
+
+
+ /**
+ * Style for highlighting properties files.
+ */
+ public static final String SYNTAX_STYLE_PROPERTIES_FILE = "text/properties";
+
+
+ /**
+ * Style for highlighting Python.
+ */
+ public static final String SYNTAX_STYLE_PYTHON = "text/python";
+
+
+ /**
+ * Style for highlighting Ruby.
+ */
+ public static final String SYNTAX_STYLE_RUBY = "text/ruby";
+
+
+ /**
+ * Style for highlighting SAS keywords.
+ */
+ public static final String SYNTAX_STYLE_SAS = "text/sas";
+
+
+ /**
+ * Style for highlighting Scala.
+ */
+ public static final String SYNTAX_STYLE_SCALA = "text/scala";
+
+
+ /**
+ * Style for highlighting SQL.
+ */
+ public static final String SYNTAX_STYLE_SQL = "text/sql";
+
+
+ /**
+ * Style for highlighting Tcl.
+ */
+ public static final String SYNTAX_STYLE_TCL = "text/tcl";
+
+
+ /**
+ * Style for highlighting UNIX shell keywords.
+ */
+ public static final String SYNTAX_STYLE_UNIX_SHELL = "text/unix";
+
+
+ /**
+ * Style for highlighting Visual Basic.
+ */
+ public static final String SYNTAX_STYLE_VISUAL_BASIC = "text/vb";
+
+
+ /**
+ * Style for highlighting Windows batch files.
+ */
+ public static final String SYNTAX_STYLE_WINDOWS_BATCH = "text/bat";
+
+
+ /**
+ * Style for highlighting XML.
+ */
+ public static final String SYNTAX_STYLE_XML = "text/xml";
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java
new file mode 100644
index 0000000..47d5cb9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxScheme.java
@@ -0,0 +1,675 @@
+/*
+ * 02/26/2004
+ *
+ * SyntaxScheme.java - The set of colors and tokens used by an RSyntaxTextArea
+ * to color tokens.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import javax.swing.text.StyleContext;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+/**
+ * The set of colors and styles used by an <code>RSyntaxTextArea</code> to
+ * color tokens. You can use this class to programmatically set the fonts
+ * and colors used in an RSyntaxTextArea, but for more powerful, externalized
+ * control, consider using {@link Theme}s instead.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Theme
+ */
+public class SyntaxScheme implements Cloneable, TokenTypes {
+
+ private Style[] styles;
+
+ private static final String VERSION = "*ver1";
+
+
+ /**
+ * Creates a color scheme that either has all color values set to
+ * a default value or set to <code>null</code>.
+ *
+ * @param useDefaults If <code>true</code>, all color values will
+ * be set to default colors; if <code>false</code>, all colors
+ * will be initially <code>null</code>.
+ */
+ public SyntaxScheme(boolean useDefaults) {
+ styles = new Style[NUM_TOKEN_TYPES];
+ if (useDefaults) {
+ restoreDefaults(null);
+ }
+ }
+
+
+ /**
+ * Creates a default color scheme.
+ *
+ * @param baseFont The base font to use. Keywords will be a bold version
+ * of this font, and comments will be an italicized version of this
+ * font.
+ */
+ public SyntaxScheme(Font baseFont) {
+ this(baseFont, true);
+ }
+
+
+ /**
+ * Creates a default color scheme.
+ *
+ * @param baseFont The base font to use. Keywords will be a bold version
+ * of this font, and comments will be an italicized version of this
+ * font.
+ * @param fontStyles Whether bold and italic should be used in the scheme
+ * (vs. all tokens using a plain font).
+ */
+ public SyntaxScheme(Font baseFont, boolean fontStyles) {
+ styles = new Style[NUM_TOKEN_TYPES];
+ restoreDefaults(baseFont, fontStyles);
+ }
+
+
+ /**
+ * Changes the "base font" for this syntax scheme. This is called by
+ * <code>RSyntaxTextArea</code> when its font changes via
+ * <code>setFont()</code>. This looks for tokens that use a derivative of
+ * the text area's old font (but bolded and/or italicized) and make them
+ * use the new font with those stylings instead. This is desirable because
+ * most programmers prefer a single font to be used in their text editor,
+ * but might want bold (say for keywords) or italics.
+ *
+ * @param old The old font of the text area.
+ * @param font The new font of the text area.
+ */
+ void changeBaseFont(Font old, Font font) {
+ for (int i=0; i<styles.length; i++) {
+ Style style = styles[i];
+ if (style!=null && style.font!=null) {
+ if (style.font.getFamily().equals(old.getFamily()) &&
+ style.font.getSize()==old.getSize()) {
+ int s = style.font.getStyle(); // Keep bold or italic
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+ style.font= sc.getFont(font.getFamily(), s, font.getSize());
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Returns a deep copy of this color scheme.
+ *
+ * @return The copy.
+ */
+ public Object clone() {
+ SyntaxScheme shcs = null;
+ try {
+ shcs = (SyntaxScheme)super.clone();
+ } catch (CloneNotSupportedException cnse) { // Never happens
+ cnse.printStackTrace();
+ return null;
+ }
+ shcs.styles = new Style[NUM_TOKEN_TYPES];
+ for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+ Style s = styles[i];
+ if (s!=null) {
+ shcs.styles[i] = (Style)s.clone();
+ }
+ }
+ return shcs;
+ }
+
+
+ /**
+ * Tests whether this color scheme is the same as another color scheme.
+ *
+ * @param otherScheme The color scheme to compare to.
+ * @return <code>true</code> if this color scheme and
+ * <code>otherScheme</code> are the same scheme;
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(Object otherScheme) {
+
+ // No need for null check; instanceof takes care of this for us,
+ // i.e. "if (!(null instanceof Foo))" evaluates to "true".
+ if (!(otherScheme instanceof SyntaxScheme)) {
+ return false;
+ }
+
+ Style[] otherSchemes = ((SyntaxScheme)otherScheme).styles;
+
+ int length = styles.length;
+ for (int i=0; i<length; i++) {
+ if (styles[i]==null) {
+ if (otherSchemes[i]!=null) {
+ return false;
+ }
+ }
+ else if (!styles[i].equals(otherSchemes[i])) {
+ return false;
+ }
+ }
+ return true;
+
+ }
+
+
+ /**
+ * Returns a hex string representing an RGB color, of the form
+ * <code>"$rrggbb"</code>.
+ *
+ * @param c The color.
+ * @return The string representation of the color.
+ */
+ private static final String getHexString(Color c) {
+ return "$" + Integer.toHexString((c.getRGB() & 0xffffff)+0x1000000).
+ substring(1);
+ }
+
+
+ /**
+ * Returns the specified style.
+ *
+ * @param index The index of the style.
+ * @return The style.
+ * @see #setStyle(int, Style)
+ * @see #getStyleCount()
+ */
+ public Style getStyle(int index) {
+ return styles[index];
+ }
+
+
+ /**
+ * Returns the number of styles.
+ *
+ * @return The number of styles.
+ * @see #getStyle(int)
+ */
+ public int getStyleCount() {
+ return styles.length;
+ }
+
+
+ /**
+ * This is implemented to be consistent with {@link #equals(Object)}.
+ * This is a requirement to keep FindBugs happy.
+ *
+ * @return The hash code for this object.
+ */
+ public int hashCode() {
+ // Keep me fast. Iterating over *all* syntax schemes contained is
+ // probably much slower than a "bad" hash code here.
+ int hashCode = 0;
+ int count = styles.length;
+ for (int i=0; i<count; i++) {
+ if (styles[i]!=null) {
+ hashCode ^= styles[i].hashCode();
+ break;
+ }
+ }
+ return hashCode;
+ }
+
+
+ /**
+ * Loads a syntax scheme from an input stream.<p>
+ *
+ * Consider using the {@link Theme} class for saving and loading RSTA
+ * styles rather than using this API.
+ *
+ * @param baseFont The font to use as the "base" for the syntax scheme.
+ * If this is <code>null</code>, a default monospaced font is used.
+ * @param in The stream to load from. It is up to the caller to close this
+ * stream when they are done.
+ * @return The syntax scheme.
+ * @throws IOException If an IO error occurs.
+ */
+ public static SyntaxScheme load(Font baseFont, InputStream in)
+ throws IOException {
+ if (baseFont==null) {
+ baseFont = RSyntaxTextArea.getDefaultFont();
+ }
+ return XmlParser.load(baseFont, in);
+ }
+
+
+ /**
+ * Loads a syntax highlighting color scheme from a string created from
+ * <code>toCommaSeparatedString</code>. This method is useful for saving
+ * and restoring color schemes.<p>
+ *
+ * Consider using the {@link Theme} class for saving and loading RSTA
+ * styles rather than using this API.
+ *
+ * @param string A string generated from {@link #toCommaSeparatedString()}.
+ * @return A color scheme.
+ */
+ public static SyntaxScheme loadFromString(String string) {
+
+ SyntaxScheme scheme = new SyntaxScheme(true);
+
+ try {
+
+ if (string!=null) {
+
+ String[] tokens = string.split(",", -1);
+
+ // Check the version string, use defaults if incompatible
+ if (tokens.length==0 || !VERSION.equals(tokens[0])) {
+ return scheme; // Still set to defaults
+ }
+
+ int tokenTypeCount = NUM_TOKEN_TYPES;
+ int tokenCount = tokenTypeCount*7 + 1; // Version string
+ if (tokens.length!=tokenCount) {
+ throw new Exception(
+ "Not enough tokens in packed color scheme: expected " +
+ tokenCount + ", found " + tokens.length);
+ }
+
+ // Use StyleContext to create fonts to get composite fonts for
+ // Asian glyphs.
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+
+ // Loop through each token style. Format:
+ // "index,(fg|-),(bg|-),(t|f),((font,style,size)|(-,,))"
+ for (int i=0; i<tokenTypeCount; i++) {
+
+ int pos = i*7 + 1;
+ int integer = Integer.parseInt(tokens[pos]); // == i
+ if (integer!=i)
+ throw new Exception("Expected " + i + ", found " +
+ integer);
+
+ Color fg = null; String temp = tokens[pos+1];
+ if (!"-".equals(temp)) { // "-" => keep fg as null
+ fg = stringToColor(temp);
+ }
+ Color bg = null; temp = tokens[pos+2];
+ if (!"-".equals(temp)) { // "-" => keep bg as null
+ bg = stringToColor(temp);
+ }
+
+ // Check for "true" or "false" since we don't want to
+ // accidentally suck in an int representing the next
+ // packed color, and any string != "true" means false.
+ temp = tokens[pos+3];
+ if (!"t".equals(temp) && !"f".equals(temp))
+ throw new Exception("Expected 't' or 'f', found " + temp);
+ boolean underline = "t".equals(temp);
+
+ Font font = null;
+ String family = tokens[pos+4];
+ if (!"-".equals(family)) {
+ font = sc.getFont(family,
+ Integer.parseInt(tokens[pos+5]), // style
+ Integer.parseInt(tokens[pos+6])); // size
+ }
+ scheme.styles[i] = new Style(fg, bg, font, underline);
+
+ }
+
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return scheme;
+
+ }
+
+
+ void refreshFontMetrics(Graphics2D g2d) {
+ // It is assumed that any rendering hints are already applied to g2d.
+ for (int i=0; i<styles.length; i++) {
+ Style s = styles[i];
+ if (s!=null) {
+ s.fontMetrics = s.font==null ? null :
+ g2d.getFontMetrics(s.font);
+ }
+ }
+ }
+
+
+ /**
+ * Restores all colors and fonts to their default values.
+ *
+ * @param baseFont The base font to use when creating this scheme. If
+ * this is <code>null</code>, then a default monospaced font is
+ * used.
+ */
+ public void restoreDefaults(Font baseFont) {
+ restoreDefaults(baseFont, true);
+ }
+
+
+ /**
+ * Restores all colors and fonts to their default values.
+ *
+ * @param baseFont The base font to use when creating this scheme. If
+ * this is <code>null</code>, then a default monospaced font is
+ * used.
+ * @param fontStyles Whether bold and italic should be used in the scheme
+ * (vs. all tokens using a plain font).
+ */
+ public void restoreDefaults(Font baseFont, boolean fontStyles) {
+
+ // Colors used by tokens.
+ Color comment = new Color(0,128,0);
+ Color docComment = new Color(164,0,0);
+ Color markupComment = new Color(0, 96, 0);
+ Color keyword = Color.BLUE;
+ Color dataType = new Color(0,128,128);
+ Color function = new Color(173,128,0);
+ Color preprocessor = new Color(128,128,128);
+ Color operator = new Color(128, 64, 64);
+ Color regex = new Color(0,128,164);
+ Color variable = new Color(255,153,0);
+ Color literalNumber = new Color(100,0,200);
+ Color literalString = new Color(220,0,156);
+ Color error = new Color(148,148,0);
+
+ // (Possible) special font styles for keywords and comments.
+ if (baseFont==null) {
+ baseFont = RSyntaxTextArea.getDefaultFont();
+ }
+ Font commentFont = baseFont;
+ Font keywordFont = baseFont;
+ if (fontStyles) {
+ // WORKAROUND for Sun JRE bug 6282887 (Asian font bug in 1.4/1.5)
+ // That bug seems to be hidden now, see 6289072 instead.
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+ Font boldFont = sc.getFont(baseFont.getFamily(), Font.BOLD,
+ baseFont.getSize());
+ Font italicFont = sc.getFont(baseFont.getFamily(), Font.ITALIC,
+ baseFont.getSize());
+ commentFont = italicFont;//baseFont.deriveFont(Font.ITALIC);
+ keywordFont = boldFont;//baseFont.deriveFont(Font.BOLD);
+ }
+
+ styles[COMMENT_EOL] = new Style(comment, null, commentFont);
+ styles[COMMENT_MULTILINE] = new Style(comment, null, commentFont);
+ styles[COMMENT_DOCUMENTATION] = new Style(docComment, null, commentFont);
+ styles[COMMENT_KEYWORD] = new Style(new Color(255,152,0), null, commentFont);
+ styles[COMMENT_MARKUP] = new Style(Color.gray, null, commentFont);
+ styles[RESERVED_WORD] = new Style(keyword, null, keywordFont);
+ styles[RESERVED_WORD_2] = new Style(keyword, null, keywordFont);
+ styles[FUNCTION] = new Style(function);
+ styles[LITERAL_BOOLEAN] = new Style(literalNumber);
+ styles[LITERAL_NUMBER_DECIMAL_INT] = new Style(literalNumber);
+ styles[LITERAL_NUMBER_FLOAT] = new Style(literalNumber);
+ styles[LITERAL_NUMBER_HEXADECIMAL] = new Style(literalNumber);
+ styles[LITERAL_STRING_DOUBLE_QUOTE] = new Style(literalString);
+ styles[LITERAL_CHAR] = new Style(literalString);
+ styles[LITERAL_BACKQUOTE] = new Style(literalString);
+ styles[DATA_TYPE] = new Style(dataType, null, keywordFont);
+ styles[VARIABLE] = new Style(variable);
+ styles[REGEX] = new Style(regex);
+ styles[ANNOTATION] = new Style(Color.gray);
+ styles[IDENTIFIER] = new Style(null);
+ styles[WHITESPACE] = new Style(Color.gray);
+ styles[SEPARATOR] = new Style(Color.RED);
+ styles[OPERATOR] = new Style(operator);
+ styles[PREPROCESSOR] = new Style(preprocessor);
+ styles[MARKUP_TAG_DELIMITER] = new Style(Color.RED);
+ styles[MARKUP_TAG_NAME] = new Style(Color.BLUE);
+ styles[MARKUP_TAG_ATTRIBUTE] = new Style(new Color(63,127,127));
+ styles[MARKUP_TAG_ATTRIBUTE_VALUE]= new Style(literalString);
+ styles[MARKUP_COMMENT] = new Style(markupComment, null, commentFont);
+ styles[MARKUP_DTD] = new Style(function);
+ styles[MARKUP_PROCESSING_INSTRUCTION] = new Style(preprocessor);
+ styles[MARKUP_CDATA] = new Style(new Color(0xcc6600));
+ styles[MARKUP_CDATA_DELIMITER] = new Style(new Color(0x008080));
+ styles[MARKUP_ENTITY_REFERENCE] = new Style(dataType);
+ styles[ERROR_IDENTIFIER] = new Style(error);
+ styles[ERROR_NUMBER_FORMAT] = new Style(error);
+ styles[ERROR_STRING_DOUBLE] = new Style(error);
+ styles[ERROR_CHAR] = new Style(error);
+
+ }
+
+
+ /**
+ * Sets a style to use when rendering a token type.
+ *
+ * @param type The token type.
+ * @param style The style for the token type.
+ * @see #getStyle(int)
+ */
+ public void setStyle(int type, Style style) {
+ styles[type] = style;
+ }
+
+
+ /**
+ * Returns the color represented by a string. If the first char in the
+ * string is '<code>$</code>', it is assumed to be in hex, otherwise it is
+ * assumed to be decimal. So, for example, both of these:
+ * <pre>
+ * "$00ff00"
+ * "65280"
+ * </pre>
+ * will return <code>new Color(0, 255, 0)</code>.
+ *
+ * @param s The string to evaluate.
+ * @return The color.
+ */
+ private static final Color stringToColor(String s) {
+ // Check for decimal as well as hex, for backward
+ // compatibility (fix from GwynEvans on forums)
+ char ch = s.charAt(0);
+ return new Color((ch=='$' || ch=='#') ?
+ Integer.parseInt(s.substring(1),16) :
+ Integer.parseInt(s));
+ }
+
+
+ /**
+ * Returns this syntax highlighting scheme as a comma-separated list of
+ * values as follows:
+ * <ul>
+ * <li>If a color is non-null, it is added as a 24-bit integer
+ * of the form <code>((r<<16) | (g<<8) | (b))</code>; if it is
+ * <code>null</code>, it is added as "<i>-,</i>".
+ * <li>The font and style (bold/italic) is added as an integer like so:
+ * "<i>family,</i> <i>style,</i> <i>size</i>".
+ * <li>The entire syntax highlighting scheme is thus one long string of
+ * color schemes of the format "<i>i,[fg],[bg],uline,[style]</i>,
+ * where:
+ * <ul>
+ * <li><code>i</code> is the index of the syntax scheme.
+ * <li><i>fg</i> and <i>bg</i> are the foreground and background
+ * colors for the scheme, and may be null (represented by
+ * <code>-</code>).
+ * <li><code>uline</code> is whether or not the font should be
+ * underlined, and is either <code>t</code> or <code>f</code>.
+ * <li><code>style</code> is the <code>family,style,size</code>
+ * triplet described above.
+ * </ul>
+ * </ul>
+ *
+ * @return A string representing the rgb values of the colors.
+ */
+ public String toCommaSeparatedString() {
+
+ StringBuffer sb = new StringBuffer(VERSION);
+ sb.append(',');
+
+ for (int i=0; i<NUM_TOKEN_TYPES; i++) {
+
+ sb.append(i).append(',');
+
+ Style ss = styles[i];
+ if (ss==null) { // Only true for i==0 (NULL token)
+ sb.append("-,-,f,-,,,");
+ continue;
+ }
+
+ Color c = ss.foreground;
+ sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+ c = ss.background;
+ sb.append(c!=null ? (getHexString(c) + ",") : "-,");
+
+ sb.append(ss.underline ? "t," : "f,");
+
+ Font font = ss.font;
+ if (font!=null) {
+ sb.append(font.getFamily()).append(',').
+ append(font.getStyle()).append(',').
+ append(font.getSize()).append(',');
+ }
+ else {
+ sb.append("-,,,");
+ }
+
+ }
+
+ return sb.substring(0,sb.length()-1); // Take off final ','.
+
+ }
+
+
+ /**
+ * Loads a <code>SyntaxScheme</code> from an XML file.
+ */
+ private static class XmlParser extends DefaultHandler {
+
+ private Font baseFont;
+ private SyntaxScheme scheme;
+
+ public XmlParser(Font baseFont) {
+ scheme = new SyntaxScheme(baseFont);
+ }
+
+ /**
+ * Creates the XML reader to use. Note that in 1.4 JRE's, the reader
+ * class wasn't defined by default, but in 1.5+ it is.
+ *
+ * @return The XML reader to use.
+ */
+ private static XMLReader createReader() throws IOException {
+ XMLReader reader = null;
+ try {
+ reader = XMLReaderFactory.createXMLReader();
+ } catch (SAXException e) {
+ // Happens in JRE 1.4.x; 1.5+ define the reader class properly
+ try {
+ reader = XMLReaderFactory.createXMLReader(
+ "org.apache.crimson.parser.XMLReaderImpl");
+ } catch (SAXException se) {
+ throw new IOException(se.toString());
+ }
+ }
+ return reader;
+ }
+
+ public static SyntaxScheme load(Font baseFont,
+ InputStream in) throws IOException {
+ XMLReader reader = createReader();
+ XmlParser parser = new XmlParser(baseFont);
+ parser.baseFont = baseFont;
+ reader.setContentHandler(parser);
+ InputSource is = new InputSource(in);
+ is.setEncoding("UTF-8");
+ try {
+ reader.parse(is);
+ } catch (SAXException se) {
+ throw new IOException(se.toString());
+ }
+ return parser.scheme;
+ }
+
+ public void startElement(String uri, String localName, String qName,
+ Attributes attrs) {
+
+ if ("style".equals(qName)) {
+
+ String type = attrs.getValue("token");
+ Field field = null;
+ try {
+ field = Token.class.getField(type);
+ } catch (RuntimeException re) {
+ throw re; // FindBugs
+ } catch (Exception e) {
+ System.err.println("Invalid token type: " + type);
+ return;
+ }
+
+ if (field.getType()==int.class) {
+
+ int index = 0;
+ try {
+ index = field.getInt(scheme);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ return;
+ }
+
+ String fgStr = attrs.getValue("fg");
+ if (fgStr!=null) {
+ Color fg = stringToColor(fgStr);
+ scheme.styles[index].foreground = fg;
+ }
+
+ String bgStr = attrs.getValue("bg");
+ if (bgStr!=null) {
+ Color bg = stringToColor(bgStr);
+ scheme.styles[index].background = bg;
+ }
+
+ boolean styleSpecified = false;
+ boolean bold = false;
+ boolean italic = false;
+ String boldStr = attrs.getValue("bold");
+ if (boldStr!=null) {
+ bold = Boolean.valueOf(boldStr).booleanValue();
+ styleSpecified = true;
+ }
+ String italicStr = attrs.getValue("italic");
+ if (italicStr!=null) {
+ italic = Boolean.valueOf(italicStr).booleanValue();
+ styleSpecified = true;
+ }
+ if (styleSpecified) {
+ int style = 0;
+ if (bold) { style |= Font.BOLD; }
+ if (italic) { style |= Font.ITALIC; }
+ scheme.styles[index].font = baseFont.deriveFont(style);
+ }
+
+ String ulineStr = attrs.getValue("underline");
+ if (ulineStr!=null) {
+ boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+ scheme.styles[index].underline = uline;
+ }
+
+ }
+
+ }
+
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java b/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java
new file mode 100644
index 0000000..3f7c695
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/SyntaxView.java
@@ -0,0 +1,974 @@
+/*
+ * 02/24/2004
+ *
+ * SyntaxView.java - The View object used by RSyntaxTextArea when word wrap is
+ * disabled.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The <code>javax.swing.text.View</code> object used by {@link RSyntaxTextArea}
+ * when word wrap is disabled. It implements syntax highlighting for
+ * programming languages using the colors and font styles specified by the
+ * <code>RSyntaxTextArea</code>.<p>
+ *
+ * You don't really have to do anything to use this class, as
+ * {@link RSyntaxTextAreaUI} automatically sets the text area's view to be
+ * an instance of this class if word wrap is disabled.<p>
+ *
+ * The tokens that specify how to paint the syntax-highlighted text are gleaned
+ * from the text area's {@link RSyntaxDocument}.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public class SyntaxView extends View implements TabExpander,
+ TokenOrientedView, RSTAView {
+
+ /**
+ * The default font used by the text area. If this changes we need to
+ * recalculate the longest line.
+ */
+ Font font;
+
+ /**
+ * Font metrics for the current font.
+ */
+ protected FontMetrics metrics;
+
+ /**
+ * The current longest line. This is used to calculate the preferred width
+ * of the view. Since the calculation is potentially expensive, we try to
+ * avoid it by stashing which line is currently the longest.
+ */
+ Element longLine;
+ float longLineWidth;
+
+ private int tabSize;
+ protected int tabBase;
+
+
+ /**
+ * Cached for each paint() call so each drawLine() call has access to it.
+ */
+ private RSyntaxTextArea host;
+
+ /**
+ * Cached values to speed up the painting a tad.
+ */
+ private int lineHeight = 0;
+ private int ascent;
+ private int clipStart;
+ private int clipEnd;
+ private Token tempToken;
+
+// /**
+// * The end-of-line marker.
+// */
+// private static final char[] eolMarker = { '.' };
+
+
+ /**
+ * Constructs a new <code>SyntaxView</code> wrapped around an element.
+ *
+ * @param elem The element representing the text to display.
+ */
+ public SyntaxView(Element elem) {
+ super(elem);
+ tempToken = new Token();
+ }
+
+
+ /**
+ * Iterate over the lines represented by the child elements
+ * of the element this view represents, looking for the line
+ * that is the longest. The <em>longLine</em> variable is updated to
+ * represent the longest line contained. The <em>font</em> variable
+ * is updated to indicate the font used to calculate the
+ * longest line.
+ */
+ void calculateLongestLine() {
+ Component c = getContainer();
+ font = c.getFont();
+ metrics = c.getFontMetrics(font);
+ tabSize = getTabSize() * metrics.charWidth(' ');
+ Element lines = getElement();
+ int n = lines.getElementCount();
+ for (int i=0; i<n; i++) {
+ Element line = lines.getElement(i);
+ float w = getLineWidth(i);
+ if (w > longLineWidth) {
+ longLineWidth = w;
+ longLine = line;
+ }
+ }
+ }
+
+
+ /**
+ * Gives notification from the document that attributes were changed
+ * in a location that this view is responsible for.
+ *
+ * @param changes the change information from the associated document
+ * @param a the current allocation of the view
+ * @param f the factory to use to rebuild if the view has children
+ * @see View#changedUpdate
+ */
+ public void changedUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+ updateDamage(changes, a, f);
+ }
+
+
+ /**
+ * Repaint the given line range.
+ *
+ * @param line0 The starting line number to repaint. This must
+ * be a valid line number in the model.
+ * @param line1 The ending line number to repaint. This must
+ * be a valid line number in the model.
+ * @param a The region allocated for the view to render into.
+ * @param host The component hosting the view (used to call repaint).
+ */
+ protected void damageLineRange(int line0, int line1, Shape a,
+ Component host) {
+ if (a != null) {
+ Rectangle area0 = lineToRect(a, line0);
+ Rectangle area1 = lineToRect(a, line1);
+ if ((area0 != null) && (area1 != null)) {
+ Rectangle dmg = area0.union(area1); // damage.
+ host.repaint(dmg.x, dmg.y, dmg.width, dmg.height);
+ }
+ else
+ host.repaint();
+ }
+ }
+
+
+ /**
+ * Draws the passed-in text using syntax highlighting for the current
+ * language. It is assumed that the entire line is either not in a
+ * selected region, or painting with a selection-foreground color is turned
+ * off.
+ *
+ * @param painter The painter to render the tokens.
+ * @param token The list of tokens to draw.
+ * @param g The graphics context in which to draw.
+ * @param x The x-coordinate at which to draw.
+ * @param y The y-coordinate at which to draw.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ private float drawLine(TokenPainter painter, Token token, Graphics2D g,
+ float x, float y) {
+
+ float nextX = x; // The x-value at the end of our text.
+
+ while (token!=null && token.isPaintable() && nextX<clipEnd) {
+ nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+ token = token.getNextToken();
+ }
+
+ // NOTE: We should re-use code from Token (paintBackground()) here,
+ // but don't because I'm just too lazy.
+ if (host.getEOLMarkersVisible()) {
+ g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+ g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+ g.drawString("\u00B6", nextX, y);
+ }
+
+ // Return the x-coordinate at the end of the painted text.
+ return nextX;
+
+ }
+
+
+ /**
+ * Draws the passed-in text using syntax highlighting for the current
+ * language. Tokens are checked for being in a selected region, and are
+ * rendered appropriately if they are.
+ *
+ * @param painter The painter to render the tokens.
+ * @param token The list of tokens to draw.
+ * @param g The graphics context in which to draw.
+ * @param x The x-coordinate at which to draw.
+ * @param y The y-coordinate at which to draw.
+ * @param selStart The start of the selection.
+ * @param selEnd The end of the selection.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ private float drawLineWithSelection(TokenPainter painter, Token token,
+ Graphics2D g, float x, float y, int selStart, int selEnd) {
+
+ float nextX = x; // The x-value at the end of our text.
+
+ while (token!=null && token.isPaintable() && nextX<clipEnd) {
+
+ // Selection starts in this token
+ if (token.containsPosition(selStart)) {
+
+ if (selStart>token.offset) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selStart - tempToken.offset;
+ nextX = painter.paint(tempToken,g,nextX,y,host, this, clipStart);
+ token.makeStartAt(selStart);
+ }
+
+ int selCount = Math.min(token.textCount, selEnd-token.offset);
+ if (selCount==token.textCount) {
+ nextX = painter.paintSelected(token, g, nextX,y, host,
+ this, clipStart);
+ }
+ else {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selCount;
+ nextX = painter.paintSelected(tempToken, g, nextX,y, host,
+ this, clipStart);
+ token.makeStartAt(token.offset + selCount);
+ nextX = painter.paint(token, g, nextX,y, host, this,
+ clipStart);
+ }
+
+ }
+
+ // Selection ends in this token
+ else if (token.containsPosition(selEnd)) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selEnd - tempToken.offset;
+ nextX = painter.paintSelected(tempToken, g, nextX,y, host, this,
+ clipStart);
+ token.makeStartAt(selEnd);
+ nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+ }
+
+ // This token is entirely selected
+ else if (token.offset>=selStart &&
+ (token.offset+token.textCount)<=selEnd) {
+ nextX = painter.paintSelected(token, g, nextX,y, host, this,
+ clipStart);
+ }
+
+ // This token is entirely unselected
+ else {
+ nextX = painter.paint(token, g, nextX,y, host, this, clipStart);
+ }
+
+ token = token.getNextToken();
+
+ }
+
+ // NOTE: We should re-use code from Token (paintBackground()) here,
+ // but don't because I'm just too lazy.
+ if (host.getEOLMarkersVisible()) {
+ g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+ g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+ g.drawString("\u00B6", nextX, y);
+ }
+
+ // Return the x-coordinate at the end of the painted text.
+ return nextX;
+
+ }
+
+
+ /**
+ * Calculates the width of the line represented by the given element.
+ *
+ * @param line The line for which to get the length.
+ * @param lineNumber The line number of the specified line in the document.
+ * @return The width of the line.
+ */
+ private float getLineWidth(int lineNumber) {
+ Token tokenList = ((RSyntaxDocument)getDocument()).
+ getTokenListForLine(lineNumber);
+ return RSyntaxUtilities.getTokenListWidth(tokenList,
+ (RSyntaxTextArea)getContainer(),
+ this);
+ }
+
+
+ /**
+ * Provides a way to determine the next visually represented model
+ * location that one might place a caret. Some views may not be visible,
+ * they might not be in the same order found in the model, or they just
+ * might not allow access to some of the locations in the model.
+ *
+ * @param pos the position to convert >= 0
+ * @param a the allocated region to render into
+ * @param direction the direction from the current position that can
+ * be thought of as the arrow keys typically found on a keyboard.
+ * This may be SwingConstants.WEST, SwingConstants.EAST,
+ * SwingConstants.NORTH, or SwingConstants.SOUTH.
+ * @return the location within the model that best represents the next
+ * location visual position.
+ * @exception BadLocationException
+ * @exception IllegalArgumentException for an invalid direction
+ */
+ public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a,
+ int direction, Position.Bias[] biasRet)
+ throws BadLocationException {
+ return RSyntaxUtilities.getNextVisualPositionFrom(pos, b, a,
+ direction, biasRet, this);
+ }
+
+
+ /**
+ * Determines the preferred span for this view along an
+ * axis.
+ *
+ * @param axis may be either View.X_AXIS or View.Y_AXIS
+ * @return the span the view would like to be rendered into >= 0.
+ * Typically the view is told to render into the span
+ * that is returned, although there is no guarantee.
+ * The parent may choose to resize or break the view.
+ * @exception IllegalArgumentException for an invalid axis
+ */
+ public float getPreferredSpan(int axis) {
+ updateMetrics();
+ switch (axis) {
+ case View.X_AXIS:
+ float span = longLineWidth + 10; // "fudge factor."
+ if (host.getEOLMarkersVisible()) {
+ span += metrics.charWidth('\u00B6');
+ }
+ return span;
+ case View.Y_AXIS:
+ // We update lineHeight here as when this method is first
+ // called, lineHeight isn't initialized. If we don't do it
+ // here, we get no vertical scrollbar (as lineHeight==0).
+ lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+// return getElement().getElementCount() * lineHeight;
+int visibleLineCount = getElement().getElementCount();
+if (host.isCodeFoldingEnabled()) {
+ visibleLineCount -= host.getFoldManager().getHiddenLineCount();
+}
+return visibleLineCount * lineHeight;
+ default:
+ throw new IllegalArgumentException("Invalid axis: " + axis);
+ }
+ }
+
+
+ /**
+ * Returns the tab size set for the document, defaulting to 5.
+ *
+ * @return The tab size.
+ */
+ protected int getTabSize() {
+ Integer i = (Integer)getDocument().getProperty(
+ PlainDocument.tabSizeAttribute);
+ int size = (i != null) ? i.intValue() : 5;
+ return size;
+ }
+
+
+ /**
+ * Returns a token list for the <i>physical</i> line above the physical
+ * line containing the specified offset into the document. Note that for
+ * this plain (non-wrapped) view, this is simply the token list for the
+ * logical line above the line containing <code>offset</code>, since lines
+ * are not wrapped.
+ *
+ * @param offset The offset in question.
+ * @return A token list for the physical (and in this view, logical) line
+ * before this one. If <code>offset</code> is in the first line in
+ * the document, <code>null</code> is returned.
+ */
+ public Token getTokenListForPhysicalLineAbove(int offset) {
+ RSyntaxDocument document = (RSyntaxDocument)getDocument();
+ Element map = document.getDefaultRootElement();
+int line = map.getElementIndex(offset);
+FoldManager fm = host.getFoldManager();
+if (fm==null) {
+ line--;
+ if (line>=0) {
+ return document.getTokenListForLine(line);
+ }
+}
+else {
+ line = fm.getVisibleLineAbove(line);
+ if (line>=0) {
+ return document.getTokenListForLine(line);
+ }
+}
+// int line = map.getElementIndex(offset) - 1;
+// if (line>=0)
+// return document.getTokenListForLine(line);
+ return null;
+ }
+
+
+ /**
+ * Returns a token list for the <i>physical</i> line below the physical
+ * line containing the specified offset into the document. Note that for
+ * this plain (non-wrapped) view, this is simply the token list for the
+ * logical line below the line containing <code>offset</code>, since lines
+ * are not wrapped.
+ *
+ * @param offset The offset in question.
+ * @return A token list for the physical (and in this view, logical) line
+ * after this one. If <code>offset</code> is in the last physical
+ * line in the document, <code>null</code> is returned.
+ */
+ public Token getTokenListForPhysicalLineBelow(int offset) {
+ RSyntaxDocument document = (RSyntaxDocument)getDocument();
+ Element map = document.getDefaultRootElement();
+ int lineCount = map.getElementCount();
+int line = map.getElementIndex(offset);
+if (!host.isCodeFoldingEnabled()) {
+ if (line<lineCount-1) {
+ return document.getTokenListForLine(line+1);
+ }
+}
+else {
+ FoldManager fm = host.getFoldManager();
+ line = fm.getVisibleLineBelow(line);
+ if (line>=0 && line<lineCount) {
+ return document.getTokenListForLine(line);
+ }
+}
+// int line = map.getElementIndex(offset);
+// int lineCount = map.getElementCount();
+// if (line<lineCount-1)
+// return document.getTokenListForLine(line+1);
+ return null;
+ }
+
+
+ /**
+ * Gives notification that something was inserted into the document
+ * in a location that this view is responsible for.
+ *
+ * @param changes The change information from the associated document.
+ * @param a The current allocation of the view.
+ * @param f The factory to use to rebuild if the view has children.
+ */
+ public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+ updateDamage(changes, a, f);
+ }
+
+
+ /**
+ * Determine the rectangle that represents the given line.
+ *
+ * @param a The region allocated for the view to render into
+ * @param line The line number to find the region of. This must
+ * be a valid line number in the model.
+ */
+ protected Rectangle lineToRect(Shape a, int line) {
+ Rectangle r = null;
+ updateMetrics();
+ if (metrics != null) {
+ Rectangle alloc = a.getBounds();
+ // NOTE: lineHeight is not initially set here, leading to the
+ // current line not being highlighted when a document is first
+ // opened. So, we set it here just in case.
+ lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+if (host.isCodeFoldingEnabled()) {
+ FoldManager fm = host.getFoldManager();
+ int hiddenCount = fm.getHiddenLineCountAbove(line);
+ line -= hiddenCount;
+}
+ r = new Rectangle(alloc.x, alloc.y + line*lineHeight,
+ alloc.width, lineHeight);
+ }
+ return r;
+ }
+
+
+ /**
+ * Provides a mapping from the document model coordinate space
+ * to the coordinate space of the view mapped to it.
+ *
+ * @param pos the position to convert >= 0
+ * @param a the allocated region to render into
+ * @return the bounding box of the given position
+ * @exception BadLocationException if the given position does not
+ * represent a valid location in the associated document
+ * @see View#modelToView
+ */
+ public Shape modelToView(int pos, Shape a, Position.Bias b)
+ throws BadLocationException {
+
+ // line coordinates
+ Element map = getElement();
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ int lineIndex = map.getElementIndex(pos);
+ Token tokenList = doc.getTokenListForLine(lineIndex);
+ Rectangle lineArea = lineToRect(a, lineIndex);
+ tabBase = lineArea.x; // Used by listOffsetToView().
+
+ //int x = (int)RSyntaxUtilities.getTokenListWidthUpTo(tokenList,
+ // (RSyntaxTextArea)getContainer(),
+ // this, 0, pos);
+ // We use this method instead as it returns the actual bounding box,
+ // not just the x-coordinate.
+ lineArea = tokenList.listOffsetToView(
+ (RSyntaxTextArea)getContainer(), this, pos,
+ tabBase, lineArea);
+
+ return lineArea;
+
+ }
+
+
+ /**
+ * Provides a mapping, for a given region, from the document model
+ * coordinate space to the view coordinate space. The specified region is
+ * created as a union of the first and last character positions.<p>
+ *
+ * This is implemented to subtract the width of the second character, as
+ * this view's <code>modelToView</code> actually returns the width of the
+ * character instead of "1" or "0" like the View implementations in
+ * <code>javax.swing.text</code>. Thus, if we don't override this method,
+ * the <code>View</code> implementation will return one character's width
+ * too much for its consumers (implementations of
+ * <code>javax.swing.text.Highlighter</code>).
+ *
+ * @param p0 the position of the first character (>=0)
+ * @param b0 The bias of the first character position, toward the previous
+ * character or the next character represented by the offset, in
+ * case the position is a boundary of two views; <code>b0</code>
+ * will have one of these values:
+ * <ul>
+ * <li> <code>Position.Bias.Forward</code>
+ * <li> <code>Position.Bias.Backward</code>
+ * </ul>
+ * @param p1 the position of the last character (>=0)
+ * @param b1 the bias for the second character position, defined
+ * one of the legal values shown above
+ * @param a the area of the view, which encompasses the requested region
+ * @return the bounding box which is a union of the region specified
+ * by the first and last character positions
+ * @exception BadLocationException if the given position does
+ * not represent a valid location in the associated document
+ * @exception IllegalArgumentException if <code>b0</code> or
+ * <code>b1</code> are not one of the
+ * legal <code>Position.Bias</code> values listed above
+ * @see View#viewToModel
+ */
+ public Shape modelToView(int p0, Position.Bias b0,
+ int p1, Position.Bias b1,
+ Shape a) throws BadLocationException {
+
+ Shape s0 = modelToView(p0, a, b0);
+ Shape s1;
+ if (p1 ==getEndOffset()) {
+ try {
+ s1 = modelToView(p1, a, b1);
+ } catch (BadLocationException ble) {
+ s1 = null;
+ }
+ if (s1 == null) {
+ // Assume extends left to right.
+ Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+ a.getBounds();
+ s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+ 1, alloc.height);
+ }
+ }
+ else {
+ s1 = modelToView(p1, a, b1);
+ }
+ Rectangle r0 = s0 instanceof Rectangle ? (Rectangle)s0 : s0.getBounds();
+ Rectangle r1 = s1 instanceof Rectangle ? (Rectangle)s1 : s1.getBounds();
+ if (r0.y != r1.y) {
+ // If it spans lines, force it to be the width of the view.
+ Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+ a.getBounds();
+ r0.x = alloc.x;
+ r0.width = alloc.width;
+ }
+
+ r0.add(r1);
+ // The next line is the only difference between this method and
+ // View's implementation. We're subtracting the width of the second
+ // character. This is because this method is used by Highlighter
+ // implementations to get the area to "highlight", and if we don't do
+ // this, one character too many is highlighted thanks to our
+ // modelToView() implementation returning the actual width of the
+ // character requested!
+ if (p1>p0) r0.width -= r1.width;
+
+ return r0;
+
+ }
+
+
+ /**
+ * Returns the next tab stop position after a given reference position.
+ * This implementation does not support things like centering so it
+ * ignores the tabOffset argument.
+ *
+ * @param x the current position >= 0
+ * @param tabOffset the position within the text stream
+ * that the tab occurred at >= 0.
+ * @return the tab stop, measured in points >= 0
+ */
+ public float nextTabStop(float x, int tabOffset) {
+ if (tabSize == 0)
+ return x;
+ int ntabs = (((int)x) - tabBase) / tabSize;
+ return tabBase + ((ntabs + 1) * tabSize);
+ }
+
+
+ /**
+ * Actually paints the text area. Only lines that have been damaged are
+ * repainted.
+ *
+ * @param g The graphics context with which to paint.
+ * @param a The allocated region in which to render.
+ */
+ public void paint(Graphics g, Shape a) {
+
+ RSyntaxDocument document = (RSyntaxDocument)getDocument();
+
+ Rectangle alloc = a.getBounds();
+
+ tabBase = alloc.x;
+ host = (RSyntaxTextArea)getContainer();
+
+ Rectangle clip = g.getClipBounds();
+ // An attempt to speed things up for files with long lines. Note that
+ // this will actually slow things down a bit for the common case of
+ // regular-length lines, but it doesn't make a perceivable difference.
+ clipStart = clip.x;
+ clipEnd = clipStart + clip.width;
+
+ lineHeight = host.getLineHeight();
+ ascent = host.getMaxAscent();//metrics.getAscent();
+ int heightAbove = clip.y - alloc.y;
+ int linesAbove = Math.max(0, heightAbove / lineHeight);
+
+ FoldManager fm = host.getFoldManager();
+ linesAbove += fm.getHiddenLineCountAbove(linesAbove, true);
+ Rectangle lineArea = lineToRect(a, linesAbove);
+ int y = lineArea.y + ascent;
+ int x = lineArea.x;
+ Element map = getElement();
+ int lineCount = map.getElementCount();
+
+ // Whether token styles should always be painted, even in selections
+ int selStart = host.getSelectionStart();
+ int selEnd = host.getSelectionEnd();
+ boolean useSelectedTextColor = host.getUseSelectedTextColor();
+
+ RSyntaxTextAreaHighlighter h =
+ (RSyntaxTextAreaHighlighter)host.getHighlighter();
+
+ Graphics2D g2d = (Graphics2D)g;
+ Token token;
+ //System.err.println("Painting lines: " + linesAbove + " to " + (endLine-1));
+
+ TokenPainter painter = host.getTokenPainter();
+ int line = linesAbove;
+ //int count = 0;
+ while (y<clip.y+clip.height+lineHeight && line<lineCount) {
+
+ Fold fold = fm.getFoldForLine(line);
+ Element lineElement = map.getElement(line);
+ int startOffset = lineElement.getStartOffset();
+ //int endOffset = (line==lineCount ? lineElement.getEndOffset()-1 :
+ // lineElement.getEndOffset()-1);
+ int endOffset = lineElement.getEndOffset()-1; // Why always "-1"?
+ h.paintLayeredHighlights(g2d, startOffset, endOffset,
+ a, host, this);
+
+ // Paint a line of text.
+ token = document.getTokenListForLine(line);
+ if (!useSelectedTextColor || selStart==selEnd ||
+ (startOffset>=selEnd || endOffset<selStart)) {
+ drawLine(painter, token, g2d, x,y);
+ }
+ else {
+ //System.out.println("Drawing line with selection: " + line);
+ drawLineWithSelection(painter,token,g2d, x,y, selStart, selEnd);
+ }
+
+ if (fold!=null && fold.isCollapsed()) {
+
+ // Visible indicator of collapsed lines
+ Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+ if (c!=null) {
+ g.setColor(c);
+ g.drawLine(x,y+lineHeight-ascent-1,
+ alloc.width,y+lineHeight-ascent-1);
+ }
+
+ // Skip to next line to paint, taking extra care for lines with
+ // block ends and begins together, e.g. "} else {"
+ do {
+ int hiddenLineCount = fold.getLineCount();
+ if (hiddenLineCount==0) {
+ // Fold parser identified a zero-line fold region.
+ // This is really a bug, but we'll be graceful here
+ // and avoid an infinite loop.
+ break;
+ }
+ line += hiddenLineCount;
+ fold = fm.getFoldForLine(line);
+ } while (fold!=null && fold.isCollapsed());
+
+ }
+
+ y += lineHeight;
+ line++;
+ //count++;
+
+ }
+
+ //System.out.println("SyntaxView: lines painted=" + count);
+
+ }
+
+
+ /**
+ * If the passed-in line is longer than the current longest line, then
+ * the longest line is updated.
+ *
+ * @param line The line to test against the current longest.
+ * @param lineNumber The line number of the passed-in line.
+ * @return <code>true</code> iff the current longest line was updated.
+ */
+ protected boolean possiblyUpdateLongLine(Element line, int lineNumber) {
+ float w = getLineWidth(lineNumber);
+ if (w > longLineWidth) {
+ longLineWidth = w;
+ longLine = line;
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Gives notification that something was removed from the document
+ * in a location that this view is responsible for.
+ *
+ * @param changes the change information from the associated document
+ * @param a the current allocation of the view
+ * @param f the factory to use to rebuild if the view has children
+ */
+ public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+ updateDamage(changes, a, f);
+ }
+
+
+ public void setSize(float width, float height) {
+ super.setSize(width, height);
+ updateMetrics();
+ }
+
+
+ /**
+ * Repaint the region of change covered by the given document
+ * event. Damages the line that begins the range to cover
+ * the case when the insert/remove is only on one line.
+ * If lines are added or removed, damages the whole
+ * view. The longest line is checked to see if it has
+ * changed.
+ */
+ protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) {
+ Component host = getContainer();
+ updateMetrics();
+ Element elem = getElement();
+ DocumentEvent.ElementChange ec = changes.getChange(elem);
+ Element[] added = (ec != null) ? ec.getChildrenAdded() : null;
+ Element[] removed = (ec != null) ? ec.getChildrenRemoved() : null;
+ if (((added != null) && (added.length > 0)) ||
+ ((removed != null) && (removed.length > 0))) {
+ // lines were added or removed...
+ if (added != null) {
+ int addedAt = ec.getIndex(); // FIXME: Is this correct?????
+ for (int i = 0; i < added.length; i++)
+ possiblyUpdateLongLine(added[i], addedAt+i);
+ }
+ if (removed != null) {
+ for (int i = 0; i < removed.length; i++) {
+ if (removed[i] == longLine) {
+ longLineWidth = -1; // Must do this!!
+ calculateLongestLine();
+ break;
+ }
+ }
+ }
+ preferenceChanged(null, true, true);
+ host.repaint();
+ }
+
+ // This occurs when syntax highlighting only changes on lines
+ // (i.e. beginning a multiline comment).
+ else if (changes.getType()==DocumentEvent.EventType.CHANGE) {
+ //System.err.println("Updating the damage due to a CHANGE event...");
+ int startLine = changes.getOffset();
+ int endLine = changes.getLength();
+ damageLineRange(startLine,endLine, a, host);
+ }
+
+ else {
+ Element map = getElement();
+ int line = map.getElementIndex(changes.getOffset());
+ damageLineRange(line, line, a, host);
+ if (changes.getType() == DocumentEvent.EventType.INSERT) {
+ // check to see if the line is longer than current
+ // longest line.
+ Element e = map.getElement(line);
+ if (e == longLine) {
+ // We must recalculate longest line's width here
+ // because it has gotten longer.
+ longLineWidth = getLineWidth(line);
+ preferenceChanged(null, true, false);
+ }
+ else {
+ // If long line gets updated, update the status bars too.
+ if (possiblyUpdateLongLine(e, line))
+ preferenceChanged(null, true, false);
+ }
+ }
+ else if (changes.getType() == DocumentEvent.EventType.REMOVE) {
+ if (map.getElement(line) == longLine) {
+ // removed from longest line... recalc
+ longLineWidth = -1; // Must do this!
+ calculateLongestLine();
+ preferenceChanged(null, true, false);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Checks to see if the font metrics and longest line are up-to-date.
+ */
+ protected void updateMetrics() {
+ host = (RSyntaxTextArea)getContainer();
+ Font f = host.getFont();
+ if (font != f) {
+ // The font changed, we need to recalculate the longest line!
+ // This also updates cached font and tab size.
+ calculateLongestLine();
+ }
+ }
+
+
+ /**
+ * Provides a mapping from the view coordinate space to the logical
+ * coordinate space of the model.
+ *
+ * @param fx the X coordinate >= 0
+ * @param fy the Y coordinate >= 0
+ * @param a the allocated region to render into
+ * @return the location within the model that best represents the
+ * given point in the view >= 0
+ */
+ public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+ bias[0] = Position.Bias.Forward;
+
+ Rectangle alloc = a.getBounds();
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ int x = (int) fx;
+ int y = (int) fy;
+
+ // If they're asking about a view position above the area covered by
+ // this view, then the position is assumed to be the starting position
+ // of this view.
+ if (y < alloc.y) {
+ return getStartOffset();
+ }
+
+ // If they're asking about a position below this view, the position
+ // is assumed to be the ending position of this view.
+ else if (y > alloc.y + alloc.height) {
+ return host.getLastVisibleOffset();
+ }
+
+ // They're asking about a position within the coverage of this view
+ // vertically. So, we figure out which line the point corresponds to.
+ // If the line is greater than the number of lines contained, then
+ // simply use the last line as it represents the last possible place
+ // we can position to.
+ else {
+
+ Element map = doc.getDefaultRootElement();
+ int lineIndex = Math.abs((y - alloc.y) / lineHeight);//metrics.getHeight() );
+FoldManager fm = host.getFoldManager();
+//System.out.print("--- " + lineIndex);
+lineIndex += fm.getHiddenLineCountAbove(lineIndex, true);
+//System.out.println(" => " + lineIndex);
+ if (lineIndex >= map.getElementCount()) {
+ return host.getLastVisibleOffset();
+ }
+
+ Element line = map.getElement(lineIndex);
+
+ // If the point is to the left of the line...
+ if (x < alloc.x)
+ return line.getStartOffset();
+
+ // If the point is to the right of the line...
+ else if (x > alloc.x + alloc.width)
+ return line.getEndOffset() - 1;
+
+ else {
+ // Determine the offset into the text
+ int p0 = line.getStartOffset();
+ Token tokenList = doc.getTokenListForLine(lineIndex);
+ tabBase = alloc.x;
+ int offs = tokenList.getListOffset(
+ (RSyntaxTextArea)getContainer(),
+ this, tabBase, x);
+ return offs!=-1 ? offs : p0;
+ }
+
+ } // End of else.
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+
+ //Rectangle lineArea = lineToRect(alloc, lineIndex);
+ updateMetrics();
+ if (metrics != null) {
+ // NOTE: lineHeight is not initially set here, leading to the
+ // current line not being highlighted when a document is first
+ // opened. So, we set it here just in case.
+ lineHeight = host!=null ? host.getLineHeight() : lineHeight;
+ FoldManager fm = host.getFoldManager();
+ if (!fm.isLineHidden(line)) {
+ line -= fm.getHiddenLineCountAbove(line);
+ return alloc.y + line*lineHeight;
+ }
+ }
+
+ return -1;
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int yForLineContaining(Rectangle alloc, int offs)
+ throws BadLocationException {
+ Element map = getElement();
+ int line = map.getElementIndex(offs);
+ return yForLine(alloc, line);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java b/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java
new file mode 100644
index 0000000..fc5eac2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TextEditorPane.java
@@ -0,0 +1,712 @@
+/*
+ * 11/25/2008
+ *
+ * TextEditorPane.java - A syntax highlighting text area that has knowledge of
+ * the file it is editing on disk.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.Document;
+
+import org.fife.io.UnicodeReader;
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rtextarea.RTextAreaEditorKit;
+
+
+/**
+ * An extension of {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea}
+ * that adds information about the file being edited, such as:
+ *
+ * <ul>
+ * <li>Its name and location.
+ * <li>Is it dirty?
+ * <li>Is it read-only?
+ * <li>The last time it was loaded or saved to disk (local files only).
+ * <li>The file's encoding on disk.
+ * <li>Easy access to the line separator.
+ * </ul>
+ *
+ * Loading and saving is also built into the editor.<p>
+ * Both local and remote files (e.g. ftp) are supported. See the
+ * {@link FileLocation} class for more information.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see FileLocation
+ */
+public class TextEditorPane extends RSyntaxTextArea implements
+ DocumentListener {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String FULL_PATH_PROPERTY = "TextEditorPane.fileFullPath";
+ public static final String DIRTY_PROPERTY = "TextEditorPane.dirty";
+ public static final String READ_ONLY_PROPERTY = "TextEditorPane.readOnly";
+
+ /**
+ * The location of the file being edited.
+ */
+ private FileLocation loc;
+
+ /**
+ * The charset to use when reading or writing this file.
+ */
+ private String charSet;
+
+ /**
+ * Whether the file should be treated as read-only.
+ */
+ private boolean readOnly;
+
+ /**
+ * Whether the file is dirty.
+ */
+ private boolean dirty;
+
+ /**
+ * The last time this file was modified on disk, for local files.
+ * For remote files, this value should always be
+ * {@link #LAST_MODIFIED_UNKNOWN}.
+ */
+ private long lastSaveOrLoadTime;
+
+ /**
+ * The value returned by {@link #getLastSaveOrLoadTime()} for remote files.
+ */
+ public static final long LAST_MODIFIED_UNKNOWN = 0;
+
+ /**
+ * The default name given to files if none is specified in a constructor.
+ */
+ private static final String DEFAULT_FILE_NAME = "Untitled.txt";
+
+
+ /**
+ * Constructor. The file will be given a default name.
+ */
+ public TextEditorPane() {
+ this(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor. The file will be given a default name.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ */
+ public TextEditorPane(int textMode) {
+ this(textMode, false);
+ }
+
+
+ /**
+ * Creates a new <code>TextEditorPane</code>. The file will be given
+ * a default name.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+ */
+ public TextEditorPane(int textMode, boolean wordWrapEnabled) {
+ super(textMode);
+ setLineWrap(wordWrapEnabled);
+ try {
+ init(null, null);
+ } catch (IOException ioe) { // Never happens
+ ioe.printStackTrace();
+ }
+ }
+
+
+ /**
+ * Creates a new <code>TextEditorPane</code>.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+ * @param loc The location of the text file being edited. If this value
+ * is <code>null</code>, a file named "Untitled.txt" in the current
+ * directory is used.
+ * @throws IOException If an IO error occurs reading the file at
+ * <code>loc</code>. This of course won't happen if
+ * <code>loc</code> is <code>null</code>.
+ */
+ public TextEditorPane(int textMode, boolean wordWrapEnabled,
+ FileLocation loc) throws IOException {
+ this(textMode, wordWrapEnabled, loc, null);
+ }
+
+
+ /**
+ * Creates a new <code>TextEditorPane</code>.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ * @param wordWrapEnabled Whether or not to use word wrap in this pane.
+ * @param loc The location of the text file being edited. If this value
+ * is <code>null</code>, a file named "Untitled.txt" in the current
+ * directory is used. This file is displayed as empty even if it
+ * actually exists.
+ * @param defaultEnc The default encoding to use when opening the file,
+ * if the file is not Unicode. If this value is <code>null</code>,
+ * a system default value is used.
+ * @throws IOException If an IO error occurs reading the file at
+ * <code>loc</code>. This of course won't happen if
+ * <code>loc</code> is <code>null</code>.
+ */
+ public TextEditorPane(int textMode, boolean wordWrapEnabled,
+ FileLocation loc, String defaultEnc) throws IOException {
+ super(textMode);
+ setLineWrap(wordWrapEnabled);
+ init(loc, defaultEnc);
+ }
+
+
+ /**
+ * Callback for when styles in the current document change.
+ * This method is never called.
+ *
+ * @param e The document event.
+ */
+ public void changedUpdate(DocumentEvent e) {
+ }
+
+
+
+ /**
+ * Returns the default encoding for this operating system.
+ *
+ * @return The default encoding.
+ */
+ private static final String getDefaultEncoding() {
+ // TODO: Change to "Charset.defaultCharset().name()" when 1.4 support
+ // is no longer needed.
+ // NOTE: The "file.encoding" property is not guaranteed to be set by
+ // the spec, so we cannot rely on it.
+ String encoding = System.getProperty("file.encoding");
+ if (encoding==null) {
+ try {
+ File f = File.createTempFile("rsta", null);
+ FileWriter w = new FileWriter(f);
+ encoding = w.getEncoding();
+ w.close();
+ f.deleteOnExit();//delete(); Keep FindBugs happy
+ } catch (IOException ioe) {
+ encoding = "US-ASCII";
+ }
+ }
+ return encoding;
+ }
+
+
+ /**
+ * Returns the encoding to use when reading or writing this file.
+ *
+ * @return The encoding.
+ * @see #setEncoding(String)
+ */
+ public String getEncoding() {
+ return charSet;
+ }
+
+
+ /**
+ * Returns the full path to this document.
+ *
+ * @return The full path to the document.
+ */
+ public String getFileFullPath() {
+ return loc==null ? null : loc.getFileFullPath();
+ }
+
+
+ /**
+ * Returns the file name of this document.
+ *
+ * @return The file name.
+ */
+ public String getFileName() {
+ return loc.getFileName();
+ }
+
+
+ /**
+ * Returns the timestamp for when this file was last loaded or saved
+ * <em>by this editor pane</em>. If the file has been modified on disk by
+ * another process after it was loaded into this editor pane, this method
+ * will not return the actual file's last modified time.<p>
+ *
+ * For remote files, this method will always return
+ * {@link #LAST_MODIFIED_UNKNOWN}.
+ *
+ * @return The timestamp when this file was last loaded or saved by this
+ * editor pane, if it is a local file, or
+ * {@link #LAST_MODIFIED_UNKNOWN} if it is a remote file.
+ * @see #isModifiedOutsideEditor()
+ */
+ public long getLastSaveOrLoadTime() {
+ return lastSaveOrLoadTime;
+ }
+
+
+ /**
+ * Returns the line separator used when writing this file (e.g.
+ * "<code>\n</code>", "<code>\r\n</code>", or "<code>\r</code>").<p>
+ *
+ * Note that this value is an <code>Object</code> and not a
+ * <code>String</code> as that is the way the {@link Document} interface
+ * defines its property values. If you always use
+ * {@link #setLineSeparator(String)} to modify this value, then the value
+ * returned from this method will always be a <code>String</code>.
+ *
+ * @return The line separator. If this value is <code>null</code>, then
+ * the system default line separator is used (usually the value
+ * of <code>System.getProperty("line.separator")</code>).
+ * @see #setLineSeparator(String)
+ * @see #setLineSeparator(String, boolean)
+ */
+ public Object getLineSeparator() {
+ return getDocument().getProperty(
+ RTextAreaEditorKit.EndOfLineStringProperty);
+ }
+
+
+ /**
+ * Initializes this editor with the specified file location.
+ *
+ * @param loc The file location. If this is <code>null</code>, a default
+ * location is used and an empty file is displayed.
+ * @param defaultEnc The default encoding to use when opening the file,
+ * if the file is not Unicode. If this value is <code>null</code>,
+ * a system default value is used.
+ * @throws IOException If an IO error occurs reading from <code>loc</code>.
+ * If <code>loc</code> is <code>null</code>, this cannot happen.
+ */
+ private void init(FileLocation loc, String defaultEnc) throws IOException {
+
+ if (loc==null) {
+ // Don't call load() just in case Untitled.txt actually exists,
+ // just to ensure there is no chance of an IOException being thrown
+ // in the default case.
+ this.loc = FileLocation.create(DEFAULT_FILE_NAME);
+ charSet = defaultEnc==null ? getDefaultEncoding() : defaultEnc;
+ // Ensure that line separator always has a value, even if the file
+ // does not exist (or is the "default" file). This makes life
+ // easier for host applications that want to display this value.
+ setLineSeparator(System.getProperty("line.separator"));
+ }
+ else {
+ load(loc, defaultEnc); // Sets this.loc
+ }
+
+ if (this.loc.isLocalAndExists()) {
+ File file = new File(this.loc.getFileFullPath());
+ lastSaveOrLoadTime = file.lastModified();
+ setReadOnly(!file.canWrite());
+ }
+ else {
+ lastSaveOrLoadTime = LAST_MODIFIED_UNKNOWN;
+ setReadOnly(false);
+ }
+
+ setDirty(false);
+
+ }
+
+
+ /**
+ * Callback for when text is inserted into the document.
+ *
+ * @param e Information on the insertion.
+ */
+ public void insertUpdate(DocumentEvent e) {
+ if (!dirty) {
+ setDirty(true);
+ }
+ }
+
+
+ /**
+ * Returns whether or not the text in this editor has unsaved changes.
+ *
+ * @return Whether or not the text has unsaved changes.
+ * @see #setDirty(boolean)
+ */
+ public boolean isDirty() {
+ return dirty;
+ }
+
+
+ /**
+ * Returns whether this file is a local file.
+ *
+ * @return Whether this is a local file.
+ */
+ public boolean isLocal() {
+ return loc.isLocal();
+ }
+
+
+ /**
+ * Returns whether this is a local file that already exists.
+ *
+ * @return Whether this is a local file that already exists.
+ */
+ public boolean isLocalAndExists() {
+ return loc.isLocalAndExists();
+ }
+
+
+ /**
+ * Returns whether the text file has been modified outside of this editor
+ * since the last load or save operation. Note that if this is a remote
+ * file, this method will always return <code>false</code>.<p>
+ *
+ * This method may be used by applications to implement a reloading
+ * feature, where the user is prompted to reload a file if it has been
+ * modified since their last open or save.
+ *
+ * @return Whether the text file has been modified outside of this
+ * editor.
+ * @see #getLastSaveOrLoadTime()
+ */
+ public boolean isModifiedOutsideEditor() {
+ return loc.getActualLastModified()>getLastSaveOrLoadTime();
+ }
+
+
+ /**
+ * Returns whether or not the text area should be treated as read-only.
+ *
+ * @return Whether or not the text area should be treated as read-only.
+ * @see #setReadOnly(boolean)
+ */
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+
+ /**
+ * Loads the specified file in this editor. This method fires a property
+ * change event of type {@link #FULL_PATH_PROPERTY}.
+ *
+ * @param loc The location of the file to load. This cannot be
+ * <code>null</code>.
+ * @param defaultEnc The encoding to use when loading/saving the file.
+ * This encoding will only be used if the file is not Unicode.
+ * If this value is <code>null</code>, the system default encoding
+ * is used.
+ * @throws IOException If an IO error occurs.
+ * @see #save()
+ * @see #saveAs(FileLocation)
+ */
+ public void load(FileLocation loc, String defaultEnc) throws IOException {
+
+ // For new local files, just go with it.
+ if (loc.isLocal() && !loc.isLocalAndExists()) {
+ this.charSet = defaultEnc!=null ? defaultEnc : getDefaultEncoding();
+ this.loc = loc;
+ setText(null);
+ discardAllEdits();
+ setDirty(false);
+ return;
+ }
+
+ // Old local files and remote files, load 'em up. UnicodeReader will
+ // check for BOMs and handle them correctly in all cases, then pass
+ // rest of stream down to InputStreamReader.
+ UnicodeReader ur = new UnicodeReader(loc.getInputStream(), defaultEnc);
+
+ // Remove listener so dirty flag doesn't get set when loading a file.
+ Document doc = getDocument();
+ doc.removeDocumentListener(this);
+ BufferedReader r = new BufferedReader(ur);
+ try {
+ read(r, null);
+ } finally {
+ doc.addDocumentListener(this);
+ r.close();
+ }
+
+ // No IOException thrown, so we can finally change the location.
+ charSet = ur.getEncoding();
+ String old = getFileFullPath();
+ this.loc = loc;
+ setDirty(false);
+ setCaretPosition(0);
+ firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+
+ }
+
+
+ /**
+ * Reloads this file from disk. The file must exist for this operation
+ * to not throw an exception.<p>
+ *
+ * The file's "dirty" state will be set to <code>false</code> after this
+ * operation. If this is a local file, its "last modified" time is
+ * updated to reflect that of the actual file.<p>
+ *
+ * Note that if the file has been modified on disk, and is now a Unicode
+ * encoding when before it wasn't (or if it is a different Unicode now),
+ * this will cause this {@link TextEditorPane}'s encoding to change.
+ * Otherwise, the file's encoding will stay the same.
+ *
+ * @throws IOException If the file does not exist, or if an IO error
+ * occurs reading the file.
+ * @see #isLocalAndExists()
+ */
+ public void reload() throws IOException {
+ String oldEncoding = getEncoding();
+ UnicodeReader ur = new UnicodeReader(loc.getInputStream(), oldEncoding);
+ String encoding = ur.getEncoding();
+ BufferedReader r = new BufferedReader(ur);
+ try {
+ read(r, null); // Dumps old contents.
+ } finally {
+ r.close();
+ }
+ setEncoding(encoding);
+ setDirty(false);
+ syncLastSaveOrLoadTimeToActualFile();
+ discardAllEdits(); // Prevent user from being able to undo the reload
+ }
+
+
+ /**
+ * Called whenever text is removed from this editor.
+ *
+ * @param e The document event.
+ */
+ public void removeUpdate(DocumentEvent e) {
+ if (!dirty) {
+ setDirty(true);
+ }
+ }
+
+
+ /**
+ * Saves the file in its current encoding.<p>
+ *
+ * The text area's "dirty" state is set to <code>false</code>, and if
+ * this is a local file, its "last modified" time is updated.
+ *
+ * @throws IOException If an IO error occurs.
+ * @see #saveAs(FileLocation)
+ * @see #load(FileLocation, String)
+ */
+ public void save() throws IOException {
+ saveImpl(loc);
+ setDirty(false);
+ syncLastSaveOrLoadTimeToActualFile();
+ }
+
+
+ /**
+ * Saves this file in a new local location. This method fires a property
+ * change event of type {@link #FULL_PATH_PROPERTY}.
+ *
+ * @param loc The location to save to.
+ * @throws IOException If an IO error occurs.
+ * @see #save()
+ * @see #load(FileLocation, String)
+ */
+ public void saveAs(FileLocation loc) throws IOException {
+ saveImpl(loc);
+ // No exception thrown - we can "rename" the file.
+ String old = getFileFullPath();
+ this.loc = loc;
+ setDirty(false);
+ lastSaveOrLoadTime = loc.getActualLastModified();
+ firePropertyChange(FULL_PATH_PROPERTY, old, getFileFullPath());
+ }
+
+
+ /**
+ * Saves the text in this editor to the specified location.
+ *
+ * @param loc The location to save to.
+ * @throws IOException If an IO error occurs.
+ */
+ private void saveImpl(FileLocation loc) throws IOException {
+ OutputStream out = loc.getOutputStream();
+ BufferedWriter w = new BufferedWriter(
+ new UnicodeWriter(out, getEncoding()));
+ try {
+ write(w);
+ } finally {
+ w.close();
+ }
+ }
+
+
+ /**
+ * Sets whether or not this text in this editor has unsaved changes.
+ * This fires a property change event of type {@link #DIRTY_PROPERTY}.<p>
+ *
+ * Applications will usually have no need to call this method directly; the
+ * only time you might have a need to call this method directly is if you
+ * have to initialize an instance of TextEditorPane with content that does
+ * not come from a file. <code>TextEditorPane</code> automatically sets its
+ * own dirty flag when its content is edited, when its encoding is changed,
+ * or when its line ending property is changed. It is cleared whenever
+ * <code>load()</code>, <code>reload()</code>, <code>save()</code>, or
+ * <code>saveAs()</code> are called.
+ *
+ * @param dirty Whether or not the text has been modified.
+ * @see #isDirty()
+ */
+ public void setDirty(boolean dirty) {
+ if (this.dirty!=dirty) {
+ this.dirty = dirty;
+ firePropertyChange(DIRTY_PROPERTY, !dirty, dirty);
+ }
+ }
+
+
+ /**
+ * Sets the document for this editor.
+ *
+ * @param doc The new document.
+ */
+ public void setDocument(Document doc) {
+ Document old = getDocument();
+ if (old!=null) {
+ old.removeDocumentListener(this);
+ }
+ super.setDocument(doc);
+ doc.addDocumentListener(this);
+ }
+
+
+ /**
+ * Sets the encoding to use when reading or writing this file. This
+ * method sets the editor's dirty flag when the encoding is changed.
+ *
+ * @param encoding The new encoding.
+ * @throws UnsupportedCharsetException If the encoding is not supported.
+ * @throws NullPointerException If <code>encoding</code> is
+ * <code>null</code>.
+ * @see #getEncoding()
+ */
+ public void setEncoding(String encoding) {
+ if (encoding==null) {
+ throw new NullPointerException("encoding cannot be null");
+ }
+ else if (!Charset.isSupported(encoding)) {
+ throw new UnsupportedCharsetException(encoding);
+ }
+ if (charSet==null || !charSet.equals(encoding)) {
+ charSet = encoding;
+ setDirty(true);
+ }
+ }
+
+
+ /**
+ * Sets the line separator sequence to use when this file is saved (e.g.
+ * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+ *
+ * Besides parameter checking, this method is preferred over
+ * <code>getDocument().putProperty()</code> because it sets the editor's
+ * dirty flag when the line separator is changed.
+ *
+ * @param separator The new line separator.
+ * @throws NullPointerException If <code>separator</code> is
+ * <code>null</code>.
+ * @throws IllegalArgumentException If <code>separator</code> is not one
+ * of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+ * @see #getLineSeparator()
+ */
+ public void setLineSeparator(String separator) {
+ setLineSeparator(separator, true);
+ }
+
+
+ /**
+ * Sets the line separator sequence to use when this file is saved (e.g.
+ * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
+ *
+ * Besides parameter checking, this method is preferred over
+ * <code>getDocument().putProperty()</code> because can set the editor's
+ * dirty flag when the line separator is changed.
+ *
+ * @param separator The new line separator.
+ * @param setDirty Whether the dirty flag should be set if the line
+ * separator is changed.
+ * @throws NullPointerException If <code>separator</code> is
+ * <code>null</code>.
+ * @throws IllegalArgumentException If <code>separator</code> is not one
+ * of "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>".
+ * @see #getLineSeparator()
+ */
+ public void setLineSeparator(String separator, boolean setDirty) {
+ if (separator==null) {
+ throw new NullPointerException("terminator cannot be null");
+ }
+ if (!"\r\n".equals(separator) && !"\n".equals(separator) &&
+ !"\r".equals(separator)) {
+ throw new IllegalArgumentException("Invalid line terminator");
+ }
+ Document doc = getDocument();
+ Object old = doc.getProperty(
+ RTextAreaEditorKit.EndOfLineStringProperty);
+ if (!separator.equals(old)) {
+ doc.putProperty(RTextAreaEditorKit.EndOfLineStringProperty,
+ separator);
+ if (setDirty) {
+ setDirty(true);
+ }
+ }
+ }
+
+
+ /**
+ * Sets whether or not this text area should be treated as read-only.
+ * This fires a property change event of type {@link #READ_ONLY_PROPERTY}.
+ *
+ * @param readOnly Whether or not the document is read-only.
+ * @see #isReadOnly()
+ */
+ public void setReadOnly(boolean readOnly) {
+ if (this.readOnly!=readOnly) {
+ this.readOnly = readOnly;
+ firePropertyChange(READ_ONLY_PROPERTY, !readOnly, readOnly);
+ }
+ }
+
+
+ /**
+ * Syncs this text area's "last saved or loaded" time to that of the file
+ * being edited, if that file is local and exists. If the file is
+ * remote or is local but does not yet exist, nothing happens.<p>
+ *
+ * You normally do not have to call this method, as the "last saved or
+ * loaded" time for {@link TextEditorPane}s is kept up-to-date internally
+ * during such operations as {@link #save()}, {@link #reload()}, etc.
+ *
+ * @see #getLastSaveOrLoadTime()
+ * @see #isModifiedOutsideEditor()
+ */
+ public void syncLastSaveOrLoadTimeToActualFile() {
+ if (loc.isLocalAndExists()) {
+ lastSaveOrLoadTime = loc.getActualLastModified();
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Theme.java b/src/org/fife/ui/rsyntaxtextarea/Theme.java
new file mode 100644
index 0000000..f3e14b2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Theme.java
@@ -0,0 +1,842 @@
+/*
+ * 10/30/2011
+ *
+ * Theme.java - A color theme for RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.SystemColor;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+
+import javax.swing.UIManager;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.text.StyleContext;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import org.fife.io.UnicodeWriter;
+import org.fife.ui.rtextarea.Gutter;
+import org.fife.ui.rtextarea.RTextArea;
+
+
+/**
+ * A theme is a set of fonts and colors to use to style RSyntaxTextArea.
+ * Themes are defined in XML files that are validated against
+ * <code>themes.dtd</code>. This provides applications and other consumers
+ * with an easy way to style RSyntaxTextArea without having to use the API.<p>
+ *
+ * Sample themes are included in the source tree under the <code>/themes</code>
+ * folder, but are not a part of the built RSyntaxTextArea jar. Hosting
+ * applications are free to ship and use these themes as-is, modify them, or
+ * create their own.<p>
+ *
+ * Note that to save a <code>Theme</code> via {@link #save(OutputStream)},
+ * you must currently create a <code>Theme</code> from a text area wrapped in
+ * an <code>RTextScrollPane</code>, so that the color information for the
+ * gutter can be retrieved.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Theme {
+
+ private Font baseFont;
+ private Color bgColor;
+ private Color caretColor;
+ private boolean useSelctionFG;
+ private Color selectionFG;
+ private Color selectionBG;
+ private boolean selectionRoundedEdges;
+ private Color currentLineHighlight;
+ private boolean fadeCurrentLineHighlight;
+ private Color marginLineColor;
+ private Color markAllHighlightColor;
+ private Color markOccurrencesColor;
+ private boolean markOccurrencesBorder;
+ private Color matchedBracketFG;
+ private Color matchedBracketBG;
+ private boolean matchedBracketHighlightBoth;
+ private boolean matchedBracketAnimate;
+ private Color hyperlinkFG;
+ private Color[] secondaryLanguages;
+
+ private SyntaxScheme scheme;
+
+ private Color gutterBorderColor;
+ private Color lineNumberColor;
+ private String lineNumberFont;
+ private int lineNumberFontSize;
+ private Color foldIndicatorFG;
+ private Color foldBG;
+
+
+ /**
+ * Private constructor, used when loading from a stream.
+ *
+ * @param baseFont The default font to use for any "base font" properties
+ * not specified in the theme XML. If this is <code>null</code>,
+ * a default monospaced font will be used.
+ */
+ private Theme(Font baseFont) {
+ this.baseFont = baseFont!=null ? baseFont : RTextArea.getDefaultFont();
+ secondaryLanguages = new Color[3];
+ }
+
+
+ /**
+ * Creates a theme from an RSyntaxTextArea. It should be contained in
+ * an <code>RTextScrollPane</code> to get all gutter color information.
+ *
+ * @param textArea The text area.
+ */
+ public Theme(RSyntaxTextArea textArea) {
+
+ baseFont = textArea.getFont();
+ bgColor = textArea.getBackground();
+ caretColor = textArea.getCaretColor();
+ useSelctionFG = textArea.getUseSelectedTextColor();
+ selectionFG = textArea.getSelectedTextColor();
+ selectionBG = textArea.getSelectionColor();
+ selectionRoundedEdges = textArea.getRoundedSelectionEdges();
+ currentLineHighlight = textArea.getCurrentLineHighlightColor();
+ fadeCurrentLineHighlight = textArea.getFadeCurrentLineHighlight();
+ marginLineColor = textArea.getMarginLineColor();
+ markAllHighlightColor = textArea.getMarkAllHighlightColor();
+ markOccurrencesColor = textArea.getMarkOccurrencesColor();
+ markOccurrencesBorder = textArea.getPaintMarkOccurrencesBorder();
+ matchedBracketBG = textArea.getMatchedBracketBGColor();
+ matchedBracketFG = textArea.getMatchedBracketBorderColor();
+ matchedBracketHighlightBoth = textArea.getPaintMatchedBracketPair();
+ matchedBracketAnimate = textArea.getAnimateBracketMatching();
+ hyperlinkFG = textArea.getHyperlinkForeground();
+
+ int count = textArea.getSecondaryLanguageCount();
+ secondaryLanguages = new Color[count];
+ for (int i=0; i<count; i++) {
+ secondaryLanguages[i]= textArea.getSecondaryLanguageBackground(i+1);
+ }
+
+ scheme = textArea.getSyntaxScheme();
+
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ bgColor = gutter.getBackground();
+ gutterBorderColor = gutter.getBorderColor();
+ lineNumberColor = gutter.getLineNumberColor();
+ lineNumberFont = gutter.getLineNumberFont().getFamily();
+ lineNumberFontSize = gutter.getLineNumberFont().getSize();
+ foldIndicatorFG = gutter.getFoldIndicatorForeground();
+ foldBG = gutter.getFoldBackground();
+ }
+
+ }
+
+
+ /**
+ * Applies this theme to a text area.
+ *
+ * @param textArea The text area to apply this theme to.
+ */
+ public void apply(RSyntaxTextArea textArea) {
+
+ textArea.setFont(baseFont);
+ textArea.setBackground(bgColor);
+ textArea.setCaretColor(caretColor);
+ textArea.setUseSelectedTextColor(useSelctionFG);
+ textArea.setSelectedTextColor(selectionFG);
+ textArea.setSelectionColor(selectionBG);
+ textArea.setRoundedSelectionEdges(selectionRoundedEdges);
+ textArea.setCurrentLineHighlightColor(currentLineHighlight);
+ textArea.setFadeCurrentLineHighlight(fadeCurrentLineHighlight);
+ textArea.setMarginLineColor(marginLineColor);
+ textArea.setMarkAllHighlightColor(markAllHighlightColor);
+ textArea.setMarkOccurrencesColor(markOccurrencesColor);
+ textArea.setPaintMarkOccurrencesBorder(markOccurrencesBorder);
+ textArea.setMatchedBracketBGColor(matchedBracketBG);
+ textArea.setMatchedBracketBorderColor(matchedBracketFG);
+ textArea.setPaintMatchedBracketPair(matchedBracketHighlightBoth);
+ textArea.setAnimateBracketMatching(matchedBracketAnimate);
+ textArea.setHyperlinkForeground(hyperlinkFG);
+
+ int count = secondaryLanguages.length;
+ for (int i=0; i<count; i++) {
+ textArea.setSecondaryLanguageBackground(i+1, secondaryLanguages[i]);
+ }
+
+ textArea.setSyntaxScheme(scheme);
+
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ gutter.setBackground(bgColor);
+ gutter.setBorderColor(gutterBorderColor);
+ gutter.setLineNumberColor(lineNumberColor);
+ String fontName = lineNumberFont!=null ? lineNumberFont :
+ baseFont.getFamily();
+ int fontSize = lineNumberFontSize>0 ? lineNumberFontSize :
+ baseFont.getSize();
+ Font font = getFont(fontName, Font.PLAIN, fontSize);
+ gutter.setLineNumberFont(font);
+ gutter.setFoldIndicatorForeground(foldIndicatorFG);
+ gutter.setFoldBackground(foldBG);
+ }
+
+ }
+
+
+ private static final String colorToString(Color c) {
+ int color = c.getRGB() & 0xffffff;
+ String str = Integer.toHexString(color);
+ while (str.length()<6) {
+ str = "0" + str;
+ }
+ return str;
+ }
+
+
+ /**
+ * Returns the default selection background color to use if "default" is
+ * specified in a theme.
+ *
+ * @return The default selection background to use.
+ * @see #getDefaultSelectionFG()
+ */
+ private static final Color getDefaultBG() {
+ Color c = UIManager.getColor("nimbusLightBackground");
+ if (c==null) {
+ // Don't search for "text", as Nimbus defines that as the text
+ // component "text" color, but Basic LAFs use it for text
+ // component backgrounds! Nimbus also defines TextArea.background
+ // as too dark, not what it actually uses for text area backgrounds
+ c = UIManager.getColor("TextArea.background");
+ if (c==null) {
+ c = new ColorUIResource(SystemColor.text);
+ }
+ }
+ return c;
+ }
+
+
+ /**
+ * Returns the default selection background color to use if "default" is
+ * specified in a theme.
+ *
+ * @return The default selection background to use.
+ * @see #getDefaultSelectionFG()
+ */
+ private static final Color getDefaultSelectionBG() {
+ Color c = UIManager.getColor("TextArea.selectionBackground");
+ if (c==null) {
+ c = UIManager.getColor("textHighlight");
+ if (c==null) {
+ c = UIManager.getColor("nimbusSelectionBackground");
+ if (c==null) {
+ c = new ColorUIResource(SystemColor.textHighlight);
+ }
+ }
+ }
+ return c;
+ }
+
+
+ /**
+ * Returns the default "selected text" color to use if "default" is
+ * specified in a theme.
+ *
+ * @return The default selection foreground color to use.
+ * @see #getDefaultSelectionBG()
+ */
+ private static Color getDefaultSelectionFG() {
+ Color c = UIManager.getColor("TextArea.selectionForeground");
+ if (c==null) {
+ c = UIManager.getColor("textHighlightText");
+ if (c==null) {
+ c = UIManager.getColor("nimbusSelectedText");
+ if (c==null) {
+ c = new ColorUIResource(SystemColor.textHighlightText);
+ }
+ }
+ }
+ return c;
+ }
+
+
+ /**
+ * Returns the specified font.
+ *
+ * @param family The font family.
+ * @param style The style of font.
+ * @param size The size of the font.
+ * @return The font.
+ */
+ private static Font getFont(String family, int style, int size) {
+ // Use StyleContext to get a composite font for Asian glyphs.
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+ return sc.getFont(family, style, size);
+ }
+
+
+ /**
+ * Loads a theme.
+ *
+ * @param in The input stream to read from. This will be closed when this
+ * method returns.
+ * @return The theme.
+ * @throws IOException If an IO error occurs.
+ * @see #save(OutputStream)
+ */
+ public static Theme load(InputStream in) throws IOException {
+ return load(in, null);
+ }
+
+
+ /**
+ * Loads a theme.
+ *
+ * @param in The input stream to read from. This will be closed when this
+ * method returns.
+ * @param baseFont The default font to use for any "base font" properties
+ * not specified in the theme XML. If this is <code>null</code>,
+ * a default monospaced font will be used.
+ * @return The theme.
+ * @throws IOException If an IO error occurs.
+ * @see #save(OutputStream)
+ */
+ public static Theme load(InputStream in, Font baseFont) throws IOException {
+
+ Theme theme = new Theme(baseFont);
+
+ BufferedInputStream bin = new BufferedInputStream(in);
+ try {
+ XmlHandler.load(theme, bin);
+ } finally {
+ bin.close();
+ }
+
+ return theme;
+
+ }
+
+
+ /**
+ * Saves this theme to an output stream.
+ *
+ * @param out The output stream to write to.
+ * @throws IOException If an IO error occurs.
+ * @see #load(InputStream)
+ */
+ public void save(OutputStream out) throws IOException {
+
+ BufferedOutputStream bout = new BufferedOutputStream(out);
+ try {
+
+ DocumentBuilder db = DocumentBuilderFactory.newInstance().
+ newDocumentBuilder();
+ DOMImplementation impl = db.getDOMImplementation();
+
+ Document doc = impl.createDocument(null, "RSyntaxTheme", null);
+ Element root = doc.getDocumentElement();
+ root.setAttribute("version", "1.0");
+
+ Element elem = doc.createElement("baseFont");
+ if (!baseFont.getFamily().equals(
+ RSyntaxTextArea.getDefaultFont().getFamily())) {
+ elem.setAttribute("family", baseFont.getFamily());
+ }
+ elem.setAttribute("size", Integer.toString(baseFont.getSize()));
+ root.appendChild(elem);
+
+ elem = doc.createElement("background");
+ elem.setAttribute("color", colorToString(bgColor));
+ root.appendChild(elem);
+
+ elem = doc.createElement("caret");
+ elem.setAttribute("color", colorToString(caretColor));
+ root.appendChild(elem);
+
+ elem = doc.createElement("selection");
+ elem.setAttribute("useFG", Boolean.toString(useSelctionFG));
+ elem.setAttribute("fg", colorToString(selectionFG));
+ elem.setAttribute("bg", colorToString(selectionBG));
+ elem.setAttribute("roundedEdges", Boolean.toString(selectionRoundedEdges));
+ root.appendChild(elem);
+
+ elem = doc.createElement("currentLineHighlight");
+ elem.setAttribute("color", colorToString(currentLineHighlight));
+ elem.setAttribute("fade", Boolean.toString(fadeCurrentLineHighlight));
+ root.appendChild(elem);
+
+ elem = doc.createElement("marginLine");
+ elem.setAttribute("fg", colorToString(marginLineColor));
+ root.appendChild(elem);
+
+ elem = doc.createElement("markAllHighlight");
+ elem.setAttribute("color", colorToString(markAllHighlightColor));
+ root.appendChild(elem);
+
+ elem = doc.createElement("markOccurrencesHighlight");
+ elem.setAttribute("color", colorToString(markOccurrencesColor));
+ elem.setAttribute("border", Boolean.toString(markOccurrencesBorder));
+ root.appendChild(elem);
+
+ elem = doc.createElement("matchedBracket");
+ elem.setAttribute("fg", colorToString(matchedBracketFG));
+ elem.setAttribute("bg", colorToString(matchedBracketBG));
+ elem.setAttribute("highlightBoth", Boolean.toString(matchedBracketHighlightBoth));
+ elem.setAttribute("animate", Boolean.toString(matchedBracketAnimate));
+ root.appendChild(elem);
+
+ elem = doc.createElement("hyperlinks");
+ elem.setAttribute("fg", colorToString(hyperlinkFG));
+ root.appendChild(elem);
+
+ elem = doc.createElement("secondaryLanguages");
+ for (int i=0; i<secondaryLanguages.length; i++) {
+ Color color = secondaryLanguages[i];
+ Element elem2 = doc.createElement("language");
+ elem2.setAttribute("index", Integer.toString(i+1));
+ elem2.setAttribute("bg", color==null ? "":colorToString(color));
+ }
+
+ elem = doc.createElement("gutterBorder");
+ elem.setAttribute("color", colorToString(gutterBorderColor));
+ root.appendChild(elem);
+
+ elem = doc.createElement("lineNumbers");
+ elem.setAttribute("fg", colorToString(lineNumberColor));
+ if (lineNumberFont!=null) {
+ elem.setAttribute("lineNumberFont", lineNumberFont);
+ }
+ if (lineNumberFontSize>0) {
+ elem.setAttribute("lineNumberFontSize",
+ Integer.toString(lineNumberFontSize));
+ }
+ root.appendChild(elem);
+
+ elem = doc.createElement("foldIndicator");
+ elem.setAttribute("fg", colorToString(foldIndicatorFG));
+ elem.setAttribute("iconBg", colorToString(foldBG));
+ root.appendChild(elem);
+
+ elem = doc.createElement("tokenStyles");
+ Field[] fields = TokenTypes.class.getFields();
+ for (int i=0; i<fields.length; i++) {
+ Field field = fields[i];
+ int value = field.getInt(null);
+ if (value!=TokenTypes.NUM_TOKEN_TYPES) {
+ Style style = scheme.getStyle(value);
+ if (style!=null) {
+ Element elem2 = doc.createElement("style");
+ elem2.setAttribute("token", field.getName());
+ Color fg = style.foreground;
+ if (fg!=null) {
+ elem2.setAttribute("fg", colorToString(fg));
+ }
+ Color bg = style.background;
+ if (bg!=null) {
+ elem2.setAttribute("bg", colorToString(bg));
+ }
+ Font font = style.font;
+ if (font!=null) {
+ if (!font.getFamily().equals(
+ baseFont.getFamily())) {
+ elem2.setAttribute("fontFamily", font.getFamily());
+ }
+ if (font.getSize()!=baseFont.getSize()) {
+ elem2.setAttribute("fontSize", Integer.toString(font.getSize()));
+ }
+ if (font.isBold()) {
+ elem2.setAttribute("bold", "true");
+ }
+ if (font.isItalic()) {
+ elem2.setAttribute("italic", "true");
+ }
+ }
+ if (style.underline) {
+ elem2.setAttribute("underline", "true");
+ }
+ elem.appendChild(elem2);
+ }
+ }
+ }
+ root.appendChild(elem);
+
+ DOMSource source = new DOMSource(doc);
+ // Use a writer instead of OutputStream to allow pretty printing.
+ // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337981
+ StreamResult result = new StreamResult(new PrintWriter(
+ new UnicodeWriter(bout, "UTF-8")));
+ TransformerFactory transFac = TransformerFactory.newInstance();
+ Transformer transformer = transFac.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+ transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "theme.dtd");
+ transformer.transform(source, result);
+
+ } catch (RuntimeException re) {
+ throw re; // FindBugs
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new IOException("Error generating XML: " + e.getMessage());
+ // When Java 6 is minimum required version
+ //throw new IOException("Error generating XML: " + e.getMessage(), e);
+ } finally {
+ bout.close();
+ }
+
+ }
+
+
+ /**
+ * Returns the color represented by a string. The input is expected to
+ * be a 6-digit hex string, optionally prefixed by a '$'. For example,
+ * either of the following:
+ * <pre>
+ * "$00ff00"
+ * "00ff00"
+ * </pre>
+ * will return <code>new Color(0, 255, 0)</code>.
+ *
+ * @param s The string to evaluate.
+ * @return The color.
+ */
+ private static final Color stringToColor(String s) {
+ return stringToColor(s, null);
+ }
+
+
+ /**
+ * Returns the color represented by a string. The input is expected to
+ * be a 6-digit hex string, optionally prefixed by a '$'. For example,
+ * either of the following:
+ * <pre>
+ * "$00ff00"
+ * "00ff00"
+ * </pre>
+ * will return <code>new Color(0, 255, 0)</code>.
+ *
+ * @param s The string to evaluate.
+ * @param defaultVal The color to use if <code>s</code> is
+ * "<code>default</code>".
+ * @return The color.
+ */
+ private static final Color stringToColor(String s, Color defaultVal) {
+ if (s==null || "default".equalsIgnoreCase(s)) {
+ return defaultVal;
+ }
+ if (s.length()==6 || s.length()==7) {
+ if (s.charAt(0)=='$') {
+ s = s.substring(1);
+ }
+ return new Color(Integer.parseInt(s, 16));
+ }
+ return null;
+ }
+
+
+ /**
+ * Loads a <code>SyntaxScheme</code> from an XML file.
+ */
+ private static class XmlHandler extends DefaultHandler {
+
+ private Theme theme;
+
+ public void error(SAXParseException e) throws SAXException {
+ throw e;
+ }
+
+ public void fatalError(SAXParseException e) throws SAXException {
+ throw e;
+ }
+
+ public static void load(Theme theme, InputStream in) throws IOException {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setValidating(true);
+ try {
+ SAXParser parser = spf.newSAXParser();
+ XMLReader reader = parser.getXMLReader();
+ XmlHandler handler = new XmlHandler();
+ handler.theme = theme;
+ reader.setEntityResolver(handler);
+ reader.setContentHandler(handler);
+ reader.setDTDHandler(handler);
+ reader.setErrorHandler(handler);
+ InputSource is = new InputSource(in);
+ is.setEncoding("UTF-8");
+ reader.parse(is);
+ } catch (/*SAX|ParserConfiguration*/Exception se) {
+ se.printStackTrace();
+ throw new IOException(se.toString());
+ }
+ }
+
+ private static final int parseInt(Attributes attrs, String attr,
+ int def) {
+ int value = def;
+ String temp = attrs.getValue(attr);
+ if (temp != null) {
+ try {
+ value = Integer.parseInt(temp);
+ } catch (NumberFormatException nfe) {
+ nfe.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ public InputSource resolveEntity(String publicID,
+ String systemID) throws SAXException {
+ return new InputSource(getClass().
+ getResourceAsStream("/theme.dtd"));
+ }
+
+ public void startElement(String uri, String localName, String qName,
+ Attributes attrs) {
+
+ if ("background".equals(qName)) {
+
+ String color = attrs.getValue("color");
+ if (color!=null) {
+ theme.bgColor = stringToColor(color, getDefaultBG());
+ }
+ else {
+ String img = attrs.getValue("image");
+ if (img!=null) {
+ throw new IllegalArgumentException("Not yet implemented");
+ }
+ }
+ }
+
+ // The base font to use in the editor.
+ else if ("baseFont".equals(qName)) {
+ int size = theme.baseFont.getSize();
+ String sizeStr = attrs.getValue("size");
+ if (sizeStr!=null) {
+ size = Integer.parseInt(sizeStr);
+ }
+ String family = attrs.getValue("family");
+ if (family!=null) {
+ theme.baseFont = getFont(family, Font.PLAIN, size);
+ }
+ else if (sizeStr!=null) {
+ // No family specified, keep original family
+ theme.baseFont = theme.baseFont.deriveFont(size*1f);
+ }
+ }
+
+ else if ("caret".equals(qName)) {
+ String color = attrs.getValue("color");
+ theme.caretColor = stringToColor(color);
+ }
+
+ else if ("currentLineHighlight".equals(qName)) {
+ String color = attrs.getValue("color");
+ theme.currentLineHighlight = stringToColor(color);
+ String fadeStr = attrs.getValue("fade");
+ boolean fade = Boolean.valueOf(fadeStr).booleanValue();
+ theme.fadeCurrentLineHighlight = fade;
+ }
+
+ else if ("foldIndicator".equals(qName)) {
+ String color = attrs.getValue("fg");
+ theme.foldIndicatorFG = stringToColor(color);
+ color = attrs.getValue("iconBg");
+ theme.foldBG = stringToColor(color);
+ }
+
+ else if ("gutterBorder".equals(qName)) {
+ String color = attrs.getValue("color");
+ theme.gutterBorderColor = stringToColor(color);
+ }
+
+ else if ("lineNumbers".equals(qName)) {
+ String color = attrs.getValue("fg");
+ theme.lineNumberColor = stringToColor(color);
+ theme.lineNumberFont = attrs.getValue("fontFamily");
+ theme.lineNumberFontSize = parseInt(attrs, "fontSize", -1);
+ }
+
+ else if ("marginLine".equals(qName)) {
+ String color = attrs.getValue("fg");
+ theme.marginLineColor = stringToColor(color);
+ }
+
+ else if ("markAllHighlight".equals(qName)) {
+ String color = attrs.getValue("color");
+ theme.markAllHighlightColor = stringToColor(color);
+ }
+
+ else if ("markOccurrencesHighlight".equals(qName)) {
+ String color = attrs.getValue("color");
+ theme.markOccurrencesColor = stringToColor(color);
+ String border = attrs.getValue("border");
+ theme.markOccurrencesBorder = Boolean.valueOf(border).booleanValue();
+ }
+
+ else if ("matchedBracket".equals(qName)) {
+ String fg = attrs.getValue("fg");
+ theme.matchedBracketFG = stringToColor(fg);
+ String bg = attrs.getValue("bg");
+ theme.matchedBracketBG = stringToColor(bg);
+ String highlightBoth = attrs.getValue("highlightBoth");
+ theme.matchedBracketHighlightBoth = Boolean.valueOf(highlightBoth).booleanValue();
+ String animate = attrs.getValue("animate");
+ theme.matchedBracketAnimate = Boolean.valueOf(animate).booleanValue();
+ }
+
+ else if ("hyperlinks".equals(qName)) {
+ String fg = attrs.getValue("fg");
+ theme.hyperlinkFG = stringToColor(fg);
+ }
+
+ else if ("language".equals(qName)) {
+ String indexStr = attrs.getValue("index");
+ int index = Integer.parseInt(indexStr) - 1;
+ if (theme.secondaryLanguages.length>index) { // Sanity
+ Color bg = stringToColor(attrs.getValue("bg"));
+ theme.secondaryLanguages[index] = bg;
+ }
+ }
+
+ else if ("selection".equals(qName)) {
+ String useStr = attrs.getValue("useFG");
+ theme.useSelctionFG = Boolean.valueOf(useStr).booleanValue();
+ String color = attrs.getValue("fg");
+ theme.selectionFG = stringToColor(color,
+ getDefaultSelectionFG());
+ //System.out.println(theme.selectionFG);
+ color = attrs.getValue("bg");
+ theme.selectionBG = stringToColor(color,
+ getDefaultSelectionBG());
+ String roundedStr = attrs.getValue("roundedEdges");
+ theme.selectionRoundedEdges = Boolean.valueOf(roundedStr).
+ booleanValue();
+ }
+
+ // Start of the syntax scheme definition
+ else if ("tokenStyles".equals(qName)) {
+ theme.scheme = new SyntaxScheme(theme.baseFont, false);
+ }
+
+ // A style in the syntax scheme
+ else if ("style".equals(qName)) {
+
+ String type = attrs.getValue("token");
+ Field field = null;
+ try {
+ field = Token.class.getField(type);
+ } catch (RuntimeException re) {
+ throw re; // FindBugs
+ } catch (Exception e) {
+ System.err.println("Invalid token type: " + type);
+ return;
+ }
+
+ if (field.getType()==int.class) {
+
+ int index = 0;
+ try {
+ index = field.getInt(theme.scheme);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ return;
+ }
+
+ String fgStr = attrs.getValue("fg");
+ Color fg = stringToColor(fgStr);
+ theme.scheme.getStyle(index).foreground = fg;
+
+ String bgStr = attrs.getValue("bg");
+ Color bg = stringToColor(bgStr);
+ theme.scheme.getStyle(index).background = bg;
+
+ Font font = theme.baseFont;
+ String familyName = attrs.getValue("fontFamily");
+ if (familyName!=null) {
+ font = getFont(familyName, font.getStyle(),
+ font.getSize());
+ }
+ String sizeStr = attrs.getValue("fontSize");
+ if (sizeStr!=null) {
+ try {
+ float size = Float.parseFloat(sizeStr);
+ size = Math.max(size, 1f);
+ font = font.deriveFont(size);
+ } catch (NumberFormatException nfe) {
+ nfe.printStackTrace();
+ }
+ }
+ theme.scheme.getStyle(index).font = font;
+
+ boolean styleSpecified = false;
+ boolean bold = false;
+ boolean italic = false;
+ String boldStr = attrs.getValue("bold");
+ if (boldStr!=null) {
+ bold = Boolean.valueOf(boldStr).booleanValue();
+ styleSpecified = true;
+ }
+ String italicStr = attrs.getValue("italic");
+ if (italicStr!=null) {
+ italic = Boolean.valueOf(italicStr).booleanValue();
+ styleSpecified = true;
+ }
+ if (styleSpecified) {
+ int style = 0;
+ if (bold) { style |= Font.BOLD; }
+ if (italic) { style |= Font.ITALIC; }
+ Font orig = theme.scheme.getStyle(index).font;
+ theme.scheme.getStyle(index).font =
+ orig.deriveFont(style);
+ }
+
+ String ulineStr = attrs.getValue("underline");
+ if (ulineStr!=null) {
+ boolean uline= Boolean.valueOf(ulineStr).booleanValue();
+ theme.scheme.getStyle(index).underline = uline;
+ }
+
+ }
+
+ }
+
+ }
+
+ public void warning(SAXParseException e) throws SAXException {
+ throw e;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/Token.java b/src/org/fife/ui/rsyntaxtextarea/Token.java
new file mode 100644
index 0000000..9f026a5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/Token.java
@@ -0,0 +1,1090 @@
+/*
+ * 02/21/2004
+ *
+ * Token.java - A token used in syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Rectangle;
+import javax.swing.text.Segment;
+import javax.swing.text.TabExpander;
+import javax.swing.text.Utilities;
+
+
+/**
+ * A generic token that functions as a node in a linked list of syntax
+ * highlighted tokens for some language.<p>
+ *
+ * A <code>Token</code> is a piece of text representing some logical token in
+ * source code for a programming language. For example, the line of C code:<p>
+ * <pre>
+ * int i = 0;
+ * </pre>
+ * would be broken into 8 <code>Token</code>s: the first representing
+ * <code>int</code>, the second whitespace, the third <code>i</code>, the fourth
+ * whitespace, the fifth <code>=</code>, etc.<p>
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+public class Token implements TokenTypes {
+
+ /**
+ * The text this token represents. This is implemented as a segment so we
+ * can point directly to the text in the document without having to make a
+ * copy of it.
+ */
+ public char[] text;
+ public int textOffset;
+ public int textCount;
+
+ /**
+ * The offset into the document at which this token resides.
+ */
+ public int offset;
+
+ /**
+ * The type of token this is; for example, {@link #FUNCTION}.
+ */
+ public int type;
+
+ /**
+ * Whether this token is a hyperlink.
+ */
+ private boolean hyperlink;
+
+ /**
+ * The next token in this linked list.
+ */
+ private Token nextToken;
+
+ /**
+ * The language this token is in, <code>>= 0</code>.
+ */
+ private int languageIndex;
+
+
+ /**
+ * Creates a "null token." The token itself is not null; rather, it
+ * signifies that it is the last token in a linked list of tokens and
+ * that it is not part of a "multi-line token."
+ */
+ public Token() {
+ this.text = null;
+ this.textOffset = -1;
+ this.textCount = -1;
+ this.type = NULL;
+ offset = -1;
+ hyperlink = false;
+ nextToken = null;
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param line The segment from which to get the token.
+ * @param beg The first character's position in <code>line</code>.
+ * @param end The last character's position in <code>line</code>.
+ * @param startOffset The offset into the document at which this
+ * token begins.
+ * @param type A token type listed as "generic" above.
+ */
+ public Token(Segment line, int beg, int end, int startOffset, int type) {
+ this(line.array, beg,end, startOffset, type);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param line The segment from which to get the token.
+ * @param beg The first character's position in <code>line</code>.
+ * @param end The last character's position in <code>line</code>.
+ * @param startOffset The offset into the document at which this
+ * token begins.
+ * @param type A token type listed as "generic" above.
+ */
+ public Token(char[] line, int beg, int end, int startOffset, int type) {
+ this();
+ set(line, beg,end, startOffset, type);
+ }
+
+
+ /**
+ * Creates this token as a copy of the passed-in token.
+ *
+ * @param t2 The token from which to make a copy.
+ */
+ public Token(Token t2) {
+ this();
+ copyFrom(t2);
+ }
+
+
+ /**
+ * Appends HTML code for painting this token, using the given text area's
+ * color scheme.
+ *
+ * @param sb The buffer to append to.
+ * @param textArea The text area whose color scheme to use.
+ * @param fontFamily Whether to include the font family in the HTML for
+ * this token. You can pass <code>false</code> for this parameter
+ * if, for example, you are making all your HTML be monospaced,
+ * and don't want any crazy fonts being used in the editor to be
+ * reflected in your HTML.
+ * @return The buffer appended to.
+ * @see #getHTMLRepresentation(RSyntaxTextArea)
+ */
+ public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+ RSyntaxTextArea textArea,
+ boolean fontFamily) {
+ return appendHTMLRepresentation(sb, textArea, fontFamily, false);
+ }
+
+
+ /**
+ * Appends HTML code for painting this token, using the given text area's
+ * color scheme.
+ *
+ * @param sb The buffer to append to.
+ * @param textArea The text area whose color scheme to use.
+ * @param fontFamily Whether to include the font family in the HTML for
+ * this token. You can pass <code>false</code> for this parameter
+ * if, for example, you are making all your HTML be monospaced,
+ * and don't want any crazy fonts being used in the editor to be
+ * reflected in your HTML.
+ * @param tabsToSpaces Whether to convert tabs into spaces.
+ * @return The buffer appended to.
+ * @see #getHTMLRepresentation(RSyntaxTextArea)
+ */
+ public StringBuffer appendHTMLRepresentation(StringBuffer sb,
+ RSyntaxTextArea textArea, boolean fontFamily,
+ boolean tabsToSpaces) {
+
+ SyntaxScheme colorScheme = textArea.getSyntaxScheme();
+ Style scheme = colorScheme.getStyle(type);
+ Font font = textArea.getFontForTokenType(type);//scheme.font;
+
+ if (font.isBold()) sb.append("<b>");
+ if (font.isItalic()) sb.append("<em>");
+ if (scheme.underline || isHyperlink()) sb.append("<u>");
+
+ sb.append("<font");
+ if (fontFamily) {
+ sb.append(" face=\"").append(font.getFamily()).append("\"");
+ }
+ sb.append(" color=\"").
+ append(getHTMLFormatForColor(scheme.foreground)).
+ append("\">");
+
+ // NOTE: Don't use getLexeme().trim() because whitespace tokens will
+ // be turned into NOTHING.
+ appendHtmlLexeme(textArea, sb, tabsToSpaces);
+
+ sb.append("</font>");
+ if (scheme.underline || isHyperlink()) sb.append("</u>");
+ if (font.isItalic()) sb.append("</em>");
+ if (font.isBold()) sb.append("</b>");
+
+ return sb;
+
+ }
+
+
+ /**
+ * Appends an HTML version of the lexeme of this token (i.e. no style
+ * HTML, but replacing chars such as <code>\t</code>, <code><</code>
+ * and <code>></code> with their escapes).
+ *
+ * @param textArea The text area.
+ * @param sb The buffer to append to.
+ * @param tabsToSpaces Whether to convert tabs into spaces.
+ * @return The same buffer.
+ */
+ private final StringBuffer appendHtmlLexeme(RSyntaxTextArea textArea,
+ StringBuffer sb, boolean tabsToSpaces) {
+
+ boolean lastWasSpace = false;
+ int i = textOffset;
+ int lastI = i;
+ String tabStr = null;
+
+ while (i<textOffset+textCount) {
+ char ch = text[i];
+ switch (ch) {
+ case ' ':
+ sb.append(text, lastI, i-lastI);
+ lastI = i+1;
+ sb.append(lastWasSpace ? " " : " ");
+ lastWasSpace = true;
+ break;
+ case '\t':
+ sb.append(text, lastI, i-lastI);
+ lastI = i+1;
+ if (tabsToSpaces && tabStr==null) {
+ tabStr = "";
+ for (int j=0; j<textArea.getTabSize(); j++) {
+ tabStr += " ";
+ }
+ }
+ sb.append(tabsToSpaces ? tabStr : " ");
+ lastWasSpace = false;
+ break;
+ case '<':
+ sb.append(text, lastI, i-lastI);
+ lastI = i+1;
+ sb.append("<");
+ lastWasSpace = false;
+ break;
+ case '>':
+ sb.append(text, lastI, i-lastI);
+ lastI = i+1;
+ sb.append(">");
+ lastWasSpace = false;
+ break;
+ default:
+ lastWasSpace = false;
+ break;
+ }
+ i++;
+ }
+ if (lastI<textOffset+textCount) {
+ sb.append(text, lastI, textOffset+textCount-lastI);
+ }
+ return sb;
+ }
+
+
+ /**
+ * Returns whether the token straddles the specified position in the
+ * document.
+ *
+ * @param pos The position in the document to check.
+ * @return Whether the specified position is straddled by this token.
+ */
+ public boolean containsPosition(int pos) {
+ return pos>=offset && pos<offset+textCount;
+ }
+
+
+ /**
+ * Makes one token point to the same text segment, and have the same value
+ * as another token.
+ *
+ * @param t2 The token from which to copy.
+ */
+ public void copyFrom(Token t2) {
+ text = t2.text;
+ textOffset = t2.textOffset;
+ textCount = t2.textCount;
+ offset = t2.offset;
+ type = t2.type;
+ hyperlink = t2.hyperlink;
+ languageIndex = t2.languageIndex;
+ nextToken = t2.nextToken;
+ }
+
+
+ /**
+ * Returns the position in the token's internal char array corresponding
+ * to the specified document position.<p>
+ * Note that this method does NOT do any bounds checking; you can pass in
+ * a document position that does not correspond to a position in this
+ * token, and you will not receive an Exception or any other notification;
+ * it is up to the caller to ensure valid input.
+ *
+ * @param pos A position in the document that is represented by this token.
+ * @return The corresponding token position >= <code>textOffset</code> and
+ * < <code>textOffset+textCount</code>.
+ * @see #tokenToDocument
+ */
+ public int documentToToken(int pos) {
+ return pos + (textOffset-offset);
+ }
+
+
+ /**
+ * Returns whether this token's lexeme ends with the specified characters.
+ *
+ * @param ch The characters.
+ * @return Whether this token's lexeme ends with the specified characters.
+ * @see #startsWith(char[])
+ */
+ public boolean endsWith(char[] ch) {
+ if (ch==null || ch.length>textCount) {
+ return false;
+ }
+ final int start = textOffset + textCount - ch.length;
+ for (int i=0; i<ch.length; i++) {
+ if (text[start+i]!=ch[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ /**
+ * Returns a <code>String</code> of the form "#xxxxxx" good for use
+ * in HTML, representing the given color.
+ *
+ * @param color The color to get a string for.
+ * @return The HTML form of the color. If <code>color</code> is
+ * <code>null</code>, <code>#000000</code> is returned.
+ */
+ private static final String getHTMLFormatForColor(Color color) {
+ if (color==null) {
+ return "black";
+ }
+ String hexRed = Integer.toHexString(color.getRed());
+ if (hexRed.length()==1)
+ hexRed = "0" + hexRed;
+ String hexGreen = Integer.toHexString(color.getGreen());
+ if (hexGreen.length()==1)
+ hexGreen = "0" + hexGreen;
+ String hexBlue = Integer.toHexString(color.getBlue());
+ if (hexBlue.length()==1)
+ hexBlue = "0" + hexBlue;
+ return "#" + hexRed + hexGreen + hexBlue;
+ }
+
+
+ /**
+ * Returns a <code>String</code> containing HTML code for painting this
+ * token, using the given text area's color scheme.
+ *
+ * @param textArea The text area whose color scheme to use.
+ * @return The HTML representation of the token.
+ * @see #appendHTMLRepresentation(StringBuffer, RSyntaxTextArea, boolean)
+ */
+ public String getHTMLRepresentation(RSyntaxTextArea textArea) {
+ StringBuffer buf = new StringBuffer();
+ appendHTMLRepresentation(buf, textArea, true);
+ return buf.toString();
+ }
+
+
+ /**
+ * Returns the language index of this token.
+ *
+ * @return The language index. A value of <code>0</code> denotes the
+ * "main" language, any positive value denotes a specific secondary
+ * language.
+ * @see #setLanguageIndex(int)
+ */
+ public int getLanguageIndex() {
+ return languageIndex;
+ }
+
+
+ /**
+ * Returns the last token in this list that is not whitespace or a
+ * comment.
+ *
+ * @return The last non-comment, non-whitespace token, or <code>null</code>
+ * if there isn't one.
+ */
+ public Token getLastNonCommentNonWhitespaceToken() {
+
+ Token last = null;
+
+ for (Token t=this; t!=null && t.isPaintable(); t=t.nextToken) {
+ switch (t.type) {
+ case COMMENT_DOCUMENTATION:
+ case COMMENT_EOL:
+ case COMMENT_MULTILINE:
+ case COMMENT_KEYWORD:
+ case COMMENT_MARKUP:
+ case WHITESPACE:
+ break;
+ default:
+ last = t;
+ break;
+ }
+ }
+
+ return last;
+
+ }
+
+
+ /**
+ * Returns the last paintable token in this token list, or <code>null</code>
+ * if there is no paintable token.
+ *
+ * @return The last paintable token in this token list.
+ */
+ public Token getLastPaintableToken() {
+ Token t = this;
+ while (t.isPaintable()) {
+ if (t.nextToken==null || !t.nextToken.isPaintable()) {
+ return t;
+ }
+ t = t.nextToken;
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns the text of this token, as a string.<p>
+ *
+ * Note that this method isn't used much by the
+ * <code>ryntaxtextarea</code> package internally, as it tries to limit
+ * memory allocation.
+ *
+ * @return The text of this token.
+ */
+ public String getLexeme() {
+ return new String(text, textOffset, textCount);
+ }
+
+
+ /**
+ * Determines the offset into this token list (i.e., into the
+ * document) that covers pixel location <code>x</code> if the token list
+ * starts at pixel location <code>x0</code><p>.
+ * This method will return the document position "closest" to the
+ * x-coordinate (i.e., if they click on the "right-half" of the
+ * <code>w</code> in <code>awe</code>, the caret will be placed in
+ * between the <code>w</code> and <code>e</code>; similarly, clicking on
+ * the left-half places the caret between the <code>a</code> and
+ * <code>w</code>). This makes it useful for methods such as
+ * <code>viewToModel</code> found in <code>javax.swing.text.View</code>
+ * subclasses.
+ *
+ * @param textArea The text area from which the token list was derived.
+ * @param e How to expand tabs.
+ * @param x0 The pixel x-location that is the beginning of
+ * <code>tokenList</code>.
+ * @param x The pixel-position for which you want to get the corresponding
+ * offset.
+ * @return The position (in the document, NOT into the token list!) that
+ * covers the pixel location. If <code>tokenList</code> is
+ * <code>null</code> or has type <code>Token.NULL</code>, then
+ * <code>-1</code is returned; the caller should recognize this and
+ * return the actual end position of the (empty) line.
+ */
+ public int getListOffset(RSyntaxTextArea textArea, TabExpander e,
+ float x0, float x) {
+
+ // If the coordinate in question is before this line's start, quit.
+ if (x0 >= x)
+ return offset;
+
+ float currX = x0; // x-coordinate of current char.
+ float nextX = x0; // x-coordinate of next char.
+ float stableX = x0; // Cached ending x-coord. of last tab or token.
+ Token token = this;
+ int last = offset;
+ FontMetrics fm = null;
+
+ while (token != null && token.isPaintable()) {
+
+ fm = textArea.getFontMetricsForTokenType(token.type);
+ char[] text = token.text;
+ int start = token.textOffset;
+ int end = start + token.textCount;
+
+ for (int i = start; i < end; i++) {
+ currX = nextX;
+ if (text[i] == '\t') {
+ nextX = e.nextTabStop(nextX, 0);
+ stableX = nextX; // Cache ending x-coord. of tab.
+ start = i + 1; // Do charsWidth() from next char.
+ }
+ else {
+ nextX = stableX + fm.charsWidth(text, start, i - start + 1);
+ }
+ if (x >= currX && x < nextX) {
+ if ((x - currX) < (nextX - x)) {
+ return last + i - token.textOffset;
+ }
+ return last + i + 1 - token.textOffset;
+ }
+ }
+
+ stableX = nextX; // Cache ending x-coordinate of token.
+ last += token.textCount;
+ token = token.getNextToken();
+
+ }
+
+ // If we didn't find anything, return the end position of the text.
+ return last;
+
+ }
+
+
+ /**
+ * Returns the token after this one in the linked list.
+ *
+ * @return The next token.
+ * @see #setNextToken
+ */
+ public Token getNextToken() {
+ return nextToken;
+ }
+
+
+ /**
+ * Returns the position in the document that represents the last character
+ * in the token that will fit into <code>endBeforeX-startX</code> pixels.
+ * For example, if you're using a monospaced 8-pixel-per-character font,
+ * have the token "while" and <code>startX</code> is <code>0</code> and
+ * <code>endBeforeX</code> is <code>30</code>, this method will return the
+ * document position of the "i" in "while", because the "i" ends at pixel
+ * <code>24</code>, while the "l" ends at <code>32</code>. If not even the
+ * first character fits in <code>endBeforeX-startX</code>, the first
+ * character's position is still returned so calling methods don't go into
+ * infinite loops.
+ *
+ * @param textArea The text area in which this token is being painted.
+ * @param e How to expand tabs.
+ * @param startX The x-coordinate at which the token will be painted. This
+ * is needed because of tabs.
+ * @param endBeforeX The x-coordinate for which you want to find the last
+ * character of <code>t</code> which comes before it.
+ * @return The last document position that will fit in the specified amount
+ * of pixels.
+ */
+ /*
+ * @see #getTokenListOffsetBeforeX
+ * FIXME: This method does not compute correctly! It needs to be abstract
+ * and implemented by subclasses.
+ */
+ public int getOffsetBeforeX(RSyntaxTextArea textArea, TabExpander e,
+ float startX, float endBeforeX) {
+
+ FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+ int i = textOffset;
+ int stop = i + textCount;
+ float x = startX;
+
+ while (i<stop) {
+ if (text[i]=='\t')
+ x = e.nextTabStop(x, 0);
+ else
+ x += fm.charWidth(text[i]);
+ if (x>endBeforeX) {
+ // If not even the first character fits into the space, go
+ // ahead and say the first char does fit so we don't go into
+ // an infinite loop.
+ int intoToken = Math.max(i-textOffset, 1);
+ return offset + intoToken;
+ }
+ i++;
+ }
+
+ // If we got here, the whole token fit in (endBeforeX-startX) pixels.
+ return offset + textCount - 1;
+
+ }
+
+
+ /**
+ * Returns the width of this token given the specified parameters.
+ *
+ * @param textArea The text area in which the token is being painted.
+ * @param e Describes how to expand tabs. This parameter cannot be
+ * <code>null</code>.
+ * @param x0 The pixel-location at which the token begins. This is needed
+ * because of tabs.
+ * @return The width of the token, in pixels.
+ * @see #getWidthUpTo
+ */
+ public float getWidth(RSyntaxTextArea textArea, TabExpander e, float x0) {
+ return getWidthUpTo(textCount, textArea, e, x0);
+ }
+
+
+ /**
+ * Returns the width of a specified number of characters in this token.
+ * For example, for the token "while", specifying a value of <code>3</code>
+ * here returns the width of the "whi" portion of the token.
+ *
+ * @param numChars The number of characters for which to get the width.
+ * @param textArea The text area in which the token is being painted.
+ * @param e How to expand tabs. This value cannot be <code>null</code>.
+ * @param x0 The pixel-location at which this token begins. This is needed
+ * because of tabs.
+ * @return The width of the specified number of characters in this token.
+ * @see #getWidth
+ */
+ public float getWidthUpTo(int numChars, RSyntaxTextArea textArea,
+ TabExpander e, float x0) {
+ float width = x0;
+ FontMetrics fm = textArea.getFontMetricsForTokenType(type);
+ if (fm != null) {
+ int w;
+ int currentStart = textOffset;
+ int endBefore = textOffset + numChars;
+ for (int i = currentStart; i < endBefore; i++) {
+ if (text[i] == '\t') {
+ // Since TokenMaker implementations usually group all
+ // adjacent whitespace into a single token, there
+ // aren't usually any characters to compute a width
+ // for here, so we check before calling.
+ w = i - currentStart;
+ if (w > 0)
+ width += fm.charsWidth(text, currentStart, w);
+ currentStart = i + 1;
+ width = e.nextTabStop(width, 0);
+ }
+ }
+ // Most (non-whitespace) tokens will have characters at this
+ // point to get the widths for, so we don't check for w>0 (mini-
+ // optimization).
+ w = endBefore - currentStart;
+ width += fm.charsWidth(text, currentStart, w);
+ }
+ return width - x0;
+ }
+
+
+ /**
+ * Returns whether this token's lexeme matches a specific character array.
+ *
+ * @param lexeme The lexeme to check for.
+ * @return Whether this token has that lexeme.
+ * @see #is(int, char[])
+ * @see #is(int, String)
+ * @see #isSingleChar(int, char)
+ * @see #startsWith(char[])
+ */
+ public boolean is(char[] lexeme) {
+ if (textCount==lexeme.length) {
+ for (int i=0; i<textCount; i++) {
+ if (text[textOffset+i]!=lexeme[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether this token is of the specified type, with the specified
+ * lexeme.<p>
+ * This method is preferred over the other overload in performance-critical
+ * code where this operation may be called frequently, since it does not
+ * involve any String allocations.
+ *
+ * @param type The type to check for.
+ * @param lexeme The lexeme to check for.
+ * @return Whether this token has that type and lexeme.
+ * @see #is(int, String)
+ * @see #is(char[])
+ * @see #isSingleChar(int, char)
+ * @see #startsWith(char[])
+ */
+ public boolean is(int type, char[] lexeme) {
+ if (this.type==type && textCount==lexeme.length) {
+ for (int i=0; i<textCount; i++) {
+ if (text[textOffset+i]!=lexeme[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether this token is of the specified type, with the specified
+ * lexeme.<p>
+ * The other overload of this method is preferred over this one in
+ * performance-critical code, as this one involves a String allocation
+ * while the other does not.
+ *
+ * @param type The type to check for.
+ * @param lexeme The lexeme to check for.
+ * @return Whether this token has that type and lexeme.
+ * @see #is(int, char[])
+ * @see #isSingleChar(int, char)
+ * @see #startsWith(char[])
+ */
+ public boolean is(int type, String lexeme) {
+ return this.type==type && textCount==lexeme.length() &&
+ lexeme.equals(getLexeme());
+ }
+
+
+ /**
+ * Returns whether this token is a comment.
+ *
+ * @return Whether this token is a comment.
+ * @see #isWhitespace()
+ * @see #isCommentOrWhitespace()
+ */
+ public boolean isComment() {
+ return type>=Token.COMMENT_EOL && type<=Token.COMMENT_MARKUP;
+ }
+
+
+ /**
+ * Returns whether this token is a comment or whitespace.
+ *
+ * @return Whether this token is a comment or whitespace.
+ * @see #isComment()
+ * @see #isWhitespace()
+ */
+ public boolean isCommentOrWhitespace() {
+ return isComment() || isWhitespace();
+ }
+
+
+ /**
+ * Returns whether this token is a hyperlink.
+ *
+ * @return Whether this token is a hyperlink.
+ * @see #setHyperlink(boolean)
+ */
+ public boolean isHyperlink() {
+ return hyperlink;
+ }
+
+
+ /**
+ * Returns whether this token is an identifier.
+ *
+ * @return Whether this token is an identifier.
+ */
+ public boolean isIdentifier() {
+ return type==IDENTIFIER;
+ }
+
+
+ /**
+ * Returns whether this token is a {@link #SEPARATOR} representing a single
+ * left curly brace.
+ *
+ * @return Whether this token is a left curly brace.
+ * @see #isRightCurly()
+ */
+ public boolean isLeftCurly() {
+ return type==SEPARATOR && isSingleChar('{');
+ }
+
+
+ /**
+ * Returns whether this token is a {@link #SEPARATOR} representing a single
+ * right curly brace.
+ *
+ * @return Whether this token is a right curly brace.
+ * @see #isLeftCurly()
+ */
+ public boolean isRightCurly() {
+ return type==SEPARATOR && isSingleChar('}');
+ }
+
+
+ /**
+ * Returns whether or not this token is "paintable;" i.e., whether or not
+ * the type of this token is one such that it has an associated syntax
+ * style. What this boils down to is whether the token type is greater
+ * than <code>Token.NULL</code>.
+ *
+ * @return Whether or not this token is paintable.
+ */
+ public boolean isPaintable() {
+ return type>Token.NULL;
+ }
+
+
+ /**
+ * Returns whether this token is the specified single character.
+ *
+ * @param ch The character to check for.
+ * @return Whether this token's lexeme is the single character specified.
+ * @see #isSingleChar(int, char)
+ */
+ public boolean isSingleChar(char ch) {
+ return textCount==1 && text[textOffset]==ch;
+ }
+
+
+ /**
+ * Returns whether this token is the specified single character, and of a
+ * specific type.
+ *
+ * @param type The token type.
+ * @param ch The character to check for.
+ * @return Whether this token is of the specified type, and with a lexeme
+ * Equaling the single character specified.
+ * @see #isSingleChar(char)
+ */
+ public boolean isSingleChar(int type, char ch) {
+ return this.type==type && isSingleChar(ch);
+ }
+
+
+ /**
+ * Returns whether or not this token is whitespace.
+ *
+ * @return <code>true</code> iff this token is whitespace.
+ * @see #isComment()
+ * @see #isCommentOrWhitespace()
+ */
+ public boolean isWhitespace() {
+ return type==WHITESPACE;
+ }
+
+
+ /**
+ * Returns the bounding box for the specified document location. The
+ * location must be in the specified token list; if it isn't,
+ * <code>null</code> is returned.
+ *
+ * @param textArea The text area from which the token list was derived.
+ * @param e How to expand tabs.
+ * @param pos The position in the document for which to get the bounding
+ * box in the view.
+ * @param x0 The pixel x-location that is the beginning of
+ * <code>tokenList</code>.
+ * @param rect The rectangle in which we'll be returning the results. This
+ * object is reused to keep from frequent memory allocations.
+ * @return The bounding box for the specified position in the model.
+ */
+ public Rectangle listOffsetToView(RSyntaxTextArea textArea, TabExpander e,
+ int pos, int x0, Rectangle rect) {
+
+ int stableX = x0; // Cached ending x-coord. of last tab or token.
+ Token token = this;
+ FontMetrics fm = null;
+ Segment s = new Segment();
+
+ while (token != null && token.isPaintable()) {
+
+ fm = textArea.getFontMetricsForTokenType(token.type);
+ if (fm == null) {
+ return rect; // Don't return null as things'll error.
+ }
+ char[] text = token.text;
+ int start = token.textOffset;
+ int end = start + token.textCount;
+
+ // If this token contains the position for which to get the
+ // bounding box...
+ if (token.containsPosition(pos)) {
+
+ s.array = token.text;
+ s.offset = token.textOffset;
+ s.count = pos - token.offset;
+
+ // Must use this (actually fm.charWidth()), and not
+ // fm.charsWidth() for returned value to match up with where
+ // text is actually painted on OS X!
+ int w = Utilities.getTabbedTextWidth(s, fm, stableX, e,
+ token.offset);
+ rect.x = stableX + w;
+ end = token.documentToToken(pos);
+
+ if (text[end] == '\t') {
+ rect.width = fm.charWidth(' ');
+ }
+ else {
+ rect.width = fm.charWidth(text[end]);
+ }
+
+ return rect;
+
+ }
+
+ // If this token does not contain the position for which to get
+ // the bounding box...
+ else {
+ s.array = token.text;
+ s.offset = token.textOffset;
+ s.count = token.textCount;
+ stableX += Utilities.getTabbedTextWidth(s, fm, stableX, e,
+ token.offset);
+ }
+
+ token = token.getNextToken();
+
+ }
+
+ // If we didn't find anything, we're at the end of the line. Return
+ // a width of 1 (so selection highlights don't extend way past line's
+ // text). A ConfigurableCaret will know to paint itself with a larger
+ // width.
+ rect.x = stableX;
+ rect.width = 1;
+ return rect;
+
+ }
+
+
+ /**
+ * Makes this token start at the specified offset into the document.
+ *
+ * @param pos The offset into the document this token should start at.
+ * Note that this token must already contain this position; if
+ * it doesn't, an exception is thrown.
+ * @throws IllegalArgumentException If pos is not already contained by
+ * this token.
+ * @see #moveOffset(int)
+ */
+ public void makeStartAt(int pos) {
+ if (pos<offset || pos>=(offset+textCount)) {
+ throw new IllegalArgumentException("pos " + pos +
+ " is not in range " + offset + "-" + (offset+textCount-1));
+ }
+ int shift = pos - offset;
+ offset = pos;
+ textOffset += shift;
+ textCount -= shift;
+ }
+
+
+ /**
+ * Moves the starting offset of this token.
+ *
+ * @param amt The amount to move the starting offset. This should be
+ * between <code>0</code> and <code>textCount</code>, inclusive.
+ * @throws IllegalArgumentException If <code>amt</code> is an invalid value.
+ * @see #makeStartAt(int)
+ */
+ public void moveOffset(int amt) {
+ if (amt<0 || amt>textCount) {
+ throw new IllegalArgumentException("amt " + amt +
+ " is not in range 0-" + textCount);
+ }
+ offset += amt;
+ textOffset += amt;
+ textCount -= amt;
+ }
+
+
+ /**
+ * Sets the value of this token to a particular segment of a document.
+ * The "next token" value is cleared.
+ *
+ * @param line The segment from which to get the token.
+ * @param beg The first character's position in <code>line</code>.
+ * @param end The last character's position in <code>line</code>.
+ * @param offset The offset into the document at which this token begins.
+ * @param type A token type listed as "generic" above.
+ */
+ public void set(final char[] line, final int beg, final int end,
+ final int offset, final int type) {
+ this.text = line;
+ this.textOffset = beg;
+ this.textCount = end - beg + 1;
+ this.type = type;
+ this.offset = offset;
+ nextToken = null;
+ }
+
+
+ /**
+ * Sets whether this token is a hyperlink.
+ *
+ * @param hyperlink Whether this token is a hyperlink.
+ * @see #isHyperlink()
+ */
+ public void setHyperlink(boolean hyperlink) {
+ this.hyperlink = hyperlink;
+ }
+
+
+ /**
+ * Sets the language index for this token. If this value is positive, it
+ * denotes a specific "secondary" language this token represents (such as
+ * JavaScript code or CSS embedded in an HTML file). If this value is
+ * <code>0</code>, this token is in the "main" language being edited.
+ * Negative values are invalid and treated as <code>0</code>.
+ *
+ * @param languageIndex The new language index. A value of
+ * <code>0</code> denotes the "main" language, any positive value
+ * denotes a specific secondary language. Negative values will
+ * be treated as <code>0</code>.
+ * @see #getLanguageIndex()
+ */
+ public void setLanguageIndex(int languageIndex) {
+ this.languageIndex = languageIndex;
+ }
+
+
+ /**
+ * Sets the "next token" pointer of this token to point to the specified
+ * token.
+ *
+ * @param nextToken The new next token.
+ * @see #getNextToken()
+ */
+ public void setNextToken(Token nextToken) {
+ this.nextToken = nextToken;
+ }
+
+
+ /**
+ * Returns whether this token starts with the specified characters.
+ *
+ * @param chars The characters.
+ * @return Whether this token starts with those characters.
+ * @see #endsWith(char[])
+ * @see #is(int, char[])
+ */
+ public boolean startsWith(char[] chars) {
+ if (chars.length<=textCount){
+ for (int i=0; i<chars.length; i++) {
+ if (text[textOffset+i]!=chars[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the position in the document corresponding to the specified
+ * position in this token's internal char array (<code>textOffset</code> -
+ * <code>textOffset+textCount-1</code>).<p>
+ * Note that this method does NOT do any bounds checking; you can pass in
+ * an invalid token position, and you will not receive an Exception or any
+ * other indication that the returned document position is invalid. It is
+ * up to the user to ensure valid input.
+ *
+ * @param pos A position in the token's internal char array
+ * (<code>textOffset</code> - <code>textOffset+textCount</code>).
+ * @return The corresponding position in the document.
+ * @see #documentToToken(int)
+ */
+ public int tokenToDocument(int pos) {
+ return pos + (offset-textOffset);
+ }
+
+
+ /**
+ * Returns this token as a <code>String</code>, which is useful for
+ * debugging.
+ *
+ * @return A string describing this token.
+ */
+ public String toString() {
+ return "[Token: " +
+ (type==Token.NULL ? "<null token>" :
+ "text: '" +
+ (text==null ? "<null>" : getLexeme() + "'; " +
+ "offset: " + offset + "; type: " + type + "; " +
+ "isPaintable: " + isPaintable() +
+ "; nextToken==null: " + (nextToken==null))) +
+ "]";
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java b/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java
new file mode 100644
index 0000000..a4d1a0f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenFactory.java
@@ -0,0 +1,67 @@
+/*
+ * 10/28/2004
+ *
+ * TokenFactory.java - Interface for a class that generates tokens of some type.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * Interface for a class that generates tokens somehow.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+interface TokenFactory {
+
+
+ /**
+ * Returns a null token.
+ *
+ * @return A null token.
+ */
+ public Token createToken();
+
+
+ /**
+ * Returns a token.
+ *
+ * @param line The segment from which to get the token's text.
+ * @param beg The starting offset of the token's text in the segment.
+ * @param end The ending offset of the token's text in the segment.
+ * @param startOffset The offset in the document of the token.
+ * @param type The type of token.
+ * @return The token.
+ */
+ public Token createToken(final Segment line, final int beg,
+ final int end, final int startOffset, final int type);
+
+
+ /**
+ * Returns a token.
+ *
+ * @param line The char array from which to get the token's text.
+ * @param beg The starting offset of the token's text in the char array.
+ * @param end The ending offset of the token's text in the char array.
+ * @param startOffset The offset in the document of the token.
+ * @param type The type of token.
+ * @return The token.
+ */
+ public Token createToken(final char[] line, final int beg,
+ final int end, final int startOffset, final int type);
+
+
+ /**
+ * Resets the state of this token maker. This method should be called
+ * by the <code>TokenMaker</code> every time a token list is generated for
+ * a new line so the tokens can be reused.
+ */
+ public void resetAllTokens();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java
new file mode 100644
index 0000000..af5d81e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMaker.java
@@ -0,0 +1,170 @@
+/*
+ * 02/24/2004
+ *
+ * TokenMaker.java - An object that can take a chunk of text and return a
+ * linked list of <code>Token</code>s representing it.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * An implementation of <code>TokenMaker</code> is a class that turns text into
+ * a linked list of <code>Token</code>s for syntax highlighting
+ * in a particular language.
+ *
+ * @see Token
+ * @see AbstractTokenMaker
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public interface TokenMaker {
+
+
+ /**
+ * Adds a null token to the end of the current linked list of tokens.
+ * This should be put at the end of the linked list whenever the last
+ * token on the current line is NOT a multi-line token.
+ */
+ public void addNullToken();
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array from which to get the text.
+ * @param start Start offset in <code>segment</code> of token.
+ * @param end End offset in <code>segment</code> of token.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset);
+
+
+ /**
+ * Returns the closest {@link TokenTypes "standard" token type} for a given
+ * "internal" token type (e.g. one whose value is <code>< 0</code>).
+ *
+ * @param type The token type.
+ * @return The closest "standard" token type. If a mapping is not defined
+ * for this language, then <code>type</code> is returned.
+ */
+ public int getClosestStandardTokenTypeForInternalType(int type);
+
+
+ /**
+ * Returns whether this programming language uses curly braces
+ * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.
+ *
+ * @return Whether curly braces denote code blocks.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks();
+
+
+ /**
+ * Returns the last token on this line's type if the token is "unfinished",
+ * or {@link Token#NULL} if it was finished. For example, if C-style
+ * syntax highlighting is being implemented, and <code>text</code>
+ * contained a line of code that contained the beginning of a comment but
+ * no end-comment marker ("*\/"), then this method would return
+ * {@link Token#COMMENT_MULTILINE} for that line. This is useful
+ * for doing syntax highlighting.
+ *
+ * @param text The line of tokens to examine.
+ * @param initialTokenType The token type to start with (i.e., the value
+ * of <code>getLastTokenTypeOnLine</code> for the line before
+ * <code>text</code>).
+ * @return The last token on this line's type, or {@link Token#NULL}
+ * if the line was completed.
+ */
+ public int getLastTokenTypeOnLine(Segment text, int initialTokenType);
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out. A <code>null</code> value for either means there
+ * is no string to add for that part. A value of
+ * <code>null</code> for the array means this language
+ * does not support commenting/uncommenting lines.
+ */
+ public String[] getLineCommentStartAndEnd();
+
+
+ /**
+ * Returns an action to handle "insert break" key presses (i.e. Enter).
+ *
+ * @return The action, or <code>null</code> if the default action should
+ * be used.
+ */
+ public Action getInsertBreakAction();
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type);
+
+
+ /**
+ * Returns the object in charge of marking all occurrences of the token
+ * at the current caret position, if it is a relevant token. If
+ * <code>null</code> is returned, a default <code>OccurrenceMarker</code>
+ * is used.
+ *
+ * @return The occurrence marker for this language, or <code>null</code>
+ * for none.
+ */
+ public OccurrenceMarker getOccurrenceMarker();
+
+
+ /**
+ * If a line ends in the specified token, this method returns whether
+ * a new line inserted after that line should be indented.
+ *
+ * @param token The token the previous line ends with.
+ * @return Whether the next line should be indented.
+ */
+ public boolean getShouldIndentNextLineAfter(Token token);
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType,
+ int startOffset);
+
+
+ /**
+ * Returns whether this language is a markup language.
+ *
+ * @return Whether this language is markup.
+ */
+ public boolean isMarkupLanguage();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java b/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java
new file mode 100644
index 0000000..bcbbaa5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMakerBase.java
@@ -0,0 +1,298 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMakerBase.java - A base class for token makers.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.Action;
+import javax.swing.text.Segment;
+
+
+/**
+ * Base class for token makers.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class TokenMakerBase implements TokenMaker {
+
+ /**
+ * The first token in the returned linked list.
+ */
+ protected Token firstToken;
+
+ /**
+ * Used in the creation of the linked list.
+ */
+ protected Token currentToken;
+
+ /**
+ * Used in the creation of the linked list.
+ */
+ protected Token previousToken;
+
+ /**
+ * The factory that gives us our tokens to use.
+ */
+ private TokenFactory tokenFactory;
+
+ /**
+ * Highlights occurrences of the current token in the editor, if it is
+ * relevant.
+ */
+ private OccurrenceMarker occurrenceMarker;
+
+ /**
+ * "0" implies this is the "main" language being highlighted. Positive
+ * values imply various "secondary" or "embedded" languages, such as CSS
+ * or JavaScript in HTML. While this value is non-zero, tokens will be
+ * generated with this language index so they can (possibly) be painted
+ * differently, so "embedded" languages can be rendered with a special
+ * background.
+ */
+ private int languageIndex;
+
+
+ /**
+ * Constructor.
+ */
+ public TokenMakerBase() {
+ firstToken = currentToken = previousToken = null;
+ tokenFactory = new DefaultTokenFactory();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNullToken() {
+ if (firstToken==null) {
+ firstToken = tokenFactory.createToken();
+ currentToken = firstToken;
+ }
+ else {
+ currentToken.setNextToken(tokenFactory.createToken());
+ previousToken = currentToken;
+ currentToken = currentToken.getNextToken();
+ }
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param segment <code>Segment</code> to get text from.
+ * @param start Start offset in <code>segment</code> of token.
+ * @param end End offset in <code>segment</code> of token.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(Segment segment, int start, int end, int tokenType,
+ int startOffset) {
+ addToken(segment.array, start,end, tokenType, startOffset);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset) {
+ addToken(array, start, end, tokenType, startOffset, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+
+ if (firstToken==null) {
+ firstToken = tokenFactory.createToken(array, start, end,
+ startOffset, tokenType);
+ currentToken = firstToken; // previous token is still null.
+ }
+ else {
+ currentToken.setNextToken(tokenFactory.createToken(array,
+ start,end, startOffset, tokenType));
+ previousToken = currentToken;
+ currentToken = currentToken.getNextToken();
+ }
+
+ currentToken.setLanguageIndex(languageIndex);
+ currentToken.setHyperlink(hyperlink);
+
+ }
+
+
+ /**
+ * Returns the occurrence marker to use for this token maker. Subclasses
+ * can override to use different implementations.
+ *
+ * @return The occurrence marker to use.
+ */
+ protected OccurrenceMarker createOccurrenceMarker() {
+ return new DefaultOccurrenceMarker();
+ }
+
+
+ /**
+ * Returns the closest {@link TokenTypes "standard" token type} for a given
+ * "internal" token type (e.g. one whose value is <code>< 0</code>).<p>
+ *
+ * The default implementation returns <code>type</code> always, which
+ * denotes that a mapping from internal token types to standard token types
+ * is not defined; subclasses can override.
+ *
+ * @param type The token type.
+ * @return The closest "standard" token type.
+ */
+ public int getClosestStandardTokenTypeForInternalType(int type) {
+ return type;
+ }
+
+
+ /**
+ * Returns whether this programming language uses curly braces
+ * ('<tt>{</tt>' and '<tt>}</tt>') to denote code blocks.<p>
+ *
+ * The default implementation returns <code>false</code>; subclasses can
+ * override this method if necessary.
+ *
+ * @return Whether curly braces denote code blocks.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return false;
+ }
+
+
+ /**
+ * Returns an action to handle "insert break" key presses (i.e. Enter).
+ * The default implementation returns <code>null</code>. Subclasses
+ * can override.
+ *
+ * @return The default implementation always returns <code>null</code>.
+ */
+ public Action getInsertBreakAction() {
+ return null;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+
+ // Last parameter doesn't matter if we're not painting.
+ Token t = getTokenList(text, initialTokenType, 0);
+
+ while (t.getNextToken()!=null)
+ t = t.getNextToken();
+
+ return t.type;
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return null;
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language. The default
+ * implementation returns true if <tt>type</tt> is {@link Token#IDENTIFIER}.
+ * Subclasses can override this method to support other token types, such
+ * as {@link Token#VARIABLE}.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public OccurrenceMarker getOccurrenceMarker() {
+ if (occurrenceMarker==null) {
+ occurrenceMarker = createOccurrenceMarker();
+ }
+ return occurrenceMarker;
+ }
+
+
+ /**
+ * The default implementation returns <code>false</code> always. Languages
+ * that wish to better support auto-indentation can override this method.
+ *
+ * @param token The token the previous line ends with.
+ * @return Whether the next line should be indented.
+ */
+ public boolean getShouldIndentNextLineAfter(Token token) {
+ return false;
+ }
+
+
+ /**
+ * The default implementation returns <code>false</code> always.
+ * Subclasses that are highlighting a markup language should override this
+ * method to return <code>true</code>.
+ *
+ * @return <code>false</code> always.
+ */
+ public boolean isMarkupLanguage() {
+ return false;
+ }
+
+
+ /**
+ * Deletes the linked list of tokens so we can begin anew. This should
+ * never have to be called by the programmer, as it is automatically
+ * called whenever the user calls
+ * {@link #getLastTokenTypeOnLine(Segment, int)} or
+ * {@link #getTokenList(Segment, int, int)}.
+ */
+ protected void resetTokenList() {
+ firstToken = currentToken = previousToken = null;
+ tokenFactory.resetAllTokens();
+ }
+
+
+ /**
+ * Sets the language index to assign to tokens moving forward. This
+ * property is used to designate tokens as being in "secondary" languages
+ * (such as CSS or JavaScript in HTML).
+ *
+ * @param languageIndex The new language index. A value of
+ * <code>0</code> denotes the "main" language, any positive value
+ * denotes a specific secondary language. Negative values will
+ * be treated as <code>0</code>.
+ */
+ public void setLanguageIndex(int languageIndex) {
+ this.languageIndex = Math.max(0, languageIndex);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java b/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java
new file mode 100644
index 0000000..1aa18eb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMakerFactory.java
@@ -0,0 +1,124 @@
+/*
+ * 12/12/2008
+ *
+ * TokenMakerFactory.java - A factory for TokenMakers.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Set;
+
+import org.fife.ui.rsyntaxtextarea.modes.PlainTextTokenMaker;
+
+
+/**
+ * A factory that maps syntax styles to {@link TokenMaker}s capable of splitting
+ * text into tokens for those syntax styles.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class TokenMakerFactory {
+
+ /**
+ * If this system property is set, a custom <code>TokenMakerFactory</code>
+ * of the specified class will be used as the default token maker factory.
+ */
+ public static final String PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY =
+ "TokenMakerFactory";
+
+ /**
+ * The singleton default <code>TokenMakerFactory</code> instance.
+ */
+ private static TokenMakerFactory DEFAULT_INSTANCE;
+
+
+ /**
+ * Returns the default <code>TokenMakerFactory</code> instance. This is
+ * the factory used by all {@link RSyntaxDocument}s by default.
+ *
+ * @return The factory.
+ * @see #setDefaultInstance(TokenMakerFactory)
+ */
+ public static synchronized TokenMakerFactory getDefaultInstance() {
+ if (DEFAULT_INSTANCE==null) {
+ String clazz = null;
+ try {
+ clazz= System.getProperty(PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY);
+ } catch (java.security.AccessControlException ace) {
+ clazz = null; // We're in an applet; take default.
+ }
+ if (clazz==null) {
+ clazz = "org.fife.ui.rsyntaxtextarea.DefaultTokenMakerFactory";
+ }
+ try {
+ DEFAULT_INSTANCE = (TokenMakerFactory)Class.forName(clazz).
+ newInstance();
+ } catch (RuntimeException re) { // FindBugs
+ throw re;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new InternalError("Cannot find TokenMakerFactory: " +
+ clazz);
+ }
+ }
+ return DEFAULT_INSTANCE;
+ }
+
+
+ /**
+ * Returns a {@link TokenMaker} for the specified key.
+ *
+ * @param key The key.
+ * @return The corresponding <code>TokenMaker</code>, or
+ * {@link PlainTextTokenMaker} if none matches the specified key.
+ */
+ public final TokenMaker getTokenMaker(String key) {
+ TokenMaker tm = getTokenMakerImpl(key);
+ if (tm==null) {
+ tm = new PlainTextTokenMaker();
+ }
+ return tm;
+ }
+
+
+ /**
+ * Returns a {@link TokenMaker} for the specified key.
+ *
+ * @param key The key.
+ * @return The corresponding <code>TokenMaker</code>, or <code>null</code>
+ * if none matches the specified key.
+ */
+ protected abstract TokenMaker getTokenMakerImpl(String key);
+
+
+ /**
+ * Returns the set of keys that this factory maps to token makers.
+ *
+ * @return The set of keys.
+ */
+ public abstract Set keySet();
+
+
+ /**
+ * Sets the default <code>TokenMakerFactory</code> instance. This is
+ * the factory used by all future {@link RSyntaxDocument}s by default.
+ * <code>RSyntaxDocument</code>s that have already been created are not
+ * affected.
+ *
+ * @param tmf The factory.
+ * @throws IllegalArgumentException If <code>tmf</code> is
+ * <code>null</code>.
+ * @see #getDefaultInstance()
+ */
+ public static synchronized void setDefaultInstance(TokenMakerFactory tmf) {
+ if (tmf==null) {
+ throw new IllegalArgumentException("tmf cannot be null");
+ }
+ DEFAULT_INSTANCE = tmf;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenMap.java b/src/org/fife/ui/rsyntaxtextarea/TokenMap.java
new file mode 100644
index 0000000..51976fd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenMap.java
@@ -0,0 +1,276 @@
+/*
+ * 08/26/2004
+ *
+ * TokenMap.java - Similar to a Map in Java, only designed specifically for
+ * org.fife.ui.rsyntaxtextarea.Tokens.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import javax.swing.text.Segment;
+
+
+/**
+ * A hash table for reserved words, etc. defined by a {@link TokenMaker}.
+ * This class is designed for the quick lookup of tokens, as it can compare
+ * <code>Segment</code>s without the need to allocate a new string.<p>
+ *
+ * The <code>org.fife.ui.rsyntaxtextarea</code> package uses this class to help
+ * identify reserved words in programming languages. An instance of
+ * {@link TokenMaker} will create and initialize an instance of this class
+ * containing all reserved words, data types, and all other words that need to
+ * be syntax-highlighted for that particular language. When the token maker
+ * parses a line and identifies an individual token, it is looked up in the
+ * <code>TokenMap</code> to see if it should be syntax-highlighted.
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class TokenMap {
+
+ private int size;
+ private TokenMapToken[] tokenMap;
+ private boolean ignoreCase;
+
+ private static final int DEFAULT_TOKEN_MAP_SIZE = 52;
+
+
+ /**
+ * Constructs a new token map that is case-sensitive.
+ */
+ public TokenMap() {
+ this(DEFAULT_TOKEN_MAP_SIZE);
+ }
+
+
+ /**
+ * Constructs a new token map that is case-sensitive.
+ *
+ * @param size The size of the token map.
+ */
+ public TokenMap(int size) {
+ this(size, false);
+ }
+
+
+ /**
+ * Constructs a new token map.
+ *
+ * @param ignoreCase Whether or not this token map should ignore case
+ * when comparing tokens.
+ */
+ public TokenMap(boolean ignoreCase) {
+ this(DEFAULT_TOKEN_MAP_SIZE, ignoreCase);
+ }
+
+
+ /**
+ * Constructs a new token map.
+ *
+ * @param size The size of the token map.
+ * @param ignoreCase Whether or not this token map should ignore case
+ * when comparing tokens.
+ */
+ public TokenMap(int size, boolean ignoreCase) {
+ this.size = size;
+ tokenMap = new TokenMapToken[size];
+ this.ignoreCase = ignoreCase;
+ }
+
+
+ /**
+ * Adds a token to a specified bucket in the token map.
+ *
+ * @param bucket The bucket in which to add the token.
+ * @param token The token to add.
+ */
+ private void addTokenToBucket(int bucket, TokenMapToken token) {
+ TokenMapToken old = tokenMap[bucket];
+ token.nextToken = old;
+ tokenMap[bucket] = token;
+ }
+
+
+ /**
+ * Returns the token type associated with the given text, if the given
+ * text is in this token map. If it isn't, <code>-1</code> is returned.
+ *
+ * @param text The segment from which to get the text to compare.
+ * @param start The starting index in the segment of the text.
+ * @param end The ending index in the segment of the text.
+ * @return The token type associated with the given text, or
+ * <code>-1</code> if this token was not specified in this map.
+ */
+ public int get(Segment text, int start, int end) {
+ return get(text.array, start, end);
+ }
+
+
+ /**
+ * Returns the token type associated with the given text, if the given
+ * text is in this token map. If it isn't, <code>-1</code> is returned.
+ *
+ * @param array1 An array of characters containing the text.
+ * @param start The starting index in the array of the text.
+ * @param end The ending index in the array of the text.
+ * @return The token type associated with the given text, or
+ * <code>-1</code> if this token was not specified in this map.
+ */
+ public int get(char[] array1, int start, int end) {
+
+ int length1 = end - start + 1;
+
+ int hash = getHashCode(array1, start, length1);
+ TokenMapToken token = tokenMap[hash];
+
+ char[] array2;
+ int offset2;
+ int offset1;
+ int length;
+
+ /* We check whether or not to ignore case before doing any looping to
+ * minimize the number of extraneous comparisons we do. This makes
+ * for slightly redundant code, but it'll be a little more efficient.
+ */
+
+ // If matches are case-sensitive (C, C++, Java, etc.)...
+ if (ignoreCase==false) {
+
+ mainLoop:
+ while (token!=null) {
+ if (token.length==length1) {
+ array2 = token.text;
+ offset2 = token.offset;
+ offset1 = start;
+ length = length1;
+ while (length-- > 0) {
+ if (array1[offset1++]!=array2[offset2++]) {
+ token = token.nextToken;
+ continue mainLoop;
+ }
+ }
+ return token.tokenType;
+ }
+ token = token.nextToken;
+ }
+
+ }
+
+ // If matches are NOT case-sensitive (HTML)...
+ // Note that all tokens saved in this map were converted to
+ // lower-case already.
+ else {
+
+ mainLoop2:
+ while (token!=null) {
+ if (token.length==length1) {
+ array2 = token.text;
+ offset2 = token.offset;
+ offset1 = start;
+ length = length1;
+ while (length-- > 0) {
+ if (RSyntaxUtilities.toLowerCase(
+ array1[offset1++]) != array2[offset2++]) {
+ token = token.nextToken;
+ continue mainLoop2;
+ }
+ }
+ return token.tokenType;
+ }
+ token = token.nextToken;
+ }
+
+ }
+
+ // Didn't match any of the tokens in the bucket.
+ return -1;
+
+ }
+
+
+ /**
+ * Returns the hash code for a given string.
+ *
+ * @param text The text to hash.
+ * @param offset The offset into the text at which to start hashing.
+ * @param length The last character in the text to hash.
+ * @return The hash code.
+ */
+ private final int getHashCode(char[] text, int offset, int length) {
+ return (RSyntaxUtilities.toLowerCase(text[offset]) +
+ RSyntaxUtilities.toLowerCase(text[offset+length-1])) % size;
+ }
+
+
+ /**
+ * Returns whether this token map ignores case when checking for tokens.
+ * This property is set in the constructor and cannot be changed, as this
+ * is an intrinsic property of a particular programming language.
+ *
+ * @return Whether or not this token maker is ignoring case.
+ */
+ protected boolean isIgnoringCase() {
+ return ignoreCase;
+ }
+
+
+ /**
+ * Adds a string to this token map.
+ *
+ * @param string The string to add.
+ * @param tokenType The type of token the string is.
+ */
+ public void put(final String string, final int tokenType) {
+ if (isIgnoringCase())
+ put(string.toLowerCase().toCharArray(), tokenType);
+ else
+ put(string.toCharArray(), tokenType);
+ }
+
+
+ /**
+ * Adds a string to this token map. The char array passed-in will be used
+ * as the actual data for the token, so it may well be modified (such as
+ * lower-casing it if <code>ignoreCase</code> is <code>true</code>). This
+ * shouldn't be an issue though as this method is only called from the
+ * public <code>put</code> method, which allocates a new char array.
+ *
+ * @param string The string to add.
+ * @param tokenType The type of token the string is.
+ */
+ private void put(char[] string, int tokenType) {
+ int hashCode = getHashCode(string, 0, string.length);
+ addTokenToBucket(hashCode, new TokenMapToken(string, tokenType));
+ }
+
+
+ /**
+ * The "token" used by a token map. Note that this isn't the same thing
+ * as the {@link Token} class, but it's basically a 1-1 correspondence
+ * for reserved words, etc.
+ */
+ private static class TokenMapToken {
+
+ char[] text;
+ int offset;
+ int length;
+ int tokenType;
+ TokenMapToken nextToken;
+
+ TokenMapToken(char[] text, int tokenType) {
+ this.text = text;
+ this.offset = 0;
+ this.length = text.length;
+ this.tokenType = tokenType;
+ }
+
+ public String toString() {
+ return "[TokenMapToken: " + new String(text,offset,length) + "]";
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java b/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java
new file mode 100644
index 0000000..a662996
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenOrientedView.java
@@ -0,0 +1,61 @@
+/*
+ * 08/06/2004
+ *
+ * TokenOrientedView.java - An interface for the syntax-highlighting token-
+ * oriented views for token-oriented methods.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * An interface for the syntax-highlighting token oriented views for
+ * token-oriented methods. This way callers won't need to know what specific
+ * class a view is an instance of to access its tokens.<p>
+ *
+ * Currently, this interface is only useful for obtaining token lists for
+ * "physical lines" (i.e., a word-wrapped view's logical lines may be
+ * represented as several physical lines, thus getting the "physical line" above
+ * a given position may prove complicated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public interface TokenOrientedView {
+
+
+ /**
+ * Returns a token list for the <i>physical</i> line above the physical
+ * line containing the specified offset into the document. Note that for
+ * a plain (non-wrapped) view, this is simply the token list for the
+ * logical line above the line containing <code>offset</code>, since lines
+ * are not wrapped. For a wrapped view, this may or may not be tokens from
+ * the same line.
+ *
+ * @param offset The offset in question.
+ * @return A token list for the physical (and in this view, logical) line
+ * before this one. If no physical line is above the one
+ * containing <code>offset</code>, <code>null</code> is returned.
+ */
+ public Token getTokenListForPhysicalLineAbove(int offset);
+
+
+ /**
+ * Returns a token list for the <i>physical</i> line below the physical
+ * line containing the specified offset into the document. Note that for
+ * a plain (non-wrapped) view, this is simply the token list for the
+ * logical line below the line containing <code>offset</code>, since lines
+ * are not wrapped. For a wrapped view, this may or may not be tokens from
+ * the same line.
+ *
+ * @param offset The offset in question.
+ * @return A token list for the physical (and in this view, logical) line
+ * after this one. If no physical line is after the one
+ * containing <code>offset</code>, <code>null</code> is returned.
+ */
+ public Token getTokenListForPhysicalLineBelow(int offset);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java
new file mode 100644
index 0000000..e8441af
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenPainter.java
@@ -0,0 +1,96 @@
+/*
+ * 03/16/2013
+ *
+ * TokenPainter - Renders tokens in an instance of RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Graphics2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * Renders tokens in an instance of {@link RSyntaxTextArea}. One instance
+ * may render tokens "regularly," another may render visible whitespace, for
+ * example.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+interface TokenPainter {
+
+
+ /**
+ * Paints this token.
+ *
+ * @param token The token to render.
+ * @param g The graphics context in which to paint.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ * @param host The text area this token is in.
+ * @param e How to expand tabs.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ public float paint(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e);
+
+
+ /**
+ * Paints this token.
+ *
+ * @param token The token to render.
+ * @param g The graphics context in which to paint.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ * @param host The text area this token is in.
+ * @param e How to expand tabs.
+ * @param clipStart The left boundary of the clip rectangle in which we're
+ * painting. This optimizes painting by allowing us to not paint
+ * paint when this token is "to the left" of the clip rectangle.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ public float paint(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart);
+
+
+ /**
+ * Paints this token as it should appear in a selected region of text
+ * (assuming painting with a selection-foreground color is enabled in the
+ * parent <code>RSyntaxTextArea</code>).
+ *
+ * @param token The token to render.
+ * @param g The graphics context in which to paint.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ * @param host The text area this token is in.
+ * @param e How to expand tabs.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ public float paintSelected(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e);
+
+
+ /**
+ * Paints this token as it should appear in a selected region of text
+ * (assuming painting with a selection-foreground color is enabled in the
+ * parent <code>RSyntaxTextArea</code>).
+ *
+ * @param token The token to render.
+ * @param g The graphics context in which to paint.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ * @param host The text area this token is in.
+ * @param e How to expand tabs.
+ * @param clipStart The left boundary of the clip rectangle in which we're
+ * painting. This optimizes painting by allowing us to not paint
+ * paint when this token is "to the left" of the clip rectangle.
+ * @return The x-coordinate representing the end of the painted text.
+ */
+ public float paintSelected(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java b/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java
new file mode 100644
index 0000000..9def2f9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/TokenTypes.java
@@ -0,0 +1,85 @@
+/*
+ * 12/04/2011
+ *
+ * TokenTypes.java - All token types supported by RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+
+/**
+ * All token types supported by RSyntaxTextArea.<p>
+ *
+ * Note that all valid token types are >= 0, so extensions of the TokenMaker
+ * class are free to internally use all ints < 0 ONLY for "end-of-line"
+ * style markers; they are ignored by painting implementations.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface TokenTypes {
+
+ /**
+ * Tokens of type <code>NULL</code> mark the end of lines with no
+ * multi-line token at the end (such as a block comment in C++).
+ */
+ public static final int NULL = 0;
+
+ public static final int COMMENT_EOL = 1;
+ public static final int COMMENT_MULTILINE = 2;
+ public static final int COMMENT_DOCUMENTATION = 3;
+ public static final int COMMENT_KEYWORD = 4;
+ public static final int COMMENT_MARKUP = 5;
+
+ public static final int RESERVED_WORD = 6;
+ public static final int RESERVED_WORD_2 = 7;
+
+ public static final int FUNCTION = 8;
+
+ public static final int LITERAL_BOOLEAN = 9;
+ public static final int LITERAL_NUMBER_DECIMAL_INT = 10;
+ public static final int LITERAL_NUMBER_FLOAT = 11;
+ public static final int LITERAL_NUMBER_HEXADECIMAL = 12;
+ public static final int LITERAL_STRING_DOUBLE_QUOTE = 13;
+ public static final int LITERAL_CHAR = 14;
+ public static final int LITERAL_BACKQUOTE = 15;
+
+ public static final int DATA_TYPE = 16;
+
+ public static final int VARIABLE = 17;
+
+ public static final int REGEX = 18;
+
+ public static final int ANNOTATION = 19;
+
+ public static final int IDENTIFIER = 20;
+
+ public static final int WHITESPACE = 21;
+
+ public static final int SEPARATOR = 22;
+
+ public static final int OPERATOR = 23;
+
+ public static final int PREPROCESSOR = 24;
+
+ public static final int MARKUP_TAG_DELIMITER = 25;
+ public static final int MARKUP_TAG_NAME = 26;
+ public static final int MARKUP_TAG_ATTRIBUTE = 27;
+ public static final int MARKUP_TAG_ATTRIBUTE_VALUE = 28;
+ public static final int MARKUP_COMMENT = 29;
+ public static final int MARKUP_DTD = 30;
+ public static final int MARKUP_PROCESSING_INSTRUCTION = 31;
+ public static final int MARKUP_CDATA_DELIMITER = 32;
+ public static final int MARKUP_CDATA = 33;
+ public static final int MARKUP_ENTITY_REFERENCE = 34;
+
+ public static final int ERROR_IDENTIFIER = 35;
+ public static final int ERROR_NUMBER_FORMAT = 36;
+ public static final int ERROR_STRING_DOUBLE = 37;
+ public static final int ERROR_CHAR = 38;
+
+ public static final int NUM_TOKEN_TYPES = 39;
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java b/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java
new file mode 100644
index 0000000..30c261c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/URLFileLocation.java
@@ -0,0 +1,153 @@
+/*
+ * 11/13/2008
+ *
+ * URLFileLocation.java - The location of a file at a (remote) URL.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+
+/**
+ * The location of a file at a (remote) URL.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class URLFileLocation extends FileLocation {
+
+ /**
+ * URL of the remote file.
+ */
+ private URL url;
+
+ /**
+ * A prettied-up full path of the URL (password removed, etc.).
+ */
+ private String fileFullPath;
+
+ /**
+ * A prettied-up filename (leading slash, and possibly "<code>%2F</code>",
+ * removed).
+ */
+ private String fileName;
+
+
+ /**
+ * Constructor.
+ *
+ * @param url The URL of the file.
+ */
+ URLFileLocation(URL url) {
+ this.url = url;
+ fileFullPath = createFileFullPath();
+ fileName = createFileName();
+ }
+
+
+ /**
+ * Creates a "prettied-up" URL to use. This will be stripped of
+ * sensitive information such as passwords.
+ *
+ * @return The full path to use.
+ */
+ private String createFileFullPath() {
+ String fullPath = url.toString();
+ fullPath = fullPath.replaceFirst("://([^:]+)(?:.+)@", "://$1@");
+ return fullPath;
+ }
+
+
+ /**
+ * Creates the "prettied-up" filename to use.
+ *
+ * @return The base name of the file of this URL.
+ */
+ private String createFileName() {
+ String fileName = url.getPath();
+ if (fileName.startsWith("/%2F/")) { // Absolute path
+ fileName = fileName.substring(4);
+ }
+ else if (fileName.startsWith("/")) { // All others
+ fileName = fileName.substring(1);
+ }
+ return fileName;
+ }
+
+
+ /**
+ * Returns the last time this file was modified, or
+ * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be
+ * computed (such as for a remote file).
+ *
+ * @return The last time this file was modified. This will always be
+ * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} for URL's.
+ */
+ protected long getActualLastModified() {
+ return TextEditorPane.LAST_MODIFIED_UNKNOWN;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getFileFullPath() {
+ return fileFullPath;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getFileName() {
+ return fileName;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected InputStream getInputStream() throws IOException {
+ return url.openStream();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected OutputStream getOutputStream() throws IOException {
+ return url.openConnection().getOutputStream();
+ }
+
+
+ /**
+ * Returns whether this file location is a local file.
+ *
+ * @return Whether this is a local file.
+ * @see #isLocalAndExists()
+ */
+ public boolean isLocal() {
+ return "file".equalsIgnoreCase(url.getProtocol());
+ }
+
+
+ /**
+ * Returns whether this file location is a local file and already
+ * exists. This method always returns <code>false</code> since we
+ * cannot check this value easily.
+ *
+ * @return <code>false</code> always.
+ * @see #isLocal()
+ */
+ public boolean isLocalAndExists() {
+ return false;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java b/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java
new file mode 100644
index 0000000..747986e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java
@@ -0,0 +1,188 @@
+/*
+ * 03/16/2013
+ *
+ * VisibleWhitespaceTokenPainter - Renders tokens in an instance of
+ * RSyntaxTextArea, with special glyphs to denote spaces and tabs.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import javax.swing.text.TabExpander;
+
+
+/**
+ * A token painter that visibly renders whitespace (spaces and tabs).<p>
+ *
+ * The current implementation paints as follows:
+ * <ul>
+ * <li>The first tab or space, if any, is found in the token.</li>
+ * <li>If a tab was found, all characters up to it are painted as a
+ * group.</li>
+ * <li>If a space was found, all characters up to and including it are
+ * painted (it is painted with a special symbol to denote it as
+ * a space).</li>
+ * <li>If neither a tab nor a whitespace was found, all characters in the
+ * token are painted.</li>
+ * <li>Repeat until all characters are painted.</li>
+ * </ul>
+ * This means that rendering hints are applied to all groups of characters
+ * within a token, excluding whitespace and tabs.<p>
+ *
+ * A problem with this implementation is that FontMetrics.charsWidth() is still
+ * used to calculate the width of a group of chars painted. Thus, the group of
+ * characters will be painted with the rendering hints specified, but the
+ * following tab (or group of characters if the current group was the end of a
+ * token) will not necessarily be painted at the proper x-coordinate (as
+ * FontMetrics.charsWidth() returns an <code>int</code> and not a
+ * <code>float</code>). The way around this would be to calculate the token's
+ * width in such a way that a float is returned (Font.getStringBounds()?).
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class VisibleWhitespaceTokenPainter extends DefaultTokenPainter {
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected float paintImpl(Token token, Graphics2D g, float x, float y,
+ RSyntaxTextArea host, TabExpander e, float clipStart,
+ boolean selected) {
+
+ int origX = (int)x;
+ int end = token.textOffset + token.textCount;
+ float nextX = x;
+ int flushLen = 0;
+ int flushIndex = token.textOffset;
+ Color fg, bg;
+ if (selected) {
+ fg = host.getSelectedTextColor();
+ bg = null;
+ }
+ else {
+ fg = host.getForegroundForToken(token);
+ bg = host.getBackgroundForToken(token);
+ }
+ g.setFont(host.getFontForTokenType(token.type));
+ FontMetrics fm = host.getFontMetricsForTokenType(token.type);
+
+ int ascent = fm.getAscent();
+ int height = fm.getHeight();
+
+ for (int i=token.textOffset; i<end; i++) {
+
+ switch (token.text[i]) {
+
+ case '\t':
+
+ // Fill in background.
+ nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+ float nextNextX = e.nextTabStop(nextX, 0);
+ if (bg!=null) {
+ paintBackground(x,y, nextNextX-x,height, g,
+ ascent, host, bg, !selected);
+ }
+ g.setColor(fg);
+
+ // Paint chars cached before the tab.
+ if (flushLen > 0) {
+ g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+ flushLen = 0;
+ }
+ flushIndex = i + 1;
+
+ // Draw an arrow representing the tab.
+ int halfHeight = height / 2;
+ int quarterHeight = halfHeight / 2;
+ int ymid = (int)y - ascent + halfHeight;
+ g.drawLine((int)nextX,ymid, (int)nextNextX,ymid);
+ g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid-quarterHeight);
+ g.drawLine((int)nextNextX,ymid, (int)nextNextX-4,ymid+quarterHeight);
+
+ x = nextNextX;
+ break;
+
+ case ' ':
+
+ // NOTE: There is a little bit of a "fudge factor"
+ // here when "smooth text" is enabled, as "width"
+ // below may well not be the width given to the space
+ // by fm.charsWidth() (it depends on how it places the
+ // space with respect to the preceding character).
+ // But, we assume the approximation is close enough for
+ // our drawing a dot for the space.
+
+ // "flushLen+1" ensures text is aligned correctly (or,
+ // aligned the same as in getWidth()).
+ nextX = x+fm.charsWidth(token.text, flushIndex,flushLen+1);
+ int width = fm.charWidth(' ');
+
+ // Paint background.
+ if (bg!=null) {
+ paintBackground(x,y, nextX-x,height, g,
+ ascent, host, bg, !selected);
+ }
+ g.setColor(fg);
+
+ // Paint chars before space.
+ if (flushLen>0) {
+ g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+ flushLen = 0;
+ }
+
+ // Paint a dot representing the space.
+ int dotX = (int)(nextX - width/2f); // "2.0f" for FindBugs
+ int dotY = (int)(y - ascent + height/2f); // Ditto
+ g.drawLine(dotX, dotY, dotX, dotY);
+ flushIndex = i + 1;
+ x = nextX;
+ break;
+
+
+ case '\f':
+ // ???
+ // fall-through for now.
+
+ default:
+ flushLen += 1;
+ break;
+
+ }
+ }
+
+ nextX = x+fm.charsWidth(token.text, flushIndex,flushLen);
+
+ if (flushLen>0 && nextX>=clipStart) {
+ if (bg!=null) {
+ paintBackground(x,y, nextX-x,height, g,
+ ascent, host, bg, !selected);
+ }
+ g.setColor(fg);
+ g.drawChars(token.text, flushIndex, flushLen, (int)x,(int)y);
+ }
+
+ if (host.getUnderlineForToken(token)) {
+ g.setColor(fg);
+ int y2 = (int)(y+1);
+ g.drawLine(origX,y2, (int)nextX,y2);
+ }
+
+ // Don't check if it's whitespace - some TokenMakers may return types
+ // other than Token.WHITESPACE for spaces (such as Token.IDENTIFIER).
+ // This also allows us to paint tab lines for MLC's.
+ if (host.getPaintTabLines() && origX==host.getMargin().left) {// && isWhitespace()) {
+ paintTabLines(token, origX, (int)y, (int)nextX, g, e, host);
+ }
+
+ return nextX;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java
new file mode 100644
index 0000000..6f81799
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView.java
@@ -0,0 +1,1372 @@
+/*
+ * 08/06/2004
+ *
+ * WrappedSyntaxView.java - Test implementation of WrappedSyntaxView that
+ * is also aware of RSyntaxTextArea's different fonts per token type.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.awt.*;
+import javax.swing.text.*;
+import javax.swing.text.Position.Bias;
+import javax.swing.event.*;
+
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+import org.fife.ui.rtextarea.Gutter;
+
+
+/**
+ * The view used by {@link RSyntaxTextArea} when word wrap is enabled.
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ */
+public class WrappedSyntaxView extends BoxView implements TabExpander,
+ RSTAView {
+
+ boolean widthChanging;
+ int tabBase;
+ int tabSize;
+
+ /**
+ * This is reused to keep from allocating/deallocating.
+ */
+ private Segment s, drawSeg;
+
+ /**
+ * Another variable initialized once to keep from allocating/deallocating.
+ */
+ private Rectangle tempRect;
+
+ /**
+ * Cached for each paint() call so each drawView() call has access to it.
+ */
+ private RSyntaxTextArea host;
+ private FontMetrics metrics;
+ private Token tempToken;
+
+// /**
+// * The end-of-line marker.
+// */
+// private static final char[] eolMarker = { '.' };
+
+ /**
+ * The width of this view cannot be below this amount, as if the width
+ * is ever 0 (really a bug), we'll go into an infinite loop.
+ */
+ private static final int MIN_WIDTH = 20;
+
+
+ /**
+ * Creates a new WrappedSyntaxView. Lines will be wrapped
+ * on character boundaries.
+ *
+ * @param elem the element underlying the view
+ */
+ public WrappedSyntaxView(Element elem) {
+ super(elem, Y_AXIS);
+ tempToken = new Token();
+ s = new Segment();
+ drawSeg = new Segment();
+ tempRect = new Rectangle();
+ }
+
+
+
+ /**
+ * This is called by the nested wrapped line
+ * views to determine the break location. This can
+ * be reimplemented to alter the breaking behavior.
+ * It will either break at word or character boundaries
+ * depending upon the break argument given at
+ * construction.
+ */
+ protected int calculateBreakPosition(int p0, Token tokenList, float x0) {
+//System.err.println("------ beginning calculateBreakPosition() --------");
+ int p = p0;
+ RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+ float currentWidth = getWidth();
+ if (currentWidth==Integer.MAX_VALUE)
+ currentWidth = getPreferredSpan(X_AXIS);
+ // Make sure width>0; this is a huge hack to fix a bug where
+ // loading text into an RTextArea before it is visible if word wrap
+ // is enabled causes an infinite loop in calculateBreakPosition()
+ // because of the 0-width! We cannot simply check in setSize()
+ // because the width is set to 0 somewhere else too somehow...
+ currentWidth = Math.max(currentWidth, MIN_WIDTH);
+ Token t = tokenList;
+ while (t!=null && t.isPaintable()) {
+// FIXME: Replace the code below with the commented-out line below. This will
+// allow long tokens to be broken at embedded spaces (such as MLC's). But it
+// currently throws BadLocationExceptions sometimes...
+ float tokenWidth = t.getWidth(textArea, this, x0);
+ if (tokenWidth>currentWidth) {
+ // If the current token alone is too long for this line,
+ // break at a character boundary.
+ if (p==p0) {
+ return t.getOffsetBeforeX(textArea, this, 0, currentWidth);
+ }
+ // Return the first non-whitespace char (i.e., don't start
+ // off the continuation of a wrapped line with whitespace).
+ return t.isWhitespace() ? p+t.textCount : p;
+//return getBreakLocation(t, fm, x0, currentWidth, this);
+ }
+ currentWidth -= tokenWidth;
+ x0 += tokenWidth;
+ p += t.textCount;
+//System.err.println("*** *** *** token fit entirely (width==" + tokenWidth + "), adding " + t.textCount + " to p, now p==" + p);
+ t = t.getNextToken();
+ }
+//System.err.println("... ... whole line fits; returning p==" + p);
+//System.err.println("------ ending calculateBreakPosition() --------");
+
+// return p;
+return p + 1;
+ }
+
+//private int getBreakLocation(Token t, FontMetrics fm, int x0, int x,
+// TabExpander e) {
+// Segment s = new Segment();
+// s.array = t.text;
+// s.offset = t.textOffset;
+// s.count = t.textCount;
+// return t.offset + Utilities.getBreakLocation(s, fm, x0, x, e, t.offset);
+//}
+
+ /**
+ * Gives notification from the document that attributes were changed
+ * in a location that this view is responsible for.
+ *
+ * @param e the change information from the associated document
+ * @param a the current allocation of the view
+ * @param f the factory to use to rebuild if the view has children
+ * @see View#changedUpdate
+ */
+ public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+ updateChildren(e, a);
+ }
+
+
+ /**
+ * Sets the allocation rectangle for a given line's view, but sets the
+ * y value to the passed-in value. This should be used instead of
+ * {@link #childAllocation(int, Rectangle)} since it allows you to account
+ * for hidden lines in collapsed fold regions.
+ *
+ * @param line
+ * @param y
+ * @param alloc
+ */
+ private void childAllocation2(int line, int y, Rectangle alloc) {
+ alloc.x += getOffset(X_AXIS, line);
+ alloc.y += y;
+ alloc.width = getSpan(X_AXIS, line);
+ alloc.height = getSpan(Y_AXIS, line);
+
+ // FIXME: This is required due to a bug that I can't track down. The
+ // top margin is being added twice somewhere in wrapped views, so we
+ // have to adjust for it here.
+ alloc.y -= host.getMargin().top;
+
+ }
+
+
+ /**
+ * Draws a single view (i.e., a line of text for a wrapped view),
+ * wrapping the text onto multiple lines if necessary.
+ *
+ * @param painter The painter to use to render tokens.
+ * @param g The graphics context in which to paint.
+ * @param r The rectangle in which to paint.
+ * @param view The <code>View</code> to paint.
+ * @param fontHeight The height of the font being used.
+ * @param y The y-coordinate at which to begin painting.
+ */
+ protected void drawView(TokenPainter painter, Graphics2D g, Rectangle r,
+ View view, int fontHeight, int y) {
+
+ float x = r.x;
+
+ LayeredHighlighter h = (LayeredHighlighter)host.getHighlighter();
+
+ RSyntaxDocument document = (RSyntaxDocument)getDocument();
+ Element map = getElement();
+
+ int p0 = view.getStartOffset();
+ int lineNumber = map.getElementIndex(p0);
+ int p1 = view.getEndOffset();// - 1;
+
+ setSegment(p0,p1-1, document, drawSeg);
+ //System.err.println("drawSeg=='" + drawSeg + "' (p0/p1==" + p0 + "/" + p1 + ")");
+ int start = p0 - drawSeg.offset;
+ Token token = document.getTokenListForLine(lineNumber);
+
+ // If this line is an empty line, then the token list is simply a
+ // null token. In this case, the line highlight will be skipped in
+ // the loop below, so unfortunately we must manually do it here.
+ if (token!=null && token.type==Token.NULL) {
+ h.paintLayeredHighlights(g, p0,p1, r, host, this);
+ return;
+ }
+
+ // Loop through all tokens in this view and paint them!
+ while (token!=null && token.isPaintable()) {
+
+ int p = calculateBreakPosition(p0, token, x);
+ x = r.x;
+
+ h.paintLayeredHighlights(g, p0,p, r, host, this);
+
+ while (token!=null && token.isPaintable() && token.offset+token.textCount-1<p) {//<=p) {
+ x = painter.paint(token, g, x,y, host, this);
+ token = token.getNextToken();
+ }
+
+ if (token!=null && token.isPaintable() && token.offset<p) {
+ int tokenOffset = token.offset;
+ tempToken.set(drawSeg.array, tokenOffset-start, p-1-start,
+ tokenOffset, token.type);
+ painter.paint(tempToken, g, x,y, host, this);
+ token.makeStartAt(p);
+ }
+
+ p0 = (p==p0) ? p1 : p;
+ y += fontHeight;
+
+ } // End of while (token!=null && token.isPaintable()).
+
+ // NOTE: We should re-use code from Token (paintBackground()) here,
+ // but don't because I'm just too lazy.
+ if (host.getEOLMarkersVisible()) {
+ g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+ g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+ g.drawString("\u00B6", x, y-fontHeight);
+ }
+
+ }
+
+
+ /**
+ * Draws a single view (i.e., a line of text for a wrapped view), wrapping
+ * the text onto multiple lines if necessary. Any selected text is
+ * rendered with the editor's "selected text" color.
+ *
+ * @param painter The painter to use to render tokens.
+ * @param g The graphics context in which to paint.
+ * @param r The rectangle in which to paint.
+ * @param view The <code>View</code> to paint.
+ * @param fontHeight The height of the font being used.
+ * @param y The y-coordinate at which to begin painting.
+ * @param selStart The start of the selection.
+ * @param selEnd The end of the selection.
+ */
+ protected void drawViewWithSelection(TokenPainter painter, Graphics2D g,
+ Rectangle r, View view, int fontHeight, int y, int selStart,
+ int selEnd) {
+
+ float x = r.x;
+
+ LayeredHighlighter h = (LayeredHighlighter)host.getHighlighter();
+
+ RSyntaxDocument document = (RSyntaxDocument)getDocument();
+ Element map = getElement();
+
+ int p0 = view.getStartOffset();
+ int lineNumber = map.getElementIndex(p0);
+ int p1 = view.getEndOffset();// - 1;
+
+ setSegment(p0,p1-1, document, drawSeg);
+ //System.err.println("drawSeg=='" + drawSeg + "' (p0/p1==" + p0 + "/" + p1 + ")");
+ int start = p0 - drawSeg.offset;
+ Token token = document.getTokenListForLine(lineNumber);
+
+ // If this line is an empty line, then the token list is simply a
+ // null token. In this case, the line highlight will be skipped in
+ // the loop below, so unfortunately we must manually do it here.
+ if (token!=null && token.type==Token.NULL) {
+ h.paintLayeredHighlights(g, p0,p1, r, host, this);
+ return;
+ }
+
+ // Loop through all tokens in this view and paint them!
+ while (token!=null && token.isPaintable()) {
+
+ int p = calculateBreakPosition(p0, token, x);
+ x = r.x;
+
+ h.paintLayeredHighlights(g, p0,p, r, host, this);
+
+ while (token!=null && token.isPaintable() && token.offset+token.textCount-1<p) {//<=p) {
+
+ // Selection starts in this token
+ if (token.containsPosition(selStart)) {
+
+
+ if (selStart>token.offset) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selStart - tempToken.offset;
+ x = painter.paint(tempToken,g,x,y,host, this);
+ token.makeStartAt(selStart);
+ }
+
+ int selCount = Math.min(token.textCount, selEnd-token.offset);
+ if (selCount==token.textCount) {
+ x = painter.paintSelected(token, g, x,y, host, this);
+ }
+ else {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selCount;
+ x = painter.paintSelected(tempToken, g, x,y, host, this);
+ token.makeStartAt(token.offset + selCount);
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ }
+
+ // Selection ends in this token
+ else if (token.containsPosition(selEnd)) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selEnd - tempToken.offset;
+ x = painter.paintSelected(tempToken, g, x,y, host, this);
+ token.makeStartAt(selEnd);
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ // This token is entirely selected
+ else if (token.offset>=selStart &&
+ (token.offset+token.textCount)<=selEnd) {
+ x = painter.paintSelected(token, g, x,y, host, this);
+ }
+
+ // This token is entirely unselected
+ else {
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ token = token.getNextToken();
+
+ }
+
+ // If there's a token that's going to be split onto the next line
+ if (token!=null && token.isPaintable() && token.offset<p) {
+
+ int tokenOffset = token.offset;
+ Token orig = token;
+ token = new Token(drawSeg, tokenOffset-start, p-1-start,
+ tokenOffset, token.type);
+
+ // Selection starts in this token
+ if (token.containsPosition(selStart)) {
+
+ if (selStart>token.offset) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selStart - tempToken.offset;
+ x = painter.paint(tempToken,g,x,y,host, this);
+ token.makeStartAt(selStart);
+ }
+
+ int selCount = Math.min(token.textCount, selEnd-token.offset);
+ if (selCount==token.textCount) {
+ x = painter.paintSelected(token, g, x,y, host, this);
+ }
+ else {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selCount;
+ x = painter.paintSelected(tempToken, g, x,y, host, this);
+ token.makeStartAt(token.offset + selCount);
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ }
+
+ // Selection ends in this token
+ else if (token.containsPosition(selEnd)) {
+ tempToken.copyFrom(token);
+ tempToken.textCount = selEnd - tempToken.offset;
+ x = painter.paintSelected(tempToken, g, x,y, host, this);
+ token.makeStartAt(selEnd);
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ // This token is entirely selected
+ else if (token.offset>=selStart &&
+ (token.offset+token.textCount)<=selEnd) {
+ x = painter.paintSelected(token, g, x,y, host, this);
+ }
+
+ // This token is entirely unselected
+ else {
+ x = painter.paint(token, g, x,y, host, this);
+ }
+
+ token = orig;
+ token.makeStartAt(p);
+
+ }
+
+ p0 = (p==p0) ? p1 : p;
+ y += fontHeight;
+
+ } // End of while (token!=null && token.isPaintable()).
+
+ // NOTE: We should re-use code from Token (paintBackground()) here,
+ // but don't because I'm just too lazy.
+ if (host.getEOLMarkersVisible()) {
+ g.setColor(host.getForegroundForTokenType(Token.WHITESPACE));
+ g.setFont(host.getFontForTokenType(Token.WHITESPACE));
+ g.drawString("\u00B6", x, y-fontHeight);
+ }
+
+ }
+
+
+ /**
+ * Fetches the allocation for the given child view.<p>
+ * Overridden to account for code folding.
+ *
+ * @param index The index of the child, >= 0 && < getViewCount().
+ * @param a The allocation to this view
+ * @return The allocation to the child; or <code>null</code> if
+ * <code>a</code> is <code>null</code>; or <code>null</code> if the
+ * layout is invalid
+ */
+ public Shape getChildAllocation(int index, Shape a) {
+ if (a != null) {
+ Shape ca = getChildAllocationImpl(index, a);
+ if ((ca != null) && (!isAllocationValid())) {
+ // The child allocation may not have been set yet.
+ Rectangle r = (ca instanceof Rectangle) ? (Rectangle) ca : ca
+ .getBounds();
+ if ((r.width == 0) && (r.height == 0)) {
+ return null;
+ }
+ }
+ return ca;
+ }
+ return null;
+ }
+
+ /**
+ * Fetches the allocation for the given child view to render into.<p>
+ * Overridden to account for lines hidden by collapsed folded regions.
+ *
+ * @param line The index of the child, >= 0 && < getViewCount()
+ * @param a The allocation to this view
+ * @return The allocation to the child
+ */
+ public Shape getChildAllocationImpl(int line, Shape a) {
+
+ Rectangle alloc = getInsideAllocation(a);
+ host = (RSyntaxTextArea)getContainer();
+ FoldManager fm = host.getFoldManager();
+ int y = alloc.y;
+
+ // TODO: Make cached getOffset() calls for Y_AXIS valid even for
+ // folding, to speed this up!
+ for (int i=0; i<line; i++) {
+ y += getSpan(Y_AXIS, i);
+ Fold fold = fm.getFoldForLine(i);
+ if (fold!=null && fold.isCollapsed()) {
+ i += fold.getCollapsedLineCount();
+ }
+ }
+
+ childAllocation2(line, y, alloc);
+ return alloc;
+
+ }
+
+
+ /**
+ * Determines the maximum span for this view along an
+ * axis. This is implemented to provide the superclass
+ * behavior after first making sure that the current font
+ * metrics are cached (for the nested lines which use
+ * the metrics to determine the height of the potentially
+ * wrapped lines).
+ *
+ * @param axis may be either View.X_AXIS or View.Y_AXIS
+ * @return the span the view would like to be rendered into.
+ * Typically the view is told to render into the span
+ * that is returned, although there is no guarantee.
+ * The parent may choose to resize or break the view.
+ * @see View#getMaximumSpan
+ */
+ public float getMaximumSpan(int axis) {
+ updateMetrics();
+ float span = super.getPreferredSpan(axis);
+ if (axis==View.X_AXIS) { // EOL marker
+ span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+ }
+ return span;
+ }
+
+
+ /**
+ * Determines the minimum span for this view along an
+ * axis. This is implemented to provide the superclass
+ * behavior after first making sure that the current font
+ * metrics are cached (for the nested lines which use
+ * the metrics to determine the height of the potentially
+ * wrapped lines).
+ *
+ * @param axis may be either View.X_AXIS or View.Y_AXIS
+ * @return the span the view would like to be rendered into.
+ * Typically the view is told to render into the span
+ * that is returned, although there is no guarantee.
+ * The parent may choose to resize or break the view.
+ * @see View#getMinimumSpan
+ */
+ public float getMinimumSpan(int axis) {
+ updateMetrics();
+ float span = super.getPreferredSpan(axis);
+ if (axis==View.X_AXIS) { // EOL marker
+ span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+ }
+ return span;
+ }
+
+
+ /**
+ * Determines the preferred span for this view along an
+ * axis. This is implemented to provide the superclass
+ * behavior after first making sure that the current font
+ * metrics are cached (for the nested lines which use
+ * the metrics to determine the height of the potentially
+ * wrapped lines).
+ *
+ * @param axis may be either View.X_AXIS or View.Y_AXIS
+ * @return the span the view would like to be rendered into.
+ * Typically the view is told to render into the span
+ * that is returned, although there is no guarantee.
+ * The parent may choose to resize or break the view.
+ * @see View#getPreferredSpan
+ */
+ public float getPreferredSpan(int axis) {
+ updateMetrics();
+ float span = 0;
+ if (axis==View.X_AXIS) { // Add EOL marker
+ span = super.getPreferredSpan(axis);
+ span += metrics.charWidth('\u00b6'); // metrics set in updateMetrics
+ }
+ else {
+ span = super.getPreferredSpan(axis);
+ host = (RSyntaxTextArea)getContainer();
+ if (host.isCodeFoldingEnabled()) {
+ // TODO: Cache y-offsets again to speed this up
+ //System.out.println("y-axis baby");
+ int lineCount = host.getLineCount();
+ FoldManager fm = host.getFoldManager();
+ for (int i=0; i<lineCount; i++) {
+ if (fm.isLineHidden(i)) {
+ span -= getSpan(View.Y_AXIS, i);
+ }
+ }
+ }
+ }
+ return span;
+ }
+
+
+ /**
+ * Returns the tab size set for the document, defaulting to 5.
+ *
+ * @return the tab size
+ */
+ protected int getTabSize() {
+ Integer i = (Integer) getDocument().
+ getProperty(PlainDocument.tabSizeAttribute);
+ int size = (i != null) ? i.intValue() : 5;
+ return size;
+ }
+
+
+ /**
+ * Overridden to allow for folded regions.
+ */
+ protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+
+ int lineCount = getViewCount();
+ int curY = alloc.y + getOffset(Y_AXIS, 0); // Always at least 1 line
+ host = (RSyntaxTextArea)getContainer();
+ FoldManager fm = host.getFoldManager();
+
+ for (int line=1; line<lineCount; line++) {
+ int span = getSpan(Y_AXIS, line-1);
+ if (y<curY+span) {
+ childAllocation2(line-1, curY, alloc);
+ return getView(line-1);
+ }
+ curY += span;
+ Fold fold = fm.getFoldForLine(line-1);
+ if (fold!=null && fold.isCollapsed()) {
+ line += fold.getCollapsedLineCount();
+ }
+ }
+
+ // Not found - return last line's view.
+ childAllocation2(lineCount - 1, curY, alloc);
+ return getView(lineCount - 1);
+
+ }
+
+
+ /**
+ * Gives notification that something was inserted into the
+ * document in a location that this view is responsible for.
+ * This is implemented to simply update the children.
+ *
+ * @param changes The change information from the associated document.
+ * @param a the current allocation of the view
+ * @param f the factory to use to rebuild if the view has children
+ * @see View#insertUpdate
+ */
+ public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+ updateChildren(changes, a);
+ Rectangle alloc = ((a != null) && isAllocationValid()) ?
+ getInsideAllocation(a) : null;
+ int pos = changes.getOffset();
+ View v = getViewAtPosition(pos, alloc);
+ if (v != null)
+ v.insertUpdate(changes, alloc, f);
+ }
+
+
+ /**
+ * Loads all of the children to initialize the view.
+ * This is called by the <code>setParent</code> method.
+ * Subclasses can re-implement this to initialize their
+ * child views in a different manner. The default
+ * implementation creates a child view for each
+ * child element.
+ *
+ * @param f the view factory
+ */
+ protected void loadChildren(ViewFactory f) {
+ Element e = getElement();
+ int n = e.getElementCount();
+ if (n > 0) {
+ View[] added = new View[n];
+ for (int i = 0; i < n; i++)
+ added[i] = new WrappedLine(e.getElement(i));
+ replace(0, 0, added);
+ }
+ }
+
+
+ public Shape modelToView(int pos, Shape a, Position.Bias b)
+ throws BadLocationException {
+
+ if (! isAllocationValid()) {
+ Rectangle alloc = a.getBounds();
+ setSize(alloc.width, alloc.height);
+ }
+
+ boolean isBackward = (b == Position.Bias.Backward);
+ int testPos = (isBackward) ? Math.max(0, pos - 1) : pos;
+ if(isBackward && testPos < getStartOffset()) {
+ return null;
+ }
+
+ int vIndex = getViewIndexAtPosition(testPos);
+ if ((vIndex != -1) && (vIndex < getViewCount())) {
+ View v = getView(vIndex);
+ if(v != null && testPos >= v.getStartOffset() &&
+ testPos < v.getEndOffset()) {
+ Shape childShape = getChildAllocation(vIndex, a);
+ if (childShape == null) {
+ // We are likely invalid, fail.
+ return null;
+ }
+ Shape retShape = v.modelToView(pos, childShape, b);
+ if(retShape == null && v.getEndOffset() == pos) {
+ if(++vIndex < getViewCount()) {
+ v = getView(vIndex);
+ retShape = v.modelToView(pos, getChildAllocation(vIndex, a), b);
+ }
+ }
+ return retShape;
+ }
+ }
+
+ throw new BadLocationException("Position not represented by view", pos);
+
+ }
+
+
+ /**
+ * Provides a mapping, for a given region, from the document model
+ * coordinate space to the view coordinate space. The specified region is
+ * created as a union of the first and last character positions.<p>
+ *
+ * This is implemented to subtract the width of the second character, as
+ * this view's <code>modelToView</code> actually returns the width of the
+ * character instead of "1" or "0" like the View implementations in
+ * <code>javax.swing.text</code>. Thus, if we don't override this method,
+ * the <code>View</code> implementation will return one character's width
+ * too much for its consumers (implementations of
+ * <code>javax.swing.text.Highlighter</code>).
+ *
+ * @param p0 the position of the first character (>=0)
+ * @param b0 The bias of the first character position, toward the previous
+ * character or the next character represented by the offset, in
+ * case the position is a boundary of two views; <code>b0</code>
+ * will have one of these values:
+ * <ul>
+ * <li> <code>Position.Bias.Forward</code>
+ * <li> <code>Position.Bias.Backward</code>
+ * </ul>
+ * @param p1 the position of the last character (>=0)
+ * @param b1 the bias for the second character position, defined
+ * one of the legal values shown above
+ * @param a the area of the view, which encompasses the requested region
+ * @return the bounding box which is a union of the region specified
+ * by the first and last character positions
+ * @exception BadLocationException if the given position does
+ * not represent a valid location in the associated document
+ * @exception IllegalArgumentException if <code>b0</code> or
+ * <code>b1</code> are not one of the
+ * legal <code>Position.Bias</code> values listed above
+ * @see View#viewToModel
+ */
+ public Shape modelToView(int p0, Position.Bias b0,
+ int p1, Position.Bias b1,
+ Shape a) throws BadLocationException {
+
+ Shape s0 = modelToView(p0, a, b0);
+ Shape s1;
+ if (p1 ==getEndOffset()) {
+ try {
+ s1 = modelToView(p1, a, b1);
+ } catch (BadLocationException ble) {
+ s1 = null;
+ }
+ if (s1 == null) {
+ // Assume extends left to right.
+ Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+ a.getBounds();
+ s1 = new Rectangle(alloc.x + alloc.width - 1, alloc.y,
+ 1, alloc.height);
+ }
+ }
+ else {
+ s1 = modelToView(p1, a, b1);
+ }
+ Rectangle r0 = s0.getBounds();
+ Rectangle r1 = (s1 instanceof Rectangle) ? (Rectangle) s1 :
+ s1.getBounds();
+ if (r0.y != r1.y) {
+ // If it spans lines, force it to be the width of the view.
+ Rectangle alloc = (a instanceof Rectangle) ? (Rectangle)a :
+ a.getBounds();
+ r0.x = alloc.x;
+ r0.width = alloc.width;
+ }
+
+ r0.add(r1);
+ // The next line is the only difference between this method and
+ // View's implementation. We're subtracting the width of the second
+ // character. This is because this method is used by Highlighter
+ // implementations to get the area to "highlight", and if we don't do
+ // this, one character too many is highlighted thanks to our
+ // modelToView() implementation returning the actual width of the
+ // character requested!
+ if (p1>p0) r0.width -= r1.width;
+ return r0;
+
+ }
+
+
+ /**
+ * Returns the next tab stop position after a given reference position.
+ * This implementation does not support things like centering so it
+ * ignores the tabOffset argument.
+ *
+ * @param x the current position >= 0
+ * @param tabOffset the position within the text stream
+ * that the tab occurred at >= 0.
+ * @return the tab stop, measured in points >= 0
+ */
+ public float nextTabStop(float x, int tabOffset) {
+ if (tabSize == 0)
+ return x;
+ int ntabs = ((int) x - tabBase) / tabSize;
+ return tabBase + ((ntabs + 1) * tabSize);
+ }
+
+
+ /**
+ * Paints the word-wrapped text.
+ *
+ * @param g The graphics context in which to paint.
+ * @param a The shape (usually a rectangle) in which to paint.
+ */
+ public void paint(Graphics g, Shape a) {
+
+ Rectangle alloc = (a instanceof Rectangle) ?
+ (Rectangle)a : a.getBounds();
+ tabBase = alloc.x;
+
+ Graphics2D g2d = (Graphics2D)g;
+ host = (RSyntaxTextArea)getContainer();
+ int ascent = host.getMaxAscent();
+ int fontHeight = host.getLineHeight();
+ FoldManager fm = host.getFoldManager();
+ TokenPainter painter = host.getTokenPainter();
+ Element root = getElement();
+
+ // Whether token styles should always be painted, even in selections
+ int selStart = host.getSelectionStart();
+ int selEnd = host.getSelectionEnd();
+ boolean useSelectedTextColor = host.getUseSelectedTextColor();
+
+ int n = getViewCount(); // Number of lines.
+ int x = alloc.x + getLeftInset();
+ tempRect.y = alloc.y + getTopInset();
+ Rectangle clip = g.getClipBounds();
+ for (int i = 0; i < n; i++) {
+
+ tempRect.x = x + getOffset(X_AXIS, i);
+ //tempRect.y = y + getOffset(Y_AXIS, i);
+ tempRect.width = getSpan(X_AXIS, i);
+ tempRect.height = getSpan(Y_AXIS, i);
+ //System.err.println("For line " + i + ": tempRect==" + tempRect);
+
+ if (tempRect.intersects(clip)) {
+ Element lineElement = root.getElement(i);
+ int startOffset = lineElement.getStartOffset();
+ int endOffset = lineElement.getEndOffset()-1; // Why always "-1"?
+ View view = getView(i);
+ if (!useSelectedTextColor || selStart==selEnd ||
+ (startOffset>=selEnd || endOffset<selStart)) {
+ drawView(painter, g2d, alloc, view, fontHeight,
+ tempRect.y+ascent);
+ }
+ else {
+ //System.out.println("Drawing line with selection: " + i);
+ drawViewWithSelection(painter, g2d, alloc, view, fontHeight,
+ tempRect.y+ascent, selStart, selEnd);
+ }
+ }
+
+ tempRect.y += tempRect.height;
+
+ Fold possibleFold = fm.getFoldForLine(i);
+ if (possibleFold!=null && possibleFold.isCollapsed()) {
+ i += possibleFold.getCollapsedLineCount();
+ // Visible indicator of collapsed lines
+ Color c = RSyntaxUtilities.getFoldedLineBottomColor(host);
+ if (c!=null) {
+ g.setColor(c);
+ g.drawLine(x,tempRect.y-1, alloc.width,tempRect.y-1);
+ }
+ }
+
+ }
+
+ }
+
+
+ /**
+ * Gives notification that something was removed from the
+ * document in a location that this view is responsible for.
+ * This is implemented to simply update the children.
+ *
+ * @param changes The change information from the associated document.
+ * @param a the current allocation of the view
+ * @param f the factory to use to rebuild if the view has children
+ * @see View#removeUpdate
+ */
+ public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
+
+ updateChildren(changes, a);
+
+ Rectangle alloc = ((a != null) && isAllocationValid()) ?
+ getInsideAllocation(a) : null;
+ int pos = changes.getOffset();
+ View v = getViewAtPosition(pos, alloc);
+ if (v != null)
+ v.removeUpdate(changes, alloc, f);
+
+ }
+
+
+ /**
+ * Makes a <code>Segment</code> point to the text in our
+ * document between the given positions. Note that the positions MUST be
+ * valid positions in the document.
+ *
+ * @param p0 The first position in the document.
+ * @param p1 The second position in the document.
+ * @param document The document from which you want to get the text.
+ * @param seg The segment in which to load the text.
+ */
+ private void setSegment(int p0, int p1, Document document,
+ Segment seg) {
+ try {
+//System.err.println("... in setSharedSegment, p0/p1==" + p0 + "/" + p1);
+ document.getText(p0, p1-p0, seg);
+ //System.err.println("... in setSharedSegment: s=='" + s + "'; line/numLines==" + line + "/" + numLines);
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+ }
+
+
+ /**
+ * Sets the size of the view. This should cause layout of the view along
+ * the given axis, if it has any layout duties.
+ *
+ * @param width the width >= 0
+ * @param height the height >= 0
+ */
+ public void setSize(float width, float height) {
+ updateMetrics();
+ if ((int) width != getWidth()) {
+ // invalidate the view itself since the childrens
+ // desired widths will be based upon this views width.
+ preferenceChanged(null, true, true);
+ widthChanging = true;
+ }
+ super.setSize(width, height);
+ widthChanging = false;
+ }
+
+
+ /**
+ * Update the child views in response to a
+ * document event.
+ */
+ void updateChildren(DocumentEvent e, Shape a) {
+
+ Element elem = getElement();
+ DocumentEvent.ElementChange ec = e.getChange(elem);
+
+ // This occurs when syntax highlighting only changes on lines
+ // (i.e. beginning a multiline comment).
+ if (e.getType()==DocumentEvent.EventType.CHANGE) {
+ //System.err.println("Updating the damage due to a CHANGE event...");
+ // FIXME: Make me repaint more intelligently.
+ getContainer().repaint();
+ //damageLineRange(startLine,endLine, a, host);
+ }
+
+ else if (ec != null) {
+
+ // the structure of this element changed.
+ Element[] removedElems = ec.getChildrenRemoved();
+ Element[] addedElems = ec.getChildrenAdded();
+ View[] added = new View[addedElems.length];
+
+ for (int i = 0; i < addedElems.length; i++)
+ added[i] = new WrappedLine(addedElems[i]);
+ //System.err.println("Replacing " + removedElems.length +
+ // " children with " + addedElems.length);
+ replace(ec.getIndex(), removedElems.length, added);
+
+ // should damge a little more intelligently.
+ if (a != null) {
+ preferenceChanged(null, true, true);
+ getContainer().repaint();
+ }
+
+ }
+
+ // update font metrics which may be used by the child views
+ updateMetrics();
+
+ }
+
+
+ final void updateMetrics() {
+ Component host = getContainer();
+ Font f = host.getFont();
+ metrics = host.getFontMetrics(f); // Metrics for the default font.
+ tabSize = getTabSize() * metrics.charWidth('m');
+ }
+
+
+ public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
+
+ int offs = -1;
+
+ if (! isAllocationValid()) {
+ Rectangle alloc = a.getBounds();
+ setSize(alloc.width, alloc.height);
+ }
+
+ // Get the child view for the line at (x,y), and ask it for the
+ // specific offset.
+ Rectangle alloc = getInsideAllocation(a);
+ View v = getViewAtPoint((int) x, (int) y, alloc);
+ if (v != null) {
+ offs = v.viewToModel(x, y, alloc, bias);
+ }
+
+ // Code folding may have hidden the last line. If so, return the last
+ // visible offset instead of the last offset.
+ if (host.isCodeFoldingEnabled() && v==getView(getViewCount()-1) &&
+ offs==v.getEndOffset()-1) {
+ offs = host.getLastVisibleOffset();
+ }
+
+ return offs;
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int yForLine(Rectangle alloc, int line) throws BadLocationException {
+ return yForLineContaining(alloc,
+ getElement().getElement(line).getStartOffset());
+//return alloc.y + getOffset(Y_AXIS, line);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int yForLineContaining(Rectangle alloc, int offs)
+ throws BadLocationException {
+ if (isAllocationValid()) {
+ // TODO: make cached Y_AXIS offsets valid even with folding enabled
+ // to speed this back up!
+ Rectangle r = (Rectangle)modelToView(offs, alloc, Bias.Forward);
+ if (r!=null) {
+ if (host.isCodeFoldingEnabled()) {
+ int line = host.getLineOfOffset(offs);
+ FoldManager fm = host.getFoldManager();
+ if (fm.isLineHidden(line)) {
+ return -1;
+ }
+ }
+ return r.y;
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Simple view of a line that wraps if it doesn't
+ * fit within the horizontal space allocated.
+ * This class tries to be lightweight by carrying little
+ * state of it's own and sharing the state of the outer class
+ * with it's siblings.
+ */
+ class WrappedLine extends View {
+
+ int nlines;
+
+ WrappedLine(Element elem) {
+ super(elem);
+ }
+
+ /**
+ * Calculate the number of lines that will be rendered
+ * by logical line when it is wrapped.
+ */
+ final int calculateLineCount() {
+
+ int nlines = 0;
+ int startOffset = getStartOffset();
+ int p1 = getEndOffset();
+
+ // Get the token list for this line so we don't have to keep
+ // recomputing it if this logical line spans multiple physical
+ // lines.
+ RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ Element map = doc.getDefaultRootElement();
+ int line = map.getElementIndex(startOffset);
+ Token tokenList = doc.getTokenListForLine(line);
+ float x0 = 0;// FIXME: should be alloc.x!! alloc.x;//0;
+
+
+//System.err.println(">>> calculateLineCount: " + startOffset + "-" + p1);
+ for (int p0=startOffset; p0<p1; ) {
+//System.err.println("... ... " + p0 + ", " + p1);
+ nlines += 1;
+ x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+ WrappedSyntaxView.this, textArea, x0);
+ int p = calculateBreakPosition(p0, tokenList, x0);
+
+//System.err.println("... ... ... break position p==" + p);
+ p0 = (p == p0) ? ++p : p; // this is the fix of #4410243
+ // we check on situation when
+ // width is too small and
+ // break position is calculated
+ // incorrectly.
+//System.err.println("... ... ... new p0==" + p0);
+ }
+/*
+int numLines = 0;
+try {
+ numLines = textArea.getLineCount();
+} catch (BadLocationException ble) {
+ ble.printStackTrace();
+}
+System.err.println(">>> >>> calculated number of lines for this view (line " + line + "/" + numLines + ": " + nlines);
+*/
+ return nlines;
+ }
+
+ /**
+ * Determines the preferred span for this view along an
+ * axis.
+ *
+ * @param axis may be either X_AXIS or Y_AXIS
+ * @return the span the view would like to be rendered into.
+ * Typically the view is told to render into the span
+ * that is returned, although there is no guarantee.
+ * The parent may choose to resize or break the view.
+ * @see View#getPreferredSpan
+ */
+ public float getPreferredSpan(int axis) {
+ switch (axis) {
+ case View.X_AXIS:
+ float width = getWidth();
+ if (width == Integer.MAX_VALUE) {
+ // We have been initially set to MAX_VALUE, but we don't
+ // want this as our preferred.
+ return 100f;
+ }
+ return width;
+ case View.Y_AXIS:
+ if (nlines == 0 || widthChanging)
+ nlines = calculateLineCount();
+ int h = nlines * ((RSyntaxTextArea)getContainer()).getLineHeight();
+ return h;
+ default:
+ throw new IllegalArgumentException("Invalid axis: " + axis);
+ }
+ }
+
+ /**
+ * Renders using the given rendering surface and area on that
+ * surface. The view may need to do layout and create child
+ * views to enable itself to render into the given allocation.
+ *
+ * @param g the rendering surface to use
+ * @param a the allocated region to render into
+ * @see View#paint
+ */
+ public void paint(Graphics g, Shape a) {
+ // This is done by drawView() above.
+ }
+
+ /**
+ * Provides a mapping from the document model coordinate space
+ * to the coordinate space of the view mapped to it.
+ *
+ * @param pos the position to convert
+ * @param a the allocated region to render into
+ * @return the bounding box of the given position is returned
+ * @exception BadLocationException if the given position does not
+ * represent a valid location in the associated document.
+ */
+ public Shape modelToView(int pos, Shape a, Position.Bias b)
+ throws BadLocationException {
+
+ //System.err.println("--- begin modelToView ---");
+ Rectangle alloc = a.getBounds();
+ RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+ alloc.height = textArea.getLineHeight();//metrics.getHeight();
+ alloc.width = 1;
+ int p0 = getStartOffset();
+ int p1 = getEndOffset();
+ int testP = (b == Position.Bias.Forward) ? pos :
+ Math.max(p0, pos - 1);
+
+ // Get the token list for this line so we don't have to keep
+ // recomputing it if this logical line spans multiple physical
+ // lines.
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ Element map = doc.getDefaultRootElement();
+ int line = map.getElementIndex(p0);
+ Token tokenList = doc.getTokenListForLine(line);
+ float x0 = alloc.x;//0;
+
+ while (p0 < p1) {
+ x0 = RSyntaxUtilities.makeTokenListStartAt(tokenList, p0,
+ WrappedSyntaxView.this, textArea, x0);
+ int p = calculateBreakPosition(p0, tokenList, x0);
+ if ((pos >= p0) && (testP<p)) {//pos < p)) {
+ // it's in this line
+ alloc = RSyntaxUtilities.getLineWidthUpTo(
+ textArea, s, p0, pos,
+ WrappedSyntaxView.this,
+ alloc, alloc.x);
+ //System.err.println("--- end modelToView ---");
+ return alloc;
+ }
+ //if (p == p1 && pos == p1) {
+ if (p==p1-1 && pos==p1-1) {
+ // Wants end.
+ if (pos > p0) {
+ alloc = RSyntaxUtilities.getLineWidthUpTo(
+ textArea, s, p0, pos,
+ WrappedSyntaxView.this,
+ alloc, alloc.x);
+ }
+ //System.err.println("--- end modelToView ---");
+ return alloc;
+ }
+
+ p0 = (p == p0) ? p1 : p;
+ //System.err.println("... ... Incrementing y");
+ alloc.y += alloc.height;
+
+ }
+
+ throw new BadLocationException(null, pos);
+
+ }
+
+ /**
+ * Provides a mapping from the view coordinate space to the logical
+ * coordinate space of the model.
+ *
+ * @param fx the X coordinate
+ * @param fy the Y coordinate
+ * @param a the allocated region to render into
+ * @return the location within the model that best represents the
+ * given point in the view
+ * @see View#viewToModel
+ */
+ public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
+
+ // PENDING(prinz) implement bias properly
+ bias[0] = Position.Bias.Forward;
+
+ Rectangle alloc = (Rectangle) a;
+ RSyntaxDocument doc = (RSyntaxDocument)getDocument();
+ int x = (int) fx;
+ int y = (int) fy;
+ if (y < alloc.y) {
+ // above the area covered by this icon, so the the position
+ // is assumed to be the start of the coverage for this view.
+ return getStartOffset();
+ }
+ else if (y > alloc.y + alloc.height) {
+ // below the area covered by this icon, so the the position
+ // is assumed to be the end of the coverage for this view.
+ return getEndOffset() - 1;
+ }
+ else {
+
+ // positioned within the coverage of this view vertically,
+ // so we figure out which line the point corresponds to.
+ // if the line is greater than the number of lines
+ // contained, then simply use the last line as it represents
+ // the last possible place we can position to.
+
+ RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+ alloc.height = textArea.getLineHeight();
+ int p1 = getEndOffset();
+
+ // Get the token list for this line so we don't have to keep
+ // recomputing it if this logical line spans multiple
+ // physical lines.
+ Element map = doc.getDefaultRootElement();
+ int p0 = getStartOffset();
+ int line = map.getElementIndex(p0);
+ Token tlist = doc.getTokenListForLine(line);
+
+ // Look at each physical line-chunk of this logical line.
+ while (p0<p1) {
+
+ // We can always use alloc.x since we always break
+ // lines so they start at the beginning of a physical
+ // line.
+ RSyntaxUtilities.makeTokenListStartAt(tlist, p0,
+ WrappedSyntaxView.this, textArea, alloc.x);
+ int p = calculateBreakPosition(p0, tlist, alloc.x);
+
+ // If desired view position is in this physical chunk.
+ if ((y>=alloc.y) && (y<(alloc.y+alloc.height))) {
+
+ // Point is to the left of the line
+ if (x < alloc.x) {
+ return p0;
+ }
+
+ // Point is to the right of the line
+ else if (x > alloc.x + alloc.width) {
+ return p - 1;
+ }
+
+ // Point is in this physical line!
+ else {
+
+ // Start at alloc.x since this chunk starts
+ // at the beginning of a physical line.
+ int n = tlist.getListOffset(textArea,
+ WrappedSyntaxView.this,
+ alloc.x, x);
+
+ // NOTE: We needed to add the max() with
+ // p0 as getTokenListForLine returns -1
+ // for empty lines (just a null token).
+ // How did this work before?
+ // FIXME: Have null tokens have their
+ // offset but a -1 length.
+ return Math.max(Math.min(n, p1-1), p0);
+
+ } // End of else.
+
+ } // End of if ((y>=alloc.y) && ...
+
+ p0 = (p == p0) ? p1 : p;
+ alloc.y += alloc.height;
+
+ } // End of while (p0<p1).
+
+ return getEndOffset() - 1;
+
+ } // End of else.
+
+ }
+
+ private void handleDocumentEvent(DocumentEvent e, Shape a,
+ ViewFactory f) {
+ int n = calculateLineCount();
+ if (this.nlines != n) {
+ this.nlines = n;
+ WrappedSyntaxView.this.preferenceChanged(this, false, true);
+ // have to repaint any views after the receiver.
+ RSyntaxTextArea textArea = (RSyntaxTextArea)getContainer();
+ textArea.repaint();
+ // Must also revalidate container so gutter components, such
+ // as line numbers, get updated for this line's new height
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ gutter.revalidate();
+ gutter.repaint();
+ }
+ }
+ else if (a != null) {
+ Component c = getContainer();
+ Rectangle alloc = (Rectangle) a;
+ c.repaint(alloc.x, alloc.y, alloc.width, alloc.height);
+ }
+ }
+
+ public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+ handleDocumentEvent(e, a, f);
+ }
+
+ public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) {
+ handleDocumentEvent(e, a, f);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java
new file mode 100644
index 0000000..1910777
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/WrappedSyntaxView2.java
@@ -0,0 +1,157 @@
+package org.fife.ui.rsyntaxtextarea;
+
+//import java.awt.Graphics;
+//import java.awt.Rectangle;
+//import java.awt.Shape;
+
+//import javax.swing.text.CompositeView;
+import javax.swing.text.Element;
+//import javax.swing.text.View;
+
+
+/**
+ * Replacement for the old <code>WrappedSyntaxView</code> class, designed to
+ * be faster with large wrapped documents. Heavily based off of
+ * <code>BoxView</code>, but streamlined to only care about the y-axis, and
+ * takes code folding into account.<p>
+ *
+ * This class is not currently used.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class WrappedSyntaxView2 {//extends CompositeView {
+
+// private Rectangle tempRect;
+// private int[] cachedOffsets;
+// private int[] cachedSpans;
+// private boolean sizeRequirementsValid;
+
+
+ public WrappedSyntaxView2(Element root) {
+ //super(root);
+// tempRect = new Rectangle();
+// cachedOffsets = new int[0];
+// cachedSpans = new int[0];
+// sizeRequirementsValid = false;
+ }
+
+
+// protected void childAllocation(int index, Rectangle alloc) {
+// alloc.y += getOffset(index);
+// alloc.height = getHeight(index);
+// }
+//
+//
+// private int getHeight(int childIndex) {
+// return cachedSpans[childIndex];
+// }
+//
+//
+// private int getOffset(int childIndex) {
+// return cachedOffsets[childIndex];
+// }
+//
+//
+// protected View getViewAtPoint(int x, int y, Rectangle alloc) {
+// // TODO Auto-generated method stub
+// return null;
+// }
+//
+//
+// /**
+// * @param alloc The allocated region; this is the area inside of the insets
+// * @return Whether the point lies after the region.
+// */
+// protected boolean isAfter(int x, int y, Rectangle alloc) {
+// return y > (alloc.y + alloc.height);
+// }
+//
+//
+// /**
+// * @param alloc The allocated region; this is the area inside of the insets
+// * @return Whether the point lies before the region.
+// */
+// protected boolean isBefore(int x, int y, Rectangle alloc) {
+// return y < alloc.y;
+// }
+//
+//
+// public float getPreferredSpan(int axis) {
+// if (axis==X_AXIS) {
+// return preferredWidth + getLeftInset() + getRightInset();
+// }
+// else {
+// return preferredHeight + getTopInset() + getBottomInset();
+// }
+// }
+//
+//
+// public void paint(Graphics g, Shape allocation) {
+//
+// Rectangle alloc = (allocation instanceof Rectangle) ?
+// (Rectangle)allocation : allocation.getBounds();
+// int n = getViewCount();
+//
+// int x = alloc.x + getLeftInset();
+// int y = alloc.y + getTopInset();
+// Rectangle clip = g.getClipBounds();
+// int preferredWidth = (int)getPreferredSpan(X_AXIS);
+//
+// for (int i = 0; i < n; i++) {
+// tempRect.x = x;
+// tempRect.y = y + getOffset(i);
+// tempRect.width = preferredWidth;
+// tempRect.height = getHeight(i);
+// if (tempRect.intersects(clip)) {
+// paintChild(g, tempRect, i);
+// }
+// }
+//
+// }
+//
+//
+// /**
+// * Called when a child view's preferred span changes. This invalidates
+// * our layout cache and calls the super implementation.
+// */
+// public void preferenceChanged(View child, boolean widthPreferenceChanged,
+// boolean heightPreferenceChanged) {
+//
+// if (heightPreferenceChanged) {
+// sizeRequirementsValid = false;
+//// majorAllocValid = false;
+// }
+//// if (width) {
+//// minorReqValid = false;
+//// minorAllocValid = false;
+//// }
+//
+// super.preferenceChanged(child, widthPreferenceChanged, heightPreferenceChanged);
+//
+// }
+//
+// public void replace(int index, int length, View[] elems) {
+//
+// super.replace(index, length, elems);
+//
+// // Invalidate cache
+// int insertCount = elems==null ? 0 : elems.length;
+// cachedOffsets = updateLayoutArray(cachedOffsets, index, insertCount);
+// majorReqValid = false;
+// majorAllocValid = false;
+//
+// }
+//
+//
+// private int[] updateLayoutArray(int[] oldArray, int offset, int nInserted) {
+// int n = getViewCount(); // Called after super.replace() so this is accurate
+// int[] newArray = new int[n];
+// System.arraycopy(oldArray, 0, newArray, 0, offset);
+// System.arraycopy(oldArray, offset,
+// newArray, offset + nInserted, n - nInserted - offset);
+// return newArray;
+// }
+//
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java b/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java
new file mode 100644
index 0000000..b780e83
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/XmlOccurrenceMarker.java
@@ -0,0 +1,185 @@
+/*
+ * 03/09/2013
+ *
+ * XmlOccurrenceMarker - Marks occurrences of the current token for XML.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea;
+
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+
+
+/**
+ * Marks occurrences of the current token for XML.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class XmlOccurrenceMarker implements OccurrenceMarker {
+
+ private static final char[] CLOSE_TAG_START = { '<', '/' };
+ private static final char[] TAG_SELF_CLOSE = { '/', '>' };
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void markOccurrences(RSyntaxDocument doc, Token t,
+ RSyntaxTextAreaHighlighter h, MarkOccurrencesHighlightPainter p) {
+
+ char[] lexeme = t.getLexeme().toCharArray();
+ int tokenOffs = t.offset;
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+ int curLine = root.getElementIndex(t.offset);
+
+ // For now, we only check for tags on the current line, for
+ // simplicity. Tags spanning multiple lines aren't common anyway.
+ boolean found = false;
+ boolean forward = true;
+ t = doc.getTokenListForLine(curLine);
+ while (t!=null && t.isPaintable()) {
+ if (t.type==Token.MARKUP_TAG_DELIMITER) {
+ if (t.isSingleChar('<') && t.offset+1==tokenOffs) {
+ found = true;
+ break;
+ }
+ else if (t.is(CLOSE_TAG_START) && t.offset+2==tokenOffs) {
+ found = true;
+ forward = false;
+ break;
+ }
+ }
+ t = t.getNextToken();
+ }
+
+ if (!found) {
+ return;
+ }
+
+ if (forward) {
+
+ int depth = 0;
+ t = t.getNextToken().getNextToken();
+
+ do {
+
+ while (t!=null && t.isPaintable()) {
+ if (t.type==Token.MARKUP_TAG_DELIMITER) {
+ if (t.isSingleChar('<')) {
+ depth++;
+ }
+ else if (t.is(TAG_SELF_CLOSE)) {
+ if (depth>0) {
+ depth--;
+ }
+ else {
+ return; // No match for this tag
+ }
+ }
+ else if (t.is(CLOSE_TAG_START)) {
+ if (depth>0) {
+ depth--;
+ }
+ else {
+ Token match = t.getNextToken();
+ if (match!=null && match.is(lexeme)) {
+ try {
+ int end = match.offset + match.textCount;
+ h.addMarkedOccurrenceHighlight(match.offset, end, p);
+ end = tokenOffs + match.textCount;
+ h.addMarkedOccurrenceHighlight(tokenOffs, end, p);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ return; // We're done!
+ }
+ }
+ }
+ t = t.getNextToken();
+ }
+
+ if (++curLine<lineCount) {
+ t = doc.getTokenListForLine(curLine);
+ }
+
+ } while (curLine<lineCount);
+
+
+ }
+
+ else { // !forward
+
+ Stack matches = new Stack();
+ boolean inPossibleMatch = false;
+ t = doc.getTokenListForLine(curLine);
+ final int endBefore = tokenOffs - 2; // Stop before "</".
+
+ do {
+
+ while (t!=null && t.offset<endBefore && t.isPaintable()) {
+ if (t.type==Token.MARKUP_TAG_DELIMITER) {
+ if (t.isSingleChar('<')) {
+ Token next = t.getNextToken();
+ if (next!=null) {
+ if (next.is(lexeme)) {
+ matches.push(next);
+ inPossibleMatch = true;
+ }
+ else {
+ inPossibleMatch = false;
+ }
+ t = next;
+ }
+ }
+ else if (t.isSingleChar('>')) {
+ inPossibleMatch = false;
+ }
+ else if (inPossibleMatch && t.is(TAG_SELF_CLOSE)) {
+ matches.pop();
+ }
+ else if (t.is(CLOSE_TAG_START)) {
+ Token next = t.getNextToken();
+ if (next!=null) {
+ // Invalid XML might not have a match
+ if (next.is(lexeme) && !matches.isEmpty()) {
+ matches.pop();
+ }
+ t = next;
+ }
+ }
+ }
+ t = t.getNextToken();
+ }
+
+ if (!matches.isEmpty()) {
+ try {
+ Token match = (Token)matches.pop();
+ int end = match.offset + match.textCount;
+ h.addMarkedOccurrenceHighlight(match.offset, end, p);
+ end = tokenOffs + match.textCount;
+ h.addMarkedOccurrenceHighlight(tokenOffs, end, p);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ return;
+ }
+
+ if (--curLine>=0) {
+ t = doc.getTokenListForLine(curLine);
+ }
+
+ } while (curLine>=0);
+
+
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java
new file mode 100644
index 0000000..da4e6f1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/FocusableTip.java
@@ -0,0 +1,344 @@
+/*
+ * 07/29/2009
+ *
+ * FocusableTip.java - A focusable tool tip, like those in Eclipse.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.net.URL;
+import java.util.ResourceBundle;
+import javax.swing.*;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+
+import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
+
+
+/**
+ * A focusable tool tip, similar to those found in Eclipse. The user
+ * can click in the tip and it becomes a "real," resizable window.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FocusableTip {
+
+ private JTextArea textArea;
+ private TipWindow tipWindow;
+ private URL imageBase;
+ private TextAreaListener textAreaListener;
+ private HyperlinkListener hyperlinkListener;
+ private String lastText;
+
+ /**
+ * The screen bounds in which the mouse has to stay for the currently
+ * displayed tip to stay visible.
+ */
+ private Rectangle tipVisibleBounds;
+
+ /**
+ * Margin from mouse cursor at which to draw focusable tip.
+ */
+ private static final int X_MARGIN = 18;
+
+ /**
+ * Margin from mouse cursor at which to draw focusable tip.
+ */
+ private static final int Y_MARGIN = 12;
+
+ private static final String MSG =
+ "org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip";
+ private static final ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+
+ public FocusableTip(JTextArea textArea, HyperlinkListener listener) {
+ setTextArea(textArea);
+ this.hyperlinkListener = listener;
+ textAreaListener = new TextAreaListener();
+ tipVisibleBounds = new Rectangle();
+ }
+
+
+ /**
+ * Compute the bounds in which the user can move the mouse without the
+ * tip window disappearing.
+ */
+ private void computeTipVisibleBounds() {
+ // Compute area that the mouse can move in without hiding the
+ // tip window. Note that Java 1.4 can only detect mouse events
+ // in Java windows, not globally.
+ Rectangle r = tipWindow.getBounds();
+ Point p = r.getLocation();
+ SwingUtilities.convertPointFromScreen(p, textArea);
+ r.setLocation(p);
+ tipVisibleBounds.setBounds(r.x,r.y-15, r.width,r.height+15*2);
+ }
+
+
+ private void createAndShowTipWindow(final MouseEvent e, final String text) {
+
+ Window owner = SwingUtilities.getWindowAncestor(textArea);
+ tipWindow = new TipWindow(owner, this, text);
+ tipWindow.setHyperlinkListener(hyperlinkListener);
+
+ // Give apps a chance to decorate us with drop shadows, etc.
+ PopupWindowDecorator decorator = PopupWindowDecorator.get();
+ if (decorator!=null) {
+ decorator.decorate(tipWindow);
+ }
+
+ // TODO: Position tip window better (handle RTL, edges of screen, etc.).
+ // Wrap in an invokeLater() to work around a JEditorPane issue where it
+ // doesn't return its proper preferred size until after it is displayed.
+ // See http://forums.sun.com/thread.jspa?forumID=57&threadID=574810
+ // for a discussion.
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+
+ // If a new FocusableTip is requested while another one is
+ // *focused* and visible, the focused tip (i.e. "tipWindow")
+ // will be disposed of. If this Runnable is run after the
+ // dispose(), tipWindow will be null. All of this is done on
+ // the EDT so no synchronization should be necessary.
+ if (tipWindow==null) {
+ return;
+ }
+
+ tipWindow.fixSize();
+ ComponentOrientation o = textArea.getComponentOrientation();
+
+ Point p = e.getPoint();
+ SwingUtilities.convertPointToScreen(p, textArea);
+
+ // Ensure tool tip is in the window bounds.
+ // Multi-monitor support - make sure the completion window (and
+ // description window, if applicable) both fit in the same
+ // window in a multi-monitor environment. To do this, we decide
+ // which monitor the rectangle "p" is in, and use that one.
+ Rectangle sb = TipUtil.getScreenBoundsForPoint(p.x, p.y);
+ //Dimension ss = tipWindow.getToolkit().getScreenSize();
+
+ // Try putting our stuff "below" the mouse first.
+ int y = p.y + Y_MARGIN;
+ if (y+tipWindow.getHeight()>=sb.y+sb.height) {
+ y = p.y - Y_MARGIN - tipWindow.getHeight();
+ }
+
+ // Get x-coordinate of completions. Try to align left edge
+ // with the mouse first (with a slight margin).
+ int x = p.x - X_MARGIN; // ltr
+ if (!o.isLeftToRight()) {
+ x = p.x - tipWindow.getWidth() + X_MARGIN;
+ }
+ if (x<sb.x) {
+ x = sb.x;
+ }
+ else if (x+tipWindow.getWidth()>sb.x+sb.width) { // completions don't fit
+ x = sb.x + sb.width - tipWindow.getWidth();
+ }
+
+ tipWindow.setLocation(x, y);
+ tipWindow.setVisible(true);
+
+ computeTipVisibleBounds(); // Do after tip is visible
+ textAreaListener.install(textArea);
+ lastText = text;
+
+ }
+ });
+
+ }
+
+
+ /**
+ * Returns the base URL to use when loading images in this focusable tip.
+ *
+ * @return The base URL to use.
+ * @see #setImageBase(URL)
+ */
+ public URL getImageBase() {
+ return imageBase;
+ }
+
+
+ /**
+ * Returns localized text for the given key.
+ *
+ * @param key The key into the resource bundle.
+ * @return The localized text.
+ */
+ static String getString(String key) {
+ return msg.getString(key);
+ }
+
+
+ /**
+ * Disposes of the focusable tip currently displayed, if any.
+ */
+ public void possiblyDisposeOfTipWindow() {
+ if (tipWindow != null) {
+ tipWindow.dispose();
+ tipWindow = null;
+ textAreaListener.uninstall();
+ tipVisibleBounds.setBounds(-1, -1, 0, 0);
+ lastText = null;
+ textArea.requestFocus();
+ }
+ }
+
+
+ void removeListeners() {
+ //System.out.println("DEBUG: Removing text area listeners");
+ textAreaListener.uninstall();
+ }
+
+
+ /**
+ * Sets the base URL to use when loading images in this focusable tip.
+ *
+ * @param url The base URL to use.
+ * @see #getImageBase()
+ */
+ public void setImageBase(URL url) {
+ imageBase = url;
+ }
+
+
+ private void setTextArea(JTextArea textArea) {
+ this.textArea = textArea;
+ // Is okay to do multiple times.
+ ToolTipManager.sharedInstance().registerComponent(textArea);
+ }
+
+
+ public void toolTipRequested(MouseEvent e, String text) {
+
+ if (text==null || text.length()==0) {
+ possiblyDisposeOfTipWindow();
+ lastText = text;
+ return;
+ }
+
+ if (lastText==null || text.length()!=lastText.length()
+ || !text.equals(lastText)) {
+ possiblyDisposeOfTipWindow();
+ createAndShowTipWindow(e, text);
+ }
+
+ }
+
+
+ private class TextAreaListener extends MouseInputAdapter implements
+ CaretListener, ComponentListener, FocusListener, KeyListener {
+
+ public void caretUpdate(CaretEvent e) {
+ Object source = e.getSource();
+ if (source == textArea) {
+ possiblyDisposeOfTipWindow();
+ }
+ }
+
+ public void componentHidden(ComponentEvent e) {
+ handleComponentEvent(e);
+ }
+
+ public void componentMoved(ComponentEvent e) {
+ handleComponentEvent(e);
+ }
+
+ public void componentResized(ComponentEvent e) {
+ handleComponentEvent(e);
+ }
+
+ public void componentShown(ComponentEvent e) {
+ handleComponentEvent(e);
+ }
+
+ public void focusGained(FocusEvent e) {
+ }
+
+ public void focusLost(FocusEvent e) {
+ // Only dispose of tip if it wasn't the TipWindow that was clicked
+ // "c" can be null, at least on OS X, so we must check that before
+ // calling SwingUtilities.getWindowAncestor() to guard against an
+ // NPE.
+ Component c = e.getOppositeComponent();
+ boolean tipClicked = (c instanceof TipWindow) ||
+ (c!=null &&
+ SwingUtilities.getWindowAncestor(c) instanceof TipWindow);
+ if (!tipClicked) {
+ possiblyDisposeOfTipWindow();
+ }
+ }
+
+ private void handleComponentEvent(ComponentEvent e) {
+ possiblyDisposeOfTipWindow();
+ }
+
+ public void install(JTextArea textArea) {
+ textArea.addCaretListener(this);
+ textArea.addComponentListener(this);
+ textArea.addFocusListener(this);
+ textArea.addKeyListener(this);
+ textArea.addMouseListener(this);
+ textArea.addMouseMotionListener(this);
+ }
+
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+ possiblyDisposeOfTipWindow();
+ }
+ else if (e.getKeyCode()==KeyEvent.VK_F2) {
+ if (tipWindow!=null && !tipWindow.getFocusableWindowState()) {
+ tipWindow.actionPerformed(null);
+ e.consume(); // Don't do bookmarking stuff
+ }
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+
+ public void keyTyped(KeyEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ // possiblyDisposeOfTipWindow();
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ if (tipVisibleBounds==null ||
+ !tipVisibleBounds.contains(e.getPoint())) {
+ possiblyDisposeOfTipWindow();
+ }
+ }
+
+ public void uninstall() {
+ textArea.removeCaretListener(this);
+ textArea.removeComponentListener(this);
+ textArea.removeFocusListener(this);
+ textArea.removeKeyListener(this);
+ textArea.removeMouseListener(this);
+ textArea.removeMouseMotionListener(this);
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java
new file mode 100644
index 0000000..6c5479e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/SizeGrip.java
@@ -0,0 +1,249 @@
+/*
+ * 12/23/2008
+ *
+ * SizeGrip.java - A size grip component that sits at the bottom of the window,
+ * allowing the user to easily resize that window.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.MouseInputAdapter;
+
+
+/**
+ * A component that allows its parent window to be resizable, similar to the
+ * size grip seen on status bars.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class SizeGrip extends JPanel {
+
+ /**
+ * The size grip to use if we're on OS X.
+ */
+ private Image osxSizeGrip;
+
+
+ public SizeGrip() {
+ MouseHandler adapter = new MouseHandler();
+ addMouseListener(adapter);
+ addMouseMotionListener(adapter);
+ setPreferredSize(new Dimension(16, 16));
+ }
+
+
+ /**
+ * Overridden to ensure that the cursor for this component is appropriate
+ * for the orientation.
+ *
+ * @param o The new orientation.
+ */
+ public void applyComponentOrientation(ComponentOrientation o) {
+ possiblyFixCursor(o.isLeftToRight());
+ super.applyComponentOrientation(o);
+ }
+
+
+ /**
+ * Creates and returns the OS X size grip image.
+ *
+ * @return The OS X size grip.
+ */
+ private Image createOSXSizeGrip() {
+ ClassLoader cl = getClass().getClassLoader();
+ URL url = cl.getResource("org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png");
+ if (url==null) {
+ // We're not running in a jar - we may be debugging in Eclipse,
+ // for example
+ File f = new File("../RSyntaxTextArea/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png");
+ if (f.isFile()) {
+ try {
+ url = f.toURI().toURL();
+ } catch (MalformedURLException mue) { // Never happens
+ mue.printStackTrace();
+ return null;
+ }
+ }
+ else {
+ return null; // Can't find resource or image file
+ }
+ }
+ Image image = null;
+ try {
+ image = ImageIO.read(url);
+ } catch (IOException ioe) { // Never happens
+ ioe.printStackTrace();
+ }
+ return image;
+ }
+
+
+ /**
+ * Paints this panel.
+ *
+ * @param g The graphics context.
+ */
+ protected void paintComponent(Graphics g) {
+
+ super.paintComponent(g);
+
+ Dimension dim = getSize();
+
+ if (osxSizeGrip!=null) {
+ g.drawImage(osxSizeGrip, dim.width-16, dim.height-16, null);
+ return;
+ }
+
+ Color c1 = UIManager.getColor("Label.disabledShadow");
+ Color c2 = UIManager.getColor("Label.disabledForeground");
+ ComponentOrientation orientation = getComponentOrientation();
+
+ if (orientation.isLeftToRight()) {
+ int width = dim.width -= 3;
+ int height = dim.height -= 3;
+ g.setColor(c1);
+ g.fillRect(width-9,height-1, 3,3);
+ g.fillRect(width-5,height-1, 3,3);
+ g.fillRect(width-1,height-1, 3,3);
+ g.fillRect(width-5,height-5, 3,3);
+ g.fillRect(width-1,height-5, 3,3);
+ g.fillRect(width-1,height-9, 3,3);
+ g.setColor(c2);
+ g.fillRect(width-9,height-1, 2,2);
+ g.fillRect(width-5,height-1, 2,2);
+ g.fillRect(width-1,height-1, 2,2);
+ g.fillRect(width-5,height-5, 2,2);
+ g.fillRect(width-1,height-5, 2,2);
+ g.fillRect(width-1,height-9, 2,2);
+ }
+ else {
+ int height = dim.height -= 3;
+ g.setColor(c1);
+ g.fillRect(10,height-1, 3,3);
+ g.fillRect(6,height-1, 3,3);
+ g.fillRect(2,height-1, 3,3);
+ g.fillRect(6,height-5, 3,3);
+ g.fillRect(2,height-5, 3,3);
+ g.fillRect(2,height-9, 3,3);
+ g.setColor(c2);
+ g.fillRect(10,height-1, 2,2);
+ g.fillRect(6,height-1, 2,2);
+ g.fillRect(2,height-1, 2,2);
+ g.fillRect(6,height-5, 2,2);
+ g.fillRect(2,height-5, 2,2);
+ g.fillRect(2,height-9, 2,2);
+ }
+
+ }
+
+
+ /**
+ * Ensures that the cursor for this component is appropriate for the
+ * orientation.
+ *
+ * @param ltr Whether the current component orientation is LTR.
+ */
+ protected void possiblyFixCursor(boolean ltr) {
+ int cursor = Cursor.NE_RESIZE_CURSOR;
+ if (ltr) {
+ cursor = Cursor.NW_RESIZE_CURSOR;
+ }
+ if (cursor!=getCursor().getType()) {
+ setCursor(Cursor.getPredefinedCursor(cursor));
+ }
+ }
+
+
+ public void updateUI() {
+ super.updateUI();
+ // TODO: Key off of Aqua LaF, not just OS X, as this size grip looks
+ // bad on other LaFs on Mac such as Nimbus.
+ if (System.getProperty("os.name").indexOf("OS X")>-1) {
+ if (osxSizeGrip==null) {
+ osxSizeGrip = createOSXSizeGrip();
+ }
+ }
+ else { // Clear memory in case of runtime LaF change.
+ osxSizeGrip = null;
+ }
+
+ }
+
+
+ /**
+ * Listens for mouse events on this panel and resizes the parent window
+ * appropriately.
+ */
+ /*
+ * NOTE: We use SwingUtilities.convertPointToScreen() instead of just using
+ * the locations relative to the corner component because the latter proved
+ * buggy - stretch the window too wide and some kind of arithmetic error
+ * started happening somewhere - our window would grow way too large.
+ */
+ private class MouseHandler extends MouseInputAdapter {
+
+ private Point origPos;
+
+ public void mouseDragged(MouseEvent e) {
+ Point newPos = e.getPoint();
+ SwingUtilities.convertPointToScreen(newPos, SizeGrip.this);
+ int xDelta = newPos.x - origPos.x;
+ int yDelta = newPos.y - origPos.y;
+ Window wind = SwingUtilities.getWindowAncestor(SizeGrip.this);
+ if (wind!=null) { // Should always be true
+ if (getComponentOrientation().isLeftToRight()) {
+ int w = wind.getWidth();
+ if (newPos.x>=wind.getX()) {
+ w += xDelta;
+ }
+ int h = wind.getHeight();
+ if (newPos.y>=wind.getY()) {
+ h += yDelta;
+ }
+ wind.setSize(w,h);
+ }
+ else { // RTL
+ int newW = Math.max(1, wind.getWidth()-xDelta);
+ int newH = Math.max(1, wind.getHeight()+yDelta);
+ wind.setBounds(newPos.x, wind.getY(), newW, newH);
+ }
+ // invalidate()/validate() needed pre-1.6.
+ wind.invalidate();
+ wind.validate();
+ }
+ origPos.setLocation(newPos);
+ }
+
+ public void mousePressed(MouseEvent e) {
+ origPos = e.getPoint();
+ SwingUtilities.convertPointToScreen(origPos, SizeGrip.this);
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ origPos = null;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java
new file mode 100644
index 0000000..c8027ff
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipUtil.java
@@ -0,0 +1,226 @@
+/*
+ * 08/13/2009
+ *
+ * TipUtil.java - Utility methods for homemade tool tips.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Rectangle;
+import java.awt.SystemColor;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.text.html.HTMLDocument;
+
+
+/**
+ * Static utility methods for focusable tips.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TipUtil {
+
+
+ private TipUtil() {
+ }
+
+
+ /**
+ * Returns a hex string for the specified color, suitable for HTML.
+ *
+ * @param c The color.
+ * @return The string representation, in the form "<code>#rrggbb</code>",
+ * or <code>null</code> if <code>c</code> is <code>null</code>.
+ */
+ private static final String getHexString(Color c) {
+
+ if (c==null) {
+ return null;
+ }
+
+ StringBuffer sb = new StringBuffer("#");
+ int r = c.getRed();
+ if (r<16) {
+ sb.append('0');
+ }
+ sb.append(Integer.toHexString(r));
+ int g = c.getGreen();
+ if (g<16) {
+ sb.append('0');
+ }
+ sb.append(Integer.toHexString(g));
+ int b = c.getBlue();
+ if (b<16) {
+ sb.append('0');
+ }
+ sb.append(Integer.toHexString(b));
+
+ return sb.toString();
+
+ }
+
+
+ /**
+ * Returns the screen coordinates for the monitor that contains the
+ * specified point. This is useful for setups with multiple monitors,
+ * to ensure that popup windows are positioned properly.
+ *
+ * @param x The x-coordinate, in screen coordinates.
+ * @param y The y-coordinate, in screen coordinates.
+ * @return The bounds of the monitor that contains the specified point.
+ */
+ public static Rectangle getScreenBoundsForPoint(int x, int y) {
+ GraphicsEnvironment env = GraphicsEnvironment.
+ getLocalGraphicsEnvironment();
+ GraphicsDevice[] devices = env.getScreenDevices();
+ for (int i=0; i<devices.length; i++) {
+ GraphicsConfiguration[] configs = devices[i].getConfigurations();
+ for (int j=0; j<configs.length; j++) {
+ Rectangle gcBounds = configs[j].getBounds();
+ if (gcBounds.contains(x, y)) {
+ return gcBounds;
+ }
+ }
+ }
+ // If point is outside all monitors, default to default monitor (?)
+ return env.getMaximumWindowBounds();
+ }
+
+
+ /**
+ * Returns the default background color to use for tool tip windows.
+ *
+ * @return The default background color.
+ */
+ public static Color getToolTipBackground() {
+
+ Color c = UIManager.getColor("ToolTip.background");
+
+ // Tooltip.background is wrong color on Nimbus (!)
+ boolean isNimbus = isNimbusLookAndFeel();
+ if (c==null || isNimbus) {
+ c = UIManager.getColor("info"); // Used by Nimbus (and others)
+ if (c==null || (isNimbus && isDerivedColor(c))) {
+ c = SystemColor.info; // System default
+ }
+ }
+
+ // Workaround for a bug (?) with Nimbus - calling JLabel.setBackground()
+ // with a ColorUIResource does nothing, must be a normal Color
+ if (c instanceof ColorUIResource) {
+ c = new Color(c.getRGB());
+ }
+
+ return c;
+
+ }
+
+
+ /**
+ * Returns the border used by tool tips in this look and feel.
+ *
+ * @return The border.
+ */
+ public static Border getToolTipBorder() {
+
+ Border border = UIManager.getBorder("ToolTip.border");
+
+ if (border==null || isNimbusLookAndFeel()) {
+ border = UIManager.getBorder("nimbusBorder");
+ if (border==null) {
+ border = BorderFactory.createLineBorder(SystemColor.controlDkShadow);
+ }
+ }
+
+ return border;
+
+ }
+
+
+ /**
+ * Returns whether a color is a Nimbus DerivedColor, which is troublesome
+ * in that it doesn't use its RGB values (uses HSB instead?) and so
+ * querying them is useless.
+ *
+ * @param c The color to check.
+ * @return Whether it is a DerivedColor
+ */
+ private static final boolean isDerivedColor(Color c) {
+ return c!=null && c.getClass().getName().endsWith(".DerivedColor");
+ }
+
+
+ /**
+ * Returns whether the Nimbus Look and Feel is installed.
+ *
+ * @return Whether the current LAF is Nimbus.
+ */
+ private static final boolean isNimbusLookAndFeel() {
+ return UIManager.getLookAndFeel().getName().equals("Nimbus");
+ }
+
+
+ /**
+ * Tweaks a <code>JEditorPane</code> so it can be used to render the
+ * content in a focusable pseudo-tool tip. It is assumed that the editor
+ * pane is using an <code>HTMLDocument</code>.
+ *
+ * @param textArea The editor pane to tweak.
+ */
+ public static void tweakTipEditorPane(JEditorPane textArea) {
+
+ // Jump through a few hoops to get things looking nice in Nimbus
+ boolean isNimbus = isNimbusLookAndFeel();
+ if (isNimbus) {
+ Color selBG = textArea.getSelectionColor();
+ Color selFG = textArea.getSelectedTextColor();
+ textArea.setUI(new javax.swing.plaf.basic.BasicEditorPaneUI());
+ textArea.setSelectedTextColor(selFG);
+ textArea.setSelectionColor(selBG);
+ }
+
+ textArea.setEditable(false); // Required for links to work!
+ textArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+ // Make selection visible even though we are not (initially) focusable.
+ textArea.getCaret().setSelectionVisible(true);
+
+ // Set the foreground color. Important because when rendering HTML,
+ // default foreground becomes black, which may not match all LAF's
+ // (e.g. Substance).
+ Color fg = UIManager.getColor("Label.foreground");
+ if (fg==null || (isNimbus && isDerivedColor(fg))) {
+ fg = SystemColor.textText;
+ }
+ textArea.setForeground(fg);
+
+ // Make it use the "tool tip" background color.
+ textArea.setBackground(TipUtil.getToolTipBackground());
+
+ // Force JEditorPane to use a certain font even in HTML.
+ // All standard LookAndFeels, even Nimbus (!), define Label.font.
+ Font font = UIManager.getFont("Label.font");
+ if (font == null) { // Try to make a sensible default
+ font = new Font("SansSerif", Font.PLAIN, 12);
+ }
+ HTMLDocument doc = (HTMLDocument) textArea.getDocument();
+ doc.getStyleSheet().addRule(
+ "body { font-family: " + font.getFamily() +
+ "; font-size: " + font.getSize() + "pt" +
+ "; color: " + getHexString(fg) + "; }");
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java
new file mode 100644
index 0000000..fa568aa
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/TipWindow.java
@@ -0,0 +1,334 @@
+/*
+ * 07/29/2009
+ *
+ * TipWindow.java - The actual window component representing the tool tip.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.focusabletip;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.BorderFactory;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JWindow;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.html.HTMLDocument;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * The actual tool tip component.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class TipWindow extends JWindow implements ActionListener {
+
+ private FocusableTip ft;
+ private JEditorPane textArea;
+ private String text;
+ private TipListener tipListener;
+ private HyperlinkListener userHyperlinkListener;
+
+ private static TipWindow visibleInstance;
+
+
+ /**
+ * Constructor.
+ *
+ * @param owner The parent window.
+ * @param msg The text of the tool tip. This can be HTML.
+ */
+ public TipWindow(Window owner, FocusableTip ft, String msg) {
+
+ super(owner);
+ this.ft = ft;
+ // Render plain text tool tips correctly.
+ if (msg!=null && msg.length()>=6 &&
+ !msg.substring(0,6).toLowerCase().equals("<html>")) {
+ msg = "<html>" + RSyntaxUtilities.escapeForHtml(msg, "<br>", false);
+ }
+ this.text = msg;
+ tipListener = new TipListener();
+
+ JPanel cp = new JPanel(new BorderLayout());
+ cp.setBorder(TipUtil.getToolTipBorder());
+ cp.setBackground(TipUtil.getToolTipBackground());
+ textArea = new JEditorPane("text/html", text);
+ TipUtil.tweakTipEditorPane(textArea);
+ if (ft.getImageBase()!=null) { // Base URL for images
+ ((HTMLDocument)textArea.getDocument()).setBase(ft.getImageBase());
+ }
+ textArea.addMouseListener(tipListener);
+ textArea.addHyperlinkListener(new HyperlinkListener() {
+ public void hyperlinkUpdate(HyperlinkEvent e) {
+ if (e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
+ TipWindow.this.ft.possiblyDisposeOfTipWindow();
+ }
+ }
+ });
+ cp.add(textArea);
+
+ setFocusableWindowState(false);
+ setContentPane(cp);
+ setBottomPanel(); // Must do after setContentPane()
+ pack();
+
+ // InputMap/ActionMap combo doesn't work for JWindows (even when
+ // using the JWindow's JRootPane), so we'll resort to KeyListener
+ KeyAdapter ka = new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
+ TipWindow.this.ft.possiblyDisposeOfTipWindow();
+ }
+ }
+ };
+ addKeyListener(ka);
+ textArea.addKeyListener(ka);
+
+ // Ensure only 1 TipWindow is ever visible. If the caller does what
+ // they're supposed to and only creates these on the EDT, the
+ // synchronization isn't necessary, but we'll be extra safe.
+ synchronized (TipWindow.class) {
+ if (visibleInstance!=null) {
+ visibleInstance.dispose();
+ }
+ visibleInstance = this;
+ }
+
+ }
+
+
+ public void actionPerformed(ActionEvent e) {
+
+ if (!getFocusableWindowState()) {
+ setFocusableWindowState(true);
+ setBottomPanel();
+ textArea.removeMouseListener(tipListener);
+ pack();
+ addWindowFocusListener(new WindowAdapter() {
+ public void windowLostFocus(WindowEvent e) {
+ ft.possiblyDisposeOfTipWindow();
+ }
+ });
+ ft.removeListeners();
+ if (e==null) { // Didn't get here via our mouseover timer
+ requestFocus();
+ }
+ }
+
+ }
+
+
+ /**
+ * Disposes of this window.
+ */
+ public void dispose() {
+ //System.out.println("[DEBUG]: Disposing...");
+ Container cp = getContentPane();
+ for (int i=0; i<cp.getComponentCount(); i++) {
+ // Okay if listener is already removed
+ cp.getComponent(i).removeMouseListener(tipListener);
+ }
+ ft.removeListeners();
+ super.dispose();
+ }
+
+
+ /**
+ * Workaround for JEditorPane not returning its proper preferred size
+ * when rendering HTML until after layout already done. See
+ * http://forums.sun.com/thread.jspa?forumID=57&threadID=574810 for a
+ * discussion.
+ */
+ void fixSize() {
+
+ Dimension d = textArea.getPreferredSize();
+ Rectangle r = null;
+ try {
+
+ // modelToView call is required for this hack, never remove!
+ r = textArea.modelToView(textArea.getDocument().getLength()-1);
+
+ // Ensure the text area doesn't start out too tall or wide.
+ d = textArea.getPreferredSize();
+ d.width += 25; // Just a little extra space
+ final int MAX_WINDOW_W = 600;
+ d.width = Math.min(d.width, MAX_WINDOW_W);
+ d.height = Math.min(d.height, 400);
+
+ // Both needed for modelToView() calculation below...
+ textArea.setPreferredSize(d);
+ textArea.setSize(d);
+
+ // if the new textArea width causes our text to wrap, we must
+ // compute a new preferred size to get all our physical lines.
+ r = textArea.modelToView(textArea.getDocument().getLength()-1);
+ if (r.y+r.height>d.height) {
+ d.height = r.y + r.height + 5;
+ textArea.setPreferredSize(d);
+ }
+
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+
+ pack(); // Must re-pack to calculate proper size.
+
+ }
+
+
+ public String getText() {
+ return text;
+ }
+
+
+ private void setBottomPanel() {
+
+ final JPanel panel = new JPanel(new BorderLayout());
+ panel.add(new JSeparator(), BorderLayout.NORTH);
+
+ boolean focusable = getFocusableWindowState();
+ if (focusable) {
+ SizeGrip sg = new SizeGrip();
+ sg.applyComponentOrientation(sg.getComponentOrientation()); // Workaround
+ panel.add(sg, BorderLayout.LINE_END);
+ MouseInputAdapter adapter = new MouseInputAdapter() {
+ private Point lastPoint;
+ public void mouseDragged(MouseEvent e) {
+ Point p = e.getPoint();
+ SwingUtilities.convertPointToScreen(p, panel);
+ if (lastPoint==null) {
+ lastPoint = p;
+ }
+ else {
+ int dx = p.x - lastPoint.x;
+ int dy = p.y - lastPoint.y;
+ setLocation(getX()+dx, getY()+dy);
+ lastPoint = p;
+ }
+ }
+ public void mousePressed(MouseEvent e) {
+ lastPoint = e.getPoint();
+ SwingUtilities.convertPointToScreen(lastPoint, panel);
+ }
+ };
+ panel.addMouseListener(adapter);
+ panel.addMouseMotionListener(adapter);
+ // Don't add tipListener to the panel or SizeGrip
+ }
+ else {
+ panel.setOpaque(false);
+ JLabel label = new JLabel(FocusableTip.getString("FocusHotkey"));
+ Color fg = UIManager.getColor("Label.disabledForeground");
+ Font font = textArea.getFont();
+ font = font.deriveFont(font.getSize2D() - 1.0f);
+ label.setFont(font);
+ if (fg==null) { // Non BasicLookAndFeel-derived Looks
+ fg = Color.GRAY;
+ }
+ label.setOpaque(true);
+ Color bg = TipUtil.getToolTipBackground();
+ label.setBackground(bg);
+ label.setForeground(fg);
+ label.setHorizontalAlignment(SwingConstants.TRAILING);
+ label.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
+ panel.add(label);
+ panel.addMouseListener(tipListener);
+ }
+
+ // Replace the previous SOUTH Component with the new one.
+ Container cp = getContentPane();
+ if (cp.getComponentCount()==2) { // Skip first time through
+ Component comp = cp.getComponent(0);
+ cp.remove(0);
+ JScrollPane sp = new JScrollPane(comp);
+ Border emptyBorder = BorderFactory.createEmptyBorder();
+ sp.setBorder(emptyBorder);
+ sp.setViewportBorder(emptyBorder);
+ sp.setBackground(textArea.getBackground());
+ sp.getViewport().setBackground(textArea.getBackground());
+ cp.add(sp);
+ // What was component 1 is now 0.
+ cp.getComponent(0).removeMouseListener(tipListener);
+ cp.remove(0);
+ }
+
+ cp.add(panel, BorderLayout.SOUTH);
+
+ }
+
+
+ /**
+ * Sets the listener for hyperlink events in this tip window.
+ *
+ * @param listener The new listener. The old listener (if any) is
+ * removed. A value of <code>null</code> means "no listener."
+ */
+ public void setHyperlinkListener(HyperlinkListener listener) {
+ // We've added a separate listener, so remove only the user's.
+ if (userHyperlinkListener!=null) {
+ textArea.removeHyperlinkListener(userHyperlinkListener);
+ }
+ userHyperlinkListener = listener;
+ if (userHyperlinkListener!=null) {
+ textArea.addHyperlinkListener(userHyperlinkListener);
+ }
+ }
+
+
+ /**
+ * Listens for events in this window.
+ */
+ private class TipListener extends MouseAdapter {
+
+ public TipListener() {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ actionPerformed(null); // Manually create "real" window
+ }
+
+ public void mouseExited(MouseEvent e) {
+ // Since we registered this listener on the child components of
+ // the JWindow, not the JWindow iteself, we have to be careful.
+ Component source = (Component)e.getSource();
+ Point p = e.getPoint();
+ SwingUtilities.convertPointToScreen(p, source);
+ if (!TipWindow.this.getBounds().contains(p)) {
+ ft.possiblyDisposeOfTipWindow();
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png b/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png
new file mode 100644
index 0000000..07fa8b1
Binary files /dev/null and b/src/org/fife/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png differ
diff --git a/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html b/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html
new file mode 100644
index 0000000..f271f6d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/focusabletip/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ An implementation of a focusable tooltip.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java
new file mode 100644
index 0000000..832121a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/CurlyFoldParser.java
@@ -0,0 +1,317 @@
+/*
+ * 10/08/2011
+ *
+ * CurlyFoldParser.java - Fold parser for languages with C-style syntax.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * A basic fold parser that can be used for languages such as C, that use
+ * curly braces to denote code blocks. This parser searches for curly brace
+ * pairs and creates code folds out of them. It can also optionally find
+ * C-style multi-line comments ("<code>/* ... */</code>") and make them
+ * foldable as well.<p>
+ *
+ * This parser knows nothing about language semantics; it uses
+ * <code>RSyntaxTextArea</code>'s syntax highlighting tokens to identify
+ * curly braces. By default, it looks for single-char tokens of type
+ * {@link Token#SEPARATOR}, with lexemes '<code>{</code>' or '<code>}</code>'.
+ * If your {@link TokenMaker} uses a different token type for curly braces, you
+ * should override the {@link #isLeftCurly(Token)} and
+ * {@link #isRightCurly(Token)} methods with your own definitions. In theory,
+ * you could extend this fold parser to parse languages that use completely
+ * different tokens than curly braces to denote foldable regions by overriding
+ * those two methods.<p>
+ *
+ * Note also that this class may impose somewhat of a performance penalty on
+ * large source files, since it re-parses the entire document each time folds
+ * are reevaluated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class CurlyFoldParser implements FoldParser {
+
+ /**
+ * Whether to scan for C-style multi-line comments and make them foldable.
+ */
+ private boolean foldableMultiLineComments;
+
+ /**
+ * Whether this parser is folding Java.
+ */
+ private final boolean java;
+
+ /**
+ * Used to find import statements when folding Java code.
+ */
+ private static final char[] KEYWORD_IMPORT = "import".toCharArray();
+
+ /**
+ * Ending of a multi-line comment in C, C++, Java, etc.
+ */
+ protected static final char[] C_MLC_END = "*/".toCharArray();
+
+
+ /**
+ * Creates a fold parser that identifies foldable regions via curly braces
+ * as well as C-style multi-line comments.
+ */
+ public CurlyFoldParser() {
+ this(true, false);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param cStyleMultiLineComments Whether to scan for C-style multi-line
+ * comments and make them foldable.
+ * @param java Whether this parser is folding Java. This adds extra
+ * parsing rules, such as grouping all import statements into a
+ * fold section.
+ */
+ public CurlyFoldParser(boolean cStyleMultiLineComments, boolean java) {
+ this.foldableMultiLineComments = cStyleMultiLineComments;
+ this.java = java;
+ }
+
+
+ /**
+ * Returns whether multi-line comments are foldable with this parser.
+ *
+ * @return Whether multi-line comments are foldable.
+ * @see #setFoldableMultiLineComments(boolean)
+ */
+ public boolean getFoldableMultiLineComments() {
+ return foldableMultiLineComments;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ List folds = new ArrayList();
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+ boolean inMLC = false;
+ int mlcStart = 0;
+ int importStartLine = -1;
+ int lastSeenImportLine = -1;
+ int importGroupStartOffs = -1;
+ int importGroupEndOffs = -1;
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ if (getFoldableMultiLineComments() && t.isComment()) {
+
+ // Java-specific stuff
+ if (java) {
+
+ if (importStartLine>-1) {
+ if (lastSeenImportLine>importStartLine) {
+ Fold fold = null;
+ // Any imports found *should* be a top-level fold,
+ // but we're extra lenient here and allow groups
+ // of them anywhere to keep our parser better-behaved
+ // if they have random "imports" throughout code.
+ if (currentFold==null) {
+ fold = new Fold(FoldType.IMPORTS,
+ textArea, importGroupStartOffs);
+ folds.add(fold);
+ }
+ else {
+ fold = currentFold.createChild(FoldType.IMPORTS,
+ importGroupStartOffs);
+ }
+ fold.setEndOffset(importGroupEndOffs);
+ }
+ importStartLine = lastSeenImportLine =
+ importGroupStartOffs = importGroupEndOffs = -1;
+ }
+
+ }
+
+ if (inMLC) {
+ // If we found the end of an MLC that started
+ // on a previous line...
+ if (t.endsWith(C_MLC_END)) {
+ int mlcEnd = t.offset + t.textCount - 1;
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ folds.add(currentFold);
+ currentFold = null;
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ currentFold = currentFold.getParent();
+ }
+ //System.out.println("Ending MLC at: " + mlcEnd + ", parent==" + currentFold);
+ inMLC = false;
+ mlcStart = 0;
+ }
+ // Otherwise, this MLC is continuing on to yet
+ // another line.
+ }
+ else {
+ // If we're an MLC that ends on a later line...
+ if (t.type!=Token.COMMENT_EOL && !t.endsWith(C_MLC_END)) {
+ //System.out.println("Starting MLC at: " + t.offset);
+ inMLC = true;
+ mlcStart = t.offset;
+ }
+ }
+
+ }
+
+ else if (isLeftCurly(t)) {
+
+ // Java-specific stuff
+ if (java) {
+
+ if (importStartLine>-1) {
+ if (lastSeenImportLine>importStartLine) {
+ Fold fold = null;
+ // Any imports found *should* be a top-level fold,
+ // but we're extra lenient here and allow groups
+ // of them anywhere to keep our parser better-behaved
+ // if they have random "imports" throughout code.
+ if (currentFold==null) {
+ fold = new Fold(FoldType.IMPORTS,
+ textArea, importGroupStartOffs);
+ folds.add(fold);
+ }
+ else {
+ fold = currentFold.createChild(FoldType.IMPORTS,
+ importGroupStartOffs);
+ }
+ fold.setEndOffset(importGroupEndOffs);
+ }
+ importStartLine = lastSeenImportLine =
+ importGroupStartOffs = importGroupEndOffs = -1;
+ }
+
+ }
+
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+
+ }
+
+ else if (isRightCurly(t)) {
+
+ if (currentFold!=null) {
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ //System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ if (!currentFold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+ currentFold = parentFold;
+ }
+
+ }
+
+ // Java-specific folding rules
+ else if (java) {
+
+ if (t.is(Token.RESERVED_WORD, KEYWORD_IMPORT)) {
+ if (importStartLine==-1) {
+ importStartLine = line;
+ importGroupStartOffs = t.offset;
+ importGroupEndOffs = t.offset;
+ }
+ lastSeenImportLine = line;
+ }
+
+ else if (importStartLine>-1 &&
+ t.isIdentifier() &&//SEPARATOR &&
+ t.isSingleChar(';')) {
+ importGroupEndOffs = t.offset;
+ }
+
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Should never happen
+ ble.printStackTrace();
+ }
+
+ return folds;
+
+ }
+
+
+ /**
+ * Returns whether the token is a left curly brace. This method exists
+ * so subclasses can provide their own curly brace definition.
+ *
+ * @param t The token.
+ * @return Whether it is a left curly brace.
+ * @see #isRightCurly(Token)
+ */
+ public boolean isLeftCurly(Token t) {
+ return t.isLeftCurly();
+ }
+
+
+ /**
+ * Returns whether the token is a right curly brace. This method exists
+ * so subclasses can provide their own curly brace definition.
+ *
+ * @param t The token.
+ * @return Whether it is a right curly brace.
+ * @see #isLeftCurly(Token)
+ */
+ public boolean isRightCurly(Token t) {
+ return t.isRightCurly();
+ }
+
+
+ /**
+ * Sets whether multi-line comments are foldable with this parser.
+ *
+ * @param foldable Whether multi-line comments are foldable.
+ * @see #getFoldableMultiLineComments()
+ */
+ public void setFoldableMultiLineComments(boolean foldable) {
+ this.foldableMultiLineComments = foldable;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java b/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java
new file mode 100644
index 0000000..b449711
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/Fold.java
@@ -0,0 +1,564 @@
+/*
+ * 10/08/2011
+ *
+ * Fold.java - A foldable region of text in an RSyntaxTextArea instance.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Information about a foldable region.<p>
+ *
+ * A <code>Fold</code> has zero or more children, and <code>Folds</code> thus
+ * form a hierarchical structure, with "parent" folds containing the info about
+ * any "child" folds they contain.<p>
+ *
+ * Fold regions are denoted by a starting and ending offset, but the actual
+ * folding is done on a per-line basis, so <code>Fold</code> instances provide
+ * methods for retrieving both starting and ending offsets and lines. The
+ * starting and ending offsets/lines are "sticky" and correctly track their
+ * positions even as the document is modified.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class Fold implements Comparable {
+
+ private int type;
+ private RSyntaxTextArea textArea;
+ private Position startOffs;
+ private Position endOffs;
+ private Fold parent;
+ private List children;
+ private boolean collapsed;
+ private int childCollapsedLineCount;
+
+ private int lastStartOffs = -1;
+ private int cachedStartLine;
+
+ private int lastEndOffs = -1;
+ private int cachedEndLine;
+
+
+ public Fold(int type, RSyntaxTextArea textArea, int startOffs)
+ throws BadLocationException {
+ this.type = type;
+ this.textArea = textArea;
+ this.startOffs = textArea.getDocument().createPosition(startOffs);
+ }
+
+
+ /**
+ * Creates a fold that is a child of this one.
+ *
+ * @param type The type of fold.
+ * @param startOffs The starting offset of the fold.
+ * @return The child fold.
+ * @throws BadLocationException If <code>startOffs</code> is invalid.
+ * @see FoldType
+ */
+ public Fold createChild(int type, int startOffs) throws BadLocationException {
+ Fold child = new Fold(type, textArea, startOffs);
+ child.parent = this;
+ if (children==null) {
+ children = new ArrayList();
+ }
+ children.add(child);
+ return child;
+ }
+
+
+ /**
+ * Two folds are considered equal if they start at the same offset.
+ *
+ * @param otherFold Another fold to compare this one to.
+ * @return How this fold compares to the other.
+ */
+ public int compareTo(Object otherFold) {
+ int result = -1;
+ if (otherFold instanceof Fold) {
+ result = startOffs.getOffset() - ((Fold)otherFold).startOffs.getOffset();
+ //result = getStartLine() - ((Fold)otherFold).getStartLine();
+ }
+ return result;
+ }
+
+
+ /**
+ * Returns whether the specified line would be hidden in this fold. Since
+ * RSTA displays the "first" line in a fold, this means that the line must
+ * must be between <code>(getStartLine()+1)</code> and
+ * <code>getEndLine()</code>, inclusive.
+ *
+ * @param line The line to check.
+ * @return Whether the line would be hidden if this fold is collapsed.
+ * @see #containsOffset(int)
+ * @see #containsOrStartsOnLine(int)
+ */
+ public boolean containsLine(int line) {
+ return line>getStartLine() && line<=getEndLine();
+ }
+
+
+ /**
+ * Returns whether the given line is in the range
+ * <code>[getStartLine(), getEndLine()]</code>, inclusive.
+ *
+ * @param line The line to check.
+ * @return Whether this fold contains, or starts on, the line.
+ * @see #containsLine(int)
+ */
+ public boolean containsOrStartsOnLine(int line) {
+ return line>=getStartLine() && line<=getEndLine();
+ }
+
+
+ /**
+ * Returns whether the specified offset is "inside" the fold. This method
+ * returns <code>true</code> if the offset is greater than the fold start
+ * offset, and no further than the last offset of the last folded line.
+ *
+ * @param offs The offset to check.
+ * @return Whether the offset is "inside" the fold.
+ * @see #containsLine(int)
+ */
+ public boolean containsOffset(int offs) {
+ boolean contained = false;
+ if (offs>getStartOffset()) {
+ // Use Elements to avoid BadLocationExceptions
+ Element root = textArea.getDocument().getDefaultRootElement();
+ int line = root.getElementIndex(offs);
+ contained = line<=getEndLine();
+ }
+ return contained;
+ }
+
+
+ /**
+ * Two folds are considered equal if they have the same starting offset.
+ *
+ * @param otherFold Another fold to compare this one to.
+ * @return Whether the two folds are equal.
+ * @see #compareTo(Object)
+ */
+ public boolean equals(Object otherFold) {
+ return compareTo(otherFold)==0;
+ }
+
+
+ /**
+ * Returns a specific child fold.
+ *
+ * @param index The index of the child fold.
+ * @return The child fold.
+ * @see #getChildCount()
+ */
+ public Fold getChild(int index) {
+ return (Fold)children.get(index);
+ }
+
+
+ /**
+ * Returns the number of child folds.
+ *
+ * @return The number of child folds.
+ * @see #getChild(int)
+ */
+ public int getChildCount() {
+ return children==null ? 0 : children.size();
+ }
+
+
+ /**
+ * Returns the array of child folds. This is a shallow copy.
+ *
+ * @return The array of child folds, or <code>null</code> if there are
+ * none.
+ */
+ List getChildren() {
+ return children;
+ }
+
+
+ /**
+ * Returns the number of collapsed lines under this fold. If this fold
+ * is collapsed, this method returns {@link #getLineCount()}, otherwise
+ * it returns the sum of all collapsed lines of all child folds of this
+ * one.<p>
+ *
+ * The value returned is cached, so this method returns quickly and
+ * shouldn't affect performance.
+ *
+ * @return The number of collapsed lines under this fold.
+ */
+ public int getCollapsedLineCount() {
+ return collapsed ? getLineCount() : childCollapsedLineCount;
+ }
+
+
+ /**
+ * Returns the "deepest" fold containing the specified offset. It is
+ * assumed that it's already been verified that <code>offs</code> is indeed
+ * contained in this fold.
+ *
+ * @param offs The offset.
+ * @return The fold, or <code>null</code> if no child fold also contains
+ * the offset.
+ * @see FoldManager#getDeepestFoldContaining(int)
+ */
+ Fold getDeepestFoldContaining(int offs) {
+ Fold deepestFold = this;
+ for (int i=0; i<getChildCount(); i++) {
+ Fold fold = getChild(i);
+ if (fold.containsOffset(offs)) {
+ deepestFold = fold.getDeepestFoldContaining(offs);
+ break;
+ }
+ }
+ return deepestFold;
+ }
+
+
+ /**
+ * Returns the "deepest" open fold containing the specified offset. It
+ * is assumed that it's already been verified that <code>offs</code> is
+ * indeed contained in this fold.
+ *
+ * @param offs The offset.
+ * @return The fold, or <code>null</code> if no open fold contains the
+ * offset.
+ * @see FoldManager#getDeepestOpenFoldContaining(int)
+ */
+ Fold getDeepestOpenFoldContaining(int offs) {
+
+ Fold deepestFold = this;
+
+ for (int i=0; i<getChildCount(); i++) {
+ Fold fold = getChild(i);
+ if (fold.containsOffset(offs)) {
+ if (fold.isCollapsed()) {
+ break;
+ }
+ deepestFold = fold.getDeepestOpenFoldContaining(offs);
+ break;
+ }
+ }
+
+ return deepestFold;
+
+ }
+
+
+ /**
+ * Returns the end line of this fold. For example, in languages such as
+ * C and Java, this might be the line containing the closing curly brace of
+ * a code block.<p>
+ *
+ * The value returned by this method will automatically update as the
+ * text area's contents are modified, to track the ending line of the
+ * code block.
+ *
+ * @return The end line of this code block.
+ * @see #getEndOffset()
+ * @see #getStartLine()
+ */
+ public int getEndLine() {
+ int endOffs = getEndOffset();
+ if (lastEndOffs==endOffs) {
+ return cachedEndLine;
+ }
+ lastEndOffs = endOffs;
+ Element root = textArea.getDocument().getDefaultRootElement();
+ return cachedEndLine = root.getElementIndex(endOffs);
+ }
+
+
+ /**
+ * Returns the end offset of this fold. For example, in languages such as
+ * C and Java, this might be the offset of the closing curly brace of a
+ * code block.<p>
+ *
+ * The value returned by this method will automatically update as the
+ * text area's contents are modified, to track the ending offset of the
+ * code block.
+ *
+ * @return The end offset of this code block, or {@link Integer#MAX_VALUE}
+ * if this fold region isn't closed properly. The latter causes
+ * this fold to collapsed all lines through the end of the file.
+ * @see #getEndLine()
+ * @see #getStartOffset()
+ */
+ public int getEndOffset() {
+ return endOffs!=null ? endOffs.getOffset() : Integer.MAX_VALUE;
+ }
+
+
+ /**
+ * Returns the type of fold this is. This will be one of the values in
+ * {@link FoldType}, or a user-defined value.
+ *
+ * @return The type of fold this is.
+ */
+ public int getFoldType() {
+ return type;
+ }
+
+
+ /**
+ * Returns whether this fold has any child folds.
+ *
+ * @return Whether this fold has any children.
+ * @see #getChildCount()
+ */
+ public boolean getHasChildFolds() {
+ return getChildCount()>0;
+ }
+
+
+ /**
+ * Returns the last child fold.
+ *
+ * @return The last child fold, or <code>null</code> if this fold does not
+ * have any children.
+ * @see #getChild(int)
+ * @see #getHasChildFolds()
+ */
+ public Fold getLastChild() {
+ int childCount = getChildCount();
+ return childCount==0 ? null : getChild(childCount-1);
+ }
+
+
+ /**
+ * Returns the number of lines that are hidden when this fold is
+ * collapsed.
+ *
+ * @return The number of lines hidden.
+ * @see #getStartLine()
+ * @see #getEndLine()
+ */
+ public int getLineCount() {
+ return getEndLine() - getStartLine();
+ }
+
+
+ /**
+ * Returns the parent fold of this one.
+ *
+ * @return The parent fold, or <code>null</code> if this is a top-level
+ * fold.
+ */
+ public Fold getParent() {
+ return parent;
+ }
+
+
+ /**
+ * Returns the starting line of this fold region. This is the only line
+ * in the fold region that is not hidden when a fold is collapsed.<p>
+ *
+ * The value returned by this method will automatically update as the
+ * text area's contents are modified, to track the starting line of the
+ * code block.
+ *
+ * @return The starting line of the code block.
+ * @see #getEndLine()
+ * @see #getStartOffset()
+ */
+ public int getStartLine() {
+ int startOffs = getStartOffset();
+ if (lastStartOffs==startOffs) {
+ return cachedStartLine;
+ }
+ lastStartOffs = startOffs;
+ Element root = textArea.getDocument().getDefaultRootElement();
+ return cachedStartLine = root.getElementIndex(startOffs);
+ }
+
+
+ /**
+ * Returns the starting offset of this fold region. For example, for
+ * languages such as C and Java, this would be the offset of the opening
+ * curly brace of a code block.<p>
+ *
+ * The value returned by this method will automatically update as the
+ * text area's contents are modified, to track the starting offset of the
+ * code block.
+ *
+ * @return The start offset of this fold.
+ * @see #getStartLine()
+ * @see #getEndOffset()
+ */
+ public int getStartOffset() {
+ return startOffs.getOffset();
+ }
+
+
+ public int hashCode() {
+ return getStartLine();
+ }
+
+
+ /**
+ * Returns whether this fold is collapsed.
+ *
+ * @return Whether this fold is collapsed.
+ * @see #setCollapsed(boolean)
+ * @see #toggleCollapsedState()
+ */
+ public boolean isCollapsed() {
+ return collapsed;
+ }
+
+
+ /**
+ * Returns whether this fold is entirely on a single line. In general,
+ * a {@link FoldParser} should not remember fold regions all on a single
+ * line, since there's really nothing to fold.
+ *
+ * @return Whether this fold is on a single line.
+ * @see #removeFromParent()
+ */
+ public boolean isOnSingleLine() {
+ return getStartLine()==getEndLine();
+ }
+
+
+ /**
+ * Removes this fold from its parent. This should only be called by
+ * {@link FoldParser} implementations if they determine that a fold is all
+ * on a single line (and thus shouldn't be remembered) after creating it.
+ *
+ * @return Whether this fold had a parent to be removed from.
+ * @see #isOnSingleLine()
+ */
+ public boolean removeFromParent() {
+ if (parent!=null) {
+ parent.removeMostRecentChild();
+ parent = null;
+ return true;
+ }
+ return false;
+ }
+
+
+ private void removeMostRecentChild() {
+ children.remove(children.size()-1);
+ }
+
+
+ /**
+ * Sets whether this <code>Fold</code> is collapsed. Calling this method
+ * will update both the text area and all <code>Gutter</code> components.
+ *
+ * @param collapsed Whether this fold should be collapsed.
+ * @see #isCollapsed()
+ * @see #toggleCollapsedState()
+ */
+ public void setCollapsed(boolean collapsed) {
+
+ if (collapsed!=this.collapsed) {
+
+ // Change our fold state and cached info about folded line count.
+ int lineCount = getLineCount();
+ int linesToCollapse = lineCount - childCollapsedLineCount;
+ if (!collapsed) { // If we're expanding
+ linesToCollapse = -linesToCollapse;
+ }
+ //System.out.println("Hiding lines: " + linesToCollapse +
+ // " (" + lineCount + ", " + linesToCollapse + ")");
+ this.collapsed = collapsed;
+ if (parent!=null) {
+ parent.updateChildCollapsedLineCount(linesToCollapse);
+ }
+
+ // If an end point of the selection is being hidden, move the caret
+ // "out" of the fold.
+ if (collapsed) {
+ int dot = textArea.getSelectionStart(); // Forgive variable name
+ Element root = textArea.getDocument().getDefaultRootElement();
+ int dotLine = root.getElementIndex(dot);
+ boolean updateCaret = containsLine(dotLine);
+ if (!updateCaret) {
+ int mark = textArea.getSelectionEnd();
+ if (mark!=dot) {
+ int markLine = root.getElementIndex(mark);
+ updateCaret = containsLine(markLine);
+ }
+ }
+ if (updateCaret) {
+ dot = root.getElement(getStartLine()).getEndOffset() - 1;
+ textArea.setCaretPosition(dot);
+ }
+ }
+
+ textArea.foldToggled(this);
+
+ }
+
+ }
+
+
+ /**
+ * Sets the ending offset of this fold, such as the closing curly brace
+ * of a code block in C or Java. {@link FoldParser} implementations should
+ * call this on an existing <code>Fold</code> upon finding its end. If
+ * this method isn't called, then this <code>Fold</code> is considered to
+ * have no end, i.e., it will collapse everything to the end of the file.
+ *
+ * @param endOffs The end offset of this fold.
+ * @throws BadLocationException If <code>endOffs</code> is not a valid
+ * location in the text area.
+ */
+ public void setEndOffset(int endOffs) throws BadLocationException {
+ this.endOffs = textArea.getDocument().createPosition(endOffs);
+ }
+
+
+ /**
+ * Toggles the collapsed state of this fold.
+ *
+ * @see #setCollapsed(boolean)
+ */
+ public void toggleCollapsedState() {
+ setCollapsed(!collapsed);
+ }
+
+
+ private void updateChildCollapsedLineCount(int count) {
+ childCollapsedLineCount += count;
+ //if (childCollapsedLineCount>getLineCount()) {
+ // Thread.dumpStack();
+ //}
+ if (!collapsed && parent!=null) {
+ parent.updateChildCollapsedLineCount(count);
+ }
+ }
+
+
+ /**
+ * Overridden for debugging purposes.
+ *
+ * @return A string representation of this <code>Fold</code>.
+ */
+ public String toString() {
+ return "[Fold: " +
+ "startOffs=" + getStartOffset() +
+ ", endOffs=" + getEndOffset() +
+ ", collapsed=" + collapsed +
+ "]";
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java
new file mode 100644
index 0000000..5196d8e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldCollapser.java
@@ -0,0 +1,106 @@
+/*
+ * 10/23/2011
+ *
+ * FoldCollapser.java - Goes through an RSTA instance and collapses folds of
+ * specific types, such as comments.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Collapses folds based on their type. You can create an instance of this
+ * class to collapse all comment blocks when opening a new file, for example.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldCollapser {
+
+ private List typesToCollapse;
+
+
+ /**
+ * Creates an instance that collapses all comment blocks.
+ */
+ public FoldCollapser() {
+ this(FoldType.COMMENT);
+ }
+
+
+ /**
+ * Creates an instance that collapses all blocks of the specified
+ * type.
+ *
+ * @param typeToCollapse The type to collapse.
+ * @see FoldType
+ */
+ public FoldCollapser(int typeToCollapse) {
+ typesToCollapse = new ArrayList();
+ addTypeToCollapse(typeToCollapse);
+ }
+
+
+ /**
+ * Adds a type of fold to collapse.
+ *
+ * @param typeToCollapse The type of fold to collapse.
+ */
+ public void addTypeToCollapse(int typeToCollapse) {
+ typesToCollapse.add(new Integer(typeToCollapse));
+ }
+
+
+ /**
+ * Collapses any relevant folds known by the fold manager.
+ *
+ * @param fm The fold manager.
+ */
+ public void collapseFolds(FoldManager fm) {
+ for (int i=0; i<fm.getFoldCount(); i++) {
+ Fold fold = fm.getFold(i);
+ collapseImpl(fold);
+ }
+ }
+
+
+ /**
+ * Collapses the specified fold, and any of its child folds, as
+ * appropriate.
+ *
+ * @param fold The fold to examine.
+ * @see #getShouldCollapse(Fold)
+ */
+ protected void collapseImpl(Fold fold) {
+ if (getShouldCollapse(fold)) {
+ fold.setCollapsed(true);
+ }
+ for (int i=0; i<fold.getChildCount(); i++) {
+ collapseImpl(fold.getChild(i));
+ }
+ }
+
+
+ /**
+ * Returns whether a specific fold should be collapsed.
+ *
+ * @param fold The fold to examine.
+ * @return Whether the fold should be collapsed.
+ */
+ public boolean getShouldCollapse(Fold fold) {
+ int type = fold.getFoldType();
+ for (int i=0; i<typesToCollapse.size(); i++) {
+ if (type==((Integer)typesToCollapse.get(i)).intValue()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java
new file mode 100644
index 0000000..25129f9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldManager.java
@@ -0,0 +1,710 @@
+/*
+ * 10/08/2011
+ *
+ * FoldManager.java - Manages code folding in an RSyntaxTextArea instance.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.parser.AbstractParser;
+import org.fife.ui.rsyntaxtextarea.parser.DefaultParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.ParseResult;
+import org.fife.ui.rsyntaxtextarea.parser.Parser;
+
+
+/**
+ * Manages code folding in an instance of RSyntaxTextArea.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldManager {
+
+ private RSyntaxTextArea textArea;
+ private FoldParser parser;
+ private List folds;
+ private boolean codeFoldingEnabled;
+ private PropertyChangeSupport support;
+
+
+ /**
+ * Property fired when folds have been updated.
+ */
+ public static final String PROPERTY_FOLDS_UPDATED = "FoldsUpdated";
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The text area whose folds we are managing.
+ */
+ public FoldManager(RSyntaxTextArea textArea) {
+ this.textArea = textArea;
+ support = new PropertyChangeSupport(this);
+ Listener l = new Listener();
+ textArea.getDocument().addDocumentListener(l);
+ textArea.addPropertyChangeListener(RSyntaxTextArea.SYNTAX_STYLE_PROPERTY, l);
+ folds = new ArrayList();
+ updateFoldParser();
+ }
+
+
+ /**
+ * Adds a property change listener to this fold manager.
+ *
+ * @param l The new listener.
+ * @see #removePropertyChangeListener(PropertyChangeListener)
+ */
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ support.addPropertyChangeListener(l);
+ }
+
+
+ /**
+ * Removes all folds.
+ */
+ public void clear() {
+ folds.clear();
+ }
+
+
+ /**
+ * Ensures that the specified offset is not hidden in a collapsed fold.
+ * Any folds containing this offset that are collapsed will be expanded.
+ *
+ * @param offs The offset.
+ * @return Whether any folds had to be opened.
+ * @see #getDeepestFoldContaining(int)
+ */
+ public boolean ensureOffsetNotInClosedFold(int offs) {
+ boolean foldsOpened = false;
+ Fold fold = getDeepestFoldContaining(offs);
+ while (fold!=null) {
+ if (fold.isCollapsed()) {
+ fold.setCollapsed(false);
+ foldsOpened = true;
+ }
+ fold = fold.getParent();
+ }
+ return foldsOpened;
+ }
+
+
+ /**
+ * Returns the "deepest" nested fold containing the specified offset.
+ *
+ * @param offs The offset.
+ * @return The deepest fold containing the offset, or <code>null</code> if
+ * no fold contains the offset.
+ */
+ public Fold getDeepestFoldContaining(int offs) {
+ Fold deepestFold = null;
+ if (offs>-1) {
+ for (int i=0; i<folds.size(); i++) {
+ Fold fold = getFold(i);
+ if (fold.containsOffset(offs)) {
+ deepestFold = fold.getDeepestFoldContaining(offs);
+ break;
+ }
+ }
+ }
+ return deepestFold;
+ }
+
+
+ /**
+ * Returns the "deepest" open fold containing the specified offset.
+ *
+ * @param offs The offset.
+ * @return The fold, or <code>null</code> if no open fold contains the
+ * offset.
+ */
+ public Fold getDeepestOpenFoldContaining(int offs) {
+
+ Fold deepestFold = null;
+
+ if (offs>-1) {
+ for (int i=0; i<folds.size(); i++) {
+ Fold fold = getFold(i);
+ if (fold.containsOffset(offs)) {
+ if (fold.isCollapsed()) {
+ return null;
+ }
+ deepestFold = fold.getDeepestOpenFoldContaining(offs);
+ break;
+ }
+ }
+ }
+
+ return deepestFold;
+
+ }
+
+
+ /**
+ * Returns a specific top-level fold, which may have child folds.
+ *
+ * @param index The index of the fold.
+ * @return The fold.
+ * @see #getFoldCount()
+ */
+ public Fold getFold(int index) {
+ return (Fold)folds.get(index);
+ }
+
+
+ /**
+ * Returns the number of top-level folds.
+ *
+ * @return The number of top-level folds.
+ * @see #getFold(int)
+ */
+ public int getFoldCount() {
+ return folds.size();
+ }
+
+
+ /**
+ * Returns the fold region that starts at the specified line.
+ *
+ * @param line The line number.
+ * @return The fold, or <code>null</code> if the line is not the start
+ * of a fold region.
+ * @see #isFoldStartLine(int)
+ */
+ public Fold getFoldForLine(int line) {
+ return getFoldForLineImpl(null, folds, line);
+ }
+
+
+private Fold getFoldForLineImpl(Fold parent, List folds, int line) {
+
+ int low = 0;
+ int high = folds.size() - 1;
+
+ while (low <= high) {
+ int mid = (low + high) >> 1;
+ Fold midFold = (Fold)folds.get(mid);
+ int startLine = midFold.getStartLine();
+ if (line==startLine) {
+ return midFold;
+ }
+ else if (line<startLine) {
+ high = mid - 1;
+ }
+ else {
+ int endLine = midFold.getEndLine();
+ if (line>=endLine) {
+ low = mid + 1;
+ }
+ else { // line>startLine && line<=endLine
+ List children = midFold.getChildren();
+ return children!=null ? getFoldForLineImpl(midFold, children, line) : null;
+ }
+ }
+ }
+
+ return null; // No fold for this line
+}
+
+
+ /**
+ * Returns the total number of hidden (folded) lines.
+ *
+ * @return The total number of hidden (folded) lines.
+ * @see #getHiddenLineCountAbove(int)
+ */
+ public int getHiddenLineCount() {
+ int count = 0;
+ for (int i=0; i<folds.size(); i++) {
+ count += ((Fold)folds.get(i)).getCollapsedLineCount();
+ }
+ return count;
+ }
+
+
+ /**
+ * Returns the number of lines "hidden" by collapsed folds above the
+ * specified line.
+ *
+ * @param line The line. This is the line number for a logical line.
+ * For the line number of a physical line (i.e. visible, not folded),
+ * use <code>getHiddenLineCountAbove(int, true)</code>.
+ * @return The number of lines hidden in folds above <code>line</code>.
+ * @see #getHiddenLineCountAbove(int, boolean)
+ */
+ public int getHiddenLineCountAbove(int line) {
+ return getHiddenLineCountAbove(line, false);
+ }
+
+
+ /**
+ * Returns the number of lines "hidden" by collapsed folds above the
+ * specified line.
+ *
+ * @param line The line.
+ * @param physical Whether <code>line</code> is the number of a physical
+ * line (i.e. visible, not code-folded), or a logical one (i.e. any
+ * line from the model). If <code>line</code> was determined by a
+ * raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+ * this value should be <code>true</code>. It should be
+ * <code>false</code> when it was calculated from an offset in the
+ * document (for example).
+ * @return The number of lines hidden in folds above <code>line</code>.
+ */
+ public int getHiddenLineCountAbove(int line, boolean physical) {
+
+ int count = 0;
+
+ for (int i=0; i<folds.size(); i++) {
+ Fold fold = (Fold)folds.get(i);
+ int comp = physical ? line+count : line;
+ if (fold.getStartLine()>=comp) {
+ break;
+ }
+ count += getHiddenLineCountAboveImpl(fold, comp, physical);
+ }
+
+ return count;
+
+ }
+
+
+ /**
+ * Returns the number of lines "hidden" by collapsed folds above the
+ * specified line.
+ *
+ * @param fold The current fold in the recursive algorithm. It and its
+ * children are examined.
+ * @param line The line.
+ * @param physical Whether <code>line</code> is the number of a physical
+ * line (i.e. visible, not code-folded), or a logical one (i.e. any
+ * line from the model). If <code>line</code> was determined by a
+ * raw line calculation (i.e. <code>(visibleTopY / lineHeight)</code>),
+ * this value should be <code>true</code>. It should be
+ * <code>false</code> when it was calculated from an offset in the
+ * document (for example).
+ * @return The number of lines hidden in folds that are descendants of
+ * <code>fold</code>, or <code>fold</code> itself, above
+ * <code>line</code>.
+ */
+ private int getHiddenLineCountAboveImpl(Fold fold, int line, boolean physical) {
+
+ int count = 0;
+
+ if (fold.getEndLine()<line ||
+ (fold.isCollapsed() && fold.getStartLine()<line)) {
+ count = fold.getCollapsedLineCount();
+ }
+ else {
+ int childCount = fold.getChildCount();
+ for (int i=0; i<childCount; i++) {
+ Fold child = fold.getChild(i);
+ int comp = physical ? line+count : line;
+ if (child.getStartLine()>=comp) {
+ break;
+ }
+ count += getHiddenLineCountAboveImpl(child, comp, physical);
+ }
+ }
+
+ return count;
+
+ }
+
+
+ /**
+ * Returns the last visible line in the text area, taking into account
+ * folds.
+ *
+ * @return The last visible line.
+ */
+ public int getLastVisibleLine() {
+
+ int lastLine = textArea.getLineCount() - 1;
+
+ if (isCodeFoldingSupportedAndEnabled()) {
+ int foldCount = getFoldCount();
+ if (foldCount>0) {
+ Fold lastFold = getFold(foldCount-1);
+ if (lastFold.containsLine(lastLine)) {
+ if (lastFold.isCollapsed()) {
+ lastLine = lastFold.getStartLine();
+ }
+ else { // Child fold may end on the same line as parent
+ while (lastFold.getHasChildFolds()) {
+ lastFold = lastFold.getLastChild();
+ if (lastFold.containsLine(lastLine)) {
+ if (lastFold.isCollapsed()) {
+ lastLine = lastFold.getStartLine();
+ break;
+ }
+ }
+ else { // Higher up
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return lastLine;
+
+ }
+
+
+ public int getVisibleLineAbove(int line) {
+
+ if (line<=0 || line>=textArea.getLineCount()) {
+ return -1;
+ }
+
+ do {
+ line--;
+ } while (line>=0 && isLineHidden(line));
+
+ return line;
+
+ }
+
+
+ public int getVisibleLineBelow(int line) {
+
+ int lineCount = textArea.getLineCount();
+ if (line<0 || line>=lineCount-1) {
+ return -1;
+ }
+
+ do {
+ line++;
+ } while (line<lineCount && isLineHidden(line));
+
+ return line==lineCount ? -1 : line;
+
+ }
+
+
+// private static int binaryFindFoldContainingLine(int line) {
+//
+//List allFolds;
+//
+// int low = 0;
+// int high = allFolds.size() - 1;
+//
+// while (low <= high) {
+// int mid = (low + high) >> 1;
+// Fold midVal = (Fold)allFolds.get(mid);
+// if (midVal.containsLine(line)) {
+// return mid;
+// }
+// if (line<=midVal.getStartLine()) {
+// high = mid - 1;
+// }
+// else { // line > midVal.getEndLine()
+// low = mid + 1;
+// }
+// }
+//
+// return -(low + 1); // key not found
+//
+// }
+
+
+ /**
+ * Returns whether code folding is enabled. Note that only certain
+ * languages support code folding; those that do not will ignore this
+ * property.
+ *
+ * @return Whether code folding is enabled.
+ * @see #setCodeFoldingEnabled(boolean)
+ */
+ public boolean isCodeFoldingEnabled() {
+ return codeFoldingEnabled;
+ }
+
+
+ /**
+ * Returns <code>true</code> if and only if code folding is enabled for
+ * this text area, AND folding is supported for the language it is editing.
+ * Whether or not folding is supported for a language depends on whether
+ * a fold parser is registered for that language with the
+ * <code>FoldParserManager</code>.
+ *
+ * @return Whether folding is supported and enabled for this text area.
+ * @see FoldParserManager
+ */
+ public boolean isCodeFoldingSupportedAndEnabled() {
+ return codeFoldingEnabled && parser!=null;
+ }
+
+
+ /**
+ * Returns whether the specified line contains the start of a fold region.
+ *
+ * @param line The line.
+ * @return Whether the line contains the start of a fold region.
+ * @see #getFoldForLine(int)
+ */
+ public boolean isFoldStartLine(int line) {
+ return getFoldForLine(line)!=null;
+ }
+
+
+ /**
+ * Returns whether a line is hidden in a collapsed fold.
+ *
+ * @param line The line to check.
+ * @return Whether the line is hidden in a collapsed fold.
+ */
+ public boolean isLineHidden(int line) {
+ for (int i=0; i<folds.size(); i++) {
+ Fold fold = (Fold)folds.get(i);
+ if (fold.containsLine(line)) {
+ if (fold.isCollapsed()) {
+ return true;
+ }
+ else {
+ return isLineHiddenImpl(fold, line);
+ }
+ }
+ }
+ return false;
+ }
+
+
+ private boolean isLineHiddenImpl(Fold parent, int line) {
+ for (int i=0; i<parent.getChildCount(); i++) {
+ Fold child = parent.getChild(i);
+ if (child.containsLine(line)) {
+ if (child.isCollapsed()) {
+ return true;
+ }
+ else {
+ return isLineHiddenImpl(child, line);
+ }
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Checks whether a single fold was there in the "old" set of folds. If
+ * it was, its collapsed state is preserved.
+ *
+ * @param newFold The "new" fold to check for.
+ * @param oldFolds The previous folds before an edit occurred.
+ */
+ private void keepFoldState(Fold newFold, List oldFolds) {
+ int previousLoc = Collections.binarySearch(oldFolds, newFold);
+ //System.out.println(newFold + " => " + previousLoc);
+ if (previousLoc>=0) {
+ Fold prevFold = (Fold)oldFolds.get(previousLoc);
+ newFold.setCollapsed(prevFold.isCollapsed());
+ }
+ else {
+ //previousLoc = -(insertion point) - 1;
+ int insertionPoint = -(previousLoc + 1);
+ if (insertionPoint>0) {
+ Fold possibleParentFold = (Fold)oldFolds.get(insertionPoint-1);
+ if (possibleParentFold.containsOffset(
+ newFold.getStartOffset())) {
+ List children = possibleParentFold.getChildren();
+ if (children!=null) {
+ keepFoldState(newFold, children);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Called when new folds come in from the fold parser. Checks whether any
+ * folds from the "old" fold list are still in the "new" list; if so, their
+ * collapsed state is preserved.
+ *
+ * @param newFolds The "new" folds after an edit occurred. This cannot be
+ * <code>null</code>.
+ * @param oldFolds The previous folds before the edit occurred.
+ */
+ private void keepFoldStates(List newFolds, List oldFolds) {
+ for (int i=0; i<newFolds.size(); i++) {
+ Fold newFold = (Fold)newFolds.get(i);
+ keepFoldState(newFold, folds);
+ List newChildFolds = newFold.getChildren();
+ if (newChildFolds!=null) {
+ keepFoldStates(newChildFolds, oldFolds);
+ }
+ }
+ }
+
+
+ /**
+ * Removes a property change listener from this fold manager.
+ *
+ * @param l The listener to remove.
+ * @see #addPropertyChangeListener(PropertyChangeListener)
+ */
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ support.removePropertyChangeListener(l);
+ }
+
+
+ /**
+ * Forces an immediate reparsing for folds, if folding is enabled. This
+ * usually does not need to be called by the programmer, since fold
+ * parsing is done automatically by RSTA.
+ */
+ public void reparse() {
+
+ if (codeFoldingEnabled && parser!=null) {
+
+ // Re-calculate folds. Keep the fold state of folds that are
+ // still around.
+ List newFolds = parser.getFolds(textArea);
+ if (newFolds==null) {
+ newFolds = Collections.EMPTY_LIST;
+ }
+ else {
+ keepFoldStates(newFolds, folds);
+ }
+ folds = newFolds;
+
+ // Let folks (gutter, etc.) know that folds have been updated.
+ support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, folds);
+ textArea.repaint();
+
+ }
+ else {
+ folds.clear();
+ }
+
+ }
+
+
+ /**
+ * Sets whether code folding is enabled. Note that only certain
+ * languages will support code folding out of the box. Those languages
+ * which do not support folding will ignore this property.
+ *
+ * @param enabled Whether code folding should be enabled.
+ * @see #isCodeFoldingEnabled()
+ */
+ public void setCodeFoldingEnabled(boolean enabled) {
+ if (enabled!=codeFoldingEnabled) {
+ codeFoldingEnabled = enabled;
+ if (tempParser!=null) {
+ textArea.removeParser(tempParser);
+ }
+ if (enabled) {
+ tempParser = new AbstractParser() {
+ public ParseResult parse(RSyntaxDocument doc, String style) {
+ reparse();
+ return new DefaultParseResult(this);
+ }
+ };
+ textArea.addParser(tempParser);
+ support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+ //reparse();
+ }
+ else {
+ folds = Collections.EMPTY_LIST;
+ textArea.repaint();
+ support.firePropertyChange(PROPERTY_FOLDS_UPDATED, null, null);
+ }
+ }
+ }
+private Parser tempParser;
+
+
+ /**
+ * Sets the folds for this fold manager.
+ *
+ * @param folds The new folds. This should not be <code>null</code>.
+ */
+ public void setFolds(List folds) {
+ this.folds = folds;
+ }
+
+
+ /**
+ * Updates the fold parser to be the one appropriate for the language
+ * currently being highlighted.
+ */
+ private void updateFoldParser() {
+ parser = FoldParserManager.get().getFoldParser(
+ textArea.getSyntaxEditingStyle());
+ }
+
+
+ /**
+ * Listens for events in the text editor.
+ */
+ private class Listener implements DocumentListener, PropertyChangeListener {
+
+ public void changedUpdate(DocumentEvent e) {
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ // Adding text containing a newline to the visible line of a folded
+ // Fold causes that Fold to unfold. Check only start offset of
+ // insertion since that's the line that was "modified".
+ int startOffs = e.getOffset();
+ int endOffs = startOffs + e.getLength();
+ Document doc = e.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int startLine = root.getElementIndex(startOffs);
+ int endLine = root.getElementIndex(endOffs);
+ if (startLine!=endLine) { // Inserted text covering > 1 line...
+ Fold fold = getFoldForLine(startLine);
+ if (fold!=null && fold.isCollapsed()) {
+ fold.toggleCollapsedState();
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+ // Syntax style changed in editor.
+ updateFoldParser();
+ reparse(); // Even if no fold parser change, highlighting did
+ }
+ public void removeUpdate(DocumentEvent e) {
+ // Removing text from the visible line of a folded Fold causes that
+ // Fold to unfold. We only need to check the removal offset since
+ // that's the new caret position.
+ int offs = e.getOffset();
+ try {
+ int lastLineModified = textArea.getLineOfOffset(offs);
+ //System.out.println(">>> " + lastLineModified);
+ Fold fold = getFoldForLine(lastLineModified);
+ //System.out.println("&&& " + fold);
+ if (fold!=null && fold.isCollapsed()) {
+ fold.toggleCollapsedState();
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java
new file mode 100644
index 0000000..31d0c51
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParser.java
@@ -0,0 +1,41 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParser.java - Locates folds in an RSyntaxTextArea instance.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.List;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * Locates folds in a document. If you are implementing a language that has
+ * sections of source code that can be logically "folded," you can create an
+ * instance of this interface that locates those regions and represents them
+ * as {@link Fold}s. <code>RSyntaxTextArea</code> knows how to take it from
+ * there and implement code folding in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see CurlyFoldParser
+ * @see XmlFoldParser
+ */
+public interface FoldParser {
+
+
+ /**
+ * Returns a list of all folds in the text area.
+ *
+ * @param textArea The text area whose contents should be analyzed.
+ * @return The list of folds. If this method returns <code>null</code>,
+ * it is treated as if no folds were found.
+ */
+ public List getFolds(RSyntaxTextArea textArea);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java
new file mode 100644
index 0000000..8c1fdf0
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldParserManager.java
@@ -0,0 +1,120 @@
+/*
+ * 10/08/2011
+ *
+ * FoldParserManager.java - Used by RSTA to determine what fold parser to use
+ * for each language it supports.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+
+
+/**
+ * Manages fold parsers. Instances of <code>RSyntaxTextArea</code> call into
+ * this class to retrieve fold parsers for whatever language they're editing.
+ * Folks implementing custom languages can add a {@link FoldParser}
+ * implementation for their language to this manager and it will be used by
+ * RSTA.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldParserManager implements SyntaxConstants {
+
+ /**
+ * Map from syntax styles to fold parsers.
+ */
+ private Map foldParserMap;
+
+ private static final FoldParserManager INSTANCE = new FoldParserManager();
+
+
+ /**
+ * Private constructor to prevent instantiation.
+ */
+ private FoldParserManager() {
+ foldParserMap = createFoldParserMap();
+ }
+
+
+ /**
+ * Adds a mapping from a syntax style to a fold parser. The parser
+ * specified will be shared among all RSTA instances editing that language,
+ * so it should be stateless (which should not be difficult for a fold
+ * parser). You can also override the fold parser for built-in languages,
+ * such as <code>SYNTAX_STYLE_JAVA</code>, with your own parser
+ * implementations.
+ *
+ * @param syntaxStyle The syntax style.
+ * @param parser The parser.
+ * @see SyntaxConstants
+ */
+ public void addFoldParserMapping(String syntaxStyle, FoldParser parser) {
+ foldParserMap.put(syntaxStyle, parser);
+ }
+
+
+ /**
+ * Creates the syntax style-to-fold parser mapping for built-in languages.
+ * @return
+ */
+ private Map createFoldParserMap() {
+
+ Map map = new HashMap();
+
+ map.put(SYNTAX_STYLE_C, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_CPLUSPLUS, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_CSHARP, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_CLOJURE, new LispFoldParser());
+ map.put(SYNTAX_STYLE_CSS, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_GROOVY, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_HTML, new HtmlFoldParser(HtmlFoldParser.LANGUAGE_HTML));
+ map.put(SYNTAX_STYLE_JAVA, new CurlyFoldParser(true, true));
+ map.put(SYNTAX_STYLE_JAVASCRIPT, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_JSON, new JsonFoldParser());
+ map.put(SYNTAX_STYLE_JSP, new HtmlFoldParser(HtmlFoldParser.LANGUAGE_JSP));
+ map.put(SYNTAX_STYLE_LATEX, new LatexFoldParser());
+ map.put(SYNTAX_STYLE_LISP, new LispFoldParser());
+ map.put(SYNTAX_STYLE_MXML, new XmlFoldParser());
+ map.put(SYNTAX_STYLE_NSIS, new NsisFoldParser());
+ map.put(SYNTAX_STYLE_PERL, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_PHP, new HtmlFoldParser(HtmlFoldParser.LANGUAGE_PHP));
+ map.put(SYNTAX_STYLE_SCALA, new CurlyFoldParser());
+ map.put(SYNTAX_STYLE_XML, new XmlFoldParser());
+
+ return map;
+
+ }
+
+
+ /**
+ * Returns the singleton instance of this class.
+ *
+ * @return The singleton instance.
+ */
+ public static FoldParserManager get() {
+ return INSTANCE;
+ }
+
+
+ /**
+ * Returns a fold parser to use for an editor highlighting code of a
+ * specific language.
+ *
+ * @param syntaxStyle A value from {@link SyntaxConstants}, such as
+ * <code>SYNTAX_STYLE_JAVA</code>.
+ * @return A fold parser to use, or <code>null</code> if none is registered
+ * for the language.
+ */
+ public FoldParser getFoldParser(String syntaxStyle) {
+ return (FoldParser)foldParserMap.get(syntaxStyle);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java b/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java
new file mode 100644
index 0000000..6c9873e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/FoldType.java
@@ -0,0 +1,59 @@
+/*
+ * 10/08/2011
+ *
+ * FoldType.java - Types of folds found in many programming languages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+
+/**
+ * Constants representing the "type" of a folded region. Implementations of
+ * {@link FoldParser} can also define their own folded region types, provided
+ * they give them values of at least {@link #FOLD_TYPE_USER_DEFINED_MIN}. This
+ * allows you to identify and auto-fold specific regions of source code when
+ * opening files; for example, a Java editor could identify all import
+ * statements in a file as a foldable region, and give it a user-defined value
+ * for fold type. Then, the UI could provide a means for the user to specify
+ * that they always want the import region folded when opening a new file.<p>
+ *
+ * The majority of the time, however, code editors won't need to be that fancy,
+ * and can simply use the standard <code>CODE</code> and <code>COMMENT</code>
+ * fold types.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Fold
+ */
+public interface FoldType {
+
+ /**
+ * Denotes a <code>Fold</code> as being a region of code.
+ */
+ public static final int CODE = 0;
+
+ /**
+ * Denotes a <code>Fold</code> as being a multi-line comment.
+ */
+ public static final int COMMENT = 1;
+
+ /**
+ * Denotes a <code>Fold</code> as being a section of import statements
+ * (Java), include statements (C), etc.
+ */
+ public static final int IMPORTS = 2;
+
+ /**
+ * Users building advanced editors such as IDE's, that want to allow their
+ * users to auto-expand/collapse foldable regions of a specific type other
+ * than comments, should define their custom fold types using values
+ * <code>FOLD_TYPE_USER_DEFINED_MIN + <em>n</em></code>. That way, if
+ * new default fold types are added to this interface in the future, your
+ * code won't suddenly break when upgrading to a new version of RSTA.
+ */
+ public static final int FOLD_TYPE_USER_DEFINED_MIN = 1000;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java
new file mode 100644
index 0000000..c3bef17
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/HtmlFoldParser.java
@@ -0,0 +1,402 @@
+/*
+ * 09/30/2012
+ *
+ * HtmlFoldParser.java - Fold parser for HTML 5 and PHP.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for HTML 5, PHP and JSP. For HTML, we currently don't fold
+ * <em>everything</em> possible, just the "big" stuff. For PHP, we only fold
+ * the "big" HTML stuff and PHP regions, not code blocks in the actual PHP.
+ * For JSP we only fold the "big" HTML stuff and JSP blocks, not anything in
+ * the actual Java code.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class HtmlFoldParser implements FoldParser {
+
+ /**
+ * Constant denoting we're folding HTML.
+ */
+ public static final int LANGUAGE_HTML = -1;
+
+ /**
+ * Constant denoting we're folding PHP.
+ */
+ public static final int LANGUAGE_PHP = 0;
+
+ /**
+ * Constant denoting we're folding JSP.
+ */
+ public static final int LANGUAGE_JSP = 1;
+
+ /**
+ * The language we're folding.
+ */
+ private final int language;
+
+ /**
+ * The set of tags we allow to be folded. These are tags that must have
+ * explicit close tags in both HTML 4 and HTML 5.
+ */
+ private static final Set FOLDABLE_TAGS;
+
+ private static final char[] MARKUP_CLOSING_TAG_START = "</".toCharArray();
+ //private static final char[] MARKUP_SHORT_TAG_END = "/>".toCharArray();
+ private static final char[] MLC_START = "<!--".toCharArray();
+ private static final char[] MLC_END = "-->".toCharArray();
+
+ private static final char[] PHP_START = "<?".toCharArray(); // <? and <?php
+ private static final char[] PHP_END = "?>".toCharArray();
+
+ // Scriptlets, declarations, and expressions all start the same way.
+ private static final char[] JSP_START = "<%".toCharArray();
+ private static final char[] JSP_END = "%>".toCharArray();
+
+ private static final char[][] LANG_START = { PHP_START, JSP_START };
+ private static final char[][] LANG_END = { PHP_END, JSP_END };
+
+ private static final char[] JSP_COMMENT_START = "<%--".toCharArray();
+ private static final char[] JSP_COMMENT_END = "--%>".toCharArray();
+
+ static {
+ FOLDABLE_TAGS = new HashSet();
+ FOLDABLE_TAGS.add("body");
+ FOLDABLE_TAGS.add("canvas");
+ FOLDABLE_TAGS.add("div");
+ FOLDABLE_TAGS.add("form");
+ FOLDABLE_TAGS.add("head");
+ FOLDABLE_TAGS.add("html");
+ FOLDABLE_TAGS.add("ol");
+ FOLDABLE_TAGS.add("pre");
+ FOLDABLE_TAGS.add("script");
+ FOLDABLE_TAGS.add("span");
+ FOLDABLE_TAGS.add("style");
+ FOLDABLE_TAGS.add("table");
+ FOLDABLE_TAGS.add("tfoot");
+ FOLDABLE_TAGS.add("thead");
+ FOLDABLE_TAGS.add("tr");
+ FOLDABLE_TAGS.add("td");
+ FOLDABLE_TAGS.add("ul");
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param language The language to fold, such as {@link #LANGUAGE_PHP}.
+ */
+ public HtmlFoldParser(int language) {
+ if (language<LANGUAGE_HTML && language>LANGUAGE_JSP) {
+ throw new IllegalArgumentException("Invalid language: " + language);
+ }
+ this.language = language;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ List folds = new ArrayList();
+ Stack tagNameStack = new Stack();
+ boolean inSublanguage = false;
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+ boolean inMLC = false;
+ boolean inJSMLC = false;
+ TagCloseInfo tci = new TagCloseInfo();
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ // If we're folding PHP. Note that PHP folding can only be
+ // "one level deep," so our logic here is simple.
+ if (language>=0 && t.type==Token.SEPARATOR) {
+
+ // <?, <?php, <%, <%!, ...
+ if (t.startsWith(LANG_START[language])) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ inSublanguage = true;
+ }
+
+ // ?> or %>
+ else if (t.startsWith(LANG_END[language])) {
+ int phpEnd = t.offset + t.textCount - 1;
+ currentFold.setEndOffset(phpEnd);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ removeFold(currentFold, folds);
+ }
+ currentFold = parentFold;
+ inSublanguage = false;
+ t = t.getNextToken();
+ continue;
+ }
+
+ }
+
+ if (!inSublanguage) {
+
+ if (t.type==Token.COMMENT_MULTILINE) {
+
+ // Continuing an MLC from a previous line
+ if (inMLC) {
+ // Found the end of the MLC starting on a previous line...
+ if (t.endsWith(MLC_END)) {
+ int mlcEnd = t.offset + t.textCount - 1;
+ currentFold.setEndOffset(mlcEnd);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ removeFold(currentFold, folds);
+ }
+ currentFold = parentFold;
+ inMLC = false;
+ }
+ // Otherwise, this MLC is continuing on to yet
+ // another line.
+ }
+
+ // Continuing a JS MLC from a previous line
+ else if (inJSMLC) {
+ // Found the end of the MLC starting on a previous line...
+ if (t.endsWith(JSP_COMMENT_END)) {
+ int mlcEnd = t.offset + t.textCount - 1;
+ currentFold.setEndOffset(mlcEnd);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ removeFold(currentFold, folds);
+ }
+ currentFold = parentFold;
+ inJSMLC = false;
+ }
+ // Otherwise, this MLC is continuing on to yet
+ // another line.
+ }
+
+ // Starting a MLC that ends on a later line...
+ else if (t.startsWith(MLC_START) && !t.endsWith(MLC_END)) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.COMMENT, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.COMMENT, t.offset);
+ }
+ inMLC = true;
+ }
+
+ // Starting a JSP comment that ends on a later line...
+ else if (language==LANGUAGE_JSP &&
+ t.startsWith(JSP_COMMENT_START) &&
+ !t.endsWith(JSP_COMMENT_END)) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.COMMENT, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.COMMENT, t.offset);
+ }
+ inJSMLC = true;
+ }
+
+ }
+
+ // If we're starting a new tag...
+ else if (t.isSingleChar(Token.MARKUP_TAG_DELIMITER, '<')) {
+ Token tagStartToken = t;
+ Token tagNameToken = t.getNextToken();
+ if (isFoldableTag(tagNameToken)) {
+ getTagCloseInfo(tagNameToken, textArea, line, tci);
+ if (tci.line==-1) { // EOF reached before end of tag
+ return folds;
+ }
+ // We have found either ">" or "/>" with tci.
+ Token tagCloseToken = tci.closeToken;
+ if (tagCloseToken.isSingleChar(Token.MARKUP_TAG_DELIMITER, '>')) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, tagStartToken.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, tagStartToken.offset);
+ }
+ tagNameStack.push(tagNameToken.getLexeme());
+ }
+ t = tagCloseToken; // Continue parsing after tag
+ }
+ }
+
+ // If we've found a closing tag (e.g. "</div>").
+ else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_CLOSING_TAG_START)) {
+ if (currentFold!=null) {
+ Token tagNameToken = t.getNextToken();
+ if (isFoldableTag(tagNameToken) &&
+ isEndOfLastFold(tagNameStack, tagNameToken)) {
+ tagNameStack.pop();
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ removeFold(currentFold, folds);
+ }
+ currentFold = parentFold;
+ t = tagNameToken;
+ }
+ }
+ }
+
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Should never happen
+ ble.printStackTrace();
+ }
+
+ return folds;
+
+ }
+
+
+ /**
+ * Grabs the token representing the closing of a tag (i.e.
+ * "<code>></code>" or "<code>/></code>"). This should only be
+ * called after a tag name has been parsed, to ensure the "closing" of
+ * other tags is not identified.
+ *
+ * @param tagNameToken The token denoting the name of the tag.
+ * @param textArea The text area whose contents are being parsed.
+ * @param line The line we're currently on.
+ * @param info On return, information about the closing of the tag is
+ * returned in this object.
+ */
+ private void getTagCloseInfo(Token tagNameToken, RSyntaxTextArea textArea,
+ int line, TagCloseInfo info) {
+
+ info.reset();
+ Token t = tagNameToken.getNextToken();
+
+ do {
+
+ while (t!=null && t.type!=Token.MARKUP_TAG_DELIMITER) {
+ t = t.getNextToken();
+ }
+
+ if (t!=null) {
+ info.closeToken = t;
+ info.line = line;
+ break;
+ }
+
+ } while (++line<textArea.getLineCount() &&
+ (t=textArea.getTokenListForLine(line))!=null);
+
+ }
+
+
+ /**
+ * Returns whether a closing tag ("<code></...></code>") with a
+ * specific name is the closing tag of our current fold region.
+ *
+ * @param tagNameStack The stack of fold regions.
+ * @param tagNameToken The tag name of the most recently parsed closing
+ * tag.
+ * @return Whether it's the end of the current fold region.
+ */
+ private static final boolean isEndOfLastFold(Stack tagNameStack,
+ Token tagNameToken) {
+ if (tagNameToken!=null && !tagNameStack.isEmpty()) {
+ return tagNameToken.getLexeme().equalsIgnoreCase((String)tagNameStack.peek());
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether a tag is one we allow as a foldable region.
+ *
+ * @param tagNameToken The tag's name token. This may be <code>null</code>.
+ * @return Whether this tag can be a foldable region.
+ */
+ private static final boolean isFoldableTag(Token tagNameToken) {
+ return tagNameToken!=null &&
+ FOLDABLE_TAGS.contains(tagNameToken.getLexeme().toLowerCase());
+ }
+
+
+ /**
+ * If this fold has a parent fold, this method removes it from its parent.
+ * Otherwise, it's assumed to be the most recent (top-level) fold in the
+ * <code>folds</code> list, and is removed from that.
+ *
+ * @param fold The fold to remove.
+ * @param folds The list of top-level folds.
+ */
+ private static final void removeFold(Fold fold, List folds) {
+ if (!fold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+
+
+ /**
+ * A simple wrapper for the token denoting the closing of a tag (i.e.
+ * "<code>></code>" or "<code>/></code>").
+ */
+ private static class TagCloseInfo {
+
+ private Token closeToken;
+ private int line;
+
+ public void reset() {
+ closeToken = null;
+ line = -1;
+ }
+
+ public String toString() {
+ return "[TagCloseInfo: " +
+ "closeToken=" + closeToken +
+ ", line=" + line +
+ "]";
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java
new file mode 100644
index 0000000..a08a298
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/JsonFoldParser.java
@@ -0,0 +1,161 @@
+/*
+ * 12/23/2012
+ *
+ * JsonFoldParser.java - Fold parser for JSON.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenTypes;
+
+
+/**
+ * The fold parser for JSON. Objects (<code>"{ ... }</code>") and arrays
+ * (<code>"[ ... ]"</code>) that span multiple lines are considered fold
+ * regions.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class JsonFoldParser implements FoldParser {
+
+ private static final Object OBJECT_BLOCK = new Object();
+ private static final Object ARRAY_BLOCK = new Object();
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ Stack blocks = new Stack();
+ List folds = new ArrayList();
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ if (t.isLeftCurly()) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ blocks.push(OBJECT_BLOCK);
+ }
+
+ else if (t.isRightCurly() && popOffTop(blocks, OBJECT_BLOCK)) {
+ if (currentFold!=null) {
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ //System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ if (!currentFold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+ currentFold = parentFold;
+ }
+ }
+
+ else if (isLeftBracket(t)) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ blocks.push(ARRAY_BLOCK);
+ }
+
+ else if (isRightBracket(t) && popOffTop(blocks, ARRAY_BLOCK)) {
+ if (currentFold!=null) {
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ //System.out.println("... Adding regular fold at " + t.offset + ", parent==" + parentFold);
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ if (!currentFold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+ currentFold = parentFold;
+ }
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Should never happen
+ ble.printStackTrace();
+ }
+
+ return folds;
+
+ }
+
+
+ /**
+ * Returns whether a token is the left bracket token.
+ *
+ * @param t The token.
+ * @return Whether the token is the left bracket token.
+ * @see #isRightBracket(Token)
+ */
+ private static final boolean isLeftBracket(Token t) {
+ return t.type==TokenTypes.SEPARATOR && t.isSingleChar('[');
+ }
+
+
+ /**
+ * Returns whether a token is the right bracket token.
+ *
+ * @param t The token.
+ * @return Whether the token is the right bracket token.
+ * @see #isLeftBracket(Token)
+ */
+ private static final boolean isRightBracket(Token t) {
+ return t.type==TokenTypes.SEPARATOR && t.isSingleChar(']');
+ }
+
+
+ /**
+ * If the specified value is on top of the stack, pop it off and return
+ * <code>true</code>. Otherwise, return <code>false</code>.
+ *
+ * @param stack The stack.
+ * @param value The value to check for.
+ * @return Whether the value was found on top of the stack.
+ */
+ private static final boolean popOffTop(Stack stack, Object value) {
+ if (stack.size()>0 && stack.peek()==value) {
+ stack.pop();
+ return true;
+ }
+ return false;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java
new file mode 100644
index 0000000..65b327b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/LatexFoldParser.java
@@ -0,0 +1,108 @@
+/*
+ * 04/24/2012
+ *
+ * LatexFoldParser.java - Fold parser for LaTeX.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * A fold parser for LaTeX documents. This is likely incomplete and/or not
+ * quite right; feedback is appreciated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LatexFoldParser implements FoldParser {
+
+ private static final char[] BEGIN = "\\begin".toCharArray();
+ private static final char[] END = "\\end".toCharArray();
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ List folds = new ArrayList();
+ Stack expectedStack = new Stack();
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ if (t.is(Token.RESERVED_WORD, BEGIN)) {
+ Token temp = t.getNextToken();
+ if (temp!=null && temp.isLeftCurly()) {
+ temp = temp.getNextToken();
+ if (temp!=null && temp.type==Token.RESERVED_WORD) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ expectedStack.push(temp.getLexeme());
+ t = temp;
+ }
+ }
+ }
+
+ else if (t.is(Token.RESERVED_WORD, END) &&
+ currentFold!=null && !expectedStack.isEmpty()) {
+ Token temp = t.getNextToken();
+ if (temp!=null && temp.isLeftCurly()) {
+ temp = temp.getNextToken();
+ if (temp!=null && temp.type==Token.RESERVED_WORD) {
+ String value = temp.getLexeme();
+ if (expectedStack.peek().equals(value)) {
+ expectedStack.pop();
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ if (!currentFold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+ t = temp;
+ currentFold = parentFold;
+ }
+ }
+ }
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+
+ return folds;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java
new file mode 100644
index 0000000..92a2d08
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/LispFoldParser.java
@@ -0,0 +1,33 @@
+/*
+ * 08/08/2012
+ *
+ * LispFoldParser.java - Fold parser for Lisp and related languages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for Lisp and related languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LispFoldParser extends CurlyFoldParser {
+
+
+ public boolean isLeftCurly(Token t) {
+ return t.isSingleChar(Token.SEPARATOR, '(');
+ }
+
+
+ public boolean isRightCurly(Token t) {
+ return t.isSingleChar(Token.SEPARATOR, ')');
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java
new file mode 100644
index 0000000..0cd9a1e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/NsisFoldParser.java
@@ -0,0 +1,156 @@
+/*
+ * 10/07/2012
+ *
+ * NsisFoldParser.java - Fold parser for NSIS.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * A fold parser NSIS.<p>
+ *
+ * Note that this class may impose somewhat of a performance penalty on large
+ * source files, since it re-parses the entire document each time folds are
+ * reevaluated.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class NsisFoldParser implements FoldParser {
+
+ private static final char[] KEYWORD_FUNCTION = "Function".toCharArray();
+ private static final char[] KEYWORD_FUNCTION_END = "FunctionEnd".toCharArray();
+ private static final char[] KEYWORD_SECTION = "Section".toCharArray();
+ private static final char[] KEYWORD_SECTION_END = "SectionEnd".toCharArray();
+
+ protected static final char[] C_MLC_END = "*/".toCharArray();
+
+
+ private static final boolean foundEndKeyword(char[] keyword, Token t,
+ Stack endWordStack) {
+ return t.is(Token.RESERVED_WORD, keyword) && !endWordStack.isEmpty() &&
+ keyword==endWordStack.peek();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ List folds = new ArrayList();
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+ boolean inMLC = false;
+ int mlcStart = 0;
+ Stack endWordStack = new Stack();
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ if (t.isComment()) {
+
+ if (inMLC) {
+ // If we found the end of an MLC that started
+ // on a previous line...
+ if (t.endsWith(C_MLC_END)) {
+ int mlcEnd = t.offset + t.textCount - 1;
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ folds.add(currentFold);
+ currentFold = null;
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ currentFold = currentFold.getParent();
+ }
+ //System.out.println("Ending MLC at: " + mlcEnd + ", parent==" + currentFold);
+ inMLC = false;
+ mlcStart = 0;
+ }
+ // Otherwise, this MLC is continuing on to yet
+ // another line.
+ }
+ else {
+ // If we're an MLC that ends on a later line...
+ if (t.type!=Token.COMMENT_EOL && !t.endsWith(C_MLC_END)) {
+ //System.out.println("Starting MLC at: " + t.offset);
+ inMLC = true;
+ mlcStart = t.offset;
+ }
+ }
+
+ }
+
+ else if (t.is(Token.RESERVED_WORD, KEYWORD_SECTION)) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ endWordStack.push(KEYWORD_SECTION_END);
+ }
+
+ else if (t.is(Token.RESERVED_WORD, KEYWORD_FUNCTION)) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ endWordStack.push(KEYWORD_FUNCTION_END);
+ }
+
+ else if (foundEndKeyword(KEYWORD_SECTION_END, t, endWordStack) ||
+ foundEndKeyword(KEYWORD_FUNCTION_END, t, endWordStack)) {
+ if (currentFold!=null) {
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ endWordStack.pop();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ if (!currentFold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+ currentFold = parentFold;
+ }
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Should never happen
+ ble.printStackTrace();
+ }
+
+ return folds;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java b/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java
new file mode 100644
index 0000000..382e31b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/XmlFoldParser.java
@@ -0,0 +1,148 @@
+/*
+ * 10/23/2011
+ *
+ * XmlFoldParser.java - Fold parser for XML.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.folding;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Fold parser for XML. Any tags that span more than one line, as well as
+ * comment regions spanning more than one line, are identified as foldable
+ * regions.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class XmlFoldParser implements FoldParser {
+
+ private static final char[] MARKUP_CLOSING_TAG_START = { '<', '/' };
+ private static final char[] MARKUP_SHORT_TAG_END = { '/', '>' };
+ private static final char[] MLC_END = { '-', '-', '>' };
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getFolds(RSyntaxTextArea textArea) {
+
+ List folds = new ArrayList();
+
+ Fold currentFold = null;
+ int lineCount = textArea.getLineCount();
+ boolean inMLC = false;
+ int mlcStart = 0;
+
+ try {
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = textArea.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+
+ if (t.isComment()) {
+
+ // Continuing an MLC from a previous line
+ if (inMLC) {
+ // Found the end of the MLC starting on a previous line...
+ if (t.endsWith(MLC_END)) {
+ int mlcEnd = t.offset + t.textCount - 1;
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.COMMENT, textArea, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ folds.add(currentFold);
+ currentFold = null;
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.COMMENT, mlcStart);
+ currentFold.setEndOffset(mlcEnd);
+ currentFold = currentFold.getParent();
+ }
+ inMLC = false;
+ mlcStart = 0;
+ }
+ // Otherwise, this MLC is continuing on to yet
+ // another line.
+ }
+
+ else {
+ // If we're an MLC that ends on a later line...
+ if (t.type==Token.COMMENT_MULTILINE && !t.endsWith(MLC_END)) {
+ inMLC = true;
+ mlcStart = t.offset;
+ }
+ }
+
+ }
+
+ else if (t.isSingleChar(Token.MARKUP_TAG_DELIMITER, '<')) {
+ if (currentFold==null) {
+ currentFold = new Fold(FoldType.CODE, textArea, t.offset);
+ folds.add(currentFold);
+ }
+ else {
+ currentFold = currentFold.createChild(FoldType.CODE, t.offset);
+ }
+ }
+
+ else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_SHORT_TAG_END)) {
+ if (currentFold!=null) {
+ Fold parentFold = currentFold.getParent();
+ removeFold(currentFold, folds);
+ currentFold = parentFold;
+ }
+ }
+
+ else if (t.is(Token.MARKUP_TAG_DELIMITER, MARKUP_CLOSING_TAG_START)) {
+ if (currentFold!=null) {
+ currentFold.setEndOffset(t.offset);
+ Fold parentFold = currentFold.getParent();
+ // Don't add fold markers for single-line blocks
+ if (currentFold.isOnSingleLine()) {
+ removeFold(currentFold, folds);
+ }
+ currentFold = parentFold;
+ }
+ }
+
+ t = t.getNextToken();
+
+ }
+
+ }
+
+ } catch (BadLocationException ble) { // Should never happen
+ ble.printStackTrace();
+ }
+
+ return folds;
+
+ }
+
+
+ /**
+ * If this fold has a parent fold, this method removes it from its parent.
+ * Otherwise, it's assumed to be the most recent (top-level) fold in the
+ * <code>folds</code> list, and is removed from that.
+ *
+ * @param fold The fold to remove.
+ * @param folds The list of top-level folds.
+ */
+ private static final void removeFold(Fold fold, List folds) {
+ if (!fold.removeFromParent()) {
+ folds.remove(folds.size()-1);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/folding/package.html b/src/org/fife/ui/rsyntaxtextarea/folding/package.html
new file mode 100644
index 0000000..f0f700d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/folding/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ Code folding functionality.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java
new file mode 100644
index 0000000..6266f96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java
@@ -0,0 +1,54 @@
+/*
+ * 10/03/2009
+ *
+ * AbstractMarkupTokenMaker.java - Base class for token makers for markup
+ * languages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+
+
+/**
+ * Base class for token makers for markup languages.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractMarkupTokenMaker extends AbstractJFlexTokenMaker {
+
+
+ /**
+ * Returns whether markup close tags should be completed.
+ *
+ * @return Whether closing markup tags are to be completed.
+ */
+ public abstract boolean getCompleteCloseTags();
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "<!--", "-->" };
+ }
+
+
+ /**
+ * Overridden to return <code>true</code>.
+ *
+ * @return <code>true</code> always.
+ */
+ public final boolean isMarkupLanguage() {
+ return true;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex
new file mode 100644
index 0000000..38effe7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex
@@ -0,0 +1,498 @@
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ActionScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ActionScriptTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+UnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
+StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+MLCBegin = ("/*")
+MLCEnd = ("*/")
+LineCommentBegin = ("//")
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "add" |
+ "and" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "continue" |
+ "default" |
+ "delete" |
+ "do" |
+ "dynamic" |
+ "else" |
+ "eq" |
+ "extends" |
+ "final" |
+ "finally" |
+ "for" |
+ "for each" |
+ "function" |
+ "ge" |
+ "get" |
+ "gt" |
+ "if" |
+ "ifFrameLoaded" |
+ "implements" |
+ "import" |
+ "in" |
+ "include" |
+ "interface" |
+ "internal" |
+ "label" |
+ "le" |
+ "lt" |
+ "namespace" |
+ "native" |
+ "ne" |
+ "new" |
+ "not" |
+ "on" |
+ "onClipEvent" |
+ "or" |
+ "override" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "return" |
+ "set" |
+ "static" |
+ "super" |
+ "switch" |
+ "tellTarget" |
+ "this" |
+ "throw" |
+ "try" |
+ "typeof" |
+ "use" |
+ "var" |
+ "void" |
+ "while" |
+ "with" |
+
+ "null" |
+ "undefined" { addToken(Token.RESERVED_WORD); }
+
+ /* Built-in objects (good idea not to use these names!) */
+ "Array" |
+ "Boolean" |
+ "Color" |
+ "Date" |
+ "Function" |
+ "int" |
+ "Key" |
+ "MovieClip" |
+ "Math" |
+ "Mouse" |
+ "Null" |
+ "Number" |
+ "Object" |
+ "Selection" |
+ "Sound" |
+ "String" |
+ "uint" |
+ "Vector" |
+ "void" |
+ "XML" |
+ "XMLNode" |
+ "XMLSocket" { addToken(Token.DATA_TYPE); }
+
+ /* Global functions */
+ "call" |
+ "escape" |
+ "eval" |
+ "fscommand" |
+ "getProperty" |
+ "getTimer" |
+ "getURL" |
+ "getVersion" |
+ "gotoAndPlay" |
+ "gotoAndStop" |
+ "#include" |
+ "int" |
+ "isFinite" |
+ "isNaN" |
+ "loadMovie" |
+ "loadMovieNum" |
+ "loadVariables" |
+ "loadVariablesNum" |
+ "maxscroll" |
+ "newline" |
+ "nextFrame" |
+ "nextScene" |
+ "Number" |
+ "parseFloat" |
+ "parseInt" |
+ "play" |
+ "prevFrame" |
+ "prevScene" |
+ "print" |
+ "printAsBitmap" |
+ "printAsBitmapNum" |
+ "printNum" |
+ "random" |
+ "removeMovieClip" |
+ "scroll" |
+ "setProperty" |
+ "startDrag" |
+ "stop" |
+ "stopAllSounds" |
+ "stopDrag" |
+ "String" |
+ "targetPath" |
+ "tellTarget" |
+ "toggleHighQuality" |
+ "trace" |
+ "unescape" |
+ "unloadMovie" |
+ "unloadMovieNum" |
+ "updateAfterEvent" { addToken(Token.FUNCTION); }
+
+ /* Booleans. */
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java
new file mode 100644
index 0000000..7460040
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java
@@ -0,0 +1,2071 @@
+/* The following code was generated by JFlex 1.4.1 on 5/12/10 4:49 PM */
+
+/*
+ * 04/27/2010
+ *
+ * ActionScriptTokenMaker.java - Scanner for ActionScript.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the ActionScript.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ActionScriptTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ActionScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\21\1\10\1\0\1\21\1\17\22\0\1\72\1\50\1\15"+
+ "\1\20\1\1\1\50\1\52\1\7\2\55\1\23\1\43\1\42\1\31"+
+ "\1\32\1\22\1\4\3\16\4\6\2\3\1\53\1\42\1\44\1\45"+
+ "\1\47\1\51\1\54\1\100\1\5\1\76\1\26\1\30\1\74\1\1"+
+ "\1\114\1\113\1\1\1\101\1\25\1\102\1\103\1\104\1\110\1\115"+
+ "\1\112\1\106\1\77\1\111\1\107\1\1\1\24\2\1\1\55\1\11"+
+ "\1\55\1\46\1\2\1\0\1\36\1\14\1\64\1\62\1\35\1\27"+
+ "\1\73\1\56\1\60\1\105\1\63\1\37\1\67\1\13\1\65\1\57"+
+ "\1\70\1\34\1\40\1\33\1\12\1\75\1\61\1\71\1\66\1\1"+
+ "\1\41\1\46\1\41\1\51\uff81\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 =
+ "\3\0\1\1\1\2\2\3\1\2\1\4\1\5\3\2"+
+ "\1\6\2\1\1\7\2\10\3\2\1\10\7\2\1\11"+
+ "\1\2\5\10\22\2\1\12\1\13\5\12\1\14\3\12"+
+ "\1\1\1\15\1\3\1\16\1\15\1\16\1\15\1\17"+
+ "\1\15\1\2\1\4\1\20\1\0\1\4\5\2\1\21"+
+ "\3\2\2\6\1\22\1\1\1\23\1\24\21\2\1\21"+
+ "\12\2\1\0\1\10\4\2\2\21\11\2\1\21\2\2"+
+ "\1\21\17\2\1\25\10\0\1\1\1\16\1\0\2\17"+
+ "\1\2\1\4\1\26\2\4\1\20\1\4\6\2\1\21"+
+ "\4\2\1\6\1\27\1\6\1\1\1\0\1\30\5\2"+
+ "\1\21\23\2\1\21\11\2\1\30\20\2\1\21\4\2"+
+ "\1\30\12\2\10\0\1\1\1\2\1\4\10\2\1\6"+
+ "\1\1\1\31\5\2\1\0\1\32\13\2\1\33\3\2"+
+ "\1\33\40\2\2\0\1\34\2\0\1\35\1\1\1\2"+
+ "\1\4\7\2\1\6\1\1\4\2\1\21\1\0\17\2"+
+ "\1\33\23\2\4\0\1\1\1\2\1\4\6\2\1\6"+
+ "\1\1\4\2\1\0\35\2\1\1\2\2\1\0\24\2"+
+ "\1\33\1\2\1\21\25\2\1\33\40\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[531];
+ 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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+ "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u02be\0\u0444"+
+ "\0\u0492\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4"+
+ "\0\u0702\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u02be\0\u02be"+
+ "\0\u08d6\0\u0924\0\u0972\0\u02be\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa"+
+ "\0\u0af8\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc\0\u0d1a"+
+ "\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee\0\u0f3c\0\u0f8a"+
+ "\0\u02be\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110\0\u02be\0\u115e"+
+ "\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u1296\0\u1296\0\u12e4\0\u1332"+
+ "\0\u1380\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u02be\0\u1506\0\u1554"+
+ "\0\u15a2\0\u15f0\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4"+
+ "\0\u1812\0\u1860\0\u18ae\0\u02be\0\u18fc\0\u02be\0\u194a\0\u1998"+
+ "\0\u19e6\0\u1a34\0\u1a82\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08"+
+ "\0\u1c56\0\u1ca4\0\u1cf2\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78"+
+ "\0\u0138\0\u1ec6\0\u1f14\0\u1f62\0\u1fb0\0\u1ffe\0\u204c\0\u209a"+
+ "\0\u20e8\0\u2136\0\u2184\0\u052e\0\u21d2\0\u2220\0\u226e\0\u22bc"+
+ "\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442\0\u2490\0\u24de\0\u252c"+
+ "\0\u257a\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c"+
+ "\0\u27ea\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c"+
+ "\0\u2a5a\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u02be"+
+ "\0\u2c7c\0\u2cca\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e"+
+ "\0\u2eec\0\u2f3a\0\u2f88\0\u1296\0\u2fd6\0\u3024\0\u3072\0\u02be"+
+ "\0\u30c0\0\u310e\0\u1506\0\u315c\0\u31aa\0\u31f8\0\u3246\0\u3294"+
+ "\0\u32e2\0\u3330\0\u337e\0\u33cc\0\u341a\0\u3468\0\u34b6\0\u3504"+
+ "\0\u02be\0\u3552\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726"+
+ "\0\u3774\0\u37c2\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996"+
+ "\0\u39e4\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06"+
+ "\0\u3c54\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76"+
+ "\0\u3ec4\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6"+
+ "\0\u4134\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356"+
+ "\0\u43a4\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6"+
+ "\0\u4614\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u0138\0\u47e8"+
+ "\0\u4836\0\u4884\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58"+
+ "\0\u4aa6\0\u4af4\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+ "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+ "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u02be\0\u515a"+
+ "\0\u51a8\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u0138\0\u532e\0\u537c"+
+ "\0\u53ca\0\u5418\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec"+
+ "\0\u563a\0\u0138\0\u5688\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e"+
+ "\0\u585c\0\u58aa\0\u58f8\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e"+
+ "\0\u5acc\0\u5b1a\0\u5b68\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee"+
+ "\0\u5d3c\0\u5d8a\0\u5dd8\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e"+
+ "\0\u5fac\0\u5ffa\0\u6048\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce"+
+ "\0\u621c\0\u626a\0\u62b8\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e"+
+ "\0\u648c\0\u64da\0\u6528\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae"+
+ "\0\u66fc\0\u674a\0\u6798\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e"+
+ "\0\u696c\0\u69ba\0\u6a08\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e"+
+ "\0\u6bdc\0\u6c2a\0\u6c78\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe"+
+ "\0\u6e4c\0\u6e9a\0\u6ee8\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e"+
+ "\0\u70bc\0\u710a\0\u7158\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de"+
+ "\0\u732c\0\u737a\0\u621c\0\u73c8\0\u6306\0\u7416\0\u7464\0\u74b2"+
+ "\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638\0\u7686\0\u76d4\0\u7722"+
+ "\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8\0\u78f6\0\u7944\0\u7992"+
+ "\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18\0\u7b66\0\u7bb4\0\u7c02"+
+ "\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88\0\u7dd6\0\u7e24\0\u7e72"+
+ "\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8\0\u8046\0\u8094\0\u80e2"+
+ "\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268\0\u82b6\0\u8304\0\u8352"+
+ "\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2"+
+ "\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832"+
+ "\0\u8880\0\u88ce\0\352\0\u891c\0\u02be\0\u896a\0\u89b8\0\u8a06"+
+ "\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76"+
+ "\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+ "\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba\0\u9108\0\u9156"+
+ "\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a\0\u9378\0\u93c6"+
+ "\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a\0\u95e8\0\u9636"+
+ "\0\u9684\0\u96d2\0\u9720\0\u976e\0\u97bc\0\u980a\0\u9858\0\u98a6"+
+ "\0\u98f4\0\u9942\0\u9990";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[531];
+ 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 =
+ "\1\4\2\5\1\6\1\7\1\10\1\6\1\11\1\12"+
+ "\1\4\1\13\1\14\1\15\1\16\1\6\1\17\1\20"+
+ "\1\21\1\22\1\23\1\24\1\5\1\25\1\26\1\5"+
+ "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36"+
+ "\1\37\1\40\1\41\1\42\2\23\1\43\1\23\1\44"+
+ "\1\45\1\44\1\4\1\37\1\5\1\46\1\47\1\50"+
+ "\1\51\1\5\1\52\1\53\1\5\1\54\2\5\1\21"+
+ "\1\55\1\56\1\57\1\60\1\5\1\61\1\62\1\63"+
+ "\1\64\1\65\1\5\1\66\1\67\6\5\10\70\1\71"+
+ "\12\70\1\72\3\70\1\73\26\70\1\74\2\70\1\75"+
+ "\34\70\10\76\1\77\16\76\1\100\26\76\1\101\2\76"+
+ "\1\102\34\76\7\4\2\0\4\4\1\0\1\4\1\0"+
+ "\1\4\3\0\5\4\2\0\6\4\13\0\1\4\1\0"+
+ "\14\4\1\0\24\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\3\104\2\6\1\104"+
+ "\1\6\2\0\4\104\1\0\1\6\1\0\1\104\3\0"+
+ "\1\104\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+ "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+ "\7\104\1\0\1\104\1\106\24\104\1\111\1\112\1\104"+
+ "\1\112\2\0\4\104\1\0\1\112\1\0\1\104\3\0"+
+ "\1\113\1\105\2\106\1\107\1\0\1\110\2\104\1\107"+
+ "\1\104\1\105\1\104\13\0\1\104\1\0\4\104\1\106"+
+ "\6\104\1\113\1\0\1\104\1\106\21\104\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\114"+
+ "\4\5\1\0\23\5\7\115\1\116\1\117\1\120\104\115"+
+ "\116\0\1\4\6\5\2\0\1\103\1\5\1\121\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+ "\1\122\13\0\1\4\1\0\1\5\1\123\1\124\11\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\1\125\2\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\126\1\127\2\5\13\0\1\4\1\0\7\5\1\130"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\131\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\10\16\1\132\1\133\3\16\1\134\100\16\7\4\2\0"+
+ "\4\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+ "\6\4\13\0\1\4\1\0\2\4\1\135\11\4\1\0"+
+ "\23\4\21\0\1\21\50\0\1\21\45\0\1\136\1\137"+
+ "\21\0\1\44\115\0\1\44\50\0\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+ "\1\140\13\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\141"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\1\142\2\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\3\5\1\143\1\5\1\144"+
+ "\13\0\1\4\1\0\2\5\1\145\4\5\1\146\4\5"+
+ "\1\0\23\5\31\0\1\44\13\0\1\44\53\0\2\110"+
+ "\1\0\1\110\7\0\1\110\77\0\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\5\1\147\1\150\1\151\2\5\13\0\1\4"+
+ "\1\0\1\152\6\5\1\153\1\154\3\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\155\1\156\2\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\4\5\1\157\1\160\13\0\1\4\1\0"+
+ "\12\5\1\161\1\162\1\0\2\5\1\163\20\5\1\4"+
+ "\6\5\2\0\1\103\1\5\1\164\1\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\4\5\1\164\7\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\161\1\5\1\161\1\165\2\5\13\0"+
+ "\1\4\1\0\7\5\1\166\4\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\1\167\2\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\170\1\5\1\171\3\5"+
+ "\13\0\1\4\1\0\3\5\1\172\2\5\1\173\5\5"+
+ "\1\0\23\5\43\0\1\44\1\0\1\44\114\0\1\174"+
+ "\1\44\115\0\1\44\1\0\1\175\113\0\1\44\4\0"+
+ "\1\44\43\0\1\4\6\5\2\0\1\103\1\176\2\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\177\1\5\1\200\1\201\1\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\202\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+ "\1\203\1\5\2\0\5\5\1\204\13\0\1\4\1\0"+
+ "\11\5\1\205\2\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\1\206\1\5\1\207"+
+ "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\210\3\5\13\0\1\4\1\0\7\5\1\161\1\211"+
+ "\3\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\212\1\213\1\5\13\0\1\4\1\0\7\5\1\214"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\215\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\5\1\161\4\5\13\0\1\4\1\0\14\5"+
+ "\1\0\2\5\1\216\20\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\3\5\1\217\2\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\161\1\5\1\220"+
+ "\3\5\13\0\1\4\1\0\7\5\1\221\4\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\222\2\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\223\2\5\13\0\1\4\1\0\7\5"+
+ "\1\224\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\7\5\1\225\4\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\5\1\226\4\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\227\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\230\2\5\13\0\1\4\1\0\7\5\1\231\4\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\1\232\2\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\2\5\1\233\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\234\1\5"+
+ "\1\235\3\5\13\0\1\4\1\0\7\5\1\236\4\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\237"+
+ "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\10\70"+
+ "\1\0\12\70\1\0\3\70\1\0\26\70\1\0\2\70"+
+ "\1\0\34\70\22\0\1\240\126\0\1\241\24\0\1\242"+
+ "\70\0\1\243\143\0\1\244\34\0\10\76\1\0\16\76"+
+ "\1\0\26\76\1\0\2\76\1\0\34\76\33\0\1\245"+
+ "\24\0\1\246\70\0\1\247\143\0\1\250\34\0\7\4"+
+ "\2\0\1\4\1\251\2\4\1\0\1\4\1\0\1\4"+
+ "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\14\4"+
+ "\1\0\23\4\7\104\2\0\4\104\1\0\1\104\1\0"+
+ "\1\104\3\0\5\104\2\0\6\104\13\0\1\104\1\0"+
+ "\14\104\1\0\26\104\2\252\1\104\1\252\2\0\4\104"+
+ "\1\0\1\252\1\0\1\104\3\0\5\104\1\253\1\0"+
+ "\6\104\2\0\1\253\10\0\1\104\1\0\14\104\1\0"+
+ "\26\104\2\110\1\104\1\110\2\0\4\104\1\0\1\110"+
+ "\1\0\1\104\3\0\2\104\2\106\1\107\2\0\2\104"+
+ "\1\107\3\104\13\0\1\104\1\0\4\104\1\106\7\104"+
+ "\1\0\1\104\1\106\24\104\2\111\1\104\1\111\2\0"+
+ "\4\104\1\0\1\111\1\0\1\104\3\0\2\104\2\106"+
+ "\1\107\1\0\1\110\2\104\1\107\3\104\13\0\1\104"+
+ "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+ "\1\111\1\112\1\104\1\112\2\0\4\104\1\0\1\112"+
+ "\1\0\1\104\3\0\1\104\1\254\2\106\1\107\1\0"+
+ "\1\110\2\104\1\107\1\104\1\254\1\104\13\0\1\104"+
+ "\1\0\4\104\1\106\7\104\1\0\1\104\1\106\24\104"+
+ "\4\255\2\0\3\104\1\255\1\0\1\255\1\0\1\104"+
+ "\3\0\2\104\3\255\2\0\2\104\2\255\2\104\13\0"+
+ "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+ "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+ "\1\256\4\5\1\0\23\5\7\257\1\260\1\0\105\257"+
+ "\7\0\1\260\106\0\4\257\1\261\1\257\1\262\1\263"+
+ "\1\0\1\115\1\264\3\115\1\261\10\257\1\115\3\257"+
+ "\2\115\61\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\265"+
+ "\1\5\1\266\1\5\13\0\1\4\1\0\4\5\1\267"+
+ "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\161\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\4\5\1\270\7\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\5\1\271\1\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\272"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\3\5"+
+ "\1\273\7\5\1\274\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\275\5\5\13\0\1\4\1\0\11\5\1\276"+
+ "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\161"+
+ "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\277\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\11\132\1\300\3\132\1\301"+
+ "\104\132\1\16\1\132\2\16\1\0\1\16\1\302\4\16"+
+ "\10\132\1\16\3\132\2\16\61\132\7\4\2\0\2\4"+
+ "\1\303\1\4\1\0\1\4\1\0\1\4\3\0\5\4"+
+ "\2\0\6\4\13\0\1\4\1\0\14\4\1\0\23\4"+
+ "\23\0\1\304\72\0\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\1\5\1\305\3\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\306\5\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\1\5\1\307\1\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\4\5\1\310\1\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\311"+
+ "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\312\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\5\1\313\4\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\314\2\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\3\5\1\315\2\5\13\0\1\4\1\0"+
+ "\10\5\1\161\3\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\316\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\317"+
+ "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\5\1\320\4\5\13\0\1\4"+
+ "\1\0\2\5\1\321\11\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\1\322\22\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\1\5\1\323\12\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\324\5\5\13\0\1\4\1\0"+
+ "\11\5\1\325\2\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\5\1\326\1\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\122"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\327"+
+ "\5\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\330"+
+ "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\3\5\1\331\2\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\4\5\1\161\7\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\2\5\1\332\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\333\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\1\5\1\334\12\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\3\5\1\335\2\5\13\0\1\4"+
+ "\1\0\7\5\1\336\4\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\337\5\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\2\5\1\340\11\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\5\1\341\4\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\45\0\1\44\1\0\1\23"+
+ "\46\0\1\4\6\5\2\0\1\103\2\5\1\342\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\2\5\1\343\3\5\13\0\1\4\1\0\2\5"+
+ "\1\344\4\5\1\345\4\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\5\1\346\4\5\13\0\1\4\1\0"+
+ "\6\5\1\347\5\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\350\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\351\5\5"+
+ "\13\0\1\4\1\0\6\5\1\352\5\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\1\5\1\353\21\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+ "\1\354\6\5\1\355\12\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\1\5\1\356\12\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\2\5\1\357\11\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\360\5\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\3\5\1\361\1\5\2\0"+
+ "\4\5\1\362\1\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\363\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\364\3\5\1\331\1\122\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\3\5\1\365\2\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\366\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\3\5\1\367\17\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\370\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\13\5\1\371\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\372\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\373\5\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\1\5\1\374\1\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\5\1\161\4\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\164"+
+ "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+ "\1\375\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\5\1\376\4\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\10\5\1\377\3\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\u0100\5\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\1\u0101\2\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\2\5\1\u0102\20\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\4\5\1\u0103\1\5\13\0\1\4\1\0\11\5\1\u0104"+
+ "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\12\5\1\u0105\10\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\5\1\u0106\4\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\u0107\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\1\u0108\2\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\6\5\1\u0109"+
+ "\5\5\1\0\23\5\57\0\1\u010a\75\0\1\u010b\111\0"+
+ "\1\u010c\143\0\1\u010d\113\0\1\u010e\75\0\1\u010f\111\0"+
+ "\1\u0110\143\0\1\u0111\34\0\3\4\4\u0112\2\0\3\4"+
+ "\1\u0112\1\0\1\u0112\1\0\1\4\3\0\2\4\3\u0112"+
+ "\2\0\2\4\2\u0112\2\4\13\0\1\4\1\0\4\4"+
+ "\1\u0112\1\4\1\u0112\5\4\1\0\1\4\1\u0112\1\4"+
+ "\1\u0112\1\4\1\u0112\15\4\3\104\2\252\1\104\1\252"+
+ "\2\0\4\104\1\0\1\252\1\0\1\104\3\0\2\104"+
+ "\2\106\1\104\2\0\6\104\13\0\1\104\1\0\4\104"+
+ "\1\106\7\104\1\0\1\104\1\106\21\104\3\0\2\252"+
+ "\1\0\1\252\7\0\1\252\77\0\3\104\4\255\2\0"+
+ "\3\104\1\255\1\0\1\255\1\0\1\104\3\0\1\104"+
+ "\1\254\3\255\2\0\2\104\2\255\1\254\1\104\13\0"+
+ "\1\104\1\0\4\104\1\255\1\104\1\255\5\104\1\0"+
+ "\1\104\1\255\1\104\1\255\1\104\1\255\15\104\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\4\5\1\u0113\1\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\7\257\1\116\1\0\111\257"+
+ "\1\262\1\257\1\262\1\260\1\0\5\257\1\262\103\257"+
+ "\1\115\1\257\1\115\1\260\1\0\5\257\1\115\102\257"+
+ "\4\u0114\1\116\1\0\3\257\1\u0114\1\257\1\u0114\7\257"+
+ "\3\u0114\4\257\2\u0114\23\257\1\u0114\1\257\1\u0114\7\257"+
+ "\1\u0114\1\257\1\u0114\1\257\1\u0114\15\257\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\5\5\1\160\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\7\5\1\u0115\4\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\u0116\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\3\5\1\u0117\2\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\377\5\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\161\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0118"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\u0119\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\2\5\1\u011a\11\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\u011b\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\u011c\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\10\132\1\0\110\132\4\u011d\2\132\1\300"+
+ "\2\132\1\u011d\1\301\1\u011d\7\132\3\u011d\4\132\2\u011d"+
+ "\23\132\1\u011d\1\132\1\u011d\7\132\1\u011d\1\132\1\u011d"+
+ "\1\132\1\u011d\15\132\7\4\2\0\4\4\1\0\1\4"+
+ "\1\0\1\4\3\0\5\4\2\0\6\4\13\0\1\4"+
+ "\1\0\6\4\1\u011e\5\4\1\0\23\4\22\0\1\u011f"+
+ "\73\0\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\10\5\1\u0120\2\5\1\u0121\7\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\377\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\6\5\1\u0122\5\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\5\5\1\314"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0123"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\u0124\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\u0125\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u0126\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\6\5\1\u0127\5\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\u0128\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\1\u0129\22\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u012a"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\5\5"+
+ "\1\161\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\1\u012b\22\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u012c\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\1\u012d\2\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\7\5\1\u012e\4\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\4\5\1\u012f\7\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\3\5\1\u0130\2\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u0131\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\4\5\1\u0132\1\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\2\5\1\272\3\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\4\5\1\u0133\7\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\223\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\u0134\1\u0135\4\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\1\5\1\u0136\12\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\15\5\1\u0137\5\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\364"+
+ "\5\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+ "\1\u0138\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\4\5\1\u0134\1\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\2\5\1\u0119\20\5\1\4\6\5"+
+ "\2\0\1\103\1\5\1\u0139\1\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\2\5\1\u013a\20\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\u013b\5\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\5\5\1\u013c\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\5\5\1\u013d\6\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\10\5\1\u0132\3\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\u013e\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\4\5\1\u013f\1\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\5\1\u0140\4\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u0141"+
+ "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\u0142\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\4\5\1\u0143\1\5\13\0"+
+ "\1\4\1\0\7\5\1\u0144\4\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\4\5\1\122\1\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\1\161\13\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\3\5\1\u0145\2\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\2\5\1\u0146\3\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0147"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+ "\1\360\5\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\5\5\1\321\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\u0148\4\5\1\130\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\u0149\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u014a"+
+ "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\5\5\1\u014b\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\4\5\1\u014c\7\5"+
+ "\1\u014d\1\u0137\1\u014e\4\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\7\5\1\u014f\4\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\6\5\1\u0150\5\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0151"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\227\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\377\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\5\5\1\306\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u0152\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\377\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\2\5\1\u0153"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u0154\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\2\5\1\u0155\11\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\374\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\5\1\u0156\1\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\375\5\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\53\0\1\u0157"+
+ "\77\0\1\u010a\137\0\1\u0158\70\0\1\u0159\136\0\1\u015a"+
+ "\77\0\1\u010e\137\0\1\u015b\70\0\1\u015c\63\0\3\4"+
+ "\4\u015d\2\0\3\4\1\u015d\1\0\1\u015d\1\0\1\4"+
+ "\3\0\2\4\3\u015d\2\0\2\4\2\u015d\2\4\13\0"+
+ "\1\4\1\0\4\4\1\u015d\1\4\1\u015d\5\4\1\0"+
+ "\1\4\1\u015d\1\4\1\u015d\1\4\1\u015d\16\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u015e\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\3\257\4\u015f\1\116\1\0\3\257"+
+ "\1\u015f\1\257\1\u015f\7\257\3\u015f\4\257\2\u015f\23\257"+
+ "\1\u015f\1\257\1\u015f\7\257\1\u015f\1\257\1\u015f\1\257"+
+ "\1\u015f\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0160"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\3\5\1\u0161\1\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\u0162\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u0163\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\1\5"+
+ "\1\u0164\11\5\1\u0165\7\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\2\5\1\122"+
+ "\20\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\5\5\1\u0166\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\5\5\1\161\6\5"+
+ "\1\0\23\5\3\132\4\u0167\2\132\1\300\2\132\1\u0167"+
+ "\1\301\1\u0167\7\132\3\u0167\4\132\2\u0167\23\132\1\u0167"+
+ "\1\132\1\u0167\7\132\1\u0167\1\132\1\u0167\1\132\1\u0167"+
+ "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+ "\3\0\5\4\2\0\4\4\1\u0168\1\4\13\0\1\4"+
+ "\1\0\14\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\7\5\1\u0169\4\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\7\5\1\u016a\4\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\u016b\5\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\11\5\1\u016c\2\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\4\5\1\u016d\1\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\35\0\1\u016e\60\0\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u0132\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\4\5\1\u016f\16\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\u0170\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\3\5\1\161\10\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0171"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+ "\1\u0172\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\5\1\u0173\4\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\2\5\1\u0174\20\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0175"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\1\5\1\u0127\12\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\1\5\1\u0176\1\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\7\5"+
+ "\1\u0177\4\5\1\u0178\6\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\2\5\1\u0179\11\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\u017a\5\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\2\5"+
+ "\1\u017b\2\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\5\5\1\u017c\15\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\5\1\u017d\4\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\4\5\1\331\1\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\u017e\5\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0146"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\u017f\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\2\5\1\u0180\3\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\3\5\1\u0181\2\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\5\1\u0182\4\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0183"+
+ "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\3\5\1\u0184\2\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\1\5\1\u0185\1\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\10\5\1\u0132\12\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u0186\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\130\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\1\u0187\2\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\1\122\5\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\11\5\1\u0134\2\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0188\11\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\2\5\1\u0189\11\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\5\1\u018a\4\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\6\5\1\173\5\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\2\5\1\u018b\11\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u018c\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\17\5\1\u018d\3\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\5\5\1\u018e\15\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\u018f\5\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\5\1\377\4\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\u0190\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u0151\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\6\5\1\271\5\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\5\1\u0191\1\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\4\5\1\377\7\5\1\0\23\5\22\0"+
+ "\1\u0192\133\0\1\u010a\12\0\1\u0157\43\0\1\u0159\1\u0193"+
+ "\4\u0159\1\u0193\2\0\3\u0159\1\0\1\u0159\1\0\1\u0193"+
+ "\1\0\1\u0159\1\u0193\5\u0159\2\u0193\6\u0159\1\0\2\u0193"+
+ "\1\0\1\u0193\2\0\6\u0193\14\u0159\1\0\23\u0159\22\0"+
+ "\1\u0194\133\0\1\u010e\12\0\1\u015a\43\0\1\u015c\1\u0195"+
+ "\4\u015c\1\u0195\2\0\3\u015c\1\0\1\u015c\1\0\1\u0195"+
+ "\1\0\1\u015c\1\u0195\5\u015c\2\u0195\6\u015c\1\0\2\u0195"+
+ "\1\0\1\u0195\2\0\6\u0195\14\u015c\1\0\23\u015c\3\4"+
+ "\4\u0196\2\0\3\4\1\u0196\1\0\1\u0196\1\0\1\4"+
+ "\3\0\2\4\3\u0196\2\0\2\4\2\u0196\2\4\13\0"+
+ "\1\4\1\0\4\4\1\u0196\1\4\1\u0196\5\4\1\0"+
+ "\1\4\1\u0196\1\4\1\u0196\1\4\1\u0196\16\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\3\5\1\u0197\2\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\3\257\4\u0198\1\116\1\0\3\257"+
+ "\1\u0198\1\257\1\u0198\7\257\3\u0198\4\257\2\u0198\23\257"+
+ "\1\u0198\1\257\1\u0198\7\257\1\u0198\1\257\1\u0198\1\257"+
+ "\1\u0198\15\257\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\4\5\1\u0199\7\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+ "\1\u019a\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\2\5\1\u019b\3\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0127\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\5\1\u019c\4\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\6\5\1\u019d\5\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\5\1\u019e\12\5\1\0\23\5\3\132\4\u019f\2\132"+
+ "\1\300\2\132\1\u019f\1\301\1\u019f\7\132\3\u019f\4\132"+
+ "\2\u019f\23\132\1\u019f\1\132\1\u019f\7\132\1\u019f\1\132"+
+ "\1\u019f\1\132\1\u019f\15\132\7\4\2\0\1\4\1\u01a0"+
+ "\2\4\1\0\1\4\1\0\1\4\3\0\5\4\2\0"+
+ "\6\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\4\5\1\306"+
+ "\7\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\6\5\1\u01a1\5\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u01a2\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\11\5\1\u01a3\2\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01a4"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\36\0"+
+ "\1\u01a5\57\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u01a6"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\u01a7\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u01a8\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\3\5\1\161\1\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\1\5\1\161\1\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01a9"+
+ "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+ "\1\u0132\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\4\5\1\321\7\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\7\5\1\u01aa\4\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\3\5\1\u01ab\2\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\6\5\1\161\5\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\2\5\1\u017b\2\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\5\1\u01ac\4\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u01ad"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\7\5"+
+ "\1\u01ae\4\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\5\5\1\u01af"+
+ "\2\5\1\u01b0\12\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\6\5\1\u01b1\5\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\1\5\1\u01b2\16\5\1\u01b3\2\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\1\122\22\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\u01b4\1\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+ "\1\u019e\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\4\5\1\122\7\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\11\5"+
+ "\1\u01b5\2\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\2\5\1\u01b6\11\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\11\5\1\u01b7\2\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\4\5\1\130\1\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\u01b8\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\5\1\u01b9\12\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\2\5\1\u0183\11\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\11\5\1\u01ba\2\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\5\1\u01bb\4\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u0132"+
+ "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01bc\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01bd"+
+ "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\3\5\1\u01be\17\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\1\377\22\5\22\0\1\u0159\115\0\1\u015c"+
+ "\73\0\3\4\4\5\2\0\3\4\1\5\1\0\1\5"+
+ "\1\0\1\4\3\0\2\4\3\5\2\0\2\4\2\5"+
+ "\2\4\13\0\1\4\1\0\4\4\1\5\1\4\1\5"+
+ "\5\4\1\0\1\4\1\5\1\4\1\5\1\4\1\5"+
+ "\16\4\6\5\2\0\1\103\1\5\1\377\1\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\3\257\4\115\1\116"+
+ "\1\0\3\257\1\115\1\257\1\115\7\257\3\115\4\257"+
+ "\2\115\23\257\1\115\1\257\1\115\7\257\1\115\1\257"+
+ "\1\115\1\257\1\115\15\257\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\7\5\1\u0177"+
+ "\13\5\1\4\6\5\2\0\1\103\1\5\1\u01bf\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\5\5\1\u01c0\15\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\3\5"+
+ "\1\u01c1\2\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\u0163\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\u01c2\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\3\132\4\16\2\132\1\300\2\132\1\16"+
+ "\1\301\1\16\7\132\3\16\4\132\2\16\23\132\1\16"+
+ "\1\132\1\16\7\132\1\16\1\132\1\16\1\132\1\16"+
+ "\15\132\7\4\2\0\4\4\1\0\1\4\1\0\1\4"+
+ "\3\0\5\4\2\0\6\4\13\0\1\4\1\0\4\4"+
+ "\1\u01c3\7\4\1\0\24\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\5\5\1\u01c4\6\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\7\5\1\u0173\4\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\u01c5\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\10\5\1\161\3\5\1\0\23\5\64\0"+
+ "\1\u01c6\31\0\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\5\1\u01c7"+
+ "\4\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\15\5\1\u01c8\5\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\21\5\1\u01c9"+
+ "\1\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\7\5\1\u01ca\13\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\2\5\1\u01cb\20\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\u01cc\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\3\5\1\u01cd\2\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\4\5\1\u01ce\1\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\1\5\1\u01cf\12\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\5\5\1\u01d0\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\u0175"+
+ "\2\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\u01bf\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+ "\1\u01d1\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\1\5\1\u01d2\1\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\272\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u01d3"+
+ "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\u0127\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u01d4\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\1\122\2\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\4\5\1\u01d5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\u01d6\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\5\5\1\u01d7\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\4\5\1\u01d8\7\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u0197"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+ "\1\u01d9\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\2\5\1\164\3\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\3\5"+
+ "\1\u01da\1\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\11\5\1\u0127\2\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\6\5"+
+ "\1\122\5\5\1\0\23\5\7\4\2\0\4\4\1\0"+
+ "\1\4\1\0\1\4\3\0\5\4\2\0\2\4\1\u01db"+
+ "\3\4\13\0\1\4\1\0\14\4\1\0\24\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\2\5\1\271\3\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\1\5"+
+ "\1\u01dc\1\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\56\0\1\u01dd\37\0\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\1\u01de\22\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\3\5\1\u01df\2\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\2\5\1\u01e0\11\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\7\5\1\u01e1\4\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\2\5\1\u01e2"+
+ "\11\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\2\5\1\u01e3\11\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\1\u0132\22\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\14\5\1\0\13\5\1\u01e4"+
+ "\7\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\2\5\1\u01e5\3\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\4\5"+
+ "\1\u01e6\1\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\7\5\1\u01e7\4\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\1\u0132\5\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\1\5\1\u01e8"+
+ "\3\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\u01e9\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\2\5\1\u01ea\20\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\u0132\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u01eb\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\13\5"+
+ "\1\u01ec\1\5\1\u01ed\5\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\2\5\1\u01ee\11\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\1\u01ef\5\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\4\5\1\u0132\7\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\130"+
+ "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\u01f0\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\1\u01f1\22\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\2\5\1\u01f2\20\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\2\5\1\u01f3\3\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\3\5\1\u01f4\2\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\7\5\1\u01f5"+
+ "\4\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\1\5"+
+ "\1\u01f6\4\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u01f7\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\3\5\1\u01d2\2\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\7\5\1\u01f8\4\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\1\321\5\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u01f9\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\7\5\1\u01fa\4\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\1\u01fb\5\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\4\5\1\201\1\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\1\5\1\377"+
+ "\12\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\2\5"+
+ "\1\u01fc\3\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\u0132\13\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\1\u01fd\13\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\2\5\1\u01fe\11\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\10\5"+
+ "\1\u01b0\12\5\1\4\6\5\2\0\1\103\2\5\1\u01ff"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\1\u0200\2\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\1\350\5\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\u0201\5\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\3\5\1\u0202"+
+ "\2\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\1\5\1\130\1\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\1\5\1\u0132\1\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\7\5\1\u0203\4\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\1\5\1\u0204\4\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\22\5\1\u0205\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\2\5\1\u0206\3\5\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\4\5\1\u0207\1\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\5\1\u0208\1\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\14\5\1\0\23\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\6\5\13\0\1\4\1\0\11\5\1\u0209"+
+ "\2\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\6\5"+
+ "\13\0\1\4\1\0\4\5\1\u01bf\7\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\5\1\u0132\12\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\4\5"+
+ "\1\u020a\2\0\6\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\1\u020b\2\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\6\5\13\0"+
+ "\1\4\1\0\14\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\6\5\13\0\1\4\1\0\14\5\1\0\3\5"+
+ "\1\u020c\17\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\2\5\1\u020d"+
+ "\3\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\4\5"+
+ "\1\u020e\7\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\3\5\1\u020f\2\5\13\0\1\4\1\0\14\5\1\0"+
+ "\23\5\1\4\6\5\2\0\1\103\3\5\1\0\1\5"+
+ "\1\0\1\4\3\0\5\5\2\0\6\5\13\0\1\4"+
+ "\1\0\14\5\1\0\2\5\1\u0210\20\5\1\4\6\5"+
+ "\2\0\1\103\3\5\1\0\1\5\1\0\1\4\3\0"+
+ "\5\5\2\0\3\5\1\u0211\2\5\13\0\1\4\1\0"+
+ "\14\5\1\0\23\5\1\4\6\5\2\0\1\103\3\5"+
+ "\1\0\1\5\1\0\1\4\3\0\5\5\2\0\4\5"+
+ "\1\u0212\1\5\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\5\5\1\u01f3\13\0\1\4"+
+ "\1\0\14\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\5\5\1\u0132\13\0\1\4\1\0\14\5\1\0\23\5"+
+ "\1\4\6\5\2\0\1\103\3\5\1\0\1\5\1\0"+
+ "\1\4\3\0\5\5\2\0\6\5\13\0\1\4\1\0"+
+ "\1\5\1\u01f3\12\5\1\0\23\5\1\4\6\5\2\0"+
+ "\1\103\3\5\1\0\1\5\1\0\1\4\3\0\5\5"+
+ "\2\0\2\5\1\u01b3\3\5\13\0\1\4\1\0\14\5"+
+ "\1\0\23\5\1\4\6\5\2\0\1\103\3\5\1\0"+
+ "\1\5\1\0\1\4\3\0\5\5\2\0\4\5\1\u0213"+
+ "\1\5\13\0\1\4\1\0\14\5\1\0\23\5\1\4"+
+ "\6\5\2\0\1\103\3\5\1\0\1\5\1\0\1\4"+
+ "\3\0\5\5\2\0\6\5\13\0\1\4\1\0\2\5"+
+ "\1\u0203\11\5\1\0\23\5\1\4\6\5\2\0\1\103"+
+ "\3\5\1\0\1\5\1\0\1\4\3\0\5\5\2\0"+
+ "\6\5\13\0\1\4\1\0\2\5\1\u01f6\11\5\1\0"+
+ "\23\5";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[39390];
+ 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 =
+ "\3\0\6\1\1\11\4\1\1\11\17\1\2\11\3\1"+
+ "\1\11\24\1\1\11\5\1\1\11\16\1\1\11\1\0"+
+ "\14\1\1\11\1\1\1\11\35\1\1\0\43\1\1\11"+
+ "\10\0\2\1\1\0\4\1\1\11\20\1\1\11\2\1"+
+ "\1\0\105\1\10\0\15\1\1\11\5\1\1\0\61\1"+
+ "\2\0\1\1\2\0\22\1\1\0\43\1\4\0\17\1"+
+ "\1\0\40\1\1\0\26\1\1\11\66\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[531];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ActionScriptTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public ActionScriptTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public ActionScriptTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 190) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 5:
+ { addNullToken(); return firstToken;
+ }
+ case 30: break;
+ case 22:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 31: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 32: break;
+ case 25:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 33: break;
+ case 20:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 34: break;
+ case 7:
+ { addToken(Token.WHITESPACE);
+ }
+ case 35: break;
+ case 15:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 36: break;
+ case 23:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 37: break;
+ case 14:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 38: break;
+ case 17:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 39: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 40: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 41: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 42: break;
+ case 19:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 43: break;
+ case 27:
+ { addToken(Token.FUNCTION);
+ }
+ case 44: break;
+ case 4:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 45: break;
+ case 6:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 46: break;
+ case 24:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 47: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 48: break;
+ case 16:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 49: break;
+ case 26:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 50: break;
+ case 18:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 51: break;
+ case 29:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 52: break;
+ case 28:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 53: break;
+ case 13:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 54: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 55: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 56: break;
+ case 10:
+ {
+ }
+ case 57: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 58: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 532: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 533: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 534: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex
new file mode 100644
index 0000000..d1efafe
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex
@@ -0,0 +1,1035 @@
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+%%
+
+%public
+%class AssemblerX86TokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. We must have this here as JFLex does not generate a
+ * no parameter constructor.
+ */
+ public AssemblerX86TokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = ([A-Za-z_])
+Digit = ([0-9])
+Number = ({Digit}+)
+
+Identifier = (({Letter}|{Digit})[^ \t\f\n\,\.\+\-\*\/\%\[\]]+)
+
+UnclosedStringLiteral = ([\"][^\"]*)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral = ([\'][^\']*)
+CharLiteral = ({UnclosedCharLiteral}[\'])
+
+CommentBegin = ([;])
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+Label = (({Letter}|{Digit})+[\:])
+
+Operator = ("+"|"-"|"*"|"/"|"%"|"^"|"|"|"&"|"~"|"!"|"="|"<"|">")
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ ".186" |
+ ".286" |
+ ".286P" |
+ ".287" |
+ ".386" |
+ ".386P" |
+ ".387" |
+ ".486" |
+ ".486P" |
+ ".586" |
+ ".586P" |
+ ".686" |
+ ".686P" |
+ ".8086" |
+ ".8087" |
+ ".ALPHA" |
+ ".BREAK" |
+ ".BSS" |
+ ".CODE" |
+ ".CONST" |
+ ".CONTINUE" |
+ ".CREF" |
+ ".DATA" |
+ ".DATA?" |
+ ".DOSSEG" |
+ ".ELSE" |
+ ".ELSEIF" |
+ ".ENDIF" |
+ ".ENDW" |
+ ".ERR" |
+ ".ERR1" |
+ ".ERR2" |
+ ".ERRB" |
+ ".ERRDEF" |
+ ".ERRDIF" |
+ ".ERRDIFI" |
+ ".ERRE" |
+ ".ERRIDN" |
+ ".ERRIDNI" |
+ ".ERRNB" |
+ ".ERRNDEF" |
+ ".ERRNZ" |
+ ".EXIT" |
+ ".FARDATA" |
+ ".FARDATA?" |
+ ".IF" |
+ ".K3D" |
+ ".LALL" |
+ ".LFCOND" |
+ ".LIST" |
+ ".LISTALL" |
+ ".LISTIF" |
+ ".LISTMACRO" |
+ ".LISTMACROALL" |
+ ".MMX" |
+ ".MODEL" |
+ ".MSFLOAT" |
+ ".NO87" |
+ ".NOCREF" |
+ ".NOLIST" |
+ ".NOLISTIF" |
+ ".NOLISTMACRO" |
+ ".RADIX" |
+ ".REPEAT" |
+ ".SALL" |
+ ".SEQ" |
+ ".SFCOND" |
+ ".STACK" |
+ ".STARTUP" |
+ ".TEXT" |
+ ".TFCOND" |
+ ".UNTIL" |
+ ".UNTILCXZ" |
+ ".WHILE" |
+ ".XALL" |
+ ".XCREF" |
+ ".XLIST" |
+ ".XMM" |
+ "__FILE__" |
+ "__LINE__" |
+ "A16" |
+ "A32" |
+ "ADDR" |
+ "ALIGN" |
+ "ALIGNB" |
+ "ASSUME" |
+ "BITS" |
+ "CARRY?" |
+ "CATSTR" |
+ "CODESEG" |
+ "COMM" |
+ "COMMENT" |
+ "COMMON" |
+ "DATASEG" |
+ "DOSSEG" |
+ "ECHO" |
+ "ELSE" |
+ "ELSEIF" |
+ "ELSEIF1" |
+ "ELSEIF2" |
+ "ELSEIFB" |
+ "ELSEIFDEF" |
+ "ELSEIFE" |
+ "ELSEIFIDN" |
+ "ELSEIFNB" |
+ "ELSEIFNDEF" |
+ "END" |
+ "ENDIF" |
+ "ENDM" |
+ "ENDP" |
+ "ENDS" |
+ "ENDSTRUC" |
+ "EVEN" |
+ "EXITM" |
+ "EXPORT" |
+ "EXTERN" |
+ "EXTERNDEF" |
+ "EXTRN" |
+ "FAR" |
+ "FOR" |
+ "FORC" |
+ "GLOBAL" |
+ "GOTO" |
+ "GROUP" |
+ "HIGH" |
+ "HIGHWORD" |
+ "IEND" |
+ "IF" |
+ "IF1" |
+ "IF2" |
+ "IFB" |
+ "IFDEF" |
+ "IFDIF" |
+ "IFDIFI" |
+ "IFE" |
+ "IFIDN" |
+ "IFIDNI" |
+ "IFNB" |
+ "IFNDEF" |
+ "IMPORT" |
+ "INCBIN" |
+ "INCLUDE" |
+ "INCLUDELIB" |
+ "INSTR" |
+ "INVOKE" |
+ "IRP" |
+ "IRPC" |
+ "ISTRUC" |
+ "LABEL" |
+ "LENGTH" |
+ "LENGTHOF" |
+ "LOCAL" |
+ "LOW" |
+ "LOWWORD" |
+ "LROFFSET" |
+ "MACRO" |
+ "NAME" |
+ "NEAR" |
+ "NOSPLIT" |
+ "O16" |
+ "O32" |
+ "OFFSET" |
+ "OPATTR" |
+ "OPTION" |
+ "ORG" |
+ "OVERFLOW?" |
+ "PAGE" |
+ "PARITY?" |
+ "POPCONTEXT" |
+ "PRIVATE" |
+ "PROC" |
+ "PROTO" |
+ "PTR" |
+ "PUBLIC" |
+ "PURGE" |
+ "PUSHCONTEXT" |
+ "RECORD" |
+ "REPEAT" |
+ "REPT" |
+ "SECTION" |
+ "SEG" |
+ "SEGMENT" |
+ "SHORT" |
+ "SIGN?" |
+ "SIZE" |
+ "SIZEOF" |
+ "SIZESTR" |
+ "STACK" |
+ "STRUC" |
+ "STRUCT" |
+ "SUBSTR" |
+ "SUBTITLE" |
+ "SUBTTL" |
+ "THIS" |
+ "TITLE" |
+ "TYPE" |
+ "TYPEDEF" |
+ "UNION" |
+ "USE16" |
+ "USE32" |
+ "USES" |
+ "WHILE" |
+ "WRT" |
+ "ZERO?" { addToken(Token.PREPROCESSOR); }
+
+ "DB" |
+ "DW" |
+ "DD" |
+ "DF" |
+ "DQ" |
+ "DT" |
+ "RESB" |
+ "RESW" |
+ "RESD" |
+ "RESQ" |
+ "REST" |
+ "EQU" |
+ "TEXTEQU" |
+ "TIMES" |
+ "DUP" { addToken(Token.FUNCTION); }
+
+ "BYTE" |
+ "WORD" |
+ "DWORD" |
+ "FWORD" |
+ "QWORD" |
+ "TBYTE" |
+ "SBYTE" |
+ "TWORD" |
+ "SWORD" |
+ "SDWORD" |
+ "REAL4" |
+ "REAL8" |
+ "REAL10" { addToken(Token.DATA_TYPE); }
+
+ /* Registers */
+ "AL" |
+ "BL" |
+ "CL" |
+ "DL" |
+ "AH" |
+ "BH" |
+ "CH" |
+ "DH" |
+ "AX" |
+ "BX" |
+ "CX" |
+ "DX" |
+ "SI" |
+ "DI" |
+ "SP" |
+ "BP" |
+ "EAX" |
+ "EBX" |
+ "ECX" |
+ "EDX" |
+ "ESI" |
+ "EDI" |
+ "ESP" |
+ "EBP" |
+ "CS" |
+ "DS" |
+ "SS" |
+ "ES" |
+ "FS" |
+ "GS" |
+ "ST" |
+ "ST0" |
+ "ST1" |
+ "ST2" |
+ "ST3" |
+ "ST4" |
+ "ST5" |
+ "ST6" |
+ "ST7" |
+ "MM0" |
+ "MM1" |
+ "MM2" |
+ "MM3" |
+ "MM4" |
+ "MM5" |
+ "MM6" |
+ "MM7" |
+ "XMM0" |
+ "XMM1" |
+ "XMM2" |
+ "XMM3" |
+ "XMM4" |
+ "XMM5" |
+ "XMM6" |
+ "XMM7" |
+ "CR0" |
+ "CR2" |
+ "CR3" |
+ "CR4" |
+ "DR0" |
+ "DR1" |
+ "DR2" |
+ "DR3" |
+ "DR4" |
+ "DR5" |
+ "DR6" |
+ "DR7" |
+ "TR3" |
+ "TR4" |
+ "TR5" |
+ "TR6" |
+ "TR7" { addToken(Token.VARIABLE); }
+
+ /* Pentium III Instructions. */
+ "AAA" |
+ "AAD" |
+ "AAM" |
+ "AAS" |
+ "ADC" |
+ "ADD" |
+ "ADDPS" |
+ "ADDSS" |
+ "AND" |
+ "ANDNPS" |
+ "ANDPS" |
+ "ARPL" |
+ "BOUND" |
+ "BSF" |
+ "BSR" |
+ "BSWAP" |
+ "BT" |
+ "BTC" |
+ "BTR" |
+ "BTS" |
+ "CALL" |
+ "CBW" |
+ "CDQ" |
+ "CLC" |
+ "CLD" |
+ "CLI" |
+ "CLTS" |
+ "CMC" |
+ "CMOVA" |
+ "CMOVAE" |
+ "CMOVB" |
+ "CMOVBE" |
+ "CMOVC" |
+ "CMOVE" |
+ "CMOVG" |
+ "CMOVGE" |
+ "CMOVL" |
+ "CMOVLE" |
+ "CMOVNA" |
+ "CMOVNAE" |
+ "CMOVNB" |
+ "CMOVNBE" |
+ "CMOVNC" |
+ "CMOVNE" |
+ "CMOVNG" |
+ "CMOVNGE" |
+ "CMOVNL" |
+ "CMOVNLE" |
+ "CMOVNO" |
+ "CMOVNP" |
+ "CMOVNS" |
+ "CMOVNZ" |
+ "CMOVO" |
+ "CMOVP" |
+ "CMOVPE" |
+ "CMOVPO" |
+ "CMOVS" |
+ "CMOVZ" |
+ "CMP" |
+ "CMPPS" |
+ "CMPS" |
+ "CMPSB" |
+ "CMPSD" |
+ "CMPSS" |
+ "CMPSW" |
+ "CMPXCHG" |
+ "CMPXCHGB" |
+ "COMISS" |
+ "CPUID" |
+ "CWD" |
+ "CWDE" |
+ "CVTPI2PS" |
+ "CVTPS2PI" |
+ "CVTSI2SS" |
+ "CVTSS2SI" |
+ "CVTTPS2PI" |
+ "CVTTSS2SI" |
+ "DAA" |
+ "DAS" |
+ "DEC" |
+ "DIV" |
+ "DIVPS" |
+ "DIVSS" |
+ "EMMS" |
+ "ENTER" |
+ "F2XM1" |
+ "FABS" |
+ "FADD" |
+ "FADDP" |
+ "FBLD" |
+ "FBSTP" |
+ "FCHS" |
+ "FCLEX" |
+ "FCMOVB" |
+ "FCMOVBE" |
+ "FCMOVE" |
+ "FCMOVNB" |
+ "FCMOVNBE" |
+ "FCMOVNE" |
+ "FCMOVNU" |
+ "FCMOVU" |
+ "FCOM" |
+ "FCOMI" |
+ "FCOMIP" |
+ "FCOMP" |
+ "FCOMPP" |
+ "FCOS" |
+ "FDECSTP" |
+ "FDIV" |
+ "FDIVP" |
+ "FDIVR" |
+ "FDIVRP" |
+ "FFREE" |
+ "FIADD" |
+ "FICOM" |
+ "FICOMP" |
+ "FIDIV" |
+ "FIDIVR" |
+ "FILD" |
+ "FIMUL" |
+ "FINCSTP" |
+ "FINIT" |
+ "FIST" |
+ "FISTP" |
+ "FISUB" |
+ "FISUBR" |
+ "FLD1" |
+ "FLDCW" |
+ "FLDENV" |
+ "FLDL2E" |
+ "FLDL2T" |
+ "FLDLG2" |
+ "FLDLN2" |
+ "FLDPI" |
+ "FLDZ" |
+ "FMUL" |
+ "FMULP" |
+ "FNCLEX" |
+ "FNINIT" |
+ "FNOP" |
+ "FNSAVE" |
+ "FNSTCW" |
+ "FNSTENV" |
+ "FNSTSW" |
+ "FPATAN" |
+ "FPREM" |
+ "FPREMI" |
+ "FPTAN" |
+ "FRNDINT" |
+ "FRSTOR" |
+ "FSAVE" |
+ "FSCALE" |
+ "FSIN" |
+ "FSINCOS" |
+ "FSQRT" |
+ "FST" |
+ "FSTCW" |
+ "FSTENV" |
+ "FSTP" |
+ "FSTSW" |
+ "FSUB" |
+ "FSUBP" |
+ "FSUBR" |
+ "FSUBRP" |
+ "FTST" |
+ "FUCOM" |
+ "FUCOMI" |
+ "FUCOMIP" |
+ "FUCOMP" |
+ "FUCOMPP" |
+ "FWAIT" |
+ "FXAM" |
+ "FXCH" |
+ "FXRSTOR" |
+ "FXSAVE" |
+ "FXTRACT" |
+ "FYL2X" |
+ "FYL2XP1" |
+ "HLT" |
+ "IDIV" |
+ "IMUL" |
+ "IN" |
+ "INC" |
+ "INS" |
+ "INSB" |
+ "INSD" |
+ "INSW" |
+ "INT" |
+ "INTO" |
+ "INVD" |
+ "INVLPG" |
+ "IRET" |
+ "JA" |
+ "JAE" |
+ "JB" |
+ "JBE" |
+ "JC" |
+ "JCXZ" |
+ "JE" |
+ "JECXZ" |
+ "JG" |
+ "JGE" |
+ "JL" |
+ "JLE" |
+ "JMP" |
+ "JNA" |
+ "JNAE" |
+ "JNB" |
+ "JNBE" |
+ "JNC" |
+ "JNE" |
+ "JNG" |
+ "JNGE" |
+ "JNL" |
+ "JNLE" |
+ "JNO" |
+ "JNP" |
+ "JNS" |
+ "JNZ" |
+ "JO" |
+ "JP" |
+ "JPE" |
+ "JPO" |
+ "JS" |
+ "JZ" |
+ "LAHF" |
+ "LAR" |
+ "LDMXCSR" |
+ "LDS" |
+ "LEA" |
+ "LEAVE" |
+ "LES" |
+ "LFS" |
+ "LGDT" |
+ "LGS" |
+ "LIDT" |
+ "LLDT" |
+ "LMSW" |
+ "LOCK" |
+ "LODS" |
+ "LODSB" |
+ "LODSD" |
+ "LODSW" |
+ "LOOP" |
+ "LOOPE" |
+ "LOOPNE" |
+ "LOOPNZ" |
+ "LOOPZ" |
+ "LSL" |
+ "LSS" |
+ "LTR" |
+ "MASKMOVQ" |
+ "MAXPS" |
+ "MAXSS" |
+ "MINPS" |
+ "MINSS" |
+ "MOV" |
+ "MOVAPS" |
+ "MOVD" |
+ "MOVHLPS" |
+ "MOVHPS" |
+ "MOVLHPS" |
+ "MOVLPS" |
+ "MOVMSKPS" |
+ "MOVNTPS" |
+ "MOVNTQ" |
+ "MOVQ" |
+ "MOVS" |
+ "MOVSB" |
+ "MOVSD" |
+ "MOVSS" |
+ "MOVSW" |
+ "MOVSX" |
+ "MOVUPS" |
+ "MOVZX" |
+ "MUL" |
+ "MULPS" |
+ "MULSS" |
+ "NEG" |
+ "NOP" |
+ "NOT" |
+ "OR" |
+ "ORPS" |
+ "OUT" |
+ "OUTS" |
+ "OUTSB" |
+ "OUTSD" |
+ "OUTSW" |
+ "PACKSSDW" |
+ "PACKSSWB" |
+ "PACKUSWB" |
+ "PADDB" |
+ "PADDD" |
+ "PADDSB" |
+ "PADDSW" |
+ "PADDUSB" |
+ "PADDUSW" |
+ "PADDW" |
+ "PAND" |
+ "PANDN" |
+ "PAVGB" |
+ "PAVGW" |
+ "PCMPEQB" |
+ "PCMPEQD" |
+ "PCMPEQW" |
+ "PCMPGTB" |
+ "PCMPGTD" |
+ "PCMPGTW" |
+ "PEXTRW" |
+ "PINSRW" |
+ "PMADDWD" |
+ "PMAXSW" |
+ "PMAXUB" |
+ "PMINSW" |
+ "PMINUB" |
+ "PMOVMSKB" |
+ "PMULHUW" |
+ "PMULHW" |
+ "PMULLW" |
+ "POP" |
+ "POPA" |
+ "POPAD" |
+ "POPAW" |
+ "POPF" |
+ "POPFD" |
+ "POPFW" |
+ "POR" |
+ "PREFETCH" |
+ "PSADBW" |
+ "PSHUFW" |
+ "PSLLD" |
+ "PSLLQ" |
+ "PSLLW" |
+ "PSRAD" |
+ "PSRAW" |
+ "PSRLD" |
+ "PSRLQ" |
+ "PSRLW" |
+ "PSUBB" |
+ "PSUBD" |
+ "PSUBSB" |
+ "PSUBSW" |
+ "PSUBUSB" |
+ "PSUBUSW" |
+ "PSUBW" |
+ "PUNPCKHBW" |
+ "PUNPCKHDQ" |
+ "PUNPCKHWD" |
+ "PUNPCKLBW" |
+ "PUNPCKLDQ" |
+ "PUNPCKLWD" |
+ "PUSH" |
+ "PUSHA" |
+ "PUSHAD" |
+ "PUSHAW" |
+ "PUSHF" |
+ "PUSHFD" |
+ "PUSHFW" |
+ "PXOR" |
+ "RCL" |
+ "RCR" |
+ "RDMSR" |
+ "RDPMC" |
+ "RDTSC" |
+ "REP" |
+ "REPE" |
+ "REPNE" |
+ "REPNZ" |
+ "REPZ" |
+ "RET" |
+ "RETF" |
+ "RETN" |
+ "ROL" |
+ "ROR" |
+ "RSM" |
+ "SAHF" |
+ "SAL" |
+ "SAR" |
+ "SBB" |
+ "SCAS" |
+ "SCASB" |
+ "SCASD" |
+ "SCASW" |
+ "SETA" |
+ "SETAE" |
+ "SETB" |
+ "SETBE" |
+ "SETC" |
+ "SETE" |
+ "SETG" |
+ "SETGE" |
+ "SETL" |
+ "SETLE" |
+ "SETNA" |
+ "SETNAE" |
+ "SETNB" |
+ "SETNBE" |
+ "SETNC" |
+ "SETNE" |
+ "SETNG" |
+ "SETNGE" |
+ "SETNL" |
+ "SETNLE" |
+ "SETNO" |
+ "SETNP" |
+ "SETNS" |
+ "SETNZ" |
+ "SETO" |
+ "SETP" |
+ "SETPE" |
+ "SETPO" |
+ "SETS" |
+ "SETZ" |
+ "SFENCE" |
+ "SGDT" |
+ "SHL" |
+ "SHLD" |
+ "SHR" |
+ "SHRD" |
+ "SHUFPS" |
+ "SIDT" |
+ "SLDT" |
+ "SMSW" |
+ "SQRTPS" |
+ "SQRTSS" |
+ "STC" |
+ "STD" |
+ "STI" |
+ "STMXCSR" |
+ "STOS" |
+ "STOSB" |
+ "STOSD" |
+ "STOSW" |
+ "STR" |
+ "SUB" |
+ "SUBPS" |
+ "SUBSS" |
+ "SYSENTER" |
+ "SYSEXIT" |
+ "TEST" |
+ "UB2" |
+ "UCOMISS" |
+ "UNPCKHPS" |
+ "UNPCKLPS" |
+ "WAIT" |
+ "WBINVD" |
+ "VERR" |
+ "VERW" |
+ "WRMSR" |
+ "XADD" |
+ "XCHG" |
+ "XLAT" |
+ "XLATB" |
+ "XOR" |
+ "XORPS" { addToken(Token.RESERVED_WORD); }
+
+}
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character Literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+ /* Labels. */
+ {Label} { addToken(Token.PREPROCESSOR); }
+
+ ^%({Letter}|{Digit})* { addToken(Token.FUNCTION); }
+
+ /* Comment Literals. */
+ {CommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ . { addToken(Token.IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java
new file mode 100644
index 0000000..0d8b37d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java
@@ -0,0 +1,1867 @@
+/* The following code was generated by JFlex 1.4.1 on 2/1/08 1:33 PM */
+
+/*
+ * 12/06/2004
+ *
+ * AssemblerX86TokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing X86 assembler.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class takes plain text and returns tokens representing x86
+ * assembler.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated AssemblerX86TokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.2
+ *
+ */
+
+public class AssemblerX86TokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * 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, 1
+ };
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\14\1\4\2\0"+
+ "\1\13\1\14\1\5\2\0\1\12\1\12\1\3\1\12\1\15\1\12"+
+ "\1\27\1\16\1\21\1\24\1\25\1\26\1\20\1\23\1\17\1\2"+
+ "\1\11\1\6\1\14\1\14\1\14\1\50\1\0\1\30\1\33\1\40"+
+ "\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36\1\31\1\55"+
+ "\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46\1\61\1\52"+
+ "\1\54\1\60\1\53\1\3\1\0\1\3\1\14\1\57\1\0\1\30"+
+ "\1\33\1\40\1\42\1\35\1\47\1\51\1\32\1\45\1\1\1\36"+
+ "\1\31\1\55\1\43\1\41\1\22\1\56\1\34\1\37\1\44\1\46"+
+ "\1\61\1\52\1\54\1\60\1\53\1\0\1\14\1\0\1\14\uff81\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 =
+ "\2\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+ "\1\10\32\1\1\11\1\1\1\12\5\13\2\1\1\14"+
+ "\1\15\25\0\16\1\2\16\23\1\1\13\11\1\1\16"+
+ "\14\1\2\16\7\1\1\16\10\1\1\13\4\1\1\11"+
+ "\3\1\1\16\1\1\1\11\15\1\1\13\1\12\13\1"+
+ "\1\16\42\1\31\0\1\12\11\0\20\1\1\13\1\12"+
+ "\14\1\2\13\3\1\1\13\4\1\1\12\6\1\1\13"+
+ "\3\1\1\13\5\1\1\12\5\1\1\13\4\1\1\12"+
+ "\1\1\1\13\2\1\1\13\10\1\1\13\4\1\1\13"+
+ "\4\1\1\13\5\1\1\12\3\1\3\13\24\1\1\13"+
+ "\37\1\1\13\3\1\1\13\3\1\1\0\1\12\10\0"+
+ "\1\12\17\0\3\1\1\13\11\1\1\13\14\1\2\13"+
+ "\1\1\1\17\1\13\3\1\2\12\10\1\1\12\7\1"+
+ "\1\12\1\13\12\1\1\12\15\1\1\13\5\1\2\13"+
+ "\1\1\1\13\14\1\1\13\3\1\1\13\4\1\1\0"+
+ "\1\12\3\0\1\12\5\0\1\12\5\0\16\1\1\12"+
+ "\5\1\1\12\16\1\1\12\1\1\1\13\4\1\1\13"+
+ "\1\1\1\13\4\1\7\0\1\12\7\1\2\12\10\1"+
+ "\1\0\1\12\2\0\1\12\1\0\4\1\1\12\1\1"+
+ "\3\0\2\1\2\0\1\1\1\12\2\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[668];
+ 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\62\0\144\0\226\0\310\0\372\0\u012c\0\u015e"+
+ "\0\144\0\u0190\0\144\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a"+
+ "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+ "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+ "\0\u05dc\0\u060e\0\u0640\0\u0672\0\u06a4\0\u06d6\0\u0708\0\u0708"+
+ "\0\u073a\0\u076c\0\u079e\0\u0352\0\u07d0\0\u0802\0\u0834\0\144"+
+ "\0\144\0\u0866\0\u0898\0\u08ca\0\u08fc\0\u092e\0\u0960\0\u0992"+
+ "\0\u09c4\0\u09f6\0\u0a28\0\u0a5a\0\u0a8c\0\u0abe\0\u0af0\0\u0b22"+
+ "\0\u0b54\0\u0b86\0\u0bb8\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2"+
+ "\0\u0ce4\0\u0d16\0\u0d48\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42"+
+ "\0\u0e74\0\u0ea6\0\u0ed8\0\u0f0a\0\u0f3c\0\u0352\0\u0f6e\0\u0fa0"+
+ "\0\u0fd2\0\u1004\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130"+
+ "\0\u1162\0\u1194\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u12c0"+
+ "\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec\0\u141e\0\u1450"+
+ "\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c\0\u15ae\0\u15e0"+
+ "\0\u1612\0\u1644\0\u1676\0\u16a8\0\u16da\0\u170c\0\u173e\0\u1770"+
+ "\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a\0\u189c\0\u18ce\0\u1900"+
+ "\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa\0\u1a2c\0\u1a5e\0\u1a90"+
+ "\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a\0\u1bbc\0\u1bee\0\u0352"+
+ "\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u186a\0\u1d1a\0\u1d4c"+
+ "\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa\0\u1edc"+
+ "\0\u1f0e\0\u1f40\0\u1f72\0\u1fa4\0\u1fd6\0\u2008\0\u203a\0\u206c"+
+ "\0\u209e\0\u20d0\0\u2102\0\u2134\0\u2166\0\u2198\0\u21ca\0\u21fc"+
+ "\0\u222e\0\u2260\0\u2292\0\u22c4\0\u22f6\0\u2328\0\u235a\0\u238c"+
+ "\0\u23be\0\u23f0\0\u2422\0\u2454\0\u2486\0\u24b8\0\u24ea\0\u251c"+
+ "\0\u254e\0\u2580\0\u25b2\0\u25e4\0\u2616\0\u2648\0\u267a\0\u26ac"+
+ "\0\u26de\0\u2710\0\u2742\0\u2774\0\u27a6\0\u27d8\0\u280a\0\u283c"+
+ "\0\u286e\0\u07d0\0\u28a0\0\u28d2\0\u2904\0\u2936\0\u2968\0\u299a"+
+ "\0\u29cc\0\u29fe\0\u2a30\0\u2a62\0\u2a94\0\u2ac6\0\u2af8\0\u2b2a"+
+ "\0\u2b5c\0\u2b8e\0\u2bc0\0\u2bf2\0\u2c24\0\u2c56\0\u2c88\0\u2cba"+
+ "\0\u2cec\0\u2d1e\0\u2d50\0\u2d82\0\144\0\u2db4\0\u2de6\0\u2e18"+
+ "\0\u2e4a\0\u2e7c\0\u2eae\0\u2ee0\0\u2f12\0\u2f44\0\u2f76\0\u2fa8"+
+ "\0\u2fda\0\u300c\0\u303e\0\u3070\0\u30a2\0\u30d4\0\u3106\0\u3138"+
+ "\0\u316a\0\u319c\0\u31ce\0\u3200\0\u3232\0\u3264\0\u3296\0\u0352"+
+ "\0\u32c8\0\u32fa\0\u332c\0\u335e\0\u3390\0\u33c2\0\u33f4\0\u3426"+
+ "\0\u3458\0\u348a\0\u34bc\0\u34ee\0\u3520\0\u3552\0\u3584\0\u35b6"+
+ "\0\u35e8\0\u361a\0\u364c\0\u367e\0\u36b0\0\u36e2\0\u3714\0\u3746"+
+ "\0\u3778\0\u37aa\0\u37dc\0\u380e\0\u3840\0\u3872\0\u38a4\0\u38d6"+
+ "\0\u3908\0\u393a\0\u396c\0\u399e\0\u39d0\0\u3a02\0\u3a34\0\u3a66"+
+ "\0\u3a98\0\u3aca\0\u3afc\0\u3b2e\0\u3b60\0\u3b92\0\u3bc4\0\u3bf6"+
+ "\0\u3c28\0\u3c5a\0\u3c8c\0\u3cbe\0\u3cf0\0\u3d22\0\u3d54\0\u3d86"+
+ "\0\u3db8\0\u3dea\0\u3e1c\0\u3e4e\0\u3e80\0\u3eb2\0\u3ee4\0\u3f16"+
+ "\0\u3f48\0\u3f7a\0\u3fac\0\u3fde\0\u4010\0\u36e2\0\u4042\0\u4074"+
+ "\0\u40a6\0\u40d8\0\u410a\0\u413c\0\u416e\0\u41a0\0\u41d2\0\u4204"+
+ "\0\u4236\0\u4268\0\u429a\0\u42cc\0\u42fe\0\u4330\0\u4362\0\u4394"+
+ "\0\u43c6\0\u43f8\0\u442a\0\u445c\0\u448e\0\u44c0\0\u44f2\0\u4524"+
+ "\0\u4556\0\u4588\0\u45ba\0\u45ec\0\u461e\0\u3b92\0\u4650\0\u4682"+
+ "\0\u46b4\0\u361a\0\u46e6\0\u4718\0\u474a\0\u477c\0\u47ae\0\u47e0"+
+ "\0\u4812\0\u4844\0\u4876\0\u48a8\0\u48da\0\u490c\0\u493e\0\u4970"+
+ "\0\u49a2\0\u49d4\0\u4a06\0\u4a38\0\u4a6a\0\u4a9c\0\u4ace\0\u4b00"+
+ "\0\u4b32\0\u4b64\0\u4b96\0\u4bc8\0\u4bfa\0\u4c2c\0\u4c5e\0\u4c90"+
+ "\0\u4cc2\0\u4cf4\0\u4d26\0\u4d58\0\u4d8a\0\u4dbc\0\u410a\0\u4dee"+
+ "\0\u4e20\0\u4e52\0\u4e84\0\u4eb6\0\u4ee8\0\u4f1a\0\u4f4c\0\u4f7e"+
+ "\0\u4fb0\0\u4fe2\0\u5014\0\u5046\0\u5078\0\u50aa\0\u50dc\0\u510e"+
+ "\0\u5140\0\u5172\0\u51a4\0\u51d6\0\u5208\0\u523a\0\u526c\0\u529e"+
+ "\0\u52d0\0\u5302\0\u5334\0\u5366\0\u5398\0\u53ca\0\u53fc\0\u542e"+
+ "\0\u5460\0\u5492\0\u54c4\0\u54f6\0\u5528\0\u555a\0\u558c\0\u55be"+
+ "\0\u55f0\0\u5622\0\u55f0\0\u5654\0\u5686\0\u56b8\0\u56ea\0\u571c"+
+ "\0\u574e\0\u5780\0\u57b2\0\u4d58\0\u57e4\0\u076c\0\u5816\0\u5848"+
+ "\0\u587a\0\u58ac\0\u0352\0\u58de\0\u5910\0\u5942\0\u5974\0\u59a6"+
+ "\0\u1f40\0\u59d8\0\u5a0a\0\u5a3c\0\u5a6e\0\u5aa0\0\u5ad2\0\u5b04"+
+ "\0\u5b36\0\u5b68\0\u5b9a\0\u5bcc\0\u5bfe\0\u5c30\0\u5c62\0\u5c94"+
+ "\0\u5cc6\0\u5cf8\0\u5d2a\0\u5d5c\0\u5d8e\0\u5dc0\0\u5df2\0\u5e24"+
+ "\0\u5e56\0\u5e88\0\u5eba\0\u5eec\0\u5f1e\0\u5f50\0\u5f82\0\u5fb4"+
+ "\0\u5fe6\0\u6018\0\u604a\0\u607c\0\u60ae\0\u60e0\0\u6112\0\u6144"+
+ "\0\u6176\0\u61a8\0\u5460\0\u0834\0\u61da\0\u620c\0\u623e\0\u6270"+
+ "\0\u62a2\0\u62d4\0\u6306\0\u6338\0\u636a\0\u639c\0\u63ce\0\u6400"+
+ "\0\u6432\0\u6464\0\u6496\0\u64c8\0\u64fa\0\u652c\0\u655e\0\u6590"+
+ "\0\u65c2\0\u65f4\0\u6626\0\u6658\0\u668a\0\u66bc\0\u66ee\0\u6720"+
+ "\0\u6752\0\u6784\0\u67b6\0\u67e8\0\u681a\0\u684c\0\u687e\0\u68b0"+
+ "\0\u68e2\0\u6914\0\u6946\0\u6978\0\u69aa\0\u69dc\0\u6a0e\0\u6a40"+
+ "\0\u6a72\0\u6aa4\0\u6ad6\0\u6b08\0\u6b3a\0\u6b6c\0\u6b9e\0\u6bd0"+
+ "\0\u6c02\0\u6c34\0\u6c66\0\u4236\0\u6c98\0\u6cca\0\u65f4\0\u6cfc"+
+ "\0\u6d2e\0\u6d60\0\u6d92\0\u6dc4\0\u6df6\0\u6e28\0\u6e5a\0\u5a6e"+
+ "\0\u6e8c\0\u6ebe\0\u6ef0\0\u6f22\0\u6f54\0\u6f86\0\u6fb8\0\u6fea"+
+ "\0\u701c\0\u704e\0\u7080\0\u70b2\0\u70e4\0\u7116\0\u7148\0\u717a"+
+ "\0\u61da\0\u71ac\0\u71de\0\u7210\0\u7242\0\u1194\0\u7274\0\u72a6"+
+ "\0\u72d8\0\u730a\0\u733c\0\u736e\0\u73a0\0\u73d2\0\u7404\0\u7436"+
+ "\0\u7468\0\u749a\0\u74cc\0\u74fe\0\u7530\0\u7562\0\u7594\0\u587a"+
+ "\0\u75c6\0\u75f8\0\u762a\0\u765c\0\u768e\0\u76c0\0\u76f2\0\u7724"+
+ "\0\u7756\0\u7788\0\u77ba\0\u77ec\0\u781e\0\u7850\0\u7882\0\u4ee8"+
+ "\0\u78b4\0\u78e6\0\u7918\0\u794a\0\u797c\0\u79ae\0\u79e0\0\u7a12"+
+ "\0\u7a44\0\u7a76\0\u7aa8\0\u7ada\0\u7b0c\0\u7b3e\0\u7b70\0\u7ba2"+
+ "\0\u6d60\0\u7bd4\0\u7c06\0\u7c38";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[668];
+ 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 =
+ "\1\3\1\4\1\5\1\3\1\6\1\7\1\10\1\11"+
+ "\1\12\1\3\3\13\1\14\4\5\1\15\5\5\1\16"+
+ "\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26"+
+ "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\3"+
+ "\1\36\1\37\1\40\1\41\1\42\1\43\1\44\1\24"+
+ "\1\45\1\3\1\4\1\5\1\3\1\6\1\7\1\10"+
+ "\1\11\1\12\1\3\1\13\1\46\1\13\1\14\4\5"+
+ "\1\15\5\5\1\16\1\17\1\20\1\21\1\22\1\23"+
+ "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+ "\1\34\1\35\1\3\1\36\1\37\1\40\1\41\1\42"+
+ "\1\43\1\44\1\24\1\45\62\0\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\51"+
+ "\5\24\2\52\1\24\1\52\1\24\1\53\1\24\1\54"+
+ "\1\55\1\54\1\24\1\56\4\24\1\47\1\52\1\24"+
+ "\1\54\1\24\1\57\4\24\1\47\1\24\1\5\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\5\1\24"+
+ "\5\5\20\24\1\47\11\24\4\6\1\60\55\6\5\7"+
+ "\1\61\54\7\7\10\1\0\52\10\10\0\1\12\67\0"+
+ "\1\62\1\63\1\64\1\65\2\0\1\65\2\64\1\0"+
+ "\1\66\1\67\1\0\1\70\1\71\1\72\1\73\1\74"+
+ "\1\75\1\0\1\76\1\77\1\100\1\101\1\102\1\103"+
+ "\2\0\1\104\1\0\1\105\1\106\4\0\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\107\3\24\1\110\1\111\1\24\1\112\1\113\1\114"+
+ "\2\24\1\115\1\116\1\117\1\24\1\47\3\24\1\120"+
+ "\1\121\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\1\122\5\24\1\123\3\24\1\124"+
+ "\1\125\1\126\1\24\1\127\2\24\1\130\2\24\1\131"+
+ "\1\132\4\24\1\47\3\24\1\126\5\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\133\1\134\2\24\1\135\1\136\1\24\1\137\1\24"+
+ "\1\140\1\141\1\24\1\142\1\134\1\24\1\143\1\47"+
+ "\1\144\3\24\1\145\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\13\24\1\146\13\24"+
+ "\1\147\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\126\6\24"+
+ "\2\126\4\24\1\150\1\24\1\151\2\24\1\152\1\153"+
+ "\2\24\1\47\3\24\1\126\3\24\1\154\1\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\155\1\24\1\156\2\157\1\160\5\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\12\24\1\161\1\162\1\24\1\163\3\24"+
+ "\1\164\1\165\1\24\1\166\1\167\4\24\1\47\3\24"+
+ "\1\170\1\171\1\172\2\24\1\173\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\4\24\1\126\5\24\1\174\1\134\1\175"+
+ "\1\176\1\24\1\177\1\24\1\126\1\200\1\24\1\43"+
+ "\1\24\1\201\1\202\1\203\1\204\1\47\1\134\1\205"+
+ "\2\24\1\145\1\206\1\24\1\207\1\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\210\5\24\1\211\1\212\1\126\1\213\1\214\2\24"+
+ "\1\126\1\24\1\215\1\216\5\24\1\47\1\24\1\217"+
+ "\1\24\1\126\1\220\3\24\1\221\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\1\122\3\24"+
+ "\1\222\1\24\1\123\7\24\1\223\11\24\1\224\1\225"+
+ "\1\47\10\24\1\226\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\12\24\1\227\2\126\1\230"+
+ "\1\231\1\232\1\24\1\126\1\24\1\233\1\230\1\24"+
+ "\1\230\1\234\1\235\1\230\1\47\1\24\1\236\1\24"+
+ "\1\126\1\24\1\230\3\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\12\24\1\237\4\24"+
+ "\1\240\3\24\1\241\6\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+ "\1\242\1\243\1\244\1\245\7\24\1\246\2\24\1\47"+
+ "\1\24\1\205\5\24\1\247\1\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\250"+
+ "\1\251\1\24\1\252\2\24\1\253\1\254\3\24\1\255"+
+ "\1\47\4\24\1\256\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\15\24\1\257\3\24"+
+ "\1\260\1\261\2\24\1\262\4\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\3\24\1\263\1\264\5\24\1\265\1\266\1\24\1\267"+
+ "\1\270\2\24\1\271\1\272\1\273\1\274\1\275\1\276"+
+ "\1\277\1\300\1\301\1\47\1\24\1\302\1\24\1\303"+
+ "\1\304\2\24\1\305\1\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\13\24\1\306\2\24"+
+ "\1\307\2\24\1\126\1\24\1\310\6\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\12\24\1\311\1\24\1\312\1\313\1\314\4\24"+
+ "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\316\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\12\24\1\317\1\320\6\24\1\321"+
+ "\1\322\6\24\1\47\4\24\1\323\4\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\324\10\24\1\325\3\24\1\326\1\327\1\24\1\47"+
+ "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\1\24\1\205"+
+ "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\6\24\1\330\2\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\331\12\24\1\47\11\24\1\0\2\46\13\0"+
+ "\32\46\1\0\11\46\3\47\1\0\3\47\2\0\1\47"+
+ "\2\0\1\47\1\0\45\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\17\24\1\54\3\24\1\54"+
+ "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\17\24\1\54\12\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\22\24\1\332\7\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\3\24\1\333\5\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+ "\5\24\2\52\1\24\1\52\1\24\1\54\1\24\3\54"+
+ "\6\24\1\47\1\52\1\24\1\54\6\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\54\25\24\1\47\11\24\17\0\1\334\71\0\1\335"+
+ "\51\0\1\336\61\0\1\337\73\0\1\340\60\0\1\341"+
+ "\14\0\1\342\1\0\1\343\46\0\1\344\2\0\1\345"+
+ "\52\0\1\346\4\0\1\347\55\0\1\350\2\0\1\351"+
+ "\6\0\1\352\10\0\1\353\31\0\1\354\65\0\1\341"+
+ "\4\0\1\355\6\0\1\356\2\0\1\343\46\0\1\357"+
+ "\4\0\1\360\50\0\1\361\10\0\1\362\61\0\1\363"+
+ "\55\0\1\364\11\0\1\343\61\0\1\365\55\0\1\366"+
+ "\46\0\1\367\63\0\1\370\57\0\1\341\1\371\6\0"+
+ "\1\372\14\0\1\373\43\0\1\374\1\0\1\375\13\0"+
+ "\1\376\4\0\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\16\24\1\377\3\24\1\u0100\1\24"+
+ "\1\u0101\1\u0102\4\24\1\47\1\u0103\7\24\1\u0104\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u0105\3\24\1\u0106\3\24\1\u0107\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\3\24\1\u0108\5\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\12\24\1\u0109\1\u010a\1\u010b\1\24\1\u010c\11\24\1\u010d"+
+ "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u010e"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\4\24\1\u010f\11\24\1\54\13\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\16\24\1\u0110\13\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\25\24\1\u0111\4\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\u0112"+
+ "\1\u0113\2\24\1\u0114\3\24\1\u0115\4\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\23\24\1\142\6\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\u0116\10\24\1\u0117\3\24\1\u0118\1\u0119\1\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\2\24\1\u0110\27\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\3\24\1\u0110\26\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\54"+
+ "\6\24\1\54\2\24\1\54\5\24\1\47\4\24\1\54"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\27\24\1\u011a\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\u011b\25\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u011c"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\22\24\1\54\1\24\1\u011d"+
+ "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\24\24\1\u011e\5\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\14\24\1\u011f\1\u0120\1\54\13\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\24\24\1\146\5\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\23\24\1\u0121\6\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0122"+
+ "\6\24\1\54\3\24\1\u0123\4\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\13\24\1\54\5\24\1\54\10\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\22\24\1\u0124\1\u0125\1\u0126\5\24\1\47\1\24\1\u0127"+
+ "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\21\24\1\54\10\24\1\47\4\24\1\u0128"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\16\24\1\54\13\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\54\10\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\54"+
+ "\2\24\1\146\5\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\213"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\54\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\1\u0129\10\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+ "\1\54\12\24\1\54\1\47\1\24\1\u012a\7\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\30\24\1\u012b\1\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\54"+
+ "\2\24\2\54\7\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u012c"+
+ "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\u012d\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\4\24\1\u012e\5\24\1\u012f\6\24\1\u0130"+
+ "\1\u0131\3\24\1\u0132\3\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+ "\1\47\4\24\1\54\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\13\24\1\54\2\24"+
+ "\1\54\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\u0133\21\24"+
+ "\1\u0134\3\24\1\47\4\24\1\u0135\4\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+ "\1\47\3\24\1\126\5\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\21\24\1\u0136\10\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\126\25\24\1\47\3\24"+
+ "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\126\22\24\1\126\2\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\14\24\1\u0137\15\24\1\47\3\24"+
+ "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\27\24\1\126\2\24\1\47\3\24"+
+ "\1\126\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\24\24\1\u0138\1\24\1\u0139\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\u013a\21\24\1\u013b\1\u013c"+
+ "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\143"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\30\24\1\230\1\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u013d\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\54"+
+ "\1\u011f\1\24\1\54\13\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+ "\1\u013e\2\24\1\u013e\4\24\1\u013f\4\24\1\u0140\1\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\7\24"+
+ "\1\154\1\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\22\24\1\u0141\3\24\1\u0142\3\24"+
+ "\1\47\1\u0143\10\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\12\24\1\u0126\17\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\1\126\1\24\2\126\1\24\5\126\1\u0144"+
+ "\3\24\1\u0145\3\24\1\54\1\u0126\1\54\2\24\1\54"+
+ "\2\24\1\47\4\24\1\u0128\4\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\146"+
+ "\5\24\1\47\1\u0146\1\24\1\u0147\6\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+ "\1\u0148\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0149\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\23\24\1\315\6\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\16\24\1\u014a\13\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\u014b\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\30\24\1\u014c\1\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\13\24\1\u011b\2\24\1\u014d\7\24"+
+ "\1\u014e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\22\24\1\54\1\24"+
+ "\1\54\1\24\1\143\1\54\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\126"+
+ "\2\24\2\126\1\24\1\126\20\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\24\24\1\u014f\5\24\1\47\4\24\1\u0150\4\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\5\24\1\54\3\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\52"+
+ "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\4\24\1\u0151\15\24\1\54"+
+ "\1\u0152\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0153\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\12\24\1\u0154\13\24\1\u0155\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\143\25\24\1\47\1\u0110"+
+ "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u0156\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\31\24\1\u0157\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0158\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\12\24\1\54\6\24\1\54\4\24"+
+ "\1\u0159\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\1\126\1\24\2\126"+
+ "\1\24\5\126\20\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\54"+
+ "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\21\24\1\u015a\10\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\10\24\1\u015b\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\230\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+ "\1\u0103\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\12\24\1\115\17\24\1\47\1\54"+
+ "\10\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\4\24\1\54\14\24\1\u015c\4\24\1\54"+
+ "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\27\24\1\u012c\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\7\24\1\154\1\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\2\24\1\126\2\24\4\126\21\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\146\10\24\1\47\3\24\1\u015d\5\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\26\24\1\u015e\3\24\1\47\4\24\1\u015f\4\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\u0160\25\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u0161"+
+ "\12\24\1\146\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0162"+
+ "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\u0163\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\27\24\1\u0164\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\u0165\1\u0166\3\24\1\u0167\3\24\1\47\10\24"+
+ "\1\u0168\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24"+
+ "\1\u0110\4\24\1\u0169\1\u016a\1\24\1\u016b\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\4\24\1\u013a\23\24\1\u011b\1\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\3\24\1\54\26\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u016c\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u016d"+
+ "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\4\24\1\u016e\22\24\1\u016f"+
+ "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0170"+
+ "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\12\24\1\u0171\3\24\1\u0172\7\24\1\u0173"+
+ "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\15\24\1\143\1\u0110\5\24"+
+ "\1\u0174\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0175\5\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\13\24\1\u0176\5\24\1\u0177\10\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\21\24\1\u0178\3\24\1\u0179\4\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\12\24\1\u017a\7\24\1\u017b\3\24"+
+ "\1\u017c\1\u017d\1\u017e\1\24\1\47\5\24\1\u017f\3\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\13\24\1\u0180\1\143\6\24\1\u0181\6\24\1\47"+
+ "\4\24\1\u0182\4\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\16\24\1\u0161\13\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\17\24\1\u0183\7\24\1\u0184\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\21\24\1\u0185\1\u0186\1\57\3\24\1\u0187"+
+ "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\21\24\1\146\10\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\12\24\1\317\1\u0176\5\24\1\u0188\1\u0189"+
+ "\1\24\1\u018a\1\u018b\4\24\1\47\4\24\1\u018c\4\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\22\24\1\u018d\7\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+ "\1\u018e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\12\24\1\311\10\24"+
+ "\1\315\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\12\24\1\156\3\24"+
+ "\1\u018f\2\24\1\u0190\1\u0191\3\24\1\u0192\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\30\24\1\u0193\1\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\13\24\1\u0194\16\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u0195"+
+ "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\23\24\1\u0196\6\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u0137\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\27\24\1\u015e"+
+ "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\27\24\1\u0197\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u0110\3\24\1\47\4\24\1\u0135"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\16\24\1\u0198\13\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\16\24\1\u0199\13\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u0176"+
+ "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\12\24\1\u019a\17\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\14\24\1\u019b\15\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\16\24\1\u019c\13\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\4\24\1\231\4\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\21\24\1\u019d\1\u019e\7\24"+
+ "\1\47\3\24\1\u019f\5\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+ "\1\u01a0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\25\24\1\u019f\4\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\13\24\1\u015b\16\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01a1"+
+ "\15\24\1\u01a2\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\16\24\1\u01a3\13\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\2\24\1\54\6\24"+
+ "\20\0\1\365\60\0\1\u01a4\62\0\1\u01a5\61\0\1\u01a5"+
+ "\2\0\1\365\60\0\1\u01a6\70\0\1\u01a7\67\0\1\u01a8"+
+ "\62\0\1\u01a9\56\0\1\u01aa\63\0\1\365\64\0\1\u01ab"+
+ "\41\0\1\u01ac\76\0\1\u01ad\56\0\1\u01ae\67\0\1\u01af"+
+ "\64\0\1\u01b0\56\0\1\365\75\0\1\365\33\0\1\u01b1"+
+ "\66\0\1\101\66\0\1\u01b2\1\u01b3\62\0\1\u01b4\54\0"+
+ "\1\u01b5\41\0\1\u01b6\11\0\1\u01b7\6\0\1\372\75\0"+
+ "\1\u01b0\51\0\1\u01b8\51\0\1\u01b9\72\0\1\u01ba\61\0"+
+ "\1\u01bb\50\0\1\357\102\0\1\365\53\0\1\u01bc\54\0"+
+ "\1\u01bd\73\0\1\365\5\0\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\27\24\1\u01be\2\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\20\24\1\u01bf\11\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\24\24\1\u01c0\5\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+ "\1\u01c1\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u0110\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\1\u01c2\10\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\31\24\1\u01c3\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0110\3\24"+
+ "\1\u0137\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+ "\1\u01c4\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u01c5\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\24\24\1\u01c6\5\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01c7"+
+ "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\30\24\1\u01c8\1\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\12\24\1\u01c9\1\u01c7\16\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\15\24\1\u01c0\14\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\u01ca\25\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\12\24\1\u01cb\7\24"+
+ "\1\u01cc\6\24\1\u01cb\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c5"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\13\24\1\u01cd\16\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\1\u0103\10\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\14\24"+
+ "\1\u010f\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01ce\25\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\24\24\1\u01cf\5\24\1\47\3\24"+
+ "\1\u01d0\5\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\10\24\1\u01d1\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\25\24\1\u01d0\4\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u01d2"+
+ "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d3\10\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\13\24\1\54\16\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+ "\1\237\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\11\24"+
+ "\1\u0110\2\24\1\143\10\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\143\20\24\1\u01d4\4\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+ "\1\54\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\17\24\1\u01d5\12\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\31\24\1\225\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+ "\1\47\10\24\1\u01d6\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\1\u01d7\10\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\12\24\1\u01d5\5\24\1\54\11\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\4\24\1\u01d8\25\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\u01d9\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+ "\1\u0131\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\3\24\1\u01da\5\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\14\24\1\u0127\15\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\57\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0176\4\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\21\24\1\u0110\10\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\17\24\1\u01db\12\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+ "\1\u01dc\5\24\1\u01dd\1\u0110\3\24\1\47\2\24\1\54"+
+ "\6\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\13\24\1\u01de\16\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\15\24\1\230\6\24\1\230\1\24\1\230\3\24\1\47"+
+ "\1\24\1\230\3\24\1\230\3\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\u01df"+
+ "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\25\24\1\54\3\24\1\54"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\4\24\1\232\4\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\21\24\1\232\10\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\142\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e0\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\23\24\1\u0110\6\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\4\24\1\u0110\14\24\1\u01e1\5\24\1\u01e2\2\24"+
+ "\1\47\4\24\1\u0110\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\142\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\23\24\1\u013f\6\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\16\24\1\u013d\1\u01e3\12\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\26\24\1\u01e4\3\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0110"+
+ "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\24\24\1\54\5\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\16\24\1\u01e5\13\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\31\24\1\u01d4\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0155\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\51\5\24\2\52\1\24"+
+ "\1\52\1\24\1\54\1\24\3\54\1\24\1\56\4\24"+
+ "\1\47\1\52\1\24\1\54\6\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\4\24\1\u01e6\4\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\22\24\1\u01e7\7\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\30\24\1\u01e8\1\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\25\24\1\u01e9\4\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u01ea"+
+ "\12\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\4\24\1\143\14\24\1\u01eb"+
+ "\4\24\1\u01ec\3\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u01ed"+
+ "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\u019f\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\17\24\1\u01ee\12\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\u0176\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u01ef"+
+ "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\21\24\1\u01f0\10\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\17\24\1\u015a\12\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\u01f1\2\24\1\47\4\24\1\u01f2\4\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\143\14\24\1\u01f3\10\24\1\47\3\24\1\u01f4"+
+ "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\10\24\1\u0142\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\u01f5\14\24\1\u01f6\4\24\1\u01f7\3\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\26\24\1\u01f0\3\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+ "\1\u016f\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\21\24\1\u01f8\10\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\16\24\1\u01f9\13\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\12\24\1\u015a\17\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\u01fa\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\14\24"+
+ "\1\143\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\u01fb\25\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\26\24\1\u01fc\3\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\13\24\1\u0103\16\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+ "\1\u01fd\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01fe\12\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\22\24\1\u0110\7\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\24\24\1\u0110\5\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+ "\1\u01ff\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\10\24"+
+ "\1\54\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\15\24\1\54\6\24\1\54\1\24\1\115"+
+ "\3\24\1\47\1\24\1\54\7\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0200"+
+ "\1\24\1\u0201\14\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\23\24\1\54"+
+ "\6\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\13\24\1\u0202\7\24\1\u0203"+
+ "\1\54\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\17\24\1\u01e2\7\24"+
+ "\1\u0204\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\15\24\1\u0110\6\24"+
+ "\1\u0205\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\24\24\1\u0206\5\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\1\122\5\24\1\123\12\24\1\u0110"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\4\24\1\u0207"+
+ "\4\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\22\24\1\u0208\7\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\23\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\4\24\1\u0209\4\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\u0173\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\17\24\1\u020a\12\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\12\24\1\u020b\17\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u020c"+
+ "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\1\54\3\24\1\u020d\6\24"+
+ "\1\u020e\3\24\1\u020f\2\24\1\213\7\24\1\47\2\24"+
+ "\1\54\6\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\26\24\1\57\3\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\26\24\1\120\3\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\24\24"+
+ "\1\u0210\5\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\12\24\1\u0211\17\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\54\12\24\1\u020f\1\24"+
+ "\2\213\7\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\25\24\1\u0212\4\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\15\24\1\u0213\14\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\16\24\1\146\13\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+ "\1\u0214\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\21\24\1\54\10\24"+
+ "\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\23\24\1\u0216\6\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\22\24\1\u0217\7\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\32\24\1\47\10\24\1\u0213\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+ "\13\24\1\u0218\3\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\13\24\1\u0180"+
+ "\16\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\25\24\1\311\4\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u020c\1\24\1\u0219\1\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\23\24\1\u021a\6\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\u021b\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u0217"+
+ "\4\24\1\146\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\30\24\1\u011b"+
+ "\1\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\23\24\1\u021c\6\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\17\24\1\u01d6\12\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\u0178\10\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u017a"+
+ "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\14\24\1\54\15\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\16\24\1\u021d\13\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\13\24\1\u020c\16\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\3\24\1\u021e"+
+ "\26\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\15\24\1\u021f\14\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\30\24\1\u0220\1\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\25\24\1\u0221\4\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\24\24\1\u01db"+
+ "\5\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\23\24\1\u01e9\6\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u0222\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\1\54\10\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\4\24\1\143\25\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\20\24\1\u0223\11\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\16\24\1\u0137\13\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\u01d4\1\u0224\1\u0225\4\24\1\u0226\2\24\1\54\1\u0227"+
+ "\2\24\1\u01d4\1\24\1\47\2\24\1\u0214\1\24\1\u0228"+
+ "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\27\24\1\u0229\2\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\27\24\1\u022a\2\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+ "\1\54\13\24\1\47\1\24\1\54\7\24\20\0\1\365"+
+ "\2\0\1\365\60\0\1\365\71\0\1\u022b\60\0\1\365"+
+ "\74\0\1\u022c\56\0\1\u022d\50\0\1\u022e\76\0\1\376"+
+ "\51\0\1\u022f\61\0\1\u0230\42\0\1\365\2\0\1\365"+
+ "\11\0\1\365\1\0\1\365\4\0\1\u0231\1\u0232\1\0"+
+ "\1\u0233\61\0\1\101\4\0\1\365\53\0\1\365\51\0"+
+ "\1\u0234\3\0\1\u022e\56\0\1\365\63\0\1\u01b0\4\0"+
+ "\1\u0235\45\0\1\u0236\70\0\1\u0237\45\0\1\365\103\0"+
+ "\1\u0238\61\0\1\u0239\56\0\1\u023a\50\0\1\u01b2\67\0"+
+ "\1\u01b0\53\0\1\u023b\65\0\1\u01a7\24\0\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+ "\1\u01ef\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\21\24\1\u023c\6\24"+
+ "\1\u023d\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\15\24\1\54\3\24"+
+ "\1\u01c2\2\24\1\54\3\24\1\u023e\1\24\1\47\1\24"+
+ "\1\54\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\25\24\1\54\4\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\15\24\1\54\14\24\1\47\1\24\1\54\7\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\17\24\1\u023f\12\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\12\24"+
+ "\1\u0240\17\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\16\24\1\213\13\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\15\24\1\213\14\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\24\24\1\54\5\24\1\47\1\24\1\54\3\24"+
+ "\1\54\3\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\31\24\1\213\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\24\24\1\54\5\24\1\47\1\24\1\54\7\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u0241\12\24\1\47\1\u0242\10\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\23\24"+
+ "\1\u0243\6\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0244\2\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\22\24\1\u0245\7\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\24\24\1\u0246\5\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\213\6\24\1\u0247\1\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+ "\1\47\4\24\1\u0248\4\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\13\24\1\213\1\u0249"+
+ "\15\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\25\24\1\u024a\4\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\13\24\1\u0110\16\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\26\24\1\u024b\3\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+ "\5\24\1\u01dd\4\24\1\47\2\24\1\54\6\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\15\24\1\54\6\24\1\54\5\24\1\47\1\24\1\54"+
+ "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\22\24\1\u0135\7\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\12\24\1\u01e5\17\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+ "\12\24\1\47\2\24\1\54\6\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\1\u024c\1\u01db"+
+ "\5\24\1\u01db\22\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\16\24\1\u0162"+
+ "\13\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\27\24\1\u024d\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\31\24\1\u0110\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\16\24"+
+ "\1\u024e\13\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+ "\1\u0110\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\26\24\1\u0110\3\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\17\24\1\u024f\12\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\20\24"+
+ "\1\u0110\11\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\22\24\1\u0250\7\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\50\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\u01f0\1\24\1\u01e2\6\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\54\4\24\1\115\3\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+ "\1\u01d5\1\u0251\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\u01d6"+
+ "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\25\24\1\u0252\4\24\1\47"+
+ "\3\24\1\311\5\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\7\24\1\u01e9"+
+ "\1\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\115\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\143\10\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u024f"+
+ "\3\24\1\u013d\6\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\54"+
+ "\3\24\1\54\2\24\1\54\5\24\1\47\1\24\1\54"+
+ "\7\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\22\24\1\u0253\7\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\u0254\5\24\1\u0255\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\u0256\5\24\1\u0257\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\u0258\14\24\1\u0259\10\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u01e5\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u025a"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\17\24\1\u025b\12\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\13\24\1\u025c\16\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+ "\1\u025d\12\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\21\24\1\230\10\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\24\24\1\u0205\5\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\30\24\1\u0244\1\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\30\24"+
+ "\1\u025e\1\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\27\24\1\u013d\2\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\4\24\1\u019b\25\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\20\24\1\u0103\11\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\31\24"+
+ "\1\u025f\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\17\24\1\u01e2\12\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\25\24\1\u025f\4\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\u01f1\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\20\24\1\u0260"+
+ "\11\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\1\54\31\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\32\24\1\47\4\24\1\u0261\4\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\27\24"+
+ "\1\54\2\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0262\21\24"+
+ "\1\257\4\24\1\47\1\257\10\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\u0164"+
+ "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\27\24\1\u0263\2\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\13\24\1\u01d6\16\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\22\24\1\u0264\7\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\54"+
+ "\11\24\1\u020c\13\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\3\24\1\54\5\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\4\24\1\u020c\22\24\1\u020c"+
+ "\2\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\10\24\1\u0265"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\21\24\1\u0177\10\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\17\24"+
+ "\1\u020f\1\24\2\213\7\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+ "\1\u0266\14\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\4\24"+
+ "\1\u020c\4\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\10\24\1\u0266\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\4\24\1\u0215\4\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\12\24\1\u0267"+
+ "\17\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\32\24\1\47\3\24\1\u0268"+
+ "\5\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\12\24\1\u01d5\17\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\u0110\25\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\10\24\1\u0176\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\15\24\1\54\14\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\32\24\1\47\4\24\1\u0269\4\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\143\7\24\1\u01d4\15\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\4\24"+
+ "\1\143\6\24\1\u01d4\16\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\15\24"+
+ "\1\54\3\24\1\54\2\24\1\54\5\24\1\47\1\24"+
+ "\1\54\1\24\1\54\5\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\26\24\1\u026a\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\21\24\1\u026b\10\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\25\24\1\u026c\4\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+ "\1\u026c\16\24\1\47\11\24\30\0\1\365\61\0\1\341"+
+ "\14\0\1\101\7\0\1\u026d\47\0\1\354\54\0\1\365"+
+ "\53\0\1\u01b0\76\0\1\101\51\0\1\101\7\0\1\u026e"+
+ "\47\0\1\365\6\0\1\357\10\0\1\365\50\0\1\u026f"+
+ "\63\0\1\u0270\62\0\1\u0271\64\0\1\365\46\0\1\u0272"+
+ "\63\0\1\u0273\53\0\1\u0274\60\0\1\361\72\0\1\u022f"+
+ "\20\0\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\21\24\1\u0275\10\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\21\24\1\u0276\10\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u01c2"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\26\24\1\u0277\3\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\26\24\1\u0103\3\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\5\24\1\u0278\3\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\26\24\1\u0278"+
+ "\3\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\25\24\1\u0279\4\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\20\24\1\u027a\11\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\1\24\1\u0176\7\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\21\24\1\u027b"+
+ "\10\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\30\24\1\213\1\24\1\47"+
+ "\1\24\1\54\7\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\15\24\1\u0110\14\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\14\24\1\u027c\15\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\11\24\1\u01db\20\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\31\24\1\u027d"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\25\24\1\u01fe\4\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\25\24\1\u01e5\4\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\26\24"+
+ "\1\u015e\3\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\26\24\1\u0139\3\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\14\24\1\u027e\15\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\3\24\1\u027f\26\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\3\24"+
+ "\1\u01d4\26\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\3\24\1\u0280\26\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\3\24\1\u01f1\26\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\21\24\1\u0254\10\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\21\24"+
+ "\1\u0256\10\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\13\24\1\u0281\16\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\32\24\1\47\1\u0110\10\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\27\24\1\u01e5\2\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\5\24\1\172\3\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\24\24\1\u0282\5\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\27\24\1\u0110\2\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\13\24\2\u01d4\15\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\54"+
+ "\6\24\1\54\3\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\25\24\1\146"+
+ "\4\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\23\24\1\143\6\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\15\24\1\52\1\24\1\54\5\24\1\u0283"+
+ "\2\24\1\54\1\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\22\24\1\146"+
+ "\7\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\4\24\1\u0209\25\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\23\24\1\u0284\6\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\4\24\1\143\25\24\1\47\5\24\1\54\3\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\20\24\1\u01d4\11\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\17\24\1\u0285"+
+ "\12\24\1\47\11\24\30\0\1\u0286\100\0\1\u0287\55\0"+
+ "\1\u0287\64\0\1\u0288\56\0\1\u0289\67\0\1\365\54\0"+
+ "\1\u028a\55\0\1\u028b\21\0\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\24\24\1\213\5\24"+
+ "\1\47\1\24\1\u0247\7\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\1\24"+
+ "\1\u0247\7\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\22\24\1\u0191\7\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\26\24\1\u028c\3\24\1\47\11\24\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\13\24"+
+ "\2\u028d\15\24\1\47\11\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\20\24\1\u0247\11\24"+
+ "\1\47\11\24\1\47\2\24\1\0\3\47\2\0\1\50"+
+ "\2\0\1\47\1\0\23\24\1\u01e2\6\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\1\u0110\2\24\1\u0110\11\24\1\u0110\1\24\1\u0110"+
+ "\4\24\1\u0205\1\u016a\1\24\1\u028e\2\24\1\47\11\24"+
+ "\1\47\2\24\1\0\3\47\2\0\1\50\2\0\1\47"+
+ "\1\0\32\24\1\47\1\u0222\10\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\4\24\1\u020d"+
+ "\25\24\1\47\11\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\21\24\1\u020d\10\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\23\24\1\u028f\6\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u0290\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\52"+
+ "\1\24\1\54\10\24\1\54\1\24\1\47\11\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\32\24\1\47\10\24\1\216\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\32\24\1\47\6\24"+
+ "\1\u0291\2\24\40\0\1\u0292\66\0\1\365\62\0\1\u01b2"+
+ "\60\0\1\101\7\0\1\u0293\60\0\1\u0294\5\0\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\17\24\1\u0295\12\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\15\24\1\213"+
+ "\6\24\1\216\5\24\1\47\1\24\1\u0176\7\24\1\47"+
+ "\2\24\1\0\3\47\2\0\1\50\2\0\1\47\1\0"+
+ "\24\24\1\u013d\5\24\1\47\11\24\1\47\2\24\1\0"+
+ "\3\47\2\0\1\50\2\0\1\47\1\0\32\24\1\47"+
+ "\1\24\1\u01e9\7\24\1\47\2\24\1\0\3\47\2\0"+
+ "\1\50\2\0\1\47\1\0\13\24\1\u0296\16\24\1\47"+
+ "\11\24\1\47\2\24\1\0\3\47\2\0\1\50\2\0"+
+ "\1\47\1\0\32\24\1\47\6\24\1\u0110\2\24\34\0"+
+ "\1\u0297\55\0\1\u0298\104\0\1\365\6\0\1\47\2\24"+
+ "\1\0\3\47\2\0\1\50\2\0\1\47\1\0\32\24"+
+ "\1\47\3\24\1\u01e5\5\24\1\47\2\24\1\0\3\47"+
+ "\2\0\1\50\2\0\1\47\1\0\27\24\1\u0299\2\24"+
+ "\1\47\11\24\41\0\1\u029a\60\0\1\u029b\51\0\1\341"+
+ "\65\0\1\u029c\66\0\1\365\20\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[31850];
+ 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 =
+ "\2\0\1\11\5\1\1\11\1\1\1\11\44\1\2\11"+
+ "\25\0\225\1\31\0\1\11\11\0\245\1\1\0\1\1"+
+ "\10\0\1\1\17\0\155\1\1\0\1\1\3\0\1\1"+
+ "\5\0\1\1\5\0\61\1\7\0\22\1\1\0\1\1"+
+ "\2\0\1\1\1\0\6\1\3\0\2\1\2\0\2\1"+
+ "\2\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[668];
+ 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[];
+
+ /** 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;
+
+ /**
+ * 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;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. We must have this here as JFLex does not generate a
+ * no parameter constructor.
+ */
+ public AssemblerX86TokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public AssemblerX86TokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public AssemblerX86TokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 200) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ if (zzMarkedPosL > zzStartRead) {
+ switch (zzBufferL[zzMarkedPosL-1]) {
+ case '\n':
+ case '\u000B':
+ case '\u000C':
+ case '\u0085':
+ case '\u2028':
+ case '\u2029':
+ zzAtBOL = true;
+ break;
+ case '\r':
+ if (zzMarkedPosL < zzEndReadL)
+ zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+ else if (zzAtEOF)
+ zzAtBOL = false;
+ else {
+ boolean eof = zzRefill();
+ zzMarkedPosL = zzMarkedPos;
+ zzEndReadL = zzEndRead;
+ zzBufferL = zzBuffer;
+ if (eof)
+ zzAtBOL = false;
+ else
+ zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+ }
+ break;
+ default:
+ zzAtBOL = false;
+ }
+ }
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ if (zzAtBOL)
+ zzState = ZZ_LEXSTATE[zzLexicalState+1];
+ else
+ zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+ 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;
+
+ int 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 11:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 16: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 17: break;
+ case 12:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 18: break;
+ case 9:
+ { addToken(Token.FUNCTION);
+ }
+ case 19: break;
+ case 5:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 20: break;
+ case 14:
+ { addToken(Token.VARIABLE);
+ }
+ case 21: break;
+ case 7:
+ { addToken(Token.WHITESPACE);
+ }
+ case 22: break;
+ case 10:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 23: break;
+ case 15:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 24: break;
+ case 4:
+ { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+ }
+ case 25: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 26: break;
+ case 2:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 27: break;
+ case 13:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 28: break;
+ case 3:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 29: break;
+ case 6:
+ { addNullToken(); return firstToken;
+ }
+ case 30: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 669: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex
new file mode 100644
index 0000000..f23bdd1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex
@@ -0,0 +1,270 @@
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+%%
+
+%public
+%class BBCodeTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Token type specific to BBCodeTokenMaker; this signals that the user has
+ * ended a line with an unclosed tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -1;
+
+ /**
+ * Whether closing markup tags are automatically completed for BBCode.
+ */
+ private static boolean completeCloseTags = true;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public BBCodeTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. The default value
+ * for BBCode is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns <code>null</code> since BBCode has no comments.
+ *
+ * @return <code>null</code> always.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return null;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case INTERNAL_INTAG:
+ state = INTAG;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Whitespace = ([ \t\f]+)
+LineTerminator = ([\n])
+Identifier = ([^ \t\f\n\[]+)
+InTagIdentifier = ([^ \t\f\n\[\]\/\=]+)
+Tag = ("b"|"i"|"u"|"s"|"size"|"color"|"center"|"quote"|"url"|"img"|"ul"|"li"|"ol"|"youtube"|"gvideo")
+
+%state INTAG
+
+%%
+
+<YYINITIAL> {
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "[" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "[/" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<INTAG> {
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); }
+ {Tag} { addToken(Token.MARKUP_TAG_NAME); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/]" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ "]" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ . { addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */ }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java
new file mode 100644
index 0000000..e53f0b9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java
@@ -0,0 +1,725 @@
+/* The following code was generated by JFlex 1.4.1 on 11/18/09 4:41 PM */
+
+/*
+ * 11/18/2009
+ *
+ * BBCodeTokenMaker.java - Generates tokens for BBCode syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for BBCode.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated BBCodeTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.7
+ *
+ */
+
+public class BBCodeTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int INTAG = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\16\0\1\27\15\0"+
+ "\1\30\35\0\1\3\1\0\1\4\4\0\1\5\1\13\1\26\1\12"+
+ "\1\0\1\23\1\0\1\6\2\0\1\15\1\22\1\17\1\14\1\0"+
+ "\1\21\1\16\1\10\1\20\1\7\1\25\2\0\1\24\1\11\uff85\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 =
+ "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+ "\4\10\6\5\1\11\1\12\1\4\23\5";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[41];
+ 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\31\0\62\0\113\0\144\0\175\0\226\0\144"+
+ "\0\144\0\226\0\257\0\310\0\341\0\372\0\u0113\0\u012c"+
+ "\0\u0145\0\u015e\0\u0177\0\u0190\0\144\0\144\0\u01a9\0\u01c2"+
+ "\0\u01db\0\u01f4\0\u020d\0\u0226\0\u023f\0\u0258\0\u0271\0\u028a"+
+ "\0\u02a3\0\u02bc\0\u02d5\0\u02ee\0\u0307\0\u0320\0\u0339\0\u0352"+
+ "\0\u036b";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[41];
+ 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 =
+ "\1\3\1\4\1\5\1\6\25\3\1\7\1\4\1\0"+
+ "\1\10\1\11\1\12\1\13\1\14\1\15\2\7\1\16"+
+ "\1\17\1\20\3\7\1\21\1\7\1\22\1\23\2\7"+
+ "\1\24\1\25\1\3\3\0\25\3\1\0\1\4\107\0"+
+ "\1\26\1\0\1\7\4\0\22\7\2\0\1\7\4\0"+
+ "\15\7\1\27\4\7\2\0\1\7\4\0\10\7\1\12"+
+ "\1\17\10\7\2\0\1\7\4\0\1\7\1\30\20\7"+
+ "\2\0\1\7\4\0\5\7\1\31\1\7\1\32\12\7"+
+ "\2\0\1\7\4\0\10\7\1\12\11\7\2\0\1\7"+
+ "\4\0\1\7\1\12\20\7\2\0\1\7\4\0\2\7"+
+ "\1\33\17\7\2\0\1\7\4\0\20\7\1\34\1\7"+
+ "\2\0\1\7\4\0\7\7\1\35\12\7\6\0\1\11"+
+ "\24\0\1\7\4\0\16\7\1\12\3\7\2\0\1\7"+
+ "\4\0\4\7\1\36\15\7\2\0\1\7\4\0\12\7"+
+ "\1\37\7\7\2\0\1\7\4\0\10\7\1\40\11\7"+
+ "\2\0\1\7\4\0\7\7\1\41\12\7\2\0\1\7"+
+ "\4\0\1\7\1\42\20\7\2\0\1\7\4\0\2\7"+
+ "\1\43\17\7\2\0\1\7\4\0\5\7\1\12\14\7"+
+ "\2\0\1\7\4\0\13\7\1\44\6\7\2\0\1\7"+
+ "\4\0\7\7\1\45\12\7\2\0\1\7\4\0\13\7"+
+ "\1\36\6\7\2\0\1\7\4\0\21\7\1\46\2\0"+
+ "\1\7\4\0\13\7\1\47\6\7\2\0\1\7\4\0"+
+ "\5\7\1\45\14\7\2\0\1\7\4\0\11\7\1\12"+
+ "\10\7\2\0\1\7\4\0\5\7\1\50\14\7\2\0"+
+ "\1\7\4\0\2\7\1\51\17\7\2\0\1\7\4\0"+
+ "\7\7\1\12\12\7\2\0\1\7\4\0\1\36\21\7"+
+ "\2\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[900];
+ 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 =
+ "\2\0\2\1\1\11\2\1\2\11\13\1\2\11\23\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[41];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Token type specific to BBCodeTokenMaker; this signals that the user has
+ * ended a line with an unclosed tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -1;
+
+ /**
+ * Whether closing markup tags are automatically completed for BBCode.
+ */
+ private static boolean completeCloseTags = true;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public BBCodeTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. The default value
+ * for BBCode is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns <code>null</code> since BBCode has no comments.
+ *
+ * @return <code>null</code> always.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return null;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case INTERNAL_INTAG:
+ state = INTAG;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public BBCodeTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public BBCodeTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 80) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 11: break;
+ case 9:
+ { addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 12: break;
+ case 2:
+ { addToken(Token.WHITESPACE);
+ }
+ case 13: break;
+ case 10:
+ { addToken(Token.OPERATOR);
+ }
+ case 14: break;
+ case 8:
+ { addToken(Token.MARKUP_TAG_NAME);
+ }
+ case 15: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 16: break;
+ case 6:
+ { addToken(Token.IDENTIFIER); /* Unhandled chars, not likely */
+ }
+ case 17: break;
+ case 5:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 18: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 19: break;
+ case 7:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 20: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case INTAG: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 42: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 43: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex
new file mode 100644
index 0000000..3fb16c9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex
@@ -0,0 +1,669 @@
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+%%
+
+%public
+%class CPlusPlusTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CPlusPlusTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+Digit = [0-9]
+HexDigit = {Digit}|[A-Fa-f]
+OctalDigit = [0-7]
+Exponent = [eE][+-]?{Digit}+
+
+PreprocessorWord = define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph = ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1 = ([\\]{OctalDigit})
+OctEscape2 = ([\\]{OctalDigit}{OctalDigit})
+OctEscape3 = ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape = ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape = ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr = ([^\'\n\\])
+Escape = ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral = ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral = ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr = ([^\"\n\\])
+FalseTrigraph = (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral = ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator = \n
+WhiteSpace = [ \t\f]
+
+MLCBegin = "/*"
+MLCEnd = "*/"
+LineCommentBegin = "//"
+
+NonFloatSuffix = (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral = ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral = ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral = ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier = ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier = ({NonSeparator}+)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "auto" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "const_cast" |
+ "continue" |
+ "default" |
+ "delete" |
+ "do" |
+ "dynamic_cast" |
+ "else" |
+ "enum" |
+ "explicit" |
+ "extern" |
+ "for" |
+ "friend" |
+ "goto" |
+ "if" |
+ "inline" |
+ "mutable" |
+ "namespace" |
+ "new" |
+ "operator" |
+ "private" |
+ "protected" |
+ "public" |
+ "register" |
+ "reinterpret_cast" |
+ "return" |
+ "sizeof" |
+ "static" |
+ "static_cast" |
+ "struct" |
+ "switch" |
+ "template" |
+ "this" |
+ "throw" |
+ "try" |
+ "typedef" |
+ "typeid" |
+ "typename" |
+ "union" |
+ "using" |
+ "virtual" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+
+ /* Boolean literals. */
+ "true" |
+ "false" |
+
+ /* Data types. */
+ "bool" |
+ "char" |
+ "double" |
+ "float" |
+ "int" |
+ "long" |
+ "short" |
+ "signed" |
+ "unsigned" |
+ "void" |
+ "wchar_t" { addToken(Token.DATA_TYPE); }
+
+ /* Standard functions */
+ "abort" |
+ "abs" |
+ "acos" |
+ "asctime" |
+ "asin" |
+ "assert" |
+ "atan2" |
+ "atan" |
+ "atexit" |
+ "atof" |
+ "atoi" |
+ "atol" |
+ "bsearch" |
+ "btowc" |
+ "calloc" |
+ "ceil" |
+ "clearerr" |
+ "clock" |
+ "cosh" |
+ "cos" |
+ "ctime" |
+ "difftime" |
+ "div" |
+ "errno" |
+ "exit" |
+ "exp" |
+ "fabs" |
+ "fclose" |
+ "feof" |
+ "ferror" |
+ "fflush" |
+ "fgetc" |
+ "fgetpos" |
+ "fgetwc" |
+ "fgets" |
+ "fgetws" |
+ "floor" |
+ "fmod" |
+ "fopen" |
+ "fprintf" |
+ "fputc" |
+ "fputs" |
+ "fputwc" |
+ "fputws" |
+ "fread" |
+ "free" |
+ "freopen" |
+ "frexp" |
+ "fscanf" |
+ "fseek" |
+ "fsetpos" |
+ "ftell" |
+ "fwprintf" |
+ "fwrite" |
+ "fwscanf" |
+ "getchar" |
+ "getc" |
+ "getenv" |
+ "gets" |
+ "getwc" |
+ "getwchar" |
+ "gmtime" |
+ "isalnum" |
+ "isalpha" |
+ "iscntrl" |
+ "isdigit" |
+ "isgraph" |
+ "islower" |
+ "isprint" |
+ "ispunct" |
+ "isspace" |
+ "isupper" |
+ "isxdigit" |
+ "labs" |
+ "ldexp" |
+ "ldiv" |
+ "localeconv" |
+ "localtime" |
+ "log10" |
+ "log" |
+ "longjmp" |
+ "malloc" |
+ "mblen" |
+ "mbrlen" |
+ "mbrtowc" |
+ "mbsinit" |
+ "mbsrtowcs" |
+ "mbstowcs" |
+ "mbtowc" |
+ "memchr" |
+ "memcmp" |
+ "memcpy" |
+ "memmove" |
+ "memset" |
+ "mktime" |
+ "modf" |
+ "offsetof" |
+ "perror" |
+ "pow" |
+ "printf" |
+ "putchar" |
+ "putc" |
+ "puts" |
+ "putwc" |
+ "putwchar" |
+ "qsort" |
+ "raise" |
+ "rand" |
+ "realloc" |
+ "remove" |
+ "rename" |
+ "rewind" |
+ "scanf" |
+ "setbuf" |
+ "setjmp" |
+ "setlocale" |
+ "setvbuf" |
+ "setvbuf" |
+ "signal" |
+ "sinh" |
+ "sin" |
+ "sprintf" |
+ "sqrt" |
+ "srand" |
+ "sscanf" |
+ "strcat" |
+ "strchr" |
+ "strcmp" |
+ "strcmp" |
+ "strcoll" |
+ "strcpy" |
+ "strcspn" |
+ "strerror" |
+ "strftime" |
+ "strlen" |
+ "strncat" |
+ "strncmp" |
+ "strncpy" |
+ "strpbrk" |
+ "strrchr" |
+ "strspn" |
+ "strstr" |
+ "strtod" |
+ "strtok" |
+ "strtol" |
+ "strtoul" |
+ "strxfrm" |
+ "swprintf" |
+ "swscanf" |
+ "system" |
+ "tanh" |
+ "tan" |
+ "time" |
+ "tmpfile" |
+ "tmpnam" |
+ "tolower" |
+ "toupper" |
+ "ungetc" |
+ "ungetwc" |
+ "va_arg" |
+ "va_end" |
+ "va_start" |
+ "vfprintf" |
+ "vfwprintf" |
+ "vprintf" |
+ "vsprintf" |
+ "vswprintf" |
+ "vwprintf" |
+ "wcrtomb" |
+ "wcscat" |
+ "wcschr" |
+ "wcscmp" |
+ "wcscoll" |
+ "wcscpy" |
+ "wcscspn" |
+ "wcsftime" |
+ "wcslen" |
+ "wcsncat" |
+ "wcsncmp" |
+ "wcsncpy" |
+ "wcspbrk" |
+ "wcsrchr" |
+ "wcsrtombs" |
+ "wcsspn" |
+ "wcsstr" |
+ "wcstod" |
+ "wcstok" |
+ "wcstol" |
+ "wcstombs" |
+ "wcstoul" |
+ "wcsxfrm" |
+ "wctob" |
+ "wctomb" |
+ "wmemchr" |
+ "wmemcmp" |
+ "wmemcpy" |
+ "wmemmove" |
+ "wmemset" |
+ "wprintf" |
+ "wscanf" { addToken(Token.FUNCTION); }
+
+ /* Standard-defined macros. */
+ "__DATE__" |
+ "__TIME__" |
+ "__FILE__" |
+ "__LINE__" |
+ "__STDC__" { addToken(Token.PREPROCESSOR); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* Preprocessor directives */
+ "#"{WhiteSpace}*{PreprocessorWord} { addToken(Token.PREPROCESSOR); }
+
+ /* String/Character Literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+ {ErrorUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment Literals. */
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ /* Separators. */
+ "(" |
+ ")" |
+ "[" |
+ "]" |
+ "{" |
+ "}" { addToken(Token.SEPARATOR); }
+
+ /* Operators. */
+ {Trigraph} |
+ "=" |
+ "+" |
+ "-" |
+ "*" |
+ "/" |
+ "%" |
+ "~" |
+ "<" |
+ ">" |
+ "<<" |
+ ">>" |
+ "==" |
+ "+=" |
+ "-=" |
+ "*=" |
+ "/=" |
+ "%=" |
+ ">>=" |
+ "<<=" |
+ "^" |
+ "&" |
+ "&&" |
+ "|" |
+ "||" |
+ "?" |
+ ":" |
+ "," |
+ "!" |
+ "++" |
+ "--" |
+ "." |
+ "," { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Some lines will end in '\' to wrap an expression. */
+ "\\" { addToken(Token.IDENTIFIER); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Other punctuation, we'll highlight it as "identifiers." */
+ ";" { addToken(Token.IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java
new file mode 100644
index 0000000..158e255
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java
@@ -0,0 +1,2319 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 10:02 PM */
+
+/*
+ * 11/19/2004
+ *
+ * CPlusPlusTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in C++.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A parser for the C++ programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CPlusPlusTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ *
+ */
+
+public class CPlusPlusTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+ "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+ "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+ "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+ "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+ "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+ "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+ "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+ "\1\67\1\22\1\45\1\71\1\74\1\73\1\75\1\112\1\115\1\112"+
+ "\1\64\uff81\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 =
+ "\3\0\1\1\2\2\1\3\1\4\17\2\2\4\1\5"+
+ "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+ "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+ "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+ "\22\2\1\17\56\2\1\0\1\20\1\21\2\22\1\23"+
+ "\1\6\2\10\1\24\11\2\1\15\6\1\1\0\14\2"+
+ "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+ "\1\16\3\2\1\26\6\2\1\26\23\2\1\27\16\2"+
+ "\1\26\1\2\1\26\55\2\1\6\1\30\1\6\3\22"+
+ "\1\6\2\10\1\31\10\2\1\32\4\1\1\33\4\1"+
+ "\6\0\14\2\10\0\5\2\1\16\1\0\37\2\1\27"+
+ "\44\2\1\26\2\2\1\26\7\2\1\6\1\10\7\2"+
+ "\2\32\7\1\4\0\1\33\4\0\11\2\2\0\1\34"+
+ "\2\0\1\35\43\2\1\17\13\2\1\32\1\33\3\1"+
+ "\7\0\10\2\4\0\22\2\2\1\1\33\3\0\12\2"+
+ "\2\0\1\33\4\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[578];
+ 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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+ "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+ "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+ "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u08d6\0\u079e\0\u0924"+
+ "\0\352\0\u079e\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0af8"+
+ "\0\u079e\0\u0b46\0\u079e\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+ "\0\u0d1a\0\u0d68\0\u079e\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0eee"+
+ "\0\u079e\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+ "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+ "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+ "\0\u163e\0\u168c\0\u16da\0\u1728\0\u1776\0\u17c4\0\u0138\0\u1812"+
+ "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+ "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+ "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+ "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+ "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u23f4\0\u2442"+
+ "\0\u2490\0\u24de\0\u252c\0\u257a\0\u25c8\0\u2616\0\u079e\0\u079e"+
+ "\0\u2664\0\u26b2\0\u079e\0\u2700\0\u274e\0\u279c\0\u079e\0\u27ea"+
+ "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+ "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+ "\0\u2d18\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec\0\u2f3a"+
+ "\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u079e\0\u315c"+
+ "\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330\0\u337e\0\u33cc"+
+ "\0\u341a\0\u3468\0\u34b6\0\u3504\0\u1026\0\u3552\0\u1026\0\u35a0"+
+ "\0\u35ee\0\u363c\0\u0138\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+ "\0\u3810\0\u385e\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4\0\u3a32"+
+ "\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54\0\u3ca2"+
+ "\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u0138\0\u3e76\0\u3ec4"+
+ "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+ "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+ "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+ "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+ "\0\u48d2\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6\0\u4af4"+
+ "\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8\0\u4d16\0\u4d64"+
+ "\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38\0\u4f86\0\u4fd4"+
+ "\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u079e\0\u51a8\0\u51f6"+
+ "\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u079e\0\u53ca\0\u5418"+
+ "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+ "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+ "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+ "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+ "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+ "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+ "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+ "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+ "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+ "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+ "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+ "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+ "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+ "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+ "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+ "\0\u78f6\0\u7944\0\u7992\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca\0\u7b18"+
+ "\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a\0\u7d88"+
+ "\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa\0\u7ff8"+
+ "\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a\0\u8268"+
+ "\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u843c\0\u848a\0\u84d8"+
+ "\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e\0\u86ac\0\u86fa\0\u8748"+
+ "\0\u8796\0\u87e4\0\u8832\0\u8880\0\u88ce\0\u891c\0\u896a\0\u4356"+
+ "\0\u89b8\0\u8a06\0\u8a54\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda"+
+ "\0\u8c28\0\u8c76\0\u8cc4\0\u8d12\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a"+
+ "\0\u8e98\0\u8ee6\0\u8f34\0\u8f82\0\u8fd0\0\u901e\0\u906c\0\u90ba"+
+ "\0\u9108\0\u9156\0\u91a4\0\u91f2\0\u9240\0\u928e\0\u92dc\0\u932a"+
+ "\0\u9378\0\u93c6\0\u9414\0\u9462\0\u94b0\0\u94fe\0\u954c\0\u959a"+
+ "\0\u95e8\0\u1026\0\352\0\u9636\0\u9684\0\u96d2\0\u9720\0\u976e"+
+ "\0\u97bc\0\u980a\0\u9858\0\u98a6\0\u98f4\0\u9942\0\u9990\0\u99de"+
+ "\0\u9a2c\0\u9a7a\0\u9ac8\0\u9b16\0\u9b64\0\u9bb2\0\u86fa\0\u9c00"+
+ "\0\u87e4\0\u9c4e\0\u9c9c\0\u9cea\0\u9d38\0\u9d86\0\u9dd4\0\u9e22"+
+ "\0\u9e70\0\u9ebe\0\u9f0c\0\u9f5a\0\u9fa8\0\u9ff6\0\ua044\0\ua092"+
+ "\0\ua0e0\0\ua12e\0\ua17c\0\ua1ca\0\ua218\0\u079e\0\ua266\0\ua2b4"+
+ "\0\ua302\0\ua350\0\ua39e\0\ua3ec\0\u928e\0\ua43a\0\ua488\0\ua4d6"+
+ "\0\ua524\0\ua572\0\ua5c0\0\ua60e\0\ua65c\0\u0138\0\ua6aa\0\ua6f8"+
+ "\0\ua746\0\ua794";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[578];
+ 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 =
+ "\1\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+ "\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20"+
+ "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+
+ "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+
+ "\1\41\1\7\1\5\1\42\1\43\1\44\1\45\1\46"+
+ "\1\47\1\31\2\5\1\50\1\5\1\51\1\52\2\4"+
+ "\1\32\1\53\1\37\1\31\1\5\1\54\1\37\1\55"+
+ "\4\5\2\7\1\5\1\56\10\5\1\32\1\37\1\57"+
+ "\1\60\12\61\1\62\30\61\1\63\5\61\1\64\14\61"+
+ "\1\65\2\61\1\66\24\61\12\67\1\70\30\67\1\71"+
+ "\22\67\1\72\2\67\1\73\24\67\7\4\1\0\17\4"+
+ "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+ "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\74"+
+ "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\3\75\1\7\1\75"+
+ "\1\7\1\76\1\0\1\75\1\76\3\75\1\77\4\75"+
+ "\1\100\4\75\11\0\1\75\1\7\1\75\2\0\2\75"+
+ "\1\7\2\0\1\100\1\77\1\101\1\75\1\0\3\75"+
+ "\4\0\2\75\1\0\5\75\2\7\12\75\13\0\1\37"+
+ "\20\0\1\37\65\0\1\4\6\5\1\0\1\5\1\102"+
+ "\1\5\1\103\4\5\1\104\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\2\5\1\105\16\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\106\1\107\1\5"+
+ "\1\110\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\3\5\1\111\15\5\4\0\1\4\6\5"+
+ "\1\0\1\5\1\112\1\113\2\5\1\114\1\115\1\116"+
+ "\1\117\1\120\1\5\1\121\1\122\1\123\1\124\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\125\1\0"+
+ "\1\126\20\5\4\0\1\4\6\5\1\0\2\5\1\127"+
+ "\1\5\1\130\1\5\1\131\10\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\132\12\5\1\133\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\134\7\5\1\135\3\5"+
+ "\1\136\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\137\1\5\1\140\2\5\1\141\1\142\1\5\1\143"+
+ "\1\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\145\1\146\1\0\1\147\1\5\1\150\5\5"+
+ "\1\151\10\5\4\0\1\4\6\5\1\0\1\5\1\152"+
+ "\12\5\1\153\2\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\2\5\1\154\10\5\1\155\3\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\156\3\5\1\157\2\5\1\160"+
+ "\3\5\1\161\2\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\162\1\163\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\164\1\5\1\165\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\166\5\5\1\167\1\170"+
+ "\1\5\1\171\4\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\172\2\5\1\173\1\174\4\5\11\0\1\4"+
+ "\2\5\2\0\1\5\1\175\1\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\176"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\177"+
+ "\6\5\1\174\5\5\1\200\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\1\5\1\201\6\5\1\202\1\5\1\203\1\5"+
+ "\1\204\2\5\11\0\1\4\2\5\2\0\1\5\1\205"+
+ "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\5\1\200\17\5\33\0"+
+ "\1\206\116\0\1\37\233\0\1\37\1\0\1\207\16\0"+
+ "\1\210\44\0\27\211\1\212\3\211\1\213\4\211\1\214"+
+ "\2\211\1\0\52\211\34\0\1\31\116\0\1\31\110\0"+
+ "\1\37\6\0\1\37\56\0\40\43\1\215\2\43\1\216"+
+ "\1\217\51\43\1\4\6\5\1\0\2\5\1\220\1\221"+
+ "\2\5\1\220\1\5\1\222\2\5\1\144\1\223\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\224\20\5\4\0\1\4\6\5\1\0\6\5\1\225"+
+ "\1\226\1\227\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\230\1\0\21\5\4\0\3\75\1\7"+
+ "\1\75\1\7\1\76\1\0\1\75\1\76\3\75\1\77"+
+ "\4\75\1\100\4\75\11\0\1\75\1\7\1\231\2\0"+
+ "\2\75\1\7\2\0\1\100\1\77\1\101\1\75\1\0"+
+ "\3\75\4\0\2\75\1\0\3\75\1\231\1\75\2\7"+
+ "\12\75\54\0\1\47\50\0\1\101\1\0\1\101\33\0"+
+ "\1\101\5\0\1\101\26\0\2\101\16\0\7\4\1\0"+
+ "\1\232\1\233\1\4\1\234\1\4\1\235\4\4\1\236"+
+ "\1\237\3\4\11\0\3\4\2\0\3\4\1\240\1\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\1\4\6\5\1\0\1\5\1\241\1\5"+
+ "\1\242\3\5\1\243\1\244\3\5\1\245\1\5\1\246"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\247\1\5"+
+ "\1\0\2\5\1\250\16\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\141\2\5\1\251\1\5\1\144\2\5\1\252"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\253\1\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\254"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\120\0\1\37\116\0\1\37\12\61\1\0"+
+ "\30\61\1\0\5\61\1\0\14\61\1\0\2\61\1\0"+
+ "\24\61\13\0\1\255\53\0\1\256\60\0\1\257\152\0"+
+ "\1\260\117\0\1\261\24\0\12\67\1\0\30\67\1\0"+
+ "\22\67\1\0\2\67\1\0\24\67\13\0\1\262\53\0"+
+ "\1\263\115\0\1\264\117\0\1\265\24\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\1\5\1\266\1\0\1\267\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\11\5\1\270\1\5\1\271\3\5"+
+ "\1\272\1\5\4\0\7\75\1\0\17\75\11\0\3\75"+
+ "\2\0\3\75\2\0\2\75\1\0\1\75\1\0\3\75"+
+ "\4\0\2\75\1\0\21\75\4\0\3\75\1\273\1\75"+
+ "\1\273\1\75\1\274\17\75\10\0\1\274\1\75\1\273"+
+ "\1\75\2\0\2\75\1\273\2\0\2\75\1\0\1\75"+
+ "\1\0\3\75\4\0\2\75\1\0\5\75\2\273\12\75"+
+ "\4\0\7\75\1\0\12\75\1\275\4\75\11\0\3\75"+
+ "\2\0\3\75\2\0\1\275\1\75\1\0\1\75\1\0"+
+ "\3\75\4\0\2\75\1\0\21\75\4\0\7\75\1\0"+
+ "\5\75\1\275\11\75\11\0\3\75\2\0\3\75\2\0"+
+ "\1\75\1\275\1\0\1\75\1\0\3\75\4\0\2\75"+
+ "\1\0\21\75\4\0\3\75\1\101\1\75\1\101\1\276"+
+ "\1\0\1\75\1\276\1\277\2\75\1\277\11\75\11\0"+
+ "\1\75\1\101\1\75\2\0\2\75\1\101\2\0\1\75"+
+ "\1\277\1\0\1\277\1\0\3\75\4\0\2\75\1\0"+
+ "\5\75\2\101\12\75\4\0\1\4\6\5\1\0\2\5"+
+ "\1\300\2\5\1\301\11\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\2\5\1\302\14\5\11\0\1\4\2\5\2\0"+
+ "\1\303\2\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\12\5\1\304\4\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\305\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\12\5\1\306\4\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\6\5\1\307\10\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\7\5\1\310\7\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\311\7\5\1\312\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\313\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\7\5\1\314\1\315"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\316"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\317"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\320"+
+ "\7\5\1\143\5\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\321\1\5\1\322\13\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\7\5\1\127\3\5\1\323\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\5\5\1\324\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\325\2\5\1\326"+
+ "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\327"+
+ "\11\5\11\0\1\4\2\5\2\0\1\5\1\330\1\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\331\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\332\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\333\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\141\1\334\3\5\1\144\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\335\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\336\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\337\4\5\1\340\1\341"+
+ "\2\5\1\342\1\343\1\344\1\345\1\346\1\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\3\5"+
+ "\1\347\15\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\127"+
+ "\20\5\4\0\1\4\6\5\1\0\16\5\1\350\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\351\1\5\1\352"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\353"+
+ "\4\5\1\354\3\5\1\355\1\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+ "\1\330\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\356\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\357\10\5\1\360\1\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\4\5\1\361"+
+ "\14\5\4\0\1\4\6\5\1\0\11\5\1\143\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\362\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\363\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\7\5\1\325\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\10\5\1\364\6\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\7\5\1\365\4\5"+
+ "\1\366\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\367\2\5\1\141\4\5\1\144\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\370\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\311\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\371\1\372\7\5\1\204"+
+ "\1\373\1\374\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\375\1\0\1\376\20\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\377\1\332\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\2\5\1\u0100\14\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\u0101\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\u0102\13\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\u0103\6\5\1\u0104\3\5\1\u0105"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u0106"+
+ "\1\5\1\357\10\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\5\5\1\u0107\1\307\10\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\u0108\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\14\5\1\u0109\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\242\13\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\u010a\2\5\1\u010b\6\5\1\u010c"+
+ "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010d"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\314"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u010e"+
+ "\4\5\1\u010f\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\1\303\20\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\1\5\1\u0110\1\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u0111\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\u0112\2\5\1\u0113\2\5\1\200\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\330\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\u0114\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\303\1\5\1\151\6\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0115\6\5"+
+ "\1\u0116\3\5\1\u0117\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u0118\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\163\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+ "\1\u0119\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\315\16\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\u011a\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\5\5\1\u0107\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\5\5\1\323\1\u011b\1\u011c"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\230\1\0\21\5\34\0\10\37\56\0\33\u011d\1\u011e"+
+ "\7\u011d\1\0\101\u011d\1\u011f\3\u011d\1\u011e\7\u011d\1\0"+
+ "\57\u011d\1\u0120\4\u011d\1\211\1\u011d\1\211\2\u011d\1\211"+
+ "\4\u011d\1\211\2\u011d\1\211\3\u011d\1\u0121\4\u011d\1\211"+
+ "\1\u0122\1\u0123\1\0\3\211\1\u0122\17\u011d\1\211\4\u011d"+
+ "\1\u0123\1\u011d\2\u0122\16\u011d\5\216\1\43\4\216\1\43"+
+ "\1\216\1\43\2\216\1\43\4\216\1\43\2\216\1\43"+
+ "\3\216\1\43\4\216\2\43\1\u0124\1\0\4\43\17\216"+
+ "\1\43\4\216\1\u0124\1\216\2\43\56\216\1\u0125\3\216"+
+ "\1\u0126\51\216\1\4\6\5\1\0\13\5\1\144\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\224\20\5\4\0\1\4\6\5\1\0\7\5\1\u0127"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0128"+
+ "\1\5\1\u0129\11\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\u012a"+
+ "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\13\5\1\144\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\u012b\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\u012c\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\u012d\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\u012e\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\3\75\4\u012f\1\0"+
+ "\3\u012f\6\75\1\u012f\2\75\1\u012f\2\75\11\0\1\75"+
+ "\1\u012f\1\75\2\0\1\75\2\u012f\2\0\2\75\1\0"+
+ "\1\u012f\1\0\3\75\4\0\2\75\1\0\5\75\2\u012f"+
+ "\2\75\2\u012f\5\75\1\u012f\4\0\7\4\1\0\1\4"+
+ "\1\u0130\15\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\4\4\1\u0131\1\u0132\1\4\1\u0133"+
+ "\7\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+ "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+ "\7\4\1\0\2\4\1\u0134\1\4\1\u0135\12\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\3\4\1\u0136\13\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\4\4\1\u0137\12\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\7\4\1\u0138\7\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\14\0\1\u0139\1\u013a\1\0\1\u013b\1\0\1\u013c"+
+ "\4\0\1\u013d\1\u013e\24\0\1\240\45\0\1\4\6\5"+
+ "\1\0\16\5\1\u013f\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\16\5\1\u0140\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+ "\1\u0141\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\2\5\1\127\16\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\340\4\5\1\343\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\4\5\1\357\12\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\u0142\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\u0143\3\5\1\u0144\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0145\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0146\1\u0147"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0148"+
+ "\1\u0149\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\201\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\u014a\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\151\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\21\0\1\u014b\123\0\1\u014c\161\0"+
+ "\1\u014d\117\0\1\u014e\41\0\1\u014f\123\0\1\u0150\161\0"+
+ "\1\u0151\117\0\1\u0152\24\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0153\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0154\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\12\5\1\u0155\6\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0156\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\13\5\1\u0157\5\5\4\0\3\75\1\273\1\75\1\273"+
+ "\1\75\1\0\5\75\1\77\4\75\1\100\4\75\11\0"+
+ "\1\75\1\273\1\75\2\0\2\75\1\273\2\0\1\100"+
+ "\1\77\1\0\1\75\1\0\3\75\4\0\2\75\1\0"+
+ "\5\75\2\273\12\75\7\0\1\273\1\0\1\273\33\0"+
+ "\1\273\5\0\1\273\26\0\2\273\16\0\3\75\1\u0158"+
+ "\1\75\1\u0158\1\75\1\u0159\17\75\10\0\1\u0159\1\75"+
+ "\1\u0158\1\75\2\0\2\75\1\u0158\2\0\2\75\1\0"+
+ "\1\75\1\0\3\75\4\0\2\75\1\0\5\75\2\u0158"+
+ "\12\75\4\0\1\4\6\5\1\0\14\5\1\u015a\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u015b\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\2\5\1\200\14\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\1\5\1\u015c\1\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\u015d\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\16\5\1\127\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\127\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u015e\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\303\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\u015f\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u0160\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u0161\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\2\5\1\303\14\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\12\5\1\u0162\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u0163\3\5\1\u0164\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0165\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0166"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\303"+
+ "\6\5\1\u0167\3\5\1\332\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\3\5\1\u0168\15\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0169\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0112\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\377\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\u016a\13\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\u016b\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\u0141\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\303\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\u016c\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\303\16\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\u0102\11\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u016d\13\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u016e\13\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u016f\13\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u0170\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u0171\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\u0172\12\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u0173\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\7\5\1\u0174\2\5\1\u0175\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\u0176\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u0177\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\337\16\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\u0178\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\3\5\1\u0168\15\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\303"+
+ "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\15\5\1\u0179\1\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\6\5\1\u017b\12\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\u017c\11\5\11\0\1\4\2\5\2\0"+
+ "\1\u017d\1\u017e\1\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u017f"+
+ "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\303\1\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u0180\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0181\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\332\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\315\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\u0164\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\166\1\200\1\5"+
+ "\1\u0182\1\323\1\u0183\1\u0184\1\5\1\u0185\1\u0186\1\u0187"+
+ "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0188\1\0\3\5\1\u0189\15\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u018a\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0108\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u018b"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\u018c"+
+ "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\242"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u018d"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u018e"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u0160"+
+ "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\362"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0140"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u018f"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0190"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\303"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0191"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u0165"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0143"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0192"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0193\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\u0194\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u0195\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\336\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\u0196\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\u0197\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\u0198\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u0199\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u019a\12\5\11\0\1\4\2\5\2\0\1\u019b\2\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u019c\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\u019d\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+ "\1\303\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\303\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\151\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\10\5\1\127\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\3\5\1\u01a0\15\5\4\0\1\4"+
+ "\6\5\1\0\2\5\2\303\1\5\1\303\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u01a1\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u01a2\4\5\1\303"+
+ "\2\5\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\1\u019f\20\5\4\0\1\4\6\5"+
+ "\1\0\6\5\1\u01a3\2\5\1\u01a4\4\5\1\374\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\14\5\1\u01a5\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\u01a6\3\5\1\u01a7"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\323\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\230\1\0\21\5\4\0\33\u011d\1\213\7\u011d"+
+ "\1\0\102\u011d\3\211\1\u0121\4\211\3\u011d\1\0\57\u011d"+
+ "\1\211\25\u011d\1\u011e\5\u011d\1\211\1\u011d\1\0\3\u011d"+
+ "\1\211\26\u011d\2\211\16\u011d\33\0\1\u011e\62\0\5\u011d"+
+ "\1\u0120\25\u011d\1\u011e\5\u011d\1\u0120\1\u011d\1\0\3\u011d"+
+ "\1\u0120\26\u011d\2\u0120\21\u011d\4\u01a9\1\u011d\3\u01a9\6\u011d"+
+ "\1\u01a9\2\u011d\1\u01a9\6\u011d\1\213\5\u011d\1\u01a9\1\u011d"+
+ "\1\0\2\u011d\2\u01a9\5\u011d\1\u01a9\20\u011d\2\u01a9\2\u011d"+
+ "\2\u01a9\5\u011d\1\u01a9\4\u011d\3\216\4\u01aa\1\216\3\u01aa"+
+ "\6\216\1\u01aa\2\216\1\u01aa\13\216\1\u0125\1\u01aa\2\216"+
+ "\1\u0126\1\216\2\u01aa\5\216\1\u01aa\20\216\2\u01aa\2\216"+
+ "\2\u01aa\5\216\1\u01aa\47\216\1\0\52\216\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u01ab\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\336\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\u01ac\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\362\4\5\1\u01ad\5\5\1\u01ae\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\14\5\1\u01af\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\14\5\1\u01b0\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\336\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\u01b1\20\5\4\0\3\75"+
+ "\4\u012f\1\0\3\u012f\2\75\1\u01b2\3\75\1\u012f\1\u01b3"+
+ "\1\75\1\u012f\2\75\11\0\1\75\1\u012f\1\75\2\0"+
+ "\1\75\2\u012f\2\0\1\u01b3\1\u01b2\1\0\1\u012f\1\0"+
+ "\3\75\4\0\2\75\1\0\5\75\2\u012f\2\75\2\u012f"+
+ "\5\75\1\u012f\4\0\7\4\1\0\2\4\1\235\14\4"+
+ "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+ "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\7\4"+
+ "\1\0\1\u01b4\16\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\3\4\1\u01b5\2\4\1\u01b6"+
+ "\10\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+ "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+ "\7\4\1\0\7\4\1\u01b7\7\4\11\0\3\4\2\0"+
+ "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+ "\2\4\1\0\21\4\4\0\7\4\1\0\1\u01b8\3\4"+
+ "\1\u0137\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\11\4\1\u01b9\5\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+ "\1\u01b6\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\1\u01b8\16\4\11\0\3\4\2\0"+
+ "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+ "\2\4\1\0\21\4\4\0\7\4\1\0\14\4\1\u01ba"+
+ "\2\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+ "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\15\0"+
+ "\1\u01bb\120\0\1\u01bc\1\u01bd\1\0\1\u01be\110\0\1\u01bf"+
+ "\1\0\1\u01c0\114\0\1\u01c1\116\0\1\u01c2\120\0\1\u01c3"+
+ "\76\0\1\4\6\5\1\0\13\5\1\u01c4\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\303\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\336\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\2\5\1\u01c5\1\5\1\u01c6"+
+ "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\127"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\132"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01c7"+
+ "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\200"+
+ "\1\5\1\u0182\1\323\1\u0183\1\u01c8\1\5\1\u0185\1\5"+
+ "\1\u0187\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u01c9\1\0\3\5\1\u0189\15\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\u01ca\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\14\5\1\u01cb\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u01cc\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\307\11\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\15\0\1\u014c\174\0"+
+ "\1\u01cd\50\0\1\u01ce\146\0\1\u01cf\52\0\1\u0150\174\0"+
+ "\1\u01d0\50\0\1\u01d1\146\0\1\u01d2\41\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\16\5\1\u01d3\2\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\1\5\1\u01d3\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\13\5\1\u01d3\5\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\15\5\1\u01d3\3\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\11\5\1\u01d4\7\5\4\0\3\75\1\u0158\1\75"+
+ "\1\u0158\1\75\1\0\2\75\1\277\2\75\1\277\11\75"+
+ "\11\0\1\75\1\u0158\1\75\2\0\2\75\1\u0158\2\0"+
+ "\1\75\1\277\1\0\1\277\1\0\3\75\4\0\2\75"+
+ "\1\0\5\75\2\u0158\12\75\7\0\1\u0158\1\0\1\u0158"+
+ "\33\0\1\u0158\5\0\1\u0158\26\0\2\u0158\16\0\1\4"+
+ "\6\5\1\0\12\5\1\u01d5\4\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\307\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\u0141\11\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\16\5\1\u01d6\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\303\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\u01d7\13\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\7\5\1\u0196\7\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\u0163\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\u01d8\10\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\7\5\1\303\7\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\336\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\5\1\303\17\5\4\0\1\4\6\5\1\0\13\5"+
+ "\1\173\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+ "\1\323\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+ "\1\303\3\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u01d9\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u019a\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+ "\1\303\2\5\1\303\5\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\u01da\20\5\4\0\1\4"+
+ "\6\5\1\0\6\5\1\303\2\5\1\303\1\5\1\173"+
+ "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\1\u01da\20\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\4\5\1\307"+
+ "\12\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\15\5\1\u01a0"+
+ "\1\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u01db"+
+ "\20\5\4\0\1\4\6\5\1\0\14\5\1\u01dc\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\u01dd\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\13\5\1\u01db\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\u01de\13\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u01df\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u01e0\6\5\1\u01e1"+
+ "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u01e2"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u01e3"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\7\5"+
+ "\1\u017f\11\5\4\0\1\4\6\5\1\0\5\5\1\u01e4"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\2\5\1\303\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e5\6\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\1\5\1\u017e\1\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\12\5\1\315\4\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\16\5\1\u0168\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0128\12\5\1\u0102"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01e6"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e7"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112"+
+ "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0163\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u01e8\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+ "\1\u01e9\1\5\1\333\2\5\1\u01ea\1\311\1\5\1\u0168"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u01eb"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\1\5\1\u01ec\1\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u01ed"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\2\5\1\u01ee"+
+ "\14\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u01ef"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f0"+
+ "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01f1\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01f2\10\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\1\u0140\2\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u01f3\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\14\5\1\u01f4\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\u01f5\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\u01f6\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\u01f7\13\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u01b1\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\127\1\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\127\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\15\5\1\u01f8\1\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\u01f9\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\15\5\1\127\1\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\315\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\14\5\1\u015b\2\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\u01fa\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\u01fb\13\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01fc"+
+ "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u019e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\311\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\5\5\1\303\13\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\352\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\311\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+ "\1\u01ea\2\5\1\u0168\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\u0163\1\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u014a"+
+ "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\u01a0\12\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\u01fd\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\3\u011d\4\211\1\u011d"+
+ "\3\211\6\u011d\1\211\2\u011d\1\211\6\u011d\1\213\5\u011d"+
+ "\1\211\1\u011d\1\0\2\u011d\2\211\5\u011d\1\211\20\u011d"+
+ "\2\211\2\u011d\2\211\5\u011d\1\211\4\u011d\3\216\4\43"+
+ "\1\216\3\43\6\216\1\43\2\216\1\43\13\216\1\u0125"+
+ "\1\43\2\216\1\u0126\1\216\2\43\5\216\1\43\20\216"+
+ "\2\43\2\216\2\43\5\216\1\43\4\216\1\4\6\5"+
+ "\1\0\12\5\1\u01fe\4\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\253\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u01ff\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u0200\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u0201\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\5\1\127\17\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\303\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\7\75\1\0\12\75\1\u0202"+
+ "\4\75\11\0\3\75\2\0\3\75\2\0\1\u0202\1\75"+
+ "\1\0\1\75\1\0\3\75\4\0\2\75\1\0\21\75"+
+ "\4\0\7\75\1\0\5\75\1\u0202\11\75\11\0\3\75"+
+ "\2\0\3\75\2\0\1\75\1\u0202\1\0\1\75\1\0"+
+ "\3\75\4\0\2\75\1\0\21\75\4\0\7\4\1\0"+
+ "\3\4\1\u01b5\13\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\2\4\1\u0203\14\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\1\4\1\u0203\15\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\10\4\1\u0204\6\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\1\4\1\u01b5\15\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\5\4\1\u0205\11\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\15\4\1\u0206\1\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\16\0\1\u013c\113\0\1\u0207\120\0\1\u0208\2\0"+
+ "\1\u0209\116\0\1\u020a\106\0\1\u020b\3\0\1\u01c2\122\0"+
+ "\1\u020c\110\0\1\u0209\111\0\1\u020b\131\0\1\u020d\71\0"+
+ "\1\4\6\5\1\0\5\5\1\u019b\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\u020e\13\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\14\5\1\u01f0\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\u020f\2\5\1\u01d9\1\u0210\12\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01e8\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0211"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0212"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0213"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\u0214"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\16\5\1\u0215"+
+ "\11\0\1\4\2\5\2\0\1\5\1\303\1\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\36\0\1\u0216\101\0\1\u014c\51\0"+
+ "\1\u01cd\26\0\1\u01cf\1\u0217\4\u01cf\1\u0217\17\u01cf\3\u0217"+
+ "\1\u01cf\1\u0217\2\0\2\u0217\1\0\2\u01cf\2\0\3\u01cf"+
+ "\1\0\1\u0217\2\u01cf\1\u0217\1\u01cf\1\0\1\u0217\1\u01cf"+
+ "\5\u0217\2\u01cf\1\u0217\21\u01cf\2\0\1\u0217\33\0\1\u0218"+
+ "\101\0\1\u0150\51\0\1\u01d0\26\0\1\u01d2\1\u0219\4\u01d2"+
+ "\1\u0219\17\u01d2\3\u0219\1\u01d2\1\u0219\2\0\2\u0219\1\0"+
+ "\2\u01d2\2\0\3\u01d2\1\0\1\u0219\2\u01d2\1\u0219\1\u01d2"+
+ "\1\0\1\u0219\1\u01d2\5\u0219\2\u01d2\1\u0219\21\u01d2\2\0"+
+ "\1\u0219\1\0\1\4\5\5\1\u021a\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\20\5\1\u021a\4\0"+
+ "\1\4\6\5\1\0\5\5\1\u01eb\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\u021b\13\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\11\5\1\u021c\5\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\127\16\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\6\5\1\303\2\5\1\303\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0163\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\u0140\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\u0102\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\311\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\311\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\12\5\1\u01f0\4\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\u021d\1\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\u01d8\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\u021e\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u021f\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\163\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\u0220\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\2\5\1\127\14\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\13\5\1\u01ea\1\311\1\5"+
+ "\1\u0168\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\u0163\1\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0112\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\2\5\1\303"+
+ "\16\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\127\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\u0165\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\303\4\5\1\303\4\5"+
+ "\1\u0102\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\1\5\1\303\17\5\4\0\1\4\6\5"+
+ "\1\0\7\5\1\u01f0\7\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\11\5\1\u01f6\5\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\16\5\1\303\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\u0221\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0222\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0223"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\u0224\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0225\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\1\5\1\u0226\4\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0227\12\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\4\5\1\u0228\12\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\303\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\u01b1\20\5\4\0\1\4\6\5\1\0\11\5\1\u0229"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\127"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0163"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u022a"+
+ "\20\5\4\0\1\4\6\5\1\0\14\5\1\u022b\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\151\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\15\5\1\303\1\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01d8\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\7\4\1\0\7\4\1\u0203\7\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\12\4\1\u022c\4\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\16\4\1\u022d\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\17\0\1\u0208\114\0\1\u022e"+
+ "\114\0\1\u022e\124\0\1\u022f\106\0\1\u0208\121\0\1\u0230"+
+ "\125\0\1\u0231\70\0\1\4\6\5\1\0\5\5\1\u0140"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\u01e6"+
+ "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0232"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0233"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\303\4\5"+
+ "\1\303\4\5\1\u0102\3\5\1\136\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\5\1\303\17\5"+
+ "\4\0\1\4\6\5\1\0\16\5\1\u0215\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\1\5\1\u0164\4\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\1\5\1\303\1\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\36\0"+
+ "\1\u01cf\115\0\1\u01d2\63\0\1\4\1\5\1\u0234\4\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u0235\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\u01eb\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\303\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\u0236\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u0237\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\u020e\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u0238\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\u0239\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\315\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\u0239\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u0163\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u023a\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\12\5"+
+ "\1\307\4\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\u0128\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u023b"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\330"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\127"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\7\4\1\0\1\u01b6\16\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\14\4\1\u0203\2\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\23\0\1\u022e\120\0\1\u023c\121\0\1\u023d\67\0"+
+ "\1\4\6\5\1\0\16\5\1\307\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\16\5\1\136\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+ "\1\u023e\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\11\5\1\307\5\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u01a2\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u023f\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\7\5\1\127\7\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\14\5\1\u0240\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\1\5\1\u01d9\15\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\14\0\1\u0209\131\0"+
+ "\1\u022e\71\0\1\4\6\5\1\0\7\5\1\u0241\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01eb\10\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u0242\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\u0235\1\0\21\5"+
+ "\4\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[42978];
+ 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 =
+ "\3\0\26\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+ "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\114\1"+
+ "\1\0\2\11\2\1\1\11\3\1\1\11\20\1\1\0"+
+ "\14\1\2\0\1\11\6\0\6\1\1\0\141\1\1\11"+
+ "\7\1\1\11\22\1\6\0\14\1\10\0\6\1\1\0"+
+ "\141\1\4\0\1\1\4\0\11\1\2\0\1\1\2\0"+
+ "\65\1\7\0\10\1\4\0\24\1\1\11\3\0\12\1"+
+ "\2\0\5\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[578];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CPlusPlusTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public CPlusPlusTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public CPlusPlusTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 184) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 27:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 30: break;
+ case 7:
+ { addNullToken(); return firstToken;
+ }
+ case 31: break;
+ case 24:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 32: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 33: break;
+ case 17:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 34: break;
+ case 9:
+ { addToken(Token.WHITESPACE);
+ }
+ case 35: break;
+ case 26:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 36: break;
+ case 18:
+ { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+ }
+ case 37: break;
+ case 25:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 38: break;
+ case 14:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 39: break;
+ case 15:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 40: break;
+ case 5:
+ { addToken(Token.SEPARATOR);
+ }
+ case 41: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 42: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 43: break;
+ case 16:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 44: break;
+ case 22:
+ { addToken(Token.FUNCTION);
+ }
+ case 45: break;
+ case 6:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 46: break;
+ case 8:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 47: break;
+ case 23:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 48: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 49: break;
+ case 19:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 50: break;
+ case 20:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 51: break;
+ case 29:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 52: break;
+ case 28:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 53: break;
+ case 13:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 54: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 55: break;
+ case 4:
+ { addToken(Token.OPERATOR);
+ }
+ case 56: break;
+ case 10:
+ {
+ }
+ case 57: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 58: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 579: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 580: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 581: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex
new file mode 100644
index 0000000..f87ac99
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex
@@ -0,0 +1,413 @@
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file. It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CSSTokenMaker.java</code> file will contain 2
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class CSSTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ public static final int INTERNAL_CSS_PROPERTY = -1;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ public static final int INTERNAL_CSS_VALUE = -2;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CSSTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns <code>true</code> since CSS uses curly braces.
+ *
+ * @return <code>true</code> always.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return true;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = CSS_STRING;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ }
+ cssPrevState = -initialTokenType&0xff;
+ }
+ else {
+ state = Token.NULL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Digit = ([0-9])
+Letter = ([A-Za-z])
+LetterOrUnderscore = ({Letter}|[_])
+LetterOrUnderscoreOrDash = ({LetterOrUnderscore}|[\-])
+
+CSS_SelectorPiece = (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass = (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword = ("@"{CSS_SelectorPiece})
+CSS_Id = ("#"{CSS_SelectorPiece})
+CSS_Separator = ([;\(\)\[\]])
+WhiteSpace = ([ \t]+)
+MlcStart = ("/*")
+MlcEnd = ("*/")
+
+CSS_Property = ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar = ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value = ({CSS_ValueChar}*)
+CSS_Function = ({CSS_Value}\()
+CSS_Digits = ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex = ("#"[0-9a-fA-F]+)
+CSS_Number = ({CSS_Digits}|{CSS_Hex})
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+ {CSS_SelectorPiece} { addToken(Token.DATA_TYPE); }
+ {CSS_PseudoClass} { addToken(Token.RESERVED_WORD); }
+ ":" { /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+ {CSS_AtKeyword} { addToken(Token.REGEX); }
+ {CSS_Id} { addToken(Token.VARIABLE); }
+ "{" { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+ [,] { addToken(Token.IDENTIFIER); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ [+>~\^$\|=] { addToken(Token.OPERATOR); }
+ {CSS_Separator} { addToken(Token.SEPARATOR); }
+ {WhiteSpace} { addToken(Token.WHITESPACE); }
+ {MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+ {CSS_Property} { addToken(Token.RESERVED_WORD); }
+ "}" { addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+ ":" { addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+ {WhiteSpace} { addToken(Token.WHITESPACE); }
+ {MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+ {CSS_Value} { addToken(Token.IDENTIFIER); }
+ "!important" { addToken(Token.ANNOTATION); }
+ {CSS_Function} { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ {CSS_Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ ")" { /* End of a function */ addToken(Token.SEPARATOR); }
+ [;] { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+ [,\.] { addToken(Token.IDENTIFIER); }
+ "}" { addToken(Token.SEPARATOR); yybegin(YYINITIAL); }
+ {WhiteSpace} { addToken(Token.WHITESPACE); }
+ {MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+ [^\n\\\"]+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \" { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \' { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {MlcEnd} { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java
new file mode 100644
index 0000000..71519a8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSSTokenMaker.java
@@ -0,0 +1,976 @@
+/* The following code was generated by JFlex 1.4.1 on 2/12/12 12:51 AM */
+
+/*
+ * 09/03/2005
+ *
+ * CSSTokenMaker.java - Token maker for CSS 3 files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a CSS 3 file. It's
+ * written with a few extra internal states so that it can easily be copy
+ * and pasted into HTML, PHP, and JSP TokenMakres when it is updated.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CSSTokenMaker.java</code> file will contain 2
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class CSSTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int CSS_C_STYLE_COMMENT = 5;
+ public static final int YYINITIAL = 0;
+ public static final int CSS_STRING = 3;
+ public static final int CSS_VALUE = 2;
+ public static final int CSS_PROPERTY = 1;
+ public static final int CSS_CHAR_LITERAL = 4;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\40\1\61\25\0\1\40\1\63\1\56\1\36\1\52\1\45"+
+ "\1\47\1\57\1\43\1\64\1\5\1\51\1\55\1\4\1\6\1\41"+
+ "\12\1\1\7\1\37\1\0\1\51\1\60\1\47\1\35\6\46\24\2"+
+ "\1\50\1\42\1\50\1\60\1\3\1\0\1\21\1\34\1\15\1\20"+
+ "\1\26\1\23\1\33\1\14\1\16\1\2\1\30\1\17\1\27\1\13"+
+ "\1\11\1\25\1\2\1\10\1\22\1\12\1\32\1\31\1\53\1\44"+
+ "\1\24\1\2\1\54\1\60\1\62\1\51\uff81\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 =
+ "\2\0\1\1\3\0\1\2\1\3\1\4\2\2\1\5"+
+ "\1\6\1\2\1\7\1\10\1\1\1\11\1\12\1\13"+
+ "\1\14\1\15\1\14\1\16\1\14\1\17\1\20\1\21"+
+ "\1\22\2\1\1\21\1\23\1\1\1\24\1\25\1\21"+
+ "\1\26\1\27\1\30\1\31\1\32\1\27\1\33\1\34"+
+ "\5\27\1\35\15\0\1\36\1\37\1\40\2\0\1\22"+
+ "\3\0\1\22\1\0\1\30\1\41\41\0\1\15\17\0"+
+ "\1\42\47\0\1\43";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[167];
+ 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\65\0\152\0\237\0\324\0\u0109\0\u013e\0\u0173"+
+ "\0\u01a8\0\u01dd\0\u0212\0\u013e\0\u0247\0\u027c\0\u013e\0\u013e"+
+ "\0\u013e\0\u013e\0\u013e\0\u013e\0\u013e\0\u02b1\0\u02e6\0\u013e"+
+ "\0\u027c\0\u013e\0\u013e\0\u013e\0\u031b\0\u0350\0\u0385\0\u03ba"+
+ "\0\u013e\0\u03ef\0\u013e\0\u013e\0\u0424\0\u013e\0\u0459\0\u048e"+
+ "\0\u013e\0\u013e\0\u04c3\0\u013e\0\u013e\0\u04f8\0\u052d\0\u0562"+
+ "\0\u0597\0\u05cc\0\u013e\0\u0601\0\u0636\0\u066b\0\u06a0\0\u06d5"+
+ "\0\u070a\0\u073f\0\u0774\0\u07a9\0\u07de\0\u0813\0\u0848\0\u087d"+
+ "\0\u08b2\0\u08e7\0\u013e\0\u091c\0\u0951\0\u013e\0\u0986\0\u09bb"+
+ "\0\u09f0\0\u03ba\0\u0a25\0\u013e\0\u013e\0\u0a5a\0\u0a8f\0\u0ac4"+
+ "\0\u0af9\0\u0b2e\0\u0b63\0\u0b98\0\u0bcd\0\u0c02\0\u0c37\0\u0c6c"+
+ "\0\u0ca1\0\u0cd6\0\u0d0b\0\u0d40\0\u0d75\0\u0daa\0\u0ddf\0\u0e14"+
+ "\0\u0e49\0\u0e7e\0\u0eb3\0\u0ee8\0\u0f1d\0\u0f52\0\u0f87\0\u0fbc"+
+ "\0\u0ff1\0\u1026\0\u105b\0\u1090\0\u10c5\0\u10fa\0\u013e\0\u112f"+
+ "\0\u1164\0\u1199\0\u11ce\0\u1203\0\u1238\0\u126d\0\u12a2\0\u12d7"+
+ "\0\u130c\0\u1341\0\u1376\0\u13ab\0\u13e0\0\u1415\0\u144a\0\u147f"+
+ "\0\u14b4\0\u14e9\0\u151e\0\u1553\0\u1588\0\u15bd\0\u15f2\0\u1627"+
+ "\0\u165c\0\u1691\0\u16c6\0\u16fb\0\u1730\0\u144a\0\u1765\0\u179a"+
+ "\0\u17cf\0\u1804\0\u1839\0\u186e\0\u18a3\0\u18d8\0\u190d\0\u1942"+
+ "\0\u1977\0\u19ac\0\u19e1\0\u1a16\0\u1a4b\0\u1a80\0\u1ab5\0\u1aea"+
+ "\0\u1b1f\0\u1b54\0\u1b89\0\u1bbe\0\u1bf3\0\u1c28\0\u013e";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[167];
+ 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 =
+ "\2\7\5\10\1\11\25\10\1\12\1\13\1\14\1\15"+
+ "\1\16\1\7\1\14\1\10\1\7\1\10\1\7\1\14"+
+ "\2\17\1\10\1\20\1\21\1\22\1\23\1\17\1\24"+
+ "\2\7\1\14\2\25\3\26\1\27\1\25\1\30\25\26"+
+ "\3\25\1\15\1\31\2\25\1\26\1\25\1\26\4\25"+
+ "\1\26\5\25\1\32\1\33\2\25\1\34\1\35\2\36"+
+ "\1\37\1\34\1\21\1\34\25\36\1\34\1\40\1\41"+
+ "\1\15\1\42\1\36\1\43\1\36\1\34\1\36\4\34"+
+ "\1\36\1\34\1\21\1\22\1\23\1\34\1\44\1\33"+
+ "\1\45\1\46\42\47\1\50\13\47\1\51\2\47\1\52"+
+ "\3\47\42\53\1\50\14\53\1\54\1\53\1\55\3\53"+
+ "\5\56\1\57\6\56\1\60\6\56\1\61\27\56\1\62"+
+ "\5\56\1\63\3\56\66\0\4\10\1\0\1\10\1\0"+
+ "\25\10\7\0\1\10\1\0\1\10\4\0\1\10\20\0"+
+ "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\0"+
+ "\1\73\1\74\1\75\1\0\1\76\2\0\1\77\2\0"+
+ "\1\100\35\0\5\101\1\0\25\101\7\0\1\101\1\0"+
+ "\1\101\4\0\1\101\13\0\5\102\1\0\25\102\7\0"+
+ "\1\102\1\0\1\102\4\0\1\102\51\0\1\15\31\0"+
+ "\1\103\60\0\4\26\3\0\25\26\7\0\1\26\1\0"+
+ "\1\26\4\0\1\26\13\0\3\26\3\0\25\26\7\0"+
+ "\1\26\1\0\1\26\4\0\1\26\12\0\1\35\4\0"+
+ "\1\35\6\0\1\104\1\105\3\0\1\106\2\0\1\107"+
+ "\1\110\1\111\15\0\1\106\21\0\3\36\3\0\25\36"+
+ "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+ "\12\0\1\35\3\36\3\0\25\36\4\0\2\36\1\43"+
+ "\1\36\1\0\1\36\4\0\1\36\12\0\1\112\13\0"+
+ "\1\112\2\0\2\112\1\0\1\112\2\0\1\112\5\0"+
+ "\1\112\11\0\1\112\20\0\3\36\1\103\2\0\25\36"+
+ "\4\0\2\36\1\43\1\36\1\0\1\36\4\0\1\36"+
+ "\27\0\1\113\46\0\42\47\1\0\13\47\1\0\2\47"+
+ "\1\0\3\47\61\114\1\0\3\114\42\53\1\0\14\53"+
+ "\1\0\1\53\1\0\3\53\5\56\1\0\6\56\1\0"+
+ "\6\56\1\0\27\56\1\0\5\56\1\0\3\56\41\0"+
+ "\1\115\35\0\1\116\64\0\1\117\3\0\1\120\121\0"+
+ "\1\121\32\0\1\122\1\0\1\123\10\0\1\124\41\0"+
+ "\1\125\66\0\1\126\72\0\1\127\54\0\1\130\1\131"+
+ "\63\0\1\132\67\0\1\133\66\0\1\134\2\0\1\135"+
+ "\61\0\1\136\63\0\1\137\60\0\1\140\4\0\1\141"+
+ "\61\0\1\142\13\0\1\143\53\0\1\144\47\0\4\101"+
+ "\1\0\1\101\1\0\25\101\7\0\1\101\1\0\1\101"+
+ "\4\0\1\101\12\0\4\102\1\0\1\102\1\0\25\102"+
+ "\7\0\1\102\1\0\1\102\4\0\1\102\40\0\1\106"+
+ "\50\0\1\106\63\0\1\106\2\0\1\106\26\0\1\106"+
+ "\47\0\1\106\14\0\1\106\42\0\1\106\4\0\1\106"+
+ "\64\0\1\145\47\0\1\146\77\0\1\147\56\0\1\150"+
+ "\120\0\1\151\34\0\1\152\57\0\1\153\74\0\1\154"+
+ "\47\0\1\130\72\0\1\155\55\0\1\156\66\0\1\157"+
+ "\66\0\1\160\101\0\1\161\61\0\1\162\51\0\1\163"+
+ "\64\0\1\164\6\0\1\165\64\0\1\142\54\0\1\166"+
+ "\67\0\1\167\57\0\1\170\75\0\1\171\70\0\1\172"+
+ "\61\0\1\173\67\0\1\174\64\0\1\175\46\0\1\176"+
+ "\103\0\1\147\44\0\1\177\70\0\1\161\62\0\1\200"+
+ "\77\0\1\201\65\0\1\202\73\0\1\203\35\0\1\204"+
+ "\106\0\1\205\53\0\1\206\77\0\1\157\67\0\1\157"+
+ "\43\0\1\202\70\0\1\207\100\0\1\210\54\0\1\165"+
+ "\76\0\1\211\42\0\1\212\70\0\1\213\57\0\1\214"+
+ "\62\0\1\176\12\0\1\147\103\0\1\215\24\0\2\177"+
+ "\5\216\25\177\3\216\1\0\1\177\1\0\1\216\1\177"+
+ "\1\216\1\177\3\216\2\177\1\0\1\216\1\0\1\216"+
+ "\3\0\2\216\22\0\1\217\53\0\1\220\57\0\1\221"+
+ "\106\0\1\130\47\0\1\222\3\0\1\223\1\0\1\224"+
+ "\55\0\1\157\104\0\1\225\65\0\1\226\55\0\1\157"+
+ "\61\0\1\225\71\0\1\157\52\0\1\225\62\0\1\227"+
+ "\115\0\1\177\35\0\1\230\62\0\1\226\65\0\1\222"+
+ "\3\0\1\223\72\0\1\231\55\0\1\232\71\0\1\170"+
+ "\71\0\1\233\64\0\1\157\50\0\1\234\56\0\1\235"+
+ "\64\0\1\236\76\0\1\237\66\0\1\157\65\0\1\240"+
+ "\62\0\1\241\57\0\1\242\71\0\1\233\60\0\1\243"+
+ "\67\0\1\244\7\0\1\245\62\0\1\246\52\0\1\247"+
+ "\65\0\1\226\63\0\1\152\77\0\1\226\37\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[7261];
+ 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 =
+ "\2\0\1\1\3\0\1\11\4\1\1\11\2\1\7\11"+
+ "\2\1\1\11\1\1\3\11\4\1\1\11\1\1\2\11"+
+ "\1\1\1\11\2\1\2\11\1\1\2\11\5\1\1\11"+
+ "\15\0\2\1\1\11\2\0\1\11\3\0\1\1\1\0"+
+ "\2\11\41\0\1\11\17\0\1\1\47\0\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[167];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ public static final int INTERNAL_CSS_PROPERTY = -1;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ public static final int INTERNAL_CSS_VALUE = -2;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CSSTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns <code>true</code> since CSS uses curly braces.
+ *
+ * @return <code>true</code> always.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return true;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ cssPrevState = YYINITIAL; // Shouldn't be necessary
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = CSS_STRING;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ }
+ cssPrevState = -initialTokenType&0xff;
+ }
+ else {
+ state = Token.NULL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public CSSTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public CSSTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 134) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 4:
+ { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+ }
+ case 36: break;
+ case 11:
+ { addNullToken(); return firstToken;
+ }
+ case 37: break;
+ case 27:
+ { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+ }
+ case 38: break;
+ case 15:
+ { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 39: break;
+ case 22:
+ { /* End of a function */ addToken(Token.SEPARATOR);
+ }
+ case 40: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 41: break;
+ case 2:
+ { /*System.out.println("yyinitial: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 42: break;
+ case 32:
+ { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+ }
+ case 43: break;
+ case 14:
+ { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+ }
+ case 44: break;
+ case 13:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 45: break;
+ case 31:
+ { addToken(Token.VARIABLE);
+ }
+ case 46: break;
+ case 5:
+ { addToken(Token.SEPARATOR);
+ }
+ case 47: break;
+ case 16:
+ { addToken(Token.SEPARATOR); yybegin(YYINITIAL);
+ }
+ case 48: break;
+ case 26:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 49: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 50: break;
+ case 19:
+ { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+ }
+ case 51: break;
+ case 9:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+ }
+ case 52: break;
+ case 30:
+ { addToken(Token.REGEX);
+ }
+ case 53: break;
+ case 12:
+ { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 54: break;
+ case 17:
+ { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 55: break;
+ case 33:
+ { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+ }
+ case 56: break;
+ case 24:
+ { /* Skip escaped chars. */
+ }
+ case 57: break;
+ case 3:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 58: break;
+ case 10:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+ }
+ case 59: break;
+ case 35:
+ { addToken(Token.ANNOTATION);
+ }
+ case 60: break;
+ case 25:
+ { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+ }
+ case 61: break;
+ case 20:
+ { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ case 62: break;
+ case 8:
+ { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+ }
+ case 63: break;
+ case 28:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 64: break;
+ case 34:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 65: break;
+ case 21:
+ { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 66: break;
+ case 29:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 67: break;
+ case 18:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 68: break;
+ case 7:
+ { addToken(Token.OPERATOR);
+ }
+ case 69: break;
+ case 23:
+ {
+ }
+ case 70: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case CSS_C_STYLE_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 168: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 169: break;
+ case CSS_STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 170: break;
+ case CSS_VALUE: {
+ addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 171: break;
+ case CSS_PROPERTY: {
+ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 172: break;
+ case CSS_CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 173: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex
new file mode 100644
index 0000000..e8d7d09
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex
@@ -0,0 +1,517 @@
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CSharpTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CSharpTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CSharpTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = VERBATIMSTRING;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = DELIMITEDCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+/* C1.1 - Line terminators. */
+NewlineCharacter = ([\n])
+
+/* C.1.2 - Whitespace. */
+Whitespace = ([\t ]+)
+
+/* C.1.3 - Comments */
+InputCharacter = ([^\n])
+InputCharacters = ({InputCharacter}+)
+DocumentationCommentStart = ("///")
+SingleLineComment = ("//"([^/]{InputCharacters}?)?)
+DelimitedCommentStart = ("/*")
+DelimitedCommentEnd = ("*/")
+
+/* C.1.5 - Unicode character escape sequences. */
+UnicodeEscape1 = ("\\u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscape2 = ("\\U"{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+UnicodeEscapeSequence = ({UnicodeEscape1}|{UnicodeEscape2})
+
+/* C1.6 - Identifiers. */
+LetterCharacter = ([A-Za-z]) /* Not accurate - many more Unicode letters, Unicode escapes */
+/*
+CombiningCharacter = ()
+*/
+DecimalDigitCharacter = ([0-9])
+ConnectingCharacter = ([_\-])
+/*
+FormattingCharacter = ()
+*/
+/*
+IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter}|{CombiningCharacter}|{FormattingCharacter})
+*/
+IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter})
+IdentifierPartCharacters = ({IdentifierPartCharacter}+)
+IdentifierStartCharacter = ({LetterCharacter}|[_])
+IdentifierOrKeyword = ({IdentifierStartCharacter}{IdentifierPartCharacters}?)
+Identifier = ("@"?{IdentifierOrKeyword})
+/* NOTE: The two below aren't from the C# spec, but we add them so we can */
+/* highlight errors. */
+NonSeparator = (([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\"))
+ErrorIdentifier = ({NonSeparator}+)
+
+/* C1.8 - Literals. */
+BooleanLiteral = ("true"|"false")
+DecimalDigit = ([0-9])
+DecimalDigits = ({DecimalDigit}+)
+IntegerTypeSuffix = (([uU][lL]?)|([lL][uU]?))
+DecimalIntegerLiteral = ({DecimalDigits}{IntegerTypeSuffix}?)
+HexDigit = ([0-9A-Fa-f])
+HexDigits = ({HexDigit}+)
+HexadecimalIntegerLiteral = ("0"[xX]{HexDigits}{IntegerTypeSuffix}?)
+Sign = ([+\-])
+ExponentPart = ([eE]{Sign}?{DecimalDigits})
+RealTypeSuffix = ([fFdDmM])
+RealHelper1 = ({DecimalDigits}"."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper2 = ("."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
+RealHelper3 = ({DecimalDigits}{ExponentPart}{RealTypeSuffix}?)
+RealHelper4 = ({DecimalDigits}{RealTypeSuffix})
+RealLiteral = ({RealHelper1}|{RealHelper2}|{RealHelper3}|{RealHelper4})
+ErrorNumberFormat = (({DecimalIntegerLiteral}|{HexadecimalIntegerLiteral}|{RealLiteral}){NonSeparator}+)
+SingleCharacter = ([^\'\\\n])
+SimpleEscapeSequence = ("\\"[\'\"\\0abfnrtv])
+HexadecimalEscapeSequence = ("\\x"{HexDigit}{HexDigit}?{HexDigit}?{HexDigit}?)
+Character = ({SingleCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+UnclosedCharacterLiteral = ("'"{Character})
+CharacterLiteral = ({UnclosedCharacterLiteral}"'")
+ErrorUnclosedCharacterLiteral = ("'"[^\'\n]*)
+ErrorCharacterLiteral = ("''"|{ErrorUnclosedCharacterLiteral}[\'])
+QuoteEscapeSequence = ("\"\"")
+SingleVerbatimStringLiteralCharacter = ([^\"])
+VerbatimStringLiteralStart = ("@\"")
+SingleRegularStringLiteralCharacter = ([^\"\\\n])
+RegularStringLiteralCharacter = ({SingleRegularStringLiteralCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
+RegularStringLiteralCharacters = ({RegularStringLiteralCharacter}+)
+RegularStringLiteral = ([\"]{RegularStringLiteralCharacters}?[\"])
+UnclosedRegularStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorRegularStringLiteral = ({UnclosedRegularStringLiteral}[\"])
+
+/* C.1.9 - Operators and Punctuators. */
+OOPHelper1 = (":")
+OOPHelper2 = ("+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|"~")
+OOPHelper3 = ("="|"<"|">"|"?"|"++"|"--"|"&&"|"||"|"<<"|">>")
+OOPHelper4 = ("=="|"!="|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&=")
+OOPHelper5 = ("|="|"^="|"<<="|">>="|"->")
+OperatorOrPunctuator = ({OOPHelper1}|{OOPHelper2}|{OOPHelper3}|{OOPHelper4}|{OOPHelper5})
+/* NOTE: We distinguish between operators and separators (punctuators), but */
+/* the C# spec doesn't, so the stuff below isn't in the spec. */
+Separator = ([\{\}\[\]\(\)])
+Separator2 = ([,;])
+
+/* C.1.10 - Pre-processing Directives. */
+/* NOTE: We don't do ALL of the PP stuff here as it's unnecessary */
+/* for us to know the difference between declarations, diagnostics, */
+/* regions, etc. */
+ConditionalSymbol = ({IdentifierOrKeyword}) /* Not correct - excludes "true" and "false". */
+PPNewLine = ({Whitespace}?{SingleLineComment}?{NewlineCharacter})
+PPPrimaryExpression = ({IdentifierOrKeyword}|({Whitespace}?{PPExpression}{Whitespace}?))
+PPUnaryExpression = ({PPPrimaryExpression}|("!"{Whitespace}?{PPUnaryExpression}))
+PPEqualityExpression = ({PPUnaryExpression}|({Whitespace}?"=="{Whitespace}?{PPUnaryExpression})|({Whitespace}?"!="{Whitespace}?{PPUnaryExpression}))
+PPAndExpression = ({PPEqualityExpression}|({Whitespace}?"&&"{Whitespace}?{PPEqualityExpression}))
+PPOrExpression = ({PPAndExpression}|({Whitespace}?"||"{Whitespace}?{PPAndExpression}))
+PPExpression = ({Whitespace}?{PPOrExpression}{Whitespace}?)
+PPWord = ("define"|"undef"|"if"|"elif"|"else"|"endif"|"line"|"error"|"warning"|"region"|"endregion")
+PPDirective = ({Whitespace}?"#"{Whitespace}?{PPWord}{InputCharacter}*)
+
+/* URL matching, for comments (not in C# spec) */
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ([A-Za-z_]|{DecimalDigitCharacter}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|[A-Za-z0-9])
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state DELIMITEDCOMMENT
+%state DOCUMENTCOMMENT
+%state VERBATIMSTRING
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "abstract" |
+ "as" |
+ "base" |
+ "break" |
+ "case" |
+ "catch" |
+ "checked" |
+ "class" |
+ "const" |
+ "continue" |
+ "decimal" |
+ "default" |
+ "delegate" |
+ "do" |
+ "else" |
+ "enum" |
+ "event" |
+ "explicit" |
+ "extern" |
+ "finally" |
+ "fixed" |
+ "for" |
+ "foreach" |
+ "goto" |
+ "if" |
+ "implicit" |
+ "in" |
+ "interface" |
+ "internal" |
+ "is" |
+ "lock" |
+ "namespace" |
+ "new" |
+ "null" |
+ "object" |
+ "operator" |
+ "out" |
+ "override" |
+ "params" |
+ "private" |
+ "protected" |
+ "public" |
+ "readonly" |
+ "ref" |
+ "return" |
+ "sealed" |
+ "sizeof" |
+ "stackalloc" |
+ "static" |
+ "string" |
+ "struct" |
+ "switch" |
+ "this" |
+ "throw" |
+ "try" |
+ "typeof" |
+ "unchecked" |
+ "unsafe" |
+ "using" |
+ "virtual" |
+ "void" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+
+ /* Data types. */
+ "bool" |
+ "byte" |
+ "char" |
+ "double" |
+ "float" |
+ "int" |
+ "long" |
+ "object" |
+ "sbyte" |
+ "short" |
+ "string" |
+ "uint" |
+ "ulong" |
+ "ushort" { addToken(Token.DATA_TYPE); }
+
+
+ {NewlineCharacter} { addNullToken(); return firstToken; }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character Literals. */
+ {CharacterLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+ {ErrorUnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharacterLiteral} { addToken(Token.ERROR_CHAR); }
+ {VerbatimStringLiteralStart} { start = zzMarkedPos-2; yybegin(VERBATIMSTRING); }
+ {RegularStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comments. */
+ {DelimitedCommentStart} { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT); }
+ {DocumentationCommentStart} { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT); }
+ {SingleLineComment} { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {OperatorOrPunctuator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {DecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexadecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {RealLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Preprocessor directives. */
+ {PPDirective} { addToken(Token.PREPROCESSOR); }
+
+ /* Pretty-much anything else. */
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<DELIMITEDCOMMENT> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {DelimitedCommentEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCUMENTCOMMENT> {
+
+ [^hwf\<\n]* {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+ "<"[^\>]*">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+ "<" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
+
+}
+
+
+<VERBATIMSTRING> {
+
+ [^\"\n]* {}
+ {QuoteEscapeSequence} {}
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java
new file mode 100644
index 0000000..d595ae6
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java
@@ -0,0 +1,1600 @@
+/* The following code was generated by JFlex 1.4.1 on 1/21/09 4:27 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CSharpTokenMaker.java - An object that can take a chunk of text and return
+ * a linked list of tokens representing it in the C# programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A lexer for the C# programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated CSharpTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CSharpTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int VERBATIMSTRING = 3;
+ public static final int DOCUMENTCOMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int DELIMITEDCOMMENT = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\2\1\1\1\0\2\15\22\0\1\2\1\45\1\41\1\16"+
+ "\1\66\1\45\1\46\1\37\2\65\1\4\1\32\1\56\1\12\1\36"+
+ "\1\3\1\30\11\11\1\44\1\56\1\53\1\52\1\54\1\51\1\14"+
+ "\3\27\1\35\1\33\1\35\5\10\1\26\1\34\7\10\1\7\2\10"+
+ "\1\31\2\10\1\65\1\5\1\65\1\50\1\13\1\0\1\23\1\42"+
+ "\1\71\1\57\1\21\1\22\1\64\1\67\1\60\1\75\1\72\1\24"+
+ "\1\73\1\61\1\62\1\70\1\10\1\20\1\25\1\17\1\6\1\40"+
+ "\1\63\1\43\1\74\1\76\1\55\1\47\1\55\1\51\uff81\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 =
+ "\2\0\2\1\1\2\1\3\1\4\2\5\2\6\1\7"+
+ "\1\5\3\2\7\6\1\7\1\5\1\2\1\10\1\6"+
+ "\1\11\1\6\5\5\1\12\11\6\1\1\1\13\5\1"+
+ "\1\14\1\1\1\15\3\1\1\16\1\17\1\0\1\20"+
+ "\1\21\5\6\1\22\1\7\1\22\1\23\1\7\1\0"+
+ "\1\24\7\2\14\6\1\25\10\6\1\22\1\23\1\26"+
+ "\1\10\1\27\2\6\2\11\1\30\4\6\2\25\21\6"+
+ "\1\31\7\0\1\32\2\0\1\1\7\0\1\20\1\33"+
+ "\5\6\1\7\1\23\1\0\7\2\1\34\1\2\17\6"+
+ "\1\25\10\6\1\35\1\10\1\36\2\10\1\26\1\10"+
+ "\3\6\1\11\1\37\3\11\7\6\1\40\20\6\20\0"+
+ "\1\6\1\40\2\6\6\2\1\41\12\6\2\35\2\10"+
+ "\1\26\2\6\2\11\16\6\1\0\1\42\2\0\1\43"+
+ "\7\0\3\2\10\6\1\35\2\10\1\26\1\6\2\11"+
+ "\10\6\7\0\2\2\3\6\2\10\1\26\1\11\5\6"+
+ "\2\0\1\2\3\6\1\0\1\6";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[364];
+ 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\77\0\176\0\275\0\374\0\u013b\0\u017a\0\u01b9"+
+ "\0\u01f8\0\u0237\0\u0276\0\u02b5\0\u02f4\0\u0333\0\u013b\0\u0372"+
+ "\0\u03b1\0\u03f0\0\u042f\0\u046e\0\u04ad\0\u04ec\0\u052b\0\u056a"+
+ "\0\u05a9\0\u05e8\0\u0627\0\u0666\0\u06a5\0\u06e4\0\u013b\0\u0723"+
+ "\0\u0762\0\u07a1\0\u07e0\0\u013b\0\u013b\0\u081f\0\u085e\0\u089d"+
+ "\0\u08dc\0\u091b\0\u095a\0\u0999\0\u09d8\0\u0a17\0\u013b\0\u0a56"+
+ "\0\u0a95\0\u0ad4\0\u0b13\0\u0b52\0\u013b\0\u0b91\0\u0bd0\0\u0c0f"+
+ "\0\u0c4e\0\u0c8d\0\u013b\0\u0ccc\0\u0d0b\0\u0d4a\0\u013b\0\u0d89"+
+ "\0\u0dc8\0\u0e07\0\u0e46\0\u0e85\0\u0ec4\0\u0f03\0\u0f42\0\u0ec4"+
+ "\0\u0f81\0\u05e8\0\u013b\0\u0fc0\0\u0fff\0\u103e\0\u107d\0\u10bc"+
+ "\0\u10fb\0\u113a\0\u1179\0\u11b8\0\u11f7\0\u1236\0\u1275\0\u12b4"+
+ "\0\u12f3\0\u1332\0\u1371\0\u13b0\0\u13ef\0\u142e\0\u0276\0\u146d"+
+ "\0\u14ac\0\u14eb\0\u152a\0\u1569\0\u15a8\0\u15e7\0\u1626\0\u1665"+
+ "\0\u16a4\0\u16e3\0\u1722\0\u013b\0\u1761\0\u17a0\0\u17df\0\u181e"+
+ "\0\u013b\0\u185d\0\u189c\0\u18db\0\u191a\0\u1959\0\u1998\0\u19d7"+
+ "\0\u1a16\0\u1a55\0\u1a94\0\u1ad3\0\u1b12\0\u1b51\0\u1b90\0\u1bcf"+
+ "\0\u1c0e\0\u1c4d\0\u1c8c\0\u1ccb\0\u1d0a\0\u1d49\0\u1d88\0\u1dc7"+
+ "\0\u013b\0\u1e06\0\u1e45\0\u1e84\0\u1ec3\0\u1f02\0\u1f41\0\u0bd0"+
+ "\0\u013b\0\u1f80\0\u1fbf\0\u013b\0\u1ffe\0\u203d\0\u207c\0\u20bb"+
+ "\0\u20fa\0\u2139\0\u2178\0\u21b7\0\u013b\0\u21f6\0\u2235\0\u2274"+
+ "\0\u22b3\0\u22f2\0\u0ec4\0\u2331\0\u2370\0\u23af\0\u23ee\0\u242d"+
+ "\0\u246c\0\u24ab\0\u24ea\0\u2529\0\u2568\0\u25a7\0\u25e6\0\u2625"+
+ "\0\u2664\0\u26a3\0\u26e2\0\u2721\0\u2760\0\u279f\0\u27de\0\u281d"+
+ "\0\u285c\0\u289b\0\u28da\0\u2919\0\u2958\0\u2997\0\u29d6\0\u2a15"+
+ "\0\u2a54\0\u2a93\0\u2ad2\0\u2b11\0\u2b50\0\u2b8f\0\u2bce\0\u2c0d"+
+ "\0\u013b\0\u2c4c\0\u2c8b\0\u2cca\0\u2d09\0\u2d48\0\u2d87\0\u2dc6"+
+ "\0\u2e05\0\u013b\0\u2e44\0\u2e83\0\u2ec2\0\u2f01\0\u2f40\0\u2f7f"+
+ "\0\u2fbe\0\u2ffd\0\u303c\0\u307b\0\u30ba\0\u30f9\0\u3138\0\u3177"+
+ "\0\u31b6\0\u31f5\0\u3234\0\u3273\0\u32b2\0\u32f1\0\u3330\0\u336f"+
+ "\0\u33ae\0\u33ed\0\u342c\0\u346b\0\u34aa\0\u34e9\0\u3528\0\u3567"+
+ "\0\u35a6\0\u35e5\0\u3624\0\u3663\0\u36a2\0\u36e1\0\u3720\0\u375f"+
+ "\0\u379e\0\u37dd\0\u381c\0\u385b\0\u389a\0\u38d9\0\u0276\0\u3918"+
+ "\0\u3957\0\u3996\0\u39d5\0\u3a14\0\u3a53\0\u3a92\0\u3ad1\0\u0276"+
+ "\0\u3b10\0\u3b4f\0\u3b8e\0\u3bcd\0\u3c0c\0\u3c4b\0\u3c8a\0\u3cc9"+
+ "\0\u3d08\0\u3d47\0\u3d86\0\u3dc5\0\u3e04\0\u3e43\0\u3e82\0\u3ec1"+
+ "\0\u3f00\0\u3f3f\0\u3f7e\0\u3fbd\0\u3ffc\0\u403b\0\u407a\0\u40b9"+
+ "\0\u40f8\0\u4137\0\u4176\0\u41b5\0\u41f4\0\u4233\0\u4272\0\u42b1"+
+ "\0\u42f0\0\u432f\0\u436e\0\u43ad\0\u43ec\0\u442b\0\u446a\0\u44a9"+
+ "\0\u44e8\0\u4527\0\u4566\0\u45a5\0\u45e4\0\u4623\0\u4662\0\u46a1"+
+ "\0\u46e0\0\u471f\0\u475e\0\u479d\0\u47dc\0\u481b\0\u485a\0\u4899"+
+ "\0\u0ec4\0\u48d8\0\u4917\0\u4956\0\u4995\0\u49d4\0\u4a13\0\u4a52"+
+ "\0\u4a91\0\u4ad0\0\u4b0f\0\u4b4e\0\u4b8d\0\u4bcc\0\u4c0b\0\u4c4a"+
+ "\0\u436e\0\u4c89\0\u442b\0\u4cc8\0\u4d07\0\u4d46\0\u4d85\0\u4dc4"+
+ "\0\u4e03\0\u4e42\0\u4e81\0\u4ec0\0\u4eff\0\u4f3e\0\u4f7d\0\u4fbc"+
+ "\0\u4ffb\0\u503a\0\u5079\0\u50b8\0\u50f7\0\u5136\0\u5175\0\u51b4"+
+ "\0\u51f3\0\u5232\0\u5271\0\u52b0";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[364];
+ 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 =
+ "\1\5\1\6\1\7\1\10\1\11\1\5\1\12\2\13"+
+ "\1\14\1\15\1\13\1\16\1\17\1\20\1\21\1\22"+
+ "\1\23\1\24\1\25\1\26\1\27\2\13\1\30\1\13"+
+ "\1\31\3\13\1\32\1\33\1\34\1\35\1\36\1\13"+
+ "\1\37\1\11\1\40\1\41\1\11\1\37\1\11\1\42"+
+ "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\52"+
+ "\1\53\1\44\1\5\1\13\1\54\1\55\5\13\1\56"+
+ "\1\57\2\56\1\60\15\56\1\61\40\56\1\62\3\56"+
+ "\1\63\7\56\1\64\1\65\20\64\1\66\30\64\1\67"+
+ "\7\64\1\70\3\64\1\71\7\64\1\72\1\73\37\72"+
+ "\1\74\35\72\1\5\4\0\5\5\1\0\2\5\1\0"+
+ "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\6\5\1\0\11\5\101\0\1\7\13\0\1\75\63\0"+
+ "\1\76\1\77\45\0\1\37\76\0\1\37\24\0\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\5\13\1\101\1\102\4\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\1\13\1\103\1\104\3\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\105"+
+ "\4\0\1\105\2\106\1\105\1\14\1\0\2\105\1\0"+
+ "\3\105\1\107\1\110\1\105\1\111\1\105\1\111\1\105"+
+ "\1\14\1\105\1\0\1\107\2\110\1\112\1\0\1\105"+
+ "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+ "\3\105\12\0\1\37\37\0\1\37\1\0\1\37\22\0"+
+ "\1\5\4\0\1\5\3\13\1\5\1\0\1\13\1\5"+
+ "\1\0\1\5\11\13\1\5\1\13\1\0\3\13\2\0"+
+ "\1\13\1\113\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\1\0\1\75\2\0\1\5\1\114\3\5\1\0"+
+ "\2\5\1\0\2\5\1\115\1\116\2\5\1\117\5\5"+
+ "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\1\120"+
+ "\1\121\2\5\1\122\1\5\1\0\12\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\123"+
+ "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\1\124\4\13\1\125\2\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\2\13\1\126\10\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+ "\1\127\5\13\1\0\3\13\2\0\1\130\1\0\1\13"+
+ "\1\131\13\0\2\13\1\132\3\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\4\13\1\133\1\134\5\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\1\13\1\135\1\13\1\136"+
+ "\2\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\6\13\1\137\4\13"+
+ "\1\0\3\13\2\0\1\13\1\0\1\140\1\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\3\13\1\141\2\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\142\1\13\1\143\10\13"+
+ "\1\0\3\13\2\0\1\13\1\0\1\144\1\13\13\0"+
+ "\1\13\1\145\2\13\1\146\1\13\1\0\1\5\1\147"+
+ "\7\13\1\105\4\0\1\105\2\106\1\105\1\14\1\0"+
+ "\2\105\1\0\3\105\1\107\1\110\1\105\1\111\1\105"+
+ "\1\111\1\105\1\14\1\150\1\0\1\107\2\110\1\112"+
+ "\1\0\1\105\1\0\1\105\1\150\13\0\1\110\5\105"+
+ "\1\0\5\105\1\110\3\105\32\0\1\37\17\0\1\37"+
+ "\35\0\1\151\16\0\1\151\46\0\1\152\1\0\3\152"+
+ "\1\153\31\152\1\154\37\152\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\1\13\1\155\1\13"+
+ "\1\156\2\13\1\0\1\5\10\13\1\35\1\157\3\35"+
+ "\1\160\33\35\1\161\35\35\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\1\13\1\162\2\13"+
+ "\1\127\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\3\13\1\163\2\13\1\0\1\5\5\13\1\164"+
+ "\2\13\46\0\1\37\3\0\1\37\73\0\1\37\2\0"+
+ "\1\37\76\0\1\37\1\11\75\0\1\37\1\0\1\11"+
+ "\22\0\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\2\13\1\165\10\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\3\13\1\166\2\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\3\13\1\137\2\13\1\137\4\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+ "\1\167\3\13\1\0\1\5\4\13\1\170\3\13\1\5"+
+ "\4\0\1\5\1\171\3\13\1\100\1\13\1\5\1\0"+
+ "\1\5\2\13\1\172\1\13\1\173\6\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\1\174\3\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\175"+
+ "\1\0\1\176\1\13\13\0\6\13\1\0\1\5\1\13"+
+ "\1\177\6\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\1\200\7\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\3\13\1\201\2\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\1\202\3\13\1\100\1\13\1\5\1\0"+
+ "\1\5\1\13\1\203\2\13\1\204\6\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\4\13\1\205\1\206\5\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\3\13\1\207\2\13"+
+ "\1\0\1\5\1\210\7\13\1\56\1\0\2\56\1\0"+
+ "\15\56\1\0\40\56\1\0\3\56\1\0\7\56\3\0"+
+ "\1\211\112\0\1\212\40\0\1\213\101\0\1\214\32\0"+
+ "\1\215\57\0\1\64\1\0\20\64\1\0\30\64\1\0"+
+ "\7\64\1\0\3\64\1\0\7\64\17\0\1\216\40\0"+
+ "\1\217\16\0\54\220\1\221\22\220\63\0\1\222\32\0"+
+ "\1\223\57\0\1\72\1\0\37\72\1\0\35\72\41\0"+
+ "\1\224\37\0\1\75\3\0\1\225\11\0\1\226\1\227"+
+ "\2\0\1\230\32\0\1\231\1\232\2\0\1\233\13\0"+
+ "\3\234\1\235\73\234\6\0\6\100\3\0\13\100\1\0"+
+ "\3\100\2\0\1\100\1\0\2\100\13\0\6\100\2\0"+
+ "\10\100\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\3\13\1\236\2\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\1\13\1\237\4\13\1\0\1\5\1\147\7\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\2\13\1\240\3\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\6\13\1\241\4\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\2\13\1\242\5\13"+
+ "\1\105\4\0\5\105\1\0\2\105\1\0\14\105\1\0"+
+ "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+ "\12\105\4\0\5\105\1\0\2\105\1\0\6\105\1\243"+
+ "\1\105\1\243\3\105\1\0\3\105\2\0\1\105\1\0"+
+ "\2\105\13\0\6\105\1\0\12\105\4\0\4\105\1\244"+
+ "\1\245\2\105\1\0\12\105\1\244\1\105\1\245\3\105"+
+ "\2\0\1\105\1\0\2\105\13\0\6\105\1\0\12\105"+
+ "\4\0\1\105\2\243\2\105\1\0\2\105\1\0\14\105"+
+ "\1\0\3\105\2\0\1\105\1\0\2\105\13\0\6\105"+
+ "\1\0\11\105\1\5\4\0\5\5\1\0\2\5\1\0"+
+ "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\2\5\1\246\3\5\1\0\12\5\4\0\5\5\1\0"+
+ "\2\5\1\0\3\5\1\247\10\5\1\0\3\5\2\0"+
+ "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+ "\5\5\1\0\2\5\1\0\2\5\1\250\3\5\1\251"+
+ "\5\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\2\5\1\252\3\5\1\0\12\5\4\0\5\5\1\0"+
+ "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+ "\2\5\13\0\1\5\1\253\4\5\1\0\12\5\4\0"+
+ "\5\5\1\0\2\5\1\0\3\5\1\254\10\5\1\0"+
+ "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+ "\12\5\4\0\5\5\1\0\2\5\1\0\4\5\1\255"+
+ "\7\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+ "\5\5\1\256\6\5\1\0\3\5\2\0\1\5\1\0"+
+ "\2\5\13\0\6\5\1\0\12\5\4\0\1\5\1\257"+
+ "\3\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\5\13\1\137\2\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\1\13\1\260\11\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+ "\1\261\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\1\13\1\262\6\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\1\263\2\13\1\137"+
+ "\1\264\6\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\6\13\1\265"+
+ "\4\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\2\13\1\266\10\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\267\12\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\1\13\1\270\6\13\1\5\4\0\1\5\1\271\3\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\5\13\1\272\5\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\3\13\1\273\2\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\13\13\1\0\3\13\2\0\1\13\1\0\1\13\1\274"+
+ "\13\0\2\13\1\275\3\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\1\13\1\276\11\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\6\13"+
+ "\1\277\4\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\300"+
+ "\3\13\1\0\1\5\2\13\1\301\5\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+ "\1\302\2\13\1\303\6\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\4\13\1\304\6\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\5\13\1\164\2\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\7\13\1\262\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\1\13\1\305\4\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\3\13\1\306\2\13\1\0\1\5"+
+ "\10\13\1\105\4\0\4\105\1\307\1\0\2\105\1\0"+
+ "\3\105\3\307\3\105\2\307\1\105\1\0\1\307\1\105"+
+ "\1\307\2\0\1\105\1\0\1\307\1\105\13\0\1\307"+
+ "\5\105\1\0\3\105\1\307\6\105\4\0\4\105\1\151"+
+ "\1\0\2\105\1\0\3\105\1\107\1\110\5\105\1\151"+
+ "\1\105\1\0\1\107\2\110\2\0\1\105\1\0\2\105"+
+ "\13\0\1\110\5\105\1\0\5\105\1\110\3\105\1\310"+
+ "\1\0\35\310\1\311\40\310\1\0\3\310\1\152\1\312"+
+ "\1\313\7\310\2\152\1\310\2\152\4\310\1\152\6\310"+
+ "\1\314\3\152\1\315\15\310\1\152\15\310\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+ "\1\316\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\317"+
+ "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\1\13\1\320\4\13\1\0\1\5\10\13\5\157\1\321"+
+ "\33\157\1\322\36\157\1\0\3\157\1\35\1\323\1\324"+
+ "\7\157\2\35\1\157\2\35\4\157\1\35\6\157\4\35"+
+ "\1\325\15\157\1\35\15\157\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\2\13\1\326\10\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\3\13\1\327\2\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\1\330\12\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\3\13\1\331\1\13\1\332\5\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\2\13\1\333\5\13\1\5\4\0\1\5\1\334\3\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\1\335\12\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\1\13\1\270\6\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+ "\1\336\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\4\13\1\137"+
+ "\1\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\4\13\1\337\3\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\137\12\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\2\13\1\340\10\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\6\13\1\341\1\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\2\13\1\342\10\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\13"+
+ "\1\343\4\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\1\344\12\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\1\345\1\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\1\13\1\346\1\13\1\347\2\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\1\13\1\350\11\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\1\351\5\13\1\265\4\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\4\13\1\352\6\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\2\13\1\353\3\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\2\13\1\354\1\13\1\355\6\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\70\0\1\356\32\0\1\357\135\0\1\360\32\0\1\361"+
+ "\147\0\1\362\32\0\1\363\135\0\1\364\32\0\1\365"+
+ "\140\0\1\366\36\0\1\367\75\0\1\370\3\0\1\371"+
+ "\34\0\1\372\75\0\1\373\37\0\1\374\77\0\1\255"+
+ "\77\0\1\375\53\0\1\234\1\0\75\234\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+ "\1\300\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\376"+
+ "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\1\377\12\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\4\13\1\u0100\6\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\1\u0101\7\13\1\105"+
+ "\4\0\4\105\1\244\1\0\2\105\1\0\4\105\1\110"+
+ "\5\105\1\244\1\105\1\0\1\105\2\110\2\0\1\105"+
+ "\1\0\2\105\13\0\1\110\5\105\1\0\5\105\1\110"+
+ "\3\105\11\0\1\244\16\0\1\244\46\0\1\5\4\0"+
+ "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+ "\1\5\1\0\2\5\13\0\1\u0102\5\5\1\0\12\5"+
+ "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+ "\2\0\1\5\1\0\2\5\13\0\5\5\1\u0103\1\0"+
+ "\12\5\4\0\5\5\1\0\2\5\1\0\2\5\1\u0104"+
+ "\11\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\6\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+ "\7\5\1\u0105\4\5\1\0\3\5\2\0\1\5\1\0"+
+ "\2\5\13\0\1\5\1\121\4\5\1\0\12\5\4\0"+
+ "\5\5\1\0\2\5\1\0\14\5\1\0\3\5\2\0"+
+ "\1\5\1\0\2\5\13\0\1\u0106\5\5\1\0\12\5"+
+ "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+ "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0105\3\5"+
+ "\1\0\12\5\4\0\5\5\1\0\2\5\1\0\4\5"+
+ "\1\117\7\5\1\0\3\5\2\0\1\5\1\0\2\5"+
+ "\13\0\6\5\1\0\11\5\1\255\1\0\75\255\1\5"+
+ "\4\0\5\5\1\0\2\5\1\0\2\5\1\u0107\11\5"+
+ "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\6\5"+
+ "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\2\13\1\u0108\10\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\3\13\1\172\2\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\6\13\1\137\4\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+ "\1\u0109\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\1\u010a\3\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\1\u010b\5\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\2\13\1\137\10\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\2\13\1\174\3\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\2\13\1\u010a\10\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\5\13"+
+ "\1\u010c\5\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\4\13\1\137\3\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\6\13\1\257\4\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\4\13\1\240\6\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\2\13\1\320\10\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\4\13\1\u010d\6\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\2\13\1\u010e\10\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\1\u010f\12\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\5\13\1\377"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+ "\1\137\4\13\1\5\4\0\1\5\1\u0110\3\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\1\13\1\237\4\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\1\u0111\12\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+ "\1\u0112\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\5\13\1\274\5\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\1\351\12\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\1\13\1\240\11\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\105\4\0"+
+ "\1\105\2\u0113\1\105\1\307\1\0\2\105\1\0\3\105"+
+ "\3\307\1\u0114\1\105\1\u0114\2\307\1\105\1\0\1\307"+
+ "\1\105\1\307\2\0\1\105\1\0\1\307\1\105\13\0"+
+ "\1\307\5\105\1\0\3\105\1\307\5\105\1\310\1\0"+
+ "\35\310\1\154\40\310\1\0\7\310\1\u0115\7\310\3\u0115"+
+ "\3\310\2\u0115\2\310\1\u0115\1\310\1\u0115\1\310\1\154"+
+ "\2\310\1\u0115\14\310\1\u0115\11\310\1\u0115\6\310\1\0"+
+ "\7\310\1\u0116\7\310\3\u0116\3\310\2\u0116\2\310\1\u0116"+
+ "\1\310\1\u0116\1\310\1\154\2\310\1\u0116\14\310\1\u0116"+
+ "\11\310\1\u0116\5\310\37\0\1\311\37\0\1\310\1\0"+
+ "\7\310\1\u0117\7\310\3\u0117\3\310\2\u0117\2\310\1\u0117"+
+ "\1\310\1\u0117\1\310\1\154\2\310\1\u0117\14\310\1\u0117"+
+ "\11\310\1\u0117\5\310\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\u0118\12\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\4\13\1\u0119\6\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\1\137\5\13\1\0\1\5\10\13\1\157\1\0"+
+ "\102\157\1\321\3\157\1\u011a\7\157\3\u011a\3\157\2\u011a"+
+ "\2\157\1\u011a\1\157\1\u011a\3\157\1\322\1\u011a\14\157"+
+ "\1\u011a\11\157\1\u011a\12\157\1\321\3\157\1\u011b\7\157"+
+ "\3\u011b\3\157\2\u011b\2\157\1\u011b\1\157\1\u011b\3\157"+
+ "\1\322\1\u011b\14\157\1\u011b\11\157\1\u011b\12\157\1\321"+
+ "\3\157\1\35\7\157\3\35\3\157\2\35\2\157\1\35"+
+ "\1\157\1\35\3\157\1\322\1\35\14\157\1\35\11\157"+
+ "\1\35\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\4\13\1\301\6\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\5\13\1\377\5\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\2\13\1\377\10\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\4\13\1\u011c\6\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+ "\1\u011d\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\1\13\1\u011e"+
+ "\4\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\1\u011f\1\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\2\13\1\u0120\10\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\5\13\1\137\5\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\2\13\1\u0121\10\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\1\13\1\u0122\11\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+ "\1\u0110\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\1\13\1\u0123"+
+ "\11\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\5\13\1\265\5\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\3\13\1\137\2\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\5\13\1\u0111\5\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\u0124\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\u0125"+
+ "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\4\13\1\u0126\6\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\2\13"+
+ "\1\u0127\5\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\6\13\1\261\4\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\1\u0128\5\13\1\174\4\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\2\13\1\u0129\5\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\1\13\1\377\11\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\44\0"+
+ "\1\u012a\53\0\1\356\113\0\1\u012b\130\0\1\u012c\52\0"+
+ "\1\u012d\53\0\1\362\113\0\1\u012e\130\0\1\u012f\65\0"+
+ "\1\u0130\103\0\1\u0131\32\0\1\u0132\103\0\1\u0133\32\0"+
+ "\1\232\75\0\1\u0134\100\0\1\u0133\37\0\1\230\74\0"+
+ "\1\u0135\56\0\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\5\13\1\137\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\3\13\1\265\7\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\2\13\1\354\10\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\5\5\1\0\2\5\1\0\3\5\1\121\10\5\1\0"+
+ "\3\5\2\0\1\5\1\0\2\5\13\0\6\5\1\0"+
+ "\12\5\4\0\5\5\1\0\2\5\1\0\14\5\1\0"+
+ "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\u0136"+
+ "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+ "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\3\5\1\u0137\2\5\1\0\12\5\4\0\5\5\1\0"+
+ "\2\5\1\0\3\5\1\255\10\5\1\0\3\5\2\0"+
+ "\1\5\1\0\2\5\13\0\6\5\1\0\12\5\4\0"+
+ "\5\5\1\0\2\5\1\0\2\5\1\115\11\5\1\0"+
+ "\3\5\2\0\1\5\1\0\2\5\13\0\1\5\1\121"+
+ "\4\5\1\0\12\5\4\0\5\5\1\0\2\5\1\0"+
+ "\14\5\1\0\3\5\2\0\1\5\1\0\2\5\13\0"+
+ "\2\5\1\u0138\3\5\1\0\12\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\3\13\1\u0139\2\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\13\1\u013a\11\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\3\13\1\u013b\2\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\1\13\1\u013c\4\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\5\13\1\u013d\5\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\4\13\1\351\6\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\13"+
+ "\1\u013e\11\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\2\13\1\174\5\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\1\13\1\u013f\4\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\3\13"+
+ "\1\u0140\4\13\1\105\4\0\5\105\1\0\2\105\1\0"+
+ "\6\105\1\u0141\1\105\1\u0141\3\105\1\0\3\105\2\0"+
+ "\1\105\1\0\2\105\13\0\6\105\1\0\12\105\4\0"+
+ "\1\105\2\u0141\2\105\1\0\2\105\1\0\14\105\1\0"+
+ "\3\105\2\0\1\105\1\0\2\105\13\0\6\105\1\0"+
+ "\11\105\1\310\1\0\7\310\1\u0142\7\310\3\u0142\3\310"+
+ "\2\u0142\2\310\1\u0142\1\310\1\u0142\1\310\1\154\2\310"+
+ "\1\u0142\14\310\1\u0142\11\310\1\u0142\6\310\1\0\7\310"+
+ "\1\u0143\7\310\3\u0143\3\310\2\u0143\2\310\1\u0143\1\310"+
+ "\1\u0143\1\310\1\154\2\310\1\u0143\14\310\1\u0143\11\310"+
+ "\1\u0143\6\310\1\0\7\310\1\u0144\7\310\3\u0144\3\310"+
+ "\2\u0144\2\310\1\u0144\1\310\1\u0144\1\310\1\311\2\310"+
+ "\1\u0144\14\310\1\u0144\11\310\1\u0144\5\310\1\5\4\0"+
+ "\1\5\1\u0145\3\13\1\100\1\13\1\5\1\0\1\5"+
+ "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\1\200\12\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\5\157\1\321\3\157\1\u0146\7\157\3\u0146"+
+ "\3\157\2\u0146\2\157\1\u0146\1\157\1\u0146\3\157\1\322"+
+ "\1\u0146\14\157\1\u0146\11\157\1\u0146\12\157\1\321\3\157"+
+ "\1\u0147\7\157\3\u0147\3\157\2\u0147\2\157\1\u0147\1\157"+
+ "\1\u0147\3\157\1\322\1\u0147\14\157\1\u0147\11\157\1\u0147"+
+ "\5\157\1\5\4\0\1\5\1\u0148\3\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\13\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\5\13\1\u0124\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\4\13\1\u0145\3\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\5\13\1\330\5\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\13\1\u0149\11\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\6\13\1\u014a\4\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\1\13\1\u014b\11\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\6\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\4\13\1\u014c\6\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\4\13\1\u014d\6\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\2\13"+
+ "\1\u014e\10\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\4\13\1\261\3\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\1\137\7\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\1\13\1\u014f\4\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\3\13\1\274\4\13"+
+ "\3\0\1\u0150\76\0\1\u012b\1\u0151\1\0\4\u012b\3\u0151"+
+ "\1\0\1\u0151\13\u012b\1\u0151\3\u012b\2\u0151\1\u012b\1\0"+
+ "\2\u012b\3\u0151\2\0\2\u0151\3\0\1\u0151\6\u012b\1\u0151"+
+ "\11\u012b\25\0\1\356\16\0\1\u012a\35\0\1\u0152\76\0"+
+ "\1\u012e\1\u0153\1\0\4\u012e\3\u0153\1\0\1\u0153\13\u012e"+
+ "\1\u0153\3\u012e\2\u0153\1\u012e\1\0\2\u012e\3\u0153\2\0"+
+ "\2\u0153\3\0\1\u0153\6\u012e\1\u0153\11\u012e\25\0\1\362"+
+ "\16\0\1\u012d\53\0\1\232\135\0\1\u0154\100\0\1\u0155"+
+ "\35\0\1\255\75\0\1\226\37\0\1\232\77\0\1\u0156"+
+ "\15\0\1\5\4\0\5\5\1\0\2\5\1\0\14\5"+
+ "\1\0\3\5\2\0\1\5\1\0\2\5\13\0\3\5"+
+ "\1\u0157\2\5\1\0\12\5\4\0\5\5\1\0\2\5"+
+ "\1\0\2\5\1\255\11\5\1\0\3\5\2\0\1\5"+
+ "\1\0\2\5\13\0\6\5\1\0\12\5\4\0\5\5"+
+ "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+ "\1\0\2\5\13\0\1\5\1\u0158\4\5\1\0\12\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\3\13\1\137\7\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\2\13"+
+ "\1\137\3\13\1\0\1\5\10\13\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\2\13\1\u013d"+
+ "\3\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\2\13\1\u0159\5\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\5\13\1\u015a\5\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\4\13\1\u0110\6\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\2\13\1\137\5\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\4\13\1\u015b\6\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\1\310"+
+ "\1\0\7\310\1\u015c\7\310\3\u015c\3\310\2\u015c\2\310"+
+ "\1\u015c\1\310\1\u015c\1\310\1\154\2\310\1\u015c\14\310"+
+ "\1\u015c\11\310\1\u015c\6\310\1\0\7\310\1\u015d\7\310"+
+ "\3\u015d\3\310\2\u015d\2\310\1\u015d\1\310\1\u015d\1\310"+
+ "\1\154\2\310\1\u015d\14\310\1\u015d\11\310\1\u015d\6\310"+
+ "\1\0\7\310\1\u015e\7\310\3\u015e\3\310\2\u015e\2\310"+
+ "\1\u015e\1\310\1\u015e\1\310\1\311\2\310\1\u015e\14\310"+
+ "\1\u015e\11\310\1\u015e\5\310\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\4\13\1\336\6\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\6\13"+
+ "\1\0\1\5\10\13\5\157\1\321\3\157\1\325\7\157"+
+ "\3\325\3\157\2\325\2\157\1\325\1\157\1\325\3\157"+
+ "\1\322\1\325\14\157\1\325\11\157\1\325\12\157\1\321"+
+ "\3\157\1\u015f\7\157\3\u015f\3\157\2\u015f\2\157\1\u015f"+
+ "\1\157\1\u015f\3\157\1\322\1\u015f\14\157\1\u015f\11\157"+
+ "\1\u015f\5\157\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\5\13\1\174\5\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\3\13\1\u0160\7\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\2\13\1\u0145\3\13\1\0"+
+ "\1\5\10\13\1\5\4\0\1\5\4\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\1\13\1\u0160"+
+ "\6\13\1\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\1\13\1\u0161\4\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\1\u0162\12\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\1\265"+
+ "\12\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\2\13\1\u0163\5\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\13\13\1\0\3\13\2\0"+
+ "\1\13\1\0\2\13\13\0\2\13\1\u0164\3\13\1\0"+
+ "\1\5\10\13\3\0\1\u012b\76\0\1\u012e\155\0\1\u0165"+
+ "\34\0\1\255\136\0\1\u0166\16\0\1\5\4\0\5\5"+
+ "\1\0\2\5\1\0\14\5\1\0\3\5\2\0\1\5"+
+ "\1\0\2\5\13\0\2\5\1\255\3\5\1\0\12\5"+
+ "\4\0\5\5\1\0\2\5\1\0\14\5\1\0\3\5"+
+ "\2\0\1\5\1\0\2\5\13\0\2\5\1\u0167\3\5"+
+ "\1\0\12\5\4\0\1\5\4\13\1\100\1\13\1\5"+
+ "\1\0\1\5\13\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\1\13\1\174\4\13\1\0\1\5\10\13"+
+ "\1\5\4\0\1\5\4\13\1\100\1\13\1\5\1\0"+
+ "\1\5\13\13\1\0\3\13\2\0\1\13\1\0\2\13"+
+ "\13\0\6\13\1\0\1\5\5\13\1\137\2\13\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\5\13\1\u0168\5\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\310\1\0"+
+ "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+ "\1\310\1\152\1\310\1\154\2\310\1\152\14\310\1\152"+
+ "\11\310\1\152\6\310\1\0\7\310\1\312\7\310\3\312"+
+ "\3\310\2\312\2\310\1\312\1\310\1\312\1\310\1\154"+
+ "\2\310\1\312\14\310\1\312\11\310\1\312\6\310\1\0"+
+ "\7\310\1\152\7\310\3\152\3\310\2\152\2\310\1\152"+
+ "\1\310\1\152\1\310\1\311\2\310\1\152\14\310\1\152"+
+ "\11\310\1\152\5\310\5\157\1\321\3\157\1\323\7\157"+
+ "\3\323\3\157\2\323\2\157\1\323\1\157\1\323\3\157"+
+ "\1\322\1\323\14\157\1\323\11\157\1\323\5\157\1\5"+
+ "\4\0\1\5\4\13\1\100\1\13\1\5\1\0\1\5"+
+ "\4\13\1\u0169\6\13\1\0\3\13\2\0\1\13\1\0"+
+ "\2\13\13\0\6\13\1\0\1\5\10\13\1\5\4\0"+
+ "\1\5\4\13\1\100\1\13\1\5\1\0\1\5\13\13"+
+ "\1\0\3\13\2\0\1\13\1\0\2\13\13\0\1\265"+
+ "\5\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\3\13\1\u016a\2\13"+
+ "\1\0\1\5\10\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\274\12\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\10\13\1\5\4\0\1\5\1\265\3\13\1\100\1\13"+
+ "\1\5\1\0\1\5\13\13\1\0\3\13\2\0\1\13"+
+ "\1\0\2\13\13\0\6\13\1\0\1\5\10\13\61\0"+
+ "\1\255\76\0\1\u016b\15\0\1\5\4\0\5\5\1\0"+
+ "\2\5\1\0\14\5\1\0\3\5\2\0\1\5\1\0"+
+ "\2\5\13\0\5\5\1\255\1\0\12\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\5\13\1\u016c"+
+ "\5\13\1\0\3\13\2\0\1\13\1\0\2\13\13\0"+
+ "\6\13\1\0\1\5\10\13\1\5\4\0\1\5\4\13"+
+ "\1\100\1\13\1\5\1\0\1\5\13\13\1\0\3\13"+
+ "\2\0\1\13\1\0\2\13\13\0\6\13\1\0\1\5"+
+ "\2\13\1\265\5\13\1\5\4\0\1\5\4\13\1\100"+
+ "\1\13\1\5\1\0\1\5\1\13\1\137\11\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\6\13\1\0"+
+ "\1\5\10\13\64\0\1\255\12\0\1\5\4\0\1\5"+
+ "\4\13\1\100\1\13\1\5\1\0\1\5\13\13\1\0"+
+ "\3\13\2\0\1\13\1\0\2\13\13\0\3\13\1\u013f"+
+ "\2\13\1\0\1\5\10\13";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[21231];
+ 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 =
+ "\2\0\3\1\1\11\10\1\1\11\17\1\1\11\4\1"+
+ "\2\11\11\1\1\11\5\1\1\11\5\1\1\11\1\1"+
+ "\1\0\1\1\1\11\12\1\1\0\1\11\40\1\1\11"+
+ "\4\1\1\11\27\1\1\11\7\0\1\11\2\0\1\11"+
+ "\7\0\1\1\1\11\7\1\1\0\43\1\1\11\10\1"+
+ "\1\11\33\1\20\0\54\1\1\0\1\1\2\0\1\1"+
+ "\7\0\32\1\7\0\16\1\2\0\4\1\1\0\1\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[364];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CSharpTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = VERBATIMSTRING;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = DELIMITEDCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public CSharpTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public CSharpTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 158) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 35:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+ }
+ case 36: break;
+ case 28:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 37: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 38: break;
+ case 30:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 39: break;
+ case 25:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 40: break;
+ case 4:
+ { addToken(Token.WHITESPACE);
+ }
+ case 41: break;
+ case 29:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 42: break;
+ case 22:
+ { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+ }
+ case 43: break;
+ case 31:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 44: break;
+ case 19:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 45: break;
+ case 21:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 46: break;
+ case 10:
+ { addToken(Token.SEPARATOR);
+ }
+ case 47: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+ }
+ case 48: break;
+ case 6:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 49: break;
+ case 13:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken;
+ }
+ case 50: break;
+ case 8:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 51: break;
+ case 9:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 52: break;
+ case 32:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 53: break;
+ case 2:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 54: break;
+ case 23:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 55: break;
+ case 33:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 56: break;
+ case 20:
+ { start = zzMarkedPos-2; yybegin(VERBATIMSTRING);
+ }
+ case 57: break;
+ case 24:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 58: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 59: break;
+ case 34:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 60: break;
+ case 16:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 61: break;
+ case 18:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 62: break;
+ case 27:
+ { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT);
+ }
+ case 63: break;
+ case 17:
+ { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT);
+ }
+ case 64: break;
+ case 7:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 65: break;
+ case 5:
+ { addToken(Token.OPERATOR);
+ }
+ case 66: break;
+ case 26:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+ }
+ case 67: break;
+ case 15:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 68: break;
+ case 1:
+ {
+ }
+ case 69: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 70: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case VERBATIMSTRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 365: break;
+ case DOCUMENTCOMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken;
+ }
+ case 366: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 367: break;
+ case DELIMITEDCOMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 368: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex
new file mode 100644
index 0000000..e11ec75
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.flex
@@ -0,0 +1,643 @@
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>CTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class CTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|[_])
+Digit = [0-9]
+HexDigit = {Digit}|[A-Fa-f]
+OctalDigit = [0-7]
+Exponent = [eE][+-]?{Digit}+
+
+PreprocessorWord = define|elif|else|endif|error|if|ifdef|ifndef|include|line|pragma|undef
+
+Trigraph = ("??="|"??("|"??)"|"??/"|"??'"|"??<"|"??>"|"??!"|"??-")
+
+OctEscape1 = ([\\]{OctalDigit})
+OctEscape2 = ([\\]{OctalDigit}{OctalDigit})
+OctEscape3 = ([\\][0-3]{OctalDigit}{OctalDigit})
+OctEscape = ({OctEscape1}|{OctEscape2}|{OctEscape3})
+HexEscape = ([\\][xX]{HexDigit}{HexDigit})
+
+AnyChrChr = ([^\'\n\\])
+Escape = ([\\]([abfnrtv\'\"\?\\0]))
+UnclosedCharLiteral = ([\']({Escape}|{OctEscape}|{HexEscape}|{Trigraph}|{AnyChrChr}))
+CharLiteral = ({UnclosedCharLiteral}[\'])
+ErrorUnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = (([\'][\'])|{ErrorUnclosedCharLiteral}[\'])
+AnyStrChr = ([^\"\n\\])
+FalseTrigraph = (("?"(("?")*)[^\=\(\)\/\'\<\>\!\-\\\?\"\n])|("?"[\=\(\)\/\'\<\>\!\-]))
+StringLiteral = ([\"]((((("?")*)({Escape}|{OctEscape}|{HexEscape}|{Trigraph}))|{FalseTrigraph}|{AnyStrChr})*)(("?")*)[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+
+LineTerminator = \n
+WhiteSpace = [ \t\f]
+
+MLCBegin = "/*"
+MLCEnd = "*/"
+LineCommentBegin = "//"
+
+NonFloatSuffix = (([uU][lL]?)|([lL][uU]?))
+IntegerLiteral = ({Digit}+{Exponent}?{NonFloatSuffix}?)
+HexLiteral = ("0"[xX]{HexDigit}+{NonFloatSuffix}?)
+FloatLiteral = ((({Digit}*[\.]{Digit}+)|({Digit}+[\.]{Digit}*)){Exponent}?[fFlL]?)
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+Identifier = ({LetterOrUnderscore}({LetterOrUnderscore}|{Digit}|[$])*)
+ErrorIdentifier = ({NonSeparator}+)
+
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "auto" |
+ "break" |
+ "case" |
+ "const" |
+ "continue" |
+ "default" |
+ "do" |
+ "else" |
+ "enum" |
+ "extern" |
+ "for" |
+ "goto" |
+ "if" |
+ "register" |
+ "return" |
+ "sizeof" |
+ "static" |
+ "struct" |
+ "switch" |
+ "typedef" |
+ "union" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+
+ /* Data types. */
+ "char" |
+ "div_t" |
+ "double" |
+ "float" |
+ "int" |
+ "ldiv_t" |
+ "long" |
+ "short" |
+ "signed" |
+ "size_t" |
+ "unsigned" |
+ "void" |
+ "wchar_t" { addToken(Token.DATA_TYPE); }
+
+ /* Standard functions */
+ "abort" |
+ "abs" |
+ "acos" |
+ "asctime" |
+ "asin" |
+ "assert" |
+ "atan2" |
+ "atan" |
+ "atexit" |
+ "atof" |
+ "atoi" |
+ "atol" |
+ "bsearch" |
+ "btowc" |
+ "calloc" |
+ "ceil" |
+ "clearerr" |
+ "clock" |
+ "cosh" |
+ "cos" |
+ "ctime" |
+ "difftime" |
+ "div" |
+ "errno" |
+ "exit" |
+ "exp" |
+ "fabs" |
+ "fclose" |
+ "feof" |
+ "ferror" |
+ "fflush" |
+ "fgetc" |
+ "fgetpos" |
+ "fgetwc" |
+ "fgets" |
+ "fgetws" |
+ "floor" |
+ "fmod" |
+ "fopen" |
+ "fprintf" |
+ "fputc" |
+ "fputs" |
+ "fputwc" |
+ "fputws" |
+ "fread" |
+ "free" |
+ "freopen" |
+ "frexp" |
+ "fscanf" |
+ "fseek" |
+ "fsetpos" |
+ "ftell" |
+ "fwprintf" |
+ "fwrite" |
+ "fwscanf" |
+ "getchar" |
+ "getc" |
+ "getenv" |
+ "gets" |
+ "getwc" |
+ "getwchar" |
+ "gmtime" |
+ "isalnum" |
+ "isalpha" |
+ "iscntrl" |
+ "isdigit" |
+ "isgraph" |
+ "islower" |
+ "isprint" |
+ "ispunct" |
+ "isspace" |
+ "isupper" |
+ "isxdigit" |
+ "labs" |
+ "ldexp" |
+ "ldiv" |
+ "localeconv" |
+ "localtime" |
+ "log10" |
+ "log" |
+ "longjmp" |
+ "malloc" |
+ "mblen" |
+ "mbrlen" |
+ "mbrtowc" |
+ "mbsinit" |
+ "mbsrtowcs" |
+ "mbstowcs" |
+ "mbtowc" |
+ "memchr" |
+ "memcmp" |
+ "memcpy" |
+ "memmove" |
+ "memset" |
+ "mktime" |
+ "modf" |
+ "offsetof" |
+ "perror" |
+ "pow" |
+ "printf" |
+ "putchar" |
+ "putc" |
+ "puts" |
+ "putwc" |
+ "putwchar" |
+ "qsort" |
+ "raise" |
+ "rand" |
+ "realloc" |
+ "remove" |
+ "rename" |
+ "rewind" |
+ "scanf" |
+ "setbuf" |
+ "setjmp" |
+ "setlocale" |
+ "setvbuf" |
+ "setvbuf" |
+ "signal" |
+ "sinh" |
+ "sin" |
+ "sprintf" |
+ "sqrt" |
+ "srand" |
+ "sscanf" |
+ "strcat" |
+ "strchr" |
+ "strcmp" |
+ "strcmp" |
+ "strcoll" |
+ "strcpy" |
+ "strcspn" |
+ "strerror" |
+ "strftime" |
+ "strlen" |
+ "strncat" |
+ "strncmp" |
+ "strncpy" |
+ "strpbrk" |
+ "strrchr" |
+ "strspn" |
+ "strstr" |
+ "strtod" |
+ "strtok" |
+ "strtol" |
+ "strtoul" |
+ "strxfrm" |
+ "swprintf" |
+ "swscanf" |
+ "system" |
+ "tanh" |
+ "tan" |
+ "time" |
+ "tmpfile" |
+ "tmpnam" |
+ "tolower" |
+ "toupper" |
+ "ungetc" |
+ "ungetwc" |
+ "va_arg" |
+ "va_end" |
+ "va_start" |
+ "vfprintf" |
+ "vfwprintf" |
+ "vprintf" |
+ "vsprintf" |
+ "vswprintf" |
+ "vwprintf" |
+ "wcrtomb" |
+ "wcscat" |
+ "wcschr" |
+ "wcscmp" |
+ "wcscoll" |
+ "wcscpy" |
+ "wcscspn" |
+ "wcsftime" |
+ "wcslen" |
+ "wcsncat" |
+ "wcsncmp" |
+ "wcsncpy" |
+ "wcspbrk" |
+ "wcsrchr" |
+ "wcsrtombs" |
+ "wcsspn" |
+ "wcsstr" |
+ "wcstod" |
+ "wcstok" |
+ "wcstol" |
+ "wcstombs" |
+ "wcstoul" |
+ "wcsxfrm" |
+ "wctob" |
+ "wctomb" |
+ "wmemchr" |
+ "wmemcmp" |
+ "wmemcpy" |
+ "wmemmove" |
+ "wmemset" |
+ "wprintf" |
+ "wscanf" { addToken(Token.FUNCTION); }
+
+ /* Standard-defined macros. */
+ "__DATE__" |
+ "__TIME__" |
+ "__FILE__" |
+ "__LINE__" |
+ "__STDC__" { addToken(Token.PREPROCESSOR); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* Preprocessor directives */
+ "#"{WhiteSpace}*{PreprocessorWord} { addToken(Token.PREPROCESSOR); }
+
+ /* String/Character Literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
+ {ErrorUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment Literals. */
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ /* Separators. */
+ "(" |
+ ")" |
+ "[" |
+ "]" |
+ "{" |
+ "}" { addToken(Token.SEPARATOR); }
+
+ /* Operators. */
+ {Trigraph} |
+ "=" |
+ "+" |
+ "-" |
+ "*" |
+ "/" |
+ "%" |
+ "~" |
+ "<" |
+ ">" |
+ "<<" |
+ ">>" |
+ "==" |
+ "+=" |
+ "-=" |
+ "*=" |
+ "/=" |
+ "%=" |
+ ">>=" |
+ "<<=" |
+ "^" |
+ "&" |
+ "&&" |
+ "|" |
+ "||" |
+ "?" |
+ ":" |
+ "," |
+ "!" |
+ "++" |
+ "--" |
+ "." |
+ "," { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Some lines will end in '\' to wrap an expression. */
+ "\\" { addToken(Token.IDENTIFIER); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Other punctuation, we'll highlight it as "identifiers." */
+ ";" { addToken(Token.IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java
new file mode 100644
index 0000000..f57d624
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/CTokenMaker.java
@@ -0,0 +1,2072 @@
+/* The following code was generated by JFlex 1.4.1 on 1/25/09 9:54 PM */
+
+/*
+ * 11/13/2004
+ *
+ * CTokenMaker.java - An object that can take a chunk of text and
+ * return a linked list of tokens representing it in the C programming
+ * language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the C programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>CTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class CTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+
+ "\1\57\1\60\1\65\1\114\1\33\1\31\1\31\1\51\1\7\1\64"+
+ "\1\37\1\54\1\32\1\47\1\77\1\76\1\41\4\5\2\3\1\70"+
+ "\1\63\1\34\1\30\1\35\1\27\1\61\1\103\1\4\1\111\1\102"+
+ "\1\6\1\55\2\1\1\105\2\1\1\53\1\106\1\107\4\1\1\110"+
+ "\1\104\1\52\2\1\1\42\2\1\1\62\1\40\1\62\1\113\1\2"+
+ "\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66\1\13"+
+ "\1\100\1\72\1\15\1\26\1\14\1\20\1\23\1\101\1\17\1\16"+
+ "\1\67\1\22\1\45\1\71\1\73\1\75\1\74\1\112\1\115\1\112"+
+ "\1\64\uff81\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 =
+ "\3\0\1\1\2\2\1\3\1\4\16\2\2\4\1\5"+
+ "\1\4\1\6\4\4\1\2\1\7\1\10\2\2\1\3"+
+ "\1\11\1\4\2\1\4\2\2\4\2\12\1\13\5\12"+
+ "\1\14\2\12\1\2\2\15\2\3\1\16\2\2\1\17"+
+ "\21\2\1\17\50\2\1\0\1\20\1\21\2\22\1\23"+
+ "\1\6\2\10\1\24\7\2\1\15\6\1\1\0\11\2"+
+ "\2\0\1\25\6\0\5\2\1\3\1\0\1\3\1\15"+
+ "\1\16\2\2\1\26\5\2\1\26\17\2\1\27\15\2"+
+ "\1\26\1\2\1\26\45\2\1\6\1\30\1\6\3\22"+
+ "\1\6\2\10\1\31\6\2\1\32\4\1\1\33\4\1"+
+ "\6\0\10\2\10\0\5\2\1\16\1\0\27\2\1\27"+
+ "\36\2\1\26\2\2\1\26\6\2\1\6\1\10\6\2"+
+ "\2\32\7\1\4\0\1\33\4\0\10\2\2\0\1\34"+
+ "\2\0\1\35\47\2\1\32\1\33\3\1\7\0\7\2"+
+ "\4\0\12\2\2\1\1\33\3\0\4\2\2\0\1\33";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[500];
+ 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\116\0\234\0\352\0\u0138\0\u0186\0\u01d4\0\u0222"+
+ "\0\u0270\0\u02be\0\u030c\0\u035a\0\u03a8\0\u03f6\0\u0444\0\u0492"+
+ "\0\u04e0\0\u052e\0\u057c\0\u05ca\0\u0618\0\u0666\0\u06b4\0\u0702"+
+ "\0\u0750\0\u079e\0\u07ec\0\u083a\0\u0888\0\u0750\0\u08d6\0\352"+
+ "\0\u0750\0\u0924\0\u0972\0\u09c0\0\u0a0e\0\u0a5c\0\u0aaa\0\u0750"+
+ "\0\u0af8\0\u0750\0\u0b46\0\u0b94\0\u0be2\0\u0c30\0\u0c7e\0\u0ccc"+
+ "\0\u0d1a\0\u0750\0\u0d68\0\u0db6\0\u0e04\0\u0e52\0\u0ea0\0\u0750"+
+ "\0\u0eee\0\u0f3c\0\u0f8a\0\u0fd8\0\u1026\0\u1074\0\u10c2\0\u1110"+
+ "\0\u115e\0\u11ac\0\u11fa\0\u1248\0\u1296\0\u12e4\0\u1332\0\u1380"+
+ "\0\u13ce\0\u141c\0\u146a\0\u14b8\0\u1506\0\u1554\0\u15a2\0\u15f0"+
+ "\0\u163e\0\u168c\0\u16da\0\u1728\0\u0138\0\u1776\0\u17c4\0\u1812"+
+ "\0\u1860\0\u18ae\0\u18fc\0\u194a\0\u1998\0\u19e6\0\u1a34\0\u1a82"+
+ "\0\u1ad0\0\u1b1e\0\u1b6c\0\u1bba\0\u1c08\0\u1c56\0\u1ca4\0\u1cf2"+
+ "\0\u1d40\0\u1d8e\0\u1ddc\0\u1e2a\0\u1e78\0\u1ec6\0\u1f14\0\u1f62"+
+ "\0\u1fb0\0\u1ffe\0\u204c\0\u209a\0\u20e8\0\u2136\0\u2184\0\u21d2"+
+ "\0\u2220\0\u226e\0\u22bc\0\u230a\0\u2358\0\u23a6\0\u0750\0\u0750"+
+ "\0\u23f4\0\u2442\0\u0750\0\u2490\0\u24de\0\u252c\0\u0750\0\u257a"+
+ "\0\u25c8\0\u2616\0\u2664\0\u26b2\0\u2700\0\u274e\0\u279c\0\u27ea"+
+ "\0\u2838\0\u2886\0\u28d4\0\u2922\0\u2970\0\u29be\0\u2a0c\0\u2a5a"+
+ "\0\u2aa8\0\u2af6\0\u2b44\0\u2b92\0\u2be0\0\u2c2e\0\u2c7c\0\u2cca"+
+ "\0\u2d18\0\u0750\0\u2d66\0\u2db4\0\u2e02\0\u2e50\0\u2e9e\0\u2eec"+
+ "\0\u2f3a\0\u2f88\0\u2fd6\0\u3024\0\u3072\0\u30c0\0\u310e\0\u0fd8"+
+ "\0\u315c\0\u0fd8\0\u31aa\0\u31f8\0\u3246\0\u3294\0\u32e2\0\u3330"+
+ "\0\u337e\0\u33cc\0\u0138\0\u341a\0\u3468\0\u34b6\0\u3504\0\u3552"+
+ "\0\u35a0\0\u35ee\0\u363c\0\u368a\0\u36d8\0\u3726\0\u3774\0\u37c2"+
+ "\0\u3810\0\u385e\0\u0138\0\u38ac\0\u38fa\0\u3948\0\u3996\0\u39e4"+
+ "\0\u3a32\0\u3a80\0\u3ace\0\u3b1c\0\u3b6a\0\u3bb8\0\u3c06\0\u3c54"+
+ "\0\u3ca2\0\u3cf0\0\u3d3e\0\u3d8c\0\u3dda\0\u3e28\0\u3e76\0\u3ec4"+
+ "\0\u3f12\0\u3f60\0\u3fae\0\u3ffc\0\u404a\0\u4098\0\u40e6\0\u4134"+
+ "\0\u4182\0\u41d0\0\u421e\0\u426c\0\u42ba\0\u4308\0\u4356\0\u43a4"+
+ "\0\u43f2\0\u4440\0\u448e\0\u44dc\0\u452a\0\u4578\0\u45c6\0\u4614"+
+ "\0\u4662\0\u46b0\0\u46fe\0\u474c\0\u479a\0\u47e8\0\u4836\0\u4884"+
+ "\0\u48d2\0\u0750\0\u4920\0\u496e\0\u49bc\0\u4a0a\0\u4a58\0\u4aa6"+
+ "\0\u4af4\0\u0750\0\u4b42\0\u4b90\0\u4bde\0\u4c2c\0\u4c7a\0\u4cc8"+
+ "\0\u4d16\0\u4d64\0\u4db2\0\u4e00\0\u4e4e\0\u4e9c\0\u4eea\0\u4f38"+
+ "\0\u4f86\0\u4fd4\0\u5022\0\u5070\0\u50be\0\u510c\0\u515a\0\u51a8"+
+ "\0\u51f6\0\u5244\0\u5292\0\u52e0\0\u532e\0\u537c\0\u53ca\0\u5418"+
+ "\0\u5466\0\u54b4\0\u5502\0\u5550\0\u559e\0\u55ec\0\u563a\0\u5688"+
+ "\0\u56d6\0\u5724\0\u5772\0\u57c0\0\u580e\0\u585c\0\u58aa\0\u58f8"+
+ "\0\u5946\0\u5994\0\u59e2\0\u5a30\0\u5a7e\0\u5acc\0\u5b1a\0\u5b68"+
+ "\0\u5bb6\0\u5c04\0\u5c52\0\u5ca0\0\u5cee\0\u5d3c\0\u5d8a\0\u5dd8"+
+ "\0\u5e26\0\u5e74\0\u5ec2\0\u5f10\0\u5f5e\0\u5fac\0\u5ffa\0\u6048"+
+ "\0\u6096\0\u60e4\0\u6132\0\u6180\0\u61ce\0\u621c\0\u626a\0\u62b8"+
+ "\0\u6306\0\u6354\0\u63a2\0\u63f0\0\u643e\0\u648c\0\u64da\0\u6528"+
+ "\0\u6576\0\u65c4\0\u6612\0\u6660\0\u66ae\0\u66fc\0\u674a\0\u6798"+
+ "\0\u67e6\0\u6834\0\u6882\0\u68d0\0\u691e\0\u696c\0\u69ba\0\u6a08"+
+ "\0\u6a56\0\u6aa4\0\u6af2\0\u6b40\0\u6b8e\0\u6bdc\0\u6c2a\0\u6c78"+
+ "\0\u6cc6\0\u6d14\0\u6d62\0\u6db0\0\u6dfe\0\u6e4c\0\u6e9a\0\u6ee8"+
+ "\0\u6f36\0\u6f84\0\u6fd2\0\u7020\0\u706e\0\u70bc\0\u710a\0\u7158"+
+ "\0\u71a6\0\u71f4\0\u7242\0\u7290\0\u72de\0\u732c\0\u737a\0\u73c8"+
+ "\0\u7416\0\u7464\0\u74b2\0\u7500\0\u754e\0\u759c\0\u75ea\0\u7638"+
+ "\0\u7686\0\u76d4\0\u7722\0\u7770\0\u77be\0\u780c\0\u785a\0\u78a8"+
+ "\0\u78f6\0\u7944\0\u7992\0\u3d3e\0\u79e0\0\u7a2e\0\u7a7c\0\u7aca"+
+ "\0\u7b18\0\u7b66\0\u7bb4\0\u7c02\0\u7c50\0\u7c9e\0\u7cec\0\u7d3a"+
+ "\0\u7d88\0\u7dd6\0\u7e24\0\u7e72\0\u7ec0\0\u7f0e\0\u7f5c\0\u7faa"+
+ "\0\u7ff8\0\u8046\0\u8094\0\u80e2\0\u8130\0\u817e\0\u81cc\0\u821a"+
+ "\0\u8268\0\u82b6\0\u8304\0\u8352\0\u83a0\0\u83ee\0\u0fd8\0\352"+
+ "\0\u843c\0\u848a\0\u84d8\0\u8526\0\u8574\0\u85c2\0\u8610\0\u865e"+
+ "\0\u86ac\0\u86fa\0\u8748\0\u8796\0\u87e4\0\u8832\0\u8880\0\u3246"+
+ "\0\u88ce\0\u891c\0\u7770\0\u896a\0\u785a\0\u89b8\0\u8a06\0\u8a54"+
+ "\0\u8aa2\0\u8af0\0\u8b3e\0\u8b8c\0\u8bda\0\u8c28\0\u8c76\0\u8cc4"+
+ "\0\u8d12\0\u0750\0\u8d60\0\u8dae\0\u8dfc\0\u8e4a\0\u8e98\0\u8ee6"+
+ "\0\u8f34\0\u8f82\0\u8fd0\0\u0138";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[500];
+ 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 =
+ "\1\4\1\5\1\6\1\7\1\5\1\7\1\5\1\10"+
+ "\1\11\1\12\1\13\1\14\1\5\1\15\1\16\1\17"+
+ "\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27"+
+ "\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37"+
+ "\1\40\1\7\1\5\1\41\1\42\1\43\1\44\1\45"+
+ "\1\46\1\30\2\5\1\47\1\5\1\50\1\51\2\4"+
+ "\1\31\1\52\1\36\1\30\1\5\1\53\1\36\1\54"+
+ "\4\5\2\7\1\5\1\55\10\5\1\31\1\36\1\56"+
+ "\1\57\12\60\1\61\30\60\1\62\5\60\1\63\14\60"+
+ "\1\64\2\60\1\65\24\60\12\66\1\67\30\66\1\70"+
+ "\22\66\1\71\2\66\1\72\24\66\7\4\1\0\17\4"+
+ "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+
+ "\1\0\3\4\4\0\2\4\1\0\21\4\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\1\5\1\73"+
+ "\4\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\3\74\1\7\1\74"+
+ "\1\7\1\75\1\0\1\74\1\75\3\74\1\76\4\74"+
+ "\1\77\4\74\11\0\1\74\1\7\1\74\2\0\2\74"+
+ "\1\7\2\0\1\77\1\76\1\100\1\74\1\0\3\74"+
+ "\4\0\2\74\1\0\5\74\2\7\12\74\13\0\1\36"+
+ "\20\0\1\36\65\0\1\4\6\5\1\0\1\5\1\101"+
+ "\1\5\1\102\4\5\1\103\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\104\1\105\1\5\1\106\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\2\5\1\107\16\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\110\1\111\2\5\1\112\1\113\1\114\1\115\1\116"+
+ "\1\5\1\117\1\120\1\121\1\122\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\123\1\0\1\124\20\5"+
+ "\4\0\1\4\6\5\1\0\2\5\1\125\1\5\1\126"+
+ "\1\5\1\127\10\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\130\7\5\1\131\3\5\1\120\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\132\1\5\1\133\2\5"+
+ "\1\134\1\135\1\5\1\136\1\5\1\137\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\140\1\141\1\0"+
+ "\1\142\3\5\1\143\3\5\1\144\10\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\145\12\5\1\146\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\2\5\1\147\14\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\150\3\5\1\151"+
+ "\2\5\1\152\3\5\1\153\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\154\1\155\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\4\5\1\156\12\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\157\5\5\1\160\1\161"+
+ "\1\5\1\162\4\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\163\2\5\1\164\1\165\4\5\11\0\1\4"+
+ "\2\5\2\0\1\5\1\166\1\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\167"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\170"+
+ "\6\5\1\165\5\5\1\171\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\1\5\1\172\6\5\1\173\3\5\1\174\2\5"+
+ "\11\0\1\4\2\5\2\0\1\5\1\175\1\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\1\5\1\171\17\5\33\0\1\176\116\0"+
+ "\1\36\233\0\1\36\1\0\1\177\16\0\1\200\44\0"+
+ "\27\201\1\202\3\201\1\203\4\201\1\204\2\201\1\0"+
+ "\52\201\34\0\1\30\116\0\1\30\110\0\1\36\6\0"+
+ "\1\36\56\0\40\42\1\205\2\42\1\206\1\207\51\42"+
+ "\1\4\6\5\1\0\2\5\1\210\3\5\1\210\1\5"+
+ "\1\211\2\5\1\137\1\212\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\213\20\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\214\1\215\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\216\1\0"+
+ "\21\5\4\0\3\74\1\7\1\74\1\7\1\75\1\0"+
+ "\1\74\1\75\3\74\1\76\4\74\1\77\4\74\11\0"+
+ "\1\74\1\7\1\217\2\0\2\74\1\7\2\0\1\77"+
+ "\1\76\1\100\1\74\1\0\3\74\4\0\2\74\1\0"+
+ "\2\74\1\217\2\74\2\7\12\74\54\0\1\46\50\0"+
+ "\1\100\1\0\1\100\33\0\1\100\5\0\1\100\26\0"+
+ "\2\100\16\0\7\4\1\0\1\220\1\221\1\4\1\222"+
+ "\1\4\1\223\4\4\1\224\1\225\3\4\11\0\3\4"+
+ "\2\0\3\4\1\226\1\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\1\4\6\5"+
+ "\1\0\3\5\1\227\4\5\1\230\3\5\1\231\1\5"+
+ "\1\232\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\4\5\1\233\14\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\134\2\5\1\234\1\5\1\137\2\5\1\235"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\236\1\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\237"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\120\0\1\36\116\0\1\36\12\60\1\0"+
+ "\30\60\1\0\5\60\1\0\14\60\1\0\2\60\1\0"+
+ "\24\60\13\0\1\240\53\0\1\241\60\0\1\242\152\0"+
+ "\1\243\117\0\1\244\24\0\12\66\1\0\30\66\1\0"+
+ "\22\66\1\0\2\66\1\0\24\66\13\0\1\245\53\0"+
+ "\1\246\115\0\1\247\117\0\1\250\24\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\1\5\1\251\1\0\1\252\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\11\5\1\253\1\5\1\254\3\5"+
+ "\1\255\1\5\4\0\7\74\1\0\17\74\11\0\3\74"+
+ "\2\0\3\74\2\0\2\74\1\0\1\74\1\0\3\74"+
+ "\4\0\2\74\1\0\21\74\4\0\3\74\1\256\1\74"+
+ "\1\256\1\74\1\257\17\74\10\0\1\257\1\74\1\256"+
+ "\1\74\2\0\2\74\1\256\2\0\2\74\1\0\1\74"+
+ "\1\0\3\74\4\0\2\74\1\0\5\74\2\256\12\74"+
+ "\4\0\7\74\1\0\12\74\1\260\4\74\11\0\3\74"+
+ "\2\0\3\74\2\0\1\260\1\74\1\0\1\74\1\0"+
+ "\3\74\4\0\2\74\1\0\21\74\4\0\7\74\1\0"+
+ "\5\74\1\260\11\74\11\0\3\74\2\0\3\74\2\0"+
+ "\1\74\1\260\1\0\1\74\1\0\3\74\4\0\2\74"+
+ "\1\0\21\74\4\0\3\74\1\100\1\74\1\100\1\261"+
+ "\1\0\1\74\1\261\1\262\2\74\1\262\11\74\11\0"+
+ "\1\74\1\100\1\74\2\0\2\74\1\100\2\0\1\74"+
+ "\1\262\1\0\1\262\1\0\3\74\4\0\2\74\1\0"+
+ "\5\74\2\100\12\74\4\0\1\4\6\5\1\0\2\5"+
+ "\1\263\14\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+ "\1\264\14\5\11\0\1\4\2\5\2\0\1\265\2\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\12\5\1\266\4\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\12\5\1\267\4\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\7\5\1\271\7\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\272\7\5\1\273\3\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\274\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\275\1\276\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\5\5\1\277\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\300\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\301\7\5\1\136"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\302"+
+ "\15\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\7\5\1\125"+
+ "\3\5\1\303\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\5\5\1\304\11\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\7\5\1\160\2\5\1\305\4\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\5"+
+ "\1\306\1\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\307\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\10\5\1\310\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\311\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\6\5\1\134\1\312\3\5\1\137\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\313\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\314\4\5\1\315\1\316"+
+ "\2\5\1\317\1\320\1\321\1\322\1\323\1\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\2\5"+
+ "\1\324\16\5\4\0\1\4\6\5\1\0\1\5\1\325"+
+ "\1\5\1\326\13\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\4\5\1\327\4\5\1\330\3\5\1\331\1\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\332\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\4\5\1\333\10\5\1\334\1\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\3\5\1\335\15\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\136\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\336\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\14\5"+
+ "\1\337\2\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\160\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\340\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\341\4\5\1\342\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\343\2\5\1\134\4\5\1\137\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\344\10\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\7\5\1\272\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\4\5\1\345\7\5"+
+ "\1\174\1\346\1\347\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\350\1\0\1\351\20\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\352\1\310\12\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\2\5\1\353\14\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\3\5\1\354\13\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\355\6\5\1\356\6\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\4\5\1\357\1\5"+
+ "\1\333\10\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\360\1\270\10\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\14\5\1\361\2\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\227\13\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\362\2\5\1\363\6\5\1\364\1\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\275\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\365\13\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\273\20\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\366\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\367\2\5\1\370\2\5\1\171"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\306"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\371\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\273\1\5"+
+ "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\372\6\5\1\373\3\5\1\374\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\375\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\155\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\16\5\1\376\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\276\16\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\360\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\303\1\377\1\u0100\7\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\216\1\0\21\5\34\0\10\36"+
+ "\56\0\33\u0101\1\u0102\7\u0101\1\0\101\u0101\1\u0103\3\u0101"+
+ "\1\u0102\7\u0101\1\0\57\u0101\1\u0104\4\u0101\1\201\1\u0101"+
+ "\1\201\2\u0101\1\201\4\u0101\1\201\2\u0101\1\201\3\u0101"+
+ "\1\u0105\4\u0101\1\201\1\u0106\1\u0107\1\0\3\201\1\u0106"+
+ "\17\u0101\1\201\3\u0101\1\u0107\2\u0101\2\u0106\16\u0101\5\206"+
+ "\1\42\4\206\1\42\1\206\1\42\2\206\1\42\4\206"+
+ "\1\42\2\206\1\42\3\206\1\42\4\206\2\42\1\u0108"+
+ "\1\0\4\42\17\206\1\42\3\206\1\u0108\2\206\2\42"+
+ "\56\206\1\u0109\3\206\1\u010a\51\206\1\4\6\5\1\0"+
+ "\13\5\1\137\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\1\213\20\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u010b\1\5\1\u010c\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\1\5\1\u010d\4\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\137\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u010e\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u010f\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u0110\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\3\74\4\u0111\1\0\3\u0111\6\74\1\u0111\2\74\1\u0111"+
+ "\2\74\11\0\1\74\1\u0111\1\74\2\0\1\74\2\u0111"+
+ "\2\0\2\74\1\0\1\u0111\1\0\3\74\4\0\2\74"+
+ "\1\0\5\74\2\u0111\2\74\2\u0111\5\74\1\u0111\4\0"+
+ "\7\4\1\0\1\4\1\u0112\15\4\11\0\3\4\2\0"+
+ "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+ "\2\4\1\0\21\4\4\0\7\4\1\0\4\4\1\u0113"+
+ "\1\u0114\1\4\1\u0115\7\4\11\0\3\4\2\0\3\4"+
+ "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+ "\1\0\21\4\4\0\7\4\1\0\2\4\1\u0116\1\4"+
+ "\1\u0117\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\3\4\1\u0118\13\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\4\4"+
+ "\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\7\4\1\u011a\7\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\14\0\1\u011b\1\u011c\1\0"+
+ "\1\u011d\1\0\1\u011e\4\0\1\u011f\1\u0120\24\0\1\226"+
+ "\45\0\1\4\6\5\1\0\16\5\1\u0121\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\315\4\5\1\320\4\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\4\5\1\333\12\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0122\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\13\5\1\u0123\3\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\u0124\1\u0125"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u0126"+
+ "\1\u0127\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\172\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\u0128\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\144\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\21\0\1\u0129\123\0\1\u012a\161\0"+
+ "\1\u012b\117\0\1\u012c\41\0\1\u012d\123\0\1\u012e\161\0"+
+ "\1\u012f\117\0\1\u0130\24\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0131\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0132\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\12\5\1\u0133\6\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\14\5\1\u0134\4\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\13\5\1\u0135\5\5\4\0\3\74\1\256\1\74\1\256"+
+ "\1\74\1\0\5\74\1\76\4\74\1\77\4\74\11\0"+
+ "\1\74\1\256\1\74\2\0\2\74\1\256\2\0\1\77"+
+ "\1\76\1\0\1\74\1\0\3\74\4\0\2\74\1\0"+
+ "\5\74\2\256\12\74\7\0\1\256\1\0\1\256\33\0"+
+ "\1\256\5\0\1\256\26\0\2\256\16\0\3\74\1\u0136"+
+ "\1\74\1\u0136\1\74\1\u0137\17\74\10\0\1\u0137\1\74"+
+ "\1\u0136\1\74\2\0\2\74\1\u0136\2\0\2\74\1\0"+
+ "\1\74\1\0\3\74\4\0\2\74\1\0\5\74\2\u0136"+
+ "\12\74\4\0\1\4\6\5\1\0\14\5\1\u0138\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\2\5\1\171\14\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\1\5\1\126\4\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\1\5\1\u0139\1\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\16\5\1\125\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\125\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u013a\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\273\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u013b\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u013c\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\2\5\1\273\14\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\12\5\1\u013d\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u013e\3\5\1\126\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u013f\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0140"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\1\5\1\273"+
+ "\6\5\1\u0141\3\5\1\310\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\2\5\1\u0142\16\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\367\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\352\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\u0143\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\273\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\u0144\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\273\16\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\354\11\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u0145\13\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\3\5\1\u0146\13\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u0147\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u0148\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\u0149\12\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u014a\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\7\5\1\u014b\2\5\1\u014c\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\u014d\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u014e\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\314\16\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\2\5\1\u0142\16\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\1\265"+
+ "\2\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\15\5\1\u014f\1\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\14\5\1\u0150\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\6\5\1\u0151\12\5\4\0\1\4\6\5"+
+ "\1\0\5\5\1\u0152\11\5\11\0\1\4\2\5\2\0"+
+ "\1\u0153\1\u0154\1\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\7\5\1\u0155"+
+ "\11\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\273\1\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u0156\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0157\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\310\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\276\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\7\5\1\126\7\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\157\1\171\1\5"+
+ "\1\u0158\1\303\1\u0159\1\u015a\1\5\1\u015b\1\u015c\1\u015d"+
+ "\3\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u015e\1\0\2\5\1\u015f\16\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u0160\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0161\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\1\5\1\u0162"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\227"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\u0163"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\10\5\1\u0164"+
+ "\6\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\12\5\1\u013b"+
+ "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\3\5\1\336"+
+ "\13\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0121"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0165"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\5\5\1\273"+
+ "\11\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\14\5\1\u0166"+
+ "\2\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\11\5\1\u013f"+
+ "\5\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\6\5\1\u0167"+
+ "\10\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0168\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\u0169\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\313\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\10\5"+
+ "\1\u016a\6\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\u016b\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\u016c\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u016d\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\6\5"+
+ "\1\273\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\273\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\144\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\10\5\1\125\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\2\5\1\u0170\16\5\4\0\1\4"+
+ "\6\5\1\0\2\5\2\273\1\5\1\273\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u0171\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u0172\4\5\1\273"+
+ "\2\5\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\1\u016f\20\5\4\0\1\4\6\5"+
+ "\1\0\6\5\1\u0173\2\5\1\u0174\4\5\1\347\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\u0175\3\5\1\u0176"+
+ "\7\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0\5\5"+
+ "\1\303\11\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\216\1\0\21\5\4\0\33\u0101\1\203\7\u0101"+
+ "\1\0\102\u0101\3\201\1\u0105\4\201\3\u0101\1\0\57\u0101"+
+ "\1\201\25\u0101\1\u0102\5\u0101\1\201\1\u0101\1\0\3\u0101"+
+ "\1\201\26\u0101\2\201\16\u0101\33\0\1\u0102\62\0\5\u0101"+
+ "\1\u0104\25\u0101\1\u0102\5\u0101\1\u0104\1\u0101\1\0\3\u0101"+
+ "\1\u0104\26\u0101\2\u0104\21\u0101\4\u0178\1\u0101\3\u0178\6\u0101"+
+ "\1\u0178\2\u0101\1\u0178\6\u0101\1\203\5\u0101\1\u0178\1\u0101"+
+ "\1\0\2\u0101\2\u0178\5\u0101\1\u0178\20\u0101\2\u0178\2\u0101"+
+ "\2\u0178\5\u0101\1\u0178\4\u0101\3\206\4\u0179\1\206\3\u0179"+
+ "\6\206\1\u0179\2\206\1\u0179\13\206\1\u0109\1\u0179\2\206"+
+ "\1\u010a\1\206\2\u0179\5\206\1\u0179\20\206\2\u0179\2\206"+
+ "\2\u0179\5\206\1\u0179\47\206\1\0\52\206\1\4\6\5"+
+ "\1\0\1\313\16\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\14\5\1\u017a\2\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\336\4\5\1\u017b\5\5\1\u017c\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\14\5\1\u017d\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\14\5\1\u017e\2\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\u017f\20\5\4\0"+
+ "\3\74\4\u0111\1\0\3\u0111\2\74\1\u0180\3\74\1\u0111"+
+ "\1\u0181\1\74\1\u0111\2\74\11\0\1\74\1\u0111\1\74"+
+ "\2\0\1\74\2\u0111\2\0\1\u0181\1\u0180\1\0\1\u0111"+
+ "\1\0\3\74\4\0\2\74\1\0\5\74\2\u0111\2\74"+
+ "\2\u0111\5\74\1\u0111\4\0\7\4\1\0\2\4\1\223"+
+ "\14\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+ "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+ "\7\4\1\0\1\u0182\16\4\11\0\3\4\2\0\3\4"+
+ "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+ "\1\0\21\4\4\0\7\4\1\0\3\4\1\u0183\2\4"+
+ "\1\u0184\10\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\4\0\7\4\1\0\7\4\1\u0185\7\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\1\u0186"+
+ "\3\4\1\u0119\12\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\11\4\1\u0187\5\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\4\4\1\u0184\12\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\1\u0186\16\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+ "\1\u0188\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\15\0\1\u0189\120\0\1\u018a\1\u018b\1\0\1\u018c\110\0"+
+ "\1\u018d\1\0\1\u018e\114\0\1\u018f\116\0\1\u0190\120\0"+
+ "\1\u0191\76\0\1\4\6\5\1\0\1\5\1\273\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\2\5\1\u0192\1\5"+
+ "\1\u0193\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\u0194\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\2\5"+
+ "\1\171\1\5\1\u0158\1\303\1\u0159\1\u0195\1\5\1\u015b"+
+ "\1\5\1\u015d\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\u0196\1\0\2\5\1\u015f\16\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\u0197\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\14\5\1\u0198\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\10\5\1\u0199\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\5\5\1\270\11\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\15\0\1\u012a"+
+ "\174\0\1\u019a\50\0\1\u019b\146\0\1\u019c\52\0\1\u012e"+
+ "\174\0\1\u019d\50\0\1\u019e\146\0\1\u019f\41\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\16\5\1\u01a0\2\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\1\5\1\u01a0\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\13\5\1\u01a0\5\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\15\5\1\u01a0\3\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\11\5\1\u01a1\7\5\4\0\3\74\1\u0136"+
+ "\1\74\1\u0136\1\74\1\0\2\74\1\262\2\74\1\262"+
+ "\11\74\11\0\1\74\1\u0136\1\74\2\0\2\74\1\u0136"+
+ "\2\0\1\74\1\262\1\0\1\262\1\0\3\74\4\0"+
+ "\2\74\1\0\5\74\2\u0136\12\74\7\0\1\u0136\1\0"+
+ "\1\u0136\33\0\1\u0136\5\0\1\u0136\26\0\2\u0136\16\0"+
+ "\1\4\6\5\1\0\12\5\1\u01a2\4\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\5\5\1\u01a3\11\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\273\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u016a\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u013e\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\u01a4\10\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\273\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\1\5\1\273\17\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\164\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\303\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\273\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\6\5\1\273\2\5\1\273\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\u01a5\20\5\4\0\1\4\6\5\1\0\6\5\1\273"+
+ "\2\5\1\273\1\5\1\164\3\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\u01a5\20\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\u0121\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\15\5\1\u0170\1\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\1\u01a6\20\5\4\0\1\4\6\5"+
+ "\1\0\14\5\1\u01a7\2\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u01a8\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\13\5\1\u01a6\3\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\3\5\1\u01a9\13\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\4\5\1\u01aa\12\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\4\5\1\u01ab\6\5\1\u01ac\3\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\14\5\1\u01ad\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\7\5\1\u0155\11\5\4\0\1\4"+
+ "\6\5\1\0\5\5\1\u01ae\11\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\2\5"+
+ "\1\273\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u01af\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\u0154"+
+ "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\12\5\1\276\4\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\16\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\u010b\12\5\1\354\2\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\1\5\1\126\4\5\1\0\10\5\1\u01b0\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\u01b1\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\13\5\1\367\3\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\u013e\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01b2\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\6\5\1\u01b3\1\5"+
+ "\1\311\2\5\1\u01b4\1\272\1\5\1\u0142\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\u0167\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\1\5\1\u01b5\1\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\u01b6\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\2\5\1\u01b7\14\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\3\5\1\u01b8\13\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\u01b9\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u01ba\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\6\5\1\u01bb\10\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\1\u0121\2\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\5\1\u01bc\15\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u01bd\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\125\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\3\5\1\u01be\13\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\10\5\1\u017f\6\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\125\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\15\5\1\u01bf\1\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\5\1\u01c0\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\276\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\u01c1"+
+ "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\u016e\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\3\5"+
+ "\1\272\13\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\5\5\1\273\13\5\4\0\1\4\6\5\1\0\4\5"+
+ "\1\u01c2\12\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\1\5"+
+ "\1\272\15\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\13\5"+
+ "\1\u01b4\2\5\1\u0142\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\u013e\1\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\4\5\1\u0170\12\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\u0177\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\10\5\1\u01c3\6\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\3\u0101\4\201\1\u0101"+
+ "\3\201\6\u0101\1\201\2\u0101\1\201\6\u0101\1\203\5\u0101"+
+ "\1\201\1\u0101\1\0\2\u0101\2\201\5\u0101\1\201\20\u0101"+
+ "\2\201\2\u0101\2\201\5\u0101\1\201\4\u0101\3\206\4\42"+
+ "\1\206\3\42\6\206\1\42\2\206\1\42\13\206\1\u0109"+
+ "\1\42\2\206\1\u010a\1\206\2\42\5\206\1\42\20\206"+
+ "\2\42\2\206\2\42\5\206\1\42\4\206\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\1\5\1\236\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\5"+
+ "\1\u01c4\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u01c5\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\7\5"+
+ "\1\u01c6\7\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\1\4\6\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\1\5\1\125\17\5\4\0\1\4\6\5\1\0\11\5"+
+ "\1\273\5\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\21\5\4\0\7\74\1\0\12\74\1\u01c7"+
+ "\4\74\11\0\3\74\2\0\3\74\2\0\1\u01c7\1\74"+
+ "\1\0\1\74\1\0\3\74\4\0\2\74\1\0\21\74"+
+ "\4\0\7\74\1\0\5\74\1\u01c7\11\74\11\0\3\74"+
+ "\2\0\3\74\2\0\1\74\1\u01c7\1\0\1\74\1\0"+
+ "\3\74\4\0\2\74\1\0\21\74\4\0\7\4\1\0"+
+ "\3\4\1\u0183\13\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\2\4\1\u01c8\14\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\1\4\1\u01c8\15\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\10\4\1\u01c9\6\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\1\4\1\u0183\15\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\4\0\7\4\1\0\5\4\1\u01ca\11\4\11\0"+
+ "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+
+ "\3\4\4\0\2\4\1\0\21\4\4\0\7\4\1\0"+
+ "\15\4\1\u01cb\1\4\11\0\3\4\2\0\3\4\2\0"+
+ "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+
+ "\21\4\16\0\1\u011e\113\0\1\u01cc\120\0\1\u01cd\2\0"+
+ "\1\u01ce\116\0\1\u01cf\106\0\1\u01d0\3\0\1\u0190\122\0"+
+ "\1\u01d1\110\0\1\u01ce\111\0\1\u01d0\131\0\1\u01d2\71\0"+
+ "\1\4\6\5\1\0\3\5\1\u01d3\13\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\14\5\1\u01ba\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\u01d4\16\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\11\5\1\u01b2\5\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\5\1\u01d5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u01d6\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\10\5\1\u01d7\6\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u01d8\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5"+
+ "\2\0\1\5\1\273\1\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\36\0\1\u01da\101\0\1\u012a\51\0\1\u019a\26\0\1\u019c"+
+ "\1\u01db\4\u019c\1\u01db\17\u019c\3\u01db\1\u019c\1\u01db\2\0"+
+ "\2\u01db\1\0\2\u019c\2\0\3\u019c\1\0\1\u01db\2\u019c"+
+ "\1\u01db\1\u019c\1\0\1\u01db\1\u019c\5\u01db\2\u019c\1\u01db"+
+ "\21\u019c\2\0\1\u01db\33\0\1\u01dc\101\0\1\u012e\51\0"+
+ "\1\u019d\26\0\1\u019f\1\u01dd\4\u019f\1\u01dd\17\u019f\3\u01dd"+
+ "\1\u019f\1\u01dd\2\0\2\u01dd\1\0\2\u019f\2\0\3\u019f"+
+ "\1\0\1\u01dd\2\u019f\1\u01dd\1\u019f\1\0\1\u01dd\1\u019f"+
+ "\5\u01dd\2\u019f\1\u01dd\21\u019f\2\0\1\u01dd\1\0\1\4"+
+ "\5\5\1\u01de\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\3\5\2\0"+
+ "\2\5\1\0\1\5\1\0\1\4\1\5\1\4\4\0"+
+ "\2\5\1\0\20\5\1\u01de\4\0\1\4\6\5\1\0"+
+ "\5\5\1\u0167\11\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\1\5\1\313\15\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\6\5\1\273\2\5\1\273\5\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\1\5\1\u013e\15\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\11\5\1\u0121\5\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\7\5\1\354\7\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\4\5\1\272\12\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\11\5\1\272\5\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\12\5\1\u01ba\4\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\17\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\1\u01df\1\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\13\5\1\u01a4\3\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\1\5\1\u01e0\15\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\1\5\1\155\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\11\5\1\u01e1\5\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\2\5\1\125\14\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\21\5\4\0\1\4"+
+ "\6\5\1\0\13\5\1\u01b4\1\272\1\5\1\u0142\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\1\u013e\1\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\13\5\1\367\3\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\4\5\1\273\14\5\4\0"+
+ "\1\4\6\5\1\0\7\5\1\u013f\7\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\1\273\4\5\1\273\4\5\1\354"+
+ "\4\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\1\5\1\273\17\5\4\0\1\4\6\5\1\0"+
+ "\7\5\1\u01ba\7\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\11\5\1\125\5\5\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\21\5\4\0\1\4\6\5\1\0"+
+ "\17\5\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\1\125"+
+ "\1\5\1\0\21\5\4\0\1\4\6\5\1\0\16\5"+
+ "\1\273\11\0\1\4\2\5\2\0\3\5\2\0\2\5"+
+ "\1\0\1\5\1\0\1\4\1\5\1\4\4\0\2\5"+
+ "\1\0\21\5\4\0\1\4\6\5\1\0\17\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\1\5\1\u01e2\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\1\5\1\u01e3\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u01e4\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u01e5\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\4\5\1\u01e6\12\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\11\5\1\273\5\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\1\u017f"+
+ "\20\5\4\0\1\4\6\5\1\0\14\5\1\u013e\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\17\5\11\0\1\4"+
+ "\2\5\2\0\1\273\2\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\17\5\11\0\1\4\2\5"+
+ "\2\0\3\5\2\0\2\5\1\0\1\5\1\0\1\4"+
+ "\1\5\1\4\4\0\2\5\1\0\1\u01e7\20\5\4\0"+
+ "\1\4\6\5\1\0\14\5\1\144\2\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\15\5\1\273\1\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\1\4\6\5\1\0\11\5\1\u01a4\5\5\11\0\1\4"+
+ "\2\5\2\0\3\5\2\0\2\5\1\0\1\5\1\0"+
+ "\1\4\1\5\1\4\4\0\2\5\1\0\21\5\4\0"+
+ "\7\4\1\0\7\4\1\u01c8\7\4\11\0\3\4\2\0"+
+ "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+
+ "\2\4\1\0\21\4\4\0\7\4\1\0\12\4\1\u01e8"+
+ "\4\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+
+ "\1\4\1\0\3\4\4\0\2\4\1\0\21\4\4\0"+
+ "\7\4\1\0\16\4\1\u01e9\11\0\3\4\2\0\3\4"+
+ "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+
+ "\1\0\21\4\17\0\1\u01cd\114\0\1\u01ea\114\0\1\u01ea"+
+ "\124\0\1\u01eb\106\0\1\u01cd\121\0\1\u01ec\125\0\1\u01ed"+
+ "\70\0\1\4\6\5\1\0\5\5\1\u0121\11\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\5\1\u01b0\15\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\10\5\1\u01ee\6\5\11\0"+
+ "\1\4\2\5\2\0\3\5\2\0\2\5\1\0\1\5"+
+ "\1\0\1\4\1\5\1\4\4\0\2\5\1\0\21\5"+
+ "\4\0\1\4\6\5\1\0\1\273\4\5\1\273\4\5"+
+ "\1\354\3\5\1\120\11\0\1\4\2\5\2\0\3\5"+
+ "\2\0\2\5\1\0\1\5\1\0\1\4\1\5\1\4"+
+ "\4\0\2\5\1\0\1\5\1\273\17\5\4\0\1\4"+
+ "\6\5\1\0\16\5\1\u01d9\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\17\5\11\0\1\4\2\5\2\0\1\5\1\273"+
+ "\1\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\36\0\1\u019c\115\0"+
+ "\1\u019f\63\0\1\4\1\5\1\u01ef\4\5\1\0\17\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\273\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\u01f0\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\14\5\1\u01d3\2\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u01f1\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\10\5\1\276\6\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\7\5\1\u013e\7\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\12\5\1\270\4\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\1\5\1\u010b\15\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\1\4\6\5\1\0\11\5\1\306\5\5"+
+ "\11\0\1\4\2\5\2\0\3\5\2\0\2\5\1\0"+
+ "\1\5\1\0\1\4\1\5\1\4\4\0\2\5\1\0"+
+ "\21\5\4\0\7\4\1\0\1\u0184\16\4\11\0\3\4"+
+ "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+
+ "\4\0\2\4\1\0\21\4\4\0\7\4\1\0\14\4"+
+ "\1\u01c8\2\4\11\0\3\4\2\0\3\4\2\0\2\4"+
+ "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\21\4"+
+ "\23\0\1\u01ea\120\0\1\u01f2\121\0\1\u01f3\67\0\1\4"+
+ "\6\5\1\0\16\5\1\120\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\1\5"+
+ "\1\u01f4\4\5\1\0\17\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\10\5\1\u0172\6\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\4\0\1\4\6\5"+
+ "\1\0\7\5\1\125\7\5\11\0\1\4\2\5\2\0"+
+ "\3\5\2\0\2\5\1\0\1\5\1\0\1\4\1\5"+
+ "\1\4\4\0\2\5\1\0\21\5\14\0\1\u01ce\131\0"+
+ "\1\u01ea\71\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[36894];
+ 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 =
+ "\3\0\25\1\1\11\4\1\1\11\2\1\1\11\6\1"+
+ "\1\11\1\1\1\11\7\1\1\11\5\1\1\11\105\1"+
+ "\1\0\2\11\2\1\1\11\3\1\1\11\16\1\1\0"+
+ "\11\1\2\0\1\11\6\0\6\1\1\0\122\1\1\11"+
+ "\7\1\1\11\20\1\6\0\10\1\10\0\6\1\1\0"+
+ "\121\1\4\0\1\1\4\0\10\1\2\0\1\1\2\0"+
+ "\55\1\7\0\7\1\4\0\14\1\1\11\3\0\4\1"+
+ "\2\0\1\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[500];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public CTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill(){
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public CTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public CTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 184) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 27:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 30: break;
+ case 7:
+ { addNullToken(); return firstToken;
+ }
+ case 31: break;
+ case 24:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 32: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 33: break;
+ case 17:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 34: break;
+ case 9:
+ { addToken(Token.WHITESPACE);
+ }
+ case 35: break;
+ case 26:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 36: break;
+ case 18:
+ { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/
+ }
+ case 37: break;
+ case 25:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 38: break;
+ case 14:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 39: break;
+ case 15:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 40: break;
+ case 5:
+ { addToken(Token.SEPARATOR);
+ }
+ case 41: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 42: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 43: break;
+ case 16:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 44: break;
+ case 22:
+ { addToken(Token.FUNCTION);
+ }
+ case 45: break;
+ case 6:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 46: break;
+ case 8:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 47: break;
+ case 23:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 48: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 49: break;
+ case 19:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 50: break;
+ case 20:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 51: break;
+ case 29:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 52: break;
+ case 28:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 53: break;
+ case 13:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 54: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 55: break;
+ case 4:
+ { addToken(Token.OPERATOR);
+ }
+ case 56: break;
+ case 10:
+ {
+ }
+ case 57: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 58: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 501: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 502: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 503: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex
new file mode 100644
index 0000000..7838ea5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex
@@ -0,0 +1,568 @@
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ClojureTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+%%
+
+%public
+%class ClojureTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ClojureTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ /*case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;*/
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+
+LineCommentBegin = (";")
+Keyword = ([:][a-zA-Z?!\-+*/][a-zA-Z0-9?!\-+*/]*)
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+StringLiteral = ([\"])
+CharLiteral = ("\\."|"\\space"|"\\tab"|"\\newline")
+AnyCharacter = ([.]*)
+Separator = ([\(\)\{\}\[\]])
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'])
+
+BooleanLiteral =("true"|"false")
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+
+Nil = ("nil")
+Quote = (\('\|`\))
+Unquote = (\(\~@\|\~\))
+DispatchStart = ("#^"|"#^{")
+Dispatch = ({DispatchStart}[^\s\t\n;\"}]*([ \t\n;\"]|"}"))
+VarQuote = ("#'"[.]*[ \t\n;(\"])
+DefName = (\s*[a-zA-Z0-9?!\-+*\./<>]*)
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"<"|"*"|">="|"%"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|">>>")
+AssignmentOperator = ("=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|[_])
+Digit = [0-9]
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+"case" |
+"class" |
+"cond" |
+"condp" |
+"def" |
+"defmacro" |
+"defn" |
+"do" |
+"fn" |
+"for" |
+"if" |
+"if-let" |
+"if-not" |
+"instance?" |
+"let" |
+"loop" |
+"monitor-enter" |
+"monitor-exit" |
+"new" |
+"quote" |
+"recur" |
+"set!" |
+"this" |
+"throw" |
+"try-finally" |
+"var" |
+"when" |
+"when-first" |
+"when-let" |
+"when-not" { addToken(Token.RESERVED_WORD); }
+
+"*warn-on-reflection*" |
+"*1" |
+"*2" |
+"*3" |
+"*agent*" |
+"*allow-unresolved-args*" |
+"*assert*" |
+"*clojure-version*" |
+"*command-line-args*" |
+"*compile-files*" |
+"*compile-path*" |
+"*e" |
+"*err*" |
+"*file*" |
+"*flush-on-newline*" |
+"*fn-loader*" |
+"*in*" |
+"*math-context*" |
+"*ns*" |
+"*out*" |
+"*print-dup*" |
+"*print-length*" |
+"*print-level*" |
+"*print-meta*" |
+"*print-readably*" |
+"*read-eval*" |
+"*source-path*" |
+"*unchecked-math*" |
+"*use-context-classloader*" { addToken(Token.VARIABLE); }
+
+"*current-namespace*" |
+"*in*" |
+"*out*" |
+"*print-meta*"
+"->" |
+".." |
+"agent" |
+"agent-errors" |
+"agent-of" |
+"aget" |
+"alter" |
+"and" |
+"any" |
+"appl" |
+"apply" |
+"array" |
+"aset" |
+"aset-boolean" |
+"aset-byte" |
+"aset-double" |
+"aset-float" |
+"aset-int" |
+"aset-long" |
+"aset-short" |
+"assoc" |
+"binding" |
+"boolean" |
+"byte" |
+"char" |
+"clear-agent-errors" |
+"commute" |
+"comp" |
+"complement" |
+"concat" |
+"conj" |
+"cons" |
+"constantly" |
+"count" |
+"cycle" |
+"dec" |
+"defmethod" |
+"defmulti" |
+"delay" |
+"deref" |
+"dissoc" |
+"doseq" |
+"dotimes" |
+"doto" |
+"double" |
+"drop" |
+"drop-while" |
+"ensure" |
+"eql-ref?" |
+"eql?" |
+"eval" |
+"every" |
+"ffirst" |
+"filter" |
+"find" |
+"find-var" |
+"first" |
+"float" |
+"fnseq" |
+"frest" |
+"gensym" |
+"get" |
+"hash-map" |
+"identity" |
+"implement" |
+"import" |
+"in-namespace" |
+"inc" |
+"int" |
+"into" |
+"into-array" |
+"iterate" |
+"key" |
+"keys" |
+"lazy-cons" |
+"list" |
+"list*" |
+"load-file" |
+"locking" |
+"long" |
+"make-array" |
+"make-proxy" |
+"map" |
+"mapcat" |
+"max" |
+"memfn" |
+"merge" |
+"meta" |
+"min" |
+"name" |
+"namespace" |
+"neg?" |
+"newline" |
+"nil?" |
+"not" |
+"not-any" |
+"not-every" |
+"nth" |
+"or" |
+"peek" |
+"pmap" |
+"pop" |
+"pos?" |
+"print" |
+"prn" |
+"quot" |
+"range" |
+"read" |
+"reduce" |
+"ref" |
+"refer" |
+"rem" |
+"remove-method" |
+"repeat" |
+"replicate" |
+"rest" |
+"reverse" |
+"rfirst" |
+"rrest" |
+"rseq" |
+"second" |
+"seq" |
+"set" |
+"short" |
+"sorted-map" |
+"sorted-map-by" |
+"split-at" |
+"split-with" |
+"str" |
+"strcat" |
+"sym" |
+"sync" |
+"take" |
+"take-while" |
+"time" |
+"unimport" |
+"unintern" |
+"unrefer" |
+"val" |
+"vals" |
+"vector" |
+"with-meta" |
+"zero?" |
+"zipmap" { addToken(Token.FUNCTION); }
+
+{LineTerminator} { addNullToken(); return firstToken; }
+
+{WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+{CharLiteral} { addToken(Token.LITERAL_CHAR); }
+{StringLiteral} { start = zzMarkedPos-1; yybegin(STRING); }
+ //{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ //{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+{Nil} { addToken(Token.DATA_TYPE); }
+
+{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+
+{Quote} { addToken(Token.SEPARATOR); }
+{Unquote} { addToken(Token.SEPARATOR); }
+{VarQuote} { addToken(Token.SEPARATOR); }
+{Dispatch} { addToken(Token.DATA_TYPE); }
+
+{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+{Separator} { addToken(Token.SEPARATOR); }
+
+{Operator} { addToken(Token.OPERATOR); }
+
+{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+{Keyword} { addToken(Token.PREPROCESSOR); }
+{DefName} { addToken(Token.IDENTIFIER); }
+
+<<EOF>> { addNullToken(); return firstToken; }
+
+. { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<STRING> {
+
+ [^\n\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ "\"\"" {}
+ "\"" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java
new file mode 100644
index 0000000..6d2304d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java
@@ -0,0 +1,2296 @@
+/* The following code was generated by JFlex 1.4.1 on 7/30/12 10:59 PM */
+
+/*
+ * 12/23/2010
+ *
+ * ClojureTokenMaker.java - Scanner for Clojure.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Clojure programming language.<p>
+ *
+ * This was graciously donated by the folks at the
+ * <a href="http://pacific.mpi-cbg.de/wiki/index.php/Fiji">Fiji</a> project.
+ * Its original location was
+ * <a href="http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?p=fiji.git;a=tree;f=src-plugins/Script_Editor/fiji/scripting;hb=935d85d9d88dd780c6d5f2765937ddc18b5008ca">here</a>.
+ * <p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ClojureTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ *
+ */
+
+public class ClojureTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 2;
+ public static final int STRING = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\57\1\16\1\0\1\37\1\35\22\0\1\60\1\70\1\17"+
+ "\1\53\1\72\1\66\1\66\1\12\1\45\1\50\1\65\1\62\1\73"+
+ "\1\44\1\20\1\67\1\4\1\15\1\15\1\15\4\7\2\5\1\2"+
+ "\1\1\1\63\1\64\1\61\1\36\1\52\3\6\1\42\1\43\1\42"+
+ "\5\3\1\41\13\3\1\40\2\3\1\34\1\11\1\34\1\54\1\71"+
+ "\1\47\1\23\1\27\1\24\1\76\1\25\1\14\1\104\1\74\1\33"+
+ "\1\105\1\106\1\32\1\77\1\30\1\75\1\22\1\101\1\13\1\21"+
+ "\1\26\1\10\1\103\1\31\1\100\1\102\1\107\1\55\1\46\1\56"+
+ "\1\51\uff81\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 =
+ "\1\1\2\0\1\2\1\3\1\4\1\1\2\5\1\1"+
+ "\1\2\2\1\1\6\1\7\14\1\1\10\1\4\1\11"+
+ "\1\10\1\4\1\2\4\4\11\1\1\12\1\13\1\14"+
+ "\2\12\1\15\2\12\1\16\2\17\1\20\1\17\2\21"+
+ "\1\17\1\5\1\17\1\1\1\22\3\0\6\1\1\23"+
+ "\3\1\1\24\52\1\1\23\4\1\4\0\1\4\3\1"+
+ "\1\25\4\1\1\25\11\1\1\23\13\1\1\12\4\0"+
+ "\1\20\1\21\1\1\1\20\2\1\3\0\4\1\1\24"+
+ "\5\1\1\24\4\1\1\23\2\1\2\24\40\1\1\23"+
+ "\1\26\1\24\13\1\1\24\3\1\2\0\2\26\26\1"+
+ "\1\23\10\1\1\24\4\1\4\0\3\1\2\0\4\1"+
+ "\1\24\4\1\2\24\2\1\1\24\1\23\1\24\3\1"+
+ "\1\27\1\1\1\24\3\1\1\24\3\1\1\23\1\1"+
+ "\1\24\5\1\1\24\3\1\2\0\26\1\1\24\2\1"+
+ "\1\0\1\30\1\0\1\1\2\0\7\1\1\24\52\1"+
+ "\2\0\1\1\1\0\176\1\1\24\50\1\1\25\44\1";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[627];
+ 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\330\0\u0120\0\u0168\0\u01b0"+
+ "\0\u01f8\0\u0240\0\u0288\0\u02d0\0\u0318\0\330\0\330\0\u0360"+
+ "\0\u03a8\0\u03f0\0\u0438\0\u0480\0\u04c8\0\u0510\0\u0558\0\u05a0"+
+ "\0\u05e8\0\u0630\0\u0678\0\330\0\u0168\0\u06c0\0\u0708\0\330"+
+ "\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\330"+
+ "\0\u0b88\0\u0bd0\0\u0c18\0\330\0\u0c60\0\u0ca8\0\u0cf0\0\u0d38"+
+ "\0\u0d80\0\u0dc8\0\u0e10\0\u0d80\0\u0e58\0\u0ea0\0\u0d80\0\u0ee8"+
+ "\0\u0f30\0\330\0\u0f78\0\u0fc0\0\u1008\0\u1050\0\u1098\0\u10e0"+
+ "\0\u1128\0\u1170\0\u11b8\0\u1200\0\u1248\0\u1290\0\u12d8\0\u0168"+
+ "\0\u1320\0\u1368\0\u13b0\0\u13f8\0\u1440\0\u1488\0\u14d0\0\u1518"+
+ "\0\u1560\0\u15a8\0\u15f0\0\u1638\0\u1680\0\u16c8\0\u1710\0\u1758"+
+ "\0\u17a0\0\u17e8\0\u1830\0\u1878\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\u1c20\0\u1c68\0\u1cb0\0\u1cf8\0\u1d40\0\u1d88\0\u1dd0\0\u1e18"+
+ "\0\u1e60\0\u1ea8\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\u0168"+
+ "\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\u2760\0\u27a8\0\u27f0\0\u2838\0\u2880\0\u28c8\0\u2910"+
+ "\0\u2958\0\u29a0\0\330\0\u29e8\0\u2a30\0\u2a78\0\u2ac0\0\u0d80"+
+ "\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\u0168"+
+ "\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\u2e68"+
+ "\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\u3b10\0\u3b58\0\u3408\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\u4020\0\u4068"+
+ "\0\330\0\u2130\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\u4728\0\u4770\0\u47b8\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\u4f98\0\u5028\0\u5070\0\u50b8\0\u3de0\0\u5100\0\u5148"+
+ "\0\u5190\0\u51d8\0\u0168\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\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\u5cd0\0\u5d18\0\u5d60\0\u5da8\0\u5df0\0\u5e38\0\u5e80"+
+ "\0\u3600\0\u5ec8\0\u5f10\0\u5f58\0\u5fa0\0\u5fe8\0\u6030\0\u6078"+
+ "\0\u60c0\0\u6108\0\u6150\0\u6198\0\u61e0\0\u6228\0\u6270\0\u62b8"+
+ "\0\u6300\0\u6348\0\u6390\0\u63d8\0\u6420\0\u6468\0\u64b0\0\u64f8"+
+ "\0\u6540\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\u6c90\0\u6cd8\0\u6d20\0\u6d68\0\u6db0\0\u6df8"+
+ "\0\u6e40\0\u6e88\0\u6ed0\0\u6f18\0\u5fa0\0\u6f60\0\u6fa8\0\u6ff0"+
+ "\0\u7038\0\u7080\0\u70c8\0\u7110\0\u7158\0\u71a0\0\u71e8\0\u7230"+
+ "\0\u7278\0\u72c0\0\u7308\0\u7350\0\u7398\0\u73e0\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\u4968\0\u7bc0\0\u7c08\0\u7c50\0\u7c98\0\u7ce0\0\u7d28"+
+ "\0\u7d70\0\u7db8\0\u7e00\0\u7e48\0\u7e90\0\u7ed8\0\u7f20\0\u7f68"+
+ "\0\u5388\0\u7fb0\0\u7ff8\0\u8040\0\u8088\0\u80d0\0\u8118\0\u8160"+
+ "\0\u81a8\0\u81f0\0\u8238\0\u8280\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\u8bc8\0\u8c10\0\u8c58\0\u8ca0"+
+ "\0\u8ce8\0\u8d30\0\u8d78\0\u8dc0\0\u8e08\0\u8e50\0\u8e98\0\u8ee0"+
+ "\0\u8f28\0\u8f70\0\u8fb8\0\u9000\0\u9048\0\u9090\0\u90d8\0\u9120"+
+ "\0\u9168\0\u91b0\0\u91f8\0\u9240\0\u9288\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\u9948\0\u9990\0\u99d8\0\u9a20"+
+ "\0\u9a68\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\u5538";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[627];
+ 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 =
+ "\1\4\1\5\1\6\1\7\1\10\1\11\1\7\1\11"+
+ "\1\12\1\13\1\4\1\14\1\15\1\11\1\16\1\17"+
+ "\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27"+
+ "\1\30\1\31\1\32\1\33\1\34\1\4\1\35\1\36"+
+ "\4\7\1\35\1\37\2\4\1\34\1\40\1\4\1\41"+
+ "\1\40\2\34\2\36\1\42\1\35\1\43\1\44\1\45"+
+ "\1\40\1\35\1\43\3\4\1\46\1\47\1\50\1\51"+
+ "\1\7\1\52\1\7\1\53\1\54\1\7\1\55\1\56"+
+ "\16\57\1\60\1\61\70\57\14\62\1\63\1\62\1\64"+
+ "\12\62\1\65\42\62\1\66\13\62\113\0\1\67\2\0"+
+ "\1\67\1\0\1\67\2\0\2\67\4\0\13\67\2\0"+
+ "\1\67\1\0\5\67\15\0\1\67\2\0\1\67\1\0"+
+ "\2\67\3\0\14\67\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\1\70\2\0\1\71"+
+ "\1\72\1\73\1\71\1\72\1\71\1\70\1\0\1\71"+
+ "\1\74\1\72\2\0\1\75\4\71\1\76\4\71\1\77"+
+ "\1\71\2\0\1\7\1\0\1\100\1\77\1\74\1\76"+
+ "\1\7\2\0\1\70\2\0\2\70\5\0\3\7\1\0"+
+ "\1\7\1\0\2\7\2\70\1\0\2\71\1\74\1\71"+
+ "\1\100\7\71\1\70\2\0\1\71\2\11\1\71\1\11"+
+ "\1\71\1\70\1\0\1\71\1\74\1\11\2\0\1\75"+
+ "\4\71\1\76\4\71\1\77\1\71\2\0\1\7\1\0"+
+ "\1\71\1\77\1\74\1\76\1\7\2\0\1\70\2\0"+
+ "\2\70\5\0\3\7\1\0\1\7\1\0\2\7\2\70"+
+ "\1\0\2\71\1\74\11\71\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\101\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\20\0\1\102\1\103\4\0\1\104\1\0\1\105\62\0"+
+ "\6\7\2\0\1\106\1\107\1\7\2\0\1\7\1\110"+
+ "\1\7\1\111\1\7\1\112\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\106\1\107\1\7\2\0"+
+ "\3\7\1\113\4\7\1\114\1\7\1\115\1\116\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\117\12\7\3\0\1\7\2\75"+
+ "\1\7\1\75\1\7\2\0\2\7\1\75\2\0\1\120"+
+ "\13\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\2\7\1\121\2\7\1\122\1\123\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\124\1\125\4\7\1\126\5\7"+
+ "\3\0\6\7\2\0\1\127\2\7\2\0\5\7\1\130"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\131\1\7\1\132"+
+ "\10\7\3\0\6\7\2\0\1\133\2\7\2\0\1\7"+
+ "\1\134\1\135\5\7\1\136\1\7\1\137\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\10\7\1\140\3\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\141\6\7\1\142\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\143\1\144\4\7\1\145\5\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\146\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\5\7\1\147\1\7\1\150\4\7\3\0"+
+ "\6\7\2\0\1\151\2\7\2\0\3\7\1\152\7\7"+
+ "\1\153\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\154\13\7\3\0\6\7"+
+ "\2\0\3\7\2\0\13\7\1\155\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\7\1\156\4\7\1\157\5\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\160\1\7\1\161\1\162\4\7"+
+ "\1\163\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\164\12\7\3\0"+
+ "\6\7\2\0\3\7\2\0\13\7\1\165\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\166\13\7\3\0\6\7\2\0\3\7\2\0"+
+ "\3\7\1\167\1\7\1\170\5\7\1\171\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\7\1\172\12\7\3\0\6\7\2\0\1\7"+
+ "\1\173\1\7\2\0\6\7\1\174\1\7\1\175\3\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\2\7\1\176\1\177\10\7\37\0"+
+ "\1\36\17\0\2\36\41\0\1\200\36\0\1\201\50\0"+
+ "\1\202\41\0\1\203\36\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\1\204\2\7"+
+ "\1\40\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\40\1\7\1\0\2\7\3\0\14\7"+
+ "\64\0\1\40\26\0\5\7\1\205\2\0\1\206\1\207"+
+ "\1\210\2\0\1\7\1\211\1\212\1\213\1\214\1\215"+
+ "\2\7\1\216\1\217\1\7\1\220\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\7\1\221\1\7\1\222\10\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\223\10\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\120\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\224"+
+ "\2\7\2\0\5\7\1\225\5\7\1\226\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\7\1\227\12\7\3\0\6\7\2\0\3\7"+
+ "\2\0\3\7\1\230\1\7\1\231\5\7\1\232\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\233\12\7\3\0\5\7\1\234"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\235\1\7"+
+ "\1\236\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\237\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\240\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\241\5\7\1\242\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\16\57\2\0\70\57\17\0\1\243"+
+ "\70\0\14\62\1\0\1\62\1\0\12\62\1\0\42\62"+
+ "\1\0\13\62\26\0\1\244\4\0\1\245\105\0\1\246"+
+ "\104\0\1\247\64\0\6\67\2\0\3\67\3\0\13\67"+
+ "\2\0\1\67\1\0\5\67\15\0\1\67\2\0\1\67"+
+ "\1\0\2\67\3\0\14\67\1\70\2\0\7\70\1\0"+
+ "\3\70\3\0\13\70\4\0\4\70\3\0\1\70\2\0"+
+ "\2\70\15\0\2\70\1\0\15\70\2\0\6\71\1\70"+
+ "\1\0\3\71\2\0\1\7\13\71\2\0\1\7\1\0"+
+ "\4\71\1\7\2\0\1\70\2\0\2\70\5\0\3\7"+
+ "\1\0\1\7\1\0\2\7\2\70\1\0\14\71\1\70"+
+ "\2\0\1\71\1\72\1\73\1\71\1\72\1\71\1\70"+
+ "\1\0\1\71\1\74\1\72\2\0\1\75\4\71\1\76"+
+ "\4\71\1\250\1\71\2\0\1\7\1\0\1\71\1\250"+
+ "\1\74\1\76\1\7\2\0\1\70\2\0\2\70\5\0"+
+ "\3\7\1\0\1\7\1\0\2\7\2\70\1\0\2\71"+
+ "\1\74\11\71\1\70\2\0\1\71\2\73\1\71\1\73"+
+ "\1\71\1\70\1\0\1\71\1\74\1\73\2\0\1\75"+
+ "\4\71\1\76\6\71\2\0\1\7\1\0\2\71\1\74"+
+ "\1\76\1\7\2\0\1\70\2\0\2\70\5\0\3\7"+
+ "\1\0\1\7\1\0\2\7\2\70\1\0\2\71\1\74"+
+ "\11\71\1\70\2\0\1\71\2\75\1\71\1\75\1\71"+
+ "\1\70\1\0\1\71\1\74\1\75\2\0\1\7\4\71"+
+ "\1\76\6\71\2\0\1\7\1\0\2\71\1\74\1\76"+
+ "\1\7\2\0\1\70\2\0\2\70\5\0\3\7\1\0"+
+ "\1\7\1\0\2\7\2\70\1\0\2\71\1\74\11\71"+
+ "\1\70\2\0\1\71\2\251\1\71\1\251\1\71\1\70"+
+ "\1\0\2\71\1\251\2\0\1\7\13\71\2\0\1\7"+
+ "\1\0\4\71\1\252\2\0\1\70\2\0\2\70\5\0"+
+ "\1\7\1\252\1\7\1\0\1\7\1\0\2\7\2\70"+
+ "\1\0\14\71\1\70\2\0\1\71\4\253\1\71\1\70"+
+ "\1\0\1\71\2\253\2\0\1\7\2\71\3\253\1\71"+
+ "\1\253\4\71\2\0\1\7\1\0\2\71\2\253\1\7"+
+ "\2\0\1\70\2\0\2\70\5\0\3\7\1\0\1\7"+
+ "\1\0\2\7\2\70\1\0\2\71\1\253\11\71\3\0"+
+ "\6\7\2\0\1\254\2\7\2\0\13\7\1\255\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\22\0\1\256\110\0\1\257\111\0"+
+ "\1\260\65\0\6\7\2\0\3\7\2\0\5\7\1\261"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\13\7\1\262\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\263\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\264\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\1\7\1\265\1\7\2\0\1\7"+
+ "\1\266\1\267\1\270\1\271\7\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\2\7\1\272\1\273\3\7\1\274\4\7\3\0\6\7"+
+ "\2\0\3\7\2\0\12\7\1\275\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+ "\1\110\12\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+ "\1\276\12\7\3\0\6\7\2\0\1\261\2\7\2\0"+
+ "\10\7\1\277\1\7\1\137\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\300\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\12\7\1\301\1\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\4\7\1\302\1\7"+
+ "\1\303\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\5\7\1\120\6\7"+
+ "\3\0\6\7\2\0\1\304\2\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\305\12\7\3\0"+
+ "\6\7\2\0\1\306\2\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+ "\1\307\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\3\7\1\120\10\7"+
+ "\3\0\6\7\2\0\3\7\2\0\10\7\1\120\2\7"+
+ "\1\310\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\311\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\312"+
+ "\1\120\11\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\3\7\1\313\10\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\1\314\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\315\3\7\1\316\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\2\7\1\317\11\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\2\7\1\120\3\7\1\120\5\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\320\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\321"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\322\12\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\323"+
+ "\1\7\1\324\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\3\7\1\47\10\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\5\7\1\310\2\0\3\7"+
+ "\2\0\10\7\1\325\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+ "\1\326\10\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+ "\1\327\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\1\7\1\330\12\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+ "\1\331\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\3\7\1\332\1\7\1\333\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\5\7\1\334\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\6\7\1\335"+
+ "\5\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\12\7\1\336\1\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\337"+
+ "\10\7\3\0\6\7\2\0\1\340\2\7\2\0\13\7"+
+ "\1\341\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\342\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\343\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\337\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\3\7\1\344\10\7\3\0\6\7\2\0"+
+ "\3\7\2\0\11\7\1\345\2\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\10\7\1\312\3\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\120\13\7\3\0\6\7"+
+ "\2\0\3\7\2\0\12\7\1\346\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+ "\1\347\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\6\7\1\350\5\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\351\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\13\7"+
+ "\1\352\3\0\6\7\2\0\3\7\2\0\6\7\1\300"+
+ "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\353\12\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\354"+
+ "\1\355\3\7\1\356\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+ "\1\357\12\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\360\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\361\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\362"+
+ "\2\7\1\120\1\7\1\363\5\7\2\0\1\7\1\0"+
+ "\4\7\1\364\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\365\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\2\7\1\366\11\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\46\0\1\367\113\0\1\370\36\0\1\34"+
+ "\14\0\2\34\1\202\24\0\1\34\11\0\2\34\27\0"+
+ "\1\203\1\371\14\203\2\371\1\203\1\0\34\203\2\371"+
+ "\1\372\27\203\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\1\35\2\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\373\6\7\1\374\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\375\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\376\1\7\1\377"+
+ "\1\u0100\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u0101"+
+ "\12\7\3\0\6\7\2\0\1\u0102\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\1\7\1\u0103\10\7\1\u0104\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\10\7\1\u0105\3\7\3\0\5\7\1\u0106\2\0"+
+ "\3\7\2\0\12\7\1\u0107\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\7\1\u0108\12\7\3\0\6\7\2\0\1\u0109\2\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\1\7\1\u010a\12\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+ "\1\u010b\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\10\7\1\u010a\3\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\5\7\1\u010c\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\u010d\10\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u010e"+
+ "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u010f"+
+ "\12\7\3\0\6\7\2\0\1\u0110\1\u0111\1\7\2\0"+
+ "\4\7\1\120\5\7\1\314\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u0112"+
+ "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u0113"+
+ "\2\0\3\7\2\0\1\7\1\110\4\7\1\u0114\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\2\7\1\304\11\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\4\7"+
+ "\1\120\5\7\1\u0115\1\7\3\0\6\7\2\0\1\264"+
+ "\2\7\2\0\6\7\1\u0116\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\3\7\1\u0117\10\7\3\0\6\7\2\0\3\7\2\0"+
+ "\10\7\1\120\3\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\u0118\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\u0119\12\7\3\0"+
+ "\6\7\2\0\1\300\2\7\2\0\12\7\1\u011a\1\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\4\7\1\u011b\7\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\120\1\7"+
+ "\1\u011c\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\6\7"+
+ "\1\u011a\5\7\3\0\6\7\2\0\1\u011d\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\2\7\1\u011e\11\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\22\0\1\u011f\117\0\1\u0120\106\0\1\u0121\104\0"+
+ "\1\u0122\61\0\1\70\2\0\1\71\2\251\1\71\1\251"+
+ "\1\71\1\70\1\0\1\71\1\74\1\251\2\0\1\7"+
+ "\13\71\2\0\1\7\1\0\2\71\1\74\1\71\1\7"+
+ "\2\0\1\70\2\0\2\70\5\0\3\7\1\0\1\7"+
+ "\1\0\2\7\2\70\1\0\2\71\1\74\11\71\3\0"+
+ "\1\7\2\251\1\7\1\251\1\7\2\0\2\7\1\251"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\1\70\2\0"+
+ "\1\71\4\253\1\71\1\70\1\0\1\71\2\253\2\0"+
+ "\1\7\2\71\3\253\1\71\1\253\2\71\1\250\1\71"+
+ "\2\0\1\7\1\0\1\71\1\250\2\253\1\7\2\0"+
+ "\1\70\2\0\2\70\5\0\3\7\1\0\1\7\1\0"+
+ "\2\7\2\70\1\0\2\71\1\253\11\71\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\u0123\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+ "\1\u0124\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\3\7\1\u0125\10\7"+
+ "\23\0\1\u0126\113\0\1\102\111\0\1\u0127\61\0\6\7"+
+ "\2\0\3\7\2\0\1\7\1\266\12\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\1\261\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\5\7\1\120"+
+ "\6\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\10\7\1\337\3\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\47\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\6\7\1\120"+
+ "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\276\4\7\1\u0128\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\2\7\1\120\11\7\3\0"+
+ "\5\7\1\117\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\5\7\1\u0129\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\u012a"+
+ "\12\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u012b"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\334\12\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\266"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\2\7\1\u012c"+
+ "\11\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u012d"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\u012e\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\1\7"+
+ "\1\300\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\4\7\1\276\7\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\1\266\2\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+ "\1\u012f\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\4\7\1\120\7\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\10\7"+
+ "\1\266\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\12\7"+
+ "\1\120\1\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\120\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\2\7\1\120\11\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\u0130\10\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\307\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0131\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\12\7\1\u0132\1\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\120\1\7"+
+ "\1\u0133\3\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\300\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+ "\1\341\12\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\3\7\1\u0134\10\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\1\7"+
+ "\1\u0135\2\7\1\276\7\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\2\7"+
+ "\1\u0136\6\7\1\120\2\7\3\0\6\7\2\0\3\7"+
+ "\2\0\2\7\1\u0137\11\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+ "\1\u0138\10\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+ "\1\337\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\5\7"+
+ "\1\u0139\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\120\1\0\4\7\1\u013a\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\12\7\1\120\1\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\1\u0130\2\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u013b\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\4\7\1\u013c\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\u013d\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\120\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u013e\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\1\7\1\300\12\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\2\7\1\u013f\11\7\3\0\6\7"+
+ "\2\0\3\7\2\0\12\7\1\u0140\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\u0141\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\12\7\1\u0142\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u0143\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\u0144\13\7"+
+ "\3\0\6\7\2\0\3\7\2\0\10\7\1\u0145\3\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\6\7\1\u0146\5\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0147\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\2\7\1\u0148\11\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\12\7\1\u013f\1\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\10\7\1\120\3\7"+
+ "\3\0\6\7\2\0\3\7\2\0\2\7\1\300\11\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u0149\1\7\1\u014a\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\1\u014b\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u014c\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\u014d\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\u014e\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u014f"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u0150\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\7\1\305\12\7\47\0\1\u0151\106\0\1\u0152\44\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\u0153\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\4\7\1\u0154\7\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\3\7\1\u0155\10\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u0156\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\5\7"+
+ "\1\u0157\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\12\7\1\u0158"+
+ "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u0159"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\13\7\1\u015a\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\1\7\1\u015b\12\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\12\7\1\u015c\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u015d\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\1\u015e\2\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u015f\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+ "\1\u0160\10\7\3\0\6\7\2\0\1\u010a\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\210\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\1\u0161\2\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+ "\1\u010a\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\6\7\1\u0162\5\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\u0163\13\7\3\0\6\7\2\0"+
+ "\3\7\2\0\2\7\1\u013d\11\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0164"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\300\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\3\7\1\u0165\10\7\3\0\6\7\2\0\3\7\2\0"+
+ "\1\7\1\315\12\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\7\7\1\327\4\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\13\7\1\u0166\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\120\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0167\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\3\7\1\120\10\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\1\7\1\232\1\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\13\7\1\u0168\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\6\7\1\u0169\5\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\1\7\1\120\12\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\6\7\1\u016a\5\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\1\7\1\u016b\12\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\7\1\312\12\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\3\7\1\132\10\7\2\0"+
+ "\1\u016c\132\0\1\u011f\102\0\1\u016d\111\0\1\u016e\70\0"+
+ "\6\7\2\0\1\7\1\320\1\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\6\7\1\u016f\5\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\2\7\1\124\11\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\24\0\1\u0170\115\0\1\u0171\60\0"+
+ "\6\7\2\0\3\7\2\0\13\7\1\u0172\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+ "\1\337\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\7\7"+
+ "\1\u0173\4\7\3\0\6\7\2\0\1\u0174\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0175"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0176\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\270\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0177\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\6\7\1\120\5\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u0178\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\6\7\1\u0179\5\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\1\u017a\2\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\6\7"+
+ "\1\u017b\5\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\12\7\1\u0150\1\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\5\7\1\157\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\1\337\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\1\u017c\2\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\u017d"+
+ "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\4\7\1\u017e\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\11\7"+
+ "\1\300\2\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\13\7\1\u017f\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0180"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\1\7\1\u0181\12\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u0182"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\3\7\1\u0183\1\7\1\u0184\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u0185\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0186"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u0187\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\120\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0188"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\7\1\170\12\7\3\0\6\7\2\0\3\7"+
+ "\2\0\5\7\1\170\6\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\157\10\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\3\7\1\u0189\10\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u018a\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\3\7\1\u018b\10\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\6\7\1\u018c\5\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u018d\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\50\0"+
+ "\1\34\110\0\1\u0151\41\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u018e\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\u018f"+
+ "\13\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\2\7\1\u0190\11\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u0191\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u0192"+
+ "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u010a\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\u0193\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u0194\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u0195\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0196\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\10\7\1\u010c\3\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0197"+
+ "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\11\7\1\u0198\2\7\3\0\6\7\2\0\3\7\2\0"+
+ "\2\7\1\u0199\11\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\u019a"+
+ "\10\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u019b"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\u019c\13\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u011e\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\120"+
+ "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\5\7\1\u019d\2\0\3\7\2\0\3\7\1\u019e\1\7"+
+ "\1\u019f\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+ "\1\u01a0\10\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u01a1\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u01a2\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\47\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\6\7\1\u01a3"+
+ "\5\7\67\0\1\u01a4\21\0\2\u01a5\6\u016d\1\0\1\u01a5"+
+ "\3\u016d\2\0\1\u01a5\13\u016d\1\u01a5\1\0\1\u01a5\1\0"+
+ "\4\u016d\2\u01a5\2\0\4\u01a5\6\0\1\u01a5\1\0\3\u01a5"+
+ "\1\u016d\2\u01a5\1\u016d\1\u01a5\14\u016d\2\0\1\u016c\16\0"+
+ "\1\u011f\71\0\6\7\2\0\3\7\2\0\5\7\1\u01a6"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\25\0\1\102\115\0"+
+ "\1\u01a7\57\0\6\7\2\0\3\7\2\0\4\7\1\u014b"+
+ "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u01a8\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\337"+
+ "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\143"+
+ "\4\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\4\7\1\u01a9\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\2\7\1\u01aa\11\7"+
+ "\3\0\6\7\2\0\1\7\1\u01ab\1\7\2\0\1\7"+
+ "\1\u01ac\5\7\1\u01ad\2\7\1\u01ae\1\310\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\2\7\1\u01af\11\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\4\7\1\u01b0\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\4\7\1\u01b1\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+ "\1\u01b2\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\u01b3\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\13\7"+
+ "\1\u01b4\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\11\7\1\u01b5\2\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\356"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\232\10\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\2\7\1\u01b6"+
+ "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\337\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u0130"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\u01b7"+
+ "\4\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\3\7\1\u01b8\10\7\3\0\6\7\2\0"+
+ "\1\7\1\u01b9\1\7\2\0\10\7\1\u0149\1\7\1\u014a"+
+ "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\4\7\1\u01ba\7\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\7\1\u01bb\1\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\u01bc\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u01bd"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\3\7\1\u01be"+
+ "\10\7\3\0\6\7\2\0\3\7\2\0\13\7\1\u01bf"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\3\7\1\u01c0\10\7"+
+ "\3\0\6\7\2\0\3\7\2\0\4\7\1\u01c1\7\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\5\7\1\u01c2\6\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u01c3\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\u01c4\12\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\u01c5\13\7\3\0\6\7\2\0\3\7\2\0\4\7"+
+ "\1\u01c6\7\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\6\7\1\u01c7\5\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\1\u010c\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\11\7\1\u01c8\2\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u01c9"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\5\7\1\u01ca"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\13\7\1\u01cb\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\3\7\1\u01cc\10\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\4\7\1\u01cd\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u01ce\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u01cf\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u01d0"+
+ "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u01d1\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u01d2"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\2\7\1\u01d3\1\u01bd\10\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u01d4\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\3\7"+
+ "\1\120\10\7\67\0\1\u016d\23\0\6\7\2\0\1\232"+
+ "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\30\0"+
+ "\1\u0170\62\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\4\7\1\u01d5\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\3\7\1\266\5\7\1\u01d6\2\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u01d7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\115\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\124\13\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\156\4\7"+
+ "\1\157\5\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u017f\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\1\7"+
+ "\1\u01d8\12\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\u01d9\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0164\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\u01da\10\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u01db\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\1\7\1\312\1\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u01dc\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\u01bb\13\7\3\0\6\7\2\0\3\7\2\0"+
+ "\3\7\1\u0129\10\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\333\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u01dd\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\13\7\1\u01de\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u01df\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\13\7\1\327\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u01e0"+
+ "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\1\133\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u01e1\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\6\7\1\u0130\5\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\310\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\u01e2\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\4\7\1\u01e3\7\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\5\7\1\u01e4\6\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\u01e5\10\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\4\7\1\u01e6\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\u01e7\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u01e8\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+ "\1\u01e9\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u01ea"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\1\u01eb\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\12\7\1\u01ec\1\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u01ed\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\1\7\1\u01ee\12\7\3\0\6\7\2\0\3\7"+
+ "\2\0\4\7\1\u01ef\7\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\u01f0\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u01f1"+
+ "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\u01f2\13\7\3\0\6\7\2\0\1\u01f3\2\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\1\u01f4\2\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\3\7\1\u01f5\10\7\3\0\6\7\2\0\3\7"+
+ "\2\0\13\7\1\u01f6\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\3\7\1\u01f7\10\7\3\0\5\7\1\u0113\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\1\u01f8\2\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\10\7\1\u01f9\3\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u01fa\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u01fb"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u0116\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\u01fc\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u01d2\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u01fd\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\10\7\1\u01fe\3\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\12\7\1\u01ff\1\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\7\7\1\u0200\4\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\2\7\1\u0201\11\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\1\7\1\u0202\12\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u0203\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\1\u0204\2\7"+
+ "\2\0\12\7\1\u0205\1\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\2\7"+
+ "\1\u0206\1\u0207\10\7\3\0\5\7\1\u0208\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\6\7\1\u0209\5\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\5\7"+
+ "\1\u020a\6\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\u020b\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\2\7\1\u020c\11\7\3\0\6\7"+
+ "\2\0\3\7\2\0\10\7\1\u020d\3\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\1\7\1\u020e\12\7\3\0\6\7"+
+ "\2\0\3\7\2\0\13\7\1\120\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\300\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\270"+
+ "\12\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\u020f\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0210"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\5\7\1\u019f\6\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\6\7\1\162\5\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\3\7\1\u0211\10\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0212"+
+ "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\u0213\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\12\7\1\u0130\1\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\12\7\1\u0214\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\1\7\1\170\12\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\300\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\6\7\1\u0215"+
+ "\5\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u0216\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u0217"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u0109\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\10\7\1\u0218"+
+ "\3\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\2\7\1\u0219\11\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u021a"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u021b\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\5\7\1\u021c\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\5\7\1\u021d\6\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\10\7\1\u021e\3\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\4\7\1\u021f\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\4\7\1\u0220\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\14\7"+
+ "\2\0\1\7\1\0\4\7\1\u0221\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\4\7\1\u0222"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u0223\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\10\7\1\u0224\3\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\4\7\1\u0130\7\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u0225\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\2\7\1\u0226\11\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\1\7\1\u0227\12\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\u0228\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\12\7\1\u0229\1\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\u022a\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\2\7\1\u022b\11\7\3\0"+
+ "\6\7\2\0\3\7\2\0\12\7\1\u010a\1\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u022c\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\3\7\1\u022d\10\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+ "\1\u022e\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\10\7\1\u022f\3\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\7\7\1\u0230\4\7\3\0\6\7\2\0\3\7"+
+ "\2\0\2\7\1\u010a\11\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\6\7\1\u0231\5\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\1\u0232"+
+ "\2\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\u0233\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\7\7\1\u0234\4\7\3\0"+
+ "\6\7\2\0\1\7\1\u0235\1\7\2\0\2\7\1\u0219"+
+ "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u0236\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\u0237\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\6\7\1\u0238\5\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\10\7\1\u0239\3\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\4\7\1\u023a\7\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+ "\1\u023b\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\u01d2\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\6\7\1\u023c\5\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\6\7\1\300\5\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\4\7\1\u023d\7\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u023e\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\10\7\1\u023f\3\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\6\7\1\u0240\5\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\2\7\1\u0241\11\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\10\7\1\u022d\3\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u0217\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\3\7\1\u0242\10\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u0243\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\3\7\1\u0244\10\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u0245\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\13\7\1\u0246\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\13\7"+
+ "\1\u0247\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u0248\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u0249"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\6\7\1\u024a\5\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\13\7\1\170"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\7\7\1\u0130\4\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\14\7\2\0\1\7"+
+ "\1\0\4\7\1\u024b\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\6\7\1\u024c\5\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\3\7\1\u0219\10\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\u024d\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\1\u010a\13\7\3\0\6\7\2\0\3\7\2\0\3\7"+
+ "\1\u024e\10\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\u024f\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0250\12\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\3\7\1\u0251\10\7"+
+ "\3\0\6\7\2\0\1\u0252\2\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\12\7\1\u0253\1\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\10\7\1\u0254\3\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\1\7\1\u0255"+
+ "\1\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\14\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\4\7\1\u010c\7\7\3\0\6\7\2\0\3\7\2\0"+
+ "\5\7\1\117\6\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\14\7\3\0"+
+ "\6\7\2\0\3\7\2\0\5\7\1\u01d9\6\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u0256\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\11\7\1\u0257\2\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\7\7"+
+ "\1\u0258\4\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\14\7\2\0\1\7\1\0\4\7"+
+ "\1\u0259\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\1\7\1\u025a\12\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\u025b\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\1\7\1\u025c"+
+ "\12\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\5\7\1\216\6\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u025d"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u025e\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\4\7\1\u025f"+
+ "\7\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\12\7\1\u0260\1\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\12\7\1\u0261"+
+ "\1\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\1\120\2\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\12\7\1\u0262\1\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\1\7\1\u0263\12\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\13\7\1\u0264\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\14\7\3\0\6\7\2\0\3\7\2\0"+
+ "\14\7\2\0\1\7\1\0\4\7\1\u0265\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\5\7\1\u0266\6\7\2\0\1\7"+
+ "\1\0\5\7\14\0\3\7\1\0\1\7\1\0\2\7"+
+ "\3\0\14\7\3\0\6\7\2\0\3\7\2\0\12\7"+
+ "\1\u0267\1\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\14\7\3\0\6\7"+
+ "\2\0\3\7\2\0\13\7\1\u0268\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\14\7\2\0"+
+ "\1\7\1\0\5\7\14\0\3\7\1\0\1\7\1\0"+
+ "\2\7\3\0\6\7\1\u010a\5\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\7\7\1\u0269"+
+ "\4\7\3\0\6\7\2\0\3\7\2\0\2\7\1\u026a"+
+ "\11\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\14\7\2\0\1\7\1\0\5\7\14\0"+
+ "\3\7\1\0\1\7\1\0\2\7\3\0\1\7\1\220"+
+ "\12\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u026b"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\4\7\1\u026c\7\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\3\7\1\u026d"+
+ "\10\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\10\7\1\u0158\3\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\3\7\2\0\5\7\1\u026e"+
+ "\6\7\2\0\1\7\1\0\5\7\14\0\3\7\1\0"+
+ "\1\7\1\0\2\7\3\0\14\7\3\0\6\7\2\0"+
+ "\3\7\2\0\3\7\1\u026f\10\7\2\0\1\7\1\0"+
+ "\5\7\14\0\3\7\1\0\1\7\1\0\2\7\3\0"+
+ "\14\7\3\0\6\7\2\0\1\u0270\2\7\2\0\14\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\6\7\1\u025c\5\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7"+
+ "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0271\12\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\2\7\1\u025d\11\7"+
+ "\3\0\6\7\2\0\3\7\2\0\4\7\1\u0272\7\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\14\7\2\0\1\7\1\0\5\7\14\0\3\7"+
+ "\1\0\1\7\1\0\2\7\3\0\10\7\1\216\3\7"+
+ "\3\0\6\7\2\0\3\7\2\0\1\7\1\u0156\12\7"+
+ "\2\0\1\7\1\0\5\7\14\0\3\7\1\0\1\7"+
+ "\1\0\2\7\3\0\14\7\3\0\6\7\2\0\3\7"+
+ "\2\0\5\7\1\u0273\6\7\2\0\1\7\1\0\5\7"+
+ "\14\0\3\7\1\0\1\7\1\0\2\7\3\0\14\7";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[43128];
+ 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 =
+ "\1\1\2\0\2\11\10\1\2\11\14\1\1\11\3\1"+
+ "\1\11\17\1\1\11\3\1\1\11\15\1\1\11\3\0"+
+ "\72\1\4\0\37\1\1\11\4\0\6\1\3\0\106\1"+
+ "\2\0\1\11\45\1\4\0\3\1\2\0\51\1\2\0"+
+ "\31\1\1\0\1\1\1\0\1\1\2\0\62\1\2\0"+
+ "\1\1\1\0\314\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[627];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ClojureTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ /*case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;*/
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public ClojureTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public ClojureTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 164) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 25: break;
+ case 6:
+ { addNullToken(); return firstToken;
+ }
+ case 26: break;
+ case 18:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 27: break;
+ case 9:
+ { addToken(Token.WHITESPACE);
+ }
+ case 28: break;
+ case 16:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 29: break;
+ case 17:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 30: break;
+ case 19:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 31: break;
+ case 21:
+ { addToken(Token.VARIABLE);
+ }
+ case 32: break;
+ case 8:
+ { addToken(Token.SEPARATOR);
+ }
+ case 33: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 34: break;
+ case 13:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 35: break;
+ case 20:
+ { addToken(Token.FUNCTION);
+ }
+ case 36: break;
+ case 22:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 37: break;
+ case 2:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 38: break;
+ case 23:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 39: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 40: break;
+ case 24:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 41: break;
+ case 15:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 42: break;
+ case 7:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 43: break;
+ case 3:
+ { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+ }
+ case 44: break;
+ case 5:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 45: break;
+ case 4:
+ { addToken(Token.OPERATOR);
+ }
+ case 46: break;
+ case 12:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 47: break;
+ case 10:
+ {
+ }
+ case 48: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 628: break;
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 629: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 630: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex
new file mode 100644
index 0000000..7286beb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex
@@ -0,0 +1,562 @@
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated DelphiTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class DelphiTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "(*" comment.
+ */
+ public static final int INTERNAL_MLC2 = -1;
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "{$" compiler directive.
+ */
+ public static final int INTERNAL_COMPILER_DIRECTIVE = -2;
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "(*$" compiler directive.
+ */
+ public static final int INTERNAL_COMPILER_DIRECTIVE2 = -3;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public DelphiTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case INTERNAL_MLC2:
+ state = MLC2;
+ start = text.offset;
+ break;
+ case INTERNAL_COMPILER_DIRECTIVE:
+ state = COMPILER_DIRECTIVE;
+ start = text.offset;
+ break;
+ case INTERNAL_COMPILER_DIRECTIVE2:
+ state = COMPILER_DIRECTIVE2;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit})
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+UnclosedStringLiteral = ([\'][^\']*)
+StringLiteral = ({UnclosedStringLiteral}[\'])
+EscapeSequence = ("#"{Digit}*)
+
+MLCBegin = "{"
+MLCEnd = "}"
+MLC2Begin = "(*"
+MLC2End = "*)"
+CompilerDirective1Begin = ({MLCBegin}"$")
+CompilerDirective2Begin = ({MLC2Begin}"$")
+LineCommentBegin = "//"
+
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\[\]])
+Separator2 = ([\;,.])
+
+Operator = ([\^\@\:\=\<\>\+\-\/\*])
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state MLC2
+%state COMPILER_DIRECTIVE
+%state COMPILER_DIRECTIVE2
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "array" |
+ "as" |
+ "at" |
+ "asm" |
+ "begin" |
+ "case" |
+ "class" |
+ "const" |
+ "constructor" |
+ "destructor" |
+ "dispinterface" |
+ "div" |
+ "do" |
+ "downto" |
+ "else" |
+ "end" |
+ "except" |
+ "exports" |
+ "file" |
+ "final" |
+ "finalization" |
+ "finally" |
+ "for" |
+ "function" |
+ "goto" |
+ "if" |
+ "implementation" |
+ "in" |
+ "inherited" |
+ "initialization" |
+ "inline" |
+ "interface" |
+ "is" |
+ "label" |
+ "mod" |
+ "not" |
+ "object" |
+ "of" |
+ "on" |
+ "or" |
+ "out" |
+ "packed" |
+ "procedure" |
+ "program" |
+ "property" |
+ "raise" |
+ "record" |
+ "repeat" |
+ "resourcestring" |
+ "set" |
+ "sealed" |
+ "shl" |
+ "shr" |
+ "static" |
+ "string" |
+ "then" |
+ "threadvar" |
+ "to" |
+ "try" |
+ "type" |
+ "unit" |
+ "unsafe" |
+ "until" |
+ "uses" |
+ "var" |
+ "while" |
+ "with" |
+ "xor" { addToken(Token.RESERVED_WORD); }
+
+ /* Directives. */
+ "absolute" |
+ "abstract" |
+ "assembler" |
+ "automated" |
+ "cdecl" |
+ "contains" |
+ "default" |
+ "deprecated" |
+ "dispid" |
+ "dynamic" |
+ "export" |
+ "external" |
+ "far" |
+ "forward" |
+ "implements" |
+ "index" |
+ "library" |
+ "local" |
+ "message" |
+ "name" |
+ "namespaces" |
+ "near" |
+ "nil" |
+ "nodefault" |
+ "overload" |
+ "override" |
+ "package" |
+ "pascal" |
+ "platform" |
+ "private" |
+ "protected" |
+ "public" |
+ "published" |
+ "read" |
+ "readonly" |
+ "register" |
+ "reintroduce" |
+ "requires" |
+ "resident" |
+ "safecall" |
+ "self" |
+ "stdcall" |
+ "stored" |
+ "varargs" |
+ "virtual" |
+ "write" |
+ "writeonly" { addToken(Token.FUNCTION); }
+
+ /* Data types. */
+ "shortint" |
+ "byte" |
+ "char" |
+ "smallint" |
+ "integer" |
+ "word" |
+ "longint" |
+ "cardinal" |
+ "boolean" |
+ "bytebool" |
+ "wordbool" |
+ "longbool" |
+ "real" |
+ "single" |
+ "double" |
+ "extended" |
+ "comp" |
+ "currency" |
+ "pointer" { addToken(Token.DATA_TYPE); }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {EscapeSequence} { addToken(Token.PREPROCESSOR); }
+
+ /* Comment literals. */
+ {CompilerDirective1Begin} {start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE); }
+ {CompilerDirective2Begin} {start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2); }
+ {MLCBegin} { start = zzMarkedPos-1; yybegin(MLC); }
+ {MLC2Begin} { start = zzMarkedPos-2; yybegin(MLC2); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+ {Operator} { addToken(Token.OPERATOR); }
+
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+ [^hwf\n\}]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<MLC2> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+ {MLC2End} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken; }
+
+}
+
+
+<COMPILER_DIRECTIVE> {
+ [^\n\}]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken; }
+}
+
+
+<COMPILER_DIRECTIVE2> {
+ [^\n\*]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+ {MLC2End} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken; }
+}
+
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java
new file mode 100644
index 0000000..62ae77f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java
@@ -0,0 +1,1631 @@
+/* The following code was generated by JFlex 1.4.1 on 8/19/09 10:23 AM */
+
+/*
+ * 7/28/2009
+ *
+ * DelphiTokenMaker.java - Scanner for the Delphi programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Delphi programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated DelphiTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class DelphiTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int COMPILER_DIRECTIVE = 3;
+ public static final int EOL_COMMENT = 5;
+ public static final int YYINITIAL = 0;
+ public static final int COMPILER_DIRECTIVE2 = 4;
+ public static final int MLC = 1;
+ public static final int MLC2 = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\13\1\12\1\0\1\13\1\7\22\0\1\13\1\42\1\7"+
+ "\1\10\1\11\1\42\1\42\1\14\1\17\1\21\1\20\1\27\1\42"+
+ "\1\27\1\30\1\22\1\4\7\6\2\3\1\45\1\42\1\44\1\46"+
+ "\1\44\1\42\1\43\3\5\1\25\1\26\1\25\5\1\1\24\13\1"+
+ "\1\23\2\1\1\41\1\0\1\41\1\44\1\2\1\0\1\36\1\55"+
+ "\1\60\1\62\1\34\1\35\1\56\1\47\1\51\1\66\1\67\1\37"+
+ "\1\54\1\57\1\61\1\50\1\70\1\32\1\40\1\31\1\33\1\63"+
+ "\1\52\1\64\1\53\1\65\1\15\1\7\1\16\1\42\uff81\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 =
+ "\6\0\1\1\1\2\2\3\1\2\1\4\1\5\1\6"+
+ "\1\7\1\10\1\11\1\12\1\11\1\12\11\2\1\12"+
+ "\14\2\1\13\1\14\1\15\4\13\1\16\2\13\1\17"+
+ "\1\20\1\13\1\21\2\13\1\22\3\13\1\23\1\3"+
+ "\1\24\1\23\1\24\1\23\1\25\1\23\1\26\1\27"+
+ "\1\30\1\31\3\2\1\32\15\2\1\32\20\2\1\32"+
+ "\31\2\1\32\3\2\4\0\1\33\1\34\4\0\1\24"+
+ "\1\0\2\25\1\35\22\2\1\36\2\2\1\32\73\2"+
+ "\1\32\1\2\10\0\1\37\1\2\1\40\1\36\56\2"+
+ "\1\40\2\2\1\36\16\2\2\0\1\41\2\0\1\42"+
+ "\13\2\1\32\40\2\1\32\10\2\4\0\10\2\1\36"+
+ "\65\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[437];
+ 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\71\0\162\0\253\0\344\0\u011d\0\u0156\0\u018f"+
+ "\0\u01c8\0\u0201\0\u023a\0\u0273\0\u023a\0\u02ac\0\u02e5\0\u031e"+
+ "\0\u0357\0\u023a\0\u023a\0\u0390\0\u03c9\0\u0402\0\u043b\0\u0474"+
+ "\0\u04ad\0\u04e6\0\u051f\0\u0558\0\u0591\0\u0156\0\u05ca\0\u0603"+
+ "\0\u063c\0\u0675\0\u06ae\0\u06e7\0\u0720\0\u0759\0\u0792\0\u07cb"+
+ "\0\u0804\0\u083d\0\u0876\0\u023a\0\u023a\0\u08af\0\u08e8\0\u0921"+
+ "\0\u095a\0\u023a\0\u0993\0\u09cc\0\u023a\0\u023a\0\u0a05\0\u023a"+
+ "\0\u0a3e\0\u0a77\0\u023a\0\u0ab0\0\u0ae9\0\u0b22\0\u0b5b\0\u0b5b"+
+ "\0\u0b5b\0\u0b94\0\u0bcd\0\u0c06\0\u0c3f\0\u0c78\0\u023a\0\u023a"+
+ "\0\u0cb1\0\u023a\0\u0cea\0\u0d23\0\u0d5c\0\u018f\0\u0d95\0\u0dce"+
+ "\0\u0e07\0\u0e40\0\u0e79\0\u0eb2\0\u0eeb\0\u0f24\0\u0f5d\0\u0f96"+
+ "\0\u0fcf\0\u1008\0\u1041\0\u107a\0\u10b3\0\u10ec\0\u1125\0\u115e"+
+ "\0\u1197\0\u11d0\0\u1209\0\u1242\0\u127b\0\u12b4\0\u12ed\0\u1326"+
+ "\0\u135f\0\u1398\0\u13d1\0\u140a\0\u1443\0\u147c\0\u14b5\0\u14ee"+
+ "\0\u1527\0\u1560\0\u1599\0\u15d2\0\u160b\0\u1644\0\u167d\0\u16b6"+
+ "\0\u16ef\0\u1728\0\u1761\0\u179a\0\u17d3\0\u180c\0\u1845\0\u187e"+
+ "\0\u18b7\0\u18f0\0\u1929\0\u1962\0\u199b\0\u19d4\0\u1a0d\0\u1a46"+
+ "\0\u1a7f\0\u1ab8\0\u1af1\0\u1b2a\0\u1b63\0\u1b9c\0\u023a\0\u023a"+
+ "\0\u1bd5\0\u1c0e\0\u1c47\0\u1c80\0\u1cb9\0\u1cf2\0\u0b5b\0\u1d2b"+
+ "\0\u023a\0\u1d64\0\u1d9d\0\u1dd6\0\u1e0f\0\u1e48\0\u1e81\0\u1eba"+
+ "\0\u1ef3\0\u1f2c\0\u1f65\0\u1f9e\0\u1fd7\0\u2010\0\u2049\0\u2082"+
+ "\0\u20bb\0\u20f4\0\u212d\0\u018f\0\u2166\0\u219f\0\u21d8\0\u2211"+
+ "\0\u224a\0\u2283\0\u22bc\0\u22f5\0\u232e\0\u2367\0\u23a0\0\u23d9"+
+ "\0\u2412\0\u244b\0\u2484\0\u24bd\0\u24f6\0\u252f\0\u2568\0\u25a1"+
+ "\0\u25da\0\u2613\0\u264c\0\u2685\0\u26be\0\u26f7\0\u2730\0\u2769"+
+ "\0\u27a2\0\u27db\0\u2814\0\u284d\0\u2886\0\u28bf\0\u28f8\0\u2931"+
+ "\0\u296a\0\u29a3\0\u29dc\0\u2a15\0\u2a4e\0\u2a87\0\u2ac0\0\u2af9"+
+ "\0\u2b32\0\u2b6b\0\u2ba4\0\u2bdd\0\u2c16\0\u2c4f\0\u2c88\0\u2cc1"+
+ "\0\u2cfa\0\u2d33\0\u2d6c\0\u2da5\0\u2dde\0\u2e17\0\u2e50\0\u2e89"+
+ "\0\u2ec2\0\u2efb\0\u2f34\0\u2f6d\0\u2fa6\0\u2fdf\0\u3018\0\u3051"+
+ "\0\u308a\0\u30c3\0\u30fc\0\u3135\0\u018f\0\u316e\0\u018f\0\u31a7"+
+ "\0\u31e0\0\u3219\0\u3252\0\u328b\0\u32c4\0\u32fd\0\u3336\0\u336f"+
+ "\0\u33a8\0\u33e1\0\u341a\0\u3453\0\u348c\0\u34c5\0\u34fe\0\u3537"+
+ "\0\u3570\0\u35a9\0\u35e2\0\u361b\0\u3654\0\u368d\0\u36c6\0\u36ff"+
+ "\0\u3738\0\u3771\0\u37aa\0\u37e3\0\u381c\0\u3855\0\u388e\0\u38c7"+
+ "\0\u3900\0\u3939\0\u3972\0\u39ab\0\u39e4\0\u3a1d\0\u3a56\0\u3a8f"+
+ "\0\u3ac8\0\u3b01\0\u3b3a\0\u3b73\0\u3bac\0\u3be5\0\u3c1e\0\u3c57"+
+ "\0\u3c90\0\u3cc9\0\u3d02\0\u3d3b\0\u3d74\0\u3dad\0\u3de6\0\u3e1f"+
+ "\0\u3e58\0\u3e91\0\u3eca\0\u3f03\0\u3f3c\0\u3f75\0\u3fae\0\u3fe7"+
+ "\0\u4020\0\u4059\0\u4092\0\u40cb\0\u4104\0\u413d\0\u4176\0\u41af"+
+ "\0\u41e8\0\u4221\0\u425a\0\u4293\0\u42cc\0\u4305\0\u433e\0\u4377"+
+ "\0\u43b0\0\u43e9\0\u4422\0\u445b\0\u4494\0\u44cd\0\u4506\0\u453f"+
+ "\0\u4578\0\u45b1\0\u45ea\0\u4623\0\u465c\0\u4695\0\u46ce\0\u4707"+
+ "\0\u4740\0\u4779\0\u47b2\0\u47eb\0\u4824\0\u485d\0\u4896\0\u48cf"+
+ "\0\u4908\0\u4941\0\u497a\0\u49b3\0\u49ec\0\u4a25\0\u4a5e\0\u4a97"+
+ "\0\u4ad0\0\u4b09\0\u3eca\0\u4b42\0\u4b7b\0\u4bb4\0\u4bed\0\u4c26"+
+ "\0\u4c5f\0\u4c98\0\u4cd1\0\u4d0a\0\u4092\0\u4d43\0\u413d\0\u4d7c"+
+ "\0\u4db5\0\u4dee\0\u4e27\0\u4e60\0\u4e99\0\u4ed2\0\u4f0b\0\u1fd7"+
+ "\0\u4f44\0\u4f7d\0\u4fb6\0\u4fef\0\u5028\0\u5061\0\u509a\0\u50d3"+
+ "\0\u510c\0\u5145\0\u517e\0\u51b7\0\u51f0\0\u5229\0\u5262\0\u529b"+
+ "\0\u52d4\0\u530d\0\u5346\0\u537f\0\u53b8\0\u53f1\0\u542a\0\u5463"+
+ "\0\u549c\0\u54d5\0\u550e\0\u5547\0\u5580\0\u55b9\0\u55f2\0\u562b"+
+ "\0\u5664\0\u569d\0\u56d6\0\u570f\0\u5748\0\u5781\0\u57ba\0\u57f3"+
+ "\0\u582c\0\u5865\0\u589e\0\u58d7\0\u5910\0\u5949\0\u5982\0\u59bb"+
+ "\0\u59f4\0\u5a2d\0\u5a66\0\u5a9f\0\u5ad8";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[437];
+ 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 =
+ "\1\7\2\10\1\11\1\12\1\10\1\11\1\13\1\14"+
+ "\1\10\1\15\1\16\1\17\1\20\1\13\1\21\1\22"+
+ "\1\23\1\24\4\10\1\22\1\25\1\26\1\27\1\30"+
+ "\1\31\1\32\1\33\1\34\1\35\1\23\1\13\1\36"+
+ "\3\22\1\10\1\37\1\40\1\41\1\10\1\42\1\43"+
+ "\1\44\1\45\1\46\1\47\1\50\1\51\1\52\4\10"+
+ "\12\53\1\54\3\53\1\55\16\53\1\56\11\53\1\57"+
+ "\2\53\1\60\16\53\12\61\1\62\5\61\1\63\14\61"+
+ "\1\56\11\61\1\57\2\61\1\60\16\61\12\64\1\65"+
+ "\3\64\1\66\52\64\12\67\1\70\5\67\1\71\50\67"+
+ "\12\72\1\73\22\72\1\74\11\72\1\75\2\72\1\76"+
+ "\16\72\7\7\1\0\2\7\11\0\4\7\2\0\10\7"+
+ "\2\0\1\7\3\0\23\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\22\10"+
+ "\3\77\2\11\1\77\1\11\1\0\2\77\11\0\1\77"+
+ "\1\100\1\101\1\102\1\0\1\103\3\77\1\102\1\101"+
+ "\1\77\1\100\1\77\2\0\1\77\3\0\13\77\1\101"+
+ "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+ "\1\106\1\100\1\101\1\102\1\0\1\103\3\77\1\102"+
+ "\1\101\1\77\1\100\1\77\2\0\1\77\3\0\13\77"+
+ "\1\101\1\77\1\106\4\77\71\0\3\7\2\14\1\7"+
+ "\1\14\1\0\2\7\11\0\4\7\2\0\10\7\2\0"+
+ "\1\7\3\0\22\7\13\0\1\16\55\0\14\17\1\107"+
+ "\54\17\11\0\1\110\77\0\1\111\72\0\1\112\51\0"+
+ "\2\103\1\0\1\103\62\0\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\113\6\10\2\0"+
+ "\1\7\3\0\1\114\3\10\1\115\5\10\1\116\7\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\3\10\1\117\1\10\1\120\2\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\7\10\1\121\2\0\1\7\3\0\10\10\1\122"+
+ "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\123\1\10\2\0\1\7\3\0\10\10"+
+ "\1\124\4\10\1\125\4\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\2\10\1\126\2\10\1\127"+
+ "\2\10\2\0\1\7\3\0\2\10\1\130\7\10\1\131"+
+ "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\116\1\132\1\133\4\10\1\134\2\0\1\7"+
+ "\3\0\6\10\1\135\13\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\5\10\1\136\2\10\2\0"+
+ "\1\7\3\0\2\10\1\137\7\10\1\140\7\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\141"+
+ "\2\10\1\142\1\10\1\143\2\10\2\0\1\7\3\0"+
+ "\1\144\1\10\1\145\2\10\1\146\14\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\147"+
+ "\1\150\2\10\1\151\1\152\1\10\2\0\1\7\3\0"+
+ "\12\10\1\153\7\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\4\10\1\116\2\10\1\116\2\0"+
+ "\1\7\3\0\5\10\1\154\2\10\1\155\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\156\6\10\2\0\1\7\3\0\1\157\1\10\1\160"+
+ "\7\10\1\161\7\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\162\4\10\2\0\1\7"+
+ "\3\0\12\10\1\124\7\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\163\4\10\2\0"+
+ "\1\7\3\0\4\10\1\164\5\10\1\165\7\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\12\10\1\166\7\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\167"+
+ "\1\10\1\170\2\10\2\0\1\7\3\0\2\10\1\171"+
+ "\7\10\1\172\7\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\2\10\1\173\2\10\1\174\1\175"+
+ "\1\10\2\0\1\7\3\0\1\176\11\10\1\177\1\200"+
+ "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\10\1\116\1\201\1\10\1\116\3\10\2\0"+
+ "\1\7\3\0\6\10\1\202\1\10\1\116\3\10\1\203"+
+ "\5\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\204\4\10\2\0\1\7\3\0\2\10"+
+ "\1\205\1\10\1\206\5\10\1\207\7\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\210"+
+ "\2\10\2\0\1\7\3\0\2\10\1\211\17\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\12\10\1\212\7\10\12\53\1\0"+
+ "\3\53\1\0\16\53\1\0\11\53\1\0\2\53\1\0"+
+ "\16\53\31\0\1\213\17\0\1\214\50\0\1\215\111\0"+
+ "\1\216\16\0\12\61\1\0\5\61\1\0\14\61\1\0"+
+ "\11\61\1\0\2\61\1\0\16\61\21\0\1\217\47\0"+
+ "\12\64\1\0\3\64\1\0\52\64\12\67\1\0\5\67"+
+ "\1\0\50\67\21\0\1\220\47\0\12\72\1\0\22\72"+
+ "\1\0\11\72\1\0\2\72\1\0\16\72\31\0\1\221"+
+ "\17\0\1\222\50\0\1\223\111\0\1\224\16\0\7\77"+
+ "\1\0\2\77\11\0\4\77\2\0\10\77\2\0\1\77"+
+ "\3\0\25\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+ "\4\77\1\226\1\0\10\77\2\0\1\77\3\0\25\77"+
+ "\2\103\1\77\1\103\1\0\2\77\11\0\2\77\1\101"+
+ "\1\102\2\0\3\77\1\102\1\101\3\77\2\0\1\77"+
+ "\3\0\13\77\1\101\11\77\2\104\1\77\1\104\1\0"+
+ "\2\77\11\0\2\77\1\101\1\102\1\0\1\103\3\77"+
+ "\1\102\1\101\3\77\2\0\1\77\3\0\13\77\1\101"+
+ "\11\77\1\104\1\105\1\77\1\105\1\0\2\77\11\0"+
+ "\1\77\1\227\1\101\1\102\1\0\1\103\3\77\1\102"+
+ "\1\101\1\77\1\227\1\77\2\0\1\77\3\0\13\77"+
+ "\1\101\11\77\4\230\1\0\2\77\11\0\2\77\2\230"+
+ "\2\0\3\77\3\230\2\77\2\0\1\77\3\0\6\77"+
+ "\1\230\2\77\1\230\1\77\1\230\6\77\11\0\1\231"+
+ "\57\0\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\2\10\1\232\5\10\2\0\1\7\3\0\4\10"+
+ "\1\116\15\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\233\1\10\1\234\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\1\10"+
+ "\1\235\20\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\5\10\1\236\1\10\1\237\2\0\1\7"+
+ "\3\0\1\10\1\240\1\241\4\10\1\242\1\10\1\243"+
+ "\7\10\1\244\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\123"+
+ "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\245\4\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\246\6\10\1\247\2\0\1\7\3\0\2\10\1\201"+
+ "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\7\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\13\10\1\116\6\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\250\7\10"+
+ "\2\0\1\7\3\0\1\10\1\251\7\10\1\252\10\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\10\10\1\253\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\254\4\10\1\255\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\6\10\1\235\1\10\2\0\1\7\3\0\10\10\1\256"+
+ "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\10\1\257\6\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\10\1\260\6\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\261"+
+ "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\7\10\1\262\2\0"+
+ "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\7\10\1\263\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+ "\1\264\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\265"+
+ "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\10\10\1\266\1\267"+
+ "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\10\1\270\3\10\1\271\2\10\2\0\1\7"+
+ "\3\0\12\10\1\272\1\273\6\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\116\4\10\1\274"+
+ "\1\275\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\4\10\1\276"+
+ "\3\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\10\1\116\4\10"+
+ "\1\116\1\10\2\0\1\7\3\0\12\10\1\277\7\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\10\10\1\300\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+ "\1\301\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\2\10\1\302\7\10\1\303\7\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\6\10\1\304\13\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\7\10\1\305"+
+ "\2\0\1\7\3\0\11\10\1\306\10\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\307"+
+ "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\2\10\1\310\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\1\10\1\311\20\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\312\5\10\1\313\1\10\2\0"+
+ "\1\7\3\0\1\314\1\10\1\315\10\10\1\316\6\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\2\10\1\317\17\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\2\10\1\320\17\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\321\7\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\322\6\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\7\10\1\323\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\7\10\1\324\12\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\325\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\12\10\1\326\7\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\327\7\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\5\10\1\330\2\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\5\10\1\331"+
+ "\14\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\254\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\116\7\10\2\0\1\7\3\0\13\10\1\332\6\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\10\1\333\6\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\334\5\10\1\235\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+ "\1\335\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\336"+
+ "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\5\10\1\337\2\10\1\340\11\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\341"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\116\7\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\17\10"+
+ "\1\342\2\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\3\10\1\343\4\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\4\10\1\344\2\10\1\345\2\0\1\7\3\0"+
+ "\1\10\1\346\20\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\7\10\1\347\2\0\1\7\3\0"+
+ "\14\10\1\116\5\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\10\10"+
+ "\1\350\11\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\2\10\1\351\5\10\2\0\1\7\3\0"+
+ "\3\10\1\352\16\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\10\1\353\6\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\354\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\10\1\116\6\10\2\0\1\7\3\0\22\10"+
+ "\50\0\1\355\57\0\1\356\62\0\1\357\111\0\1\360"+
+ "\66\0\1\361\57\0\1\362\62\0\1\363\111\0\1\364"+
+ "\16\0\3\77\2\225\1\77\1\225\1\0\2\77\11\0"+
+ "\2\77\1\101\1\77\2\0\4\77\1\101\3\77\2\0"+
+ "\1\77\3\0\13\77\1\101\6\77\3\0\2\225\1\0"+
+ "\1\225\62\0\3\77\4\230\1\0\2\77\11\0\1\77"+
+ "\1\227\2\230\2\0\3\77\3\230\1\227\1\77\2\0"+
+ "\1\77\3\0\6\77\1\230\2\77\1\230\1\77\1\230"+
+ "\6\77\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\365\4\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\3\10\1\366\4\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\10\10\1\116\11\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\116"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\6\10\1\367\1\10"+
+ "\2\0\1\7\3\0\13\10\1\370\6\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\2\10\1\371\7\10\1\372\7\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+ "\1\373\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\10\10\1\374\11\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\2\10\1\375\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\12\10\1\376\7\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\2\10\1\377\5\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\7\10\1\116\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\2\10\1\u0100\17\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+ "\1\u0101\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0102"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\12\10\1\u0103\7\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u0104\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+ "\1\u0105\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\7\10\1\232\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\5\10\1\u0106\2\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\3\10\1\u0107\16\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0108"+
+ "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\12\10\1\u0109\7\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u010a\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\u010b\7\10\2\0\1\7\3\0"+
+ "\12\10\1\u010c\7\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\u0100\4\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u010d\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\7\10\1\u010e\12\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\5\10\1\171\2\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\2\10\1\u010f\17\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0110\7\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\u0111\6\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+ "\1\u0112\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\6\10\1\u0113\1\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\4\10\1\254\3\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\3\10\1\273\4\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\u0114\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\7\10\1\u0115\12\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\6\10\1\u0116\1\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\14\10\1\u0117\5\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\u0118\7\10\2\0\1\7\3\0"+
+ "\1\10\1\u0119\5\10\1\u011a\1\10\1\u011b\10\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+ "\1\u011c\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\11\10\1\267\10\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\20\10\1\u011d\1\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\u011e\7\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\u011f"+
+ "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\u0120\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\3\10\1\u0121\4\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\2\10\1\u0122\17\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0123"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\u0124\7\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\u0125\4\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\u0126\7\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\6\10\1\235\1\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\1\116\21\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\13\10\1\u0127\6\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\7\10\1\u0128\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\234"+
+ "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\u0127\4\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\6\10\1\u0129\1\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\12\10\1\116\7\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\254"+
+ "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\3\10\1\u012a\4\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u012b\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\10\1\u012c\6\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\u012d"+
+ "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\7\10\1\245\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\367\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\1\10\1\367\20\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\u012e\6\10\1\u012f"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\11\10\1\171\10\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\u0130\4\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u0131\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u0132\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\u0133\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0134"+
+ "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\1\10\1\u0135\20\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\5\10\1\u0136\2\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\6\10"+
+ "\1\u0115\13\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\10\10\1\166"+
+ "\11\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u0137\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\u0138\7\10\2\0\1\7\3\0\22\10\45\0\1\u0139"+
+ "\57\0\1\355\104\0\1\u013a\50\0\1\u013b\105\0\1\u013c"+
+ "\57\0\1\361\104\0\1\u013d\50\0\1\u013e\40\0\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+ "\1\u013f\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\12\10\1\u0140\7\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\13\10\1\u0141\6\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\2\10\1\u0142\5\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\5\10\1\201\2\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\u0143\7\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\7\10\1\u0144\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\124"+
+ "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\2\10\1\u0145\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\6\10\1\116\1\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\4\10\1\235\3\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u0146\6\10\2\0\1\7\3\0"+
+ "\10\10\1\u0147\11\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\10\1\u0148\6\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\1\10\1\201"+
+ "\20\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\u0149\7\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+ "\1\u014a\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u014b"+
+ "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\4\10\1\116\15\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\5\10\1\u014c\14\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+ "\1\u014d\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u014e\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\u014f\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\5\10\1\u0150\2\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\2\10\1\u0151\3\10\1\u0152\13\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\10\10\1\u0153\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\2\10\1\u0154\17\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u0155"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\5\10\1\u0156\2\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\124\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\u0157\7\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\u0158\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\6\10\1\u0157\1\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\5\10"+
+ "\1\u0159\2\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u015a"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\3\10\1\u015b\4\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\u015c\6\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\u015d\4\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\2\10\1\u015e"+
+ "\17\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\124\1\10\1\u015f\2\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\4\10\1\u0160\3\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\u0161\7\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+ "\1\u0162\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0163"+
+ "\6\10\2\0\1\7\3\0\7\10\1\u0161\12\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\10\10\1\235\11\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u0164"+
+ "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\2\10\1\u0165\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\15\10\1\254\4\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\3\10\1\370\4\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0152"+
+ "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u015f\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\3\10\1\u0166\4\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+ "\1\u0167\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\4\10\1\344\3\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u0168\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+ "\1\u0169\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\5\10\1\u016a\2\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\u016b\7\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\11\10\1\201\10\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016c"+
+ "\4\10\1\u016d\1\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\2\10"+
+ "\1\u016e\5\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\10\1\u016f"+
+ "\6\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\3\10\1\u0170\4\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\2\10\1\u0171\17\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\5\10"+
+ "\1\u0172\14\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u0173\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\2\10\1\267\5\10\2\0\1\7\3\0\22\10"+
+ "\22\0\1\u0174\106\0\1\355\4\0\1\u0139\24\0\1\u013b"+
+ "\1\u0175\4\u013b\1\0\1\u0175\1\u013b\2\0\1\u0175\2\0"+
+ "\3\u0175\5\u013b\2\u0175\10\u013b\3\u0175\1\0\2\u0175\22\u013b"+
+ "\22\0\1\u0176\106\0\1\361\4\0\1\u013c\24\0\1\u013e"+
+ "\1\u0177\4\u013e\1\0\1\u0177\1\u013e\2\0\1\u0177\2\0"+
+ "\3\u0177\5\u013e\2\u0177\10\u013e\3\u0177\1\0\2\u0177\22\u013e"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\13\10\1\u0178\6\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\10\10\1\u0179\11\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u017a"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\10\1\u017b\6\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\u017c\6\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\u017d\7\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\10\1\u017e\6\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\10\10\1\267\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\13\10\1\u017f\6\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0180\7\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\2\10\1\u0181\17\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\6\10\1\u0108\1\10\2\0\1\7"+
+ "\3\0\2\10\1\u0182\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\u0155\6\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\5\10\1\u0183\2\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\6\10\1\u0184"+
+ "\13\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u0185\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\2\10\1\u0159\5\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\u0186\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\10\10\1\u0187\11\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\12\10\1\u0188\7\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\7\10\1\116\12\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+ "\1\116\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\254"+
+ "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\6\10\1\171\1\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\2\10\1\u0151\17\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\3\10"+
+ "\1\367\4\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\1\u0189\7\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\11\10\1\u0183\10\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\1\10\1\u018a\6\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\5\10\1\u018b\2\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\13\10\1\u018c\6\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\7\10\1\u018d\2\0\1\7\3\0\11\10\1\254\10\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\7\10\1\u0189\12\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\12\10\1\u018e\7\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\336"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\5\10\1\u018f\14\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\4\10\1\u0190\3\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+ "\1\u0191\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\5\10\1\u0192\2\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u0193\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\1\10\1\u0194\20\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\10\10\1\u0195\11\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\10\10\1\u0196\11\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\2\10\1\u0197\17\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\2\10\1\u0198\17\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+ "\1\u0199\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\6\10\1\u019a\1\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\2\10\1\u019b\5\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\11\10\1\u014c\10\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\10\10\1\u019c\2\10\1\254\6\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\2\10\1\u019d\17\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\7\10\1\u019e\12\10\22\0\1\u013b"+
+ "\70\0\1\u013e\46\0\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\14\10"+
+ "\1\u019f\5\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\6\10\1\u0186\1\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\10\10\1\u019a\11\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\11\10\1\u01a0\10\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\12\10\1\u01a1\7\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\330"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\3\10\1\u019e\4\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u01a2\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\12\10"+
+ "\1\234\7\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\16\10\1\u01a3"+
+ "\3\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\1\u0111\7\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\6\10"+
+ "\1\u017d\1\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\11\10\1\u019a\10\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\4\10\1\254\15\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\367\7\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\12\10\1\u01a4"+
+ "\7\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\254\4\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\u0108\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\5\10\1\116\14\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\2\10\1\u01a5\5\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\1\u0111\21\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\10\1\u01a6\6\10\2\0\1\7\3\0"+
+ "\22\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\3\10\1\u01a7\4\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\5\10\1\u01a8\2\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u0113"+
+ "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\6\10\1\u01a9\1\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\10\10\1\367\11\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\5\10\1\u01aa\2\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u01ab"+
+ "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u01a4\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\10\10\1\u019e\11\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\10\10"+
+ "\2\0\1\7\3\0\13\10\1\u0189\6\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\5\10\1\u0155"+
+ "\2\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\1\254\7\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\11\10"+
+ "\1\u01ac\10\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\u01ad\7\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\10\10\2\0\1\7\3\0\11\10\1\254\10\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\7\10"+
+ "\1\254\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\5\10\1\212\2\10"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\3\10\1\u01ae\4\10\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\13\10"+
+ "\1\u01af\6\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\13\10\1\367"+
+ "\6\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\5\10\1\u0105\2\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\6\10\1\367\1\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\10"+
+ "\1\235\6\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\10\10\2\0"+
+ "\1\7\3\0\5\10\1\254\14\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\10\10\1\u01b0\11\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\10\10\2\0\1\7\3\0"+
+ "\11\10\1\235\10\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\10\10\2\0\1\7\3\0\2\10"+
+ "\1\u0182\17\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\10\10\2\0\1\7\3\0\11\10\1\u017e"+
+ "\10\10\1\7\6\10\1\0\1\7\1\10\11\0\4\10"+
+ "\2\0\10\10\2\0\1\7\3\0\4\10\1\367\15\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\52\7\10\2\0\1\7\3\0\22\10\1\7\6\10"+
+ "\1\0\1\7\1\10\11\0\4\10\2\0\3\10\1\u01b1"+
+ "\4\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\7\10\1\u01b2\2\0"+
+ "\1\7\3\0\22\10\1\7\6\10\1\0\1\7\1\10"+
+ "\11\0\4\10\2\0\2\10\1\u01b3\5\10\2\0\1\7"+
+ "\3\0\22\10\1\7\6\10\1\0\1\7\1\10\11\0"+
+ "\4\10\2\0\1\u01b4\7\10\2\0\1\7\3\0\22\10"+
+ "\1\7\6\10\1\0\1\7\1\10\11\0\4\10\2\0"+
+ "\1\10\1\u0163\6\10\2\0\1\7\3\0\22\10\1\7"+
+ "\6\10\1\0\1\7\1\10\11\0\4\10\2\0\1\u01b5"+
+ "\7\10\2\0\1\7\3\0\22\10\1\7\6\10\1\0"+
+ "\1\7\1\10\11\0\4\10\2\0\10\10\2\0\1\7"+
+ "\3\0\11\10\1\u0189\10\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\5\10\1\u0105\1\10\1\254"+
+ "\2\0\1\7\3\0\22\10\1\7\6\10\1\0\1\7"+
+ "\1\10\11\0\4\10\2\0\1\10\1\270\6\10\2\0"+
+ "\1\7\3\0\22\10";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[23313];
+ 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 =
+ "\6\0\4\1\1\11\1\1\1\11\4\1\2\11\30\1"+
+ "\2\11\4\1\1\11\2\1\2\11\1\1\1\11\2\1"+
+ "\1\11\13\1\2\11\1\1\1\11\100\1\4\0\2\11"+
+ "\4\0\1\1\1\0\2\1\1\11\123\1\10\0\104\1"+
+ "\2\0\1\1\2\0\66\1\4\0\76\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[437];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "(*" comment.
+ */
+ public static final int INTERNAL_MLC2 = -1;
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "{$" compiler directive.
+ */
+ public static final int INTERNAL_COMPILER_DIRECTIVE = -2;
+
+ /**
+ * Token type specific to DelphiTokenMaker; denotes a line ending
+ * with an unterminated "(*$" compiler directive.
+ */
+ public static final int INTERNAL_COMPILER_DIRECTIVE2 = -3;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public DelphiTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case INTERNAL_MLC2:
+ state = MLC2;
+ start = text.offset;
+ break;
+ case INTERNAL_COMPILER_DIRECTIVE:
+ state = COMPILER_DIRECTIVE;
+ start = text.offset;
+ break;
+ case INTERNAL_COMPILER_DIRECTIVE2:
+ state = COMPILER_DIRECTIVE2;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public DelphiTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public DelphiTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 158) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 15:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+ }
+ case 35: break;
+ case 4:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 36: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 37: break;
+ case 27:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 38: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 39: break;
+ case 21:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 40: break;
+ case 20:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 41: break;
+ case 26:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 42: break;
+ case 16:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.PREPROCESSOR);
+ }
+ case 43: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 44: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+ }
+ case 45: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 46: break;
+ case 18:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 47: break;
+ case 25:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 48: break;
+ case 30:
+ { addToken(Token.FUNCTION);
+ }
+ case 49: break;
+ case 7:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 50: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+ }
+ case 51: break;
+ case 32:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 52: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 53: break;
+ case 31:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 54: break;
+ case 22:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 55: break;
+ case 34:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 56: break;
+ case 29:
+ { start = zzMarkedPos-3; yybegin(COMPILER_DIRECTIVE2);
+ }
+ case 57: break;
+ case 24:
+ { start = zzMarkedPos-2; yybegin(MLC2);
+ }
+ case 58: break;
+ case 33:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 59: break;
+ case 19:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 60: break;
+ case 28:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.PREPROCESSOR);
+ }
+ case 61: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.COMMENT_MULTILINE);
+ }
+ case 62: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 63: break;
+ case 10:
+ { addToken(Token.OPERATOR);
+ }
+ case 64: break;
+ case 8:
+ { start = zzMarkedPos-1; yybegin(MLC);
+ }
+ case 65: break;
+ case 23:
+ { start = zzMarkedPos-2; yybegin(COMPILER_DIRECTIVE);
+ }
+ case 66: break;
+ case 11:
+ {
+ }
+ case 67: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 68: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case COMPILER_DIRECTIVE: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE); return firstToken;
+ }
+ case 438: break;
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 439: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 440: break;
+ case COMPILER_DIRECTIVE2: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_COMPILER_DIRECTIVE2); return firstToken;
+ }
+ case 441: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 442: break;
+ case MLC2: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_MLC2); return firstToken;
+ }
+ case 443: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex
new file mode 100644
index 0000000..0c15fe8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex
@@ -0,0 +1,345 @@
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+%%
+
+%public
+%class DtdTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed XML tag; thus a new line is beginning still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG_START = -1;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed DOCTYPE element.
+ */
+ public static final int INTERNAL_INTAG_ELEMENT = -2;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed, locally-defined DTD in a DOCTYPE element.
+ */
+ public static final int INTERNAL_INTAG_ATTLIST = -3;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed comment. The state to return to when this comment ends is
+ * embedded in the token type as well.
+ */
+ public static final int INTERNAL_IN_COMMENT = -(1<<11);
+
+ /**
+ * The state we were in prior to the current one. This is used to know
+ * what state to resume after an MLC ends.
+ */
+ private int prevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public DtdTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in XML files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ prevState = YYINITIAL;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case INTERNAL_INTAG_START:
+ state = INTAG_START;
+ break;
+ case INTERNAL_INTAG_ELEMENT:
+ state = INTAG_ELEMENT;
+ break;
+ case INTERNAL_INTAG_ATTLIST:
+ state = INTAG_ATTLIST;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_COMMENT:
+ state = COMMENT;
+ break;
+ }
+ prevState = -initialTokenType&0xff;
+ }
+ else { // Shouldn't happen
+ state = YYINITIAL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Whitespace = ([ \t\f])
+LineTerminator = ([\n])
+UnclosedString = ([\"][^\"]*)
+UnclosedChar = ([\'][^\']*)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ([A-Za-z_0-9\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$A-Za-z0-9])
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state INTAG_START
+%state INTAG_ELEMENT
+%state INTAG_ATTLIST
+
+%%
+
+<YYINITIAL> {
+ ([^ \t\f<]+) { /* Not really valid */ addToken(Token.IDENTIFIER); }
+ "<!--" { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+ "<!" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START); }
+ "<" { addToken(Token.IDENTIFIER); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ {LineTerminator} |
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ "-->" { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken; }
+}
+
+<INTAG_START> {
+ ("ELEMENT") { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT); }
+ ("ATTLIST") { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST); }
+ ([^ \t\f>]+) { addToken(Token.IDENTIFIER); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ (">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ <<EOF>> { addEndToken(INTERNAL_INTAG_START); return firstToken; }
+}
+
+<INTAG_ELEMENT> {
+ ([^ \t\f>]+) { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ (">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ <<EOF>> { addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken; }
+}
+
+<INTAG_ATTLIST> {
+ ("CDATA"|"#IMPLIED"|"#REQUIRED") { addToken(Token.MARKUP_PROCESSING_INSTRUCTION); }
+ ([^ \t\f>\"\']+) { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ ({UnclosedString}[\"]?) { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ ({UnclosedChar}[\']?) { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ (">") { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ <<EOF>> { addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java
new file mode 100644
index 0000000..26dbe3d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/DtdTokenMaker.java
@@ -0,0 +1,828 @@
+/* The following code was generated by JFlex 1.4.1 on 4/14/12 10:23 AM */
+
+/*
+ * 04/12/2012
+ *
+ * DtdTokenMaker.java - Generates tokens for DTD syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for DTD files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+
+public class DtdTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int INTAG_START = 2;
+ public static final int INTAG_ELEMENT = 3;
+ public static final int YYINITIAL = 0;
+ public static final int INTAG_ATTLIST = 4;
+ public static final int COMMENT = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\1\1\2\1\0\1\1\23\0\1\1\1\24\1\3\1\41"+
+ "\1\7\1\5\1\5\1\4\5\5\1\25\1\22\1\6\12\7\1\20"+
+ "\1\5\1\23\1\5\1\26\2\5\1\34\1\7\1\37\1\40\1\27"+
+ "\3\7\1\35\2\7\1\30\1\31\1\32\1\7\1\42\1\44\1\43"+
+ "\1\36\1\33\1\45\5\7\1\5\1\0\1\5\1\0\1\5\1\0"+
+ "\4\7\1\17\1\14\1\7\1\10\1\15\2\7\1\16\3\7\1\12"+
+ "\2\7\1\13\1\11\2\7\1\21\3\7\3\0\1\5\uff81\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 =
+ "\5\0\1\1\1\2\1\3\1\4\1\5\4\4\1\3"+
+ "\1\6\2\3\2\7\2\10\2\7\1\11\5\0\2\3"+
+ "\1\10\3\7\5\0\1\12\2\3\3\7\1\13\2\0"+
+ "\1\14\2\3\3\7\2\0\2\3\1\15\2\7\2\3"+
+ "\2\7\1\16\1\17\1\7";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[70];
+ 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\46\0\114\0\162\0\230\0\276\0\344\0\u010a"+
+ "\0\u0130\0\u0156\0\u017c\0\u01a2\0\u01c8\0\u01ee\0\u0214\0\u0156"+
+ "\0\u023a\0\u0260\0\u0286\0\u02ac\0\u02d2\0\u02f8\0\u031e\0\u0344"+
+ "\0\u036a\0\u0390\0\u03b6\0\u03dc\0\u0402\0\u0428\0\u044e\0\u0474"+
+ "\0\u0156\0\u049a\0\u04c0\0\u04e6\0\u050c\0\u0532\0\u0558\0\u057e"+
+ "\0\u05a4\0\u0156\0\u05ca\0\u05f0\0\u0616\0\u063c\0\u0662\0\u0156"+
+ "\0\u0688\0\u06ae\0\u06d4\0\u06fa\0\u0720\0\u0746\0\u076c\0\u0792"+
+ "\0\u07b8\0\u06d4\0\u07de\0\u0804\0\u02ac\0\u082a\0\u0850\0\u0876"+
+ "\0\u089c\0\u08c2\0\u08e8\0\u0214\0\u0214\0\u090e";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[70];
+ 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 =
+ "\1\6\1\7\21\6\1\10\22\6\2\11\1\12\5\11"+
+ "\1\13\3\11\1\14\4\11\1\15\3\11\1\16\20\11"+
+ "\1\17\1\7\24\17\1\20\1\21\4\17\1\22\11\17"+
+ "\1\23\1\7\24\23\1\20\17\23\1\24\1\7\1\24"+
+ "\1\25\1\26\21\24\1\20\10\24\1\27\1\24\1\30"+
+ "\4\24\1\6\1\0\21\6\1\0\22\6\1\0\1\7"+
+ "\70\0\1\31\21\0\2\11\1\0\5\11\1\0\3\11"+
+ "\1\0\4\11\1\0\3\11\1\0\20\11\57\0\1\32"+
+ "\45\0\1\33\3\0\1\34\51\0\1\35\51\0\1\36"+
+ "\20\0\1\17\1\0\24\17\1\0\20\17\1\0\24\17"+
+ "\1\0\1\17\1\37\16\17\1\0\24\17\1\0\4\17"+
+ "\1\40\12\17\1\23\1\0\24\23\1\0\17\23\1\24"+
+ "\1\0\1\24\2\0\21\24\1\0\17\24\3\25\1\41"+
+ "\42\25\4\26\1\41\41\26\1\24\1\0\1\24\2\0"+
+ "\21\24\1\0\11\24\1\42\6\24\1\0\1\24\2\0"+
+ "\21\24\1\0\6\24\1\43\5\24\1\44\2\24\25\0"+
+ "\1\45\31\0\1\46\46\0\1\47\51\0\1\50\50\0"+
+ "\1\51\52\0\1\52\17\0\1\17\1\0\24\17\1\0"+
+ "\1\53\17\17\1\0\24\17\1\0\4\17\1\54\12\17"+
+ "\1\24\1\0\1\24\2\0\21\24\1\0\5\24\1\55"+
+ "\12\24\1\0\1\24\2\0\21\24\1\0\2\24\1\56"+
+ "\15\24\1\0\1\24\2\0\21\24\1\0\1\57\16\24"+
+ "\25\0\1\60\32\0\1\61\53\0\1\62\44\0\1\47"+
+ "\50\0\1\63\23\0\1\17\1\0\24\17\1\0\2\17"+
+ "\1\64\15\17\1\0\24\17\1\0\1\17\1\65\15\17"+
+ "\1\24\1\0\1\24\2\0\21\24\1\0\4\24\1\66"+
+ "\13\24\1\0\1\24\2\0\21\24\1\0\13\24\1\67"+
+ "\4\24\1\0\1\24\2\0\21\24\1\0\15\24\1\70"+
+ "\1\24\13\0\1\47\4\0\1\62\33\0\1\71\43\0"+
+ "\2\72\12\63\1\72\1\63\1\72\1\0\2\72\1\0"+
+ "\12\63\1\72\4\63\1\17\1\0\24\17\1\0\1\73"+
+ "\17\17\1\0\24\17\1\0\6\17\1\74\10\17\1\24"+
+ "\1\0\1\24\2\0\21\24\1\0\5\24\1\75\12\24"+
+ "\1\0\1\24\2\0\21\24\1\0\1\24\1\76\16\24"+
+ "\1\0\1\24\2\0\21\24\1\0\16\24\1\77\6\0"+
+ "\1\63\37\0\1\17\1\0\24\17\1\0\3\17\1\100"+
+ "\14\17\1\0\24\17\1\0\7\17\1\101\7\17\1\24"+
+ "\1\0\1\24\2\0\21\24\1\0\6\24\1\102\11\24"+
+ "\1\0\1\24\2\0\21\24\1\0\6\24\1\103\10\24"+
+ "\1\17\1\0\24\17\1\0\4\17\1\104\13\17\1\0"+
+ "\24\17\1\0\4\17\1\105\12\17\1\24\1\0\1\24"+
+ "\2\0\21\24\1\0\1\106\17\24\1\0\1\24\2\0"+
+ "\21\24\1\0\14\24\1\102\3\24\1\0\1\24\2\0"+
+ "\21\24\1\0\11\24\1\75\5\24";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[2356];
+ 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 =
+ "\5\0\4\1\1\11\5\1\1\11\11\1\5\0\2\1"+
+ "\1\11\3\1\5\0\1\11\5\1\1\11\2\0\6\1"+
+ "\2\0\14\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[70];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed XML tag; thus a new line is beginning still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG_START = -1;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed DOCTYPE element.
+ */
+ public static final int INTERNAL_INTAG_ELEMENT = -2;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed, locally-defined DTD in a DOCTYPE element.
+ */
+ public static final int INTERNAL_INTAG_ATTLIST = -3;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed comment. The state to return to when this comment ends is
+ * embedded in the token type as well.
+ */
+ public static final int INTERNAL_IN_COMMENT = -(1<<11);
+
+ /**
+ * The state we were in prior to the current one. This is used to know
+ * what state to resume after an MLC ends.
+ */
+ private int prevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public DtdTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in XML files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ prevState = YYINITIAL;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case INTERNAL_INTAG_START:
+ state = INTAG_START;
+ break;
+ case INTERNAL_INTAG_ELEMENT:
+ state = INTAG_ELEMENT;
+ break;
+ case INTERNAL_INTAG_ATTLIST:
+ state = INTAG_ATTLIST;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_COMMENT:
+ state = COMMENT;
+ break;
+ }
+ prevState = -initialTokenType&0xff;
+ }
+ else { // Shouldn't happen
+ state = YYINITIAL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public DtdTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public DtdTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 138) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 3:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 16: break;
+ case 12:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 17: break;
+ case 2:
+ { addToken(Token.WHITESPACE);
+ }
+ case 18: break;
+ case 1:
+ { /* Not really valid */ addToken(Token.IDENTIFIER);
+ }
+ case 19: break;
+ case 9:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG_START);
+ }
+ case 20: break;
+ case 6:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+ }
+ case 21: break;
+ case 11:
+ { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+ }
+ case 22: break;
+ case 7:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 23: break;
+ case 10:
+ { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.COMMENT_MULTILINE); start = temp; yybegin(prevState);
+ }
+ case 24: break;
+ case 15:
+ { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ATTLIST);
+ }
+ case 25: break;
+ case 14:
+ { addToken(Token.MARKUP_TAG_NAME); yybegin(INTAG_ELEMENT);
+ }
+ case 26: break;
+ case 13:
+ { addToken(Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 27: break;
+ case 4:
+ {
+ }
+ case 28: break;
+ case 5:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+ }
+ case 29: break;
+ case 8:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 30: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case INTAG_START: {
+ addEndToken(INTERNAL_INTAG_START); return firstToken;
+ }
+ case 71: break;
+ case INTAG_ELEMENT: {
+ addEndToken(INTERNAL_INTAG_ELEMENT); return firstToken;
+ }
+ case 72: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 73: break;
+ case INTAG_ATTLIST: {
+ addEndToken(INTERNAL_INTAG_ATTLIST); return firstToken;
+ }
+ case 74: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_COMMENT - prevState); return firstToken;
+ }
+ case 75: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex
new file mode 100644
index 0000000..b4f1c81
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex
@@ -0,0 +1,480 @@
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated FortranTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class FortranTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. We must have this here as there is no default,
+ * no-parameter constructor generated by JFlex.
+ */
+ public FortranTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "!", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+Column1CommentBegin = ([C\*])
+Column1Comment2Begin = (D)
+AnywhereCommentBegin = (\!)
+
+Identifier = ([A-Za-z0-9_$]+)
+
+StringDelimiter = (\")
+CharDelimiter = (\')
+
+Operators1 = ("<"|">"|"<="|">="|"&"|"/="|"==")
+Operators2 = (\.(lt|gt|eq|ne|le|ge|and|or)\.)
+Operator = ({Operators1}|{Operators2})
+
+Boolean = (\.(true|false)\.)
+
+%state STRING
+%state CHAR
+
+%%
+
+/* Keywords */
+<YYINITIAL> "INCLUDE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PROGRAM" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SUBROUTINE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FUNCTION" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTAINS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "USE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CALL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "RETURN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMPLICIT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXPLICIT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NONE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATA" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PARAMETER" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATABLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALLOCATED" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEALLOCATE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INTEGER" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DOUBLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRECISION" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COMPLEX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHARACTER" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIMENSION" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "KIND" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CASE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SELECT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEFAULT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONTINUE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CYCLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DO" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHILE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IF" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEIF" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "THEN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ELSEWHERE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "END" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDIF" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDDO" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORALL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WHERE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXIT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "GOTO" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PAUSE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "STOP" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "BACKSPACE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOSE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ENDFILE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INQUIRE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "OPEN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "PRINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "READ" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REWIND" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "WRITE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FORMAT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CEILING" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCMPLX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DFLOAT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOOR" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IMAG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOGICAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MODULO" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TRANSFER" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ZEXT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ABS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ACOS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AIMAG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ALOG10" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMAX1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMIN1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "AMOD" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ANINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ASIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ATAN2" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CABS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CCOS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CHAR" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CLOG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CMPLX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CONJG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "COSH" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "CSQRT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DABS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DACOS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DASIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DATAN2" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DBLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DCOSH" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DDIM" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DEXP" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DIM" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DLOG10" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMAX1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMIN1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DMOD" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DNINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DPROD" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DREAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIGN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSINH" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DSQRT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTAN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "DTANH" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "EXP" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "FLOAT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IABS" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ICHAR" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDIM" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IDNINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "IFIX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INDEX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "INT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ISIGN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LEN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LGT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLE" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LLT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "LOG10" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MAX1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN0" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MIN1" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "MOD" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "NINT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "REAL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIGN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SIN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SINH" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SNGL" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "SQRT" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TAN" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "TANH" { addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character Literals. */
+ {CharDelimiter} { start = zzMarkedPos-1; yybegin(CHAR); }
+ {StringDelimiter} { start = zzMarkedPos-1; yybegin(STRING); }
+
+ /* Comment Literals. */
+ /* Note that we cannot combine these as JFLex doesn't like combining an */
+ /* expression containing the beginning-of-line character '^'. */
+ {Column1CommentBegin} {
+ // Since we change zzStartRead, we have the unfortunate
+ // side-effect of not being able to use the '^' operator.
+ // So we must check whether we're really at the beginning
+ // of the line ourselves...
+ if (zzStartRead==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(Token.IDENTIFIER);
+ }
+ }
+ {Column1Comment2Begin} {
+ // Since we change zzStartRead, we have the unfortunate
+ // side-effect of not being able to use the '^' operator.
+ // So we must check whether we're really at the beginning
+ // of the line ourselves...
+ if (zzStartRead==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(Token.IDENTIFIER);
+ }
+ }
+ {AnywhereCommentBegin} { addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Boolean literals. */
+ {Boolean} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ /* Ended with a line not in a string or char literal. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+<CHAR> {
+ [^\'\n]* {}
+ \' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING> {
+ [^\"\n]* {}
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java
new file mode 100644
index 0000000..01fa97c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/FortranTokenMaker.java
@@ -0,0 +1,1011 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 03/23/2005
+ *
+ * FortranTokenMaker.java - Scanner for the Fortran programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Fortran programming language.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated FortranTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class FortranTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int STRING = 1;
+ public static final int YYINITIAL = 0;
+ public static final int CHAR = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\2\1\1\1\0\1\2\23\0\1\2\1\5\1\10\1\0"+
+ "\1\6\1\0\1\14\1\11\2\0\1\3\3\0\1\16\1\15\1\45"+
+ "\1\50\1\51\7\6\2\0\1\12\1\13\1\12\2\0\1\25\1\37"+
+ "\1\7\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17"+
+ "\1\36\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6"+
+ "\1\44\1\40\1\43\1\47\4\0\1\6\1\0\1\25\1\37\1\34"+
+ "\1\4\1\22\1\31\1\21\1\41\1\33\1\46\1\42\1\17\1\36"+
+ "\1\24\1\26\1\35\1\23\1\27\1\32\1\20\1\30\1\6\1\44"+
+ "\1\40\1\43\1\47\uff85\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 =
+ "\1\0\2\1\1\2\1\3\1\4\1\5\1\6\1\7"+
+ "\1\2\1\5\1\10\1\11\1\12\1\2\1\12\24\2"+
+ "\1\1\1\13\1\14\1\1\1\15\1\16\7\2\1\17"+
+ "\20\2\7\0\41\2\1\17\27\2\1\17\10\2\1\17"+
+ "\3\2\4\0\2\17\3\2\2\17\20\2\1\17\10\2"+
+ "\2\17\3\2\1\17\2\2\1\17\6\2\1\17\2\0"+
+ "\3\2\1\17\4\2\1\17\26\2\1\0\20\2\1\20"+
+ "\12\2\1\17";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[257];
+ 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\52\0\124\0\176\0\176\0\250\0\176\0\322"+
+ "\0\176\0\374\0\u0126\0\176\0\176\0\u0150\0\u0150\0\176"+
+ "\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0276\0\u02a0"+
+ "\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u0126\0\u039c\0\u03c6"+
+ "\0\u03f0\0\u041a\0\u0444\0\u046e\0\u0498\0\176\0\176\0\u04c2"+
+ "\0\176\0\176\0\u04ec\0\u0516\0\u0540\0\u056a\0\u0594\0\u05be"+
+ "\0\u05e8\0\u0612\0\u063c\0\u0666\0\u0690\0\u06ba\0\u06e4\0\u070e"+
+ "\0\u0738\0\u0762\0\u078c\0\u07b6\0\u07e0\0\u080a\0\u0834\0\u085e"+
+ "\0\u0888\0\u08b2\0\u08dc\0\u0906\0\u0930\0\u095a\0\u0984\0\u09ae"+
+ "\0\u09d8\0\u0a02\0\u0a2c\0\u0a56\0\u0a80\0\u0aaa\0\u0ad4\0\u0afe"+
+ "\0\u0b28\0\u0b52\0\u0b7c\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e"+
+ "\0\u0c78\0\u0ca2\0\u0ccc\0\u0cf6\0\u0d20\0\u0d4a\0\u0d74\0\u0d9e"+
+ "\0\u0dc8\0\u0df2\0\u0e1c\0\u0e46\0\u0e70\0\u0e9a\0\u0ec4\0\u0eee"+
+ "\0\u0f18\0\u0f42\0\u0f6c\0\u0f96\0\u0fc0\0\u0fea\0\u1014\0\u103e"+
+ "\0\u1068\0\u1092\0\u10bc\0\u10e6\0\u1110\0\u113a\0\u1164\0\u118e"+
+ "\0\u11b8\0\u11e2\0\u120c\0\u1236\0\u1260\0\u128a\0\u12b4\0\u12de"+
+ "\0\u1308\0\u1332\0\u135c\0\u1386\0\u13b0\0\u13da\0\u1404\0\u142e"+
+ "\0\u1458\0\u1482\0\u14ac\0\u14d6\0\u1500\0\u152a\0\u1554\0\u157e"+
+ "\0\u15a8\0\u15d2\0\u15fc\0\374\0\u1626\0\u1650\0\u167a\0\u16a4"+
+ "\0\u16ce\0\u16f8\0\u1722\0\u174c\0\u1776\0\u17a0\0\u17ca\0\u17f4"+
+ "\0\u181e\0\u1848\0\u1872\0\u189c\0\u18c6\0\u18f0\0\u191a\0\u1944"+
+ "\0\u196e\0\u1998\0\u19c2\0\u19ec\0\u1a16\0\u1a40\0\u1a6a\0\u16f8"+
+ "\0\u1a94\0\u1abe\0\u1ae8\0\u1b12\0\u1b3c\0\u1b66\0\u1b90\0\u1bba"+
+ "\0\u1be4\0\u1c0e\0\u1c38\0\u174c\0\u1c62\0\u1c8c\0\u1cb6\0\u1ce0"+
+ "\0\u1d0a\0\u1d34\0\u1d5e\0\u1d88\0\u1db2\0\u1ddc\0\u1e06\0\u1e30"+
+ "\0\u1e5a\0\u1e84\0\u1eae\0\u1ed8\0\u1f02\0\u1f2c\0\u1b12\0\u1f56"+
+ "\0\u1f80\0\u1faa\0\u1fd4\0\u1ffe\0\u2028\0\u2052\0\u207c\0\u20a6"+
+ "\0\u20d0\0\u20fa\0\u2124\0\u214e\0\u2178\0\u21a2\0\u21cc\0\u21f6"+
+ "\0\u2220\0\u224a\0\u2274\0\u229e\0\u22c8\0\u22f2\0\u231c\0\u2346"+
+ "\0\u2370\0\u239a\0\u23c4\0\u23ee\0\u2418\0\u2442\0\u246c\0\u2496"+
+ "\0\u24c0\0\u24ea\0\u2514\0\u253e\0\u2568\0\176\0\u2592\0\u25bc"+
+ "\0\u25e6\0\u2610\0\u263a\0\u2664\0\u268e\0\u26b8\0\u26e2\0\u270c"+
+ "\0\u13da";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[257];
+ 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 =
+ "\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+ "\1\14\1\15\1\16\1\17\1\20\1\17\1\21\1\22"+
+ "\1\23\1\24\1\25\1\12\1\26\1\27\1\30\1\31"+
+ "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+ "\2\12\1\42\1\12\1\43\2\12\1\44\2\12\1\45"+
+ "\1\46\6\45\1\47\41\45\1\50\1\51\7\50\1\52"+
+ "\40\50\54\0\1\6\53\0\1\53\1\0\1\12\1\54"+
+ "\7\0\1\55\1\56\1\12\1\57\1\12\1\60\1\61"+
+ "\1\62\1\63\1\12\1\64\1\65\1\66\1\54\1\67"+
+ "\1\70\1\71\12\12\4\0\1\12\1\0\2\12\7\0"+
+ "\33\12\4\0\1\12\1\0\1\12\1\72\7\0\1\73"+
+ "\2\12\1\74\2\12\1\75\1\76\3\12\1\77\1\12"+
+ "\1\72\1\12\1\100\2\12\1\101\1\12\1\102\6\12"+
+ "\13\0\1\20\55\0\1\103\1\104\1\103\1\105\1\0"+
+ "\1\106\1\107\1\110\2\0\1\111\24\0\1\12\1\0"+
+ "\2\12\7\0\1\112\1\12\1\112\1\113\3\12\1\114"+
+ "\23\12\4\0\1\12\1\0\2\12\7\0\6\12\1\115"+
+ "\1\12\1\116\11\12\1\117\10\12\4\0\1\12\1\0"+
+ "\2\12\7\0\7\12\1\120\23\12\4\0\1\12\1\0"+
+ "\2\12\7\0\1\121\4\12\1\122\13\12\1\123\11\12"+
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\124\4\12"+
+ "\1\125\16\12\4\0\1\12\1\0\1\12\1\72\7\0"+
+ "\1\126\1\127\3\12\1\60\5\12\1\130\1\131\1\72"+
+ "\1\12\1\132\1\133\12\12\4\0\1\12\1\0\2\12"+
+ "\7\0\16\12\1\117\14\12\4\0\1\12\1\0\2\12"+
+ "\7\0\3\12\1\134\27\12\4\0\1\12\1\0\2\12"+
+ "\7\0\13\12\1\135\17\12\4\0\1\12\1\0\2\12"+
+ "\7\0\1\136\6\12\1\137\1\12\1\140\21\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\12\1\141\1\12\1\142"+
+ "\1\143\1\144\3\12\1\145\2\12\1\146\16\12\4\0"+
+ "\1\147\1\0\1\12\1\150\7\0\5\12\1\151\1\152"+
+ "\3\12\1\153\1\154\1\12\1\150\1\12\1\155\13\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\156\1\12"+
+ "\1\157\22\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+ "\1\160\1\161\4\12\1\162\16\12\4\0\1\12\1\0"+
+ "\2\12\7\0\6\12\1\163\24\12\4\0\1\12\1\0"+
+ "\2\12\7\0\14\12\1\164\16\12\4\0\1\12\1\0"+
+ "\2\12\7\0\10\12\1\165\11\12\1\166\10\12\4\0"+
+ "\1\12\1\0\2\12\7\0\3\12\1\167\27\12\1\45"+
+ "\1\0\6\45\1\0\41\45\1\50\1\0\7\50\1\0"+
+ "\40\50\4\0\1\12\1\0\2\12\7\0\14\12\1\170"+
+ "\16\12\4\0\1\12\1\0\2\12\7\0\7\12\1\171"+
+ "\7\12\1\100\13\12\4\0\1\12\1\0\2\12\7\0"+
+ "\7\12\1\172\23\12\4\0\1\12\1\0\2\12\7\0"+
+ "\6\12\1\115\24\12\4\0\1\12\1\0\2\12\7\0"+
+ "\6\12\1\173\3\12\1\174\6\12\1\175\11\12\4\0"+
+ "\1\12\1\0\2\12\7\0\14\12\1\125\16\12\4\0"+
+ "\1\12\1\0\1\12\1\72\7\0\1\12\1\176\11\12"+
+ "\1\130\1\12\1\72\2\12\1\133\12\12\4\0\1\12"+
+ "\1\0\2\12\7\0\11\12\1\177\21\12\4\0\1\12"+
+ "\1\0\2\12\7\0\3\12\1\200\27\12\4\0\1\12"+
+ "\1\0\2\12\7\0\1\201\32\12\4\0\1\12\1\0"+
+ "\2\12\7\0\4\12\1\143\7\12\1\146\16\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\202\11\12\1\203"+
+ "\13\12\4\0\1\12\1\0\2\12\7\0\10\12\1\204"+
+ "\22\12\4\0\1\12\1\0\2\12\7\0\6\12\1\205"+
+ "\1\206\4\12\1\207\16\12\4\0\1\12\1\0\2\12"+
+ "\7\0\1\135\32\12\4\0\1\12\1\0\2\12\7\0"+
+ "\7\12\1\133\23\12\4\0\1\12\1\0\2\12\7\0"+
+ "\7\12\1\210\23\12\4\0\1\12\1\0\2\12\7\0"+
+ "\14\12\1\211\16\12\4\0\1\12\1\0\2\12\7\0"+
+ "\1\212\12\12\1\135\4\12\1\133\12\12\4\0\1\12"+
+ "\1\0\2\12\7\0\5\12\1\213\5\12\1\214\3\12"+
+ "\1\215\13\12\4\0\1\12\1\0\2\12\7\0\4\12"+
+ "\1\143\7\12\1\113\16\12\4\0\1\12\1\0\2\12"+
+ "\7\0\16\12\1\216\14\12\4\0\1\12\1\0\2\12"+
+ "\7\0\6\12\1\217\24\12\4\0\1\12\1\0\1\12"+
+ "\1\71\7\0\15\12\1\71\15\12\20\0\1\220\1\0"+
+ "\1\220\56\0\1\221\45\0\1\220\50\0\1\220\53\0"+
+ "\1\222\54\0\1\220\47\0\1\223\30\0\1\12\1\0"+
+ "\2\12\7\0\1\12\1\224\1\12\1\224\27\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\224\25\12\4\0"+
+ "\1\12\1\0\2\12\7\0\2\12\1\225\30\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\214\25\12\4\0"+
+ "\1\12\1\0\2\12\7\0\6\12\1\226\24\12\4\0"+
+ "\1\12\1\0\2\12\7\0\3\12\1\113\27\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\12\1\227\31\12\4\0"+
+ "\1\12\1\0\2\12\7\0\13\12\1\230\17\12\4\0"+
+ "\1\231\1\0\2\12\7\0\33\12\4\0\1\12\1\0"+
+ "\2\12\7\0\14\12\1\202\1\12\1\232\14\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\135\25\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\202\25\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\233\6\12\1\172\23\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\234\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\113\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\5\12\1\202\11\12"+
+ "\1\235\13\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+ "\1\236\1\206\4\12\1\237\16\12\4\0\1\12\1\0"+
+ "\2\12\7\0\13\12\1\224\17\12\4\0\1\12\1\0"+
+ "\2\12\7\0\1\12\1\240\4\12\1\241\16\12\1\42"+
+ "\5\12\4\0\1\12\1\0\2\12\7\0\3\12\1\224"+
+ "\27\12\4\0\1\12\1\0\2\12\7\0\7\12\1\242"+
+ "\23\12\4\0\1\12\1\0\2\12\7\0\10\12\1\243"+
+ "\22\12\4\0\1\12\1\0\2\12\7\0\5\12\1\244"+
+ "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\175"+
+ "\23\12\4\0\1\12\1\0\2\12\7\0\1\245\32\12"+
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\202\22\12"+
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\212\30\12"+
+ "\4\0\1\12\1\0\2\12\7\0\20\12\1\246\12\12"+
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\113\2\12"+
+ "\1\214\25\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+ "\1\60\6\12\1\247\16\12\4\0\1\12\1\0\2\12"+
+ "\7\0\22\12\1\250\10\12\4\0\1\251\1\0\1\12"+
+ "\1\252\7\0\1\12\1\253\2\12\1\254\10\12\1\252"+
+ "\15\12\4\0\1\12\1\0\2\12\7\0\20\12\1\133"+
+ "\12\12\4\0\1\12\1\0\2\12\7\0\14\12\1\255"+
+ "\16\12\4\0\1\12\1\0\2\12\7\0\14\12\1\256"+
+ "\16\12\4\0\1\12\1\0\2\12\7\0\6\12\1\257"+
+ "\7\12\1\260\14\12\4\0\1\12\1\0\2\12\7\0"+
+ "\10\12\1\261\1\32\21\12\4\0\1\12\1\0\2\12"+
+ "\7\0\3\12\1\262\3\12\1\263\4\12\1\125\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\21\12\1\264\11\12"+
+ "\4\0\1\265\1\0\2\12\7\0\33\12\4\0\1\12"+
+ "\1\0\2\12\7\0\5\12\1\264\25\12\4\0\1\12"+
+ "\1\0\1\12\1\266\7\0\15\12\1\266\15\12\4\0"+
+ "\1\12\1\0\2\12\7\0\5\12\1\206\25\12\4\0"+
+ "\1\12\1\0\2\12\7\0\14\12\1\267\16\12\4\0"+
+ "\1\12\1\0\2\12\7\0\3\12\1\270\10\12\1\71"+
+ "\16\12\4\0\1\12\1\0\2\12\7\0\21\12\1\202"+
+ "\11\12\4\0\1\12\1\0\2\12\7\0\17\12\1\224"+
+ "\13\12\4\0\1\12\1\0\2\12\7\0\13\12\1\214"+
+ "\17\12\4\0\1\12\1\0\2\12\7\0\2\12\1\271"+
+ "\30\12\4\0\1\12\1\0\2\12\7\0\1\272\32\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\273\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\16\12\1\224\14\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\274\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\20\12\1\71\12\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\212\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\275\23\12"+
+ "\4\0\1\12\1\0\2\12\7\0\1\12\1\224\31\12"+
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\276\27\12"+
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\206\23\12"+
+ "\4\0\1\12\1\0\2\12\7\0\21\12\1\277\11\12"+
+ "\4\0\1\224\1\0\2\12\7\0\33\12\4\0\1\12"+
+ "\1\0\2\12\7\0\5\12\1\277\25\12\4\0\1\12"+
+ "\1\0\2\12\7\0\2\12\1\224\10\12\1\135\17\12"+
+ "\4\0\1\12\1\0\2\12\7\0\1\300\32\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\224\32\12\4\0\1\12"+
+ "\1\0\2\12\7\0\1\12\1\301\25\12\1\257\3\12"+
+ "\4\0\1\12\1\0\2\12\7\0\22\12\1\224\10\12"+
+ "\4\0\1\12\1\0\2\12\7\0\16\12\1\302\14\12"+
+ "\4\0\1\12\1\0\2\12\7\0\1\255\32\12\4\0"+
+ "\1\12\1\0\2\12\7\0\10\12\1\303\22\12\16\0"+
+ "\1\20\63\0\1\304\25\0\1\220\64\0\1\305\36\0"+
+ "\1\12\1\0\2\12\7\0\14\12\1\306\14\12\1\307"+
+ "\1\12\4\0\1\12\1\0\2\12\7\0\5\12\1\310"+
+ "\25\12\4\0\1\12\1\0\2\12\7\0\7\12\1\224"+
+ "\23\12\4\0\1\12\1\0\2\12\7\0\3\12\1\311"+
+ "\27\12\4\0\1\227\1\0\2\12\7\0\12\12\1\312"+
+ "\1\12\1\313\16\12\4\0\1\12\1\0\2\12\7\0"+
+ "\1\314\32\12\4\0\1\12\1\0\2\12\7\0\7\12"+
+ "\1\315\23\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+ "\1\316\25\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+ "\1\257\24\12\4\0\1\12\1\0\2\12\7\0\21\12"+
+ "\1\317\11\12\4\0\1\12\1\0\2\12\7\0\5\12"+
+ "\1\317\25\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+ "\1\320\21\12\4\0\1\224\1\0\2\12\7\0\1\224"+
+ "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\202"+
+ "\1\321\23\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+ "\1\322\10\12\1\275\13\12\4\0\1\12\1\0\1\12"+
+ "\1\323\7\0\15\12\1\323\15\12\4\0\1\12\1\0"+
+ "\2\12\7\0\3\12\1\324\27\12\4\0\1\12\1\0"+
+ "\2\12\7\0\10\12\1\325\22\12\4\0\1\12\1\0"+
+ "\2\12\7\0\5\12\1\202\11\12\1\224\13\12\4\0"+
+ "\1\12\1\0\2\12\7\0\6\12\1\321\24\12\4\0"+
+ "\1\12\1\0\2\12\7\0\3\12\1\255\27\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\326\32\12\4\0\1\12"+
+ "\1\0\2\12\7\0\3\12\1\327\27\12\4\0\1\12"+
+ "\1\0\2\12\7\0\11\12\1\330\21\12\4\0\1\12"+
+ "\1\0\2\12\7\0\21\12\1\224\11\12\4\0\1\12"+
+ "\1\0\2\12\7\0\2\12\1\113\30\12\4\0\1\12"+
+ "\1\0\2\12\7\0\2\12\1\224\30\12\4\0\1\12"+
+ "\1\0\2\12\7\0\6\12\1\331\24\12\4\0\1\12"+
+ "\1\0\1\12\1\332\7\0\15\12\1\332\15\12\4\0"+
+ "\1\12\1\0\2\12\7\0\2\12\1\333\30\12\4\0"+
+ "\1\12\1\0\2\12\7\0\26\12\1\224\2\12\1\224"+
+ "\1\12\4\0\1\12\1\0\2\12\7\0\11\12\1\334"+
+ "\21\12\4\0\1\12\1\0\2\12\7\0\23\12\1\335"+
+ "\7\12\4\0\1\12\1\0\2\12\7\0\1\12\1\135"+
+ "\31\12\4\0\1\12\1\0\2\12\7\0\10\12\1\135"+
+ "\22\12\4\0\1\12\1\0\2\12\7\0\31\12\1\307"+
+ "\1\12\4\0\1\12\1\0\2\12\7\0\1\336\32\12"+
+ "\4\0\1\12\1\0\2\12\7\0\11\12\1\337\21\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\202\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\5\12\1\340\25\12"+
+ "\4\0\1\12\1\0\2\12\7\0\31\12\1\224\1\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\341\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\342\5\12"+
+ "\1\343\16\12\4\0\1\12\1\0\2\12\7\0\1\251"+
+ "\32\12\4\0\1\12\1\0\2\12\7\0\6\12\1\344"+
+ "\24\12\22\0\1\345\61\0\1\304\23\0\1\12\1\0"+
+ "\1\12\1\200\7\0\15\12\1\200\15\12\4\0\1\12"+
+ "\1\0\2\12\7\0\26\12\1\224\4\12\4\0\1\12"+
+ "\1\0\2\12\7\0\13\12\1\346\17\12\4\0\1\12"+
+ "\1\0\2\12\7\0\14\12\1\313\10\12\1\347\5\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\71\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\12\12\1\224\20\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\350\16\12"+
+ "\4\0\1\12\1\0\1\12\1\351\7\0\15\12\1\351"+
+ "\15\12\4\0\1\12\1\0\2\12\7\0\32\12\1\224"+
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\113\22\12"+
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\224\22\12"+
+ "\4\0\1\12\1\0\2\12\7\0\1\212\32\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\12\1\352\31\12\4\0"+
+ "\1\12\1\0\1\12\1\202\7\0\15\12\1\202\15\12"+
+ "\4\0\1\12\1\0\2\12\7\0\7\12\1\353\23\12"+
+ "\4\0\1\12\1\0\2\12\7\0\11\12\1\354\21\12"+
+ "\4\0\1\12\1\0\2\12\7\0\2\12\1\355\30\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\270\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\17\12\1\356\13\12"+
+ "\4\0\1\12\1\0\2\12\7\0\14\12\1\340\16\12"+
+ "\4\0\1\12\1\0\2\12\7\0\10\12\1\357\22\12"+
+ "\4\0\1\12\1\0\2\12\7\0\1\360\32\12\4\0"+
+ "\1\12\1\0\2\12\7\0\13\12\1\361\17\12\4\0"+
+ "\1\12\1\0\2\12\7\0\7\12\1\362\23\12\4\0"+
+ "\1\12\1\0\2\12\7\0\1\202\32\12\4\0\1\12"+
+ "\1\0\2\12\7\0\13\12\1\352\17\12\4\0\1\12"+
+ "\1\0\2\12\7\0\5\12\1\257\25\12\4\0\1\12"+
+ "\1\0\2\12\7\0\14\12\1\363\16\12\4\0\1\12"+
+ "\1\0\2\12\7\0\5\12\1\364\25\12\4\0\1\12"+
+ "\1\0\1\12\1\365\7\0\15\12\1\365\15\12\16\0"+
+ "\1\366\37\0\1\12\1\0\2\12\7\0\12\12\1\355"+
+ "\20\12\4\0\1\12\1\0\2\12\7\0\22\12\1\367"+
+ "\10\12\4\0\1\12\1\0\1\12\1\370\7\0\15\12"+
+ "\1\370\15\12\4\0\1\12\1\0\2\12\7\0\6\12"+
+ "\1\371\24\12\4\0\1\12\1\0\2\12\7\0\14\12"+
+ "\1\372\16\12\4\0\1\12\1\0\2\12\7\0\11\12"+
+ "\1\373\21\12\4\0\1\135\1\0\2\12\7\0\33\12"+
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\321\27\12"+
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\365\27\12"+
+ "\4\0\1\12\1\0\2\12\7\0\6\12\1\170\24\12"+
+ "\4\0\1\12\1\0\2\12\7\0\3\12\1\224\3\12"+
+ "\1\224\23\12\4\0\1\12\1\0\2\12\7\0\16\12"+
+ "\1\374\14\12\4\0\1\12\1\0\1\12\1\375\7\0"+
+ "\15\12\1\375\15\12\4\0\1\12\1\0\2\12\7\0"+
+ "\5\12\1\133\25\12\4\0\1\12\1\0\2\12\7\0"+
+ "\11\12\1\135\21\12\4\0\1\12\1\0\2\12\7\0"+
+ "\1\12\1\355\31\12\4\0\1\12\1\0\2\12\7\0"+
+ "\3\12\1\270\27\12\4\0\1\12\1\0\2\12\7\0"+
+ "\14\12\1\202\16\12\4\0\1\12\1\0\2\12\7\0"+
+ "\1\12\1\376\31\12\4\0\1\12\1\0\2\12\7\0"+
+ "\7\12\1\113\23\12\4\0\1\12\1\0\2\12\7\0"+
+ "\1\12\1\377\31\12\4\0\1\12\1\0\2\12\7\0"+
+ "\6\12\1\u0100\24\12\4\0\1\12\1\0\2\12\7\0"+
+ "\6\12\1\267\24\12\4\0\1\12\1\0\2\12\7\0"+
+ "\3\12\1\u0101\2\12\1\177\24\12\4\0\1\12\1\0"+
+ "\2\12\7\0\14\12\1\124\16\12\4\0\1\12\1\0"+
+ "\1\12\1\135\7\0\15\12\1\135\15\12";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[10038];
+ 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 =
+ "\1\0\2\1\2\11\1\1\1\11\1\1\1\11\2\1"+
+ "\2\11\2\1\1\11\25\1\2\11\1\1\2\11\30\1"+
+ "\7\0\106\1\4\0\60\1\2\0\37\1\1\0\20\1"+
+ "\1\11\13\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[257];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. We must have this here as there is no default,
+ * no-parameter constructor generated by JFlex.
+ */
+ public FortranTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "!", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public FortranTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public FortranTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 168) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 15:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 17: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 18: break;
+ case 4:
+ { addToken(Token.WHITESPACE);
+ }
+ case 19: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 20: break;
+ case 13:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 21: break;
+ case 10:
+ { addToken(Token.OPERATOR);
+ }
+ case 22: break;
+ case 5:
+ { // Since we change zzStartRead, we have the unfortunate
+ // side-effect of not being able to use the '^' operator.
+ // So we must check whether we're really at the beginning
+ // of the line ourselves...
+ if (zzStartRead==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(Token.IDENTIFIER);
+ }
+ }
+ case 23: break;
+ case 16:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 24: break;
+ case 8:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 25: break;
+ case 7:
+ { addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 26: break;
+ case 6:
+ { // Since we change zzStartRead, we have the unfortunate
+ // side-effect of not being able to use the '^' operator.
+ // So we must check whether we're really at the beginning
+ // of the line ourselves...
+ if (zzStartRead==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_DOCUMENTATION);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(Token.IDENTIFIER);
+ }
+ }
+ case 27: break;
+ case 9:
+ { start = zzMarkedPos-1; yybegin(CHAR);
+ }
+ case 28: break;
+ case 14:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 29: break;
+ case 12:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 30: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 31: break;
+ case 1:
+ {
+ }
+ case 32: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 258: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 259: break;
+ case CHAR: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 260: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex
new file mode 100644
index 0000000..dfb7cfc
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex
@@ -0,0 +1,888 @@
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated GroovyTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class GroovyTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public GroovyTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = MULTILINE_STRING_DOUBLE;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = MULTILINE_STRING_SINGLE;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether a regular expression token can follow the specified
+ * token.
+ *
+ * @param t The token to check, which may be <code>null</code>.
+ * @return Whether a regular expression token may follow this one.
+ */
+ private static final boolean regexCanFollow(Token t) {
+ char ch;
+ return t==null ||
+ //t.isOperator() ||
+ (t.textCount==1 && (
+ (ch=t.text[t.textOffset])=='=' ||
+ ch=='(' ||
+ ch==',' ||
+ ch=='?' ||
+ ch==':' ||
+ ch=='['
+ )) ||
+ /* Operators "==", "===", "!=", "!==", etc. */
+ (t.type==Token.OPERATOR &&
+ ((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+BinaryDigit = ([0-1])
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
+UnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
+
+MLCBegin = "/*"
+MLCEnd = "*/"
+DocCommentBegin = "/**"
+LineCommentBegin = "//"
+
+DigitOrUnderscore = ({Digit}|[_])
+DigitsAndUnderscoresEnd = ({DigitOrUnderscore}*{Digit})
+IntegerHelper = (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0")
+IntegerLiteral = ({IntegerHelper}[lL]?)
+
+BinaryDigitOrUnderscore = ({BinaryDigit}|[_])
+BinaryDigitsAndUnderscores = ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?)
+BinaryLiteral = ("0"[bB]{BinaryDigitsAndUnderscores})
+
+HexDigitOrUnderscore = ({HexDigit}|[_])
+HexDigitsAndUnderscores = ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?)
+OctalDigitOrUnderscore = ({OctalDigit}|[_])
+OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit})
+HexHelper = ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd})))
+HexLiteral = ({HexHelper}[lL]?)
+
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+Regex = ([~]?"/"([^\*\\/]|\\.)([^/\\]|\\.)*"/")
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+GroovyOperator = ("=~")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator}|{GroovyOperator})
+
+CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag = ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+// Variables in strings
+VariableStart = ([\$])
+BracedVariable = ({VariableStart}\{[^\}]+\})
+UnbracedVariable = ({VariableStart}{Identifier})
+Variable = ({BracedVariable}|{UnbracedVariable})
+
+Annotation = ("@"{Identifier}?)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state MLC
+%state DOCCOMMENT
+%state MULTILINE_STRING_DOUBLE
+%state MULTILINE_STRING_SINGLE
+%state STRING_DOUBLE
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "abstract" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "continue" |
+ "default" |
+ "do" |
+ "else" |
+ "enum" |
+ "extends" |
+ "final" |
+ "finally" |
+ "for" |
+ "if" |
+ "it" |
+ "implements" |
+ "import" |
+ "instanceof" |
+ "interface" |
+ "native" |
+ "new" |
+ "null" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "static" |
+ "strictfp" |
+ "super" |
+ "switch" |
+ "synchronized" |
+ "this" |
+ "throw" |
+ "throws" |
+ "transient" |
+ "try" |
+ "void" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ /* Groovy keywords */
+ "as" |
+ "assert" |
+ "def" |
+ "mixin" |
+ "property" |
+ "test" |
+ "using" |
+ "in" { addToken(Token.RESERVED_WORD); }
+
+ /* Data types. */
+ "boolean" |
+ "byte" |
+ "char" |
+ "double" |
+ "float" |
+ "int" |
+ "long" |
+ "short" { addToken(Token.DATA_TYPE); }
+
+ /* Booleans. */
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ /* java.lang classes */
+ "Appendable" |
+ "AutoCloseable" |
+ "CharSequence" |
+ "Cloneable" |
+ "Comparable" |
+ "Iterable" |
+ "Readable" |
+ "Runnable" |
+ "Thread.UncaughtExceptionHandler" |
+ "Boolean" |
+ "Byte" |
+ "Character" |
+ "Character.Subset" |
+ "Character.UnicodeBlock" |
+ "Class" |
+ "ClassLoader" |
+ "Compiler" |
+ "Double" |
+ "Enum" |
+ "Float" |
+ "InheritableThreadLocal" |
+ "Integer" |
+ "Long" |
+ "Math" |
+ "Number" |
+ "Object" |
+ "Package" |
+ "Process" |
+ "ProcessBuilder" |
+ "ProcessBuilder.Redirect" |
+ "Runtime" |
+ "RuntimePermission" |
+ "SecurityManager" |
+ "Short" |
+ "StackTraceElement" |
+ "StrictMath" |
+ "String" |
+ "StringBuffer" |
+ "StringBuilder" |
+ "System" |
+ "Thread" |
+ "ThreadGroup" |
+ "ThreadLocal" |
+ "Throwable" |
+ "Void" |
+ "Character.UnicodeScript" |
+ "ProcessBuilder.Redirect.Type" |
+ "Thread.State" |
+ "ArithmeticException" |
+ "ArrayIndexOutOfBoundsException" |
+ "ArrayStoreException" |
+ "ClassCastException" |
+ "ClassNotFoundException" |
+ "CloneNotSupportedException" |
+ "EnumConstantNotPresentException" |
+ "Exception" |
+ "IllegalAccessException" |
+ "IllegalArgumentException" |
+ "IllegalMonitorStateException" |
+ "IllegalStateException" |
+ "IllegalThreadStateException" |
+ "IndexOutOfBoundsException" |
+ "InstantiationException" |
+ "InterruptedException" |
+ "NegativeArraySizeException" |
+ "NoSuchFieldException" |
+ "NoSuchMethodException" |
+ "NullPointerException" |
+ "NumberFormatException" |
+ "RuntimeException" |
+ "SecurityException" |
+ "StringIndexOutOfBoundsException" |
+ "TypeNotPresentException" |
+ "UnsupportedOperationException" |
+ "AbstractMethodError" |
+ "AssertionError" |
+ "ClassCircularityError" |
+ "ClassFormatError" |
+ "Error" |
+ "ExceptionInInitializerError" |
+ "IllegalAccessError" |
+ "IncompatibleClassChangeError" |
+ "InstantiationError" |
+ "InternalError" |
+ "LinkageError" |
+ "NoClassDefFoundError" |
+ "NoSuchFieldError" |
+ "NoSuchMethodError" |
+ "OutOfMemoryError" |
+ "StackOverflowError" |
+ "ThreadDeath" |
+ "UnknownError" |
+ "UnsatisfiedLinkError" |
+ "UnsupportedClassVersionError" |
+ "VerifyError" |
+ "VirtualMachineError" |
+
+ /* java.io classes*/
+ "Closeable" |
+ "DataInput" |
+ "DataOutput" |
+ "Externalizable" |
+ "FileFilter" |
+ "FilenameFilter" |
+ "Flushable" |
+ "ObjectInput" |
+ "ObjectInputValidation" |
+ "ObjectOutput" |
+ "ObjectStreamConstants" |
+ "Serializable" |
+
+ "BufferedInputStream" |
+ "BufferedOutputStream" |
+ "BufferedReader" |
+ "BufferedWriter" |
+ "ByteArrayInputStream" |
+ "ByteArrayOutputStream" |
+ "CharArrayReader" |
+ "CharArrayWriter" |
+ "Console" |
+ "DataInputStream" |
+ "DataOutputStream" |
+ "File" |
+ "FileDescriptor" |
+ "FileInputStream" |
+ "FileOutputStream" |
+ "FilePermission" |
+ "FileReader" |
+ "FileWriter" |
+ "FilterInputStream" |
+ "FilterOutputStream" |
+ "FilterReader" |
+ "FilterWriter" |
+ "InputStream" |
+ "InputStreamReader" |
+ "LineNumberInputStream" |
+ "LineNumberReader" |
+ "ObjectInputStream" |
+ "ObjectInputStream.GetField" |
+ "ObjectOutputStream" |
+ "ObjectOutputStream.PutField" |
+ "ObjectStreamClass" |
+ "ObjectStreamField" |
+ "OutputStream" |
+ "OutputStreamWriter" |
+ "PipedInputStream" |
+ "PipedOutputStream" |
+ "PipedReader" |
+ "PipedWriter" |
+ "PrintStream" |
+ "PrintWriter" |
+ "PushbackInputStream" |
+ "PushbackReader" |
+ "RandomAccessFile" |
+ "Reader" |
+ "SequenceInputStream" |
+ "SerializablePermission" |
+ "StreamTokenizer" |
+ "StringBufferInputStream" |
+ "StringReader" |
+ "StringWriter" |
+ "Writer" |
+
+ "CharConversionException" |
+ "EOFException" |
+ "FileNotFoundException" |
+ "InterruptedIOException" |
+ "InvalidClassException" |
+ "InvalidObjectException" |
+ "IOException" |
+ "NotActiveException" |
+ "NotSerializableException" |
+ "ObjectStreamException" |
+ "OptionalDataException" |
+ "StreamCorruptedException" |
+ "SyncFailedException" |
+ "UnsupportedEncodingException" |
+ "UTFDataFormatException" |
+ "WriteAbortedException" |
+
+ "IOError" |
+
+ /* java.util classes */
+ "Collection" |
+ "Comparator" |
+ "Deque" |
+ "Enumeration" |
+ "EventListener" |
+ "Formattable" |
+ "Iterator" |
+ "List" |
+ "ListIterator" |
+ "Map" |
+ "Map.Entry" |
+ "NavigableMap" |
+ "NavigableSet" |
+ "Observer" |
+ "Queue" |
+ "RandomAccess" |
+ "Set" |
+ "SortedMap" |
+ "SortedSet" |
+
+ "AbstractCollection" |
+ "AbstractList" |
+ "AbstractMap" |
+ "AbstractMap.SimpleEntry" |
+ "AbstractMap.SimpleImmutableEntry" |
+ "AbstractQueue" |
+ "AbstractSequentialList" |
+ "AbstractSet" |
+ "ArrayDeque" |
+ "ArrayList" |
+ "Arrays" |
+ "BitSet" |
+ "Calendar" |
+ "Collections" |
+ "Currency" |
+ "Date" |
+ "Dictionary" |
+ "EnumMap" |
+ "EnumSet" |
+ "EventListenerProxy" |
+ "EventObject" |
+ "FormattableFlags" |
+ "Formatter" |
+ "GregorianCalendar" |
+ "HashMap" |
+ "HashSet" |
+ "Hashtable" |
+ "IdentityHashMap" |
+ "LinkedHashMap" |
+ "LinkedHashSet" |
+ "LinkedList" |
+ "ListResourceBundle" |
+ "Locale" |
+ "Locale.Builder" |
+ "Objects" |
+ "Observable" |
+ "PriorityQueue" |
+ "Properties" |
+ "PropertyPermission" |
+ "PropertyResourceBundle" |
+ "Random" |
+ "ResourceBundle" |
+ "ResourceBundle.Control" |
+ "Scanner" |
+ "ServiceLoader" |
+ "SimpleTimeZone" |
+ "Stack" |
+ "StringTokenizer" |
+ "Timer" |
+ "TimerTask" |
+ "TimeZone" |
+ "TreeMap" |
+ "TreeSet" |
+ "UUID" |
+ "Vector" |
+ "WeakHashMap" |
+
+ "Formatter.BigDecimalLayoutForm" |
+ "Locale.Category" |
+
+ "ConcurrentModificationException" |
+ "DuplicateFormatFlagsException" |
+ "EmptyStackException" |
+ "FormatFlagsConversionMismatchException" |
+ "FormatterClosedException" |
+ "IllegalFormatCodePointException" |
+ "IllegalFormatConversionException" |
+ "IllegalFormatException" |
+ "IllegalFormatFlagsException" |
+ "IllegalFormatPrecisionException" |
+ "IllegalFormatWidthException" |
+ "IllformedLocaleException" |
+ "InputMismatchException" |
+ "InvalidPropertiesFormatException" |
+ "MissingFormatArgumentException" |
+ "MissingFormatWidthException" |
+ "MissingResourceException" |
+ "NoSuchElementException" |
+ "TooManyListenersException" |
+ "UnknownFormatConversionException" |
+ "UnknownFormatFlagsException" |
+
+ "ServiceConfigurationError" { addToken(Token.FUNCTION); }
+
+ /* Commonly used methods added to Object class */
+ "addShutdownHook" |
+ "any" |
+ "asBoolean" |
+ "asType" |
+ "collect" |
+ "dump" |
+ "each" |
+ "eachWithIndex" |
+ "every" |
+ "find" |
+ "findAll" |
+ "findIndexOf" |
+ "findIndexValues" |
+ "findLastIndexOf" |
+ "getAt" |
+ "getMetaClass" |
+ "getMetaPropertyValues" |
+ "getProperties" |
+ "grep" |
+ "hasProperty" |
+ "identity" |
+ "inject" |
+ "inspect" |
+ "invokeMethod" |
+ "is" |
+ "isCase" |
+ "iterator" |
+ "metaClass" |
+ "print" |
+ "printf" |
+ "println" |
+ "putAt" |
+ "respondsTo" |
+ "setMetaClass" |
+ "sleep" |
+ "split" |
+ "sprintf" |
+ "toString" |
+ "use" |
+ "with" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* Multiline string literals. */
+ \"\"\" { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
+ \'\'\' { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE); }
+
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ \" { start = zzMarkedPos-1; yybegin(STRING_DOUBLE); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {DocCommentBegin} { start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Regular expressions. */
+ {Regex} {
+ boolean highlightedAsRegex = false;
+ if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (regexCanFollow(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* Annotations. */
+ {Annotation} { addToken(Token.ANNOTATION); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {BinaryLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+ [^hwf\@\{\n\<\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+ [hwf] {}
+
+ "@"{BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ "@" {}
+ "{@"{InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ "{" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+ "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
+ \< {}
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+ \* {}
+ <<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<MULTILINE_STRING_DOUBLE> {
+ [^\"\\\$\n]* {}
+ \\.? { /* Skip escaped chars, handles case: '\"""'. */ }
+ \"\"\" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \" {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MULTILINE_STRING_SINGLE> {
+ [^\'\\\n]* {}
+ \\.? { /* Skip escaped chars, handles case: "\'''". */ }
+ \'\'\' { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR); }
+ \' {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+<STRING_DOUBLE> {
+ [^\n\\\$\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java
new file mode 100644
index 0000000..ae909e5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java
@@ -0,0 +1,5269 @@
+/* The following code was generated by JFlex 1.4.1 on 11/11/12 7:19 PM */
+
+/*
+ * 09/28/2007
+ *
+ * GroovyTokenMaker.java - Scanner for the Groovy programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Groovy programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated GroovyTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class GroovyTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int MULTILINE_STRING_DOUBLE = 3;
+ public static final int DOCCOMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 1;
+ public static final int STRING_DOUBLE = 5;
+ public static final int MULTILINE_STRING_SINGLE = 4;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\22\1\21\1\0\1\22\1\16\22\0\1\22\1\53\1\13"+
+ "\1\17\1\20\1\53\1\55\1\10\2\44\1\24\1\46\1\45\1\33"+
+ "\1\34\1\23\1\4\1\5\2\7\4\7\2\3\1\56\1\45\1\47"+
+ "\1\50\1\52\1\54\1\100\1\102\1\26\1\6\1\67\1\32\1\31"+
+ "\1\116\1\110\1\105\2\1\1\25\1\111\1\112\1\113\1\115\1\121"+
+ "\1\74\1\103\1\106\1\107\1\117\1\120\1\30\1\1\1\122\1\44"+
+ "\1\12\1\44\1\51\1\2\1\0\1\40\1\27\1\63\1\61\1\37"+
+ "\1\15\1\72\1\57\1\65\1\114\1\75\1\41\1\66\1\14\1\60"+
+ "\1\62\1\104\1\36\1\42\1\35\1\11\1\71\1\70\1\64\1\73"+
+ "\1\101\1\76\1\51\1\77\1\43\uff81\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 =
+ "\3\0\2\1\1\0\1\2\1\3\2\4\1\3\1\5"+
+ "\1\3\1\6\2\3\1\2\1\7\1\10\2\11\5\3"+
+ "\1\11\7\3\1\11\1\12\1\3\6\11\13\3\1\13"+
+ "\16\3\2\1\1\14\5\1\1\15\7\1\1\16\2\1"+
+ "\1\17\2\1\1\20\1\21\1\22\1\23\1\24\1\2"+
+ "\2\25\1\26\1\4\1\25\1\26\2\25\1\27\2\25"+
+ "\5\3\1\5\1\30\1\5\1\0\1\3\1\0\7\3"+
+ "\2\0\1\31\1\32\1\11\36\3\1\33\12\3\2\0"+
+ "\1\11\3\3\1\33\7\3\3\33\1\34\21\3\1\13"+
+ "\56\3\2\0\1\35\4\0\1\36\2\0\1\37\16\0"+
+ "\1\16\1\0\1\40\2\0\1\20\1\22\1\2\1\4"+
+ "\1\26\1\0\2\27\1\4\1\27\10\3\1\30\1\41"+
+ "\1\5\1\42\1\5\1\0\1\34\1\3\1\43\5\3"+
+ "\1\44\1\45\64\3\1\33\13\3\1\46\27\3\1\2"+
+ "\46\3\1\34\30\3\33\0\1\47\2\0\1\50\1\2"+
+ "\2\25\12\3\1\42\1\5\1\0\4\3\1\34\1\51"+
+ "\3\3\1\34\3\3\1\34\2\3\1\46\4\3\2\34"+
+ "\6\3\1\52\5\3\1\34\53\3\1\2\51\3\1\0"+
+ "\32\3\2\0\1\53\2\0\1\54\15\0\1\55\11\0"+
+ "\1\40\1\2\2\3\1\34\10\3\1\5\1\0\1\33"+
+ "\40\3\1\33\17\3\1\34\22\3\1\2\11\3\1\34"+
+ "\27\3\1\34\6\3\1\0\32\3\34\0\1\2\14\3"+
+ "\1\5\1\0\4\3\1\34\33\3\1\56\31\3\1\34"+
+ "\1\2\11\3\1\34\26\3\1\34\10\3\1\0\2\3"+
+ "\1\34\10\3\1\34\13\3\23\0\12\3\1\0\2\3"+
+ "\1\0\46\3\1\34\2\3\1\2\40\3\1\0\11\3"+
+ "\1\0\23\3\1\34\7\3\5\0\1\55\4\0\14\3"+
+ "\2\0\101\3\2\0\7\3\1\0\33\3\11\0\4\3"+
+ "\1\34\6\3\2\0\5\3\1\34\10\3\1\34\11\3"+
+ "\1\34\45\3\2\0\6\3\1\34\25\3\5\0\4\3"+
+ "\1\0\2\3\1\34\2\3\2\0\3\3\1\0\55\3"+
+ "\2\0\27\3\5\0\3\3\2\0\3\3\2\0\3\3"+
+ "\1\0\1\34\14\3\1\34\14\3\1\34\12\3\2\0"+
+ "\14\3\1\34\4\3\2\0\2\3\2\0\3\3\2\0"+
+ "\3\3\1\0\10\3\1\34\3\3\1\0\1\3\1\34"+
+ "\2\3\1\34\16\3\1\0\13\3\1\34\3\3\1\34"+
+ "\4\3\2\0\2\3\1\0\2\3\1\0\2\3\1\34"+
+ "\10\3\1\0\12\3\1\0\21\3\2\0\3\3\1\0"+
+ "\5\3\1\34\1\3\1\0\12\3\1\0\14\3\1\34"+
+ "\2\0\3\3\1\0\4\3\1\0\1\3\1\0\11\3"+
+ "\1\0\11\3\2\0\2\3\1\0\2\3\1\0\1\3"+
+ "\1\0\7\3\1\0\6\3\2\0\1\3\1\0\1\3"+
+ "\1\0\1\3\1\0\4\3\1\0\3\3\1\34\1\3"+
+ "\3\0\1\3\1\0\1\3\1\0\1\3\1\0\2\3"+
+ "\1\0\3\3\1\0\1\34\3\0\1\3\1\0\1\3"+
+ "\2\0\2\3\1\0\2\3\5\0\1\3\1\0\1\3"+
+ "\2\0\1\3\6\0\1\3\1\0\1\3\16\0\1\34"+
+ "\23\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[1876];
+ 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\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+ "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u048a\0\u04dd"+
+ "\0\u0530\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722"+
+ "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u09ba"+
+ "\0\u0a0d\0\u0a60\0\u0ab3\0\u0530\0\u0530\0\u0b06\0\u0b59\0\u0bac"+
+ "\0\u0bff\0\u0530\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1"+
+ "\0\u0e44\0\u0e97\0\u0eea\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089"+
+ "\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b\0\u12ce\0\u1321"+
+ "\0\u1374\0\u13c7\0\u141a\0\u146d\0\u14c0\0\u1513\0\u1566\0\u0530"+
+ "\0\u15b9\0\u160c\0\u165f\0\u16b2\0\u1705\0\u0530\0\u1758\0\u17ab"+
+ "\0\u17fe\0\u1851\0\u18a4\0\u18f7\0\u194a\0\u199d\0\u19f0\0\u1a43"+
+ "\0\u0530\0\u1a96\0\u1ae9\0\u1b3c\0\u0530\0\u1b8f\0\u0530\0\u0530"+
+ "\0\u1be2\0\u1c35\0\u1c88\0\u1c35\0\u1c35\0\u1cdb\0\u1d2e\0\u1d81"+
+ "\0\u1dd4\0\u1e27\0\u1e7a\0\u1ecd\0\u1f20\0\u1f73\0\u1fc6\0\u2019"+
+ "\0\u206c\0\u20bf\0\u2112\0\u2165\0\u21b8\0\u220b\0\u225e\0\u22b1"+
+ "\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u24a3\0\u24f6\0\u2549"+
+ "\0\u259c\0\u25ef\0\u24f6\0\u2642\0\u2695\0\u26e8\0\u273b\0\u278e"+
+ "\0\u27e1\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980\0\u29d3\0\u2a26"+
+ "\0\u2a79\0\u2acc\0\u2b1f\0\u2b72\0\u2bc5\0\u2c18\0\u2c6b\0\u2cbe"+
+ "\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u2f03\0\u2f56"+
+ "\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u319b\0\u31ee"+
+ "\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u0629\0\u33e0\0\u3433"+
+ "\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678\0\u36cb"+
+ "\0\u371e\0\u3771\0\u37c4\0\u0245\0\u3817\0\u386a\0\u38bd\0\u3910"+
+ "\0\u3963\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8"+
+ "\0\u3bfb\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a\0\u3ded\0\u3e40"+
+ "\0\u3e93\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8"+
+ "\0\u412b\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u431d\0\u4370"+
+ "\0\u43c3\0\u4416\0\u4469\0\u44bc\0\u450f\0\u4562\0\u45b5\0\u4608"+
+ "\0\u465b\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa\0\u484d\0\u48a0"+
+ "\0\u48f3\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92\0\u4ae5\0\u4b38"+
+ "\0\u4b8b\0\u4bde\0\u4c31\0\u4c84\0\u4cd7\0\u4d2a\0\u4d7d\0\u4dd0"+
+ "\0\u0530\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u0530\0\u4f6f\0\u4fc2"+
+ "\0\u0530\0\u5015\0\u5068\0\u50bb\0\u510e\0\u5161\0\u51b4\0\u5207"+
+ "\0\u525a\0\u52ad\0\u5300\0\u5353\0\u53a6\0\u53f9\0\u544c\0\u0530"+
+ "\0\u549f\0\u54f2\0\u5545\0\u5598\0\u0530\0\u0530\0\u55eb\0\u563e"+
+ "\0\u5691\0\u56e4\0\u5737\0\u1c35\0\u578a\0\u57dd\0\u5830\0\u5883"+
+ "\0\u58d6\0\u5929\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u0530\0\u0530"+
+ "\0\u5ac8\0\u21b8\0\u5b1b\0\u5b6e\0\u0245\0\u5bc1\0\u0530\0\u5c14"+
+ "\0\u5c67\0\u5cba\0\u5d0d\0\u5d60\0\u0530\0\u5db3\0\u5e06\0\u5e59"+
+ "\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e\0\u60f1"+
+ "\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336\0\u6389"+
+ "\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce\0\u6621"+
+ "\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866\0\u68b9"+
+ "\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe\0\u6b51"+
+ "\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43\0\u6d96\0\u6de9"+
+ "\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb\0\u702e\0\u7081"+
+ "\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273\0\u72c6\0\u7319"+
+ "\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b\0\u755e\0\u75b1"+
+ "\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3\0\u77f6\0\u7849"+
+ "\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u7a3b\0\u7a8e\0\u7ae1"+
+ "\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3\0\u7d26\0\u7d79"+
+ "\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b\0\u7fbe\0\u8011"+
+ "\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203\0\u8256\0\u82a9"+
+ "\0\u82fc\0\u834f\0\u83a2\0\u83f5\0\u8448\0\u849b\0\u84ee\0\u8541"+
+ "\0\u8594\0\u85e7\0\u863a\0\u868d\0\u86e0\0\u8733\0\u8786\0\u87d9"+
+ "\0\u882c\0\u887f\0\u88d2\0\u8925\0\u8978\0\u89cb\0\u8a1e\0\u8a71"+
+ "\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd\0\u8c10\0\u8c63\0\u8cb6\0\u8d09"+
+ "\0\u8d5c\0\u8daf\0\u8e02\0\u8e55\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1"+
+ "\0\u8ff4\0\u9047\0\u909a\0\u90ed\0\u9140\0\u9193\0\u91e6\0\u9239"+
+ "\0\u928c\0\u92df\0\u9332\0\u9385\0\u93d8\0\u942b\0\u947e\0\u94d1"+
+ "\0\u9524\0\u9577\0\u95ca\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769"+
+ "\0\u97bc\0\u0530\0\u980f\0\u9862\0\u0530\0\u98b5\0\u578a\0\u9908"+
+ "\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7\0\u9afa\0\u9b4d\0\u9ba0"+
+ "\0\u9bf3\0\u9c46\0\u0530\0\u9c99\0\u9cec\0\u9d3f\0\u9d92\0\u9de5"+
+ "\0\u9e38\0\u9e8b\0\u0530\0\u9ede\0\u9f31\0\u9f84\0\u9fd7\0\ua02a"+
+ "\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\u0245\0\ua21c\0\ua26f"+
+ "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+ "\0\ua55a\0\ua5ad\0\u0245\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c"+
+ "\0\ua79f\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4"+
+ "\0\uaa37\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c"+
+ "\0\uaccf\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14"+
+ "\0\uaf67\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac"+
+ "\0\ub1ff\0\ub252\0\ub2a5\0\ub2f8\0\ub34b\0\ub39e\0\ub3f1\0\ub444"+
+ "\0\ub497\0\ub4ea\0\ub53d\0\ub590\0\ub5e3\0\ub636\0\ub689\0\ub6dc"+
+ "\0\ub72f\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921\0\ub974"+
+ "\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\ubb13\0\ubb66\0\ubbb9\0\ubc0c"+
+ "\0\ubc5f\0\ubcb2\0\ubd05\0\ubd58\0\ubdab\0\ubdfe\0\ube51\0\ubea4"+
+ "\0\ubef7\0\ubf4a\0\ubf9d\0\ubff0\0\uc043\0\uc096\0\uc0e9\0\uc13c"+
+ "\0\uc18f\0\uc1e2\0\uc235\0\uc288\0\uc2db\0\uc32e\0\uc381\0\uc3d4"+
+ "\0\uc427\0\uc47a\0\uc4cd\0\uc520\0\uc573\0\uc5c6\0\uc619\0\uc66c"+
+ "\0\uc6bf\0\uc712\0\uc765\0\uc7b8\0\uc80b\0\uc85e\0\uc8b1\0\uc904"+
+ "\0\uc957\0\uc9aa\0\uc9fd\0\uca50\0\ucaa3\0\ucaf6\0\ucb49\0\ucb9c"+
+ "\0\ucbef\0\ucc42\0\ucc95\0\ucce8\0\ucd3b\0\ucd8e\0\ucde1\0\uce34"+
+ "\0\uce87\0\uceda\0\ucf2d\0\ucf80\0\ucfd3\0\ud026\0\ud079\0\ud0cc"+
+ "\0\ud11f\0\ud172\0\ud1c5\0\ud218\0\u0530\0\ud26b\0\ud2be\0\ud311"+
+ "\0\ud364\0\ud3b7\0\ud40a\0\ud45d\0\ud4b0\0\ud503\0\u0530\0\ud556"+
+ "\0\ud5a9\0\ud5fc\0\ud64f\0\ud6a2\0\ud6f5\0\ud748\0\ud79b\0\ud7ee"+
+ "\0\ud841\0\ud894\0\ud8e7\0\ud93a\0\ud98d\0\ud9e0\0\uda33\0\uda86"+
+ "\0\udad9\0\udb2c\0\udb7f\0\udbd2\0\udc25\0\udc78\0\udccb\0\udd1e"+
+ "\0\udd71\0\uddc4\0\ude17\0\ude6a\0\udebd\0\udf10\0\udf63\0\udfb6"+
+ "\0\ue009\0\ue05c\0\ue0af\0\ue102\0\ue155\0\ue1a8\0\ue1fb\0\ue24e"+
+ "\0\ue2a1\0\ue2f4\0\ue347\0\ue39a\0\ue3ed\0\ue440\0\u6674\0\ue493"+
+ "\0\ue4e6\0\ue539\0\ue58c\0\ue5df\0\ue632\0\ue685\0\ue6d8\0\ue72b"+
+ "\0\ue77e\0\ue7d1\0\ue824\0\ue877\0\ue8ca\0\ue91d\0\ue970\0\ue9c3"+
+ "\0\uea16\0\uea69\0\ueabc\0\ueb0f\0\ueb62\0\uebb5\0\uec08\0\uec5b"+
+ "\0\uecae\0\ued01\0\ued54\0\ueda7\0\uedfa\0\uee4d\0\ueea0\0\ueef3"+
+ "\0\uef46\0\uef99\0\uefec\0\uf03f\0\uf092\0\uf0e5\0\uf138\0\uf18b"+
+ "\0\uf1de\0\uf231\0\uf284\0\uf2d7\0\uf32a\0\uf37d\0\uf3d0\0\uf423"+
+ "\0\uf476\0\uf4c9\0\uf51c\0\uf56f\0\uf5c2\0\uf615\0\uf668\0\uf6bb"+
+ "\0\uf70e\0\uf761\0\uf7b4\0\uf807\0\uf85a\0\uf8ad\0\uf900\0\uf953"+
+ "\0\uf9a6\0\uf9f9\0\ufa4c\0\ufa9f\0\ufaf2\0\ufb45\0\ufb98\0\ufbeb"+
+ "\0\ufc3e\0\ufc91\0\ufce4\0\ufd37\0\ufd8a\0\ufddd\0\ufe30\0\ufe83"+
+ "\0\ufed6\0\uff29\0\uff7c\0\uffcf\1\42\1\165\1\310\1\u011b"+
+ "\1\u016e\1\u01c1\1\u0214\1\u0267\1\u02ba\1\u030d\1\u0360\1\u03b3"+
+ "\1\u0406\1\u0459\1\u04ac\1\u04ff\1\u0552\1\u05a5\0\ucce8\1\u05f8"+
+ "\0\ucde1\1\u064b\1\u069e\1\u06f1\1\u0744\1\u0797\1\u07ea\1\u083d"+
+ "\1\u0890\1\u08e3\1\u0936\1\u0989\1\u09dc\1\u0a2f\1\u0a82\1\u0ad5"+
+ "\1\u0b28\1\u0b7b\1\u0bce\1\u0c21\1\u0c74\1\u0cc7\1\u0d1a\1\u0d6d"+
+ "\1\u0dc0\1\u0e13\1\u0e66\1\u0eb9\1\u0f0c\1\u0f5f\1\u0fb2\1\u1005"+
+ "\1\u1058\1\u10ab\1\u10fe\1\u1151\1\u11a4\1\u11f7\1\u124a\1\u129d"+
+ "\1\u12f0\1\u1343\1\u1396\1\u13e9\1\u143c\1\u148f\1\u14e2\1\u1535"+
+ "\1\u1588\0\u3817\1\u15db\1\u162e\1\u1681\1\u16d4\1\u1727\1\u177a"+
+ "\1\u17cd\1\u1820\1\u1873\1\u18c6\1\u1919\1\u196c\1\u19bf\1\u1a12"+
+ "\1\u1a65\1\u1ab8\1\u1b0b\1\u1b5e\1\u1bb1\1\u1c04\1\u1c57\1\u1caa"+
+ "\0\u0245\1\u1cfd\1\u1d50\1\u1da3\1\u1df6\1\u1e49\1\u1e9c\1\u1eef"+
+ "\1\u1f42\1\u1f95\1\u1fe8\1\u203b\1\u208e\1\u20e1\1\u2134\1\u2187"+
+ "\1\u21da\1\u222d\1\u2280\1\u22d3\1\u2326\1\u2379\1\u23cc\1\u241f"+
+ "\1\u2472\1\u24c5\1\u2518\1\u256b\1\u25be\1\u2611\1\u2664\1\u26b7"+
+ "\1\u270a\1\u275d\1\u27b0\1\u2803\1\u2856\1\u28a9\1\u28fc\1\u294f"+
+ "\1\u29a2\1\u29f5\1\u2a48\1\u2a9b\1\u2aee\1\u2b41\1\u2b94\1\u2be7"+
+ "\1\u2c3a\1\u2c8d\1\u2ce0\1\u2d33\1\u2d86\1\u2dd9\1\u2e2c\1\u2e7f"+
+ "\1\u2ed2\1\u2f25\1\u2f78\1\u2fcb\1\u301e\1\u3071\1\u30c4\1\u3117"+
+ "\1\u316a\1\u31bd\1\u3210\1\u3263\1\u32b6\1\u3309\1\u335c\1\u33af"+
+ "\1\u3402\1\u3455\1\u34a8\1\u34fb\1\u354e\1\u35a1\1\u35f4\1\u3647"+
+ "\1\u369a\1\u36ed\1\u3740\1\u3793\1\u37e6\1\u3839\1\u388c\1\u38df"+
+ "\1\u3932\1\u3985\1\u39d8\1\u3a2b\1\u3a7e\1\u3ad1\1\u3b24\1\u3b77"+
+ "\1\u3bca\1\u3c1d\1\u3c70\1\u3cc3\1\u3d16\1\u3d69\1\u3dbc\1\u3e0f"+
+ "\1\u3e62\1\u3eb5\1\u3f08\1\u3f5b\1\u3fae\1\u4001\1\u4054\1\u40a7"+
+ "\1\u40fa\1\u414d\1\u41a0\1\u41f3\1\u4246\1\u4299\1\u42ec\1\u433f"+
+ "\1\u4392\1\u43e5\1\u4438\1\u448b\1\u44de\1\u4531\1\u4584\1\u45d7"+
+ "\1\u462a\1\u467d\1\u46d0\1\u4723\1\u4776\1\u47c9\1\u481c\1\u486f"+
+ "\1\u48c2\1\u4915\1\u4968\1\u49bb\1\u4a0e\1\u4a61\1\u4ab4\1\u4b07"+
+ "\1\u4b5a\1\u4bad\1\u4c00\1\u4c53\1\u4ca6\1\u4cf9\1\u4d4c\1\u4d9f"+
+ "\1\u4df2\1\u4e45\1\u4e98\1\u4eeb\1\u4f3e\1\u4f91\1\u4fe4\1\u5037"+
+ "\1\u508a\1\u50dd\1\u5130\1\u5183\1\u51d6\1\u5229\1\u527c\1\u52cf"+
+ "\1\u5322\1\u5375\1\u53c8\1\u541b\1\u546e\1\u54c1\1\u5514\1\u5567"+
+ "\1\u55ba\1\u560d\1\u5660\1\u56b3\1\u5706\1\u5759\1\u57ac\1\u57ff"+
+ "\1\u5852\1\u58a5\1\u58f8\1\u594b\1\u599e\1\u59f1\1\u5a44\1\u5a97"+
+ "\1\u5aea\1\u5b3d\1\u5b90\1\u5be3\1\u5c36\1\u5c89\1\u5cdc\1\u5d2f"+
+ "\1\u5d82\1\u5dd5\1\u5e28\1\u5e7b\1\u5ece\1\u5f21\1\u5f74\1\u5fc7"+
+ "\1\u601a\1\u3402\1\u606d\1\u60c0\1\u6113\1\u6166\1\u61b9\1\u620c"+
+ "\1\u625f\1\u62b2\1\u6305\1\u6358\1\u63ab\1\u63fe\1\u6451\1\u64a4"+
+ "\1\u64f7\1\u654a\1\u659d\1\u65f0\1\u6643\1\u6696\1\u66e9\1\u673c"+
+ "\1\u678f\1\u67e2\1\u6835\1\u6888\1\u68db\1\u692e\1\u6981\1\u69d4"+
+ "\1\u6a27\1\u6a7a\1\u6acd\1\u6b20\1\u6b73\1\u6bc6\1\u6c19\1\u6c6c"+
+ "\1\u6cbf\1\u6d12\1\u6d65\1\u6db8\1\u6e0b\1\u6e5e\1\u6eb1\1\u6f04"+
+ "\1\u6f57\1\u6faa\1\u6ffd\1\u7050\1\u70a3\1\u70f6\1\u7149\1\u719c"+
+ "\1\u71ef\1\u7242\1\u7295\1\u72e8\1\u733b\1\u738e\1\u73e1\1\u7434"+
+ "\1\u7487\1\u74da\1\u752d\1\u7580\1\u75d3\1\u7626\1\u7679\1\u76cc"+
+ "\1\u771f\1\u7772\1\u77c5\1\u7818\1\u786b\1\u78be\1\u7911\1\u7964"+
+ "\1\u79b7\1\u7a0a\1\u7a5d\1\u7ab0\1\u7b03\1\u7b56\1\u7ba9\1\u7bfc"+
+ "\1\u7c4f\1\u7ca2\1\u7cf5\1\u7d48\1\u7d9b\1\u7dee\1\u7e41\1\u7e94"+
+ "\1\u7ee7\1\u7f3a\1\u7f8d\1\u7fe0\1\u8033\1\u8086\1\u80d9\1\u812c"+
+ "\1\u817f\1\u81d2\1\u8225\1\u8278\1\u82cb\1\u831e\1\u8371\1\u83c4"+
+ "\1\u8417\1\u846a\1\u84bd\1\u8510\1\u8563\1\u85b6\1\u8609\1\u865c"+
+ "\1\u86af\1\u8702\1\u8755\1\u87a8\1\u87fb\1\u884e\1\u88a1\1\u88f4"+
+ "\1\u8947\1\u899a\1\u89ed\1\u8a40\1\u8a93\1\u8ae6\1\u8b39\1\u8b8c"+
+ "\1\u8bdf\1\u8c32\1\u8c85\1\u8cd8\1\u8d2b\1\u8d7e\1\u8dd1\1\u8e24"+
+ "\1\u8e77\1\u8eca\1\u8f1d\1\u8f70\1\u8fc3\1\u9016\1\u9069\1\u90bc"+
+ "\1\u910f\1\u9162\1\u91b5\1\u9208\1\u925b\1\u92ae\1\u9301\1\u9354"+
+ "\1\u93a7\1\u93fa\1\u944d\1\u94a0\1\u94f3\1\u9546\1\u9599\1\u95ec"+
+ "\1\u963f\1\u9692\1\u96e5\1\u9738\1\u978b\1\u97de\1\u9831\1\u9884"+
+ "\1\u98d7\1\u992a\1\u997d\1\u99d0\1\u9a23\1\u9a76\1\u9ac9\1\u9b1c"+
+ "\1\u9b6f\1\u9bc2\1\u9c15\1\u9c68\1\u9cbb\1\u9d0e\1\u9d61\1\u9db4"+
+ "\1\u9e07\1\u9e5a\1\u9ead\1\u9f00\1\u9f53\1\u9fa6\1\u9ff9\1\ua04c"+
+ "\1\ua09f\1\ua0f2\1\u9c15\1\ua145\1\ua198\1\ua1eb\1\ua23e\1\ua291"+
+ "\1\ua2e4\1\ua337\1\ua38a\1\ua3dd\1\ua430\1\ua483\1\ua4d6\1\ua529"+
+ "\1\ua57c\1\ua5cf\1\ua622\1\ua675\1\ua6c8\1\ua71b\1\ua76e\1\ua7c1"+
+ "\1\ua814\1\ua867\1\ua8ba\1\ua90d\1\ua960\1\ua9b3\1\uaa06\1\uaa59"+
+ "\1\uaaac\1\uaaff\1\uab52\1\uaba5\1\uabf8\1\uac4b\1\uac9e\1\uacf1"+
+ "\1\uad44\1\uad97\1\uadea\1\uae3d\1\uae90\1\uaee3\1\uaf36\1\uaf89"+
+ "\0\u0530\1\uafdc\1\ub02f\1\ub082\1\ub0d5\1\ub128\1\ub17b\1\ub1ce"+
+ "\1\ub221\1\ub274\1\ub2c7\1\ub31a\1\ub36d\1\ub3c0\1\ub413\1\ub466"+
+ "\1\ub4b9\1\ub50c\1\ub55f\1\ub5b2\1\ub605\1\ub658\1\ub6ab\1\ub6fe"+
+ "\1\ub751\1\ub7a4\1\ub7f7\1\ub84a\1\ub89d\1\ub8f0\1\ub943\1\ub996"+
+ "\1\ub9e9\1\uba3c\1\u79b7\1\uba8f\1\ubae2\1\ubb35\1\ubb88\1\ubbdb"+
+ "\1\ubc2e\1\ubc81\1\ubcd4\1\ubd27\1\ubd7a\1\ubdcd\1\ube20\1\ube73"+
+ "\1\ubec6\1\ubf19\1\ubf6c\1\ubfbf\1\uc012\1\uc065\1\uc0b8\1\uc10b"+
+ "\1\uc15e\1\uc1b1\1\uc204\1\uc257\1\uc2aa\1\uc2fd\1\uc350\1\uc3a3"+
+ "\1\uc3f6\1\uc449\1\uc49c\1\uc4ef\1\uc542\1\uc595\1\uc5e8\1\uc63b"+
+ "\1\uc68e\1\uc6e1\1\uc734\1\uc787\1\uc7da\1\uc82d\1\uc880\1\uc8d3"+
+ "\1\uc926\1\uc979\1\uc9cc\1\uca1f\1\uca72\1\ucac5\1\ucb18\1\ucb6b"+
+ "\1\ucbbe\1\ucc11\1\ucc64\1\uccb7\1\ucd0a\1\ucd5d\1\ucdb0\1\uce03"+
+ "\1\uce56\1\ucea9\1\ucefc\1\ucf4f\1\ucfa2\1\ucff5\1\ud048\1\ud09b"+
+ "\1\ud0ee\1\ud141\1\ud194\1\ud1e7\1\ud23a\1\ud28d\1\ud2e0\1\ud333"+
+ "\1\ud386\1\ud3d9\1\ud42c\1\ud47f\1\ud4d2\1\ud525\1\ud578\1\ud5cb"+
+ "\1\ud61e\1\ud671\1\ud6c4\1\ud717\1\ud76a\1\ud7bd\1\ud810\1\ud863"+
+ "\1\ud8b6\1\ud909\1\ud95c\1\ud9af\1\uda02\1\uda55\1\udaa8\1\udafb"+
+ "\1\udb4e\1\udba1\1\udbf4\1\udc47\1\udc9a\1\udced\1\udd40\1\udd93"+
+ "\1\udde6\1\ude39\1\ude8c\1\udedf\1\udf32\1\udf85\1\udfd8\1\ue02b"+
+ "\1\ue07e\1\ue0d1\1\ue124\1\ue177\1\ue1ca\1\ue21d\1\ue270\1\ue2c3"+
+ "\1\ue316\1\ue369\1\ue3bc\1\ue40f\1\ue462\1\ue4b5\1\ue508\1\ue55b"+
+ "\1\ue5ae\1\ue601\1\ue654\1\ue6a7\1\ue6fa\1\ue74d\1\ue7a0\1\ue7f3"+
+ "\1\ue846\1\ue899\1\ue8ec\1\ue93f\1\ue992\1\ue9e5\1\uea38\1\uea8b"+
+ "\1\ueade\1\ueb31\1\ueb84\1\uebd7\1\uec2a\1\uec7d\1\uecd0\1\ued23"+
+ "\1\ued76\1\uedc9\1\uee1c\1\uee6f\1\ueec2\1\uef15\1\uef68\1\uefbb"+
+ "\1\uf00e\1\uf061\1\uf0b4\1\uf107\1\uf15a\1\uf1ad\1\uf200\1\uf253"+
+ "\1\uf2a6\1\uf2f9\1\uf34c\1\uf39f\1\uf3f2\1\uf445\1\uf498\1\uf4eb"+
+ "\1\uf53e\1\u7fe0\1\uf591\1\uf5e4\1\uf637\1\uf68a\1\uf6dd\1\uf730"+
+ "\1\uf783\1\uf7d6\1\uf829\1\uf87c\1\uf8cf\1\uf922\1\uf975\1\uf9c8"+
+ "\1\ufa1b\1\ufa6e\1\ufac1\1\ufb14\1\ufb67\1\ufbba\1\ufc0d\1\ufc60"+
+ "\1\ufcb3\1\ufd06\1\ufd59\1\ufdac\1\ufdff\1\ufe52\1\ufea5\1\ufef8"+
+ "\1\uff4b\1\uff9e\1\ufff1\2\104\2\227\2\352\2\u013d\2\u0190"+
+ "\2\u01e3\2\u0236\2\u0289\2\u02dc\2\u032f\2\u0382\2\u03d5\2\u0428"+
+ "\2\u047b\2\u04ce\2\u0521\2\u0574\2\u05c7\2\u061a\2\u066d\2\u06c0"+
+ "\2\u0713\2\u0766\2\u07b9\2\u080c\2\u085f\2\u08b2\2\u0905\2\u0958"+
+ "\2\u09ab\2\u09fe\2\u0a51\2\u0aa4\2\u0af7\2\u0b4a\2\u0b9d\2\u0bf0"+
+ "\2\u0c43\2\u0c96\2\u0ce9\2\u0d3c\2\u0d8f\2\u0de2\2\u0e35\2\u0e88"+
+ "\2\u0edb\2\u0f2e\2\u0f81\2\u0fd4\2\u1027\2\u107a\2\u10cd\2\u1120"+
+ "\2\u1173\2\u11c6\2\u1219\2\u126c\2\u12bf\2\u1312\2\u1365\2\u13b8"+
+ "\2\u140b\2\u145e\2\u14b1\2\u1504\2\u1557\2\u15aa\2\u15fd\2\u1650"+
+ "\2\u16a3\2\u16f6\2\u1749\2\u179c\2\u17ef\2\u1842\2\u1895\2\u18e8"+
+ "\2\u193b\2\u198e\2\u19e1\2\u1a34\2\u1a87\2\u1ada\2\u1b2d\2\u1b80"+
+ "\2\u1bd3\2\u1c26\2\u1c79\2\u1ccc\2\u1d1f\2\u1d72\2\u1dc5\2\u1e18"+
+ "\2\u1e6b\2\u1ebe\2\u1f11\2\u1f64\2\u1fb7\2\u200a\2\u205d\2\u20b0"+
+ "\2\u2103\2\u2156\2\u21a9\2\u21fc\2\u224f\2\u22a2\2\u22f5\2\u2348"+
+ "\2\u239b\2\u23ee\2\u2441\2\u2494\2\u24e7\2\u253a\2\u258d\2\u25e0"+
+ "\2\u2633\2\u2686\2\u26d9\2\u272c\2\u277f\2\u27d2\2\u2825\2\u2878"+
+ "\2\u28cb\2\u291e\2\u2971\2\u29c4\2\u2a17\2\u2a6a\2\u2abd\2\u2b10"+
+ "\2\u2b63\2\u2bb6\2\u2c09\2\u2c5c\2\u2caf\2\u2d02\2\u2d55\2\u2da8"+
+ "\2\u2dfb\2\u2e4e\2\u2ea1\2\u2ef4\2\u2f47\2\u2f9a\2\u2fed\2\u3040"+
+ "\2\u3093\2\u30e6\2\u3139\2\u318c\2\u31df\2\u3232\2\u3285\2\u32d8"+
+ "\2\u332b\2\u337e\2\u33d1\2\u3424\2\u3477\2\u34ca\2\u351d\2\u3570"+
+ "\2\u35c3\2\u3616\2\u3669\2\u36bc\2\u370f\2\u3762\2\u37b5\2\u3808"+
+ "\2\u385b\2\u38ae\2\u3901\2\u3954\2\u39a7\2\u39fa\2\u3a4d\2\u3aa0"+
+ "\2\u3af3\2\u3b46\2\u3b99\2\u3bec\2\u3c3f\2\u3c92\2\u3ce5\2\u3d38"+
+ "\2\u3d8b\2\u3dde\2\u3e31\2\u3e84\2\u3ed7\2\u3f2a\2\u3f7d\2\u3fd0"+
+ "\2\u4023\2\u4076\2\u40c9\2\u411c\2\u416f\2\u41c2\2\u4215\2\u4268"+
+ "\2\u42bb\2\u430e\2\u4361\2\u43b4\2\u4407\2\u445a\2\u44ad\2\u4500"+
+ "\2\u4553\2\u45a6\2\u45f9\2\u464c\2\u469f\2\u46f2\2\u4745\2\u4798"+
+ "\2\u47eb\2\u483e\2\u4891\2\u48e4\2\u4937\2\u498a\2\u49dd\2\u4a30"+
+ "\2\u4a83\2\u4ad6\2\u4b29\2\u4b7c\2\u4bcf\2\u4c22\2\u4c75\2\u4cc8"+
+ "\2\u4d1b\2\u4d6e\2\u4dc1\2\u4e14\2\u4e67\2\u4eba\2\u4f0d\2\u4f60"+
+ "\2\u4fb3\2\u5006\2\u5059\2\u50ac";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[1876];
+ 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 =
+ "\1\7\2\10\1\11\1\12\1\11\1\13\1\11\1\14"+
+ "\1\15\1\7\1\16\1\17\1\20\1\21\1\7\1\10"+
+ "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\10"+
+ "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+
+ "\1\41\1\42\1\43\1\44\1\45\1\46\1\47\1\50"+
+ "\1\25\1\51\1\25\1\52\1\53\1\52\1\54\1\10"+
+ "\1\55\1\56\1\57\1\10\1\60\1\61\1\62\1\63"+
+ "\1\64\1\65\1\10\1\66\1\10\2\44\1\67\1\10"+
+ "\1\70\1\71\1\10\1\72\1\73\1\74\1\75\1\76"+
+ "\1\77\1\100\1\10\1\101\1\102\1\103\1\104\1\105"+
+ "\1\10\15\106\1\107\3\106\1\110\2\106\1\111\32\106"+
+ "\1\112\10\106\1\113\32\106\15\114\1\115\3\114\1\116"+
+ "\2\114\1\117\22\114\1\120\7\114\1\121\10\114\1\122"+
+ "\5\114\1\123\1\114\1\124\22\114\12\125\1\126\1\127"+
+ "\4\125\1\130\1\131\101\125\10\132\1\133\1\132\1\134"+
+ "\6\132\1\135\101\132\12\125\1\136\1\137\4\125\1\130"+
+ "\1\140\101\125\10\7\1\0\2\7\1\0\2\7\1\0"+
+ "\2\7\4\0\6\7\2\0\6\7\14\0\17\7\2\0"+
+ "\24\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\2\142\1\143\3\11\1\142\1\11"+
+ "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+ "\1\145\3\142\1\144\1\146\1\0\1\147\2\142\1\146"+
+ "\1\142\1\145\1\142\14\0\2\142\1\144\5\142\1\144"+
+ "\6\142\2\0\25\142\1\150\1\151\2\152\1\142\1\152"+
+ "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+ "\1\145\2\153\1\154\1\144\1\146\1\0\1\147\2\142"+
+ "\1\146\1\142\1\145\1\142\14\0\2\142\1\144\2\142"+
+ "\1\154\2\142\1\144\6\142\2\0\23\142\1\7\7\10"+
+ "\1\0\1\155\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\156\1\157\1\10\14\0"+
+ "\1\160\1\161\15\10\2\0\1\7\22\10\10\162\1\163"+
+ "\1\162\1\164\6\162\1\165\101\162\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\166\14\0\17\10\2\0\1\7"+
+ "\22\10\13\0\1\167\107\0\1\7\7\10\1\0\1\170"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\171\1\172\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\173\1\174\1\10\14\0\1\10\1\175\4\10\1\176"+
+ "\10\10\2\0\1\7\22\10\145\0\1\23\100\0\12\177"+
+ "\1\200\10\177\1\201\1\202\23\177\1\203\52\177\50\0"+
+ "\1\52\52\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\204\4\10\1\205\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\206\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\207\4\10\1\210\5\10\1\211\2\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\212\4\10\14\0\1\10\1\213\12\10\1\214\2\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\215\1\10\14\0\1\10\1\216\4\10\1\217"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\220\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\221\4\10\14\0\5\10\1\222"+
+ "\1\10\1\223\2\10\1\224\4\10\2\0\1\7\12\10"+
+ "\1\225\7\10\33\0\1\52\14\0\1\52\55\0\3\147"+
+ "\1\0\1\147\113\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\226\1\227\3\10\14\0\1\230\1\231\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\232\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\233\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\234"+
+ "\1\235\1\10\14\0\5\10\1\236\4\10\1\237\4\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\240\1\10\1\0\1\7\1\10\4\0\2\10"+
+ "\1\241\3\10\2\0\5\10\1\242\14\0\2\10\1\243"+
+ "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\244\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\245\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\246\1\10"+
+ "\1\247\1\10\1\250\1\10\14\0\1\251\2\10\1\252"+
+ "\5\10\1\253\2\10\1\254\2\10\2\0\1\7\22\10"+
+ "\23\0\1\255\145\0\1\52\1\0\1\52\121\0\1\256"+
+ "\1\52\115\0\1\52\4\0\1\52\122\0\1\52\1\0"+
+ "\1\257\120\0\1\52\4\0\1\52\45\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\260\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\261\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\262\3\10\14\0\1\10\1\263\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\264\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\265\1\10\1\266\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\267"+
+ "\1\270\1\10\14\0\1\271\1\272\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\273"+
+ "\1\274\1\0\1\7\1\10\4\0\6\10\2\0\1\275"+
+ "\4\10\1\276\14\0\2\10\1\277\4\10\1\300\7\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\301\3\10\14\0\6\10\1\302\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\303\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\304\1\305\2\10\14\0\1\10\1\306\4\10\1\307"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\310\5\10\1\311\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\312\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\313\1\314\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\315\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\316\1\317\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\2\320\3\7\1\320\1\7"+
+ "\1\0\1\320\1\7\1\0\2\320\1\0\1\7\1\320"+
+ "\4\0\6\320\2\0\6\320\14\0\17\320\2\0\1\7"+
+ "\22\320\1\7\7\10\1\0\1\321\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\2\10\1\322\3\10\2\0"+
+ "\1\10\1\323\3\10\1\324\14\0\3\10\1\325\13\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\326\1\10\1\327\3\10\14\0\1\330\1\331\2\10"+
+ "\1\332\1\10\1\333\5\10\1\334\2\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\335"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\1\336"+
+ "\3\10\1\337\1\10\14\0\2\10\1\340\14\10\2\0"+
+ "\1\7\12\10\1\341\7\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\342\4\10\14\0\1\343\1\344\4\10"+
+ "\1\345\5\10\1\346\2\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\347\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\5\10\1\350\1\351\13\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\352\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\353\2\10\14\0\6\10\1\354\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\355\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\356\1\357\2\10\14\0\1\10\1\360\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\361\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\362\3\10"+
+ "\2\0\6\10\14\0\3\10\1\363\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\364\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\365"+
+ "\1\10\1\366\2\10\14\0\6\10\1\367\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\370\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\371\3\10\14\0"+
+ "\1\10\1\372\4\10\1\373\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\374\1\375"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\376\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\15\106\1\0\3\106\1\0\2\106\1\0\32\106"+
+ "\1\0\10\106\1\0\32\106\35\0\1\377\27\0\1\u0100"+
+ "\60\0\1\u0101\134\0\1\u0102\155\0\1\u0103\32\0\15\114"+
+ "\1\0\3\114\1\0\2\114\1\0\22\114\1\0\7\114"+
+ "\1\0\10\114\1\0\5\114\1\0\1\114\1\0\22\114"+
+ "\35\0\1\u0104\27\0\1\u0105\60\0\1\u0106\100\0\1\u0107"+
+ "\4\0\1\u0107\2\0\1\u0107\2\0\2\u0107\5\0\1\u0108"+
+ "\1\0\6\u0107\2\0\6\u0107\7\0\1\u0109\4\0\17\u0107"+
+ "\3\0\22\u0107\35\0\1\u010a\155\0\1\u010b\132\0\1\u010c"+
+ "\57\0\1\u010d\1\u010e\1\u010f\1\u0110\1\0\1\u0111\15\0"+
+ "\1\u0112\1\u0113\1\u0114\1\u0115\1\0\1\u0116\3\0\1\u0117"+
+ "\31\0\12\125\2\0\4\125\2\0\101\125\21\u0118\1\0"+
+ "\101\u0118\13\0\1\u0119\110\0\2\u011a\3\0\1\u011a\2\0"+
+ "\1\u011a\2\0\2\u011a\2\0\1\u011a\4\0\6\u011a\2\0"+
+ "\6\u011a\14\0\17\u011a\1\u011b\2\0\22\u011a\10\132\1\0"+
+ "\1\132\1\0\6\132\1\0\101\132\10\0\1\u011c\112\0"+
+ "\21\u011d\1\0\101\u011d\21\u011e\1\0\101\u011e\10\7\1\0"+
+ "\1\u011f\1\7\1\0\2\7\1\0\2\7\4\0\6\7"+
+ "\2\0\6\7\14\0\17\7\2\0\23\7\10\142\1\0"+
+ "\2\142\1\0\2\142\1\0\2\142\4\0\6\142\2\0"+
+ "\6\142\14\0\17\142\2\0\25\142\1\143\3\u0120\1\142"+
+ "\1\u0120\1\0\2\142\1\0\2\142\1\0\2\142\4\0"+
+ "\6\142\2\0\6\142\14\0\17\142\2\0\26\142\3\u0121"+
+ "\1\142\1\u0121\1\0\2\142\1\0\2\142\1\0\2\142"+
+ "\4\0\6\142\1\u0122\1\0\6\142\3\0\1\u0122\10\0"+
+ "\17\142\2\0\26\142\3\147\1\142\1\147\1\0\2\142"+
+ "\1\0\1\142\1\144\1\0\2\142\4\0\4\142\1\144"+
+ "\1\146\2\0\2\142\1\146\3\142\14\0\2\142\1\144"+
+ "\5\142\1\144\6\142\2\0\25\142\1\150\1\142\2\u0123"+
+ "\1\142\1\u0123\1\0\2\142\1\0\2\142\1\0\2\142"+
+ "\4\0\6\142\2\0\6\142\14\0\17\142\2\0\26\142"+
+ "\3\151\1\142\1\151\1\0\2\142\1\0\1\142\1\144"+
+ "\1\0\2\142\4\0\4\142\1\144\1\146\1\0\1\147"+
+ "\2\142\1\146\3\142\14\0\2\142\1\144\5\142\1\144"+
+ "\6\142\2\0\25\142\1\150\1\151\2\152\1\142\1\152"+
+ "\1\0\2\142\1\0\1\142\1\144\1\0\2\142\4\0"+
+ "\1\u0124\3\142\1\144\1\146\1\0\1\147\2\142\1\146"+
+ "\1\142\1\u0124\1\142\14\0\2\142\1\144\5\142\1\144"+
+ "\6\142\2\0\27\142\2\u0125\2\142\1\0\2\142\1\0"+
+ "\2\142\1\0\2\142\4\0\6\142\2\0\6\142\14\0"+
+ "\17\142\2\0\26\142\5\u0126\1\0\2\142\1\0\1\142"+
+ "\1\u0126\1\0\2\142\4\0\1\142\2\u0126\1\142\2\u0126"+
+ "\2\0\2\142\2\u0126\2\142\14\0\2\142\1\u0126\1\142"+
+ "\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126\20\142"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0127\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u0128\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u0129\2\10\14\0\1\10\1\u012a\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u012b"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u012c\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u012d\1\10\14\0"+
+ "\7\10\1\u012e\7\10\2\0\1\7\22\10\10\162\1\u012f"+
+ "\1\162\1\164\6\162\1\165\101\162\10\0\1\u0130\112\0"+
+ "\4\u0131\2\162\1\u0131\1\162\1\u0132\1\u0133\4\162\3\u0131"+
+ "\1\0\5\u0131\1\162\5\u0131\2\162\64\u0131\10\165\1\u012f"+
+ "\1\165\1\u0134\110\165\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u0135\3\10\14\0\6\10\1\u0136\10\10\2\0"+
+ "\1\7\22\10\13\0\1\u0137\107\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u0138\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\11\10\1\274\5\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0139\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u013a\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u013b\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\274\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u013c\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\12\177\1\200"+
+ "\10\177\1\u013d\120\177\1\0\101\177\21\201\1\0\101\201"+
+ "\24\0\1\u013e\76\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u013f\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\4\10\1\u0140\12\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0141"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u0142\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\10\1\u0143\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u0144\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0145\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u0146\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0147\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u0148\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0149\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u014a\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u014b\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u014c\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u014d\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u014e"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u014f\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0150\5\10\14\0\4\10\1\u0151\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\3\10\1\u0152\13\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0153\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\4\10"+
+ "\1\u0154\1\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u0155\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0156"+
+ "\2\10\14\0\14\10\1\274\2\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0157\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u0158\4\10\14\0\6\10\1\u0159\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\2\10\1\u015a\17\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u015b\4\10\1\u015c"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u015d\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u015e\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u015f\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0160\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0161\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\14\10\1\u0135\2\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u0162\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u0163"+
+ "\4\10\2\0\5\10\1\u0164\14\0\17\10\2\0\1\7"+
+ "\5\10\1\u0165\14\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\2\10\1\u0166\14\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0167\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u0168\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0169"+
+ "\1\10\1\u016a\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u016b\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\313\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u016c\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u016d\2\10\1\u016e\1\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u016f\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u0170\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\12\177\1\200"+
+ "\10\177\2\0\76\177\50\0\1\52\1\0\1\25\50\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0171\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\7\10\1\u0172\7\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\10"+
+ "\1\u0173\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u0174\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\2\10\1\u0175\3\10\2\0\1\u0176"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0177\4\10"+
+ "\1\u0178\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u0179\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u017a"+
+ "\4\10\1\u015f\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u017b\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u017c\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u017d"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u017e\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u017f\4\10\1\u0180\14\0"+
+ "\12\10\1\u0181\4\10\2\0\1\7\13\10\1\u0182\6\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0183\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u0184"+
+ "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0185\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u0186"+
+ "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0187\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\5\10"+
+ "\1\u0188\11\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\3\10\1\u0189\13\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\3\10\1\u018a\16\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u018b\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\u018c\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u018d\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u018e\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u018f\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u0190\1\10\14\0\6\10\1\u0191\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u0172\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0192\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u0193\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0194\1\10"+
+ "\1\u0195\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0196\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\320\1\0\1\320\1\u0197\1\0"+
+ "\2\320\1\0\1\7\1\320\4\0\6\320\2\0\6\320"+
+ "\14\0\17\320\2\0\1\7\22\320\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0198\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0199"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u019a\4\10\14\0\6\10\1\u019b"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u019c\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+ "\1\u019d\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u019e\1\10\1\u019f\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0135\1\u01a0\4\10\14\0\4\10\1\u01a1\12\10"+
+ "\2\0\1\7\3\10\1\u01a2\16\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u01a3\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u01a4\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u01a5\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\7\10\1\u01a6\7\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u01a7"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u01a8\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u01a9\4\10\1\u01aa\14\0\1\u01ab"+
+ "\1\10\1\u01ac\1\u01ad\1\u01ae\5\10\1\u01af\4\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u01b0\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u01b1\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u01b2\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\5\10\1\u01b3\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u01b4\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u01b5\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u01b6"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\7\10\1\u01b7\7\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\3\10\1\u01b8\13\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u01b9\14\0\16\10\1\u01ba"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u01bb"+
+ "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\4\10\1\u01bc\15\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u01bd\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u018f\5\10"+
+ "\14\0\3\10\1\u01be\13\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u01bf\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u01c0\1\10\14\0\7\10\1\u01c1\7\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\13\10\1\u01c2\3\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\12\10\1\u01c3"+
+ "\4\10\2\0\1\7\22\10\1\7\5\10\1\u01c4\1\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u01c5\5\10\14\0\17\10\2\0"+
+ "\1\7\2\10\1\u01c6\17\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u01c7\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u01c8\14\0"+
+ "\17\10\2\0\1\7\13\10\1\u01c9\6\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u01ca\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u01cb\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u01cc\4\10"+
+ "\1\u01cd\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u01ce\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\3\10\1\u01cf\13\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u01d0\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u01d1\4\10\14\0\4\10\1\u01d2\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u01d3\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u01d4\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u01d5\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u01d6\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u018a\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\62\0\1\u01d7\101\0\1\u01d8"+
+ "\116\0\1\u01d9\155\0\1\u01da\114\0\1\u01db\101\0\1\u01dc"+
+ "\61\0\52\u0107\1\u0109\50\u0107\1\0\1\u0107\4\0\1\u0107"+
+ "\2\0\1\u0107\2\0\2\u0107\7\0\6\u0107\2\0\6\u0107"+
+ "\7\0\1\u0109\4\0\17\u0107\3\0\22\u0107\35\0\1\u01dd"+
+ "\155\0\1\u01de\73\0\1\u01df\17\0\1\u01e0\1\0\1\u01e1"+
+ "\1\0\1\u01e2\3\0\1\u01e3\42\0\1\u01e4\45\0\1\u01e5"+
+ "\1\u01e6\101\0\1\u01e7\147\0\1\u01e8\47\0\1\u01e9\150\0"+
+ "\1\u01ea\25\0\1\u01eb\64\0\1\u01ec\132\0\1\u01ed\123\0"+
+ "\1\u01ee\122\0\1\u01ef\76\0\1\u01f0\145\0\1\u01f1\76\0"+
+ "\1\u01f2\110\0\7\u011a\1\0\1\u011a\1\u01f3\1\0\2\u011a"+
+ "\2\0\1\u011a\4\0\6\u011a\2\0\6\u011a\14\0\17\u011a"+
+ "\3\0\22\u011a\77\u01f4\1\0\23\u01f4\10\0\1\u01f5\112\0"+
+ "\3\7\5\u01f6\1\0\2\7\1\0\1\7\1\u01f6\1\0"+
+ "\2\7\4\0\1\7\2\u01f6\1\7\2\u01f6\2\0\2\7"+
+ "\2\u01f6\2\7\14\0\2\7\1\u01f6\1\7\1\u01f6\3\7"+
+ "\1\u01f6\6\7\2\0\2\7\1\u01f6\20\7\2\142\1\143"+
+ "\3\u0120\1\142\1\u0120\1\0\2\142\1\0\2\142\1\0"+
+ "\2\142\4\0\1\145\5\142\2\0\4\142\1\145\1\142"+
+ "\14\0\17\142\2\0\26\142\3\u0121\1\142\1\u0121\1\0"+
+ "\2\142\1\0\1\142\1\144\1\0\2\142\4\0\4\142"+
+ "\1\144\1\142\2\0\6\142\14\0\2\142\1\144\5\142"+
+ "\1\144\6\142\2\0\23\142\3\0\3\u0121\1\0\1\u0121"+
+ "\113\0\2\142\1\150\1\142\2\u0123\1\142\1\u0123\1\0"+
+ "\2\142\1\0\2\142\1\0\2\142\4\0\1\u0124\5\142"+
+ "\2\0\4\142\1\u0124\1\142\14\0\17\142\2\0\25\142"+
+ "\1\u01f7\1\142\2\u0125\2\142\1\0\2\142\1\0\2\142"+
+ "\1\0\2\142\4\0\6\142\2\0\6\142\14\0\17\142"+
+ "\2\0\25\142\1\u01f8\5\u0126\1\0\2\142\1\0\1\142"+
+ "\1\u0126\1\0\2\142\4\0\1\u0124\2\u0126\1\142\2\u0126"+
+ "\2\0\2\142\2\u0126\1\u0124\1\142\14\0\2\142\1\u0126"+
+ "\1\142\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126"+
+ "\20\142\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u01f9"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u01fa\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\u01fb\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u01fc\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u01fd\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u01fe\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u01ff"+
+ "\14\0\4\10\1\u0200\12\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u0201\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u0202\13\10\2\0\1\7"+
+ "\22\10\10\u0131\1\u0203\10\u0131\1\0\104\u0131\5\u0204\1\u0203"+
+ "\4\u0131\1\u0204\3\u0131\1\0\4\u0131\2\u0204\1\u0131\2\u0204"+
+ "\4\u0131\2\u0204\20\u0131\1\u0204\1\u0131\1\u0204\3\u0131\1\u0204"+
+ "\12\u0131\1\u0204\20\u0131\4\0\2\165\1\0\2\165\1\u0205"+
+ "\4\165\11\0\1\165\5\0\2\165\64\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0206\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\274\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0207"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u0155\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0208\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0209\2\10\14\0\2\10\1\u020a"+
+ "\14\10\2\0\1\7\22\10\23\0\1\u020b\77\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u0135"+
+ "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u020c\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u020d"+
+ "\3\10\14\0\16\10\1\u020e\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u020f\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\10\1\u0210\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u0211\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0212"+
+ "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0213"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0214\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0215\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0216\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u0217\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0218"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\7\10\1\u0219\7\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u021a\1\10\1\u021b\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u021c\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u021d\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u021e\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u021f\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0220\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0221"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\5\10\1\u0222\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0223"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0224\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\274"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0225\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\274\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0226\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\u0227\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\3\10\1\u0228\13\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\274\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u0229"+
+ "\16\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\274\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u022a"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\240\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u022b\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\207"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u022c\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\14\10\1\u022d\2\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\2\10\1\u022e\17\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\13\10\1\u0216\3\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\175\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u022f\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0230"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\10\10\1\u0231\11\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u0208\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0232\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u0218\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u017a"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0233\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\14\10\1\u0234\5\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+ "\1\u0135\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0235\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0236\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u0230\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\1\10\1\u0218"+
+ "\20\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0237\5\10"+
+ "\14\0\3\10\1\u0238\13\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0239\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\12\10"+
+ "\1\u023a\4\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\16\10\1\u023b\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u023c\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u0159\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u0216\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u023d\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0182\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u023e\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u023f\5\10\14\0\3\10\1\u0182\13\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u0240\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0241\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0242\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u0243\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0244\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0245\1\10\14\0\1\10\1\u022c\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u0246\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0247"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u0248\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u0249\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0135\1\u024a\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u024b\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u024c\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u015f\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u0135"+
+ "\16\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u024d\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\2\10\1\274\14\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\1\10\1\u0218\6\10\1\u024e\3\10\1\u024f\5\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0250\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0251\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u0252\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0253\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\2\10\1\u0254\14\10"+
+ "\2\0\1\7\22\10\10\7\1\0\1\u0255\1\7\1\0"+
+ "\2\7\1\0\2\7\4\0\6\7\2\0\6\7\14\0"+
+ "\17\7\2\0\24\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u0256\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0257\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0258\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0259\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u025a\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u025b"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u025c\3\10\14\0\6\10"+
+ "\1\u025d\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u025e\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u025f\3\10\1\u0260\4\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u0261\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u0262"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u0218\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0263\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0264\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u0265\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0266\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u0267\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0268\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0269\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u026a\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u026b\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u026c\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u026d\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u026e\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u026f\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\10\1\u0270\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0271\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u0272\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\221"+
+ "\4\10\14\0\5\10\1\u0273\11\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0274\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0275\3\10\14\0\1\10\1\u0276"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\10\10\1\u0277"+
+ "\11\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0278"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0279\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\u027a\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u027b\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u027c\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\10\10\1\u027d\6\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\10\10\1\u0135\6\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\u027e\16\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\1\0\1\u027f"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u0280\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u0281\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\2\10\1\u0282\3\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u0283\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0284\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\4\10\1\u0285\1\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\1\10\1\u0286\1\u0287"+
+ "\17\10\1\7\7\10\1\0\1\u0288\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u0289\13\10\2\0\1\7"+
+ "\12\10\1\u028a\7\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u028b\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u028c\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u028d\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\u028e\16\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\3\10\1\u028f\1\u0290"+
+ "\12\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u0291\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0292\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\16\10\1\u0293\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0294\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\13\10\1\u0295\3\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0296\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u014f\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\2\10\1\u0135\14\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u0297\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0298"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0299\2\0"+
+ "\1\7\22\10\56\0\1\u029a\103\0\1\u01d7\145\0\1\u029b"+
+ "\74\0\1\u029c\144\0\1\u029d\103\0\1\u01db\145\0\1\u029e"+
+ "\74\0\1\u029f\153\0\1\u02a0\115\0\1\u02a1\122\0\1\u02a2"+
+ "\56\0\1\u02a3\146\0\1\u02a4\117\0\1\u02a5\123\0\1\u02a6"+
+ "\145\0\1\u02a7\76\0\1\u02a8\125\0\1\u02a9\22\0\1\u02aa"+
+ "\74\0\1\u02ab\123\0\1\u02ac\1\u02ad\77\0\1\u02ae\150\0"+
+ "\1\u02af\142\0\1\u02b0\76\0\1\u02b1\121\0\1\u02b2\122\0"+
+ "\1\u02b3\23\0\1\u02b4\77\0\1\u02b5\75\0\1\u02b6\111\0"+
+ "\77\u01f4\1\u02b7\23\u01f4\3\7\5\u02b8\1\0\2\7\1\0"+
+ "\1\7\1\u02b8\1\0\2\7\4\0\1\7\2\u02b8\1\7"+
+ "\2\u02b8\2\0\2\7\2\u02b8\2\7\14\0\2\7\1\u02b8"+
+ "\1\7\1\u02b8\3\7\1\u02b8\6\7\2\0\2\7\1\u02b8"+
+ "\20\7\2\142\1\u01f8\5\u0126\1\0\2\142\1\0\1\142"+
+ "\1\u0126\1\0\2\142\4\0\1\142\2\u0126\1\142\2\u0126"+
+ "\2\0\2\142\2\u0126\2\142\14\0\2\142\1\u0126\1\142"+
+ "\1\u0126\3\142\1\u0126\6\142\2\0\2\142\1\u0126\20\142"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02b9\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u02ba\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u02bb"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u02bc\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0250\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\5\10\1\u02bd\1\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u02be"+
+ "\2\10\14\0\17\10\2\0\1\7\1\10\1\u02bf\1\u02c0"+
+ "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u024b\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u02c1\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u02c2"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u01b0\2\10\14\0\6\10"+
+ "\1\u02c3\10\10\2\0\1\7\22\10\3\u0131\5\u02c4\1\u0203"+
+ "\4\u0131\1\u02c4\3\u0131\1\0\4\u0131\2\u02c4\1\u0131\2\u02c4"+
+ "\4\u0131\2\u02c4\20\u0131\1\u02c4\1\u0131\1\u02c4\3\u0131\1\u02c4"+
+ "\12\u0131\1\u02c4\20\u0131\3\0\5\u02c5\5\0\1\u02c5\10\0"+
+ "\2\u02c5\1\0\2\u02c5\4\0\2\u02c5\20\0\1\u02c5\1\0"+
+ "\1\u02c5\3\0\1\u02c5\12\0\1\u02c5\20\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\13\10\1\274\3\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\12\10\1\u015f\4\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0216\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u02c6\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\1\u02c7\5\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\1\10\1\u02c8\2\10\1\u02c9"+
+ "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u02ca"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\11\10\1\u02cb\10\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u02cc\1\u02cd\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\15\10\1\u02ce\1\10\2\0\1\7\4\10\1\u02cf\15\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02d0\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u02d1\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0218\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\1\10\1\u02d2\20\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\16\10\1\274\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u02d3\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\u0250\16\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0135\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u02d4\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u02d5\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u02d6\1\10\1\0"+
+ "\1\7\1\10\4\0\4\10\1\u02d7\1\10\2\0\6\10"+
+ "\14\0\10\10\1\u02d8\4\10\1\u02d9\1\10\2\0\1\7"+
+ "\4\10\1\u02da\4\10\1\u02db\1\u02dc\1\10\1\u02dd\2\10"+
+ "\1\u02de\2\10\1\7\5\10\1\u02df\1\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u02e0\3\10\14\0\17\10\2\0\1\7"+
+ "\2\10\1\u0212\5\10\1\u02e1\11\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0135\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u02e2\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u02e3"+
+ "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\14\10\1\u02e4\2\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u02e5\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\5\10\1\u0273\11\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u02e6\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\11\10\1\u02e7\5\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u02e8\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u02e9\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u02ea\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\17\10\1\u02eb\2\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u02ec\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u02ed\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0157\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\3\10\1\u0249\13\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\u02ee\16\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u02ef\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u02f0\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\301\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u02f1\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\u02f2\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u02f3\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u02f4\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u0149\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u02f5\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u02f6\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u02f7\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u02f8\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u02f9\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\274\16\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\6\10\1\u02fa\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u02fb\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u02fc\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\16\10\1\u02fd\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0218\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u01d2\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\u0249\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u02fe\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u02ff\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\5\10\1\u0300\1\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\274\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0301\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0135\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\4\10\1\u0302\5\10"+
+ "\1\u0303\7\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u0249\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0304"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\310\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0305\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0306\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u018c\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0307"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u021d\1\u018c\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u0308\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0309\15\10\2\0"+
+ "\1\7\22\10\3\7\5\u030a\1\0\2\7\1\0\1\7"+
+ "\1\u030a\1\0\2\7\4\0\1\7\2\u030a\1\7\2\u030a"+
+ "\2\0\2\7\2\u030a\2\7\14\0\2\7\1\u030a\1\7"+
+ "\1\u030a\3\7\1\u030a\6\7\2\0\2\7\1\u030a\21\7"+
+ "\5\10\1\u030b\1\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u030c\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\14\10\1\u030d\2\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\u030e\16\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u030f\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0310\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0311\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0312\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0313\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0314\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u0315\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0316"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u0317\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0318"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0319\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u031a\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u031b\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\4\10"+
+ "\1\u031c\1\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u031d"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u031e\4\10\14\0\13\10"+
+ "\1\u031a\3\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u031f\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u0320\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\5\10\1\u0321"+
+ "\11\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0322\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+ "\1\u0323\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u0324\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u0325\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0326"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\13\10\1\u0327\3\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0328\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u0329\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\2\10\1\u0212\5\10\1\u02e1"+
+ "\11\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u032a"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\11\10\1\u0250\5\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u032b\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u032c\4\10"+
+ "\14\0\17\10\2\0\1\7\21\10\1\u032d\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\11\10\1\u032e\10\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\3\10\1\u032f\13\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0330\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u0331\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0332"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u0250\5\10\14\0\17\10\2\0"+
+ "\1\7\2\10\1\u0212\5\10\1\u02e1\11\10\32\0\1\u0333"+
+ "\70\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0334\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\14\10\1\u0335\5\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u0336\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0337\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\13\10\1\u0338\3\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0339"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u033a\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u033b\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u033c\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u033d\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u033e"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u033f\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0340\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0341\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\2\10\1\u0342"+
+ "\3\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0343\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0344\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0345"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u0346\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0347\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+ "\1\u0348\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0349\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\10\1\u034a\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u034b\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u034c"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\7\10\1\u034d\12\10\23\0\1\u034e\141\0\1\u01d7\13\0"+
+ "\1\u029a\45\0\1\u029c\1\u034f\5\u029c\1\u034f\1\u029c\2\0"+
+ "\2\u029c\1\0\1\u034f\1\u029c\2\0\1\u029c\1\u034f\6\u029c"+
+ "\2\u034f\6\u029c\4\u034f\1\0\1\u034f\2\0\4\u034f\17\u029c"+
+ "\2\0\1\u034f\22\u029c\23\0\1\u0350\141\0\1\u01db\13\0"+
+ "\1\u029d\45\0\1\u029f\1\u0351\5\u029f\1\u0351\1\u029f\2\0"+
+ "\2\u029f\1\0\1\u0351\1\u029f\2\0\1\u029f\1\u0351\6\u029f"+
+ "\2\u0351\6\u029f\4\u0351\1\0\1\u0351\2\0\4\u0351\17\u029f"+
+ "\2\0\1\u0351\22\u029f\14\0\1\u0352\20\0\1\u0353\150\0"+
+ "\1\u0354\120\0\1\u0355\120\0\1\u0356\104\0\1\u0357\141\0"+
+ "\1\u0358\101\0\1\u0359\20\0\1\u035a\122\0\1\u02ad\53\0"+
+ "\1\u035b\177\0\1\u035c\73\0\1\u035d\1\0\1\u035e\140\0"+
+ "\1\u035f\130\0\1\u0360\120\0\1\u0361\117\0\1\u0362\100\0"+
+ "\1\u0363\124\0\1\u0364\121\0\1\u0365\122\0\1\u0366\122\0"+
+ "\1\u0367\125\0\1\u0368\63\0\5\u0369\5\0\1\u0369\10\0"+
+ "\2\u0369\1\0\2\u0369\4\0\2\u0369\20\0\1\u0369\1\0"+
+ "\1\u0369\3\0\1\u0369\12\0\1\u0369\20\0\3\7\5\u036a"+
+ "\1\0\2\7\1\0\1\7\1\u036a\1\0\2\7\4\0"+
+ "\1\7\2\u036a\1\7\2\u036a\2\0\2\7\2\u036a\2\7"+
+ "\14\0\2\7\1\u036a\1\7\1\u036a\3\7\1\u036a\6\7"+
+ "\2\0\2\7\1\u036a\21\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u036b\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u036c"+
+ "\14\10\2\0\1\7\22\10\1\7\5\10\1\u036d\1\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\1\u036e\3\10\1\u036f\1\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\11\10\1\u02db\10\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u018c\2\10\14\0\17\10"+
+ "\2\0\1\7\11\10\1\u0370\10\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0371\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\4\10\1\u0372\12\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u0373\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0374\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0375"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0376\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u031a\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\3\u0131\5\u0377\1\u0203\4\u0131\1\u0377\3\u0131\1\0\4\u0131"+
+ "\2\u0377\1\u0131\2\u0377\4\u0131\2\u0377\20\u0131\1\u0377\1\u0131"+
+ "\1\u0377\3\u0131\1\u0377\12\u0131\1\u0377\20\u0131\3\0\5\u0378"+
+ "\5\0\1\u0378\10\0\2\u0378\1\0\2\u0378\4\0\2\u0378"+
+ "\20\0\1\u0378\1\0\1\u0378\3\0\1\u0378\12\0\1\u0378"+
+ "\20\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0379"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u037a\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u037b\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u037c\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u037d\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u037e\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u037f\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\13\10\1\u0380\3\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0381\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u0382\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u01cf\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u0383\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0384"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0385\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u0386\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u0348\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u0387\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0388\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0389\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u038a\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u038b\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u038c\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u038d\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u038e\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u038f"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0390\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u0391\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0172\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u0392\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0393\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\2\10"+
+ "\1\u0394\17\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\1\u0395\5\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\12\10\1\u0396\7\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0397\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u0398\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u0399\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u039a\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u039b\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u0159"+
+ "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u039c\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u039d\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u039e\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\274\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u039f\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03a0"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u03a1\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0157\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u03a2\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u03a3\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\10\1\u0135\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0383\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u015f\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\13\10\1\u015f\3\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03a4"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\10\1\u03a5\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03a6"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u03a7\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u03a8\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\7\10\1\u03a9"+
+ "\7\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u03aa\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u03ab\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u03ac\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u03ad\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u03ae\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u03af"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u03b0\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\u03b1\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u03b2\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\7\10\1\u03b3\7\10\2\0"+
+ "\1\7\22\10\3\7\5\u03b4\1\0\2\7\1\0\1\7"+
+ "\1\u03b4\1\0\2\7\4\0\1\7\2\u03b4\1\7\2\u03b4"+
+ "\2\0\2\7\2\u03b4\2\7\14\0\2\7\1\u03b4\1\7"+
+ "\1\u03b4\3\7\1\u03b4\6\7\2\0\2\7\1\u03b4\21\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u03b5\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u03b6\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\1\u03b7\5\10\2\0\5\10"+
+ "\1\u0135\14\0\10\10\1\u03b8\6\10\2\0\1\7\2\10"+
+ "\1\u03b9\1\10\1\u03ba\15\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\7\10\1\u03bb\7\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03bc\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\2\10\1\u0250\14\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\7\10\1\u03bd\7\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u03be"+
+ "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u03bf\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\5\10\1\u03c0\4\10\1\u03c1\7\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u03c2\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\4\10\1\u03c3\12\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u03c4\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u03c5\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\2\10\1\u0274\14\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u021d\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u03c6\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u03c7"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\7\10\1\u0135\7\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u03c8\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u03c9\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u03ca"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u03cb\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\12\10\1\u03cc\7\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\2\10\1\u03cd\5\10\1\u03ce\11\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\3\10\1\u03cf\13\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u03d0\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\2\10\1\u024b\3\10\2\0\1\u014f"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u03d1\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u03d2\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u03d3\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u03d4\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\2\10\1\u03d5\14\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u03d6\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\5\10\1\u03d7\14\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u03d8\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u03d9\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\3\10\1\u03da\13\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u03db"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\11\10\1\u03dc\5\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03dd\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\14\0\1\u03de\106\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u03df\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u03e0\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03e1"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\6\10\1\u03e2\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u03e3\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u03e4\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u03e5\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u03e6\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\u03e7\16\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u03e8\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\10\10"+
+ "\1\u03e9\11\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\12\10\1\u0252\4\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u03ea\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u03eb\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u03ec\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u03ed\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u03ee"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\2\10"+
+ "\1\u03ef\14\10\1\u02de\2\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u03f0\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\13\10\1\u0249\3\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02d9\1\10"+
+ "\2\0\1\7\4\10\1\u02da\5\10\1\u02dc\4\10\1\u02de"+
+ "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03f1"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\14\10\1\u03f2\2\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u03f3\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0135\4\10"+
+ "\14\0\17\10\2\0\1\7\1\10\1\u03f4\20\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u03f5\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\23\0\1\u029c\122\0\1\u029f"+
+ "\174\0\1\u03f6\64\0\1\u03f7\157\0\1\u03f8\65\0\1\u03f6"+
+ "\122\0\1\u03f9\74\0\1\u0355\147\0\1\u03fa\124\0\1\u03fb"+
+ "\152\0\1\u03fc\70\0\1\u03fd\146\0\1\u03fe\122\0\1\u03ff"+
+ "\51\0\1\u0400\171\0\1\u0401\102\0\1\u0402\121\0\1\u02ad"+
+ "\124\0\1\u0403\120\0\1\u0404\151\0\1\u02ad\126\0\1\u0405"+
+ "\66\0\1\u0406\150\0\1\u02ad\123\0\1\u0407\40\0\5\u0408"+
+ "\5\0\1\u0408\10\0\2\u0408\1\0\2\u0408\4\0\2\u0408"+
+ "\20\0\1\u0408\1\0\1\u0408\3\0\1\u0408\12\0\1\u0408"+
+ "\20\0\3\7\5\10\1\0\2\7\1\0\1\7\1\10"+
+ "\1\0\2\7\4\0\1\7\2\10\1\7\2\10\2\0"+
+ "\2\7\2\10\2\7\14\0\2\7\1\10\1\7\1\10"+
+ "\3\7\1\10\6\7\2\0\2\7\1\10\21\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\240\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u021d\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0409\2\10"+
+ "\14\0\6\10\1\u040a\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u038a"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u040b\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u040c\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u040d\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u040e"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u040f\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\3\10\1\u0410\16\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0411\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0412\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\3\u0131\5\162\1\u0203\4\u0131\1\162\3\u0131\1\0"+
+ "\4\u0131\2\162\1\u0131\2\162\4\u0131\2\162\20\u0131\1\162"+
+ "\1\u0131\1\162\3\u0131\1\162\12\u0131\1\162\20\u0131\3\0"+
+ "\5\u0413\5\0\1\u0413\10\0\2\u0413\1\0\2\u0413\4\0"+
+ "\2\u0413\20\0\1\u0413\1\0\1\u0413\3\0\1\u0413\12\0"+
+ "\1\u0413\20\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\14\10\1\274\2\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u0414\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0135\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+ "\1\u0415\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\1\0\1\u0416\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u0417\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\1\u03b7\5\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\7\10\1\u0418\12\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u03f2\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0419"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u0135\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u041a"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0216\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\4\10\1\u041b\1\10"+
+ "\2\0\1\u041c\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+ "\1\u041d\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u041e\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u041f\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0420\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\3\10\1\u0421\13\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0422\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u038b\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0423\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u041e\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u0424\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0425\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0426\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0427\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0428\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0429\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\2\10\1\u042a\3\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u042b\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u013f\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u042c\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u042d\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u0157\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u042e"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\10\1\u042f\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\10\1\u0135\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0430\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\3\10\1\u0431\13\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0432\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0379\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\u015f\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0433\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u0434\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\10\10"+
+ "\1\u0435\11\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\240"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0436\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u0437\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0438\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\3\10\1\u0439\13\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u03ac"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u043a\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u043b\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u043c"+
+ "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u043d\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u043e\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\1\10\1\u043f\20\10\3\7\5\u0440\1\0\2\7\1\0"+
+ "\1\7\1\u0440\1\0\2\7\4\0\1\7\2\u0440\1\7"+
+ "\2\u0440\2\0\2\7\2\u0440\2\7\14\0\2\7\1\u0440"+
+ "\1\7\1\u0440\3\7\1\u0440\6\7\2\0\2\7\1\u0440"+
+ "\21\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u0441\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u0442\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u0443\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\304\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0444\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0445\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0446\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0447\10\10\2\0\1\7\22\10\1\7\5\10"+
+ "\1\u0448\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\5\10\1\u0449\14\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\1\10\1\u044a\4\10\2\0\6\10\14\0\15\10\1\u02d9"+
+ "\1\10\2\0\1\7\4\10\1\u03ba\1\u0449\11\10\1\u02de"+
+ "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\10\10\1\u044b\11\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u044c\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\12\10\1\u044d\4\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u044e\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u044f\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0450"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0451\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\5\10\1\u0452\14\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0453\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0454\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u0455\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0456\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0457\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\u0458\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0459\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u045a\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u045b"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\2\10\1\u045c\14\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\u045d\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\4\10\1\u045e\1\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u045f\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\3\10\1\u0425\13\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\1\u0460\5\10\1\0\1\u0461\6\10\14\0\10\10"+
+ "\1\u0462\6\10\2\0\1\7\15\10\1\u0463\4\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\14\10\1\u0464"+
+ "\2\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u0465\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0249"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0466\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0467\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u0468\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u0469\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u046a\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\35\0\1\u046b\65\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\13\10\1\u046c\3\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u046d\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\4\10\1\u046e\1\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\12\10\1\u046f\4\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0470\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u0471\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u0472\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0473\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\4\10\1\u0474\1\u0475\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\10\10\1\u0476\11\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0477"+
+ "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0478"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u0135\14\0\17\10\2\0"+
+ "\1\7\2\10\1\u0479\1\10\1\u047a\5\10\1\u047b\7\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u047c\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u047d\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u047e"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u047f\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0480"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u0481\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u0482\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\5\10\1\u0483\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0484\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\2\10\1\u0485\3\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u0486\14\0\17\10\2\0\1\7"+
+ "\22\10\77\u03f6\1\u02ad\23\u03f6\36\0\1\u0487\144\0\1\u0488"+
+ "\100\0\1\u0489\151\0\1\u048a\116\0\1\u048b\103\0\1\u02ad"+
+ "\74\0\1\u02ad\147\0\1\u0361\116\0\1\u0368\146\0\1\u0361"+
+ "\77\0\1\u02ad\125\0\1\u048c\120\0\1\u048d\146\0\1\u048e"+
+ "\117\0\1\u048f\56\0\1\u048a\166\0\1\u03fd\45\0\5\u0490"+
+ "\5\0\1\u0490\10\0\2\u0490\1\0\2\u0490\4\0\2\u0490"+
+ "\20\0\1\u0490\1\0\1\u0490\3\0\1\u0490\12\0\1\u0490"+
+ "\20\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u0491"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0492\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u0493\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0494\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\12\10\1\u0495\4\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0496\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0497\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u0498\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0499\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u049a\10\10\2\0\1\7\22\10\3\0"+
+ "\5\165\5\0\1\165\10\0\2\165\1\0\2\165\4\0"+
+ "\2\165\20\0\1\165\1\0\1\165\3\0\1\165\12\0"+
+ "\1\165\20\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u049b"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u049c\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\6\0\1\u049d\17\0\1\u049e\74\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\2\10\1\u049f\3\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u04a0\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u04a1\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u04a2\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u04a3\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04a4"+
+ "\1\u04a5\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u04a6\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u031a\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u04a7\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\2\10\1\u031a\14\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u04a8\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\4\10\1\u04a9\1\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\7\10\1\u04aa\7\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u04ab\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u04ac\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u04ad\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u04ae\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u04af"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u04b0\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\13\10\1\u0182\6\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0157\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\u04b1\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\u04b2\16\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\2\10\1\u04b3\14\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+ "\1\274\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u04b4\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b5"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0191\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\4\10\1\u015f\12\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b6\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u04b7\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u04b8\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u04b9\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u04ba"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u04bb\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0161"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+ "\1\u0300\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\14\10\1\u04bc\5\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u04bd\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\5\10\1\u0222\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\14\10\1\u02dd\5\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u04be\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u04bf\12\10\2\0"+
+ "\1\7\22\10\3\7\5\320\1\0\2\7\1\0\1\7"+
+ "\1\320\1\0\2\7\4\0\1\7\2\320\1\7\2\320"+
+ "\2\0\2\7\2\320\2\7\14\0\2\7\1\320\1\7"+
+ "\1\320\3\7\1\320\6\7\2\0\2\7\1\320\21\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u01fd\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u04c0\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\5\10\1\u0218\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u04c1\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+ "\1\u01ac\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u04c2\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u04c3\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u04c4\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u04c5\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\u04c6\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\311\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u04c7\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u04c8\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\1\u04c9\21\10\1\7\5\10"+
+ "\1\u04ca\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\1\u036e\5\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\14\10\1\u04cb\2\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04cc"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\6\10\1\u04cd\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u04ce\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\4\10\1\u03f2\1\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\3\10\1\u04cf\13\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u04d0\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u04d1\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u04d2\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u04d3\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u04d4\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u04d5\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u04d6"+
+ "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\12\10\1\u04d7\1\10\1\u04d8\5\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u04d9\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u04da"+
+ "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+ "\1\u04db\1\u04dc\2\10\1\u04dd\2\10\1\u04de\11\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\14\10\1\u0299"+
+ "\2\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u04df\15\10\2\0\1\7"+
+ "\22\10\103\0\1\u04e0\3\0\1\u04e1\13\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u044b\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u04e2\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\1\u04e3\5\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u04e4\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\14\10\1\u04e5\5\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u04e6\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\10\1\u04e7\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\4\10\1\u04e8\1\u0483\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\36\0\1\u04e9\64\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\4\10\1\u04ea\1\10\2\0\6\10\14\0\15\10"+
+ "\1\u04eb\1\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u04ec\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u04ed\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u04ee\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u01b4\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\10\10"+
+ "\1\u04ef\6\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\12\10\1\u04f0\4\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\3\10"+
+ "\1\u04f1\2\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u04f2"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u04f3\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04f4"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u04f5\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\7\10\1\u04f6\7\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u04f7\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u04f8\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\u04f9\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u04fa\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\16\10\1\u04fb"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u04fc\5\10\1\u04fd\2\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\1\10\1\u04fe\4\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u04ff\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\14\10\1\u0500\2\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0501"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\221\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\10\10\1\u0502\11\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u0503\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\u0504\16\10\2\0\1\7"+
+ "\22\10\40\0\1\u0505\142\0\1\u0506\127\0\1\u0507\75\0"+
+ "\1\u0508\124\0\1\u0509\111\0\1\u050a\35\0\1\u050b\70\0"+
+ "\1\u0361\125\0\1\u050c\120\0\1\u050d\67\0\5\u011a\5\0"+
+ "\1\u011a\10\0\2\u011a\1\0\2\u011a\4\0\2\u011a\20\0"+
+ "\1\u011a\1\0\1\u011a\3\0\1\u011a\12\0\1\u011a\20\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0154\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\4\10\1\u050e\12\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u050f\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\2\10\1\u0510\17\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u0511\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0512\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\14\10\1\u0513\2\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0514\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0515\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u0516\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\4\10\1\u0517\15\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\5\10\1\u0518\11\10\2\0"+
+ "\1\7\22\10\40\0\1\u0519\73\0\1\u051a\111\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u051b\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u051c\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\u051d\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\14\10\1\u051e\2\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u051f\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0520\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u0521\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\4\10\1\u02d7\1\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u0522\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0523\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0524\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u0525\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0526\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u0527\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0528\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u0529\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u052a\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u052b\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\5\10\1\u052c\14\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\4\10\1\u052d\15\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u052e\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u052f\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u03a8\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u0530\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0531\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\u0159\5\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u0135\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0532\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0533\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0534\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u0535\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\1\10\1\u0536\4\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\4\10\1\u0537\12\10\2\0\1\7"+
+ "\22\10\1\7\5\10\1\u0538\1\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\1\u03b7\5\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u0539"+
+ "\5\10\1\u053a\7\10\1\105\1\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u04f0\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u053b\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u03f2\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u053c\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\16\10"+
+ "\1\u053d\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\10\1\u053e\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u053f\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\4\10\1\u0540\12\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u0541\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u0542\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0543\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\5\10\1\u0222\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\10\10\1\u0544\11\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\4\10\1\u02da"+
+ "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u0545\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0546\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u0547\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u0548\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\2\10"+
+ "\1\u0549\3\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\12\10\1\u054a\7\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u054b\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\u054c\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u054d\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u054e\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u054f\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u0550\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u0551\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0552\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u0553\4\10\14\0\4\10"+
+ "\1\u0554\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0555\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\u0556\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0557\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\4\10\1\u0558\12\10\2\0\1\7\22\10\35\0"+
+ "\1\u0559\101\0\1\u055a\106\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u055b\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u055c\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\16\10\1\u0135\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u055d\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u055e\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u055f\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u0560\15\10\2\0\1\7\22\10\73\0\1\u0561\27\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u0562\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0563\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u0564"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u0565\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\1\10\1\u0566\20\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0567\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0154\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u0568\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0569\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u056a\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u056b\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u056c\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u056d\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u056e\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u056f\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0570\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\10\10\1\u0571\6\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\15\10\1\u02d9\1\10\2\0\1\7\4\10\1\u02da"+
+ "\15\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u04b9"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02ce\1\10"+
+ "\2\0\1\7\14\10\1\u02dd\5\10\1\7\7\10\1\0"+
+ "\1\u0572\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0573\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\20\10"+
+ "\1\105\1\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u0574\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0575\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u0576\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\10\10\1\u02e1\11\10\41\0\1\u03f6\116\0"+
+ "\1\u03f6\122\0\1\u0577\126\0\1\u02ad\121\0\1\u0578\147\0"+
+ "\1\u0579\75\0\1\u057a\117\0\1\u057b\160\0\1\u02ad\27\0"+
+ "\1\7\7\10\1\0\1\u057c\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u057d\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\u057e\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u057f\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\1\0\1\u0580\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\15\10\1\u02d9\1\10\2\0\1\7"+
+ "\17\10\1\u02de\2\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u0581\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0582\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u0583\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0584\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\12\10\1\u039f\3\10"+
+ "\1\u0585\3\10\35\0\1\u0586\152\0\1\u0587\35\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u04fb\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\u0274\16\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0588\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\4\10"+
+ "\1\u02da\5\10\1\u02dc\7\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\13\10\1\u0589\3\10\2\0\1\7"+
+ "\22\10\1\7\5\10\1\u058a\1\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\1\0"+
+ "\1\u058b\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u058c\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u058d\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\2\10\1\u03ef\17\10\1\7\7\10"+
+ "\1\0\1\u058e\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u058f"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0590\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u0383\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\1\u0250\21\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\4\10\1\u0591\15\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\16\10"+
+ "\1\u0154\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0592\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0135\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0593\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\11\10\1\u0594\5\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\1\u0432\21\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\10\1\274\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\u0595\16\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\4\10\1\u0596"+
+ "\1\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\10"+
+ "\1\u0597\15\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0598\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\u0599\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u059a\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u059b\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u059c\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u059d\1\u059e\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0154\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u059f\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u05a0\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05a1"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\4\10\1\u0420\1\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05a2"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\10\1\u05a3\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u05a4\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u05a5\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u05a6\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u05a7\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\2\10\1\u0154\14\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u05a8\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u05a9\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u05aa\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05ab"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u05ac\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u05ad"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\2\10\1\u05ae\3\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u05af\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\13\10\1\u05b0\6\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u05b1\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\1\u05b2\5\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u05b3\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\13\10\1\u05b4\3\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u05b5\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u05b6\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u05b7\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u05b8\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u037b\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\40\0\1\u05b9\145\0\1\u05ba\37\0\1\7\7\10\1\0"+
+ "\1\u0172\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\5\10\1\u05bb\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u05bc\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05bd"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u05be\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u05bf\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u05c0\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u05c1\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05c2"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\7\10\1\u05c3\7\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u05c4\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05c5"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u05c6\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u05c7"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\7\10\1\u05c8\7\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\u05c9\16\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u05ca\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u034a\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u05cb"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u05cc\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\3\10\1\u05cd\13\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u05ce\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u05cf\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u031d\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u05d0"+
+ "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\4\10\1\u05d1\12\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u04ce\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\67\0\1\u05d2\50\0\1\u05d3\144\0"+
+ "\1\u05d4\120\0\1\u05d5\124\0\1\u05d6\63\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\4\10\1\u05d7\1\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u03f2\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u05d8"+
+ "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u05d9\14\0\17\10\2\0\1\7\22\10"+
+ "\103\0\1\u05da\3\0\1\u05db\13\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\4\10\1\u0249\12\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\10\10\1\u05dc\11\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u05dd"+
+ "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u05de\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\37\0\1\u05df\124\0\1\u05e0\61\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u05e1\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\u05e2\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u05e3\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\26\0\1\u05e4\74\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u05e5\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u01d2\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u0546"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u04ac\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05e6"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\1\u05e7\1\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05e8"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\2\10\1\u05e9\14\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u05ea\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u01d3\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u05eb\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\3\10"+
+ "\1\u05ec\13\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u04fc\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u05ed\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u05ee\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u05ef\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u0135\5\10\14\0\17\10"+
+ "\2\0\1\7\3\10\1\u05f0\16\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u05f1\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\3\10\1\u05f2\13\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u05f3\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\1\u05f4"+
+ "\1\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u05f5\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\5\10\1\u05f6\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\4\10\1\u05f7\1\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u05f8\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\10\1\u05f9"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u05fa\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\21\10\1\u032d\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u05fb\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u05fc\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u05fd\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\1\10\1\u05fe"+
+ "\4\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+ "\1\u05ff\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0600\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0601"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u0602\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0603\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\3\10\1\u0604"+
+ "\13\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u0605\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u0606\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u056a\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u0607"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u04f0\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u0608\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u0609"+
+ "\10\10\2\0\1\7\22\10\35\0\1\u060a\125\0\1\u060b"+
+ "\62\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u060c\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u05c8\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\2\10\1\u060d\14\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\2\10\1\u060e\14\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\u060f\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+ "\1\u0610\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u0611\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u0154\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u0491\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u0612\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\4\10\1\u0613\1\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\1\u0614\21\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\2\10\1\341\14\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0615\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\1\10\1\u05c7\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u0616"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0617\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u0618\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\u0619\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\u061a"+
+ "\5\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\4\10\1\u061b\1\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\156\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\1\u061c"+
+ "\16\10\2\0\1\7\22\10\60\0\1\u061d\101\0\1\u061e"+
+ "\124\0\1\u05d6\121\0\1\u02ad\143\0\1\u02ad\41\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u061f\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\3\10\1\u0485\13\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u0620\10\10\2\0\1\7\22\10\11\0\1\u0621"+
+ "\125\0\1\u0622\106\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\1\10\1\u0623\15\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0624\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u0625\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\72\0\1\u0626\111\0\1\u0627\41\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0628\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\5\10\1\u0629\1\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u062a\15\10\2\0\1\7\22\10\65\0\1\u062b"+
+ "\35\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\4\10\1\u062c\1\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u0279\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\4\10\1\u062d\15\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u062e\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u062f\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\7\10\1\u0630\12\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u0631\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u0632\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10";
+
+ private static final String ZZ_TRANS_PACKED_1 =
+ "\1\u0633\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u0634\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0635"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\u0636\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\u0637\16\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\1\0\1\u0638\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\3\10\1\u0576\13\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\6\10\1\u0639\10\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u063a\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\4\10\1\u063b\1\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\1\10\1\u063c\15\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\2\10"+
+ "\1\u063d\3\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u063e"+
+ "\10\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u063f\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\5\10\1\u0222\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\4\10\1\u0640\15\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0641"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\5\10\1\u0642"+
+ "\14\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0643\15\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\15\10\1\u02d9\1\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\4\10\1\u0644\12\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u0645\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u0154\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\4\10\1\u0491\12\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0646\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\4\10\1\u0647\12\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0648\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u0649\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u064a"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\u064b\5\10\14\0\17\10\2\0"+
+ "\1\7\22\10\37\0\1\u0561\74\0\1\u064c\111\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u064d\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\5\10\1\u064e\1\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\5\10\1\u064f\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\12\10\1\u0650\7\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\1\u0651"+
+ "\5\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u0652\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0653\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u0654\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0655\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u0656\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u0657\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u0491\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\7\10"+
+ "\1\u0658\7\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\7\10\1\u0659\7\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\2\10\1\u065a\13\10\1\u065b"+
+ "\3\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u065c\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u0154\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\2\10\1\u065d\14\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u065e"+
+ "\10\10\2\0\1\7\22\10\63\0\1\u03f6\74\0\1\u050d"+
+ "\65\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u065f"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0660\15\10"+
+ "\2\0\1\7\22\10\27\0\1\u0661\160\0\1\u0662\35\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+ "\1\u0663\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\5\10\1\u0664\11\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\u04fc\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\60\0\1\u046b\101\0"+
+ "\1\u0665\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\1\10\1\u0666\4\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\10\1\u0667"+
+ "\15\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u04ce\14\0\17\10\2\0\1\7\22\10"+
+ "\72\0\1\u0668\30\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u0669\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u066a\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u066b\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\5\10\1\u0135\11\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u066c\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\7\10\1\u066d\7\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u066e\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\4\10\1\u066f\1\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\4\10\1\u0670\1\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u0671\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u0672\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\1\10\1\u0673\15\10\2\0\1\7\22\10\103\0\1\u0674"+
+ "\17\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\1\u031a\21\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u0675\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\11\10\1\u03f2\5\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\14\10\1\u02dd\5\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\13\10\1\u0676\3\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\13\10\1\u031a\3\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\12\10\1\u0154\7\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\341\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\1\u0677\16\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\u0678\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\u0154\16\10\2\0"+
+ "\1\7\22\10\1\7\5\10\1\u0679\1\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u067a\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u067b\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u067c\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\341\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\2\10\1\u067d\14\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u067e\15\10"+
+ "\2\0\1\7\22\10\72\0\1\u067f\30\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0680\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u0681\1\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0682\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\3\10\1\u0683\13\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0684\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u0685\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u0686\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u0687\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\14\10\1\u0688\2\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\u0689\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\2\10\1\u067b\3\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\17\10\1\u02de\2\10\1\7\5\10\1\u068a\1\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\4\10\1\u068b\1\u0222\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\u068c\5\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u068d\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\2\10\1\u068e"+
+ "\17\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u068f"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0380\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\6\10\1\u0690\10\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0154\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\42\0\1\u0691\143\0\1\u0692\37\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u0693\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\12\10"+
+ "\1\u039f\7\10\36\0\1\u0561\64\0\1\7\7\10\1\0"+
+ "\1\u0694\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u0695\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\67\0\1\u0696\33\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u0697\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u0698\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\14\10\1\u0699\5\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u04e4\15\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u069a\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u069b\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u069c\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u024b\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\4\10\1\u0425\12\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u069d\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u03f2"+
+ "\14\10\2\0\1\7\22\10\65\0\1\u069e\35\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\7\10\1\u069f"+
+ "\7\10\2\0\1\7\22\10\1\7\7\10\1\0\1\u06a0"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u06a1\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u06a2\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\4\10\1\u06a3\1\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u06a4\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u04f0"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+ "\1\u06a5\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\4\10\1\u06a6\1\u0222\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\14\10\1\u06a7\2\10\1\u06a8"+
+ "\2\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\2\10\1\u04dc\17\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u067d\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\57\0\1\u06a9\43\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u06aa\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\3\10\1\u06ab\2\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\4\10"+
+ "\1\u06ac\12\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u06ad\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u06ae\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\5\10"+
+ "\1\u02bd\1\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\4\10\1\u06a6\1\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\1\10"+
+ "\1\u06af\15\10\1\u06a8\2\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\4\10\1\u04f0\12\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\2\10\1\u06b0\17\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u0673\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\4\10"+
+ "\1\u03aa\1\10\14\0\1\10\1\u06b1\15\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u06b2\10\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\1\10\1\u06b3\4\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\4\10\1\u06b4\1\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u06b5\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u06b6\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u034a\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\37\0\1\u06b7\143\0"+
+ "\1\u06b8\42\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\10\1\u06b9\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\1\u06ba\1\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\12\10\1\u06bb\4\10\2\0\1\7\22\10\37\0"+
+ "\1\u06bc\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\13\10\1\u04b9\3\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\u06bd\5\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\1\10\1\u06be\4\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u06bf\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\14\10\1\u06c0\2\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\1\0\1\u06c1\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u06c2\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\66\0\1\u06c3\34\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\2\10\1\u06c4\3\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u06c5"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u06c6\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\2\10\1\u0602\14\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u06c7\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u06c8\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u06c9\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\4\10\1\u06ca\1\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\1\10\1\u06cb\4\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\6\10\1\u06cc\10\10\2\0\1\7\22\10\35\0\1\u06cd"+
+ "\65\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u0602"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\5\10\1\u06ce\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u06cf\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u06d0\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\16\10\1\u03f2\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\10\1\u0553\4\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u06d1\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\1\u06d2\1\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u06d3\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\2\10\1\u06d4\3\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\6\10"+
+ "\1\u06d5\10\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\10\1\u06d6\4\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\1\0\1\u06d7"+
+ "\6\10\14\0\17\10\2\0\1\7\22\10\35\0\1\u0561"+
+ "\146\0\1\u06d8\41\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\6\10\1\u06d9\10\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\2\10"+
+ "\1\u024b\14\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\2\10\1\u06da\3\10\14\0\17\10\2\0"+
+ "\1\7\22\10\63\0\1\u06db\37\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u06dc\10\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u06dd\15\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\4\10\1\u06a6\1\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\17\10\2\0\1\7\16\10\1\u0585"+
+ "\3\10\6\0\1\u06de\114\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u06df\10\10\2\0\1\7"+
+ "\22\10\62\0\1\u06e0\40\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u0218\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u030f\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\3\10\1\u06e1\2\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u06e2\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u06e3\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\1\u040d\1\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u06e4\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\3\10\1\u06e5"+
+ "\2\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u06e6\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\2\10\1\u06e7\14\10\2\0\1\7\22\10"+
+ "\32\0\1\u06e8\70\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\5\10\1\u06e9\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\2\10\1\u06ea"+
+ "\14\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u06eb\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\1\u04f0\21\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u06ec\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u01d3"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u06ed\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\2\10\1\u0391\14\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\2\10\1\u06ee\3\10"+
+ "\14\0\17\10\2\0\1\7\22\10\74\0\1\u06ef\65\0"+
+ "\1\u06f0\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\4\10\1\u06d0\12\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\1\10\1\u06f1\4\10\14\0"+
+ "\17\10\2\0\1\7\22\10\65\0\1\u06f2\35\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u06f3\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\5\10\1\240\11\10\2\0\1\7"+
+ "\22\10\60\0\1\u06f4\42\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\3\10\1\u06f5\2\10\14\0\17\10\2\0\1\7"+
+ "\22\10\41\0\1\u06f6\61\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\2\10\1\u06f7\14\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\5\10\1\u06f8"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\5\10\1\u046a\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\2\10\1\u06f9"+
+ "\3\10\14\0\17\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\13\10\1\u0602\3\10"+
+ "\2\0\1\7\22\10\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\2\0"+
+ "\6\10\14\0\4\10\1\u06fa\12\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u0644\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\64\0\1\u06fb\36\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\16\10\1\u06fc\3\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u06fd\10\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\u05d9\5\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\1\u06fe\5\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u06ff\7\10\2\0\1\7\22\10\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\3\10\1\u0700\2\10\14\0\17\10"+
+ "\2\0\1\7\22\10\37\0\1\u0701\111\0\1\u0702\54\0"+
+ "\1\u0703\17\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\5\10"+
+ "\1\u0704\14\0\17\10\2\0\1\7\22\10\66\0\1\u0705"+
+ "\34\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0706"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\14\0\1\u0707"+
+ "\106\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\4\10\1\u0708"+
+ "\1\10\14\0\17\10\2\0\1\7\22\10\37\0\1\u0709"+
+ "\63\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\1\u0460\5\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\5\10\1\u070a"+
+ "\1\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\17\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\17\10\2\0\1\7\14\10\1\u070b\5\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\6\10\1\u057f"+
+ "\10\10\2\0\1\7\22\10\63\0\1\u070c\37\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\2\10\1\u070d\3\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u070e\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\3\10\1\u070f\2\10"+
+ "\14\0\17\10\2\0\1\7\22\10\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\1\0\1\u0710\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\7\10\1\u0711\7\10\2\0\1\7\22\10\61\0\1\u0712"+
+ "\102\0\1\u0713\144\0\1\u0714\37\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u0715\10\10\2\0"+
+ "\1\7\22\10\40\0\1\u0716\62\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\6\10\1\u0717\10\10\2\0"+
+ "\1\7\22\10\35\0\1\u0718\65\0\1\7\7\10\1\0"+
+ "\1\10\1\141\1\0\2\10\1\0\1\7\1\10\4\0"+
+ "\1\u03b7\5\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\22\10\32\0\1\u0333\52\0\1\u0719\15\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\u071a\16\10\2\0"+
+ "\1\7\22\10\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\6\10"+
+ "\14\0\1\10\1\u071b\15\10\2\0\1\7\22\10\37\0"+
+ "\1\u071c\63\0\1\7\7\10\1\0\1\10\1\141\1\0"+
+ "\2\10\1\0\1\7\1\10\4\0\6\10\2\0\1\10"+
+ "\1\u071d\4\10\14\0\17\10\2\0\1\7\22\10\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\6\10\14\0\13\10\1\u0154"+
+ "\3\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\1\u071e\1\10\1\0\1\7\1\10\4\0"+
+ "\6\10\2\0\6\10\14\0\17\10\2\0\1\7\22\10"+
+ "\116\0\1\u071f\4\0\1\7\7\10\1\0\1\10\1\141"+
+ "\1\0\2\10\1\0\1\7\1\10\4\0\6\10\1\0"+
+ "\1\u0720\6\10\14\0\17\10\2\0\1\7\22\10\65\0"+
+ "\1\u0721\115\0\1\u0722\100\0\1\u0723\64\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\1\10\1\u0724\15\10"+
+ "\2\0\1\7\22\10\41\0\1\u0725\61\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\6\10\14\0\17\10\2\0\1\7"+
+ "\1\u0726\21\10\36\0\1\u0727\152\0\1\u0728\34\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\2\10\1\0\1\7"+
+ "\1\10\4\0\6\10\2\0\3\10\1\u0729\2\10\14\0"+
+ "\17\10\2\0\1\7\22\10\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\6\10\14\0\6\10\1\u0615\10\10\2\0\1\7"+
+ "\22\10\62\0\1\u072a\40\0\1\7\7\10\1\0\1\10"+
+ "\1\141\1\0\2\10\1\0\1\7\1\10\4\0\6\10"+
+ "\2\0\5\10\1\u03bc\14\0\17\10\2\0\1\7\22\10"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\2\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\1\u04b9\5\10\14\0"+
+ "\17\10\2\0\1\7\22\10\37\0\1\u072b\200\0\1\u072c"+
+ "\43\0\1\u072d\147\0\1\u072e\124\0\1\u072f\35\0\1\7"+
+ "\7\10\1\0\1\10\1\141\1\0\1\u0730\1\10\1\0"+
+ "\1\7\1\10\4\0\6\10\2\0\6\10\14\0\17\10"+
+ "\2\0\1\7\22\10\25\0\1\u0731\75\0\1\7\7\10"+
+ "\1\0\1\10\1\141\1\0\2\10\1\0\1\7\1\10"+
+ "\4\0\6\10\2\0\2\10\1\u0732\3\10\14\0\17\10"+
+ "\2\0\1\7\22\10\60\0\1\u0733\130\0\1\u0734\34\0"+
+ "\1\7\7\10\1\0\1\10\1\141\1\0\1\u02cd\1\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\22\10\35\0\1\u0735\122\0\1\u0736"+
+ "\76\0\1\u072b\150\0\1\u0737\160\0\1\u0561\107\0\1\u06b7"+
+ "\40\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\6\10\14\0"+
+ "\17\10\2\0\1\7\10\10\1\u03ce\11\10\40\0\1\u0738"+
+ "\62\0\1\7\7\10\1\0\1\10\1\141\1\0\2\10"+
+ "\1\0\1\7\1\10\4\0\6\10\2\0\1\10\1\u03f2"+
+ "\4\10\14\0\17\10\2\0\1\7\22\10\41\0\1\u0561"+
+ "\72\0\1\u0739\176\0\1\u073a\66\0\1\u073b\154\0\1\u073c"+
+ "\132\0\1\u073d\64\0\1\u073e\145\0\1\u073f\127\0\1\u0740"+
+ "\72\0\1\u0741\145\0\1\u0742\102\0\1\u0743\76\0\1\u0744"+
+ "\145\0\1\u0745\117\0\1\u0746\77\0\1\u0747\140\0\1\u0748"+
+ "\203\0\1\u0749\53\0\1\u074a\167\0\1\u074b\51\0\1\u074c"+
+ "\126\0\1\u074d\121\0\1\u074e\143\0\1\u0561\134\0\1\u074f"+
+ "\60\0\1\u0750\130\0\1\u027f\77\0\1\u0751\170\0\1\u060a"+
+ "\120\0\1\u0752\123\0\1\u0753\77\0\1\u0754\125\0\1\u0627"+
+ "\147\0\1\u0561\34\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[151807];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+ "\3\0\2\1\1\0\12\1\2\11\21\1\2\11\4\1"+
+ "\1\11\35\1\1\11\5\1\1\11\12\1\1\11\3\1"+
+ "\1\11\1\1\2\11\24\1\1\0\1\1\1\0\7\1"+
+ "\2\0\54\1\2\0\120\1\2\0\1\11\4\0\1\11"+
+ "\2\0\1\11\16\0\1\11\1\0\1\1\2\0\2\11"+
+ "\3\1\1\0\14\1\2\11\3\1\1\0\2\1\1\11"+
+ "\5\1\1\11\231\1\33\0\1\11\2\0\1\11\15\1"+
+ "\1\11\1\1\1\0\5\1\1\11\163\1\1\0\32\1"+
+ "\2\0\1\1\2\0\1\1\15\0\1\11\11\0\1\11"+
+ "\15\1\1\0\155\1\1\0\32\1\34\0\16\1\1\0"+
+ "\145\1\1\0\27\1\23\0\12\1\1\0\2\1\1\0"+
+ "\112\1\1\0\11\1\1\0\33\1\5\0\1\1\4\0"+
+ "\14\1\2\0\101\1\2\0\7\1\1\0\33\1\11\0"+
+ "\13\1\2\0\76\1\2\0\6\1\1\11\25\1\5\0"+
+ "\4\1\1\0\5\1\2\0\3\1\1\0\55\1\2\0"+
+ "\27\1\5\0\3\1\2\0\3\1\2\0\3\1\1\0"+
+ "\45\1\2\0\21\1\2\0\2\1\2\0\3\1\2\0"+
+ "\3\1\1\0\14\1\1\0\23\1\1\0\24\1\2\0"+
+ "\2\1\1\0\2\1\1\0\13\1\1\0\12\1\1\0"+
+ "\21\1\2\0\3\1\1\0\7\1\1\0\12\1\1\0"+
+ "\15\1\2\0\3\1\1\0\4\1\1\0\1\1\1\0"+
+ "\11\1\1\0\11\1\2\0\2\1\1\0\2\1\1\0"+
+ "\1\1\1\0\7\1\1\0\6\1\2\0\1\1\1\0"+
+ "\1\1\1\0\1\1\1\0\4\1\1\0\5\1\3\0"+
+ "\1\1\1\0\1\1\1\0\1\1\1\0\2\1\1\0"+
+ "\3\1\1\0\1\1\3\0\1\1\1\0\1\1\2\0"+
+ "\2\1\1\0\2\1\5\0\1\1\1\0\1\1\2\0"+
+ "\1\1\6\0\1\1\1\0\1\1\16\0\1\1\23\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[1876];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public GroovyTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = MULTILINE_STRING_DOUBLE;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = MULTILINE_STRING_SINGLE;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether a regular expression token can follow the specified
+ * token.
+ *
+ * @param t The token to check, which may be <code>null</code>.
+ * @return Whether a regular expression token may follow this one.
+ */
+ private static final boolean regexCanFollow(Token t) {
+ char ch;
+ return t==null ||
+ //t.isOperator() ||
+ (t.textCount==1 && (
+ (ch=t.text[t.textOffset])=='=' ||
+ ch=='(' ||
+ ch==',' ||
+ ch=='?' ||
+ ch==':' ||
+ ch=='['
+ )) ||
+ /* Operators "==", "===", "!=", "!==", etc. */
+ (t.type==Token.OPERATOR &&
+ ((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public GroovyTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public GroovyTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 192) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 20:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 47: break;
+ case 3:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 48: break;
+ case 42:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 49: break;
+ case 6:
+ { start = zzMarkedPos-1; yybegin(STRING_DOUBLE);
+ }
+ case 50: break;
+ case 35:
+ { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE);
+ }
+ case 51: break;
+ case 13:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 52: break;
+ case 34:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 53: break;
+ case 21:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 54: break;
+ case 5:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 55: break;
+ case 11:
+ { addToken(Token.ANNOTATION);
+ }
+ case 56: break;
+ case 28:
+ { addToken(Token.FUNCTION);
+ }
+ case 57: break;
+ case 33:
+ { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_SINGLE);
+ }
+ case 58: break;
+ case 2:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 59: break;
+ case 36:
+ { boolean highlightedAsRegex = false;
+ if (zzBuffer[zzStartRead]=='~' || firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (regexCanFollow(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 60: break;
+ case 25:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 61: break;
+ case 40:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_CHAR);
+ }
+ case 62: break;
+ case 45:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 63: break;
+ case 31:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos;
+ }
+ case 64: break;
+ case 44:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+ }
+ case 65: break;
+ case 14:
+ { /* Skip escaped chars, handles case: '\"""'. */
+ }
+ case 66: break;
+ case 24:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 67: break;
+ case 18:
+ { /* Skip escaped chars. */
+ }
+ case 68: break;
+ case 39:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 69: break;
+ case 23:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 70: break;
+ case 26:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 71: break;
+ case 8:
+ { addToken(Token.WHITESPACE);
+ }
+ case 72: break;
+ case 30:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+ }
+ case 73: break;
+ case 38:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 74: break;
+ case 29:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 75: break;
+ case 4:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 76: break;
+ case 32:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 77: break;
+ case 19:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 78: break;
+ case 16:
+ { /* Skip escaped chars, handles case: "\'''". */
+ }
+ case 79: break;
+ case 37:
+ { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+ }
+ case 80: break;
+ case 27:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 81: break;
+ case 43:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 82: break;
+ case 46:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 83: break;
+ case 10:
+ { addToken(Token.SEPARATOR);
+ }
+ case 84: break;
+ case 7:
+ { addNullToken(); return firstToken;
+ }
+ case 85: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 86: break;
+ case 9:
+ { addToken(Token.OPERATOR);
+ }
+ case 87: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 88: break;
+ case 22:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 89: break;
+ case 41:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 90: break;
+ case 1:
+ {
+ }
+ case 91: break;
+ case 15:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 92: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case MULTILINE_STRING_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 1877: break;
+ case DOCCOMMENT: {
+ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 1878: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 1879: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 1880: break;
+ case STRING_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+ }
+ case 1881: break;
+ case MULTILINE_STRING_SINGLE: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 1882: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex
new file mode 100644
index 0000000..a7a36e9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex
@@ -0,0 +1,1187 @@
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated HTMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class HTMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ public static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ public static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ public static final int INTERNAL_IN_JS = -10;
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ public static final int INTERNAL_IN_JS_MLC = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ public static final int INTERNAL_IN_JS_STRING_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ public static final int INTERNAL_IN_JS_STRING_VALID = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ public static final int INTERNAL_IN_JS_CHAR_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ public static final int INTERNAL_IN_JS_CHAR_VALID = -15;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ public static final int INTERNAL_CSS = -16;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ public static final int INTERNAL_CSS_PROPERTY = -17;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ public static final int INTERNAL_CSS_VALUE = -18;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public HTMLTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = 0;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.PREPROCESSOR:
+ state = PI;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ validJSString = false;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ validJSString = true;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ validJSString = false;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ validJSString = true;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ }
+ cssPrevState = -initialTokenType&0xff;
+ languageIndex = LANG_INDEX_CSS;
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace = ([ \t\f]+)
+LineTerminator = ([\n])
+Identifier = ([^ \t\n<&]+)
+EntityReference = ([&][^; \t]*[;]?)
+InTagIdentifier = ([^ \t\n\"\'/=>]+)
+EndScriptTag = ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag = ("</" [sS][tT][yY][lL][eE] ">")
+
+// General stuff.
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+LetterOrUnderscore = ({Letter}|[_])
+LetterOrUnderscoreOrDash = ({LetterOrUnderscore}|[\-])
+
+
+// JavaScript stuff.
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({Letter}|"_"|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin = "/*"
+JS_MLCEnd = "*/"
+JS_LineCommentBegin = "//"
+JS_IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral = ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral = ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1 = ([fFdD]?)
+JS_FloatHelper2 = ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1 = ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2 = ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3 = ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral = ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat = (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator = ([\(\)\{\}\[\]\]])
+JS_Separator2 = ([\;,.])
+JS_NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator = ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier = ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier = ({NonSeparator}+)
+JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+
+// CSS stuff.
+CSS_SelectorPiece = (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass = (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword = ("@"{CSS_SelectorPiece})
+CSS_Id = ("#"{CSS_SelectorPiece})
+CSS_Separator = ([;\(\)\[\]])
+CSS_MlcStart = ({JS_MLCBegin})
+CSS_MlcEnd = ({JS_MLCEnd})
+CSS_Property = ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar = ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value = ({CSS_ValueChar}*)
+CSS_Function = ({CSS_Value}\()
+CSS_Digits = ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex = ("#"[0-9a-fA-F]+)
+CSS_Number = ({CSS_Digits}|{CSS_Hex})
+
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+ "<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
+ "<"[sS][cC][rR][iI][pP][tT] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ "<"[sS][tT][yY][lL][eE] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ "<!" { start = zzMarkedPos-2; yybegin(DTD); }
+ "<?" { start = zzMarkedPos-2; yybegin(PI); }
+ "<"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "</"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); } // Catches everything.
+ {EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+ "-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+ "-" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<PI> {
+ [^\n\?]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+ "?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+ "?" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+ [^\n>]+ {}
+ ">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+ [Aa] |
+ [aA][bB][bB][rR] |
+ [aA][cC][rR][oO][nN][yY][mM] |
+ [aA][dD][dD][rR][eE][sS][sS] |
+ [aA][pP][pP][lL][eE][tT] |
+ [aA][rR][eE][aA] |
+ [aA][rR][tT][iI][cC][lL][eE] |
+ [aA][sS][iI][dD][eE] |
+ [aA][uU][dD][iI][oO] |
+ [bB] |
+ [bB][aA][sS][eE] |
+ [bB][aA][sS][eE][fF][oO][nN][tT] |
+ [bB][dD][oO] |
+ [bB][gG][sS][oO][uU][nN][dD] |
+ [bB][iI][gG] |
+ [bB][lL][iI][nN][kK] |
+ [bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+ [bB][oO][dD][yY] |
+ [bB][rR] |
+ [bB][uU][tT][tT][oO][nN] |
+ [cC][aA][nN][vV][aA][sS] |
+ [cC][aA][pP][tT][iI][oO][nN] |
+ [cC][eE][nN][tT][eE][rR] |
+ [cC][iI][tT][eE] |
+ [cC][oO][dD][eE] |
+ [cC][oO][lL] |
+ [cC][oO][lL][gG][rR][oO][uU][pP] |
+ [cC][oO][mM][mM][aA][nN][dD] |
+ [cC][oO][mM][mM][eE][nN][tT] |
+ [dD][dD] |
+ [dD][aA][tT][aA][gG][rR][iI][dD] |
+ [dD][aA][tT][aA][lL][iI][sS][tT] |
+ [dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+ [dD][eE][lL] |
+ [dD][eE][tT][aA][iI][lL][sS] |
+ [dD][fF][nN] |
+ [dD][iI][aA][lL][oO][gG] |
+ [dD][iI][rR] |
+ [dD][iI][vV] |
+ [dD][lL] |
+ [dD][tT] |
+ [eE][mM] |
+ [eE][mM][bB][eE][dD] |
+ [eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+ [fF][iI][eE][lL][dD][sS][eE][tT] |
+ [fF][iI][gG][uU][rR][eE] |
+ [fF][oO][nN][tT] |
+ [fF][oO][oO][tT][eE][rR] |
+ [fF][oO][rR][mM] |
+ [fF][rR][aA][mM][eE] |
+ [fF][rR][aA][mM][eE][sS][eE][tT] |
+ [hH][123456] |
+ [hH][eE][aA][dD] |
+ [hH][eE][aA][dD][eE][rR] |
+ [hH][rR] |
+ [hH][tT][mM][lL] |
+ [iI] |
+ [iI][fF][rR][aA][mM][eE] |
+ [iI][lL][aA][yY][eE][rR] |
+ [iI][mM][gG] |
+ [iI][nN][pP][uU][tT] |
+ [iI][nN][sS] |
+ [iI][sS][iI][nN][dD][eE][xX] |
+ [kK][bB][dD] |
+ [kK][eE][yY][gG][eE][nN] |
+ [lL][aA][bB][eE][lL] |
+ [lL][aA][yY][eE][rR] |
+ [lL][eE][gG][eE][nN][dD] |
+ [lL][iI] |
+ [lL][iI][nN][kK] |
+ [mM][aA][pP] |
+ [mM][aA][rR][kK] |
+ [mM][aA][rR][qQ][uU][eE][eE] |
+ [mM][eE][nN][uU] |
+ [mM][eE][tT][aA] |
+ [mM][eE][tT][eE][rR] |
+ [mM][uU][lL][tT][iI][cC][oO][lL] |
+ [nN][aA][vV] |
+ [nN][eE][sS][tT] |
+ [nN][oO][bB][rR] |
+ [nN][oO][eE][mM][bB][eE][dD] |
+ [nN][oO][fF][rR][aA][mM][eE][sS] |
+ [nN][oO][lL][aA][yY][eE][rR] |
+ [nN][oO][sS][cC][rR][iI][pP][tT] |
+ [oO][bB][jJ][eE][cC][tT] |
+ [oO][lL] |
+ [oO][pP][tT][gG][rR][oO][uU][pP] |
+ [oO][pP][tT][iI][oO][nN] |
+ [oO][uU][tT][pP][uU][tT] |
+ [pP] |
+ [pP][aA][rR][aA][mM] |
+ [pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+ [pP][rR][eE] |
+ [pP][rR][oO][gG][rR][eE][sS][sS] |
+ [qQ] |
+ [rR][uU][lL][eE] |
+ [sS] |
+ [sS][aA][mM][pP] |
+ [sS][cC][rR][iI][pP][tT] |
+ [sS][eE][cC][tT][iI][oO][nN] |
+ [sS][eE][lL][eE][cC][tT] |
+ [sS][eE][rR][vV][eE][rR] |
+ [sS][mM][aA][lL][lL] |
+ [sS][oO][uU][rR][cC][eE] |
+ [sS][pP][aA][cC][eE][rR] |
+ [sS][pP][aA][nN] |
+ [sS][tT][rR][iI][kK][eE] |
+ [sS][tT][rR][oO][nN][gG] |
+ [sS][tT][yY][lL][eE] |
+ [sS][uU][bB] |
+ [sS][uU][pP] |
+ [tT][aA][bB][lL][eE] |
+ [tT][bB][oO][dD][yY] |
+ [tT][dD] |
+ [tT][eE][xX][tT][aA][rR][eE][aA] |
+ [tT][fF][oO][oO][tT] |
+ [tT][hH] |
+ [tT][hH][eE][aA][dD] |
+ [tT][iI][mM][eE] |
+ [tT][iI][tT][lL][eE] |
+ [tT][rR] |
+ [tT][tT] |
+ [uU] |
+ [uU][lL] |
+ [vV][aA][rR] |
+ [vV][iI][dD][eE][oO] { addToken(Token.MARKUP_TAG_NAME); }
+ {InTagIdentifier} { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+ . { /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+ [^\']* {}
+ [\'] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+ {EndScriptTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+
+ // ECMA 3+ keywords.
+ "break" |
+ "continue" |
+ "delete" |
+ "else" |
+ "for" |
+ "function" |
+ "if" |
+ "in" |
+ "new" |
+ "this" |
+ "typeof" |
+ "var" |
+ "void" |
+ "while" |
+ "with" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ //JavaScript 1.6
+ "each" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+ //JavaScript 1.7
+ "let" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+ // Reserved (but not yet used) ECMA keywords.
+ "abstract" { addToken(Token.RESERVED_WORD); }
+ "boolean" { addToken(Token.DATA_TYPE); }
+ "byte" { addToken(Token.DATA_TYPE); }
+ "case" { addToken(Token.RESERVED_WORD); }
+ "catch" { addToken(Token.RESERVED_WORD); }
+ "char" { addToken(Token.DATA_TYPE); }
+ "class" { addToken(Token.RESERVED_WORD); }
+ "const" { addToken(Token.RESERVED_WORD); }
+ "debugger" { addToken(Token.RESERVED_WORD); }
+ "default" { addToken(Token.RESERVED_WORD); }
+ "do" { addToken(Token.RESERVED_WORD); }
+ "double" { addToken(Token.DATA_TYPE); }
+ "enum" { addToken(Token.RESERVED_WORD); }
+ "export" { addToken(Token.RESERVED_WORD); }
+ "extends" { addToken(Token.RESERVED_WORD); }
+ "final" { addToken(Token.RESERVED_WORD); }
+ "finally" { addToken(Token.RESERVED_WORD); }
+ "float" { addToken(Token.DATA_TYPE); }
+ "goto" { addToken(Token.RESERVED_WORD); }
+ "implements" { addToken(Token.RESERVED_WORD); }
+ "import" { addToken(Token.RESERVED_WORD); }
+ "instanceof" { addToken(Token.RESERVED_WORD); }
+ "int" { addToken(Token.DATA_TYPE); }
+ "interface" { addToken(Token.RESERVED_WORD); }
+ "long" { addToken(Token.DATA_TYPE); }
+ "native" { addToken(Token.RESERVED_WORD); }
+ "package" { addToken(Token.RESERVED_WORD); }
+ "private" { addToken(Token.RESERVED_WORD); }
+ "protected" { addToken(Token.RESERVED_WORD); }
+ "public" { addToken(Token.RESERVED_WORD); }
+ "short" { addToken(Token.DATA_TYPE); }
+ "static" { addToken(Token.RESERVED_WORD); }
+ "super" { addToken(Token.RESERVED_WORD); }
+ "switch" { addToken(Token.RESERVED_WORD); }
+ "synchronized" { addToken(Token.RESERVED_WORD); }
+ "throw" { addToken(Token.RESERVED_WORD); }
+ "throws" { addToken(Token.RESERVED_WORD); }
+ "transient" { addToken(Token.RESERVED_WORD); }
+ "try" { addToken(Token.RESERVED_WORD); }
+ "volatile" { addToken(Token.RESERVED_WORD); }
+ "null" { addToken(Token.RESERVED_WORD); }
+
+ // Literals.
+ "false" |
+ "true" { addToken(Token.LITERAL_BOOLEAN); }
+ "NaN" { addToken(Token.RESERVED_WORD); }
+ "Infinity" { addToken(Token.RESERVED_WORD); }
+
+ // Functions.
+ "eval" |
+ "parseInt" |
+ "parseFloat" |
+ "escape" |
+ "unescape" |
+ "isNaN" |
+ "isFinite" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_JS); return firstToken; }
+ {JS_Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ [\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+ [\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
+ {JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+ /* Attempt to identify regular expressions (not foolproof) - do after comments! */
+ {JS_Regex} {
+ boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* Separators. */
+ {JS_Separator} { addToken(Token.SEPARATOR); }
+ {JS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {JS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+ [^\n\\\"]+ {}
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ \" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+ [^\n\\\']+ {}
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ \' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+ // JavaScript MLC's. This state is essentially Java's MLC state.
+ [^hwf<\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ {JS_MLCEnd} { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_EOL_COMMENT> {
+ [^hwf<\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+<CSS> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_SelectorPiece} { addToken(Token.DATA_TYPE); }
+ {CSS_PseudoClass} { addToken(Token.RESERVED_WORD); }
+ ":" { /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+ {CSS_AtKeyword} { addToken(Token.REGEX); }
+ {CSS_Id} { addToken(Token.VARIABLE); }
+ "{" { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+ [,] { addToken(Token.IDENTIFIER); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ [+>~\^$\|=] { addToken(Token.OPERATOR); }
+ {CSS_Separator} { addToken(Token.SEPARATOR); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Property} { addToken(Token.RESERVED_WORD); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ ":" { addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Value} { addToken(Token.IDENTIFIER); }
+ "!important" { addToken(Token.ANNOTATION); }
+ {CSS_Function} { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ {CSS_Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ ")" { /* End of a function */ addToken(Token.SEPARATOR); }
+ [;] { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+ [,\.] { addToken(Token.IDENTIFIER); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+ [^\n\\\"]+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \" { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \' { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {CSS_MlcEnd} { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java
new file mode 100644
index 0000000..ce1996f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java
@@ -0,0 +1,2984 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 10:01 AM */
+
+/*
+ * 01/24/2005
+ *
+ * HTMLTokenMaker.java - Generates tokens for HTML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for HTML 5 files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated HTMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class HTMLTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int INATTR_SINGLE_SCRIPT = 10;
+ public static final int JS_CHAR = 16;
+ public static final int CSS_STRING = 22;
+ public static final int JS_MLC = 17;
+ public static final int CSS_CHAR_LITERAL = 23;
+ public static final int INTAG_SCRIPT = 8;
+ public static final int CSS_PROPERTY = 20;
+ public static final int CSS_C_STYLE_COMMENT = 24;
+ public static final int CSS = 19;
+ public static final int CSS_VALUE = 21;
+ public static final int COMMENT = 1;
+ public static final int INATTR_DOUBLE_SCRIPT = 9;
+ public static final int PI = 2;
+ public static final int JAVASCRIPT = 14;
+ public static final int INTAG = 4;
+ public static final int INTAG_CHECK_TAG_NAME = 5;
+ public static final int INATTR_SINGLE_STYLE = 13;
+ public static final int DTD = 3;
+ public static final int JS_EOL_COMMENT = 18;
+ public static final int INATTR_DOUBLE_STYLE = 12;
+ public static final int INATTR_SINGLE = 7;
+ public static final int YYINITIAL = 0;
+ public static final int INATTR_DOUBLE = 6;
+ public static final int JS_STRING = 15;
+ public static final int INTAG_STYLE = 11;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\4\1\2\1\0\1\1\1\33\22\0\1\4\1\51\1\7"+
+ "\1\34\1\36\1\50\1\5\1\106\1\103\1\102\1\37\1\42\1\45"+
+ "\1\31\1\43\1\10\1\25\6\123\1\27\2\24\1\53\1\6\1\3"+
+ "\1\46\1\17\1\52\1\101\1\110\1\26\1\12\1\114\1\22\1\41"+
+ "\1\116\1\122\1\14\1\124\1\117\1\21\1\113\1\112\1\111\1\15"+
+ "\1\120\1\13\1\11\1\16\1\115\1\121\1\23\1\40\1\20\1\23"+
+ "\1\105\1\35\1\105\1\47\1\30\1\0\1\67\1\100\1\64\1\66"+
+ "\1\74\1\71\1\56\1\63\1\55\1\124\1\76\1\65\1\75\1\62"+
+ "\1\60\1\73\1\120\1\57\1\70\1\61\1\32\1\77\1\107\1\104"+
+ "\1\72\1\125\1\126\1\47\1\44\1\54\uff81\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 =
+ "\6\0\2\1\1\0\2\1\1\0\2\1\7\0\1\2"+
+ "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+ "\5\1\1\10\2\1\1\11\1\12\2\13\1\14\1\15"+
+ "\1\16\1\17\1\20\1\21\1\22\1\23\2\21\2\23"+
+ "\3\21\2\23\5\21\1\23\3\21\1\23\1\1\1\24"+
+ "\1\1\1\25\1\15\1\26\1\27\1\30\1\31\1\32"+
+ "\1\33\1\34\1\35\1\36\2\17\1\2\1\37\1\17"+
+ "\2\2\1\17\2\40\1\17\1\2\1\35\2\17\1\2"+
+ "\1\41\17\2\1\42\2\2\1\1\1\43\1\44\1\45"+
+ "\1\1\1\46\1\47\1\50\1\1\1\51\6\1\1\52"+
+ "\1\1\1\53\1\54\1\53\1\55\1\53\1\56\1\53"+
+ "\1\57\1\53\1\60\1\61\1\62\1\63\2\62\1\64"+
+ "\1\62\1\65\1\66\1\67\1\70\1\67\1\71\2\2"+
+ "\1\40\1\2\2\67\1\72\1\73\1\74\1\75\1\76"+
+ "\1\77\1\100\1\1\1\101\4\1\1\4\2\102\1\103"+
+ "\1\104\1\6\5\0\1\105\31\21\1\23\1\21\1\23"+
+ "\2\21\1\23\44\21\1\106\3\0\1\107\1\0\1\110"+
+ "\1\17\1\35\1\2\1\17\1\111\1\40\1\111\2\112"+
+ "\1\111\1\113\1\111\1\2\1\64\1\2\1\64\17\2"+
+ "\1\64\34\2\1\114\1\115\1\116\1\0\1\117\6\0"+
+ "\1\120\1\121\15\0\1\122\1\40\5\0\1\40\1\0"+
+ "\1\76\1\123\4\0\1\124\2\102\1\0\1\125\4\0"+
+ "\13\21\1\23\64\21\1\0\1\126\1\0\1\35\1\2"+
+ "\1\112\1\0\2\113\1\2\1\56\23\2\1\127\40\2"+
+ "\41\0\2\102\1\130\2\0\1\131\22\21\1\23\5\21"+
+ "\1\23\12\21\1\0\1\132\1\35\10\2\1\133\6\2"+
+ "\1\56\16\2\1\134\1\2\1\135\4\2\1\0\1\1"+
+ "\3\0\1\136\7\0\1\64\17\0\1\137\2\102\2\0"+
+ "\11\21\1\23\12\21\1\0\1\35\7\2\1\64\10\2"+
+ "\1\64\6\2\24\0\1\102\1\140\12\21\1\0\1\35"+
+ "\5\2\1\141\12\2\14\0\1\142\3\21\1\0\10\2"+
+ "\10\0\1\21\1\0\3\2\2\0\1\143\4\0\1\21"+
+ "\1\144\1\2\1\145\1\146\6\0\1\147";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[804];
+ 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\127\0\256\0\u0105\0\u015c\0\u01b3\0\u020a\0\u0261"+
+ "\0\u02b8\0\u030f\0\u0366\0\u03bd\0\u0414\0\u046b\0\u04c2\0\u0519"+
+ "\0\u0570\0\u05c7\0\u061e\0\u0675\0\u06cc\0\u0723\0\u077a\0\u07d1"+
+ "\0\u0828\0\u087f\0\u08d6\0\u092d\0\u0984\0\u09db\0\u0a32\0\u0a89"+
+ "\0\u092d\0\u0ae0\0\u0b37\0\u0b8e\0\u0be5\0\u0c3c\0\u092d\0\u0c93"+
+ "\0\u0cea\0\u092d\0\u092d\0\u0d41\0\u0d98\0\u092d\0\u0def\0\u092d"+
+ "\0\u092d\0\u092d\0\u0e46\0\u092d\0\u0e9d\0\u0ef4\0\u0f4b\0\u0fa2"+
+ "\0\u0ff9\0\u1050\0\u10a7\0\u10fe\0\u1155\0\u11ac\0\u1203\0\u125a"+
+ "\0\u12b1\0\u1308\0\u135f\0\u13b6\0\u140d\0\u1464\0\u14bb\0\u0e46"+
+ "\0\u1512\0\u092d\0\u1569\0\u092d\0\u15c0\0\u092d\0\u092d\0\u092d"+
+ "\0\u092d\0\u092d\0\u092d\0\u092d\0\u1617\0\u092d\0\u166e\0\u16c5"+
+ "\0\u092d\0\u092d\0\u171c\0\u1773\0\u17ca\0\u1821\0\u1878\0\u18cf"+
+ "\0\u1926\0\u197d\0\u092d\0\u19d4\0\u1a2b\0\u1a82\0\u092d\0\u1ad9"+
+ "\0\u1b30\0\u1b87\0\u1bde\0\u1c35\0\u1c8c\0\u1ce3\0\u1d3a\0\u1d91"+
+ "\0\u1de8\0\u1e3f\0\u1e96\0\u1eed\0\u1f44\0\u1f9b\0\u092d\0\u1ff2"+
+ "\0\u2049\0\u20a0\0\u092d\0\u092d\0\u20f7\0\u214e\0\u092d\0\u20f7"+
+ "\0\u092d\0\u21a5\0\u092d\0\u21fc\0\u2253\0\u22aa\0\u2301\0\u2358"+
+ "\0\u23af\0\u092d\0\u2406\0\u092d\0\u092d\0\u245d\0\u092d\0\u24b4"+
+ "\0\u250b\0\u2562\0\u25b9\0\u2610\0\u092d\0\u092d\0\u092d\0\u092d"+
+ "\0\u245d\0\u24b4\0\u2667\0\u26be\0\u092d\0\u092d\0\u092d\0\u092d"+
+ "\0\u245d\0\u092d\0\u2715\0\u276c\0\u27c3\0\u281a\0\u2871\0\u28c8"+
+ "\0\u092d\0\u092d\0\u092d\0\u092d\0\u291f\0\u092d\0\u092d\0\u2976"+
+ "\0\u092d\0\u29cd\0\u2a24\0\u2a7b\0\u2ad2\0\u2b29\0\u2b80\0\u2bd7"+
+ "\0\u2c2e\0\u092d\0\u092d\0\u2c85\0\u2cdc\0\u2d33\0\u2d8a\0\u2de1"+
+ "\0\u092d\0\u2e38\0\u2e8f\0\u2ee6\0\u2f3d\0\u2f94\0\u2feb\0\u3042"+
+ "\0\u3099\0\u30f0\0\u3147\0\u319e\0\u31f5\0\u324c\0\u32a3\0\u32fa"+
+ "\0\u3351\0\u33a8\0\u33ff\0\u3456\0\u34ad\0\u3504\0\u355b\0\u35b2"+
+ "\0\u3609\0\u3660\0\u36b7\0\u370e\0\u3765\0\u37bc\0\u3813\0\u386a"+
+ "\0\u38c1\0\u3918\0\u396f\0\u39c6\0\u3a1d\0\u3a74\0\u3acb\0\u3b22"+
+ "\0\u3b79\0\u3bd0\0\u3c27\0\u3c7e\0\u3cd5\0\u3d2c\0\u3d83\0\u3dda"+
+ "\0\u3e31\0\u3e88\0\u3edf\0\u3f36\0\u3f8d\0\u3fe4\0\u403b\0\u4092"+
+ "\0\u40e9\0\u4140\0\u4197\0\u41ee\0\u4245\0\u429c\0\u42f3\0\u434a"+
+ "\0\u43a1\0\u43f8\0\u444f\0\u44a6\0\u092d\0\u19d4\0\u44fd\0\u4554"+
+ "\0\u092d\0\u45ab\0\u4602\0\u4554\0\u4659\0\u46b0\0\u4707\0\u475e"+
+ "\0\u475e\0\u47b5\0\u475e\0\u480c\0\u4863\0\u48ba\0\u4911\0\u4968"+
+ "\0\u49bf\0\u4a16\0\u1773\0\u4a6d\0\u4ac4\0\u4b1b\0\u4b72\0\u4bc9"+
+ "\0\u4c20\0\u4c77\0\u4cce\0\u4d25\0\u4d7c\0\u4dd3\0\u4e2a\0\u4e81"+
+ "\0\u4ed8\0\u4f2f\0\u4f86\0\u4fdd\0\u5034\0\u508b\0\u50e2\0\u5139"+
+ "\0\u5190\0\u51e7\0\u523e\0\u5295\0\u52ec\0\u5343\0\u539a\0\u53f1"+
+ "\0\u5448\0\u549f\0\u54f6\0\u554d\0\u55a4\0\u55fb\0\u5652\0\u56a9"+
+ "\0\u5700\0\u5757\0\u57ae\0\u5805\0\u585c\0\u58b3\0\u590a\0\u092d"+
+ "\0\u5961\0\u59b8\0\u5a0f\0\u092d\0\u5a66\0\u5abd\0\u5b14\0\u5b6b"+
+ "\0\u5bc2\0\u5c19\0\u092d\0\u5c70\0\u5cc7\0\u5d1e\0\u5d75\0\u5dcc"+
+ "\0\u5e23\0\u5e7a\0\u5ed1\0\u5f28\0\u5f7f\0\u5fd6\0\u602d\0\u6084"+
+ "\0\u60db\0\u6132\0\u092d\0\u6189\0\u61e0\0\u6237\0\u628e\0\u62e5"+
+ "\0\u2871\0\u633c\0\u092d\0\u092d\0\u6393\0\u63ea\0\u6441\0\u6498"+
+ "\0\u2b29\0\u64ef\0\u6546\0\u659d\0\u092d\0\u65f4\0\u664b\0\u66a2"+
+ "\0\u66f9\0\u6750\0\u67a7\0\u67fe\0\u6855\0\u68ac\0\u6903\0\u695a"+
+ "\0\u69b1\0\u6a08\0\u6a5f\0\u6ab6\0\u6b0d\0\u6b64\0\u6bbb\0\u6c12"+
+ "\0\u6c69\0\u6cc0\0\u6d17\0\u6d6e\0\u6dc5\0\u6e1c\0\u6e73\0\u6eca"+
+ "\0\u6f21\0\u6f78\0\u6fcf\0\u7026\0\u707d\0\u70d4\0\u712b\0\u3765"+
+ "\0\u7182\0\u71d9\0\u7230\0\u7287\0\u72de\0\u7335\0\u738c\0\u73e3"+
+ "\0\u743a\0\u7491\0\u74e8\0\u753f\0\u7596\0\u75ed\0\u7644\0\u11ac"+
+ "\0\u769b\0\u76f2\0\u7749\0\u77a0\0\u77f7\0\u784e\0\u78a5\0\u78fc"+
+ "\0\u7953\0\u79aa\0\u7a01\0\u7a58\0\u7aaf\0\u7b06\0\u7b5d\0\u7bb4"+
+ "\0\u7c0b\0\u7c62\0\u7cb9\0\u7d10\0\u7d67\0\u7dbe\0\u7e15\0\u7e6c"+
+ "\0\u475e\0\u7ec3\0\u7f1a\0\u7f71\0\u7fc8\0\u801f\0\u8076\0\u80cd"+
+ "\0\u8124\0\u817b\0\u81d2\0\u8229\0\u8280\0\u82d7\0\u832e\0\u8385"+
+ "\0\u83dc\0\u8433\0\u848a\0\u84e1\0\u8538\0\u858f\0\u85e6\0\u1773"+
+ "\0\u863d\0\u8694\0\u86eb\0\u8742\0\u8799\0\u87f0\0\u8847\0\u889e"+
+ "\0\u88f5\0\u894c\0\u89a3\0\u89fa\0\u8a51\0\u8aa8\0\u8aff\0\u8b56"+
+ "\0\u8bad\0\u8c04\0\u8c5b\0\u8cb2\0\u8d09\0\u8d60\0\u8db7\0\u8e0e"+
+ "\0\u8e65\0\u8ebc\0\u8f13\0\u8f6a\0\u8fc1\0\u9018\0\u906f\0\u90c6"+
+ "\0\u911d\0\u9174\0\u91cb\0\u9222\0\u9279\0\u92d0\0\u9327\0\u937e"+
+ "\0\u93d5\0\u942c\0\u9483\0\u94da\0\u9531\0\u9588\0\u95df\0\u9636"+
+ "\0\u968d\0\u96e4\0\u973b\0\u9792\0\u97e9\0\u9840\0\u9897\0\u98ee"+
+ "\0\u9945\0\u999c\0\u99f3\0\u9a4a\0\u9aa1\0\u9af8\0\u9b4f\0\u9ba6"+
+ "\0\u9bfd\0\u9c54\0\u9cab\0\u092d\0\u9d02\0\u9d59\0\u9db0\0\u9e07"+
+ "\0\u9e5e\0\u9eb5\0\u9f0c\0\u9f63\0\u9fba\0\ua011\0\ua068\0\ua0bf"+
+ "\0\ua116\0\ua16d\0\ua1c4\0\ua21b\0\ua272\0\ua2c9\0\ua320\0\ua377"+
+ "\0\ua3ce\0\ua425\0\ua47c\0\ua4d3\0\ua52a\0\u386a\0\ua581\0\u7026"+
+ "\0\ua5d8\0\ua62f\0\ua686\0\ua6dd\0\ua734\0\ua78b\0\ua7e2\0\ua839"+
+ "\0\ua890\0\ua8e7\0\ua93e\0\u092d\0\ua995\0\ua9ec\0\uaa43\0\uaa9a"+
+ "\0\uaaf1\0\uab48\0\uab9f\0\uabf6\0\uac4d\0\u1773\0\uaca4\0\uacfb"+
+ "\0\uad52\0\uada9\0\uae00\0\uae57\0\u1773\0\uaeae\0\uaf05\0\uaf5c"+
+ "\0\uafb3\0\ub00a\0\ub061\0\ub0b8\0\ub10f\0\ub166\0\ub1bd\0\ub214"+
+ "\0\ub26b\0\ub2c2\0\ub319\0\u1773\0\ub370\0\u1773\0\ub3c7\0\ub41e"+
+ "\0\ub475\0\ub4cc\0\u59b8\0\u092d\0\ub523\0\ub57a\0\ub5d1\0\ub628"+
+ "\0\ub67f\0\ub6d6\0\ub72d\0\ub784\0\ub7db\0\ub832\0\ub889\0\u092d"+
+ "\0\ub8e0\0\ub937\0\ub98e\0\ub9e5\0\uba3c\0\uba93\0\ubaea\0\ubb41"+
+ "\0\ubb98\0\ubbef\0\ubc46\0\ubc9d\0\ubcf4\0\ubd4b\0\ubda2\0\ubdf9"+
+ "\0\ube50\0\ubea7\0\ubefe\0\u9db0\0\ubf55\0\ubfac\0\uc003\0\uc05a"+
+ "\0\uc0b1\0\uc108\0\uc15f\0\uc1b6\0\uc20d\0\uc264\0\uc264\0\uc2bb"+
+ "\0\uc312\0\uc369\0\uc3c0\0\uc417\0\uc46e\0\uc4c5\0\uc51c\0\uc573"+
+ "\0\uc5ca\0\uc621\0\uc678\0\uc6cf\0\uc726\0\uc77d\0\uc7d4\0\uc82b"+
+ "\0\uc882\0\u8280\0\uc8d9\0\uc930\0\uc987\0\uc9de\0\uca35\0\uca8c"+
+ "\0\ucae3\0\ucb3a\0\ucb91\0\ucbe8\0\ucc3f\0\ucc96\0\ucced\0\ucd44"+
+ "\0\ucd9b\0\ucdf2\0\uce49\0\ub628\0\ucea0\0\ucef7\0\ucf4e\0\ucfa5"+
+ "\0\ucffc\0\ud053\0\ud0aa\0\ud101\0\ud158\0\ud1af\0\ud206\0\ud25d"+
+ "\0\ud2b4\0\ud30b\0\ud362\0\ud3b9\0\ubdf9\0\ud410\0\u2bd7\0\ud467"+
+ "\0\ud4be\0\ud515\0\ud56c\0\ud5c3\0\ud61a\0\ud671\0\ud6c8\0\ud71f"+
+ "\0\ud776\0\ud7cd\0\ud824\0\ud87b\0\ud8d2\0\ud929\0\ud980\0\ud9d7"+
+ "\0\u1773\0\uda2e\0\uda85\0\udadc\0\udb33\0\udb8a\0\udbe1\0\udc38"+
+ "\0\udc8f\0\udce6\0\udd3d\0\udd94\0\uddeb\0\ude42\0\ude99\0\udef0"+
+ "\0\udf47\0\udf9e\0\udff5\0\ue04c\0\ue0a3\0\ue0fa\0\ue151\0\u2bd7"+
+ "\0\ue1a8\0\ue1ff\0\ue256\0\ue2ad\0\ue304\0\ue35b\0\ue3b2\0\ue409"+
+ "\0\ue460\0\ue4b7\0\ue50e\0\ue565\0\ue5bc\0\ue613\0\ue66a\0\ue6c1"+
+ "\0\ue718\0\ue76f\0\ue7c6\0\ue81d\0\ue874\0\ue8cb\0\ue922\0\ue979"+
+ "\0\ue9d0\0\uea27\0\uea7e\0\u092d\0\uead5\0\ueb2c\0\ueb83\0\uebda"+
+ "\0\uec31\0\u092d\0\uec88\0\u092d\0\u092d\0\uecdf\0\ued36\0\ued8d"+
+ "\0\uede4\0\uee3b\0\uee92\0\u092d";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[804];
+ 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 =
+ "\1\32\1\33\1\34\1\35\1\36\1\37\121\32\2\40"+
+ "\1\41\26\40\1\42\31\40\1\43\5\40\1\44\15\40"+
+ "\1\45\17\40\2\46\1\47\47\46\1\50\54\46\2\51"+
+ "\1\52\14\51\1\53\107\51\1\54\1\55\1\0\1\54"+
+ "\1\36\2\54\1\56\1\57\6\54\1\60\26\54\1\61"+
+ "\37\54\1\62\20\54\2\63\1\0\1\63\1\64\2\63"+
+ "\2\64\1\65\1\66\1\67\1\70\1\71\1\72\1\64"+
+ "\1\63\1\73\1\74\3\63\1\75\3\63\1\76\6\63"+
+ "\1\77\4\63\1\64\6\63\1\70\1\63\1\67\1\100"+
+ "\1\72\1\101\1\102\1\66\1\73\1\103\1\104\1\65"+
+ "\1\77\1\63\1\71\1\74\1\105\1\106\1\107\1\75"+
+ "\5\63\1\64\1\63\1\104\1\100\1\101\1\105\1\103"+
+ "\1\76\1\63\1\106\1\110\1\107\1\102\4\63\7\111"+
+ "\1\112\117\111\106\113\1\112\20\113\1\54\1\55\1\0"+
+ "\1\54\1\36\2\54\1\114\1\115\6\54\1\116\26\54"+
+ "\1\61\37\54\1\117\20\54\7\111\1\120\117\111\106\113"+
+ "\1\120\20\113\1\54\1\55\1\0\1\54\1\36\2\54"+
+ "\1\121\1\115\6\54\1\122\26\54\1\61\37\54\1\123"+
+ "\20\54\7\111\1\124\117\111\106\113\1\124\20\113\1\125"+
+ "\1\36\1\126\1\127\1\36\1\130\1\131\1\132\1\133"+
+ "\3\134\1\135\2\134\1\136\4\134\1\137\1\140\1\134"+
+ "\1\137\1\134\1\141\1\142\1\143\2\125\1\134\1\144"+
+ "\2\134\1\145\1\146\1\147\1\131\4\144\3\61\1\150"+
+ "\1\151\1\152\1\134\1\153\1\154\1\134\1\155\1\156"+
+ "\1\157\1\160\1\161\1\162\1\134\1\163\1\164\2\134"+
+ "\1\165\1\166\1\125\2\147\1\134\1\147\1\167\1\170"+
+ "\2\134\1\171\10\134\1\137\2\134\1\147\2\172\1\173"+
+ "\4\172\1\174\25\172\1\175\71\172\2\176\1\177\32\176"+
+ "\1\200\50\176\1\201\20\176\2\202\1\203\1\204\33\202"+
+ "\1\205\23\202\1\206\5\202\1\207\15\202\1\210\17\202"+
+ "\2\211\1\212\1\213\57\211\1\206\5\211\1\207\15\211"+
+ "\1\210\17\211\1\214\1\36\1\215\1\216\1\36\1\214"+
+ "\1\147\1\217\1\220\6\221\1\61\4\221\2\214\1\221"+
+ "\1\214\3\221\1\214\1\222\1\214\1\61\3\221\1\61"+
+ "\1\221\1\214\1\131\2\61\3\214\1\223\1\61\24\221"+
+ "\1\224\2\147\1\221\1\147\1\225\14\221\1\214\2\221"+
+ "\1\226\1\227\1\36\1\230\1\231\1\36\3\227\1\232"+
+ "\6\233\1\227\4\233\2\227\1\233\1\227\3\233\4\227"+
+ "\1\234\2\233\2\227\1\235\6\227\1\236\1\227\24\233"+
+ "\3\227\1\233\2\227\14\233\1\227\2\233\1\227\1\237"+
+ "\1\36\1\240\1\241\1\36\1\237\1\242\1\217\1\243"+
+ "\6\244\1\237\4\244\2\245\1\244\1\245\1\244\1\246"+
+ "\1\244\1\237\1\247\1\244\2\237\2\244\1\237\1\131"+
+ "\1\235\1\131\3\237\1\250\3\237\24\244\1\237\1\251"+
+ "\1\252\1\244\1\237\1\225\14\244\1\245\2\244\1\237"+
+ "\2\172\1\253\4\172\1\254\25\172\1\255\71\172\2\176"+
+ "\1\256\32\176\1\255\50\176\1\257\20\176\2\260\1\261"+
+ "\34\260\1\262\23\260\1\263\5\260\1\264\15\260\1\265"+
+ "\17\260\2\32\4\0\122\32\1\33\2\0\1\36\1\0"+
+ "\121\32\137\0\1\266\1\267\5\270\1\0\10\270\2\0"+
+ "\1\270\5\0\2\270\7\0\1\271\1\272\2\0\13\270"+
+ "\1\267\10\270\3\0\1\270\2\0\17\270\2\0\1\36"+
+ "\2\0\1\36\122\0\4\37\1\0\1\37\1\273\120\37"+
+ "\2\40\1\0\26\40\1\0\31\40\1\0\5\40\1\0"+
+ "\15\40\1\0\17\40\31\0\1\274\156\0\1\275\122\0"+
+ "\1\276\3\0\1\277\154\0\1\300\17\0\2\46\1\0"+
+ "\47\46\1\0\54\46\17\0\1\301\107\0\2\51\1\0"+
+ "\14\51\1\0\107\51\2\54\1\0\1\54\1\0\2\54"+
+ "\2\0\6\54\1\0\26\54\1\0\37\54\1\0\21\54"+
+ "\1\55\1\0\1\54\1\36\2\54\2\0\6\54\1\0"+
+ "\26\54\1\0\37\54\1\0\20\54\17\0\1\60\107\0"+
+ "\2\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\37\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\1\63\1\302\2\63\1\303\1\304\1\0"+
+ "\2\63\1\305\7\63\1\306\13\63\1\0\11\63\1\307"+
+ "\1\304\2\63\1\302\2\63\1\310\3\63\1\303\1\305"+
+ "\1\311\10\63\1\0\1\63\1\310\1\307\1\63\1\311"+
+ "\1\63\1\306\13\63\1\0\1\63\1\0\2\63\2\0"+
+ "\3\63\1\312\2\63\1\0\2\63\1\313\23\63\1\0"+
+ "\6\63\1\312\2\63\1\314\6\63\1\315\4\63\1\313"+
+ "\11\63\1\0\1\63\1\315\1\314\17\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\12\63\1\316\13\63"+
+ "\1\0\37\63\1\0\6\63\1\316\13\63\1\0\1\63"+
+ "\1\0\2\63\2\0\1\317\5\63\1\0\1\63\1\320"+
+ "\17\63\1\321\4\63\1\0\13\63\1\322\2\63\1\320"+
+ "\2\63\1\317\1\321\3\63\1\323\10\63\1\0\3\63"+
+ "\1\322\1\323\15\63\1\0\1\63\1\0\2\63\2\0"+
+ "\2\63\1\324\3\63\1\0\1\63\1\325\24\63\1\0"+
+ "\10\63\1\324\5\63\1\325\1\63\1\326\16\63\1\0"+
+ "\1\63\1\326\20\63\1\0\1\63\1\0\2\63\2\0"+
+ "\2\63\1\110\1\327\1\63\1\110\1\0\2\63\1\330"+
+ "\3\63\1\331\12\63\1\332\4\63\1\0\6\63\1\327"+
+ "\1\63\1\110\1\63\1\110\1\63\1\333\2\63\1\110"+
+ "\1\334\1\63\1\332\2\63\1\330\3\63\1\331\5\63"+
+ "\1\0\1\63\1\334\3\63\1\110\5\63\1\333\6\63"+
+ "\1\0\1\63\1\0\2\63\2\0\3\63\1\335\2\63"+
+ "\1\0\2\63\1\336\23\63\1\0\6\63\1\335\11\63"+
+ "\1\337\4\63\1\336\11\63\1\0\1\63\1\337\20\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\26\63\1\340\1\63\1\341\6\63\1\0\4\63"+
+ "\1\340\5\63\1\341\7\63\1\0\1\63\1\0\2\63"+
+ "\2\0\2\63\1\110\1\323\2\63\1\0\1\63\1\342"+
+ "\10\63\1\343\13\63\1\0\6\63\1\323\1\344\1\110"+
+ "\1\345\4\63\1\342\1\346\1\347\16\63\1\0\1\63"+
+ "\1\347\1\345\2\63\1\346\1\343\1\344\12\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\1\63\1\110"+
+ "\24\63\1\0\16\63\1\110\20\63\1\0\22\63\1\0"+
+ "\1\63\1\0\2\63\2\0\2\63\1\350\1\351\2\63"+
+ "\1\0\26\63\1\0\6\63\1\351\1\63\1\350\1\352"+
+ "\25\63\1\0\2\63\1\352\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\4\63\1\353\1\63\1\0\1\63\1\110"+
+ "\4\63\1\354\3\63\1\355\13\63\1\0\16\63\1\110"+
+ "\5\63\1\353\4\63\1\354\5\63\1\0\6\63\1\355"+
+ "\13\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\2\63\1\356\23\63\1\0\11\63\1\357\6\63\1\360"+
+ "\4\63\1\356\11\63\1\0\1\63\1\360\1\357\17\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\110\2\63"+
+ "\1\361\1\0\2\63\1\362\23\63\1\0\10\63\1\110"+
+ "\1\63\1\361\12\63\1\362\11\63\1\0\14\63\1\110"+
+ "\5\63\1\0\1\63\1\0\2\63\2\0\3\63\1\363"+
+ "\1\63\1\110\1\0\1\63\1\110\1\364\16\63\1\365"+
+ "\4\63\1\0\6\63\1\363\3\63\1\110\3\63\2\110"+
+ "\1\366\1\63\1\365\2\63\1\364\11\63\1\0\1\63"+
+ "\1\366\3\63\1\110\14\63\1\0\1\63\1\0\2\63"+
+ "\2\0\1\367\1\370\1\371\1\63\1\372\1\63\1\0"+
+ "\6\63\1\373\3\63\1\374\13\63\1\0\10\63\1\371"+
+ "\4\63\1\370\1\63\1\375\1\63\1\367\2\63\1\372"+
+ "\4\63\1\373\5\63\1\0\5\63\1\375\1\374\13\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+ "\1\376\7\63\1\377\13\63\1\0\20\63\1\u0100\4\63"+
+ "\1\376\11\63\1\0\1\63\1\u0100\4\63\1\377\13\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+ "\1\u0101\3\63\1\u0102\17\63\1\0\25\63\1\u0101\3\63"+
+ "\1\u0102\5\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\3\63\1\u0103\2\63\1\0\26\63\1\0\6\63"+
+ "\1\u0103\11\63\1\u0104\16\63\1\0\1\63\1\u0104\16\63"+
+ "\7\111\1\0\117\111\106\113\1\0\20\113\17\0\1\u0105"+
+ "\107\0\1\125\10\0\6\125\1\0\11\125\1\0\1\125"+
+ "\1\0\3\125\1\0\2\125\13\0\25\125\2\0\1\125"+
+ "\2\0\17\125\4\0\1\u0106\4\0\1\u0107\35\0\1\61"+
+ "\65\0\1\61\40\0\1\61\60\0\10\u0108\1\u0109\24\u0108"+
+ "\1\u010a\1\u0108\1\u010b\6\u0108\1\u010c\60\u0108\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\24\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\5\134\1\u010e\16\134\1\125\2\0\1\134\2\0"+
+ "\17\134\20\0\1\u010f\26\0\1\61\60\0\1\u0110\10\0"+
+ "\6\u0110\1\0\1\u0110\1\u0111\1\u0112\1\u0110\2\137\1\u0110"+
+ "\1\137\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+ "\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u0111\1\u0113\2\u0110"+
+ "\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110\2\0\5\u0110"+
+ "\1\u0113\6\u0110\1\137\2\u0110\1\0\1\u0110\10\0\6\u0110"+
+ "\1\0\1\u0110\1\u0111\1\u0112\1\u0110\1\u0115\1\u0116\1\u0110"+
+ "\1\u0116\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0117"+
+ "\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u0111\1\u0113\2\u0110"+
+ "\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0117\2\0\5\u0110"+
+ "\1\u0113\6\u0110\1\u0116\2\u0110\32\0\1\61\14\0\1\61"+
+ "\60\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+ "\1\u0118\16\134\1\125\2\0\1\134\2\0\17\134\47\0"+
+ "\1\61\122\0\1\61\3\0\1\61\104\0\2\u0114\1\0"+
+ "\1\u0114\73\0\1\u0114\3\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\5\134\1\u0119\5\134\1\u011a\1\u011b\3\134"+
+ "\1\u011c\3\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u011d"+
+ "\20\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u011e\4\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\2\134\1\u011f\3\134\1\u0120"+
+ "\6\134\1\u0121\6\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\u0122"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+ "\1\u0123\4\134\1\u0124\4\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\3\134\1\u0125\2\134\1\u0126\1\134\1\u0127\1\134\1\u0128"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0129\13\134"+
+ "\1\u012a\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u012b"+
+ "\13\134\1\u012c\4\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\23\134"+
+ "\1\u012d\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\u012e\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u012f\1\134"+
+ "\1\u0130\6\134\1\u0131\6\134\1\125\2\0\1\134\2\0"+
+ "\1\u0132\16\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\u0133\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\1\u0134\2\134\1\u0135\4\134\1\u0136\1\134\1\u0137"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\u0138\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\2\134\1\u0139\7\134"+
+ "\1\u013a\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u013b"+
+ "\2\134\1\u013c\1\134\1\u013d\1\u013e\6\134\1\u013f\1\134"+
+ "\1\125\2\0\1\u0140\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\3\134\1\u0141\6\134\1\u0135"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\2\134\1\u0142\1\u0143"+
+ "\11\134\1\u0144\6\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u0145"+
+ "\5\134\1\u0146\15\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+ "\1\u0147\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\2\172\1\0\4\172\1\0\25\172\1\0\71\172\2\u0148"+
+ "\1\0\27\u0148\1\u0149\51\u0148\1\u014a\22\u0148\2\176\1\0"+
+ "\32\176\1\0\50\176\1\0\20\176\2\202\2\0\33\202"+
+ "\1\0\23\202\1\0\5\202\1\0\15\202\1\0\17\202"+
+ "\10\0\1\u014b\126\0\1\u014c\177\0\1\u014d\122\0\1\u014e"+
+ "\3\0\1\u014f\154\0\1\u0150\17\0\2\211\2\0\57\211"+
+ "\1\0\5\211\1\0\15\211\1\0\17\211\10\0\1\u0151"+
+ "\126\0\1\u0152\155\0\1\u0153\100\0\6\221\1\0\13\221"+
+ "\5\0\2\221\1\0\1\221\11\0\24\221\3\0\1\221"+
+ "\2\0\17\221\12\0\6\u0154\1\0\4\u0154\2\0\1\u0154"+
+ "\1\0\3\u0154\4\0\3\u0154\1\0\1\u0154\11\0\24\u0154"+
+ "\3\0\1\u0154\2\0\14\u0154\1\0\2\u0154\54\0\1\u0155"+
+ "\3\0\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c"+
+ "\1\u015d\1\u015e\1\0\1\u015f\2\0\1\u0160\2\0\1\u0161"+
+ "\40\0\6\u0162\1\0\4\u0162\2\0\1\u0162\1\0\3\u0162"+
+ "\4\0\3\u0162\1\0\1\u0162\11\0\24\u0162\3\0\1\u0162"+
+ "\2\0\14\u0162\1\0\2\u0162\12\0\6\233\1\0\13\233"+
+ "\5\0\2\233\13\0\24\233\3\0\1\233\2\0\17\233"+
+ "\12\0\6\233\1\0\4\233\2\0\1\233\1\0\3\233"+
+ "\5\0\2\233\13\0\24\233\3\0\1\233\2\0\14\233"+
+ "\1\0\2\233\11\0\7\244\1\0\4\244\2\0\1\244"+
+ "\1\0\3\244\2\0\1\244\1\0\1\u0153\2\244\13\0"+
+ "\24\244\2\0\1\252\1\244\2\0\14\244\1\0\2\244"+
+ "\11\0\7\244\1\0\4\244\2\0\1\244\1\0\3\244"+
+ "\2\0\1\244\2\0\2\244\13\0\24\244\2\0\1\252"+
+ "\1\244\2\0\14\244\1\0\2\244\25\0\2\245\1\0"+
+ "\1\245\13\0\1\245\4\0\1\u0163\4\0\1\u0164\6\0"+
+ "\1\u0165\3\0\1\u0163\2\0\1\u0166\1\u0167\1\u0168\25\0"+
+ "\1\245\13\0\7\244\1\0\4\244\2\245\1\244\1\245"+
+ "\3\244\2\0\1\244\2\0\2\244\13\0\24\244\2\0"+
+ "\1\252\1\244\2\0\14\244\1\245\2\244\13\0\1\u0169"+
+ "\7\0\1\u0169\1\0\4\u0169\11\0\1\u0169\22\0\1\u0169"+
+ "\1\0\2\u0169\1\0\1\u0169\2\0\1\u0169\3\0\1\u0169"+
+ "\7\0\1\u0169\3\0\1\u0169\6\0\1\u0169\60\0\1\u016a"+
+ "\51\0\2\u016b\1\0\124\u016b\2\260\1\0\34\260\1\0"+
+ "\23\260\1\0\5\260\1\0\15\260\1\0\17\260\10\0"+
+ "\1\u016c\177\0\1\u016d\122\0\1\u016e\3\0\1\u016f\154\0"+
+ "\1\u0170\30\0\6\u0171\1\0\10\u0171\2\0\1\u0171\5\0"+
+ "\2\u0171\13\0\24\u0171\3\0\1\u0171\2\0\17\u0171\12\0"+
+ "\1\270\1\u0172\3\270\1\u0173\1\0\10\270\2\0\1\270"+
+ "\5\0\2\270\13\0\4\270\1\u0173\2\270\1\u0172\14\270"+
+ "\3\0\1\270\2\0\17\270\12\0\6\270\1\0\10\270"+
+ "\2\0\1\270\5\0\2\270\13\0\24\270\3\0\1\270"+
+ "\2\0\17\270\32\0\1\u0174\114\0\1\u0175\170\0\1\u0176"+
+ "\132\0\1\u0177\134\0\1\u0178\142\0\1\u0179\17\0\2\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\u017a\3\63"+
+ "\1\0\26\63\1\0\10\63\1\u017a\26\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\20\63\1\u017b\16\63\1\0\1\63\1\u017b\20\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\u017c\3\63"+
+ "\1\0\1\316\25\63\1\0\10\63\1\u017c\12\63\1\316"+
+ "\13\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\1\63\1\u017d\1\u017e\3\63\1\0\1\63\1\u017f\24\63"+
+ "\1\0\10\63\1\u017e\4\63\1\u017d\1\u017f\20\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\4\63\1\110"+
+ "\1\63\1\0\6\63\1\110\17\63\1\0\24\63\1\110"+
+ "\4\63\1\110\5\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\12\63\1\u0180\13\63\1\0"+
+ "\37\63\1\0\6\63\1\u0180\13\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\26\63\1\u0181"+
+ "\10\63\1\0\4\63\1\u0181\15\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0182"+
+ "\16\63\1\0\1\63\1\u0182\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\5\63\1\u0183\1\0\26\63\1\0\12\63"+
+ "\1\u0183\24\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\26\63\1\0\13\63\1\u0184\23\63"+
+ "\1\0\3\63\1\u0184\16\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\1\63\1\u0185\24\63\1\0\16\63"+
+ "\1\u0185\1\u0183\6\63\1\u0186\10\63\1\0\4\63\1\u0186"+
+ "\1\u0183\14\63\1\0\1\63\1\0\2\63\2\0\4\63"+
+ "\1\u017d\1\63\1\0\26\63\1\0\13\63\1\u0187\10\63"+
+ "\1\u017d\12\63\1\0\3\63\1\u0187\16\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\1\63\1\u0183\24\63"+
+ "\1\0\16\63\1\u0183\20\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\3\63\1\u0188\2\63\1\0\26\63"+
+ "\1\0\6\63\1\u0188\30\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u0189\16\63\1\0\1\63\1\u0189\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\2\63\1\u018a\3\63\1\0\26\63"+
+ "\1\0\10\63\1\u018a\26\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\1\110\3\63\1\u018b\1\63\1\0"+
+ "\26\63\1\0\21\63\1\110\2\63\1\u018b\12\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\7\63\1\110\27\63\1\0\7\63\1\110"+
+ "\12\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\2\63\1\110\23\63\1\0\11\63\1\u018c\13\63\1\110"+
+ "\11\63\1\0\2\63\1\u018c\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u018d"+
+ "\16\63\1\0\1\63\1\u018d\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u018e\3\63\1\0\26\63\1\0"+
+ "\10\63\1\u018e\26\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\5\63\1\316\1\0\26\63\1\0\12\63"+
+ "\1\316\13\63\1\u0183\10\63\1\0\4\63\1\u0183\15\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\20\63"+
+ "\1\u018f\5\63\1\0\35\63\1\u018f\1\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\11\63\1\345\25\63\1\0\2\63\1\345\17\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\11\63\1\u0190\25\63\1\0\2\63\1\u0190\17\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+ "\1\u0191\23\63\1\0\25\63\1\u0191\11\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\6\63"+
+ "\1\316\17\63\1\0\31\63\1\316\5\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\13\63\1\u0192\23\63\1\0\3\63\1\u0192\16\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\7\63\1\u0193\27\63\1\0\7\63\1\u0193\12\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\1\u0194"+
+ "\5\63\1\u0195\17\63\1\0\23\63\1\u0194\5\63\1\u0195"+
+ "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\6\63\1\u0196\17\63\1\0\31\63\1\u0196"+
+ "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\2\63\1\u0197\23\63\1\0\25\63\1\u0197"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\3\63\1\u0198\2\63\1\0\26\63\1\0\6\63\1\u0198"+
+ "\2\63\1\u0199\25\63\1\0\2\63\1\u0199\17\63\1\0"+
+ "\1\63\1\0\2\63\2\0\5\63\1\u019a\1\0\26\63"+
+ "\1\0\12\63\1\u019a\24\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\1\u019b\5\63\1\0\26\63\1\0"+
+ "\21\63\1\u019b\15\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u019c"+
+ "\17\63\1\0\5\63\1\u019c\14\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\110"+
+ "\25\63\1\0\2\63\1\110\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\1\u019d\5\63\1\0\26\63\1\0\21\63"+
+ "\1\u019d\15\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\26\63\1\0\20\63\1\u019e\16\63"+
+ "\1\0\1\63\1\u019e\20\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\2\63\1\u019f\23\63\1\0\7\63"+
+ "\1\u01a0\15\63\1\u019f\11\63\1\0\7\63\1\u01a0\12\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\u01a1\3\63"+
+ "\1\0\26\63\1\0\10\63\1\u01a1\1\u0184\1\63\1\u01a2"+
+ "\23\63\1\0\2\63\1\u0184\1\u01a2\16\63\1\0\1\63"+
+ "\1\0\2\63\2\0\5\63\1\u01a3\1\0\26\63\1\0"+
+ "\12\63\1\u01a3\24\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\37\63\1\0"+
+ "\15\63\1\u017f\4\63\1\0\1\63\1\0\2\63\2\0"+
+ "\5\63\1\u01a4\1\0\26\63\1\0\12\63\1\u01a4\24\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\u01a2"+
+ "\5\63\1\0\26\63\1\0\21\63\1\u01a2\15\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\1\u01a5\5\63"+
+ "\1\0\1\63\1\320\1\u01a6\3\63\1\u0104\12\63\1\u01a7"+
+ "\4\63\1\0\16\63\1\320\2\63\1\u01a5\1\u01a7\2\63"+
+ "\1\u01a6\3\63\1\u0104\5\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\30\63"+
+ "\1\110\6\63\1\0\12\63\1\110\7\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\26\63"+
+ "\1\u01a8\10\63\1\0\4\63\1\u01a8\15\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u01a9\16\63\1\0\1\63\1\u01a9\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\2\63\1\110\3\63\1\0\26\63"+
+ "\1\0\10\63\1\110\7\63\1\u01aa\7\63\1\110\6\63"+
+ "\1\0\1\63\1\u01aa\10\63\1\110\7\63\1\0\1\63"+
+ "\1\0\2\63\2\0\5\63\1\u01ab\1\0\1\63\1\110"+
+ "\24\63\1\0\12\63\1\u01ab\3\63\1\110\20\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\13\63\1\110\23\63\1\0\3\63\1\110"+
+ "\16\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u01ac"+
+ "\1\0\26\63\1\0\12\63\1\u01ac\24\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\3\63\1\u01ad\2\63"+
+ "\1\0\26\63\1\0\6\63\1\u01ad\30\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\u01ae\3\63"+
+ "\1\0\26\63\1\0\10\63\1\u01ae\26\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\5\63\1\u01af\1\0"+
+ "\2\63\1\u01b0\23\63\1\0\12\63\1\u01af\12\63\1\u01b0"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\4\63\1\u01b1\1\63\1\0\26\63\1\0\24\63\1\u01b1"+
+ "\12\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\6\63\1\u0104\17\63\1\0\31\63\1\u0104"+
+ "\5\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\17\63\1\u01b2\17\63\1\0"+
+ "\5\63\1\u01b2\14\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\17\63\1\u01b3\17\63\1\0"+
+ "\5\63\1\u01b3\14\63\1\0\1\63\1\0\2\63\2\0"+
+ "\5\63\1\u01b4\1\0\26\63\1\0\12\63\1\u01b4\1\u01b5"+
+ "\23\63\1\0\3\63\1\u01b5\16\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\1\63\1\u01b6\24\63\1\0"+
+ "\16\63\1\u01b6\20\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u01b7\1\63\1\110\1\63\1\0"+
+ "\26\63\1\0\10\63\1\u01b7\13\63\1\110\12\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\1\u01b8\25\63\1\0\23\63\1\u01b8\13\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\17\63\1\110\17\63\1\0\5\63\1\110\14\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\17\63\1\u01b9\17\63\1\0\5\63\1\u01b9\14\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\110\3\63"+
+ "\1\0\26\63\1\0\10\63\1\110\26\63\1\0\20\63"+
+ "\11\0\1\u01ba\56\0\1\u01ba\36\0\10\u0108\1\u01bb\24\u0108"+
+ "\1\u010a\73\u0108\1\0\124\u0108\37\0\1\u01bc\67\0\1\125"+
+ "\10\0\6\125\1\0\11\125\1\0\1\u01bd\1\0\3\125"+
+ "\1\0\2\125\13\0\25\125\2\0\1\125\2\0\17\125"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\14\134"+
+ "\1\u01be\7\134\1\125\2\0\1\134\2\0\17\134\20\0"+
+ "\1\144\26\0\1\61\60\0\1\u0110\10\0\6\u0110\1\0"+
+ "\11\u0110\1\0\1\u0110\1\0\3\u0110\1\0\2\u0110\13\0"+
+ "\25\u0110\2\0\1\u0110\2\0\17\u0110\1\0\1\u0110\10\0"+
+ "\6\u0110\1\0\4\u0110\2\u01bf\1\u0110\1\u01bf\1\u0110\1\u01c0"+
+ "\1\u0110\1\0\3\u0110\1\0\2\u0110\1\u01c0\12\0\25\u0110"+
+ "\2\0\1\u0110\2\0\14\u0110\1\u01bf\2\u0110\1\0\1\u0110"+
+ "\10\0\6\u0110\1\0\2\u0110\1\u0112\1\u0110\2\u0114\1\u0110"+
+ "\1\u0114\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+ "\1\u0113\13\0\11\u0110\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112"+
+ "\5\u0110\2\0\1\u0110\2\0\5\u0110\1\u0113\6\u0110\1\u0114"+
+ "\2\u0110\1\0\1\u0110\10\0\6\u0110\1\0\2\u0110\1\u0112"+
+ "\1\u0110\2\u0115\1\u0110\1\u0115\1\u0110\1\0\1\u0110\1\0"+
+ "\3\u0110\1\0\1\u0110\1\u0113\1\0\1\u0114\11\0\11\u0110"+
+ "\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110"+
+ "\2\0\5\u0110\1\u0113\6\u0110\1\u0115\2\u0110\1\0\1\u0110"+
+ "\10\0\6\u0110\1\0\1\u0110\1\u01c1\1\u0112\1\u0110\1\u0115"+
+ "\1\u0116\1\u0110\1\u0116\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+ "\1\0\1\u0110\1\u0113\1\0\1\u0114\11\0\10\u0110\1\u01c1"+
+ "\1\u0113\2\u0110\1\u0113\2\u0110\1\u0112\5\u0110\2\0\1\u0110"+
+ "\2\0\5\u0110\1\u0113\6\u0110\1\u0116\2\u0110\1\0\1\u0110"+
+ "\10\0\1\u0110\1\u01c2\4\u0110\1\0\2\u0110\1\u01c2\1\u0110"+
+ "\4\u01c2\1\u0110\1\0\1\u0110\1\0\3\u0110\1\0\1\u0110"+
+ "\1\u01c2\13\0\7\u0110\1\u01c2\1\u0110\2\u01c2\1\u0110\1\u01c2"+
+ "\2\u0110\1\u01c2\3\u0110\1\u01c2\1\u0110\2\0\1\u0110\2\0"+
+ "\1\u0110\1\u01c2\3\u0110\1\u01c2\6\u0110\1\u01c2\2\u0110\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u01c3"+
+ "\4\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01c4\6\134"+
+ "\1\u01c5\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\1\134\1\u01c6\13\0\24\134"+
+ "\1\125\2\0\1\134\2\0\3\134\1\u01c7\13\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\16\134\1\u01c8"+
+ "\5\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01c9\17\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u01ca\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\u01cb\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\12\134\1\u01cc\2\134\1\u011b\6\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\1\u01cd\1\134\1\u01ce\21\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\16\134\1\u01cf\5\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\10\134\1\u01d0\13\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\4\134\1\u01d1\17\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\24\134\1\125\2\0\1\134\2\0\1\u011b\16\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+ "\1\u01d2\16\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u01d3"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u01d4\11\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u01d5\6\134\1\u01d6"+
+ "\10\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u01d7\16\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u01d8\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\u01d9\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\24\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\10\134\1\u01da\3\134\1\u01db\6\134\1\u01dc\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\13\134\1\u01dd\10\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\16\134\1\u01de\5\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\12\134\1\u01df\11\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134"+
+ "\1\u01e0\20\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u01e1"+
+ "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\1\u01e2\23\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\5\134\1\u01e3\16\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\5\134\1\u01e4\16\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\2\134\1\u011b\21\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\3\134\1\u01e5\20\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\10\134"+
+ "\1\u01e6\13\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\23\134\1\u01e7"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\1\u01e8\2\134\1\u01e9\20\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\2\134\1\u01ea\4\134\1\u01eb"+
+ "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\u01ec\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\13\134\1\u01d6\10\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\7\134\1\u01ed\14\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\7\134\1\u01ee\14\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134"+
+ "\1\u01ef\11\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01f0"+
+ "\11\134\1\u01f1\5\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u01f2"+
+ "\7\134\1\u01f3\13\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+ "\1\u01f4\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u01f5"+
+ "\20\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u01f6\17\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u01f7\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u01f8\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\24\134\1\125\2\0\1\134\2\0\3\134\1\u011b"+
+ "\13\134\13\0\1\u01f9\7\0\1\u01f9\1\0\4\u01f9\11\0"+
+ "\1\u01f9\22\0\1\u01f9\1\0\2\u01f9\1\0\1\u01f9\2\0"+
+ "\1\u01f9\3\0\1\u01f9\7\0\1\u01f9\3\0\1\u01f9\6\0"+
+ "\1\u01f9\15\0\1\u01fa\7\0\1\u01fa\1\0\4\u01fa\11\0"+
+ "\1\u01fa\22\0\1\u01fa\1\0\2\u01fa\1\0\1\u01fa\2\0"+
+ "\1\u01fa\3\0\1\u01fa\7\0\1\u01fa\3\0\1\u01fa\6\0"+
+ "\1\u01fa\14\0\1\u01fb\56\0\1\u01fb\117\0\1\u01fc\132\0"+
+ "\1\u01fd\134\0\1\u01fe\142\0\1\u01ff\30\0\1\u0200\56\0"+
+ "\1\u0200\47\0\1\u0201\56\0\1\u0201\47\0\6\u0154\1\0"+
+ "\13\u0154\5\0\2\u0154\1\0\1\u0154\11\0\24\u0154\3\0"+
+ "\1\u0154\2\0\17\u0154\70\0\1\u0202\1\0\1\u0203\6\0"+
+ "\1\u0204\106\0\1\u0205\130\0\1\u0206\133\0\1\u0207\117\0"+
+ "\1\u0208\1\u0209\125\0\1\u020a\131\0\1\u020b\120\0\1\u020c"+
+ "\11\0\1\u020d\114\0\1\u020e\135\0\1\u020f\117\0\1\u0210"+
+ "\2\0\1\u0211\130\0\1\u0212\12\0\1\u0213\106\0\1\u0214"+
+ "\62\0\6\u0162\1\0\13\u0162\5\0\2\u0162\1\0\1\u0162"+
+ "\11\0\24\u0162\3\0\1\u0162\2\0\17\u0162\63\0\1\u0163"+
+ "\141\0\1\u0163\112\0\1\u0163\2\0\1\u0163\17\0\1\u0163"+
+ "\117\0\1\u0163\6\0\1\u0163\112\0\1\u0163\4\0\1\u0163"+
+ "\126\0\1\u0215\112\0\1\u0216\132\0\1\u0217\134\0\1\u0218"+
+ "\142\0\1\u0219\30\0\2\270\1\u021a\3\270\1\0\10\270"+
+ "\2\0\1\270\5\0\2\270\13\0\2\270\1\u021a\21\270"+
+ "\3\0\1\270\2\0\17\270\12\0\6\270\1\0\1\u021b"+
+ "\7\270\2\0\1\270\5\0\2\270\13\0\15\270\1\u021b"+
+ "\6\270\3\0\1\270\2\0\17\270\32\0\1\u021c\170\0"+
+ "\1\u021d\127\0\1\u0178\105\0\1\u021e\116\0\1\u021f\63\0"+
+ "\2\63\1\0\1\63\1\0\2\63\2\0\3\63\1\u0220"+
+ "\2\63\1\0\26\63\1\0\6\63\1\u0220\30\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\1\63\1\u0194"+
+ "\4\63\1\0\26\63\1\0\13\63\1\110\1\63\1\u0194"+
+ "\21\63\1\0\3\63\1\110\16\63\1\0\1\63\1\0"+
+ "\2\63\2\0\3\63\1\u0221\2\63\1\0\26\63\1\0"+
+ "\6\63\1\u0221\2\63\1\u0222\25\63\1\0\2\63\1\u0222"+
+ "\17\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u0223"+
+ "\1\0\26\63\1\0\12\63\1\u0223\24\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\30\63\1\u0194\6\63\1\0\12\63\1\u0194\7\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+ "\1\u0224\23\63\1\0\25\63\1\u0224\11\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\2\63\1\u0225\3\63"+
+ "\1\0\26\63\1\0\10\63\1\u0225\26\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\4\63\1\110\1\63"+
+ "\1\0\26\63\1\0\24\63\1\110\12\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\1\63"+
+ "\1\u01a8\24\63\1\0\16\63\1\u01a8\20\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\2\63"+
+ "\1\110\23\63\1\0\25\63\1\110\11\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\5\63\1\u0194\1\0"+
+ "\26\63\1\0\12\63\1\u0194\24\63\1\0\22\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\7\63\1\u0226\27\63\1\0\7\63\1\u0226\12\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\26\63\1\u0227\10\63\1\0\4\63\1\u0227\15\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\30\63\1\u0228\6\63\1\0\12\63\1\u0228\7\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\13\63\1\u0229\23\63\1\0\3\63\1\u0229\16\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\1\u0194\25\63"+
+ "\1\0\23\63\1\u0194\13\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u022a\16\63\1\0\1\63\1\u022a\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\12\63\1\u01a2\13\63"+
+ "\1\0\37\63\1\0\6\63\1\u01a2\13\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\7\63"+
+ "\1\u01b3\27\63\1\0\7\63\1\u01b3\12\63\1\0\1\63"+
+ "\1\0\2\63\2\0\3\63\1\u022b\2\63\1\0\26\63"+
+ "\1\0\6\63\1\u022b\30\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u01a1\16\63\1\0\1\63\1\u01a1\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\5\63\1\u022c\1\0\26\63\1\0"+
+ "\12\63\1\u022c\24\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\u01a2"+
+ "\25\63\1\0\2\63\1\u01a2\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0102"+
+ "\16\63\1\0\1\63\1\u0102\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\27\63\1\110"+
+ "\7\63\1\0\10\63\1\110\11\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u022d\23\63\1\0"+
+ "\25\63\1\u022d\11\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u0104\23\63\1\0"+
+ "\25\63\1\u0104\11\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u01a8\23\63\1\0"+
+ "\25\63\1\u01a8\11\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u0102\23\63\1\0"+
+ "\25\63\1\u0102\11\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\13\63\1\u022e"+
+ "\23\63\1\0\3\63\1\u022e\16\63\1\0\1\63\1\0"+
+ "\2\63\2\0\1\63\1\u022f\4\63\1\0\26\63\1\0"+
+ "\15\63\1\u022f\21\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\5\63\1\u0230\1\0\26\63\1\0\12\63"+
+ "\1\u0230\24\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\26\63\1\0\11\63\1\u0231\25\63"+
+ "\1\0\2\63\1\u0231\17\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\1\110\25\63\1\0\23\63\1\110"+
+ "\13\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\2\63\1\u0232\23\63\1\0\25\63\1\u0232"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\26\63\1\u0233\10\63\1\0"+
+ "\4\63\1\u0233\15\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\1\63\1\u0234\24\63\1\0\16\63\1\u0234"+
+ "\20\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\12\63\1\u0235\13\63\1\0\37\63\1\0"+
+ "\6\63\1\u0235\13\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\26\63\1\110\10\63\1\0"+
+ "\4\63\1\110\15\63\1\0\1\63\1\0\2\63\2\0"+
+ "\5\63\1\110\1\0\26\63\1\0\12\63\1\110\24\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\3\63"+
+ "\1\u0230\2\63\1\0\26\63\1\0\6\63\1\u0230\1\u0226"+
+ "\27\63\1\0\7\63\1\u0226\12\63\1\0\1\63\1\0"+
+ "\2\63\2\0\4\63\1\u018b\1\63\1\0\26\63\1\0"+
+ "\24\63\1\u018b\12\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\1\63\1\302\4\63\1\0\26\63\1\0"+
+ "\15\63\1\302\21\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\26\63\1\u0236"+
+ "\10\63\1\0\4\63\1\u0236\15\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u0237\3\63\1\0\26\63\1\0"+
+ "\10\63\1\u0237\26\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0238"+
+ "\17\63\1\0\5\63\1\u0238\14\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\1\63\1\u0239\24\63\1\0"+
+ "\16\63\1\u0239\20\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u023a"+
+ "\16\63\1\0\1\63\1\u023a\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u023b"+
+ "\16\63\1\0\1\63\1\u023b\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0183"+
+ "\17\63\1\0\5\63\1\u0183\14\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\u023c"+
+ "\25\63\1\0\2\63\1\u023c\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\3\63\1\u023d\2\63\1\0\26\63\1\0"+
+ "\6\63\1\u023d\30\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\110"+
+ "\16\63\1\0\1\63\1\110\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\1\63\1\u023e\24\63\1\0"+
+ "\16\63\1\u023e\20\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\3\63\1\346\2\63\1\0\26\63\1\0"+
+ "\6\63\1\346\30\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u023f\3\63\1\0\26\63\1\0"+
+ "\10\63\1\u023f\26\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u0104\23\63\1\0"+
+ "\20\63\1\110\4\63\1\u0104\11\63\1\0\1\63\1\110"+
+ "\20\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\12\63\1\110\13\63\1\0\37\63\1\0\6\63\1\110"+
+ "\13\63\1\0\1\63\1\0\2\63\2\0\5\63\1\u0240"+
+ "\1\0\26\63\1\0\12\63\1\u0240\24\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\6\63\1\0\26\63"+
+ "\1\0\27\63\1\110\7\63\1\0\10\63\1\110\1\u0241"+
+ "\10\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\7\63\1\u0242\27\63\1\0\7\63\1\u0242"+
+ "\12\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\2\63\1\346\23\63\1\0\25\63\1\346\11\63\1\0"+
+ "\20\63\12\0\1\u0243\51\0\1\u0243\117\0\2\u01bb\16\0"+
+ "\1\u01bb\41\0\1\u0244\116\0\1\125\10\0\1\125\1\u0245"+
+ "\4\125\1\0\2\125\1\u0245\1\125\4\u0245\1\125\1\0"+
+ "\1\125\1\0\3\125\1\0\1\125\1\u0245\13\0\7\125"+
+ "\1\u0245\1\125\2\u0245\1\125\1\u0245\2\125\1\u0245\3\125"+
+ "\1\u0245\1\125\2\0\1\125\2\0\1\125\1\u0245\3\125"+
+ "\1\u0245\6\125\1\u0245\2\125\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u0246\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\u0110\10\0\6\u0110\1\0\4\u0110"+
+ "\2\u01bf\1\u0110\1\u01bf\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+ "\1\0\1\u0110\1\u0113\13\0\11\u0110\1\u0113\2\u0110\1\u0113"+
+ "\10\u0110\2\0\1\u0110\2\0\5\u0110\1\u0113\6\u0110\1\u01bf"+
+ "\2\u0110\25\0\2\u01bf\1\0\1\u01bf\73\0\1\u01bf\3\0"+
+ "\1\u0110\10\0\1\u0110\1\u01c2\4\u0110\1\0\1\u0110\1\u01c1"+
+ "\1\u01c2\1\u0110\4\u01c2\1\u0110\1\0\1\u0110\1\0\3\u0110"+
+ "\1\0\1\u0110\1\u01c2\13\0\7\u0110\1\u01c2\1\u01c1\2\u01c2"+
+ "\1\u0110\1\u01c2\2\u0110\1\u01c2\3\u0110\1\u01c2\1\u0110\2\0"+
+ "\1\u0110\2\0\1\u0110\1\u01c2\3\u0110\1\u01c2\6\u0110\1\u01c2"+
+ "\2\u0110\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\13\134\1\u013e\10\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+ "\1\u0247\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0248"+
+ "\17\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\1\u0249\23\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\12\134\1\u024a\11\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\3\134\1\u024b\4\134\1\u024c\13\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\3\134\1\u011b\20\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\u024d\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\24\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+ "\1\u024e\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u024f"+
+ "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\13\134\1\u011b\10\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\3\134\1\u0250\20\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\17\134\1\u0251\4\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\10\134\1\u011b\13\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\1\u0252\23\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+ "\1\u0253\6\134\1\u0254\10\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\2\134\1\u0255\21\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\13\134"+
+ "\1\u01cd\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u01f7"+
+ "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u011b\4\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\1\134\1\u0255\22\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\23\134\1\u0256\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\17\134\1\u0257\4\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\12\134\1\u0258\11\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\u0259"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u025a\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\17\134\1\u0135\4\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\4\134\1\u025b\17\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\2\134\1\u025c\21\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\7\134\1\u025d\14\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+ "\1\u01d5\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u025e"+
+ "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u025f\11\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\12\134\1\u025c\11\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\13\134\1\u01cb\10\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\10\134\1\u025b\13\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\22\134\1\u0260\1\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\4\134\1\u0261\17\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\13\134"+
+ "\1\u0262\10\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\21\134\1\u0263"+
+ "\2\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\20\134\1\u011b\3\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\6\134\1\u0264\15\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\12\134\1\u0265\11\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\10\134\1\u0266\13\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\17\134\1\u0267\4\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\3\134\1\u024b\20\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\11\134"+
+ "\1\u011b\12\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u0268"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u0269\11\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\10\134\1\u026a\13\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\17\134\1\u0255\4\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\6\134\1\u011b\15\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\10\134\1\u01d6\13\134\1\125\2\0\1\134\2\0"+
+ "\17\134\13\0\1\u026b\7\0\1\u026b\1\0\4\u026b\11\0"+
+ "\1\u026b\22\0\1\u026b\1\0\2\u026b\1\0\1\u026b\2\0"+
+ "\1\u026b\3\0\1\u026b\7\0\1\u026b\3\0\1\u026b\6\0"+
+ "\1\u026b\15\0\1\u026c\7\0\1\u026c\1\0\4\u026c\11\0"+
+ "\1\u026c\22\0\1\u026c\1\0\2\u026c\1\0\1\u026c\2\0"+
+ "\1\u026c\3\0\1\u026c\7\0\1\u026c\3\0\1\u026c\6\0"+
+ "\1\u026c\15\0\1\u026d\51\0\1\u026d\135\0\1\u026e\127\0"+
+ "\1\u01fe\105\0\1\u026f\116\0\1\u0270\75\0\1\u0271\51\0"+
+ "\1\u0271\60\0\1\u0272\42\0\1\u0272\136\0\1\u0273\112\0"+
+ "\1\u0274\145\0\1\u0275\112\0\1\u0208\133\0\1\u0276\120\0"+
+ "\1\u0277\130\0\1\u0278\130\0\1\u0279\142\0\1\u027a\123\0"+
+ "\1\u027b\114\0\1\u027c\126\0\1\u027d\5\0\1\u027e\126\0"+
+ "\1\u0212\117\0\1\u027f\124\0\1\u0280\133\0\1\u0281\131\0"+
+ "\1\u0282\132\0\1\u0283\123\0\1\u0284\131\0\1\u0285\126\0"+
+ "\1\u0286\127\0\1\u0218\105\0\1\u0287\116\0\1\u0288\74\0"+
+ "\3\270\1\u0289\2\270\1\0\10\270\2\0\1\270\5\0"+
+ "\2\270\13\0\1\u0289\23\270\3\0\1\270\2\0\17\270"+
+ "\12\0\6\270\1\0\1\270\1\u028a\6\270\2\0\1\270"+
+ "\5\0\2\270\13\0\10\270\1\u028a\13\270\3\0\1\270"+
+ "\2\0\17\270\54\0\1\u021e\14\0\1\u0178\46\0\1\u028b"+
+ "\123\0\2\u028c\1\0\7\u021f\1\0\10\u021f\2\u028c\1\u021f"+
+ "\1\0\1\u028c\1\0\1\u021f\1\u028c\2\u021f\2\u028c\1\0"+
+ "\2\u028c\1\0\5\u028c\24\u021f\3\u028c\1\u021f\2\u028c\17\u021f"+
+ "\1\0\2\63\1\0\1\63\1\0\2\63\2\0\4\63"+
+ "\1\u01a2\1\63\1\0\26\63\1\0\24\63\1\u01a2\12\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+ "\1\0\26\63\1\0\27\63\1\u0183\7\63\1\0\10\63"+
+ "\1\u0183\11\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+ "\1\0\26\63\1\0\13\63\1\323\23\63\1\0\3\63"+
+ "\1\323\16\63\1\0\1\63\1\0\2\63\2\0\3\63"+
+ "\1\u0230\2\63\1\0\26\63\1\0\6\63\1\u0230\30\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\63"+
+ "\1\u01a2\4\63\1\0\26\63\1\0\15\63\1\u01a2\21\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\1\63"+
+ "\1\u0183\4\63\1\0\26\63\1\0\15\63\1\u0183\21\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\2\63"+
+ "\1\u028d\3\63\1\0\26\63\1\0\10\63\1\u028d\26\63"+
+ "\1\0\22\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+ "\1\0\2\63\1\u028e\23\63\1\0\20\63\1\u022d\4\63"+
+ "\1\u028e\11\63\1\0\1\63\1\u022d\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u028f\16\63\1\0\1\63\1\u028f\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\17\63"+
+ "\1\u0290\17\63\1\0\5\63\1\u0290\14\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\26\63"+
+ "\1\u0183\10\63\1\0\4\63\1\u0183\15\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\13\63"+
+ "\1\u0291\23\63\1\0\3\63\1\u0291\16\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\20\63"+
+ "\1\u0292\16\63\1\0\1\63\1\u0292\20\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\26\63\1\0\13\63"+
+ "\1\u0102\23\63\1\0\3\63\1\u0102\16\63\1\0\1\63"+
+ "\1\0\2\63\2\0\5\63\1\u0293\1\0\26\63\1\0"+
+ "\12\63\1\u0293\24\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\27\63\1\u0294"+
+ "\7\63\1\0\10\63\1\u0294\11\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\365"+
+ "\25\63\1\0\2\63\1\365\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\12\63\1\u022d\13\63\1\0"+
+ "\37\63\1\0\6\63\1\u022d\13\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\21\63\1\u0295\4\63\1\0"+
+ "\22\63\1\u0295\14\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\2\63\1\u0296\23\63\1\0"+
+ "\25\63\1\u0296\11\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\17\63\1\u0297"+
+ "\17\63\1\0\5\63\1\u0297\14\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u0183\3\63\1\0\26\63\1\0"+
+ "\10\63\1\u0183\26\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\20\63\1\u0298"+
+ "\16\63\1\0\1\63\1\u0298\20\63\1\0\1\63\1\0"+
+ "\2\63\2\0\6\63\1\0\26\63\1\0\11\63\1\323"+
+ "\25\63\1\0\2\63\1\323\17\63\1\0\1\63\1\0"+
+ "\2\63\2\0\3\63\1\u0299\2\63\1\0\26\63\1\0"+
+ "\6\63\1\u0299\30\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\5\63\1\u029a\1\0\1\63\1\u029b\24\63"+
+ "\1\0\7\63\1\u029c\2\63\1\u029a\3\63\1\u029b\20\63"+
+ "\1\0\7\63\1\u029c\12\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\26\63\1\0\13\63\1\u029d\23\63"+
+ "\1\0\3\63\1\u029d\16\63\1\0\1\63\1\0\2\63"+
+ "\2\0\1\63\1\316\4\63\1\0\26\63\1\0\15\63"+
+ "\1\316\21\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\2\63\1\u01a2\23\63\1\0\25\63"+
+ "\1\u01a2\11\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\2\63\1\u029e\23\63\1\0\25\63"+
+ "\1\u029e\11\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\3\63\1\u029f\2\63\1\0\26\63\1\0\6\63"+
+ "\1\u029f\30\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\12\63\1\u02a0\13\63\1\0\37\63"+
+ "\1\0\6\63\1\u02a0\13\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\2\63\1\365\23\63\1\0\25\63"+
+ "\1\365\11\63\1\0\20\63\13\0\1\u02a1\43\0\1\u02a1"+
+ "\47\0\1\125\10\0\1\125\1\u02a2\4\125\1\0\2\125"+
+ "\1\u02a2\1\125\4\u02a2\1\125\1\0\1\125\1\0\3\125"+
+ "\1\0\1\125\1\u02a2\13\0\7\125\1\u02a2\1\125\2\u02a2"+
+ "\1\125\1\u02a2\2\125\1\u02a2\3\125\1\u02a2\1\125\2\0"+
+ "\1\125\2\0\1\125\1\u02a2\3\125\1\u02a2\6\125\1\u02a2"+
+ "\2\125\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\5\134\1\u02a3\16\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\2\134"+
+ "\1\u02a4\21\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02a5"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u02a6\16\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\24\134\1\125\2\0\1\134"+
+ "\2\0\3\134\1\u0266\13\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\2\134\1\u0254\21\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\17\134\1\u02a7\4\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\2\134\1\u02a8\21\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\13\134\1\u02a9\10\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134"+
+ "\1\125\2\0\1\134\2\0\1\u02aa\16\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u02ab\20\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\22\134\1\u01d6\1\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u02ac\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\4\134\1\u011b\17\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\10\134\1\u01f6\13\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+ "\1\u01d6\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\u02ad\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\134\1\u02ae\22\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\2\134\1\u02af\21\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\1\u02b0\23\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+ "\1\u0255\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\6\134\1\u02b1"+
+ "\15\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u02b2\17\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\10\134\1\u02b3\13\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\12\134\1\u0257\11\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\17\134\1\u02b4\4\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\17\134\1\u02b5\4\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\12\134\1\u02b6\11\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\16\134"+
+ "\1\u02b7\5\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134\1\u02b8"+
+ "\16\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0146\17\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\21\134\1\u011b\2\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\17\134\1\u02b9\4\134\1\125\2\0"+
+ "\1\134\2\0\17\134\14\0\1\u02ba\43\0\1\u02ba\122\0"+
+ "\1\u026f\14\0\1\u01fe\46\0\1\u02bb\123\0\2\u02bc\1\0"+
+ "\7\u0270\1\0\10\u0270\2\u02bc\1\u0270\1\0\1\u02bc\1\0"+
+ "\1\u0270\1\u02bc\2\u0270\2\u02bc\1\0\2\u02bc\1\0\5\u02bc"+
+ "\24\u0270\3\u02bc\1\u0270\2\u02bc\17\u0270\14\0\1\u02bd\43\0"+
+ "\1\u02bd\67\0\1\u02be\51\0\1\u02be\115\0\1\u027a\124\0"+
+ "\1\u02bf\140\0\1\u02c0\127\0\1\u02c1\112\0\1\u02c2\101\0"+
+ "\1\u02c3\171\0\1\u02c4\116\0\1\u02c5\140\0\1\u0278\106\0"+
+ "\1\u0278\131\0\1\u02c1\122\0\1\u02c6\141\0\1\u027e\70\0"+
+ "\1\u02c7\174\0\1\u02c8\107\0\1\u02c9\122\0\1\u02ca\131\0"+
+ "\1\u02cb\121\0\1\u0287\14\0\1\u0218\46\0\1\u02cc\123\0"+
+ "\2\u02cd\1\0\7\u0288\1\0\10\u0288\2\u02cd\1\u0288\1\0"+
+ "\1\u02cd\1\0\1\u0288\1\u02cd\2\u0288\2\u02cd\1\0\2\u02cd"+
+ "\1\0\5\u02cd\24\u0288\3\u02cd\1\u0288\2\u02cd\17\u0288\12\0"+
+ "\4\270\1\u02ce\1\270\1\0\10\270\2\0\1\270\5\0"+
+ "\2\270\13\0\16\270\1\u02ce\5\270\3\0\1\270\2\0"+
+ "\17\270\12\0\6\270\1\0\2\270\1\u02cf\5\270\2\0"+
+ "\1\270\5\0\2\270\13\0\17\270\1\u02cf\4\270\3\0"+
+ "\1\270\2\0\17\270\11\0\1\u021f\116\0\2\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\11\63\1\u02d0\25\63\1\0\2\63\1\u02d0\17\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\13\63\1\u01a2\23\63\1\0\3\63\1\u01a2\16\63\1\0"+
+ "\1\63\1\0\2\63\2\0\1\110\5\63\1\0\26\63"+
+ "\1\0\21\63\1\110\15\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\6\63\1\0\2\63\1\u02d1\23\63"+
+ "\1\0\25\63\1\u02d1\11\63\1\0\22\63\1\0\1\63"+
+ "\1\0\2\63\2\0\5\63\1\u02d2\1\0\26\63\1\0"+
+ "\12\63\1\u02d2\24\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\2\63\1\u02d3\3\63\1\0\26\63\1\0"+
+ "\10\63\1\u02d3\26\63\1\0\22\63\1\0\1\63\1\0"+
+ "\2\63\2\0\1\u02d4\5\63\1\0\26\63\1\0\21\63"+
+ "\1\u02d4\15\63\1\0\22\63\1\0\1\63\1\0\2\63"+
+ "\2\0\6\63\1\0\26\63\1\0\37\63\1\0\11\63"+
+ "\1\u02d5\10\63\1\0\1\63\1\0\2\63\2\0\6\63"+
+ "\1\0\26\63\1\0\11\63\1\u028e\25\63\1\0\2\63"+
+ "\1\u028e\17\63\1\0\1\63\1\0\2\63\2\0\1\u023e"+
+ "\5\63\1\0\26\63\1\0\21\63\1\u023e\15\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\26\63\1\u02d6\10\63\1\0\4\63\1\u02d6"+
+ "\15\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\1\63\1\u028f\24\63\1\0\16\63\1\u028f\20\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\2\63\1\u02d7\23\63\1\0\25\63\1\u02d7\11\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\3\63\1\356"+
+ "\2\63\1\0\26\63\1\0\6\63\1\356\30\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\2\63\1\u02d8"+
+ "\3\63\1\0\26\63\1\0\10\63\1\u02d8\26\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\1\u01a1\25\63\1\0\23\63\1\u01a1\13\63\1\0\22\63"+
+ "\1\0\1\63\1\0\2\63\2\0\1\u028f\5\63\1\0"+
+ "\26\63\1\0\21\63\1\u028f\15\63\1\0\22\63\1\0"+
+ "\1\63\1\0\2\63\2\0\1\63\1\u02d9\4\63\1\0"+
+ "\26\63\1\0\15\63\1\u02d9\21\63\1\0\22\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\2\63\1\u0183"+
+ "\23\63\1\0\25\63\1\u0183\11\63\1\0\20\63\14\0"+
+ "\1\u02da\40\0\1\u02da\51\0\1\125\10\0\1\125\1\u02db"+
+ "\4\125\1\0\2\125\1\u02db\1\125\4\u02db\1\125\1\0"+
+ "\1\125\1\0\3\125\1\0\1\125\1\u02db\13\0\7\125"+
+ "\1\u02db\1\125\2\u02db\1\125\1\u02db\2\125\1\u02db\3\125"+
+ "\1\u02db\1\125\2\0\1\125\2\0\1\125\1\u02db\3\125"+
+ "\1\u02db\6\125\1\u02db\2\125\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u02dc\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\14\134\1\u02dd\7\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\5\134\1\u02de\16\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\1\u02df"+
+ "\23\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\20\134\1\u02e0\3\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\5\134\1\u02e1\16\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u02e2\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\14\134\1\u011b\7\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\5\134\1\u02e3\16\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\10\134"+
+ "\1\u0254\13\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\1\134\1\u01de"+
+ "\22\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02e4\11\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\7\134\1\u011b\14\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\2\134\1\u02e5\21\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\1\u02e6\23\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\10\134\1\u02e7\13\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134"+
+ "\1\u02e8\14\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\3\134\1\u02e9\2\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\1\134\1\u02ea"+
+ "\13\0\24\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\1\134\1\u01d6"+
+ "\22\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\17\134\1\u0266\4\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\11\134\1\u01cd\12\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\12\134\1\u02eb\11\134\1\125\2\0"+
+ "\1\134\2\0\17\134\15\0\1\u02ec\40\0\1\u02ec\61\0"+
+ "\1\u0270\132\0\1\u02ed\40\0\1\u02ed\72\0\1\u02ee\43\0"+
+ "\1\u02ee\131\0\1\u02ef\116\0\1\u02f0\77\0\1\u02f1\171\0"+
+ "\1\u0208\112\0\1\u02f2\3\0\1\u02f3\1\u02f4\120\0\1\u0278"+
+ "\145\0\1\u02f5\127\0\1\u02f6\117\0\1\u0278\123\0\1\u02f5"+
+ "\133\0\1\u0278\115\0\1\u02f5\124\0\1\u02f7\57\0\1\u0288"+
+ "\127\0\5\270\1\u02f8\1\0\10\270\2\0\1\270\5\0"+
+ "\2\270\13\0\4\270\1\u02f8\17\270\3\0\1\270\2\0"+
+ "\17\270\1\0\2\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\12\63\1\u0181\13\63\1\0\37\63\1\0"+
+ "\6\63\1\u0181\13\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\20\63\1\110\5\63\1\0\35\63\1\110"+
+ "\1\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\2\63\1\u02f9\23\63\1\0\25\63\1\u02f9"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\2\63\1\u01b0\23\63\1\0\25\63\1\u01b0"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\11\63\1\307\25\63\1\0"+
+ "\2\63\1\307\17\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\12\63\1\u02fa\13\63\1\0\37\63\1\0"+
+ "\6\63\1\u02fa\13\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\2\63\1\u028f\23\63\1\0\25\63\1\u028f"+
+ "\11\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\26\63\1\u02fb\10\63\1\0"+
+ "\4\63\1\u02fb\15\63\1\0\1\63\1\0\2\63\2\0"+
+ "\3\63\1\u0102\2\63\1\0\26\63\1\0\6\63\1\u0102"+
+ "\30\63\1\0\22\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\26\63\1\0\11\63\1\u01a8\25\63\1\0"+
+ "\2\63\1\u01a8\15\63\15\0\1\u02fc\55\0\1\u02fc\33\0"+
+ "\1\125\10\0\1\125\1\134\4\125\1\0\2\125\1\134"+
+ "\1\125\4\134\1\125\1\0\1\125\1\0\3\125\1\0"+
+ "\1\125\1\134\13\0\7\125\1\134\1\125\2\134\1\125"+
+ "\1\134\2\125\1\134\3\125\1\134\1\125\2\0\1\125"+
+ "\2\0\1\125\1\134\3\125\1\134\6\125\1\134\2\125"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134"+
+ "\1\u02e7\17\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\12\134\1\u02fd"+
+ "\11\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u01cf\14\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u02b7\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\17\134\1\u02fe\4\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\17\134\1\u02ff\4\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\u01d6\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\24\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\7\134\1\u0254"+
+ "\14\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0300\20\134"+
+ "\1\125\2\0\1\134\2\0\17\134\1\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\3\134\1\u0301\20\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\15\134\1\u011b\6\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\4\134\1\u0302\17\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\5\134\1\u0303\16\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\10\134\1\u0304\13\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\5\134"+
+ "\1\u0255\16\134\1\125\2\0\1\134\2\0\17\134\16\0"+
+ "\1\u0305\55\0\1\u0305\50\0\1\u0306\55\0\1\u0306\55\0"+
+ "\1\u0307\51\0\1\u0307\113\0\1\u0308\124\0\1\u02f6\127\0"+
+ "\1\u02f2\3\0\1\u02f3\133\0\1\u0309\120\0\1\u030a\132\0"+
+ "\1\u0280\133\0\1\u030b\126\0\1\u0278\113\0\1\u030c\45\0"+
+ "\2\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\20\63\1\u01a2\5\63\1\0\35\63\1\u01a2\1\63\1\0"+
+ "\22\63\1\0\1\63\1\0\2\63\2\0\6\63\1\0"+
+ "\26\63\1\0\11\63\1\312\25\63\1\0\2\63\1\312"+
+ "\17\63\1\0\1\63\1\0\2\63\2\0\4\63\1\u030d"+
+ "\1\63\1\0\26\63\1\0\24\63\1\u030d\12\63\1\0"+
+ "\20\63\16\0\1\u030e\42\0\1\u030e\45\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\7\134\1\u01d6\14\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\5\134\1\u030f\16\134\1\125\2\0"+
+ "\1\134\2\0\17\134\1\0\1\125\10\0\6\134\1\0"+
+ "\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0"+
+ "\2\134\13\0\5\134\1\u0254\16\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\5\134\1\u0310\16\134\1\125\2\0\1\134\2\0"+
+ "\17\134\1\0\1\125\10\0\6\134\1\0\11\134\1\0"+
+ "\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0"+
+ "\5\134\1\u011b\16\134\1\125\2\0\1\134\2\0\17\134"+
+ "\1\0\1\125\10\0\6\134\1\0\11\134\1\0\1\134"+
+ "\1\0\1\125\1\u010d\1\134\1\0\2\134\13\0\17\134"+
+ "\1\u01f2\4\134\1\125\2\0\1\134\2\0\17\134\1\0"+
+ "\1\125\10\0\6\134\1\0\11\134\1\0\1\134\1\0"+
+ "\1\125\1\u010d\1\134\1\0\2\134\13\0\4\134\1\u0266"+
+ "\17\134\1\125\2\0\1\134\2\0\17\134\1\0\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\3\134\1\u0311\20\134"+
+ "\1\125\2\0\1\134\2\0\17\134\17\0\1\u0312\42\0"+
+ "\1\u0312\63\0\1\u0313\42\0\1\u0313\64\0\1\u0314\140\0"+
+ "\1\u0315\126\0\1\u0316\152\0\1\u0317\137\0\1\u0278\127\0"+
+ "\1\u0318\37\0\2\63\1\0\1\63\1\0\2\63\2\0"+
+ "\6\63\1\0\1\63\1\u0319\24\63\1\0\16\63\1\u0319"+
+ "\20\63\1\0\20\63\17\0\1\u031a\107\0\1\125\10\0"+
+ "\6\134\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d"+
+ "\1\134\1\0\2\134\13\0\4\134\1\u01cd\17\134\1\125"+
+ "\2\0\1\134\2\0\17\134\1\0\1\125\10\0\6\134"+
+ "\1\0\11\134\1\0\1\134\1\0\1\125\1\u010d\1\134"+
+ "\1\0\2\134\13\0\1\u031b\23\134\1\125\2\0\1\134"+
+ "\2\0\17\134\1\0\1\125\10\0\6\134\1\0\11\134"+
+ "\1\0\1\134\1\0\1\125\1\u010d\1\134\1\0\2\134"+
+ "\13\0\12\134\1\u0303\11\134\1\125\2\0\1\134\2\0"+
+ "\17\134\20\0\1\u031c\126\0\1\u031d\174\0\1\u031e\122\0"+
+ "\1\u031f\132\0\1\u030b\123\0\1\u0320\44\0\2\63\1\0"+
+ "\1\63\1\0\2\63\2\0\6\63\1\0\26\63\1\0"+
+ "\20\63\1\312\16\63\1\0\1\63\1\312\16\63\1\125"+
+ "\10\0\6\134\1\0\11\134\1\0\1\134\1\0\1\125"+
+ "\1\u010d\1\134\1\0\2\134\13\0\24\134\1\125\2\0"+
+ "\1\134\2\0\16\134\1\u0302\56\0\1\u0321\16\0\1\u0322"+
+ "\124\0\1\u0323\115\0\1\u0324\127\0\1\u02f6\125\0\1\u0273"+
+ "\140\0\1\u02f6\33\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[61161];
+ 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 =
+ "\6\0\2\1\1\0\2\1\1\0\2\1\7\0\1\1"+
+ "\3\0\2\1\1\11\4\1\1\11\5\1\1\11\2\1"+
+ "\2\11\2\1\1\11\1\1\3\11\1\1\1\11\25\1"+
+ "\1\11\1\1\1\11\1\1\7\11\1\1\1\11\2\1"+
+ "\2\11\10\1\1\11\3\1\1\11\17\1\1\11\3\1"+
+ "\2\11\2\1\1\11\1\1\1\11\1\1\1\11\6\1"+
+ "\1\11\1\1\2\11\1\1\1\11\5\1\4\11\4\1"+
+ "\4\11\1\1\1\11\6\1\4\11\1\1\2\11\1\1"+
+ "\1\11\10\1\2\11\5\0\1\11\103\1\1\11\3\0"+
+ "\1\11\1\0\75\1\1\11\2\1\1\0\1\11\6\0"+
+ "\1\11\1\1\15\0\1\1\1\11\5\0\1\1\1\0"+
+ "\2\11\4\0\3\1\1\0\1\11\4\0\100\1\1\0"+
+ "\1\1\1\0\3\1\1\0\70\1\41\0\2\1\1\11"+
+ "\2\0\44\1\1\0\1\11\46\1\1\0\1\11\3\0"+
+ "\1\1\7\0\1\11\17\0\3\1\2\0\24\1\1\0"+
+ "\30\1\24\0\14\1\1\0\21\1\14\0\4\1\1\0"+
+ "\10\1\10\0\1\1\1\0\3\1\2\0\1\11\4\0"+
+ "\1\1\1\11\1\1\2\11\6\0\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[804];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ public static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specific to HTMLTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ public static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ public static final int INTERNAL_IN_JS = -10;
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ public static final int INTERNAL_IN_JS_MLC = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ public static final int INTERNAL_IN_JS_STRING_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ public static final int INTERNAL_IN_JS_STRING_VALID = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ public static final int INTERNAL_IN_JS_CHAR_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ public static final int INTERNAL_IN_JS_CHAR_VALID = -15;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ public static final int INTERNAL_CSS = -16;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ public static final int INTERNAL_CSS_PROPERTY = -17;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ public static final int INTERNAL_CSS_VALUE = -18;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ public static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public HTMLTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = 0;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.PREPROCESSOR:
+ state = PI;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ validJSString = false;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ validJSString = true;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ validJSString = false;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ validJSString = true;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ break;
+ }
+ cssPrevState = -initialTokenType&0xff;
+ languageIndex = LANG_INDEX_CSS;
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public HTMLTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public HTMLTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 194) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 54:
+ { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+ }
+ case 104: break;
+ case 73:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 105: break;
+ case 63:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 106: break;
+ case 23:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+ }
+ case 107: break;
+ case 10:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+ }
+ case 108: break;
+ case 49:
+ { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+ }
+ case 109: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 110: break;
+ case 97:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 111: break;
+ case 83:
+ { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+ }
+ case 112: break;
+ case 80:
+ { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+ }
+ case 113: break;
+ case 39:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ case 114: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 115: break;
+ case 98:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ case 116: break;
+ case 82:
+ { addToken(Token.REGEX);
+ }
+ case 117: break;
+ case 41:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 118: break;
+ case 102:
+ { int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 119: break;
+ case 93:
+ { addToken(Token.FUNCTION);
+ }
+ case 120: break;
+ case 8:
+ { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 121: break;
+ case 35:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 122: break;
+ case 45:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+ }
+ case 123: break;
+ case 20:
+ { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 124: break;
+ case 25:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+ }
+ case 125: break;
+ case 76:
+ { /* Skip all escaped chars. */
+ }
+ case 126: break;
+ case 70:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+ }
+ case 127: break;
+ case 28:
+ { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 128: break;
+ case 92:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 129: break;
+ case 87:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 130: break;
+ case 55:
+ { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 131: break;
+ case 17:
+ { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+ }
+ case 132: break;
+ case 26:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+ }
+ case 133: break;
+ case 64:
+ { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+ }
+ case 134: break;
+ case 27:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+ }
+ case 135: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 136: break;
+ case 78:
+ { /* Invalid latin-1 character \xXX */ validJSString = false;
+ }
+ case 137: break;
+ case 24:
+ { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 138: break;
+ case 36:
+ { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 139: break;
+ case 90:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 140: break;
+ case 68:
+ { start = zzMarkedPos-2; yybegin(PI);
+ }
+ case 141: break;
+ case 99:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 142: break;
+ case 50:
+ { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 143: break;
+ case 9:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 144: break;
+ case 66:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 145: break;
+ case 62:
+ { /* Skip escaped chars. */
+ }
+ case 146: break;
+ case 77:
+ { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+ }
+ case 147: break;
+ case 96:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ case 148: break;
+ case 69:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 149: break;
+ case 79:
+ { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 150: break;
+ case 30:
+ { addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 151: break;
+ case 38:
+ { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 152: break;
+ case 15:
+ { addToken(Token.OPERATOR);
+ }
+ case 153: break;
+ case 57:
+ { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+ }
+ case 154: break;
+ case 88:
+ { start = zzMarkedPos-4; yybegin(COMMENT);
+ }
+ case 155: break;
+ case 85:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+ }
+ case 156: break;
+ case 101:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 157: break;
+ case 81:
+ { addToken(Token.VARIABLE);
+ }
+ case 158: break;
+ case 43:
+ { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 159: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 160: break;
+ case 95:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 161: break;
+ case 22:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+ }
+ case 162: break;
+ case 94:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 163: break;
+ case 53:
+ { addToken(Token.SEPARATOR); yybegin(CSS);
+ }
+ case 164: break;
+ case 31:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+ }
+ case 165: break;
+ case 61:
+ { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+ }
+ case 166: break;
+ case 51:
+ { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 167: break;
+ case 40:
+ { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 168: break;
+ case 34:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+ }
+ case 169: break;
+ case 72:
+ { start = zzMarkedPos-2; yybegin(JS_MLC);
+ }
+ case 170: break;
+ case 75:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 171: break;
+ case 59:
+ { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ case 172: break;
+ case 103:
+ { addToken(Token.ANNOTATION);
+ }
+ case 173: break;
+ case 29:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 174: break;
+ case 56:
+ { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 175: break;
+ case 89:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+ }
+ case 176: break;
+ case 6:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 177: break;
+ case 91:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 178: break;
+ case 18:
+ { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+ }
+ case 179: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 180: break;
+ case 44:
+ { addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 181: break;
+ case 100:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 182: break;
+ case 48:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+ }
+ case 183: break;
+ case 52:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 184: break;
+ case 12:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+ }
+ case 185: break;
+ case 14:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 186: break;
+ case 46:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 187: break;
+ case 33:
+ { addToken(Token.SEPARATOR);
+ }
+ case 188: break;
+ case 84:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 189: break;
+ case 60:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 190: break;
+ case 58:
+ { /* End of a function */ addToken(Token.SEPARATOR);
+ }
+ case 191: break;
+ case 19:
+ { addToken(Token.MARKUP_TAG_NAME);
+ }
+ case 192: break;
+ case 11:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 193: break;
+ case 71:
+ { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+ }
+ case 194: break;
+ case 37:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ case 195: break;
+ case 74:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 196: break;
+ case 16:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+ }
+ case 197: break;
+ case 86:
+ { boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 198: break;
+ case 13:
+ { addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 199: break;
+ case 65:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 200: break;
+ case 32:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 201: break;
+ case 67:
+ { start = zzMarkedPos-2; yybegin(DTD);
+ }
+ case 202: break;
+ case 21:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+ }
+ case 203: break;
+ case 42:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 204: break;
+ case 47:
+ { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+ }
+ case 205: break;
+ case 1:
+ {
+ }
+ case 206: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case INATTR_SINGLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 805: break;
+ case JS_CHAR: {
+ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 806: break;
+ case CSS_STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 807: break;
+ case JS_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 808: break;
+ case CSS_CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 809: break;
+ case INTAG_SCRIPT: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+ }
+ case 810: break;
+ case CSS_PROPERTY: {
+ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 811: break;
+ case CSS_C_STYLE_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 812: break;
+ case CSS: {
+ addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 813: break;
+ case CSS_VALUE: {
+ addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 814: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 815: break;
+ case INATTR_DOUBLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 816: break;
+ case PI: {
+ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 817: break;
+ case JAVASCRIPT: {
+ addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 818: break;
+ case INTAG: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 819: break;
+ case INTAG_CHECK_TAG_NAME: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 820: break;
+ case INATTR_SINGLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+ }
+ case 821: break;
+ case DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 822: break;
+ case JS_EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 823: break;
+ case INATTR_DOUBLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+ }
+ case 824: break;
+ case INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+ }
+ case 825: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 826: break;
+ case INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+ }
+ case 827: break;
+ case JS_STRING: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 828: break;
+ case INTAG_STYLE: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+ }
+ case 829: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex
new file mode 100644
index 0000000..f72dfc5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex
@@ -0,0 +1,1563 @@
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JSPTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class JSPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to JSPTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ private static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to JSPTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ private static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specifying that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ private static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+ */
+ private static final int INTERNAL_IN_HIDDEN_COMMENT = -10;
+
+ /**
+ * Token type specifying we're in a JSP directive (either include, page
+ * or taglib).
+ */
+ private static final int INTERNAL_IN_JSP_DIRECTIVE = -11;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ private static final int INTERNAL_IN_JS = -12;
+
+ /**
+ * Token type specifying we're in a JavaScript multi-line comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -15;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -16;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -17;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ private static final int INTERNAL_CSS = -18;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ private static final int INTERNAL_CSS_PROPERTY = -19;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ private static final int INTERNAL_CSS_VALUE = -20;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * Token type specifying we're in a Java documentation comment.
+ */
+ private static final int INTERNAL_IN_JAVA_DOCCOMMENT = -(4<<11);
+
+ /**
+ * Token type specifying we're in Java code.
+ */
+ private static final int INTERNAL_IN_JAVA_EXPRESSION = -(5<<11);
+
+ /**
+ * Token type specifying we're in Java multiline comment.
+ */
+ private static final int INTERNAL_IN_JAVA_MLC = -(6<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+ */
+ private int jspInState;
+
+ /**
+ * Whether closing markup tags are automatically completed for JSP.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JSPTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ jspInState = YYINITIAL; // Shouldn't be necessary
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = 0;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.PREPROCESSOR:
+ state = PI;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_HIDDEN_COMMENT:
+ state = HIDDEN_COMMENT;
+ break;
+ case INTERNAL_IN_JSP_DIRECTIVE:
+ state = JSP_DIRECTIVE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ // INTERNAL_IN_JAVAxxx - jspInState or
+ // INTERNAL_IN_CSSxxx - cssPrevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_JAVA_DOCCOMMENT:
+ state = JAVA_DOCCOMMENT;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_JAVA_EXPRESSION:
+ state = JAVA_EXPRESSION;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_JAVA_MLC:
+ state = JAVA_MLC;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ }
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace = ([ \t\f])
+LineTerminator = ([\n])
+Identifier = ([^ \t\n<&]+)
+EntityReference = ([&][^; \t]*[;]?)
+InTagIdentifier = ([^ \t\n\"\'/=>]+)
+UnclosedStringLiteral = ([\"][^\"]*)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+UnclosedCharLiteral = ([\'][^\']*)
+CharLiteral = ({UnclosedCharLiteral}[\'])
+EndScriptTag = ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag = ("</" [sS][tT][yY][lL][eE] ">")
+
+JspExpressionStart = ("<%=")
+JspScriptletStart = ("<%")
+JspDeclarationStart = ("<%!")
+JspStart = ({JspExpressionStart}|{JspScriptletStart}|{JspDeclarationStart})
+
+// General stuff.
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+LetterOrUnderscore = ({Letter}|"_")
+LetterOrUnderscoreOrDash = ({LetterOrUnderscore}|[\-])
+
+
+// Java stuff.
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+WhiteSpace = ([ \t\f])
+JCharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+JUnclosedCharLiteral = ([\'][^\'\n]*)
+JErrorCharLiteral = ({UnclosedCharLiteral}[\'])
+JStringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+JUnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+JErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+MLCBegin = "/*"
+MLCEnd = "*/"
+DocCommentBegin = "/**"
+LineCommentBegin = "//"
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+DocumentationKeyword = ("author"|"deprecated"|"exception"|"link"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+JIdentifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+Annotation = ("@"{JIdentifier}?)
+PrimitiveTypes = ("boolean"|"byte"|"char"|"double" |"float"|"int"|"long"|"short")
+
+CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag = ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+// JavaScript stuff.
+JS_MLCBegin = ({MLCBegin})
+JS_MLCEnd = ({MLCEnd})
+JS_LineCommentBegin = ({LineCommentBegin})
+JS_IntegerLiteral = ({IntegerLiteral})
+JS_HexLiteral = ({HexLiteral})
+JS_FloatLiteral = ({FloatLiteral})
+JS_ErrorNumberFormat = ({ErrorNumberFormat})
+JS_Separator = ({Separator})
+JS_Separator2 = ({Separator2})
+JS_Operator = ({Operator})
+JS_Identifier = ({JIdentifier})
+JS_ErrorIdentifier = ({ErrorIdentifier})
+JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+
+
+
+// CSS stuff.
+CSS_SelectorPiece = (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass = (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword = ("@"{CSS_SelectorPiece})
+CSS_Id = ("#"{CSS_SelectorPiece})
+CSS_Separator = ([;\(\)\[\]])
+CSS_MlcStart = ({JS_MLCBegin})
+CSS_MlcEnd = ({JS_MLCEnd})
+CSS_Property = ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar = ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value = ({CSS_ValueChar}*)
+CSS_Function = ({CSS_Value}\()
+CSS_Digits = ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex = ("#"[0-9a-fA-F]+)
+CSS_Number = ({CSS_Digits}|{CSS_Hex})
+
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state HIDDEN_COMMENT
+%state JAVA_DOCCOMMENT
+%state JAVA_EXPRESSION
+%state JAVA_MLC
+%state JSP_DIRECTIVE
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+ "<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
+ "<"[sS][cC][rR][iI][pP][tT] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ "<"[sS][tT][yY][lL][eE] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ "<!" { start = zzMarkedPos-2; yybegin(DTD); }
+ "<?" { start = zzMarkedPos-2; yybegin(PI); }
+ "<%--" { start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT); }
+ {JspStart} { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ "<%@" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JSP_DIRECTIVE); }
+ "<"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "</"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); } // Catches everything.
+ {EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ "-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<HIDDEN_COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ "--%>" { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.MARKUP_COMMENT); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken; }
+}
+
+<PI> {
+ [^\n\?]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+ "?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+ "?" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+ [^\n>]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+ ">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+ [Aa] |
+ [aA][bB][bB][rR] |
+ [aA][cC][rR][oO][nN][yY][mM] |
+ [aA][dD][dD][rR][eE][sS][sS] |
+ [aA][pP][pP][lL][eE][tT] |
+ [aA][rR][eE][aA] |
+ [aA][rR][tT][iI][cC][lL][eE] |
+ [aA][sS][iI][dD][eE] |
+ [aA][uU][dD][iI][oO] |
+ [bB] |
+ [bB][aA][sS][eE] |
+ [bB][aA][sS][eE][fF][oO][nN][tT] |
+ [bB][dD][oO] |
+ [bB][gG][sS][oO][uU][nN][dD] |
+ [bB][iI][gG] |
+ [bB][lL][iI][nN][kK] |
+ [bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+ [bB][oO][dD][yY] |
+ [bB][rR] |
+ [bB][uU][tT][tT][oO][nN] |
+ [cC][aA][nN][vV][aA][sS] |
+ [cC][aA][pP][tT][iI][oO][nN] |
+ [cC][eE][nN][tT][eE][rR] |
+ [cC][iI][tT][eE] |
+ [cC][oO][dD][eE] |
+ [cC][oO][lL] |
+ [cC][oO][lL][gG][rR][oO][uU][pP] |
+ [cC][oO][mM][mM][aA][nN][dD] |
+ [cC][oO][mM][mM][eE][nN][tT] |
+ [dD][dD] |
+ [dD][aA][tT][aA][gG][rR][iI][dD] |
+ [dD][aA][tT][aA][lL][iI][sS][tT] |
+ [dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+ [dD][eE][lL] |
+ [dD][eE][tT][aA][iI][lL][sS] |
+ [dD][fF][nN] |
+ [dD][iI][aA][lL][oO][gG] |
+ [dD][iI][rR] |
+ [dD][iI][vV] |
+ [dD][lL] |
+ [dD][tT] |
+ [eE][mM] |
+ [eE][mM][bB][eE][dD] |
+ [eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+ [fF][iI][eE][lL][dD][sS][eE][tT] |
+ [fF][iI][gG][uU][rR][eE] |
+ [fF][oO][nN][tT] |
+ [fF][oO][oO][tT][eE][rR] |
+ [fF][oO][rR][mM] |
+ [fF][rR][aA][mM][eE] |
+ [fF][rR][aA][mM][eE][sS][eE][tT] |
+ [hH][123456] |
+ [hH][eE][aA][dD] |
+ [hH][eE][aA][dD][eE][rR] |
+ [hH][rR] |
+ [hH][tT][mM][lL] |
+ [iI] |
+ [iI][fF][rR][aA][mM][eE] |
+ [iI][lL][aA][yY][eE][rR] |
+ [iI][mM][gG] |
+ [iI][nN][pP][uU][tT] |
+ [iI][nN][sS] |
+ [iI][sS][iI][nN][dD][eE][xX] |
+ [kK][bB][dD] |
+ [kK][eE][yY][gG][eE][nN] |
+ [lL][aA][bB][eE][lL] |
+ [lL][aA][yY][eE][rR] |
+ [lL][eE][gG][eE][nN][dD] |
+ [lL][iI] |
+ [lL][iI][nN][kK] |
+ [mM][aA][pP] |
+ [mM][aA][rR][kK] |
+ [mM][aA][rR][qQ][uU][eE][eE] |
+ [mM][eE][nN][uU] |
+ [mM][eE][tT][aA] |
+ [mM][eE][tT][eE][rR] |
+ [mM][uU][lL][tT][iI][cC][oO][lL] |
+ [nN][aA][vV] |
+ [nN][eE][sS][tT] |
+ [nN][oO][bB][rR] |
+ [nN][oO][eE][mM][bB][eE][dD] |
+ [nN][oO][fF][rR][aA][mM][eE][sS] |
+ [nN][oO][lL][aA][yY][eE][rR] |
+ [nN][oO][sS][cC][rR][iI][pP][tT] |
+ [oO][bB][jJ][eE][cC][tT] |
+ [oO][lL] |
+ [oO][pP][tT][gG][rR][oO][uU][pP] |
+ [oO][pP][tT][iI][oO][nN] |
+ [oO][uU][tT][pP][uU][tT] |
+ [pP] |
+ [pP][aA][rR][aA][mM] |
+ [pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+ [pP][rR][eE] |
+ [pP][rR][oO][gG][rR][eE][sS][sS] |
+ [qQ] |
+ [rR][uU][lL][eE] |
+ [sS] |
+ [sS][aA][mM][pP] |
+ [sS][cC][rR][iI][pP][tT] |
+ [sS][eE][cC][tT][iI][oO][nN] |
+ [sS][eE][lL][eE][cC][tT] |
+ [sS][eE][rR][vV][eE][rR] |
+ [sS][mM][aA][lL][lL] |
+ [sS][oO][uU][rR][cC][eE] |
+ [sS][pP][aA][cC][eE][rR] |
+ [sS][pP][aA][nN] |
+ [sS][tT][rR][iI][kK][eE] |
+ [sS][tT][rR][oO][nN][gG] |
+ [sS][tT][yY][lL][eE] |
+ [sS][uU][bB] |
+ [sS][uU][pP] |
+ [tT][aA][bB][lL][eE] |
+ [tT][bB][oO][dD][yY] |
+ [tT][dD] |
+ [tT][eE][xX][tT][aA][rR][eE][aA] |
+ [tT][fF][oO][oO][tT] |
+ [tT][hH] |
+ [tT][hH][eE][aA][dD] |
+ [tT][iI][mM][eE] |
+ [tT][iI][tT][lL][eE] |
+ [tT][rR] |
+ [tT][tT] |
+ [uU] |
+ [uU][lL] |
+ [vV][aA][rR] |
+ [vV][iI][dD][eE][oO] { addToken(Token.MARKUP_TAG_NAME); }
+ {InTagIdentifier} { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+ . { /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+ {JspStart} { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+ {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ [^\"<]* {}
+ "<" { /* Allowing JSP expressions, etc. */ }
+ [\"] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+ {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ [^\'<]* {}
+ "<" { /* Allowing JSP expressions, etc. */ }
+ [\'] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+ {JspStart} { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+ {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ [^\"<]* {}
+ "<" { /* Allowing JSP expressions, etc. */ }
+ [\"] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+ {JspStart} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+ [^\'<]* {}
+ "<" { /* Allowing JSP expressions, etc. */ }
+ [\'] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+ {EndScriptTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+
+ // ECMA 3+ keywords.
+ "break" |
+ "continue" |
+ "delete" |
+ "else" |
+ "for" |
+ "function" |
+ "if" |
+ "in" |
+ "new" |
+ "this" |
+ "typeof" |
+ "var" |
+ "void" |
+ "while" |
+ "with" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ //JavaScript 1.6
+ "each" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+ //JavaScript 1.7
+ "let" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+ // Reserved (but not yet used) ECMA keywords.
+ "abstract" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "debugger" |
+ "default" |
+ "do" |
+ "enum" |
+ "export" |
+ "extends" |
+ "final" |
+ "finally" |
+ "goto" |
+ "implements" |
+ "import" |
+ "instanceof" |
+ "interface" |
+ "native" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "static" |
+ "super" |
+ "switch" |
+ "synchronized" |
+ "throw" |
+ "throws" |
+ "transient" |
+ "try" |
+ "volatile" |
+ "null" { addToken(Token.RESERVED_WORD); }
+ {PrimitiveTypes} { addToken(Token.DATA_TYPE); }
+
+ // Literals.
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+ "NaN" { addToken(Token.RESERVED_WORD); }
+ "Infinity" { addToken(Token.RESERVED_WORD); }
+
+ // Functions.
+ "eval" |
+ "parseInt" |
+ "parseFloat" |
+ "escape" |
+ "unescape" |
+ "isNaN" |
+ "isFinite" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_JS); return firstToken; }
+ {JS_Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ [\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+ [\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
+ {JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+ /* Attempt to identify regular expressions (not foolproof) - do after comments! */
+ {JS_Regex} {
+ boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* Separators. */
+ {JS_Separator} { addToken(Token.SEPARATOR); }
+ {JS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ {JspStart} { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION); }
+
+ /* Operators. */
+ {JS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+ [^\n\\\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ \" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+ [^\n\\\']+ {}
+ \n { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ \' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+
+<JS_MLC> {
+ // JavaScript MLC's. This state is essentially Java's MLC state.
+ [^hwf<\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ yybegin(YYINITIAL);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+ {JS_MLCEnd} { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_EOL_COMMENT> {
+ [^hwf<\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<CSS> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_SelectorPiece} { addToken(Token.DATA_TYPE); }
+ {CSS_PseudoClass} { addToken(Token.RESERVED_WORD); }
+ ":" { /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+ {CSS_AtKeyword} { addToken(Token.REGEX); }
+ {CSS_Id} { addToken(Token.VARIABLE); }
+ "{" { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+ [,] { addToken(Token.IDENTIFIER); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ [+>~\^$\|=] { addToken(Token.OPERATOR); }
+ {CSS_Separator} { addToken(Token.SEPARATOR); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Property} { addToken(Token.RESERVED_WORD); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ ":" { addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Value} { addToken(Token.IDENTIFIER); }
+ "!important" { addToken(Token.ANNOTATION); }
+ {CSS_Function} { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ {CSS_Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ ")" { /* End of a function */ addToken(Token.SEPARATOR); }
+ [;] { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+ [,\.] { addToken(Token.IDENTIFIER); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+ [^\n\\\"]+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \" { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \' { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {CSS_MlcEnd} { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
+
+
+<JAVA_EXPRESSION> {
+
+ "%>" { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(jspInState); }
+
+ /* Keywords */
+ "abstract"|
+ "assert" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "continue" |
+ "default" |
+ "do" |
+ "else" |
+ "enum" |
+ "extends" |
+ "final" |
+ "finally" |
+ "for" |
+ "goto" |
+ "if" |
+ "implements" |
+ "import" |
+ "instanceof" |
+ "interface" |
+ "native" |
+ "new" |
+ "null" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "static" |
+ "strictfp" |
+ "super" |
+ "switch" |
+ "synchronized" |
+ "this" |
+ "throw" |
+ "throws" |
+ "transient" |
+ "try" |
+ "void" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ /* Data types. */
+ {PrimitiveTypes} { addToken(Token.DATA_TYPE); }
+
+ /* Booleans. */
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ /* java.lang classes */
+ "Appendable" |
+ "AutoCloseable" |
+ "CharSequence" |
+ "Cloneable" |
+ "Comparable" |
+ "Iterable" |
+ "Readable" |
+ "Runnable" |
+ "Thread.UncaughtExceptionHandler" |
+ "Boolean" |
+ "Byte" |
+ "Character" |
+ "Character.Subset" |
+ "Character.UnicodeBlock" |
+ "Class" |
+ "ClassLoader" |
+ "Compiler" |
+ "Double" |
+ "Enum" |
+ "Float" |
+ "InheritableThreadLocal" |
+ "Integer" |
+ "Long" |
+ "Math" |
+ "Number" |
+ "Object" |
+ "Package" |
+ "Process" |
+ "ProcessBuilder" |
+ "ProcessBuilder.Redirect" |
+ "Runtime" |
+ "RuntimePermission" |
+ "SecurityManager" |
+ "Short" |
+ "StackTraceElement" |
+ "StrictMath" |
+ "String" |
+ "StringBuffer" |
+ "StringBuilder" |
+ "System" |
+ "Thread" |
+ "ThreadGroup" |
+ "ThreadLocal" |
+ "Throwable" |
+ "Void" |
+ "Character.UnicodeScript" |
+ "ProcessBuilder.Redirect.Type" |
+ "Thread.State" |
+ "ArithmeticException" |
+ "ArrayIndexOutOfBoundsException" |
+ "ArrayStoreException" |
+ "ClassCastException" |
+ "ClassNotFoundException" |
+ "CloneNotSupportedException" |
+ "EnumConstantNotPresentException" |
+ "Exception" |
+ "IllegalAccessException" |
+ "IllegalArgumentException" |
+ "IllegalMonitorStateException" |
+ "IllegalStateException" |
+ "IllegalThreadStateException" |
+ "IndexOutOfBoundsException" |
+ "InstantiationException" |
+ "InterruptedException" |
+ "NegativeArraySizeException" |
+ "NoSuchFieldException" |
+ "NoSuchMethodException" |
+ "NullPointerException" |
+ "NumberFormatException" |
+ "RuntimeException" |
+ "SecurityException" |
+ "StringIndexOutOfBoundsException" |
+ "TypeNotPresentException" |
+ "UnsupportedOperationException" |
+ "AbstractMethodError" |
+ "AssertionError" |
+ "ClassCircularityError" |
+ "ClassFormatError" |
+ "Error" |
+ "ExceptionInInitializerError" |
+ "IllegalAccessError" |
+ "IncompatibleClassChangeError" |
+ "InstantiationError" |
+ "InternalError" |
+ "LinkageError" |
+ "NoClassDefFoundError" |
+ "NoSuchFieldError" |
+ "NoSuchMethodError" |
+ "OutOfMemoryError" |
+ "StackOverflowError" |
+ "ThreadDeath" |
+ "UnknownError" |
+ "UnsatisfiedLinkError" |
+ "UnsupportedClassVersionError" |
+ "VerifyError" |
+ "VirtualMachineError" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+ {JIdentifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {JCharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {JUnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+ {JErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {JStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {JUnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+ {JErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(JAVA_MLC); }
+ {DocCommentBegin} { start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT); }
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+ /* Annotations. */
+ {Annotation} { addToken(Token.ANNOTATION); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JAVA_MLC> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {MLCEnd} { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken; }
+}
+
+
+<JAVA_DOCCOMMENT> {
+
+ [^hwf\@\{\n\<\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+ [hwf] {}
+
+ "@"{BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "@" {}
+ "{@"{InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "{" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+ "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+ \< {}
+ {MLCEnd} { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+ \* {}
+ <<EOF>> { yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken; }
+
+}
+
+
+<JSP_DIRECTIVE> {
+ "include" |
+ "page" |
+ "taglib" { addToken(Token.RESERVED_WORD); }
+ "/" { addToken(Token.RESERVED_WORD); }
+ {InTagIdentifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "%>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ "%" { addToken(Token.IDENTIFIER); }
+ ">" { addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */ }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java
new file mode 100644
index 0000000..714c41c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JSPTokenMaker.java
@@ -0,0 +1,5316 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 9:52 AM */
+
+/*
+ * 02/11/2008
+ *
+ * JSPTokenMaker.java - Generates tokens for JSP syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JSP files (supporting HTML 5).
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JSPTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class JSPTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int INATTR_SINGLE_SCRIPT = 10;
+ public static final int JS_CHAR = 16;
+ public static final int JAVA_EXPRESSION = 21;
+ public static final int CSS_STRING = 27;
+ public static final int HIDDEN_COMMENT = 19;
+ public static final int JS_MLC = 17;
+ public static final int CSS_CHAR_LITERAL = 28;
+ public static final int JAVA_DOCCOMMENT = 20;
+ public static final int INTAG_SCRIPT = 8;
+ public static final int CSS_PROPERTY = 25;
+ public static final int CSS_C_STYLE_COMMENT = 29;
+ public static final int CSS = 24;
+ public static final int CSS_VALUE = 26;
+ public static final int JSP_DIRECTIVE = 23;
+ public static final int COMMENT = 1;
+ public static final int INATTR_DOUBLE_SCRIPT = 9;
+ public static final int PI = 2;
+ public static final int JAVASCRIPT = 14;
+ public static final int INTAG = 4;
+ public static final int INTAG_CHECK_TAG_NAME = 5;
+ public static final int INATTR_SINGLE_STYLE = 13;
+ public static final int DTD = 3;
+ public static final int JS_EOL_COMMENT = 18;
+ public static final int INATTR_DOUBLE_STYLE = 12;
+ public static final int INATTR_SINGLE = 7;
+ public static final int YYINITIAL = 0;
+ public static final int INATTR_DOUBLE = 6;
+ public static final int JS_STRING = 15;
+ public static final int JAVA_MLC = 22;
+ public static final int INTAG_STYLE = 11;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\4\1\2\1\0\1\1\1\45\22\0\1\4\1\26\1\10"+
+ "\1\46\1\47\1\25\1\5\1\11\1\111\1\110\1\50\1\54\1\63"+
+ "\1\35\1\55\1\12\1\31\3\44\3\124\1\33\2\30\1\66\1\6"+
+ "\1\3\1\7\1\21\1\65\1\104\1\112\1\32\1\14\1\101\1\24"+
+ "\1\52\1\117\1\123\1\16\1\125\1\120\1\23\1\115\1\114\1\113"+
+ "\1\17\1\121\1\15\1\13\1\20\1\116\1\122\1\27\1\51\1\22"+
+ "\1\27\1\107\1\36\1\107\1\64\1\34\1\0\1\57\1\43\1\74"+
+ "\1\72\1\56\1\53\1\106\1\70\1\76\1\131\1\77\1\60\1\100"+
+ "\1\42\1\71\1\73\1\130\1\40\1\61\1\41\1\37\1\103\1\102"+
+ "\1\75\1\105\1\126\1\127\1\64\1\62\1\67\uff81\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 =
+ "\6\0\2\1\1\0\2\1\1\0\2\1\14\0\1\2"+
+ "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+ "\5\1\1\10\2\1\1\11\1\12\2\13\1\5\1\14"+
+ "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\2\21"+
+ "\2\23\3\21\2\23\2\21\1\23\6\21\1\23\1\1"+
+ "\1\24\1\25\1\1\1\13\1\26\1\27\1\17\1\30"+
+ "\1\31\1\32\1\33\1\34\1\1\1\35\1\1\1\36"+
+ "\1\37\2\14\1\2\1\14\1\40\1\41\1\14\2\2"+
+ "\1\14\2\42\1\14\5\2\1\36\1\2\1\14\5\2"+
+ "\1\43\10\2\1\1\1\44\1\45\1\46\1\1\1\47"+
+ "\1\50\1\51\1\1\1\52\6\1\1\53\1\1\1\54"+
+ "\2\1\1\55\7\1\1\56\1\14\1\57\1\60\1\14"+
+ "\10\2\1\14\16\2\1\61\6\2\1\1\1\62\4\1"+
+ "\2\2\1\63\1\64\1\65\1\66\4\2\1\67\1\70"+
+ "\1\67\1\71\1\72\1\67\1\73\1\67\1\74\1\67"+
+ "\1\75\1\76\1\77\2\76\1\65\1\76\1\100\1\101"+
+ "\1\102\1\103\1\102\1\104\2\2\1\102\1\42\1\2"+
+ "\1\102\1\105\1\106\1\107\1\110\1\111\1\112\1\113"+
+ "\1\114\1\1\1\4\2\115\1\116\1\117\1\120\1\6"+
+ "\5\0\1\121\1\116\32\21\2\23\2\21\1\23\44\21"+
+ "\1\122\1\123\2\0\1\116\1\0\1\14\1\124\1\0"+
+ "\1\125\1\36\1\2\1\14\1\126\1\42\1\126\2\127"+
+ "\1\126\1\130\1\126\37\2\1\65\7\2\2\65\7\2"+
+ "\1\131\1\132\1\133\1\0\1\134\10\0\1\135\1\136"+
+ "\20\0\1\57\1\137\1\57\1\60\1\0\1\64\1\60"+
+ "\1\140\1\141\25\2\1\142\12\2\1\61\17\2\1\143"+
+ "\4\0\1\144\3\2\1\0\1\145\1\146\15\0\1\147"+
+ "\1\0\1\42\5\0\1\42\1\111\1\150\1\151\2\115"+
+ "\1\116\1\0\1\152\1\0\1\153\4\0\1\116\14\21"+
+ "\1\23\63\21\1\122\1\0\1\154\1\0\1\36\1\2"+
+ "\1\127\1\0\2\130\30\2\1\155\23\2\1\73\11\2"+
+ "\40\0\1\63\1\57\1\0\2\57\1\60\1\0\1\64"+
+ "\3\60\1\156\41\2\1\36\23\2\4\0\3\2\25\0"+
+ "\2\115\1\157\1\160\2\0\1\161\21\21\1\23\12\21"+
+ "\1\23\6\21\1\0\1\162\1\36\2\2\1\163\6\2"+
+ "\1\73\3\2\1\164\3\2\1\165\23\2\1\0\1\1"+
+ "\3\0\1\166\1\0\1\167\2\0\1\170\10\0\1\171"+
+ "\15\0\3\57\1\60\30\2\1\165\4\2\1\36\22\2"+
+ "\2\0\1\172\1\2\1\65\1\2\23\0\2\115\2\0"+
+ "\12\21\1\23\11\21\1\0\1\36\3\2\1\65\3\2"+
+ "\1\65\16\2\35\0\3\57\1\60\5\2\1\165\25\2"+
+ "\1\36\20\2\2\0\2\2\16\0\1\115\1\173\12\21"+
+ "\1\0\1\36\1\2\1\174\14\2\24\0\2\57\1\60"+
+ "\1\165\24\2\1\165\6\2\1\36\10\2\1\165\10\2"+
+ "\12\0\1\175\3\21\1\0\6\2\4\0\1\171\6\0"+
+ "\1\57\14\2\1\165\7\2\1\165\1\2\1\0\6\2"+
+ "\1\36\21\2\6\0\1\21\1\0\2\2\13\0\1\57"+
+ "\31\2\2\0\22\2\1\176\4\0\1\21\1\177\1\2"+
+ "\1\200\1\201\5\0\13\2\1\165\15\2\2\0\3\2"+
+ "\1\165\15\2\10\0\10\2\1\0\15\2\2\0\16\2"+
+ "\3\0\1\61\2\0\6\2\2\0\13\2\2\0\17\2"+
+ "\2\0\12\2\1\165\1\0\15\2\2\0\10\2\1\0"+
+ "\11\2\2\0\4\2\1\165\1\0\5\2\2\0\3\2"+
+ "\2\0\4\2\1\0\2\2\2\0\3\2\1\0\2\2"+
+ "\2\0\3\2\2\0\1\2\2\0\3\2\2\0\1\2"+
+ "\2\0\3\2\2\0\1\2\2\0\1\2\4\0\1\2"+
+ "\2\0\1\165\13\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[1643];
+ 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\132\0\264\0\u010e\0\u0168\0\u01c2\0\u021c\0\u0276"+
+ "\0\u02d0\0\u032a\0\u0384\0\u03de\0\u0438\0\u0492\0\u04ec\0\u0546"+
+ "\0\u05a0\0\u05fa\0\u0654\0\u06ae\0\u0708\0\u0762\0\u07bc\0\u0816"+
+ "\0\u0870\0\u08ca\0\u0924\0\u097e\0\u09d8\0\u0a32\0\u0a8c\0\u0ae6"+
+ "\0\u0b40\0\u0b9a\0\u0bf4\0\u0c4e\0\u0ca8\0\u0b40\0\u0d02\0\u0d5c"+
+ "\0\u0db6\0\u0e10\0\u0e6a\0\u0b40\0\u0ec4\0\u0f1e\0\u0b40\0\u0b40"+
+ "\0\u0f78\0\u0fd2\0\u0b40\0\u0b40\0\u0b40\0\u0b40\0\u102c\0\u0b40"+
+ "\0\u1086\0\u0b40\0\u10e0\0\u113a\0\u1194\0\u11ee\0\u1248\0\u12a2"+
+ "\0\u12fc\0\u1356\0\u13b0\0\u140a\0\u1464\0\u14be\0\u1518\0\u1572"+
+ "\0\u15cc\0\u1626\0\u1680\0\u16da\0\u1734\0\u1086\0\u178e\0\u17e8"+
+ "\0\u0b40\0\u1842\0\u189c\0\u0b40\0\u0b40\0\u18f6\0\u0b40\0\u0b40"+
+ "\0\u0b40\0\u0b40\0\u0b40\0\u1950\0\u0b40\0\u19aa\0\u1a04\0\u0b40"+
+ "\0\u1a5e\0\u1ab8\0\u0b40\0\u1b12\0\u0b40\0\u0b40\0\u1b6c\0\u1bc6"+
+ "\0\u1c20\0\u1c7a\0\u1cd4\0\u1d2e\0\u1d88\0\u1de2\0\u1e3c\0\u1e96"+
+ "\0\u1ef0\0\u1f4a\0\u0b40\0\u1fa4\0\u1ffe\0\u2058\0\u20b2\0\u210c"+
+ "\0\u2166\0\u21c0\0\u0b40\0\u221a\0\u2274\0\u22ce\0\u2328\0\u2382"+
+ "\0\u23dc\0\u2436\0\u2490\0\u24ea\0\u0b40\0\u0b40\0\u2544\0\u259e"+
+ "\0\u0b40\0\u0b40\0\u2544\0\u25f8\0\u0b40\0\u2652\0\u26ac\0\u2706"+
+ "\0\u2760\0\u27ba\0\u2814\0\u0b40\0\u286e\0\u0b40\0\u28c8\0\u2922"+
+ "\0\u0b40\0\u297c\0\u29d6\0\u2a30\0\u2a8a\0\u2ae4\0\u2b3e\0\u2b98"+
+ "\0\u0b40\0\u2bf2\0\u2c4c\0\u2ca6\0\u2d00\0\u2d5a\0\u2db4\0\u2e0e"+
+ "\0\u2e68\0\u2ec2\0\u2f1c\0\u2f76\0\u2fd0\0\u302a\0\u3084\0\u30de"+
+ "\0\u3138\0\u3192\0\u31ec\0\u3246\0\u32a0\0\u32fa\0\u3354\0\u33ae"+
+ "\0\u3408\0\u3462\0\u34bc\0\u3516\0\u3570\0\u35ca\0\u3624\0\u367e"+
+ "\0\u36d8\0\u3732\0\u378c\0\u37e6\0\u0b40\0\u3840\0\u389a\0\u38f4"+
+ "\0\u394e\0\u39a8\0\u3a02\0\u3a5c\0\u3ab6\0\u0b40\0\u0b40\0\u3b10"+
+ "\0\u3b6a\0\u3bc4\0\u3c1e\0\u0b40\0\u0b40\0\u3c78\0\u0b40\0\u0b40"+
+ "\0\u3cd2\0\u3d2c\0\u3d86\0\u3de0\0\u3e3a\0\u0b40\0\u0b40\0\u0b40"+
+ "\0\u3c78\0\u3cd2\0\u3e94\0\u3eee\0\u0b40\0\u0b40\0\u0b40\0\u0b40"+
+ "\0\u3c78\0\u0b40\0\u3f48\0\u3fa2\0\u3ffc\0\u4056\0\u40b0\0\u410a"+
+ "\0\u0b40\0\u0b40\0\u0b40\0\u0b40\0\u4164\0\u0b40\0\u0b40\0\u0b40"+
+ "\0\u41be\0\u4218\0\u4272\0\u42cc\0\u4326\0\u4380\0\u0b40\0\u0b40"+
+ "\0\u43da\0\u4434\0\u448e\0\u44e8\0\u4542\0\u0b40\0\u459c\0\u45f6"+
+ "\0\u4650\0\u46aa\0\u4704\0\u475e\0\u47b8\0\u4812\0\u486c\0\u48c6"+
+ "\0\u4920\0\u497a\0\u49d4\0\u4a2e\0\u4a88\0\u4ae2\0\u4b3c\0\u4b96"+
+ "\0\u4bf0\0\u4c4a\0\u4ca4\0\u4cfe\0\u4d58\0\u4db2\0\u4e0c\0\u4e66"+
+ "\0\u4ec0\0\u4f1a\0\u4f74\0\u4fce\0\u5028\0\u5082\0\u50dc\0\u5136"+
+ "\0\u5190\0\u51ea\0\u5244\0\u529e\0\u52f8\0\u5352\0\u53ac\0\u5406"+
+ "\0\u5460\0\u54ba\0\u5514\0\u556e\0\u55c8\0\u5622\0\u567c\0\u56d6"+
+ "\0\u5730\0\u578a\0\u57e4\0\u583e\0\u5898\0\u58f2\0\u594c\0\u59a6"+
+ "\0\u5a00\0\u5a5a\0\u5ab4\0\u5b0e\0\u5b68\0\u5bc2\0\u5c1c\0\u5c76"+
+ "\0\u5cd0\0\u5d2a\0\u5d84\0\u0b40\0\u1b12\0\u5dde\0\u5e38\0\u5e92"+
+ "\0\u5e92\0\u0b40\0\u5eec\0\u5f46\0\u5fa0\0\u5ffa\0\u6054\0\u60ae"+
+ "\0\u60ae\0\u6108\0\u60ae\0\u6162\0\u61bc\0\u6216\0\u6270\0\u62ca"+
+ "\0\u6324\0\u637e\0\u63d8\0\u6432\0\u648c\0\u64e6\0\u6540\0\u659a"+
+ "\0\u65f4\0\u664e\0\u66a8\0\u6702\0\u675c\0\u67b6\0\u6810\0\u686a"+
+ "\0\u68c4\0\u691e\0\u6978\0\u69d2\0\u6a2c\0\u6a86\0\u6ae0\0\u6b3a"+
+ "\0\u6b94\0\u6bee\0\u6c48\0\u6ca2\0\u6cfc\0\u6d56\0\u6db0\0\u6e0a"+
+ "\0\u6e64\0\u6ebe\0\u6f18\0\u6f72\0\u6fcc\0\u7026\0\u7080\0\u1bc6"+
+ "\0\u70da\0\u7134\0\u718e\0\u71e8\0\u7242\0\u729c\0\u72f6\0\u0b40"+
+ "\0\u7350\0\u73aa\0\u7404\0\u0b40\0\u745e\0\u74b8\0\u7512\0\u756c"+
+ "\0\u75c6\0\u7620\0\u767a\0\u76d4\0\u0b40\0\u0b40\0\u772e\0\u7788"+
+ "\0\u77e2\0\u783c\0\u7896\0\u78f0\0\u794a\0\u79a4\0\u79fe\0\u7a58"+
+ "\0\u7ab2\0\u7b0c\0\u7b66\0\u7bc0\0\u7c1a\0\u7c74\0\u7cce\0\u0b40"+
+ "\0\u7d28\0\u7d82\0\u7ddc\0\u0b40\0\u7e36\0\u7e90\0\u7eea\0\u7f44"+
+ "\0\u7f9e\0\u7ff8\0\u8052\0\u80ac\0\u8106\0\u8160\0\u81ba\0\u8214"+
+ "\0\u826e\0\u82c8\0\u8322\0\u837c\0\u83d6\0\u8430\0\u848a\0\u84e4"+
+ "\0\u853e\0\u8598\0\u85f2\0\u864c\0\u0b40\0\u86a6\0\u8700\0\u875a"+
+ "\0\u87b4\0\u880e\0\u8868\0\u88c2\0\u891c\0\u7080\0\u8976\0\u89d0"+
+ "\0\u8a2a\0\u8a84\0\u8ade\0\u8b38\0\u8b92\0\u8bec\0\u8c46\0\u8ca0"+
+ "\0\u8cfa\0\u8d54\0\u8dae\0\u8e08\0\u8e62\0\u8ebc\0\u8f16\0\u0b40"+
+ "\0\u8f70\0\u8fca\0\u9024\0\u907e\0\u0b40\0\u90d8\0\u9132\0\u918c"+
+ "\0\u91e6\0\u0b40\0\u9240\0\u929a\0\u92f4\0\u934e\0\u93a8\0\u9402"+
+ "\0\u945c\0\u94b6\0\u9510\0\u956a\0\u95c4\0\u961e\0\u9678\0\u96d2"+
+ "\0\u972c\0\u9786\0\u0b40\0\u97e0\0\u983a\0\u9894\0\u98ee\0\u9948"+
+ "\0\u410a\0\u0b40\0\u0b40\0\u4218\0\u99a2\0\u99fc\0\u0b40\0\u9a56"+
+ "\0\u0b40\0\u9ab0\0\u0b40\0\u9b0a\0\u9b64\0\u9bbe\0\u9c18\0\u0f78"+
+ "\0\u9c72\0\u9ccc\0\u9d26\0\u9d80\0\u9dda\0\u9e34\0\u9e8e\0\u9ee8"+
+ "\0\u9f42\0\u9f9c\0\u9ff6\0\ua050\0\ua0aa\0\ua104\0\ua15e\0\ua1b8"+
+ "\0\ua212\0\ua26c\0\ua2c6\0\ua320\0\ua37a\0\ua3d4\0\ua42e\0\ua488"+
+ "\0\ua4e2\0\ua53c\0\ua596\0\ua5f0\0\ua64a\0\ua6a4\0\u4f74\0\ua6fe"+
+ "\0\ua758\0\ua7b2\0\ua80c\0\ua866\0\ua8c0\0\ua91a\0\ua974\0\ua9ce"+
+ "\0\uaa28\0\uaa82\0\uaadc\0\uab36\0\uab90\0\uabea\0\uac44\0\uac9e"+
+ "\0\uacf8\0\uad52\0\uadac\0\u140a\0\uae06\0\uae60\0\uaeba\0\uaf14"+
+ "\0\uaf6e\0\uafc8\0\ub022\0\ub07c\0\ub0d6\0\ub130\0\ub18a\0\ub1e4"+
+ "\0\u0b40\0\ub23e\0\ub298\0\ub2f2\0\ub34c\0\ub3a6\0\ub400\0\ub45a"+
+ "\0\u60ae\0\ub4b4\0\ub50e\0\ub568\0\ub5c2\0\ub61c\0\ub676\0\ub6d0"+
+ "\0\ub72a\0\ub784\0\ub7de\0\ub838\0\ub892\0\ub8ec\0\ub946\0\ub9a0"+
+ "\0\ub9fa\0\uba54\0\ubaae\0\ubb08\0\ubb62\0\ubbbc\0\ubc16\0\ubc70"+
+ "\0\ubcca\0\ubd24\0\u1bc6\0\ubd7e\0\ubdd8\0\ube32\0\ube8c\0\ubee6"+
+ "\0\ubf40\0\ubf9a\0\ubff4\0\uc04e\0\uc0a8\0\uc102\0\uc15c\0\uc1b6"+
+ "\0\uc210\0\uc26a\0\uc2c4\0\uc31e\0\uc378\0\uc3d2\0\uc42c\0\uc486"+
+ "\0\uc4e0\0\uc53a\0\uc594\0\uc5ee\0\uc648\0\uc6a2\0\uc6fc\0\uc756"+
+ "\0\uc7b0\0\uc80a\0\uc864\0\uc8be\0\uc918\0\uc972\0\uc9cc\0\uca26"+
+ "\0\uca80\0\ucada\0\ucb34\0\ucb8e\0\ucbe8\0\ucc42\0\ucc9c\0\uccf6"+
+ "\0\ucd50\0\ucdaa\0\uce04\0\uce5e\0\uceb8\0\ucf12\0\ucf6c\0\ucfc6"+
+ "\0\ud020\0\ud07a\0\ud0d4\0\ud12e\0\ud188\0\ud1e2\0\ud23c\0\ud296"+
+ "\0\u0b40\0\ud2f0\0\ud34a\0\ud3a4\0\ud3fe\0\ud458\0\ud4b2\0\ud50c"+
+ "\0\ud566\0\ud5c0\0\ud61a\0\ub2f2\0\ud674\0\ud6ce\0\ud728\0\ud782"+
+ "\0\ud7dc\0\ud836\0\ud890\0\ud8ea\0\ud944\0\ud99e\0\ud9f8\0\uda52"+
+ "\0\udaac\0\udb06\0\udb60\0\udbba\0\udc14\0\udc6e\0\udcc8\0\udd22"+
+ "\0\udd7c\0\uddd6\0\ude30\0\ude8a\0\udee4\0\udf3e\0\udf98\0\udff2"+
+ "\0\ue04c\0\ue0a6\0\ue100\0\ue15a\0\ue1b4\0\ue20e\0\ue268\0\ue2c2"+
+ "\0\ue31c\0\ue376\0\ue3d0\0\ue42a\0\ue484\0\ue4de\0\ue538\0\ue592"+
+ "\0\ue5ec\0\ue646\0\ue6a0\0\ue6fa\0\ue754\0\ue7ae\0\ue808\0\ue862"+
+ "\0\ue8bc\0\ue916\0\ue970\0\ue9ca\0\uea24\0\uea7e\0\uead8\0\ueb32"+
+ "\0\ueb8c\0\uebe6\0\uec40\0\uec9a\0\uecf4\0\ued4e\0\ueda8\0\uee02"+
+ "\0\uee5c\0\ueeb6\0\uef10\0\uef6a\0\uefc4\0\uf01e\0\uf078\0\uf0d2"+
+ "\0\uf12c\0\uf186\0\uf1e0\0\uf23a\0\uf294\0\uf2ee\0\uf348\0\u0b40"+
+ "\0\u0b40\0\uf3a2\0\uf3fc\0\uf456\0\uf4b0\0\uf50a\0\uf564\0\uf5be"+
+ "\0\uf618\0\uf672\0\uf6cc\0\uf726\0\uf780\0\uf7da\0\uf834\0\uf88e"+
+ "\0\uf8e8\0\uf942\0\uf99c\0\uf9f6\0\ufa50\0\ufaaa\0\ufb04\0\u5082"+
+ "\0\ufb5e\0\ufbb8\0\ufc12\0\ufc6c\0\ufcc6\0\ufd20\0\ufd7a\0\ufdd4"+
+ "\0\ua596\0\ufe2e\0\ufe88\0\ufee2\0\uff3c\0\uff96\0\ufff0\1\112"+
+ "\0\u0b40\1\244\1\376\1\u0158\0\u1bc6\1\u01b2\1\u020c\1\u0266"+
+ "\1\u02c0\1\u031a\1\u0374\0\u1bc6\1\u03ce\1\u0428\1\u0482\0\u1bc6"+
+ "\1\u04dc\1\u0536\1\u0590\0\u1bc6\1\u05ea\1\u0644\1\u069e\1\u06f8"+
+ "\1\u0752\1\u07ac\1\u0806\1\u0860\1\u08ba\1\u0914\1\u096e\1\u09c8"+
+ "\1\u0a22\1\u0a7c\1\u0ad6\1\u0b30\1\u0b8a\1\u0be4\1\u0c3e\0\u73aa"+
+ "\0\u0b40\1\u0c98\1\u0cf2\1\u0d4c\1\u0da6\1\u0e00\0\u0b40\1\u0e5a"+
+ "\1\u0eb4\1\u0f0e\1\u0f68\1\u0fc2\1\u101c\1\u1076\1\u10d0\1\u112a"+
+ "\1\u1184\1\u11de\0\u0b40\1\u1238\1\u1292\1\u12ec\1\u1346\1\u13a0"+
+ "\1\u13fa\1\u1454\1\u14ae\1\u1508\1\u1562\1\u15bc\1\u1616\1\u1670"+
+ "\1\u16ca\1\u1724\1\u177e\1\u17d8\1\u1832\1\u188c\1\u18e6\1\u1940"+
+ "\1\u199a\1\u19f4\1\u1a4e\1\u1aa8\1\u1b02\1\u1b5c\1\u1bb6\1\u1c10"+
+ "\1\u1c6a\1\u1cc4\1\u1d1e\1\u1d78\1\u1dd2\1\u1e2c\1\u1e86\1\u1ee0"+
+ "\1\u1f3a\1\u1f94\1\u1fee\1\u2048\1\u20a2\1\u20fc\1\u2156\1\u21b0"+
+ "\1\u220a\1\u2264\1\u22be\1\u2318\1\u2372\1\u23cc\1\u2426\1\u2480"+
+ "\1\u24da\1\u2534\1\u258e\1\u25e8\1\u2642\1\u269c\1\u26f6\1\u2750"+
+ "\1\u27aa\1\u2804\1\u285e\1\u28b8\1\u2912\1\u296c\1\u29c6\1\u2a20"+
+ "\0\u39a8\1\u2a7a\1\u2ad4\1\u2b2e\1\u2b88\1\u2be2\1\u2c3c\1\u2c96"+
+ "\1\u2cf0\1\u2d4a\1\u2da4\1\u2dfe\1\u2e58\1\u2eb2\1\u2f0c\1\u2f66"+
+ "\1\u2fc0\1\u301a\1\u3074\1\u30ce\1\u3128\1\u3182\1\u31dc\1\u3236"+
+ "\0\uf456\1\u3290\1\u32ea\1\u3344\1\u339e\1\u33f8\1\u3452\1\u34ac"+
+ "\1\u3506\1\u3560\1\u35ba\1\u3614\1\u3614\1\u366e\1\u36c8\1\u3722"+
+ "\1\u377c\1\u37d6\1\u3830\1\u388a\1\u38e4\1\u393e\1\u3998\1\u39f2"+
+ "\1\u3a4c\1\u3aa6\0\ub6d0\1\u3b00\1\u3b5a\1\u3bb4\1\u3c0e\1\u3c68"+
+ "\1\u3cc2\1\u3d1c\1\u3d76\1\u3dd0\1\u3e2a\1\u3e84\1\u3ede\1\u3f38"+
+ "\1\u3f92\1\u3fec\1\u4046\1\u40a0\1\u40fa\1\u4154\1\u41ae\1\u0da6"+
+ "\1\u4208\1\u4262\1\u0f0e\1\u42bc\1\u4316\1\u4370\1\u43ca\1\u4424"+
+ "\1\u447e\1\u44d8\1\u4532\1\u458c\1\u45e6\1\u4640\1\u469a\1\u46f4"+
+ "\1\u474e\1\u47a8\1\u4802\1\u485c\1\u48b6\1\u4910\1\u496a\1\u49c4"+
+ "\1\u4a1e\1\u4a78\1\u4ad2\1\u4b2c\1\u4b86\1\u4be0\1\u4c3a\1\u4c94"+
+ "\1\u4cee\1\u4d48\1\u4da2\1\u4dfc\1\u4e56\1\u4eb0\1\u4f0a\1\u4f64"+
+ "\1\u4fbe\1\u5018\1\u5072\1\u50cc\1\u5126\1\u5180\1\u51da\1\u5234"+
+ "\1\u528e\1\u52e8\1\u5342\1\u539c\1\u53f6\1\u5450\1\u54aa\1\u5504"+
+ "\1\u555e\1\u55b8\1\u5612\1\u566c\1\u56c6\1\u5720\1\u577a\1\u57d4"+
+ "\1\u582e\1\u5888\1\u58e2\1\u593c\1\u5996\1\u59f0\1\u5a4a\1\u5aa4"+
+ "\1\u5afe\1\u5b58\1\u5bb2\1\u29c6\1\u5c0c\1\u5c66\1\u5cc0\1\u5d1a"+
+ "\1\u5d74\1\u5dce\1\u5e28\1\u5e82\1\u5edc\1\u5f36\1\u5f90\1\u5fea"+
+ "\1\u6044\1\u609e\1\u60f8\1\u6152\1\u61ac\0\u42cc\1\u6206\1\u6260"+
+ "\1\u62ba\1\u6314\1\u636e\1\u63c8\1\u6422\1\u647c\1\u64d6\1\u6530"+
+ "\1\u658a\1\u65e4\1\u663e\0\u1bc6\1\u6698\1\u66f2\1\u674c\1\u67a6"+
+ "\1\u6800\1\u685a\1\u68b4\1\u690e\1\u6968\1\u69c2\1\u6a1c\1\u6a76"+
+ "\1\u6ad0\1\u6b2a\1\u6b84\1\u6bde\1\u6c38\1\u6c92\1\u6cec\1\u6d46"+
+ "\1\u6da0\1\u6dfa\1\u6e54\1\u6eae\1\u6f08\1\u6f62\1\u6fbc\1\u7016"+
+ "\1\u7070\1\u70ca\1\u7124\1\u717e\1\u71d8\1\u7232\1\u728c\1\u72e6"+
+ "\1\u7340\1\u739a\1\u73f4\1\u744e\1\u74a8\1\u7502\1\u755c\1\u75b6"+
+ "\1\u7610\1\u766a\1\u76c4\1\u771e\1\u7778\1\u77d2\1\u782c\1\u7886"+
+ "\1\u78e0\1\u793a\1\u7994\1\u79ee\1\u7a48\1\u7aa2\1\u7afc\1\u7b56"+
+ "\1\u7bb0\1\u7c0a\1\u7c64\1\u7cbe\1\u7d18\1\u7d72\1\u7dcc\1\u7e26"+
+ "\1\u7e80\1\u7eda\1\u7f34\1\u7f8e\1\u7fe8\1\u8042\1\u809c\1\u80f6"+
+ "\1\u8150\1\u81aa\1\u8204\1\u825e\1\u82b8\1\u8312\1\u836c\1\u83c6"+
+ "\1\u8420\1\u847a\1\u84d4\1\u852e\1\u8588\1\u85e2\1\u863c\0\u42cc"+
+ "\1\u8696\1\u86f0\1\u874a\1\u87a4\1\u87fe\1\u8858\1\u88b2\1\u890c"+
+ "\1\u8966\1\u89c0\1\u8a1a\1\u8a74\1\u8ace\1\u8b28\1\u8b82\1\u8bdc"+
+ "\1\u8c36\1\u8c90\1\u8cea\1\u8d44\1\u8d9e\1\u8df8\1\u8e52\1\u8eac"+
+ "\1\u8f06\1\u8f60\1\u8fba\1\u9014\1\u906e\1\u90c8\1\u9122\1\u917c"+
+ "\1\u91d6\1\u9230\1\u928a\1\u92e4\1\u933e\1\u9398\1\u93f2\1\u944c"+
+ "\1\u94a6\1\u9500\1\u955a\1\u95b4\1\u960e\1\u9668\1\u96c2\1\u971c"+
+ "\1\u9776\1\u97d0\1\u982a\1\u9884\1\u98de\1\u9938\1\u9992\1\u99ec"+
+ "\1\u9a46\1\u9aa0\1\u9afa\1\u9b54\1\u9bae\1\u9c08\1\u9c62\1\u9cbc"+
+ "\1\u9d16\1\u9d70\1\u9dca\1\u9e24\1\u9e7e\1\u9ed8\1\u9f32\1\u9f8c"+
+ "\1\u9fe6\1\ua040\1\ua09a\1\ua0f4\1\ua14e\1\ua1a8\1\ua202\1\ua25c"+
+ "\1\ua2b6\1\ua310\1\ua36a\1\ua3c4\1\ua41e\1\ua478\1\ua4d2\1\ua52c"+
+ "\1\ua586\1\ua5e0\1\ua63a\1\ua694\1\ua6ee\1\ua748\1\ua7a2\1\ua7fc"+
+ "\1\ua856\1\ua8b0\1\ua90a\1\ua964\1\ua9be\1\uaa18\1\uaa72\1\uaacc"+
+ "\1\uab26\1\uab80\1\uabda\1\uac34\1\uac8e\1\uace8\1\uad42\1\uad9c"+
+ "\1\uadf6\1\uae50\1\uaeaa\1\uaf04\1\uaf5e\1\uafb8\1\ub012\1\ub06c"+
+ "\1\ub0c6\1\ub120\1\ub17a\1\ub1d4\1\ub22e\1\ub288\1\ub2e2\1\ub33c"+
+ "\1\ub396\1\ub3f0\1\ub44a\1\ub4a4\1\ub4fe\1\ub558\1\ub5b2\1\ub60c"+
+ "\0\u0b40\1\ub666\1\ub6c0\1\ub71a\1\ub774\1\ub7ce\0\u0b40\1\ub828"+
+ "\0\u0b40\0\u0b40\1\ub882\1\ub8dc\1\ub936\1\ub990\1\ub9ea\1\uba44"+
+ "\1\uba9e\1\ubaf8\1\ubb52\1\ubbac\1\ubc06\1\ubc60\1\ubcba\1\ubd14"+
+ "\1\ubd6e\1\ubdc8\1\ube22\1\ube7c\1\ubed6\1\ubf30\1\ubf8a\1\ubfe4"+
+ "\1\uc03e\1\uc098\1\uc0f2\1\uc14c\1\uc1a6\1\uc200\1\uc25a\1\uc2b4"+
+ "\1\uc30e\1\uc368\1\uc3c2\1\uc41c\1\uc476\1\uc4d0\1\uc52a\1\uc584"+
+ "\1\uc5de\1\uc638\1\uc692\1\uc6ec\1\uc746\1\uc7a0\1\uc7fa\1\uc854"+
+ "\1\uc8ae\1\uc908\1\uc962\1\uc9bc\1\uca16\1\uca70\1\ucaca\1\ucb24"+
+ "\1\ucb7e\1\ucbd8\1\ucc32\1\ucc8c\1\ucce6\1\ucd40\1\ucd9a\1\ucdf4"+
+ "\1\uce4e\1\ucea8\1\ucf02\1\ucf5c\1\ucfb6\1\ud010\1\ud06a\1\ud0c4"+
+ "\1\ud11e\1\ud178\1\ud1d2\1\ud22c\1\ud286\1\ud2e0\1\ud33a\1\ud394"+
+ "\1\ud3ee\1\ud448\1\ud4a2\1\ud4fc\1\ud556\1\ud5b0\1\ud60a\1\ud664"+
+ "\1\ud6be\1\ud718\1\ud772\1\ud7cc\1\ud826\1\ud880\1\ud8da\1\ud934"+
+ "\1\ud98e\1\ud9e8\1\uda42\1\uda9c\0\u0b40\1\udaf6\1\udb50\1\udbaa"+
+ "\1\udc04\1\udc5e\1\udcb8\1\udd12\1\udd6c\1\uddc6\1\ude20\1\ude7a"+
+ "\1\uded4\1\udf2e\1\udf88\1\udfe2\1\ue03c\1\ue096\1\ue0f0\1\ue14a"+
+ "\1\ue1a4\1\ue1fe\1\ue258\1\ue2b2\1\ue30c\1\ue366\1\ue3c0\1\ue41a"+
+ "\1\ue474\1\ue4ce\1\ue528\1\ue582\1\ue5dc\1\ue636\1\ue690\1\ue6ea"+
+ "\1\ue744\1\ue79e\1\ue7f8\1\ue852\1\ue8ac\1\ue906\1\ue960\1\ue9ba"+
+ "\1\uea14\1\uea6e\1\ueac8\1\ueb22\1\ueb7c\1\uebd6\1\uec30\0\u0b40"+
+ "\1\uec8a\1\uece4\1\ued3e\1\ued98\1\uedf2\1\uee4c\1\ueea6\1\uef00"+
+ "\1\uef5a\1\uefb4\1\uf00e\1\uf068\1\uf0c2\1\uf11c\1\uf176\1\uf1d0"+
+ "\1\uf22a\1\uf284\1\uf2de\1\uf338\1\uf392\1\uf3ec\1\uf446\1\uf4a0"+
+ "\1\uf4fa\1\uf554\1\uf5ae\1\uf608\1\uf662\1\uf6bc\1\uf716\1\uf770"+
+ "\1\uf7ca\1\uf824\1\uf87e\1\uf8d8\1\uf932\1\uf98c\1\uf9e6\1\ufa40"+
+ "\1\ufa9a\1\ufaf4\1\ufb4e\1\ufba8\1\ufc02\1\ufc5c\1\ufcb6\1\ufd10"+
+ "\1\ufd6a\1\ufdc4\1\ufe1e\1\ufe78\1\ufed2\1\uff2c\1\uff86\1\uffe0"+
+ "\2\72\2\224\2\356\2\u0148\2\u01a2\2\u01fc\2\u0256\2\u02b0"+
+ "\2\u030a\2\u0364\2\u03be\2\u0418\2\u0472\2\u04cc\2\u0526\2\u0580"+
+ "\2\u05da\2\u0634\2\u068e\2\u06e8\2\u0742\2\u079c\2\u07f6\2\u0850"+
+ "\2\u08aa\2\u0904\2\u095e\2\u09b8\2\u0a12\2\u0a6c\2\u0ac6\2\u0b20"+
+ "\2\u0b7a\2\u0bd4\2\u0c2e\2\u0c88\2\u0ce2\2\u0d3c\2\u0d96\2\u0df0"+
+ "\2\u0e4a\2\u0ea4\2\u0efe\2\u0f58\2\u0fb2\2\u100c\2\u1066\2\u10c0"+
+ "\2\u111a\2\u1174\2\u11ce\2\u1228\2\u1282\2\u12dc\2\u1336\2\u1390"+
+ "\2\u13ea\2\u1444\2\u149e";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[1643];
+ 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 =
+ "\1\37\1\40\1\41\1\42\1\43\1\44\124\37\2\45"+
+ "\1\46\32\45\1\47\15\45\1\50\14\45\1\51\11\45"+
+ "\1\52\27\45\2\53\1\54\62\53\1\55\44\53\2\56"+
+ "\1\57\16\56\1\60\110\56\2\61\1\0\1\62\1\63"+
+ "\2\61\1\64\1\65\1\66\1\67\6\61\1\70\110\61"+
+ "\2\71\1\0\1\71\1\72\2\71\4\72\1\73\1\74"+
+ "\1\75\1\76\1\77\1\100\1\72\1\71\1\101\1\102"+
+ "\5\71\1\103\4\71\1\104\1\75\1\100\1\105\1\103"+
+ "\6\71\2\106\2\71\1\102\1\107\1\101\1\73\6\71"+
+ "\1\110\1\111\1\112\1\77\1\74\1\71\1\76\1\113"+
+ "\1\114\1\112\1\71\1\115\6\71\1\107\1\111\1\105"+
+ "\1\114\1\104\1\71\1\113\1\116\1\115\1\110\4\71"+
+ "\1\116\1\71\3\117\1\120\4\117\1\121\121\117\3\122"+
+ "\1\120\5\122\1\121\120\122\1\61\1\123\1\0\1\62"+
+ "\1\43\2\61\1\64\1\124\1\125\1\126\6\61\1\127"+
+ "\110\61\3\117\1\120\4\117\1\130\121\117\3\122\1\120"+
+ "\5\122\1\130\120\122\2\61\1\0\1\61\1\63\2\61"+
+ "\1\64\1\131\1\132\1\126\6\61\1\133\110\61\10\134"+
+ "\1\135\121\134\11\136\1\135\120\136\1\137\1\43\1\140"+
+ "\1\141\1\43\1\142\1\143\1\144\1\145\1\146\1\147"+
+ "\3\150\1\151\2\150\1\152\3\150\2\144\1\150\1\153"+
+ "\1\154\1\150\1\153\1\150\1\155\1\137\1\156\1\157"+
+ "\1\160\1\161\1\162\1\153\1\163\1\137\1\150\1\144"+
+ "\2\150\1\164\1\165\1\166\1\167\1\170\1\171\1\172"+
+ "\1\173\1\143\1\144\3\64\2\150\1\174\1\175\1\176"+
+ "\1\150\1\177\3\150\1\200\1\201\1\137\1\150\1\202"+
+ "\3\173\2\150\1\203\7\150\1\153\2\150\1\173\2\150"+
+ "\2\204\1\205\5\204\1\206\25\204\1\207\73\204\2\210"+
+ "\1\211\6\210\1\212\24\210\1\213\73\210\2\214\1\215"+
+ "\1\216\44\214\1\217\2\214\1\220\14\214\1\221\11\214"+
+ "\1\222\27\214\2\223\1\224\1\225\47\223\1\220\14\223"+
+ "\1\221\11\223\1\222\27\223\2\45\1\226\32\45\1\227"+
+ "\15\45\1\50\14\45\1\51\11\45\1\52\27\45\2\230"+
+ "\1\231\1\232\44\230\1\233\2\230\1\234\14\230\1\235"+
+ "\11\230\1\236\1\230\1\237\22\230\1\240\2\230\1\137"+
+ "\1\43\1\241\1\242\1\43\1\142\1\143\1\144\1\243"+
+ "\1\244\1\245\1\246\1\247\1\250\1\251\1\252\1\253"+
+ "\1\152\1\150\1\254\1\255\1\256\1\144\1\150\1\153"+
+ "\1\154\1\257\1\153\1\150\1\155\1\137\1\150\1\157"+
+ "\1\260\1\161\1\162\1\153\1\163\1\137\1\150\1\144"+
+ "\1\150\1\261\1\262\1\165\1\166\1\263\1\264\1\265"+
+ "\1\266\1\173\1\143\1\144\3\64\2\150\1\267\1\270"+
+ "\1\176\1\150\1\271\2\150\1\272\1\273\1\274\1\275"+
+ "\1\150\1\202\3\173\1\276\1\277\1\300\1\301\1\302"+
+ "\3\150\1\303\1\150\1\153\2\150\1\173\2\150\2\304"+
+ "\1\305\45\304\1\306\2\304\1\307\14\304\1\310\11\304"+
+ "\1\311\27\304\1\312\1\313\1\0\1\312\1\43\2\312"+
+ "\1\64\1\314\1\315\1\316\6\312\1\317\3\312\1\320"+
+ "\13\312\1\321\31\312\1\322\2\312\1\323\33\312\1\324"+
+ "\1\63\1\325\1\326\1\63\1\324\1\173\1\64\1\327"+
+ "\1\330\1\331\6\332\1\64\3\332\2\324\1\332\2\324"+
+ "\1\332\1\324\2\332\1\324\5\332\2\324\1\333\1\64"+
+ "\4\332\1\64\5\332\1\324\1\143\1\64\1\324\1\334"+
+ "\1\64\14\332\1\335\2\332\3\173\12\332\1\324\2\332"+
+ "\1\336\2\332\1\337\1\63\1\340\1\341\1\63\5\337"+
+ "\1\342\6\343\1\337\3\343\2\337\1\343\2\337\1\343"+
+ "\1\337\2\343\1\337\5\343\4\337\1\344\3\343\2\337"+
+ "\4\343\1\345\3\337\1\346\1\337\14\343\1\337\2\343"+
+ "\3\337\12\343\1\337\2\343\1\337\2\343\1\347\1\63"+
+ "\1\350\1\351\1\63\1\347\1\352\1\347\1\327\1\330"+
+ "\1\353\6\354\1\347\3\354\1\347\1\355\1\354\2\356"+
+ "\1\354\1\356\1\354\1\357\6\354\1\356\1\347\1\360"+
+ "\2\347\3\354\1\347\1\143\4\354\1\345\1\143\4\347"+
+ "\14\354\1\347\2\354\1\347\1\361\1\362\12\354\1\356"+
+ "\2\354\1\347\2\354\2\204\1\363\5\204\1\364\25\204"+
+ "\1\365\73\204\2\210\1\366\6\210\1\367\24\210\1\365"+
+ "\73\210\2\304\1\370\45\304\1\371\2\304\1\307\14\304"+
+ "\1\310\11\304\1\311\27\304\2\37\4\0\125\37\1\40"+
+ "\2\0\1\43\1\0\124\37\144\0\1\372\1\373\5\374"+
+ "\1\0\3\374\1\375\1\376\5\374\3\0\6\374\4\0"+
+ "\3\374\2\0\3\374\1\373\3\0\1\377\2\0\14\374"+
+ "\1\0\2\374\3\0\15\374\1\0\2\374\1\0\1\43"+
+ "\2\0\1\43\125\0\4\44\1\0\1\44\1\u0100\123\44"+
+ "\2\45\1\0\32\45\1\0\15\45\1\0\14\45\1\0"+
+ "\11\45\1\0\27\45\35\0\1\u0101\135\0\1\u0102\34\0"+
+ "\1\u0103\74\0\1\u0104\172\0\1\u0105\27\0\2\53\1\0"+
+ "\62\53\1\0\44\53\21\0\1\u0106\110\0\2\56\1\0"+
+ "\16\56\1\0\110\56\2\61\1\0\1\61\1\0\2\61"+
+ "\4\0\6\61\1\0\112\61\1\0\1\61\1\0\2\61"+
+ "\4\0\6\61\1\0\3\61\1\u0107\104\61\21\0\1\70"+
+ "\110\0\2\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\112\71\1\0\1\71\1\0\2\71\4\0\1\71"+
+ "\1\u0108\2\71\1\u0109\1\u010a\1\0\2\71\1\u010b\12\71"+
+ "\1\u010c\1\71\1\u010a\14\71\1\u010b\1\u010d\11\71\1\u010e"+
+ "\1\71\1\u0109\1\u0108\3\71\1\u010f\11\71\1\u010d\1\u010e"+
+ "\1\71\1\u010f\1\u010c\15\71\1\0\1\71\1\0\2\71"+
+ "\4\0\3\71\1\u0110\2\71\1\0\2\71\1\u0111\31\71"+
+ "\1\u0111\1\u0112\11\71\1\u0113\4\71\1\u0110\13\71\1\u0112"+
+ "\1\u0113\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\15\71\1\u0114\56\71\1\u0114\15\71\1\0\1\71"+
+ "\1\0\2\71\4\0\1\u0115\5\71\1\0\1\71\1\u0116"+
+ "\16\71\1\u0117\7\71\2\u0118\4\71\1\u0116\1\u0115\16\71"+
+ "\1\u0119\13\71\1\u0117\1\u0119\16\71\1\0\1\71\1\0"+
+ "\2\71\4\0\2\71\1\u011a\3\71\1\0\1\71\1\u011b"+
+ "\14\71\1\u011a\16\71\1\u011c\1\u011b\31\71\1\u011c\21\71"+
+ "\1\0\1\71\1\0\2\71\4\0\2\71\1\116\1\u011d"+
+ "\1\71\1\116\1\0\2\71\1\u011e\5\71\1\u011f\5\71"+
+ "\2\116\1\71\1\u011f\6\71\2\u0120\2\71\1\u011e\1\u0121"+
+ "\10\71\1\u0122\1\71\1\116\3\71\1\u011d\2\71\1\116"+
+ "\10\71\1\u0121\10\71\1\u0122\10\71\1\0\1\71\1\0"+
+ "\2\71\4\0\3\71\1\u0123\2\71\1\0\2\71\1\u0124"+
+ "\31\71\1\u0124\1\u0125\16\71\1\u0123\13\71\1\u0125\21\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+ "\1\u0126\2\71\1\u0127\11\71\1\u0126\4\71\1\u0127\11\71"+
+ "\1\0\1\71\1\0\2\71\4\0\2\71\1\116\1\u0119"+
+ "\2\71\1\0\1\71\1\u0128\13\71\1\u0129\1\116\16\71"+
+ "\1\u012a\1\u0128\10\71\1\u012b\1\u012c\3\71\1\u0119\2\71"+
+ "\1\u012c\4\71\1\u012d\3\71\1\u012a\1\u012b\2\71\1\u0129"+
+ "\1\u012d\14\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\1\71\1\116\34\71\1\116\53\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\2\71\1\u012e\31\71"+
+ "\1\u012e\1\u012f\11\71\1\u0130\20\71\1\u012f\1\u0130\20\71"+
+ "\1\0\1\71\1\0\2\71\4\0\2\71\1\u0131\1\u0132"+
+ "\2\71\1\0\16\71\1\u0131\30\71\1\u0133\4\71\1\u0132"+
+ "\14\71\1\u0133\20\71\1\0\1\71\1\0\2\71\4\0"+
+ "\1\u0134\1\u0135\1\u0136\1\71\1\u0137\1\71\1\0\10\71"+
+ "\1\u0138\4\71\1\u0139\1\u0136\2\71\1\u0138\15\71\1\u0134"+
+ "\10\71\1\u013a\1\u0137\1\u0135\4\71\1\u013a\14\71\1\u0139"+
+ "\15\71\1\0\1\71\1\0\2\71\4\0\2\71\1\116"+
+ "\2\71\1\u013b\1\0\2\71\1\u013c\13\71\1\116\1\u013b"+
+ "\2\71\1\116\11\71\1\u013c\45\71\1\116\7\71\1\0"+
+ "\1\71\1\0\2\71\4\0\4\71\1\u013d\1\71\1\0"+
+ "\1\71\1\116\6\71\1\u013e\4\71\1\u013f\3\71\1\u013e"+
+ "\14\71\1\116\12\71\1\u013d\22\71\1\u013f\15\71\1\0"+
+ "\1\71\1\0\2\71\4\0\3\71\1\u0140\1\71\1\116"+
+ "\1\0\1\71\1\116\1\u0141\14\71\1\116\10\71\2\u0142"+
+ "\2\71\1\u0141\1\u0143\1\116\11\71\1\116\3\71\1\u0140"+
+ "\2\71\1\116\10\71\1\u0143\21\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u0144\5\71\1\u0145"+
+ "\10\71\1\u0145\12\71\1\u0144\55\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u0146\12\71\1\u0147"+
+ "\16\71\1\u0146\1\u0148\32\71\1\u0148\3\71\1\u0147\15\71"+
+ "\1\0\1\71\1\0\2\71\4\0\3\71\1\u0149\2\71"+
+ "\1\0\35\71\1\u014a\16\71\1\u0149\13\71\1\u014a\17\71"+
+ "\3\117\1\0\4\117\1\0\121\117\25\0\1\u014b\104\0"+
+ "\3\122\1\0\5\122\1\0\120\122\1\61\1\123\1\0"+
+ "\1\61\1\43\2\61\4\0\6\61\1\0\110\61\21\0"+
+ "\1\u014c\110\0\10\134\1\0\121\134\11\136\1\0\120\136"+
+ "\1\137\12\0\6\137\1\0\3\137\2\0\6\137\1\0"+
+ "\7\137\1\0\2\137\1\0\3\137\2\0\4\137\6\0"+
+ "\17\137\3\0\15\137\1\0\2\137\3\0\1\u014d\3\0"+
+ "\1\64\2\0\1\u014e\12\0\1\u014f\111\0\1\64\1\0"+
+ "\1\64\131\0\1\64\122\0\7\u0150\1\u0151\2\u0150\1\u0152"+
+ "\23\u0150\1\u0153\11\u0150\1\u0154\61\u0150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u0156\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\7\0\1\64\11\0\1\u0157\110\0\1\u0158\12\0"+
+ "\6\u0158\1\0\1\u0158\1\u0159\1\u015a\2\0\1\u0158\2\153"+
+ "\1\u0158\1\153\1\u0158\1\0\6\u0158\1\153\1\0\2\u0158"+
+ "\1\0\1\u0158\2\u015b\1\0\1\u015c\1\u015a\1\u0158\1\u0159"+
+ "\1\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b\5\u0158\3\0"+
+ "\12\u0158\1\153\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0"+
+ "\1\u0158\1\u0159\1\u015a\2\0\1\u0158\1\u015d\1\u015e\1\u0158"+
+ "\1\u015e\1\u0158\1\0\6\u0158\1\u015e\1\0\2\u0158\1\0"+
+ "\1\u015f\2\u015b\1\0\1\u015c\1\u015a\1\u0158\1\u0159\1\u0158"+
+ "\6\0\2\u0158\1\u015b\2\u0158\1\u015f\3\u0158\1\u015b\5\u0158"+
+ "\3\0\12\u0158\1\u015e\2\u0158\1\0\2\u0158\7\0\1\64"+
+ "\25\0\1\64\74\0\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u0160\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0161\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u0162\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\u0163\13\150\1\137\1\u0164"+
+ "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0165\5\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0166\1\u0167"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u0168\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0169\12\150"+
+ "\1\137\1\u016a\1\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\u016b\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u016c\1\u016d\1\150\6\0\1\150\1\u016e\4\150"+
+ "\1\u016f\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\7\0\1\64\44\0\1\64\105\0\2\u015c\1\0\1\u015c"+
+ "\10\0\1\u015c\57\0\1\u015c\5\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0170"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u0171\1\u0172\1\u0173\6\0\5\150\1\u0174\5\150\1\u0175"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150"+
+ "\1\u0176\1\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u0177\3\150\6\0\1\150\1\u0178\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0179\1\150"+
+ "\1\u017a\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\u017b\11\150\1\u017c\1\150\1\137\1\u017d"+
+ "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u017e\3\150\6\0"+
+ "\1\150\1\u017f\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u0180\1\u0181\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u0182\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0183"+
+ "\1\u0184\1\150\6\0\1\u0185\1\u0186\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0187\2\150"+
+ "\1\0\1\137\1\150\1\0\2\150\1\u0188\2\0\3\150"+
+ "\1\u0189\6\0\10\150\1\u018a\3\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\u018b\5\150\1\u018c"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u016e\2\150\6\0\1\150\1\u018d\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u018e"+
+ "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u018f\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\2\204\1\0\5\204\1\0\25\204\1\0"+
+ "\73\204\2\u0190\1\0\34\u0190\1\u0191\35\u0190\1\u0192\34\u0190"+
+ "\2\210\1\0\6\210\1\0\24\210\1\0\73\210\2\214"+
+ "\2\0\44\214\1\0\2\214\1\0\14\214\1\0\11\214"+
+ "\1\0\27\214\12\0\1\u0193\131\0\1\u0194\160\0\1\u0195"+
+ "\34\0\1\u0196\74\0\1\u0197\172\0\1\u0198\27\0\2\223"+
+ "\2\0\47\223\1\0\14\223\1\0\11\223\1\0\27\223"+
+ "\12\0\1\u0199\154\0\1\u019a\74\0\2\230\2\0\44\230"+
+ "\1\0\2\230\1\0\14\230\1\0\11\230\1\0\1\230"+
+ "\1\0\22\230\1\0\2\230\12\0\1\u019b\6\u019c\1\u019d"+
+ "\3\u019c\2\0\1\u019c\2\0\1\u019c\4\0\5\u019c\5\0"+
+ "\3\u019c\2\0\4\u019c\6\0\14\u019c\1\0\2\u019c\3\0"+
+ "\12\u019c\1\0\2\u019c\1\0\2\u019c\12\0\1\u019e\160\0"+
+ "\1\u019f\34\0\1\u01a0\74\0\1\u01a1\172\0\1\u01a2\67\0"+
+ "\1\u01a3\1\u01a4\14\0\1\u01a5\1\u01a6\1\0\1\u01a7\7\0"+
+ "\1\u01a8\1\u01a9\1\u01aa\1\u01ab\1\0\1\u01ac\4\0\1\u01ad"+
+ "\132\0\1\u01ae\30\0\1\u014d\3\0\1\64\122\0\2\243"+
+ "\1\u01af\5\243\1\u01b0\25\243\1\u01b1\73\243\2\u01b2\1\u01b3"+
+ "\6\u01b2\1\u01b4\24\u01b2\1\u01b5\73\u01b2\7\0\1\64\2\0"+
+ "\1\u01b6\35\0\1\u01b7\61\0\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u01b8\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u01b9\3\150"+
+ "\6\0\1\u01ba\13\150\1\137\1\u01bb\1\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\2\150\1\u01bc\1\150\6\0\1\u01bd\1\u01be"+
+ "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\u01bf\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u01c0\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u01c1\1\u01c2\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\2\150\1\u01c3\1\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u01c4\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u01c5\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u01c6"+
+ "\13\150\1\137\1\u01c7\1\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\150\1\u01c8\4\150\1\u01c9\5\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u01ca"+
+ "\1\150\1\u01cb\2\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\5\150\1\u01cc\6\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\7\0\1\64\11\0\1\u01cd"+
+ "\110\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u01ce\12\150\1\137\1\u01cf"+
+ "\1\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0162"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\u0163\13\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\2\150\1\u01d0\1\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u016c\1\u016d\1\150"+
+ "\6\0\1\150\1\u016e\4\150\1\u016f\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0170\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u0172"+
+ "\1\150\6\0\5\150\1\u01d1\6\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\4\150\1\u0176\1\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u01d2\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u0178\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\1\u0179\1\150\1\u01d3\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u017b"+
+ "\11\150\1\u017c\1\150\1\137\1\u017d\1\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u01d4\3\150\6\0\1\150\1\u017f\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0180"+
+ "\1\u0181\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u01d5\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u01d6\2\150\1\0"+
+ "\1\137\1\150\1\0\2\150\1\u0188\2\0\4\150\6\0"+
+ "\10\150\1\u018a\3\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u01d7\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\1\u018b\13\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u018d\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\u01d8\1\0\3\u01d8\2\0\1\u01d8"+
+ "\2\137\1\u01d8\1\137\1\u01d8\1\0\1\137\5\u01d8\1\137"+
+ "\1\0\1\137\1\u01d8\1\0\3\u01d8\2\0\4\u01d8\6\0"+
+ "\14\u01d8\1\137\2\u01d8\3\0\12\u01d8\1\137\2\u01d8\1\0"+
+ "\2\u01d8\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u01d9\1\u01da\2\150\1\u01db\1\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u01dc\6\0"+
+ "\3\150\1\u01dd\10\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u01de\3\150\1\u01df\1\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u01e0\5\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u01e1\3\150"+
+ "\6\0\1\150\1\u01e2\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u01e3\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u01e4"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u01e5\3\150\6\0\1\150\1\u01e6\4\150\1\u01e7\5\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\2\304\1\0"+
+ "\45\304\1\0\2\304\1\0\14\304\1\0\11\304\1\0"+
+ "\27\304\12\0\1\u01e8\160\0\1\u01e9\34\0\1\u01ea\74\0"+
+ "\1\u01eb\172\0\1\u01ec\27\0\2\312\1\0\1\312\1\0"+
+ "\2\312\4\0\6\312\1\0\111\312\1\313\1\0\1\312"+
+ "\1\43\2\312\4\0\6\312\1\0\110\312\10\314\1\u01b0"+
+ "\121\314\11\315\1\u01ed\120\315\2\312\1\0\1\312\1\0"+
+ "\2\312\4\0\6\312\1\70\112\312\1\0\1\312\1\0"+
+ "\2\312\4\0\6\312\1\0\35\312\1\u01ee\54\312\1\0"+
+ "\1\312\1\0\2\312\4\0\6\312\1\0\35\312\1\u01ef"+
+ "\54\312\1\0\1\312\1\0\2\312\4\0\6\312\1\0"+
+ "\20\312\1\u01f0\67\312\12\0\1\u01f1\167\0\1\u01f2\74\0"+
+ "\6\332\1\0\3\332\2\0\7\332\1\0\6\332\4\0"+
+ "\3\332\1\0\5\332\6\0\14\332\1\0\2\332\3\0"+
+ "\15\332\1\0\2\332\13\0\6\u01f3\1\0\3\u01f3\2\0"+
+ "\1\u01f3\2\0\1\u01f3\1\0\2\u01f3\1\0\5\u01f3\4\0"+
+ "\4\u01f3\1\0\5\u01f3\6\0\14\u01f3\1\0\2\u01f3\3\0"+
+ "\12\u01f3\1\0\2\u01f3\1\0\2\u01f3\40\0\1\u01f4\1\u01f5"+
+ "\1\u01f6\10\0\1\u01f7\2\0\1\u01f8\1\u01f9\1\u01fa\5\0"+
+ "\1\u01fb\1\0\1\u01fc\1\u01fd\1\u01fe\1\0\1\u01ff\6\0"+
+ "\1\u0200\41\0\6\u0201\1\0\3\u0201\2\0\1\u0201\2\0"+
+ "\1\u0201\1\0\2\u0201\1\0\5\u0201\4\0\4\u0201\1\0"+
+ "\5\u0201\6\0\14\u0201\1\0\2\u0201\3\0\12\u0201\1\0"+
+ "\2\u0201\1\0\2\u0201\13\0\6\343\1\0\3\343\2\0"+
+ "\7\343\1\0\6\343\4\0\3\343\2\0\4\343\6\0"+
+ "\14\343\1\0\2\343\3\0\15\343\1\0\2\343\13\0"+
+ "\6\343\1\0\3\343\2\0\1\343\2\0\1\343\1\0"+
+ "\2\343\1\0\5\343\5\0\3\343\2\0\4\343\6\0"+
+ "\14\343\1\0\2\343\3\0\12\343\1\0\2\343\1\0"+
+ "\2\343\12\0\7\354\1\0\3\354\2\0\1\354\2\0"+
+ "\1\354\1\0\10\354\4\0\1\u01f2\3\354\2\0\4\354"+
+ "\6\0\14\354\1\0\2\354\2\0\1\362\12\354\1\0"+
+ "\2\354\1\0\2\354\12\0\7\354\1\0\3\354\2\0"+
+ "\1\354\2\0\1\354\1\0\10\354\5\0\3\354\2\0"+
+ "\4\354\6\0\14\354\1\0\2\354\2\0\1\362\12\354"+
+ "\1\0\2\354\1\0\2\354\76\0\1\u0202\60\0\1\u0203"+
+ "\2\0\2\356\1\0\1\356\10\0\1\356\10\0\1\356"+
+ "\1\u0204\2\0\1\u0203\11\0\1\u0205\1\u0206\1\0\1\u0207"+
+ "\1\0\1\u0208\23\0\1\356\17\0\7\354\1\0\3\354"+
+ "\2\0\1\354\2\356\1\354\1\356\10\354\1\356\4\0"+
+ "\3\354\2\0\4\354\6\0\14\354\1\0\2\354\2\0"+
+ "\1\362\12\354\1\356\2\354\1\0\2\354\14\0\1\u0209"+
+ "\7\0\1\u0209\3\0\4\u0209\7\0\2\u0209\5\0\2\u0209"+
+ "\2\0\2\u0209\12\0\1\u0209\1\0\1\u0209\4\0\1\u0209"+
+ "\10\0\1\u0209\11\0\1\u0209\5\0\2\u020a\1\0\127\u020a"+
+ "\12\0\1\u020b\132\0\6\u020c\1\0\3\u020c\2\0\5\u020c"+
+ "\3\0\6\u020c\4\0\3\u020c\2\0\4\u020c\6\0\14\u020c"+
+ "\1\0\2\u020c\3\0\15\u020c\1\0\2\u020c\13\0\1\374"+
+ "\1\u020d\3\374\1\u020e\1\0\3\374\2\0\5\374\3\0"+
+ "\2\374\1\u020e\3\374\4\0\3\374\2\0\4\374\6\0"+
+ "\4\374\1\u020d\7\374\1\0\2\374\3\0\15\374\1\0"+
+ "\2\374\13\0\6\374\1\0\3\374\2\0\5\374\3\0"+
+ "\6\374\4\0\3\374\2\0\4\374\6\0\14\374\1\0"+
+ "\2\374\3\0\15\374\1\0\2\374\7\0\1\u020f\16\0"+
+ "\1\u020f\6\0\1\u0210\46\0\1\u0211\62\0\1\u0212\115\0"+
+ "\1\u0213\203\0\1\u0214\116\0\1\u0215\112\0\1\u0216\172\0"+
+ "\1\u0217\27\0\2\61\1\0\1\61\1\0\2\61\1\u020f"+
+ "\3\0\6\61\1\0\4\61\1\u0218\103\61\2\71\1\0"+
+ "\1\71\1\0\2\71\4\0\2\71\1\u0219\3\71\1\0"+
+ "\16\71\1\u0219\73\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\35\71\1\u021a\32\71\1\u021a\21\71\1\0"+
+ "\1\71\1\0\2\71\4\0\2\71\1\u021b\3\71\1\0"+
+ "\1\u0114\15\71\1\u021b\44\71\1\u0114\26\71\1\0\1\71"+
+ "\1\0\2\71\4\0\1\71\1\u021c\1\u021d\3\71\1\0"+
+ "\1\71\1\u021e\14\71\1\u021d\17\71\1\u021e\13\71\1\u021c"+
+ "\37\71\1\0\1\71\1\0\2\71\4\0\4\71\1\116"+
+ "\1\71\1\0\10\71\1\116\10\71\1\116\27\71\1\116"+
+ "\40\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\56\71\1\u021f\14\71\1\u021f\16\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\15\71\1\u0220\56\71\1\u0220"+
+ "\15\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\35\71\1\u0221\32\71\1\u0221\21\71\1\0\1\71\1\0"+
+ "\2\71\4\0\5\71\1\u0222\1\0\17\71\1\u0222\72\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\20\71"+
+ "\1\u0223\51\71\1\u0223\17\71\1\0\1\71\1\0\2\71"+
+ "\4\0\4\71\1\u021c\1\71\1\0\20\71\1\u0224\30\71"+
+ "\1\u021c\20\71\1\u0224\17\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\1\71\1\u0225\34\71\1\u0225\11\71"+
+ "\1\u0222\5\71\1\u0226\1\u0222\13\71\1\u0226\16\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\1\71\1\u0222"+
+ "\34\71\1\u0222\53\71\1\0\1\71\1\0\2\71\4\0"+
+ "\3\71\1\u0227\2\71\1\0\54\71\1\u0227\35\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0228"+
+ "\32\71\1\u0228\21\71\1\0\1\71\1\0\2\71\4\0"+
+ "\1\116\3\71\1\u0229\1\71\1\0\37\71\1\116\11\71"+
+ "\1\u0229\40\71\1\0\1\71\1\0\2\71\4\0\2\71"+
+ "\1\u022a\3\71\1\0\16\71\1\u022a\73\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\64\71\1\116\10\71"+
+ "\1\116\14\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\2\71\1\116\31\71\1\116\12\71\1\u022b\21\71"+
+ "\1\u022b\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\35\71\1\u022c\32\71\1\u022c\21\71\1\0\1\71"+
+ "\1\0\2\71\4\0\2\71\1\u022d\3\71\1\0\16\71"+
+ "\1\u022d\73\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+ "\1\u0114\1\0\17\71\1\u0114\36\71\1\u0222\14\71\1\u0222"+
+ "\16\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\27\71\1\u022e\23\71\1\u022e\36\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\47\71\1\u012b\21\71\1\u012b"+
+ "\20\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\47\71\1\u022f\21\71\1\u022f\20\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\10\71\1\u0114\10\71\1\u0114"+
+ "\70\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\2\71\1\u0230\31\71\1\u0230\55\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\20\71\1\u0231\51\71\1\u0231"+
+ "\17\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\64\71\1\u0232\10\71\1\u0232\14\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\1\u0233\7\71\1\u0234\10\71"+
+ "\1\u0234\41\71\1\u0233\26\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\10\71\1\u0235\10\71\1\u0235\70\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+ "\1\u0236\31\71\1\u0236\55\71\1\0\1\71\1\0\2\71"+
+ "\4\0\3\71\1\u0237\2\71\1\0\47\71\1\u0238\4\71"+
+ "\1\u0237\14\71\1\u0238\20\71\1\0\1\71\1\0\2\71"+
+ "\4\0\5\71\1\u0239\1\0\17\71\1\u0239\72\71\1\0"+
+ "\1\71\1\0\2\71\4\0\1\u023a\5\71\1\0\37\71"+
+ "\1\u023a\52\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\50\71\1\u023b\6\71\1\u023b\32\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\47\71\1\116\21\71"+
+ "\1\116\20\71\1\0\1\71\1\0\2\71\4\0\1\u023c"+
+ "\5\71\1\0\37\71\1\u023c\52\71\1\0\1\71\1\0"+
+ "\2\71\4\0\1\u023d\5\71\1\0\37\71\1\u023d\52\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\61\71"+
+ "\1\116\16\71\1\116\11\71\1\0\1\71\1\0\2\71"+
+ "\4\0\1\u023e\5\71\1\0\1\71\1\u0116\1\u023f\5\71"+
+ "\1\u014a\10\71\1\u014a\6\71\2\u0240\2\71\1\u023f\1\71"+
+ "\1\u0116\1\u023e\52\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\35\71\1\u0241\32\71\1\u0241\21\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\2\71\1\u0242"+
+ "\31\71\1\u0242\27\71\1\u0243\10\71\1\u0243\14\71\1\0"+
+ "\1\71\1\0\2\71\4\0\2\71\1\u0244\3\71\1\0"+
+ "\16\71\1\u0244\1\71\1\u023d\26\71\1\u0223\21\71\1\u0223"+
+ "\1\u023d\17\71\1\0\1\71\1\0\2\71\4\0\3\71"+
+ "\1\u0245\2\71\1\0\54\71\1\u0245\35\71\1\0\1\71"+
+ "\1\0\2\71\4\0\2\71\1\u0246\3\71\1\0\16\71"+
+ "\1\u0246\73\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+ "\1\u0247\1\0\2\71\1\u0248\14\71\1\u0247\14\71\1\u0248"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\4\71\1\u0249"+
+ "\1\71\1\0\51\71\1\u0249\40\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\10\71\1\u014a\10\71\1\u014a"+
+ "\70\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\50\71\1\u024a\6\71\1\u024a\32\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\50\71\1\u024b\6\71\1\u024b"+
+ "\32\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\56\71\1\u024c\14\71\1\u024c\16\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\35\71\1\u024d\32\71\1\u024d"+
+ "\21\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u024e"+
+ "\1\0\17\71\1\u024e\72\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\103\71\1\u021e\3\71\1\u021e\2\71"+
+ "\1\0\1\71\1\0\2\71\4\0\5\71\1\u024f\1\0"+
+ "\17\71\1\u024f\72\71\1\0\1\71\1\0\2\71\4\0"+
+ "\2\71\1\116\3\71\1\0\16\71\1\116\16\71\1\u0250"+
+ "\23\71\1\116\6\71\1\u0250\7\71\1\116\11\71\1\0"+
+ "\1\71\1\0\2\71\4\0\5\71\1\u0251\1\0\1\71"+
+ "\1\116\15\71\1\u0251\16\71\1\116\53\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\20\71\1\116\51\71"+
+ "\1\116\17\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+ "\1\u0252\1\0\17\71\1\u0252\72\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\1\u0253\62\71\1\u0253\26\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\50\71"+
+ "\1\116\6\71\1\116\32\71\1\0\1\71\1\0\2\71"+
+ "\4\0\5\71\1\u0254\1\0\17\71\1\u0254\1\u0255\51\71"+
+ "\1\u0255\17\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\1\71\1\u0256\34\71\1\u0256\53\71\1\0\1\71"+
+ "\1\0\2\71\4\0\2\71\1\u0257\1\71\1\116\1\71"+
+ "\1\0\16\71\1\u0257\32\71\1\116\40\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\50\71\1\u0258\6\71"+
+ "\1\u0258\32\71\1\0\1\71\1\0\2\71\4\0\2\71"+
+ "\1\116\3\71\1\0\16\71\1\116\71\71\7\0\1\u0259"+
+ "\16\0\1\u0259\116\0\1\u025a\45\0\1\u025a\57\0\1\u020f"+
+ "\16\0\1\u020f\103\0\12\u0150\1\u025b\23\u0150\1\u0153\75\u0150"+
+ "\1\0\127\u0150\50\0\1\u025c\61\0\1\137\12\0\6\137"+
+ "\1\0\3\137\2\0\6\137\1\0\1\137\1\u025d\5\137"+
+ "\1\0\2\137\1\0\3\137\2\0\4\137\6\0\17\137"+
+ "\3\0\15\137\1\0\3\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\2\150\1\u025e\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\7\0\1\64\11\0"+
+ "\1\144\110\0\1\u0158\12\0\6\u0158\1\0\3\u0158\2\0"+
+ "\6\u0158\1\0\7\u0158\1\0\2\u0158\1\0\3\u0158\2\0"+
+ "\4\u0158\6\0\17\u0158\3\0\15\u0158\1\0\3\u0158\12\0"+
+ "\6\u0158\1\0\3\u0158\2\0\1\u0158\2\u025f\1\u0158\1\u025f"+
+ "\1\u0158\1\u0260\6\u0158\1\u025f\1\0\2\u0158\1\0\3\u0158"+
+ "\1\u0260\1\0\4\u0158\6\0\17\u0158\3\0\12\u0158\1\u025f"+
+ "\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0\2\u0158\1\u015a"+
+ "\2\0\1\u0158\2\u015c\1\u0158\1\u015c\1\u0158\1\0\6\u0158"+
+ "\1\u015c\1\0\2\u0158\1\0\1\u0158\2\u015b\2\0\1\u015a"+
+ "\3\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b\5\u0158\3\0"+
+ "\12\u0158\1\u015c\2\u0158\1\0\3\u0158\12\0\6\u0158\1\0"+
+ "\2\u0158\1\u015a\2\0\1\u0158\2\u015d\1\u0158\1\u015d\1\u0158"+
+ "\1\0\6\u0158\1\u015d\1\0\2\u0158\1\0\1\u0158\2\u015b"+
+ "\1\0\1\u015c\1\u015a\3\u0158\6\0\2\u0158\1\u015b\6\u0158"+
+ "\1\u015b\5\u0158\3\0\12\u0158\1\u015d\2\u0158\1\0\3\u0158"+
+ "\12\0\6\u0158\1\0\1\u0158\1\u0261\1\u015a\2\0\1\u0158"+
+ "\1\u015d\1\u015e\1\u0158\1\u015e\1\u0158\1\0\6\u0158\1\u015e"+
+ "\1\0\2\u0158\1\0\1\u0158\2\u015b\1\0\1\u015c\1\u015a"+
+ "\1\u0158\1\u0261\1\u0158\6\0\2\u0158\1\u015b\6\u0158\1\u015b"+
+ "\5\u0158\3\0\12\u0158\1\u015e\2\u0158\1\0\3\u0158\12\0"+
+ "\1\u0158\1\u0262\4\u0158\1\0\2\u0158\1\u0262\2\0\1\u0158"+
+ "\4\u0262\1\u0158\1\0\5\u0158\2\u0262\1\0\2\u0158\1\0"+
+ "\1\u0158\2\u0262\2\0\2\u0262\2\u0158\6\0\2\u0158\1\u0262"+
+ "\1\u0158\1\u0262\4\u0158\1\u0262\5\u0158\3\0\1\u0262\11\u0158"+
+ "\1\u0262\2\u0158\1\0\2\u0158\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u0263\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0264\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u0265\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u0266\2\150\6\0\14\150\1\137"+
+ "\1\u0188\1\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+ "\1\u0267\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\6\150\1\u0268\5\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\3\150\1\u0269\10\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u026a"+
+ "\1\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\12\150\1\u0188\1\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u026b\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u026c"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u026d\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u026e\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\3\150\1\u026f\2\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\2\150\1\u0270\1\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u0271\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u0188\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u0272\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0273"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u0274\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0275\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+ "\1\u0276\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0277\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\3\150\1\u0278\10\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0279\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u027a\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u027b\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u027c"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u027d\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u027e\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u027f\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u0280\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0281\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\4\150\1\u0282\1\150\1\0\1\137\1\150\1\0\2\150"+
+ "\1\u0283\2\0\2\150\1\u0284\1\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0285\5\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\4\150\1\u0286\1\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\150\1\u0287\4\150\1\u0288"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u0289\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\4\150\1\u028a\7\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u028b\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u0275"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u028c\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u028d\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u028e\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u028f\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0290\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\1\150\1\u0291\1\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\2\150\1\u0292\12\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\3\150\1\u0293\10\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u0294\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0295\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u0296\1\150\6\0\6\150"+
+ "\1\u0297\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0298\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\2\150\1\u0188\12\150\1\0\2\150\14\0\1\u0299"+
+ "\7\0\1\u0299\3\0\4\u0299\7\0\2\u0299\5\0\2\u0299"+
+ "\2\0\2\u0299\12\0\1\u0299\1\0\1\u0299\4\0\1\u0299"+
+ "\10\0\1\u0299\11\0\1\u0299\21\0\1\u029a\7\0\1\u029a"+
+ "\3\0\4\u029a\7\0\2\u029a\5\0\2\u029a\2\0\2\u029a"+
+ "\12\0\1\u029a\1\0\1\u029a\4\0\1\u029a\10\0\1\u029a"+
+ "\11\0\1\u029a\20\0\1\u029b\45\0\1\u029b\143\0\1\u029c"+
+ "\116\0\1\u029d\112\0\1\u029e\172\0\1\u029f\42\0\1\u02a0"+
+ "\45\0\1\u02a0\75\0\1\u02a1\117\0\6\u019c\1\u019d\3\u019c"+
+ "\2\0\1\u019c\2\0\1\u019c\4\0\5\u019c\5\0\3\u019c"+
+ "\2\0\4\u019c\6\0\14\u019c\1\0\2\u019c\3\0\12\u019c"+
+ "\1\0\2\u019c\1\0\23\u019c\1\u019d\110\u019c\73\0\1\u02a2"+
+ "\116\0\1\u02a3\112\0\1\u02a4\172\0\1\u02a5\105\0\1\u02a6"+
+ "\112\0\1\u02a7\30\0\1\u02a8\1\u02a9\135\0\1\u02aa\73\0"+
+ "\1\u02ab\150\0\1\u02ac\17\0\1\u02ad\76\0\1\u02ae\144\0"+
+ "\1\u02af\132\0\1\u02b0\131\0\1\u02b1\114\0\1\u02b2\145\0"+
+ "\1\u02b3\133\0\1\u02b4\11\0\1\u02b5\1\0\1\u02b6\1\0"+
+ "\1\u02b7\4\0\1\u02b8\26\0\10\u01af\1\u02b9\25\u01af\1\u02ba"+
+ "\75\u01af\1\u02bb\5\u01af\1\u02bc\1\243\17\u01af\1\243\1\u01af"+
+ "\1\243\2\u01af\1\243\1\u02bd\5\243\6\u01af\1\243\50\u01af"+
+ "\1\243\5\u01af\2\u02be\1\u02bf\6\u02be\1\u01ed\120\u02be\11\u02bf"+
+ "\1\u01ed\120\u02bf\2\u02be\1\u02bf\5\u02be\1\u01b2\1\u02c0\17\u02be"+
+ "\1\u02c1\1\u02be\1\u02c2\2\u02be\1\u01b2\1\u02c3\4\u01b2\1\u02c1"+
+ "\6\u02be\1\u01b2\50\u02be\1\u02c2\5\u02be\2\u01b6\1\0\127\u01b6"+
+ "\50\0\1\u02c4\61\0\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u02c5\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u02c6\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u02c7\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u02c8\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u02c9"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u02ca\2\150\6\0\1\150\1\u02cb\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u02cc\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\10\150\1\u02cd\3\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u02ce\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u02cf"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u02d0\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u02d1\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02d2\6\0"+
+ "\1\u02d3\1\150\1\u02d4\1\150\1\u02d5\7\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\2\150\1\u02d6\1\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u02d7\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\4\150\1\u02d8\7\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u02d9"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u02da\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u02db\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u02dc\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u02dd\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\1\u02de\5\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u02df\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u02e0\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u02e1\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u02e2\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u0277\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02e3\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u02e4\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u027e\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\2\150\1\u0283\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u028a\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u02e5\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\u01d8\1\0\3\u01d8"+
+ "\2\0\6\u01d8\1\0\1\u02e6\6\u01d8\1\0\1\137\1\u01d8"+
+ "\1\0\3\u01d8\2\0\4\u01d8\6\0\14\u01d8\1\137\2\u01d8"+
+ "\3\0\15\u01d8\1\0\2\u01d8\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u02e7\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u02e8\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u02e9\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\3\150\1\u02ea\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\3\150\1\u02eb"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u02ec\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u02ed\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\1\150\1\u02ee"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u02ef\1\150\6\0\10\150\1\u02f0\3\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\1\150\1\u02f1\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\1\u02f2\1\u02f3\4\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u02f4\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u02f5\6\0"+
+ "\7\150\1\u02f6\4\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u02f7\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u02f8"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u02f9\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\73\0\1\u02fa\116\0\1\u02fb\112\0\1\u02fc"+
+ "\172\0\1\u02fd\27\0\2\312\1\0\1\312\1\0\2\312"+
+ "\4\0\6\312\1\0\64\312\1\u02fe\25\312\1\0\1\312"+
+ "\1\0\2\312\4\0\6\312\1\0\64\312\1\u02ff\25\312"+
+ "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\52\312"+
+ "\1\u0300\35\312\13\0\1\u0301\45\0\1\u0301\63\0\6\u01f3"+
+ "\1\0\3\u01f3\2\0\7\u01f3\1\0\6\u01f3\4\0\3\u01f3"+
+ "\1\0\5\u01f3\6\0\14\u01f3\1\0\2\u01f3\3\0\15\u01f3"+
+ "\1\0\2\u01f3\71\0\1\u0302\117\0\1\u0303\113\0\1\u0304"+
+ "\27\0\1\u0305\131\0\1\u0306\4\0\1\u0307\75\0\1\u0308"+
+ "\35\0\1\u0309\125\0\1\u030a\114\0\1\u030b\16\0\1\u030c"+
+ "\76\0\1\u030d\7\0\1\u030e\3\0\1\u030f\143\0\1\u0310"+
+ "\102\0\1\u0311\165\0\1\u0312\123\0\1\u0313\137\0\1\u0314"+
+ "\46\0\6\u0201\1\0\3\u0201\2\0\7\u0201\1\0\6\u0201"+
+ "\4\0\3\u0201\1\0\5\u0201\6\0\14\u0201\1\0\2\u0201"+
+ "\3\0\15\u0201\1\0\2\u0201\100\0\1\u0315\126\0\1\u0203"+
+ "\2\0\1\u0203\72\0\1\u0203\32\0\2\u0203\134\0\1\u0203"+
+ "\73\0\1\u0203\150\0\1\u0203\16\0\1\u0203\44\0\2\374"+
+ "\1\u0316\3\374\1\0\3\374\2\0\5\374\3\0\1\374"+
+ "\1\u0316\4\374\4\0\3\374\2\0\4\374\6\0\14\374"+
+ "\1\0\2\374\3\0\15\374\1\0\2\374\13\0\6\374"+
+ "\1\0\1\u0317\2\374\2\0\5\374\3\0\6\374\4\0"+
+ "\3\374\2\0\4\374\6\0\14\374\1\0\1\u0317\1\374"+
+ "\3\0\15\374\1\0\2\374\35\0\1\u0318\131\0\1\u0319"+
+ "\162\0\1\u031a\121\0\1\u0214\146\0\1\u031b\113\0\1\u031c"+
+ "\54\0\2\71\1\0\1\71\1\0\2\71\4\0\3\71"+
+ "\1\u031d\2\71\1\0\54\71\1\u031d\35\71\1\0\1\71"+
+ "\1\0\2\71\4\0\1\71\1\u0233\4\71\1\0\20\71"+
+ "\1\116\31\71\1\u0233\17\71\1\116\17\71\1\0\1\71"+
+ "\1\0\2\71\4\0\3\71\1\u031e\2\71\1\0\47\71"+
+ "\1\u031f\4\71\1\u031e\14\71\1\u031f\20\71\1\0\1\71"+
+ "\1\0\2\71\4\0\5\71\1\u0320\1\0\17\71\1\u0320"+
+ "\72\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\61\71\1\u0233\16\71\1\u0233\11\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u0321\31\71\1\u0321"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\4\71\1\116"+
+ "\1\71\1\0\51\71\1\116\40\71\1\0\1\71\1\0"+
+ "\2\71\4\0\2\71\1\u0322\3\71\1\0\16\71\1\u0322"+
+ "\73\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\1\71\1\u024c\34\71\1\u024c\53\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\116\31\71\1\116"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u0233"+
+ "\1\0\17\71\1\u0233\72\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\61\71\1\u0323\16\71\1\u0323\11\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\64\71"+
+ "\1\u0324\10\71\1\u0324\14\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\56\71\1\u0325\14\71\1\u0325\16\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\20\71"+
+ "\1\u0326\51\71\1\u0326\17\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\1\u0233\62\71\1\u0233\26\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\15\71\1\u023d"+
+ "\56\71\1\u023d\15\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\35\71\1\u0327\32\71\1\u0327\21\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\64\71\1\u024b"+
+ "\10\71\1\u024b\14\71\1\0\1\71\1\0\2\71\4\0"+
+ "\3\71\1\u0328\2\71\1\0\54\71\1\u0328\35\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0244"+
+ "\32\71\1\u0244\21\71\1\0\1\71\1\0\2\71\4\0"+
+ "\5\71\1\u0329\1\0\17\71\1\u0329\72\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\47\71\1\u023d\21\71"+
+ "\1\u023d\20\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\35\71\1\u0145\32\71\1\u0145\21\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\55\71\1\116\20\71"+
+ "\1\116\13\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\2\71\1\u032a\31\71\1\u032a\55\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\2\71\1\u014a\31\71"+
+ "\1\u014a\55\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\2\71\1\u024c\31\71\1\u024c\55\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\2\71\1\u0145\31\71"+
+ "\1\u0145\55\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\20\71\1\u032b\51\71\1\u032b\17\71\1\0\1\71"+
+ "\1\0\2\71\4\0\1\71\1\u032c\4\71\1\0\52\71"+
+ "\1\u032c\37\71\1\0\1\71\1\0\2\71\4\0\5\71"+
+ "\1\u032d\1\0\17\71\1\u032d\72\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u032e\31\71\1\u032e"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\1\116\62\71\1\116\26\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\47\71\1\u032f\21\71\1\u032f\20\71"+
+ "\1\0\1\71\1\0\2\71\4\0\5\71\1\116\1\0"+
+ "\17\71\1\116\72\71\1\0\1\71\1\0\2\71\4\0"+
+ "\1\71\1\u0108\4\71\1\0\52\71\1\u0108\37\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u0330"+
+ "\14\71\1\u0330\16\71\1\0\1\71\1\0\2\71\4\0"+
+ "\2\71\1\u0331\3\71\1\0\16\71\1\u0331\73\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u0332"+
+ "\14\71\1\u0332\16\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\1\71\1\u0333\34\71\1\u0333\53\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\15\71\1\u0334"+
+ "\56\71\1\u0334\15\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\56\71\1\116\14\71\1\116\16\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\50\71\1\u0222"+
+ "\6\71\1\u0222\32\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\47\71\1\u0335\21\71\1\u0335\20\71\1\0"+
+ "\1\71\1\0\2\71\4\0\3\71\1\u0336\2\71\1\0"+
+ "\54\71\1\u0336\35\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\35\71\1\116\32\71\1\116\21\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\1\71\1\u0337"+
+ "\34\71\1\u0337\53\71\1\0\1\71\1\0\2\71\4\0"+
+ "\3\71\1\u012c\2\71\1\0\54\71\1\u012c\35\71\1\0"+
+ "\1\71\1\0\2\71\4\0\2\71\1\u0338\3\71\1\0"+
+ "\16\71\1\u0338\73\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\50\71\1\u0339\6\71\1\u0339\32\71\1\0"+
+ "\1\71\1\0\2\71\4\0\3\71\1\u032d\2\71\1\0"+
+ "\54\71\1\u032d\7\71\1\u0324\10\71\1\u0324\14\71\1\0"+
+ "\1\71\1\0\2\71\4\0\4\71\1\u0229\1\71\1\0"+
+ "\51\71\1\u0229\40\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\1\71\1\u033a\34\71\1\u033a\53\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u033b"+
+ "\32\71\1\u033b\21\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\35\71\1\u033c\32\71\1\u033c\21\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\64\71\1\u033d"+
+ "\10\71\1\u033d\14\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\2\71\1\u014a\31\71\1\u014a\1\116\32\71"+
+ "\1\116\21\71\1\0\1\71\1\0\2\71\4\0\6\71"+
+ "\1\0\15\71\1\116\56\71\1\116\15\71\1\0\1\71"+
+ "\1\0\2\71\4\0\5\71\1\u033e\1\0\17\71\1\u033e"+
+ "\72\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\55\71\1\116\20\71\1\116\1\u033f\6\71\1\u033f\3\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+ "\1\u012c\31\71\1\u012c\53\71\14\0\1\u0340\57\0\1\u0340"+
+ "\133\0\1\u025b\1\0\1\u025b\5\0\1\u025b\35\0\1\u0341"+
+ "\117\0\1\137\12\0\1\137\1\u0342\4\137\1\0\2\137"+
+ "\1\u0342\2\0\1\137\4\u0342\1\137\1\0\5\137\2\u0342"+
+ "\1\0\2\137\1\0\1\137\2\u0342\2\0\2\u0342\2\137"+
+ "\6\0\2\137\1\u0342\1\137\1\u0342\4\137\1\u0342\5\137"+
+ "\3\0\1\u0342\11\137\1\u0342\2\137\1\0\3\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u0343\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\u0158\12\0\6\u0158\1\0\3\u0158\2\0\1\u0158"+
+ "\2\u025f\1\u0158\1\u025f\1\u0158\1\0\6\u0158\1\u025f\1\0"+
+ "\2\u0158\1\0\1\u0158\2\u015b\2\0\4\u0158\6\0\2\u0158"+
+ "\1\u015b\6\u0158\1\u015b\5\u0158\3\0\12\u0158\1\u025f\2\u0158"+
+ "\1\0\2\u0158\30\0\2\u025f\1\0\1\u025f\10\0\1\u025f"+
+ "\57\0\1\u025f\5\0\1\u0158\12\0\1\u0158\1\u0262\4\u0158"+
+ "\1\0\1\u0158\1\u0261\1\u0262\2\0\1\u0158\4\u0262\1\u0158"+
+ "\1\0\5\u0158\2\u0262\1\0\2\u0158\1\0\1\u0158\2\u0262"+
+ "\2\0\2\u0262\1\u0261\1\u0158\6\0\2\u0158\1\u0262\1\u0158"+
+ "\1\u0262\4\u0158\1\u0262\5\u0158\3\0\1\u0262\11\u0158\1\u0262"+
+ "\2\u0158\1\0\2\u0158\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0173\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0344\5\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0345"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u0346\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u0347"+
+ "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u0188\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u0348\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u0188\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u0349\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u034a\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\2\150\1\u034b\1\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u034c"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\4\150\1\u034d\7\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\3\150\1\u0265\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u034e"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u034f\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\10\150\1\u0188"+
+ "\3\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\u0350\13\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u0188\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u0351\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0352\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\150\1\u0353\12\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u0354\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0355\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\150\1\u034c\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u016e\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0356"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u034e\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u028b\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u0357\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u0358\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u0359\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u035a\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\4\150\1\u035b\1\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u0356\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u035c\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\13\150\1\u035d\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u035e\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\7\150"+
+ "\1\u035f\4\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u0295\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0268\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u034c"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0360\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\3\150\1\u0361\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u0362\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0363\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u0364\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u0365\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+ "\1\u0366\1\150\6\0\1\150\1\u0353\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\2\150\1\u0275\1\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\u0188\13\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u0367\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u0188"+
+ "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u0188\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\14\0\1\u0368\7\0\1\u0368\3\0\4\u0368"+
+ "\7\0\2\u0368\5\0\2\u0368\2\0\2\u0368\12\0\1\u0368"+
+ "\1\0\1\u0368\4\0\1\u0368\10\0\1\u0368\11\0\1\u0368"+
+ "\21\0\1\u0369\7\0\1\u0369\3\0\4\u0369\7\0\2\u0369"+
+ "\5\0\2\u0369\2\0\2\u0369\12\0\1\u0369\1\0\1\u0369"+
+ "\4\0\1\u0369\10\0\1\u0369\11\0\1\u0369\21\0\1\u036a"+
+ "\57\0\1\u036a\123\0\1\u036b\121\0\1\u029c\146\0\1\u036c"+
+ "\113\0\1\u036d\70\0\1\u036e\57\0\1\u036e\56\0\1\u036f"+
+ "\176\0\1\u0370\121\0\1\u02a2\146\0\1\u0371\113\0\1\u0372"+
+ "\115\0\1\u0373\131\0\1\u0374\130\0\1\u0375\163\0\1\u0376"+
+ "\116\0\1\u0377\14\0\1\u0378\76\0\1\u0379\130\0\1\u037a"+
+ "\15\0\1\u037b\115\0\1\u037c\150\0\1\u037d\143\0\1\u037e"+
+ "\76\0\1\u037f\132\0\1\u0380\131\0\1\u0381\30\0\1\u0382"+
+ "\77\0\1\u0383\167\0\1\u0384\124\0\1\u0385\131\0\1\u0386"+
+ "\102\0\1\u0387\146\0\1\u0388\52\0\2\u01af\1\u02bb\5\u01af"+
+ "\1\u0389\121\u01af\10\u02bb\1\u02b9\121\u02bb\2\u02bc\1\u0389\5\u02bc"+
+ "\1\u01b0\25\u02bc\1\u038a\73\u02bc\10\u01af\1\u02b9\3\u01af\1\u038b"+
+ "\7\u01af\1\u038b\3\u01af\4\u038b\2\u01af\1\u02ba\4\u01af\2\u038b"+
+ "\5\u01af\2\u038b\2\u01af\2\u038b\12\u01af\1\u038b\1\u01af\1\u038b"+
+ "\4\u01af\1\u038b\10\u01af\1\u038b\11\u01af\1\u038b\5\u01af\2\u02be"+
+ "\1\u02bf\6\u02be\1\u01b4\120\u02be\11\u02bf\1\u01b4\120\u02bf\11\0"+
+ "\1\u01ed\120\0\2\u02be\1\u02bf\6\u02be\1\u01ed\17\u02be\1\u02c2"+
+ "\1\u02be\1\u02c2\10\u02be\1\u02c2\57\u02be\1\u02c2\7\u02be\1\u02bf"+
+ "\6\u02be\1\u01ed\17\u02be\1\u01b2\1\u02be\1\u01b2\10\u02be\1\u01b2"+
+ "\57\u02be\1\u01b2\7\u02be\1\u02bf\6\u02be\1\u01b4\2\u02be\1\u038c"+
+ "\7\u02be\1\u038c\3\u02be\4\u038c\7\u02be\2\u038c\5\u02be\2\u038c"+
+ "\2\u02be\2\u038c\12\u02be\1\u038c\1\u02be\1\u038c\4\u02be\1\u038c"+
+ "\10\u02be\1\u038c\11\u02be\1\u038c\5\u02be\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u038d\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u038e\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\u038f\5\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0390"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0391\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0392\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0393"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u0394\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\3\150\1\u0395\10\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0396\1\u0397\2\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\2\150\1\u0397\11\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0397"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u0398\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u0399\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u039a\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u039b"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u039c\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u039d\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u039e\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\7\150\1\u039f\4\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u03a0\3\150\6\0\1\150"+
+ "\1\u03a1\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u03a2\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\1\150\1\u0354"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u03a3"+
+ "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u03a4\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\10\150\1\u03a5\3\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u03a6\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+ "\1\u03a7\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u0354\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u0390\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0353"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u03a8\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u03a9\1\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\137\1\0\3\137\2\0\6\137\1\0\1\137"+
+ "\1\u03aa\5\137\1\0\2\137\1\0\3\137\2\0\4\137"+
+ "\6\0\17\137\3\0\15\137\1\0\3\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u03ab\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u03ac\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u03ad\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u03ae\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u03af\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u03b0\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\1\150\1\u03b1\13\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u03b2\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\2\150\1\u03b3\1\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u03b4"+
+ "\1\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u03b5\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\u03b6\5\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\2\150\1\u03b7\1\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\u0354\13\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\1\u03b8\5\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u03b9\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u03ba\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u03bb\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u0354"+
+ "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u03bc\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\66\0\1\u03bd\121\0\1\u02fa\146\0\1\u03be"+
+ "\113\0\1\u03bf\54\0\2\312\1\0\1\312\1\0\2\312"+
+ "\4\0\6\312\1\0\36\312\1\u03c0\53\312\1\0\1\312"+
+ "\1\0\2\312\4\0\6\312\1\0\34\312\1\u03c1\55\312"+
+ "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\36\312"+
+ "\1\u03c2\51\312\20\0\1\u03c3\20\0\1\u03c3\161\0\1\u0305"+
+ "\100\0\1\u03c4\161\0\1\u03c5\102\0\1\316\164\0\1\u03c6"+
+ "\75\0\1\u03c7\150\0\1\u03c8\145\0\1\u03c9\77\0\1\u03ca"+
+ "\132\0\1\u03cb\16\0\1\u03cc\112\0\1\u03cd\145\0\1\u03ce"+
+ "\151\0\1\u03cf\106\0\1\u03d0\161\0\1\u03d1\106\0\1\u03d2"+
+ "\132\0\1\u0308\126\0\1\u03d3\134\0\1\u03d4\143\0\1\u03d5"+
+ "\51\0\3\374\1\u03d6\2\374\1\0\3\374\2\0\5\374"+
+ "\3\0\6\374\4\0\3\374\2\0\4\374\6\0\6\374"+
+ "\1\u03d6\5\374\1\0\2\374\3\0\15\374\1\0\2\374"+
+ "\13\0\6\374\1\0\1\374\1\u03d7\1\374\2\0\5\374"+
+ "\3\0\6\374\4\0\3\374\2\0\2\374\1\u03d7\1\374"+
+ "\6\0\14\374\1\0\2\374\3\0\15\374\1\0\2\374"+
+ "\12\0\1\u03d8\200\0\1\u0214\4\0\1\u031a\50\0\3\u03d9"+
+ "\1\0\1\u03d9\7\u031c\1\0\3\u031c\2\u03d9\5\u031c\2\u03d9"+
+ "\1\0\6\u031c\1\0\1\u03d9\1\u031c\1\u03d9\3\u031c\2\u03d9"+
+ "\4\u031c\1\0\1\u03d9\1\0\3\u03d9\14\u031c\1\u03d9\2\u031c"+
+ "\3\u03d9\15\u031c\1\0\2\u031c\2\71\1\0\1\71\1\0"+
+ "\2\71\4\0\4\71\1\u023d\1\71\1\0\51\71\1\u023d"+
+ "\40\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\55\71\1\u0222\20\71\1\u0222\13\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\20\71\1\u0119\51\71\1\u0119"+
+ "\17\71\1\0\1\71\1\0\2\71\4\0\3\71\1\u032d"+
+ "\2\71\1\0\54\71\1\u032d\35\71\1\0\1\71\1\0"+
+ "\2\71\4\0\1\71\1\u023d\4\71\1\0\52\71\1\u023d"+
+ "\37\71\1\0\1\71\1\0\2\71\4\0\1\71\1\u0222"+
+ "\4\71\1\0\52\71\1\u0222\37\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\35\71\1\u03da\32\71\1\u03da"+
+ "\21\71\1\0\1\71\1\0\2\71\4\0\2\71\1\u03db"+
+ "\3\71\1\0\16\71\1\u03db\73\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u03dc\31\71\1\u03dc"+
+ "\1\u032a\32\71\1\u032a\21\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\50\71\1\u03dd\6\71\1\u03dd\32\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+ "\1\u0222\14\71\1\u0222\16\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\20\71\1\u03de\51\71\1\u03de\17\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\35\71"+
+ "\1\u03df\32\71\1\u03df\21\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\20\71\1\u0145\51\71\1\u0145\17\71"+
+ "\1\0\1\71\1\0\2\71\4\0\5\71\1\u03e0\1\0"+
+ "\17\71\1\u03e0\72\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\55\71\1\u03e1\20\71\1\u03e1\13\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\47\71\1\u0142"+
+ "\21\71\1\u0142\20\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\30\71\2\u03e2\60\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\15\71\1\u032a\56\71\1\u032a"+
+ "\15\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\35\71\1\u03e3\32\71\1\u03e3\21\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u03e4\31\71\1\u03e4"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\50\71\1\u03e5\6\71\1\u03e5\32\71\1\0\1\71\1\0"+
+ "\2\71\4\0\2\71\1\u0222\3\71\1\0\16\71\1\u0222"+
+ "\73\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\20\71\1\u03e6\51\71\1\u03e6\17\71\1\0\1\71\1\0"+
+ "\2\71\4\0\1\71\1\u0114\4\71\1\0\52\71\1\u0114"+
+ "\37\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\2\71\1\u023d\31\71\1\u023d\55\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\2\71\1\u03e7\31\71\1\u03e7"+
+ "\55\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\47\71\1\u0119\21\71\1\u0119\20\71\1\0\1\71\1\0"+
+ "\2\71\4\0\3\71\1\u03e8\2\71\1\0\54\71\1\u03e8"+
+ "\35\71\1\0\1\71\1\0\2\71\4\0\5\71\1\u03e9"+
+ "\1\0\1\71\1\u03ea\15\71\1\u03e9\16\71\1\u03ea\25\71"+
+ "\1\u03eb\10\71\1\u03eb\14\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\2\71\1\u0142\31\71\1\u0142\55\71"+
+ "\1\0\1\71\1\0\2\71\4\0\3\71\1\u03ec\2\71"+
+ "\1\0\54\71\1\u03ec\35\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\15\71\1\u03ed\56\71\1\u03ed\13\71"+
+ "\15\0\1\u03ee\22\0\1\u03ee\71\0\1\137\12\0\1\137"+
+ "\1\u03ef\4\137\1\0\2\137\1\u03ef\2\0\1\137\4\u03ef"+
+ "\1\137\1\0\5\137\2\u03ef\1\0\2\137\1\0\1\137"+
+ "\2\u03ef\2\0\2\u03ef\2\137\6\0\2\137\1\u03ef\1\137"+
+ "\1\u03ef\4\137\1\u03ef\5\137\3\0\1\u03ef\11\137\1\u03ef"+
+ "\2\137\1\0\3\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u03f0\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u03f1"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u03f2\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\12\150\1\u03f3\1\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u03f4\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\13\150\1\u0275\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\7\150\1\u0188\4\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u03f5\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u03f6\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u034c\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\2\150\1\u03f7\1\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u02e1\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u03f8\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+ "\1\u0361\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u03f9\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u03fa"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\u03fb\13\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\150\1\u03fc\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\u03fd\5\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0275"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u026e\1\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u03fe\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u035a\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u03ff\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u0400\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u0401\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u0188\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u0402\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0403"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u0404\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\2\150\1\u0354\12\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0405"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u018b\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\15\0\1\u0406\22\0\1\u0406"+
+ "\103\0\1\u0407\200\0\1\u029c\4\0\1\u036b\50\0\3\u0408"+
+ "\1\0\1\u0408\7\u036d\1\0\3\u036d\2\u0408\5\u036d\2\u0408"+
+ "\1\0\6\u036d\1\0\1\u0408\1\u036d\1\u0408\3\u036d\2\u0408"+
+ "\4\u036d\1\0\1\u0408\1\0\3\u0408\14\u036d\1\u0408\2\u036d"+
+ "\3\u0408\15\u036d\1\0\2\u036d\15\0\1\u0409\22\0\1\u0409"+
+ "\103\0\1\u040a\200\0\1\u02a2\4\0\1\u0370\50\0\3\u040b"+
+ "\1\0\1\u040b\7\u0372\1\0\3\u0372\2\u040b\5\u0372\2\u040b"+
+ "\1\0\6\u0372\1\0\1\u040b\1\u0372\1\u040b\3\u0372\2\u040b"+
+ "\4\u0372\1\0\1\u040b\1\0\3\u040b\14\u0372\1\u040b\2\u0372"+
+ "\3\u040b\15\u0372\1\0\2\u0372\37\0\1\u040c\163\0\1\u040d"+
+ "\116\0\1\u040e\12\0\1\u040f\131\0\1\u037b\140\0\1\u0410"+
+ "\107\0\1\u0411\1\0\1\u0412\141\0\1\u0413\137\0\1\u0414"+
+ "\127\0\1\u0415\126\0\1\u0416\100\0\1\u0417\150\0\1\u0418"+
+ "\130\0\1\u0419\131\0\1\u041a\131\0\1\u041b\134\0\1\u041c"+
+ "\111\0\1\u041d\1\u041e\163\0\1\u041f\127\0\1\u0420\127\0"+
+ "\1\u0421\121\0\1\u0422\51\0\10\u0389\1\0\25\u0389\1\u0423"+
+ "\75\u0389\1\0\5\u0389\2\u02bc\17\u0389\1\u02bc\1\u0389\1\u02bc"+
+ "\2\u0389\1\u02bc\1\u0424\5\u02bc\6\u0389\1\u02bc\50\u0389\1\u02bc"+
+ "\5\u0389\10\u01af\1\u02b9\3\u01af\1\u0425\7\u01af\1\u0425\3\u01af"+
+ "\4\u0425\2\u01af\1\u02ba\4\u01af\2\u0425\5\u01af\2\u0425\2\u01af"+
+ "\2\u0425\12\u01af\1\u0425\1\u01af\1\u0425\4\u01af\1\u0425\10\u01af"+
+ "\1\u0425\11\u01af\1\u0425\5\u01af\2\u02be\1\u02bf\6\u02be\1\u01b4"+
+ "\2\u02be\1\u0426\7\u02be\1\u0426\3\u02be\4\u0426\7\u02be\2\u0426"+
+ "\5\u02be\2\u0426\2\u02be\2\u0426\12\u02be\1\u0426\1\u02be\1\u0426"+
+ "\4\u02be\1\u0426\10\u02be\1\u0426\11\u02be\1\u0426\5\u02be\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\3\150\1\u0427\2\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\4\150\1\u0428\7\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u0429"+
+ "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u042a\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u0354\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u042b\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u042c\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u042d\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\1\u042e\5\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u042f\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u02d0\2\150\6\0\6\150\1\u0430\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0431"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u02e5\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\1\150\1\u0432\4\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\1\150\1\u0433\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0434"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u0435\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\5\150\1\u0436"+
+ "\6\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\10\150\1\u0437\3\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\1\150\1\u0438"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u0439\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u043a"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u043b\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\12\150\1\u0397"+
+ "\1\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\2\150\1\u043c\12\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u043d\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0354"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\1\150\1\u043e\4\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\3\150\1\u043f\10\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0440\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u0441\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u02e1\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\1\137\1\u0442\4\137\1\0\2\137\1\u0442\2\0\1\137"+
+ "\4\u0442\1\137\1\0\5\137\2\u0442\1\0\2\137\1\0"+
+ "\1\137\2\u0442\2\0\2\u0442\2\137\6\0\2\137\1\u0442"+
+ "\1\137\1\u0442\4\137\1\u0442\5\137\3\0\1\u0442\11\137"+
+ "\1\u0442\2\137\1\0\3\137\12\0\1\150\1\u0443\4\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\1\u0444\1\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\u0445\13\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\1\150\1\u0446\4\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0447"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u02cf\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\2\150\1\u0448\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+ "\1\u0390\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\4\150\1\u0449\1\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u044a\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u044b"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u044c\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u044d\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\3\150\1\u044e\10\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u044f\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u0450"+
+ "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0451\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u0452\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\12\0\1\u0453\200\0\1\u02fa\4\0"+
+ "\1\u03bd\50\0\3\u0454\1\0\1\u0454\7\u03bf\1\0\3\u03bf"+
+ "\2\u0454\5\u03bf\2\u0454\1\0\6\u03bf\1\0\1\u0454\1\u03bf"+
+ "\1\u0454\3\u03bf\2\u0454\4\u03bf\1\0\1\u0454\1\0\3\u0454"+
+ "\14\u03bf\1\u0454\2\u03bf\3\u0454\15\u03bf\1\0\2\u03bf\2\312"+
+ "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\54\312"+
+ "\1\u0455\35\312\1\0\1\312\1\0\2\312\4\0\6\312"+
+ "\1\0\15\312\1\u0456\72\312\22\0\1\u0457\62\0\1\u0457"+
+ "\132\0\1\u0458\60\0\1\u0459\133\0\1\u045a\153\0\1\u03cc"+
+ "\113\0\1\u045b\127\0\1\u045c\166\0\1\u045d\141\0\1\316"+
+ "\64\0\1\u045e\167\0\1\316\105\0\1\u045f\116\0\1\u0460"+
+ "\132\0\1\u03d1\146\0\1\u0461\160\0\1\u045e\120\0\1\u0462"+
+ "\133\0\1\u0463\124\0\1\u0464\53\0\4\374\1\u0465\1\374"+
+ "\1\0\3\374\2\0\5\374\3\0\6\374\4\0\3\374"+
+ "\2\0\4\374\6\0\3\374\1\u0465\10\374\1\0\2\374"+
+ "\3\0\15\374\1\0\2\374\13\0\6\374\1\0\2\374"+
+ "\1\u0466\2\0\5\374\3\0\6\374\4\0\3\374\2\0"+
+ "\1\u0466\3\374\6\0\14\374\1\0\2\374\3\0\15\374"+
+ "\1\0\2\374\12\0\1\u031c\117\0\2\71\1\0\1\71"+
+ "\1\0\2\71\4\0\1\116\5\71\1\0\37\71\1\116"+
+ "\52\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\47\71\1\u0467\21\71\1\u0467\20\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\20\71\1\u023d\51\71\1\u023d"+
+ "\17\71\1\0\1\71\1\0\2\71\4\0\6\71\1\0"+
+ "\2\71\1\u0468\31\71\1\u0468\55\71\1\0\1\71\1\0"+
+ "\2\71\4\0\5\71\1\u0469\1\0\17\71\1\u0469\72\71"+
+ "\1\0\1\71\1\0\2\71\4\0\2\71\1\u046a\3\71"+
+ "\1\0\16\71\1\u046a\73\71\1\0\1\71\1\0\2\71"+
+ "\4\0\1\u046b\5\71\1\0\37\71\1\u046b\52\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\77\71\1\u046c"+
+ "\6\71\1\u046c\3\71\1\0\1\71\1\0\2\71\4\0"+
+ "\6\71\1\0\47\71\1\u03dc\21\71\1\u03dc\20\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\56\71\1\u046d"+
+ "\14\71\1\u046d\16\71\1\0\1\71\1\0\2\71\4\0"+
+ "\1\u0337\5\71\1\0\37\71\1\u0337\52\71\1\0\1\71"+
+ "\1\0\2\71\4\0\6\71\1\0\1\u0244\62\71\1\u0244"+
+ "\26\71\1\0\1\71\1\0\2\71\4\0\1\u03da\5\71"+
+ "\1\0\37\71\1\u03da\52\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\1\71\1\u03da\34\71\1\u03da\53\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+ "\1\u046e\31\71\1\u046e\55\71\1\0\1\71\1\0\2\71"+
+ "\4\0\3\71\1\u012e\2\71\1\0\54\71\1\u012e\35\71"+
+ "\1\0\1\71\1\0\2\71\4\0\2\71\1\u046f\3\71"+
+ "\1\0\16\71\1\u046f\73\71\1\0\1\71\1\0\2\71"+
+ "\4\0\1\71\1\u0470\4\71\1\0\52\71\1\u0470\37\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+ "\1\u0222\31\71\1\u0222\53\71\16\0\1\u0471\57\0\1\u0471"+
+ "\33\0\1\137\12\0\1\137\1\u0472\4\137\1\0\2\137"+
+ "\1\u0472\2\0\1\137\4\u0472\1\137\1\0\5\137\2\u0472"+
+ "\1\0\2\137\1\0\1\137\2\u0472\2\0\2\u0472\2\137"+
+ "\6\0\2\137\1\u0472\1\137\1\u0472\4\137\1\u0472\5\137"+
+ "\3\0\1\u0472\11\137\1\u0472\2\137\1\0\3\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u0473\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u0474\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0475"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0188\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u0476\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0477"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+ "\1\u0478\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\2\150\1\u0268\11\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0479\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u0188\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u047a\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\1\150\1\u027d\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u0361\1\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\4\150\1\u047b\7\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\3\150\1\u047c\2\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\1\150\1\261"+
+ "\1\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\1\150"+
+ "\1\u0275\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u047d"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\2\150\1\u047e"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u047f\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u01cf\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\10\150\1\u0480\3\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\16\0\1\u0481\57\0\1\u0481\45\0"+
+ "\1\u036d\135\0\1\u0482\57\0\1\u0482\45\0\1\u0372\157\0"+
+ "\1\u0483\131\0\1\u0484\150\0\1\u0485\154\0\1\u0486\122\0"+
+ "\1\u0487\131\0\1\u0488\75\0\1\u0489\163\0\1\u048a\117\0"+
+ "\1\u048b\130\0\1\u037b\133\0\1\u048c\127\0\1\u048d\153\0"+
+ "\1\u037b\137\0\1\u048e\63\0\1\u048f\166\0\1\u037b\132\0"+
+ "\1\u0490\111\0\1\u0491\152\0\1\u0492\47\0\1\u0493\172\0"+
+ "\1\u0492\131\0\1\u0494\112\0\1\u0420\72\0\2\u0389\1\0"+
+ "\137\u0389\1\0\3\u0389\1\u0495\7\u0389\1\u0495\3\u0389\4\u0495"+
+ "\2\u0389\1\u0423\4\u0389\2\u0495\5\u0389\2\u0495\2\u0389\2\u0495"+
+ "\12\u0389\1\u0495\1\u0389\1\u0495\4\u0389\1\u0495\10\u0389\1\u0495"+
+ "\11\u0389\1\u0495\5\u0389\10\u01af\1\u02b9\3\u01af\1\u0496\7\u01af"+
+ "\1\u0496\3\u01af\4\u0496\2\u01af\1\u02ba\4\u01af\2\u0496\5\u01af"+
+ "\2\u0496\2\u01af\2\u0496\12\u01af\1\u0496\1\u01af\1\u0496\4\u01af"+
+ "\1\u0496\10\u01af\1\u0496\11\u01af\1\u0496\5\u01af\2\u02be\1\u02bf"+
+ "\6\u02be\1\u01b4\2\u02be\1\u0497\7\u02be\1\u0497\3\u02be\4\u0497"+
+ "\7\u02be\2\u0497\5\u02be\2\u0497\2\u02be\2\u0497\12\u02be\1\u0497"+
+ "\1\u02be\1\u0497\4\u02be\1\u0497\10\u02be\1\u0497\11\u02be\1\u0497"+
+ "\5\u02be\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\150\1\u0498\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u0499\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\5\150\1\u049a\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\1\150\1\u049b\13\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\6\150\1\u049c\5\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\10\150"+
+ "\1\u0354\3\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\1\150\1\u049d\4\150\1\0\1\150\1\u049e"+
+ "\1\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\1\150\1\u049f\1\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\2\150\1\u04a0\12\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u02e5\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\2\150\1\u04a1\12\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u04a2\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u04a3\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u0433\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\10\150\1\u04a4\3\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u04a5\1\150\1\u04a6\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u03a4\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u04a7\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\6\150\1\u04a8\5\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\1\150\1\u04a9\13\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\3\150\1\u04aa\10\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u04ab\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u04ac\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\150\1\u02e1\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\2\150\1\u04ad\11\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u04ae\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\150\1\u04af\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u04b0\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u04b1\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u04b2\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u04b3\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\1\137\1\u04b4\4\137\1\0\2\137\1\u04b4\2\0"+
+ "\1\137\4\u04b4\1\137\1\0\5\137\2\u04b4\1\0\2\137"+
+ "\1\0\1\137\2\u04b4\2\0\2\u04b4\2\137\6\0\2\137"+
+ "\1\u04b4\1\137\1\u04b4\4\137\1\u04b4\5\137\3\0\1\u04b4"+
+ "\11\137\1\u04b4\2\137\1\0\3\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\2\150\1\u04b5\1\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\1\u04b6\2\150\1\u04b7\2\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\10\150\1\u04b8\3\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u04b9"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u04ba\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\3\150\1\u04bb\11\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u04bc\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\1\150\1\u04bd\4\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u04be\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\1\u04bf\13\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\3\150\1\u04c0\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\3\150\1\u04c1"+
+ "\10\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\6\150\1\u04c2\5\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\12\150\1\u04c3\1\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\1\u04c4\1\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u04c5\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\12\0\1\u03bf\117\0\2\312\1\0\1\312"+
+ "\1\0\2\312\4\0\6\312\1\0\21\312\1\u03c1\70\312"+
+ "\1\0\1\312\1\0\2\312\4\0\6\312\1\0\50\312"+
+ "\1\u02ff\37\312\23\0\1\u04c6\34\0\1\u04c6\127\0\1\u0305"+
+ "\133\0\1\u04c7\10\0\1\u04c8\2\0\1\u04c9\116\0\1\316"+
+ "\130\0\1\u04ca\156\0\1\316\127\0\1\u04cb\63\0\1\u04cc"+
+ "\165\0\1\u04cd\121\0\1\u04ce\110\0\1\316\170\0\1\u04ca"+
+ "\73\0\1\u04ca\130\0\1\u04cf\104\0\5\374\1\u04d0\1\0"+
+ "\3\374\2\0\5\374\3\0\2\374\1\u04d0\3\374\4\0"+
+ "\3\374\2\0\4\374\6\0\14\374\1\0\2\374\3\0"+
+ "\15\374\1\0\2\374\2\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\15\71\1\u021f\56\71\1\u021f\15\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\27\71"+
+ "\1\116\23\71\1\116\36\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\2\71\1\u04d1\31\71\1\u04d1\55\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\2\71"+
+ "\1\u0248\31\71\1\u0248\55\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\47\71\1\u010e\21\71\1\u010e\20\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\15\71"+
+ "\1\u04d2\56\71\1\u04d2\15\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\2\71\1\u03da\31\71\1\u03da\55\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\56\71"+
+ "\1\u04d3\14\71\1\u04d3\16\71\1\0\1\71\1\0\2\71"+
+ "\4\0\3\71\1\u0145\2\71\1\0\54\71\1\u0145\35\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\47\71"+
+ "\1\u024c\21\71\1\u024c\16\71\17\0\1\u04d4\53\0\1\u04d4"+
+ "\36\0\1\137\12\0\1\137\1\150\4\137\1\0\2\137"+
+ "\1\150\2\0\1\137\4\150\1\137\1\0\5\137\2\150"+
+ "\1\0\2\137\1\0\1\137\2\150\2\0\2\150\2\137"+
+ "\6\0\2\137\1\150\1\137\1\150\4\137\1\150\5\137"+
+ "\3\0\1\150\11\137\1\150\2\137\1\0\3\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0478\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u04d5\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u034c\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u04d6\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\1\u0188\1\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\4\150\1\u0361\7\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u04d7\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u04d8\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0390\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\u0275\5\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u04d9\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\4\150\1\u0269"+
+ "\7\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u04da"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\17\0\1\u04db\53\0\1\u04db\55\0\1\u04dc\53\0"+
+ "\1\u04dc\100\0\1\u037b\165\0\1\u04dd\125\0\1\u04de\120\0"+
+ "\1\u037b\130\0\1\u0415\112\0\1\u041c\162\0\1\u0415\77\0"+
+ "\1\u037b\151\0\1\u04df\127\0\1\u04e0\147\0\1\u04e1\126\0"+
+ "\1\u04e2\102\0\1\u04dd\160\0\1\u0483\100\0\1\u04e3\71\0"+
+ "\62\u0492\1\u037b\47\u0492\71\0\1\u04e4\100\0\1\u04e5\71\0"+
+ "\10\u0389\1\0\3\u0389\1\u04e6\7\u0389\1\u04e6\3\u0389\4\u04e6"+
+ "\2\u0389\1\u0423\4\u0389\2\u04e6\5\u0389\2\u04e6\2\u0389\2\u04e6"+
+ "\12\u0389\1\u04e6\1\u0389\1\u04e6\4\u0389\1\u04e6\10\u0389\1\u04e6"+
+ "\11\u0389\1\u04e6\5\u0389\10\u01af\1\u02b9\3\u01af\1\243\7\u01af"+
+ "\1\243\3\u01af\4\243\2\u01af\1\u02ba\4\u01af\2\243\5\u01af"+
+ "\2\243\2\u01af\2\243\12\u01af\1\243\1\u01af\1\243\4\u01af"+
+ "\1\243\10\u01af\1\243\11\u01af\1\243\5\u01af\2\u02be\1\u02bf"+
+ "\6\u02be\1\u01b4\2\u02be\1\u01b2\7\u02be\1\u01b2\3\u02be\4\u01b2"+
+ "\7\u02be\2\u01b2\5\u02be\2\u01b2\2\u02be\2\u01b2\12\u02be\1\u01b2"+
+ "\1\u02be\1\u01b2\4\u02be\1\u01b2\10\u02be\1\u01b2\11\u02be\1\u01b2"+
+ "\5\u02be\1\137\12\0\3\150\1\u04b7\2\150\1\0\3\150"+
+ "\2\0\3\150\1\u04e7\2\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\3\150\1\301\11\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u04e8\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\13\150\1\u04e9"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u04ea\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u04eb\2\150\6\0\6\150\1\u04ec\5\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u04ed\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u04ee\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\1\150\1\u04ef"+
+ "\12\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u04f0\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\1\u04f1\1\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u04f2\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u04f3"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u04f4\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\150\1\u04f5\2\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u04f6\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u04f7\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\1\u04f8\5\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u04f9"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\2\150\1\u04fa\1\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\3\150\1\u04fb\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\1\150\1\u04fc\1\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\1\0"+
+ "\1\u04fd\4\150\6\0\11\150\1\u04fe\2\150\1\137\2\150"+
+ "\3\0\5\150\1\u04ff\7\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0500\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u04c4\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u0501\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u0502\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u0354\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\2\150\1\u0503\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\1\137\1\u0504\4\137\1\0\2\137\1\u0504\2\0\1\137"+
+ "\4\u0504\1\137\1\0\5\137\2\u0504\1\0\2\137\1\0"+
+ "\1\137\2\u0504\2\0\2\u0504\2\137\6\0\2\137\1\u0504"+
+ "\1\137\1\u0504\4\137\1\u0504\5\137\3\0\1\u0504\11\137"+
+ "\1\u0504\2\137\1\0\3\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0505\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u0506\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u0507\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u0508\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u0509\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u050a\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u050b\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u050c\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\1\150"+
+ "\1\u050d\1\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\13\150\1\u050e"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\1\150\1\u050f\1\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\3\150\1\u0510"+
+ "\11\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0511\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u0512\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u0513\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u04c4\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\2\150\1\u0514\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+ "\1\u0515\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\24\0\1\u0516\31\0\1\u0516\132\0\1\u03c7"+
+ "\125\0\1\u0517\146\0\1\u0518\117\0\1\u0519\131\0\1\316"+
+ "\144\0\1\u04c8\2\0\1\u04c9\75\0\1\u04cb\132\0\1\u051a"+
+ "\131\0\1\u051b\70\0\2\71\1\0\1\71\1\0\2\71"+
+ "\4\0\6\71\1\0\27\71\1\u023d\23\71\1\u023d\36\71"+
+ "\1\0\1\71\1\0\2\71\4\0\6\71\1\0\47\71"+
+ "\1\u0110\21\71\1\u0110\20\71\1\0\1\71\1\0\2\71"+
+ "\4\0\4\71\1\u051c\1\71\1\0\51\71\1\u051c\36\71"+
+ "\20\0\1\u051d\20\0\1\u051d\70\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0361"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u0188\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u051e\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u0297\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u0275\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u051f\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\20\0\1\u0520"+
+ "\20\0\1\u0520\110\0\1\u0521\20\0\1\u0521\147\0\1\u0522"+
+ "\133\0\1\u0523\122\0\1\u0524\26\0\1\u0525\71\0\1\u0415"+
+ "\147\0\1\u0526\112\0\1\u0527\150\0\1\u0528\143\0\1\u0529"+
+ "\136\0\1\u052a\33\0\10\u0389\1\0\3\u0389\1\u052b\7\u0389"+
+ "\1\u052b\3\u0389\4\u052b\2\u0389\1\u0423\4\u0389\2\u052b\5\u0389"+
+ "\2\u052b\2\u0389\2\u052b\12\u0389\1\u052b\1\u0389\1\u052b\4\u0389"+
+ "\1\u052b\10\u0389\1\u052b\11\u0389\1\u052b\5\u0389\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u052c"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u052d\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u052e\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\1\u052f\1\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u0530\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u0531\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u0532\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u0533\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u0534\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0535"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\u0536\5\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u0537\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\4\150\1\u0538"+
+ "\1\150\1\0\2\150\1\u0539\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u053a\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u04c4\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u053b\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u053c\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u053d\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u053e\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\1\u053f\4\150\1\u0540\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\1\u0541\2\150\1\u0542\11\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\3\150\1\u0543"+
+ "\2\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0544\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\13\0\1\u0545"+
+ "\102\0\1\u0546\13\0\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\301\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0547"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\4\150\1\u0548\1\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u0549\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u054a\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\3\150\1\u0188\10\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\1\137\1\u01d8\4\137"+
+ "\1\0\2\137\1\u01d8\2\0\1\137\4\u01d8\1\137\1\0"+
+ "\5\137\2\u01d8\1\0\2\137\1\0\1\137\2\u01d8\2\0"+
+ "\2\u01d8\2\137\6\0\2\137\1\u01d8\1\137\1\u01d8\4\137"+
+ "\1\u01d8\5\137\3\0\1\u01d8\11\137\1\u01d8\2\137\1\0"+
+ "\3\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u054b\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\150\1\u054c\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+ "\1\u02d4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u054d\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u054e\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u04c3\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\10\150\1\u054f\3\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0550\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u0551\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u0552\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0553"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0554"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\11\150\1\u0555\2\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0556\4\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\2\150\1\u0557\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u01ca\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\3\150\1\u0558\11\150\1\0\2\150\21\0"+
+ "\1\u0559\145\0\1\u055a\172\0\1\u055b\125\0\1\316\74\0"+
+ "\1\u055c\153\0\1\u055d\52\0\2\71\1\0\1\71\1\0"+
+ "\2\71\4\0\6\71\1\0\1\71\1\u055e\34\71\1\u055e"+
+ "\51\71\21\0\1\u055f\110\0\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0560"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u0268\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\21\0\1\u0561\131\0\1\u0562\170\0\1\u037b"+
+ "\130\0\1\u0563\150\0\1\u0564\112\0\1\u0565\113\0\1\u0566"+
+ "\175\0\1\u037b\104\0\1\u0492\112\0\1\u0492\131\0\1\u0567"+
+ "\70\0\10\u0389\1\0\3\u0389\1\u02bc\7\u0389\1\u02bc\3\u0389"+
+ "\4\u02bc\2\u0389\1\u0423\4\u0389\2\u02bc\5\u0389\2\u02bc\2\u0389"+
+ "\2\u02bc\12\u0389\1\u02bc\1\u0389\1\u02bc\4\u0389\1\u02bc\10\u0389"+
+ "\1\u02bc\11\u0389\1\u02bc\5\u0389\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\2\150\1\u0568\2\0\4\150\6\0\6\150"+
+ "\1\u0569\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u056a\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u056b\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\2\150\1\u0539\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\3\150\1\u056c\11\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\2\150\1\u056d\3\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+ "\1\u056e\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\2\150\1\u0433\11\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\10\150\1\u056f\3\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\1\150\1\u0570\1\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\1\u0571\5\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u0572\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0573"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u0574\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\5\150\1\u0575\6\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0576"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u0577\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\4\150\1\u0578\1\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\1\150\1\u0579\13\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\6\150\1\u057a\5\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u057b\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\u057c\13\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u057d\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\4\150\1\u057e\7\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\1\150\1\u057f\12\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u0580\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\4\150\1\u0175\7\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\41\0\1\u0581"+
+ "\132\0\1\u0582\67\0\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0583\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+ "\1\u0584\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u0585\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0586\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0397"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u0587\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0588"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\3\150\1\u0589\11\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\150\1\u058a\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u058b"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u058c\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\1\u058d\14\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u058e\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u058f\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u0590\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0591\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\6\150\1\u0592\5\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u0593\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\41\0\1\u0594\150\0"+
+ "\1\u0519\131\0\1\u0595\113\0\1\u0596\67\0\2\71\1\0"+
+ "\1\71\1\0\2\71\4\0\6\71\1\0\35\71\1\u0110"+
+ "\32\71\1\u0110\17\71\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\14\150\1\u04d8\1\0\2\150\53\0\1\u0597\134\0"+
+ "\1\u0598\114\0\1\u0599\146\0\1\u059a\154\0\1\u059b\30\0"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\2\150\1\u0433"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\2\150\1\u0532\1\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u059c\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\2\150\1\u059d\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u059e\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\2\150\1\u0539\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u059f"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u05a0\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u05a1\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05a2"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u05a3\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\1\0\1\u05a4\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u05a5"+
+ "\4\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u05a6\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u05a7\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u05a8"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u05a9\1\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\2\150\1\u05aa\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\4\150\1\u05ab"+
+ "\1\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\150\1\u05ac\2\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u05ad\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\1\150\1\u05ae\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\4\150\1\u05af\7\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\3\150\1\u05b0\2\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u05b1\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\57\0\1\u05b2\146\0\1\u05b3\35\0\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05b4"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u05b5\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u05b6\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\3\150"+
+ "\1\u05b7\2\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u056d\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\4\150\1\u056d\7\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u05b8\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u0451\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u05b9\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\10\150\1\u05ba"+
+ "\3\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u05bb\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\2\150\1\u05bc\1\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u05bd"+
+ "\13\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\2\150\1\u05be\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u05bf\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u05c0\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\4\150"+
+ "\1\u05c1\7\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\105\0\1\u05c2\102\0\1\u05c3\17\0\1\u05c4\74\0\1\u05c5"+
+ "\146\0\1\u05c6\133\0\1\u059a\130\0\1\u037b\144\0\1\u037b"+
+ "\130\0\1\u05c7\40\0\1\137\12\0\6\150\1\0\2\150"+
+ "\1\u05c8\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\2\150\1\u05c9\1\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u05ca\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\2\150\1\u05cb\1\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150"+
+ "\1\u04c4\3\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\u05cc\5\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\3\150\1\u05cd\10\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\4\150\1\u02e1\7\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\13\0\1\u05ce\102\0\1\u05cf\13\0\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\10\150\1\u05d0\3\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u05d1\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\2\150\1\u056d\11\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u05d2\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\u05d3\3\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\3\150\1\u05d4\2\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\2\150\1\u05d5"+
+ "\1\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\2\150\1\u0587\3\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\u05d6\3\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u05d7"+
+ "\5\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u05d8\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\6\150\1\u05d9\5\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\2\150\1\u05da\1\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\41\0\1\u05db\147\0\1\u05dc\52\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\3\150"+
+ "\1\u0354\10\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u05dd\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u05de\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u05df"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\2\150\1\u05e0\3\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\150\1\u056d\4\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u0530"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u05e1\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u05e2"+
+ "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u05bc\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\1\150\1\u05e3\1\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+ "\1\u05e4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\2\150\1\u05e5\11\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\u05e6\13\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\73\0\1\u04cb\77\0"+
+ "\1\u03d0\132\0\1\u04cb\130\0\1\u0527\164\0\1\u0492\35\0"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u05e7\1\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u05e8\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\150\1\u05e9"+
+ "\2\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\1\150\1\u05ea\2\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u05a7\2\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\3\150\1\u05eb\10\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\37\0\1\u05ec\134\0\1\u05ed\67\0\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\6\150\1\u05ee\5\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\3\150\1\u05ef\10\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u05f0\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\5\150\1\u05f1\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\150\1\u05f2\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u05f3\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u05f4\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\10\150\1\u05dd\3\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u05f5\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u05f6\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\2\150\1\u05f7\11\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\56\0\1\u05f8\112\0"+
+ "\1\u05f9\72\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u05fa\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u03a2\3\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\3\150\1\u05fb\2\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\u05fc\13\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u05fd\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\2\150\1\u05fe\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u05ff\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\1\150\1\u0600"+
+ "\4\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\1\150\1\u0601\13\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\1\150\1\u0602\1\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0603"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\u0604"+
+ "\3\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\12\150\1\u04c4\1\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\1\150\1\u0433\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+ "\1\u0605\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\150\1\u0606\12\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\43\0\1\u0607\164\0\1\u0608"+
+ "\33\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\3\150\1\u0609\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\2\150\1\u060a\3\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u05e2\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\1\u060b\13\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\1\u060c\5\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\1\150"+
+ "\1\u060d\4\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\2\150\1\u060e\11\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\3\150\1\u05e2\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\150"+
+ "\1\u060f\12\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u0610\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\106\0\1\u0611\23\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150\1\u0530"+
+ "\2\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u0612\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\1\150\1\u0613\12\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\1\u0614\1\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\1\150\1\u01ca\4\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\5\150\1\u0575\6\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\1\u0615\5\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\2\150"+
+ "\1\u0616\1\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\3\150\1\u0617\10\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u0618\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\3\150\1\u04af\2\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\10\150\1\u0619\3\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\6\150\1\u061a\5\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u053a\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\61\0\1\u061b\144\0\1\u061c"+
+ "\35\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\3\150\1\u060a\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\6\150\1\u061d\5\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\1\150"+
+ "\1\u061e\4\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\3\150\1\u061f\2\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\2\150\1\u0620\1\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\1\u053f\5\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u060e\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\1\150\1\u0621\4\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\4\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\70\0"+
+ "\1\u0622\41\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\6\150\1\u0623\5\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+ "\1\u04c4\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\1\u0624\5\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u0613\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\150\1\u0625\2\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\1\u0626\3\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\3\150\1\u0627\2\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\1\u047c\3\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u0451\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\56\0\1\u0628\144\0\1\u0629\40\0\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\1\150\1\u04b2\12\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\u062a\3\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\2\150\1\u062b"+
+ "\11\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u062c\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\1\0\1\u062d\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\41\0\1\u062e\70\0\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\2\150\1\u062f\3\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137";
+
+ private static final String ZZ_TRANS_PACKED_1 =
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0630"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u0631\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u0632\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\7\150\1\u04c4"+
+ "\4\150\1\137\2\150\3\0\15\150\1\0\2\150\41\0"+
+ "\1\u05f8\162\0\1\u0633\37\0\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\1\150\1\u0634\2\150\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\3\150"+
+ "\1\u056d\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\3\150\1\u0635\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\15\0\1\u0636\140\0\1\u0637\105\0"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\6\150\1\u0638\5\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\14\150\1\u0587\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\3\150\1\u0639\6\0"+
+ "\14\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u063a\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\56\0\1\u063b\53\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\2\150"+
+ "\1\u063c\11\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\3\150\1\u063d\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\56\0\1\u063e\150\0\1\u063f\34\0\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\1\150"+
+ "\1\u0640\2\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\10\150\1\u0641\4\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\2\150\1\u0642"+
+ "\3\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\13\0\1\u0643\16\0\1\u0644\77\0\1\137\12\0\6\150"+
+ "\1\0\1\150\1\u04fc\1\150\2\0\6\150\1\0\1\u0155"+
+ "\6\150\1\0\1\137\1\150\1\0\3\150\2\0\4\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\1\137\12\0\1\150\1\u0645\4\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\72\0\1\u0646\133\0\1\u0647\35\0"+
+ "\1\137\12\0\6\150\1\0\3\150\2\0\6\150\1\0"+
+ "\1\u0155\6\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\2\150\1\u0648\1\150\6\0\14\150\1\137\2\150\3\0"+
+ "\15\150\1\0\2\150\1\137\12\0\6\150\1\0\3\150"+
+ "\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\1\u0649\3\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\6\150"+
+ "\1\u064a\5\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\74\0\1\u064b\115\0\1\u064c\51\0\1\137\12\0\6\150"+
+ "\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0"+
+ "\1\137\1\150\1\0\3\150\2\0\4\150\6\0\1\u064d"+
+ "\13\150\1\137\2\150\3\0\15\150\1\0\2\150\76\0"+
+ "\1\u064e\111\0\1\u064f\53\0\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\4\150\6\0\6\150\1\u0650"+
+ "\5\150\1\137\2\150\3\0\15\150\1\0\2\150\1\137"+
+ "\12\0\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155"+
+ "\1\150\1\u0651\4\150\1\0\1\137\1\150\1\0\3\150"+
+ "\2\0\4\150\6\0\14\150\1\137\2\150\3\0\15\150"+
+ "\1\0\2\150\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\1\150\1\u0652\12\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\40\0\1\u0653\162\0"+
+ "\1\u0654\40\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\1\150\1\u0655\2\150\6\0\14\150\1\137"+
+ "\2\150\3\0\15\150\1\0\2\150\40\0\1\u0656\164\0"+
+ "\1\u0657\36\0\1\137\12\0\6\150\1\0\3\150\2\0"+
+ "\6\150\1\0\1\u0155\6\150\1\0\1\137\1\150\1\0"+
+ "\3\150\2\0\4\150\6\0\14\150\1\137\2\150\3\0"+
+ "\14\150\1\u0658\1\0\2\150\1\137\12\0\6\150\1\0"+
+ "\3\150\2\0\6\150\1\0\1\u0155\6\150\1\0\1\137"+
+ "\1\150\1\0\3\150\2\0\3\150\1\u04ba\6\0\14\150"+
+ "\1\137\2\150\3\0\15\150\1\0\2\150\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u056d\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\76\0\1\u0659\127\0\1\u065a\35\0\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\3\150"+
+ "\1\u043d\2\150\1\0\1\137\1\150\1\0\3\150\2\0"+
+ "\4\150\6\0\14\150\1\137\2\150\3\0\15\150\1\0"+
+ "\2\150\56\0\1\u065b\114\0\1\u065c\70\0\1\137\12\0"+
+ "\6\150\1\0\3\150\2\0\6\150\1\0\1\u0155\6\150"+
+ "\1\0\1\137\1\150\1\0\3\150\2\0\1\u065d\3\150"+
+ "\6\0\14\150\1\137\2\150\3\0\15\150\1\0\2\150"+
+ "\73\0\1\u0628\135\0\1\u05f8\126\0\1\u065e\133\0\1\u065f"+
+ "\33\0\1\137\12\0\6\150\1\0\3\150\2\0\6\150"+
+ "\1\0\1\u0155\1\150\1\u04c4\4\150\1\0\1\137\1\150"+
+ "\1\0\3\150\2\0\4\150\6\0\14\150\1\137\2\150"+
+ "\3\0\15\150\1\0\2\150\41\0\1\u0660\161\0\1\u0661"+
+ "\115\0\1\u0662\116\0\1\u0663\107\0\1\u0664\234\0\1\u0665"+
+ "\113\0\1\u0666\103\0\1\u0667\145\0\1\u05db\100\0\1\u0668"+
+ "\161\0\1\u0669\117\0\1\u066a\127\0\1\u066b\113\0\1\u05f8"+
+ "\71\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[136440];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+ "\6\0\2\1\1\0\2\1\1\0\2\1\14\0\1\1"+
+ "\3\0\2\1\1\11\4\1\1\11\5\1\1\11\2\1"+
+ "\2\11\2\1\4\11\1\1\1\11\1\1\1\11\26\1"+
+ "\1\11\2\1\2\11\1\1\5\11\1\1\1\11\2\1"+
+ "\1\11\2\1\1\11\1\1\2\11\14\1\1\11\7\1"+
+ "\1\11\11\1\2\11\2\1\2\11\2\1\1\11\6\1"+
+ "\1\11\1\1\1\11\2\1\1\11\7\1\1\11\43\1"+
+ "\1\11\10\1\2\11\4\1\2\11\1\1\2\11\5\1"+
+ "\3\11\4\1\4\11\1\1\1\11\6\1\4\11\1\1"+
+ "\3\11\6\1\2\11\5\0\1\11\105\1\1\11\2\0"+
+ "\1\1\1\0\1\1\1\11\1\0\74\1\1\11\2\1"+
+ "\1\0\1\11\10\0\2\11\20\0\1\1\1\11\2\1"+
+ "\1\0\1\11\30\1\1\11\32\1\1\11\4\0\1\11"+
+ "\3\1\1\0\1\11\1\1\15\0\1\1\1\0\1\11"+
+ "\5\0\1\1\2\11\3\1\1\11\1\0\1\11\1\0"+
+ "\1\11\4\0\101\1\1\11\1\0\1\1\1\0\3\1"+
+ "\1\0\70\1\40\0\1\11\1\1\1\0\3\1\1\0"+
+ "\72\1\4\0\3\1\25\0\2\1\2\11\2\0\44\1"+
+ "\1\0\1\11\46\1\1\0\1\11\3\0\1\1\1\0"+
+ "\1\11\2\0\1\1\10\0\1\11\15\0\64\1\2\0"+
+ "\4\1\23\0\2\1\2\0\24\1\1\0\27\1\35\0"+
+ "\60\1\2\0\2\1\16\0\14\1\1\0\17\1\24\0"+
+ "\61\1\12\0\4\1\1\0\6\1\4\0\1\1\6\0"+
+ "\27\1\1\0\30\1\6\0\1\1\1\0\2\1\13\0"+
+ "\32\1\2\0\22\1\1\11\4\0\1\1\1\11\1\1"+
+ "\2\11\5\0\31\1\2\0\21\1\10\0\10\1\1\0"+
+ "\15\1\2\0\16\1\3\0\1\11\2\0\6\1\2\0"+
+ "\13\1\2\0\17\1\2\0\12\1\1\11\1\0\15\1"+
+ "\2\0\10\1\1\0\11\1\2\0\5\1\1\0\5\1"+
+ "\2\0\3\1\2\0\4\1\1\0\2\1\2\0\3\1"+
+ "\1\0\2\1\2\0\3\1\2\0\1\1\2\0\3\1"+
+ "\2\0\1\1\2\0\3\1\2\0\1\1\2\0\1\1"+
+ "\4\0\1\1\2\0\1\1\13\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[1643];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to JSPTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ private static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to JSPTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ private static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specifying that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ private static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in a JSP hidden comment ("<%-- ... --%>").
+ */
+ private static final int INTERNAL_IN_HIDDEN_COMMENT = -10;
+
+ /**
+ * Token type specifying we're in a JSP directive (either include, page
+ * or taglib).
+ */
+ private static final int INTERNAL_IN_JSP_DIRECTIVE = -11;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ private static final int INTERNAL_IN_JS = -12;
+
+ /**
+ * Token type specifying we're in a JavaScript multi-line comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -15;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -16;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -17;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ private static final int INTERNAL_CSS = -18;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ private static final int INTERNAL_CSS_PROPERTY = -19;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ private static final int INTERNAL_CSS_VALUE = -20;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * Token type specifying we're in a Java documentation comment.
+ */
+ private static final int INTERNAL_IN_JAVA_DOCCOMMENT = -(4<<11);
+
+ /**
+ * Token type specifying we're in Java code.
+ */
+ private static final int INTERNAL_IN_JAVA_EXPRESSION = -(5<<11);
+
+ /**
+ * Token type specifying we're in Java multiline comment.
+ */
+ private static final int INTERNAL_IN_JAVA_MLC = -(6<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * The state JSP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+ */
+ private int jspInState;
+
+ /**
+ * Whether closing markup tags are automatically completed for JSP.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JSPTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ jspInState = YYINITIAL; // Shouldn't be necessary
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = 0;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.PREPROCESSOR:
+ state = PI;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_HIDDEN_COMMENT:
+ state = HIDDEN_COMMENT;
+ break;
+ case INTERNAL_IN_JSP_DIRECTIVE:
+ state = JSP_DIRECTIVE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) {
+ // INTERNAL_IN_JAVAxxx - jspInState or
+ // INTERNAL_IN_CSSxxx - cssPrevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_JAVA_DOCCOMMENT:
+ state = JAVA_DOCCOMMENT;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_JAVA_EXPRESSION:
+ state = JAVA_EXPRESSION;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_JAVA_MLC:
+ state = JAVA_MLC;
+ jspInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ }
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public JSPTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public JSPTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 196) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 65:
+ { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+ }
+ case 130: break;
+ case 86:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 131: break;
+ case 74:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 132: break;
+ case 23:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+ }
+ case 133: break;
+ case 10:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+ }
+ case 134: break;
+ case 61:
+ { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+ }
+ case 135: break;
+ case 111:
+ { start = zzMarkedPos-4; yybegin(HIDDEN_COMMENT);
+ }
+ case 136: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 137: break;
+ case 124:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 138: break;
+ case 104:
+ { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+ }
+ case 139: break;
+ case 101:
+ { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+ }
+ case 140: break;
+ case 41:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ case 141: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 142: break;
+ case 125:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ case 143: break;
+ case 103:
+ { addToken(Token.REGEX);
+ }
+ case 144: break;
+ case 42:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 145: break;
+ case 129:
+ { int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 146: break;
+ case 117:
+ { addToken(Token.FUNCTION);
+ }
+ case 147: break;
+ case 93:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+ }
+ case 148: break;
+ case 8:
+ { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 149: break;
+ case 36:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 150: break;
+ case 57:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+ }
+ case 151: break;
+ case 52:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 152: break;
+ case 20:
+ { /* Allowing JSP expressions, etc. */
+ }
+ case 153: break;
+ case 26:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+ }
+ case 154: break;
+ case 119:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.MARKUP_COMMENT);
+ }
+ case 155: break;
+ case 89:
+ { /* Skip all escaped chars. */
+ }
+ case 156: break;
+ case 83:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+ }
+ case 157: break;
+ case 29:
+ { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 158: break;
+ case 116:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 159: break;
+ case 109:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 160: break;
+ case 66:
+ { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 161: break;
+ case 17:
+ { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+ }
+ case 162: break;
+ case 28:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+ }
+ case 163: break;
+ case 75:
+ { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+ }
+ case 164: break;
+ case 27:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+ }
+ case 165: break;
+ case 54:
+ { addToken(Token.IDENTIFIER); /* Needed as InTagIdentifier ignores it. */
+ }
+ case 166: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 167: break;
+ case 91:
+ { /* Invalid latin-1 character \xXX */ validJSString = false;
+ }
+ case 168: break;
+ case 25:
+ { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 169: break;
+ case 37:
+ { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 170: break;
+ case 114:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 171: break;
+ case 47:
+ { addToken(Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+ }
+ case 172: break;
+ case 110:
+ { start = zzMarkedPos-3; yybegin(JAVA_DOCCOMMENT);
+ }
+ case 173: break;
+ case 80:
+ { start = zzMarkedPos-2; yybegin(PI);
+ }
+ case 174: break;
+ case 126:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 175: break;
+ case 62:
+ { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 176: break;
+ case 9:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 177: break;
+ case 77:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 178: break;
+ case 73:
+ { /* Skip escaped chars. */
+ }
+ case 179: break;
+ case 90:
+ { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+ }
+ case 180: break;
+ case 123:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ case 181: break;
+ case 94:
+ { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+ }
+ case 182: break;
+ case 81:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 183: break;
+ case 92:
+ { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 184: break;
+ case 78:
+ { addToken(Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+ }
+ case 185: break;
+ case 31:
+ { addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 186: break;
+ case 39:
+ { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 187: break;
+ case 44:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+ }
+ case 188: break;
+ case 12:
+ { addToken(Token.OPERATOR);
+ }
+ case 189: break;
+ case 68:
+ { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+ }
+ case 190: break;
+ case 48:
+ { addToken(Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+ }
+ case 191: break;
+ case 112:
+ { start = zzMarkedPos-4; yybegin(COMMENT);
+ }
+ case 192: break;
+ case 107:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+ }
+ case 193: break;
+ case 102:
+ { addToken(Token.VARIABLE);
+ }
+ case 194: break;
+ case 55:
+ { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 195: break;
+ case 97:
+ { start = zzMarkedPos-2; yybegin(JAVA_MLC);
+ }
+ case 196: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 197: break;
+ case 122:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 198: break;
+ case 24:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+ }
+ case 199: break;
+ case 96:
+ { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+ }
+ case 200: break;
+ case 118:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 201: break;
+ case 64:
+ { addToken(Token.SEPARATOR); yybegin(CSS);
+ }
+ case 202: break;
+ case 128:
+ { yybegin(YYINITIAL);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 203: break;
+ case 32:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+ }
+ case 204: break;
+ case 45:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+ }
+ case 205: break;
+ case 72:
+ { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+ }
+ case 206: break;
+ case 63:
+ { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 207: break;
+ case 51:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 208: break;
+ case 40:
+ { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 209: break;
+ case 106:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JSP_DIRECTIVE);
+ }
+ case 210: break;
+ case 33:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+ }
+ case 211: break;
+ case 120:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+ }
+ case 212: break;
+ case 85:
+ { start = zzMarkedPos-2; yybegin(JS_MLC);
+ }
+ case 213: break;
+ case 88:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 214: break;
+ case 70:
+ { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ case 215: break;
+ case 99:
+ { yybegin(JAVA_EXPRESSION); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 216: break;
+ case 50:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+ }
+ case 217: break;
+ case 49:
+ { addToken(Token.ANNOTATION);
+ }
+ case 218: break;
+ case 30:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 219: break;
+ case 67:
+ { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 220: break;
+ case 113:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+ }
+ case 221: break;
+ case 6:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 222: break;
+ case 115:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 223: break;
+ case 18:
+ { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+ }
+ case 224: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 225: break;
+ case 56:
+ { addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 226: break;
+ case 127:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 227: break;
+ case 58:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+ }
+ case 228: break;
+ case 53:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 229: break;
+ case 98:
+ { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(jspInState);
+ }
+ case 230: break;
+ case 13:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+ }
+ case 231: break;
+ case 100:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 232: break;
+ case 16:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 233: break;
+ case 59:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 234: break;
+ case 46:
+ { addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+ }
+ case 235: break;
+ case 35:
+ { addToken(Token.SEPARATOR);
+ }
+ case 236: break;
+ case 105:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 237: break;
+ case 71:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 238: break;
+ case 69:
+ { /* End of a function */ addToken(Token.SEPARATOR);
+ }
+ case 239: break;
+ case 19:
+ { addToken(Token.MARKUP_TAG_NAME);
+ }
+ case 240: break;
+ case 11:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 241: break;
+ case 121:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+ }
+ case 242: break;
+ case 84:
+ { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+ }
+ case 243: break;
+ case 38:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ case 244: break;
+ case 87:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 245: break;
+ case 14:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+ }
+ case 246: break;
+ case 108:
+ { boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 247: break;
+ case 95:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 248: break;
+ case 76:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 249: break;
+ case 15:
+ { addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 250: break;
+ case 34:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 251: break;
+ case 79:
+ { start = zzMarkedPos-2; yybegin(DTD);
+ }
+ case 252: break;
+ case 82:
+ { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER); jspInState = zzLexicalState; yybegin(JAVA_EXPRESSION);
+ }
+ case 253: break;
+ case 21:
+ { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+ }
+ case 254: break;
+ case 22:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+ }
+ case 255: break;
+ case 43:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 256: break;
+ case 60:
+ { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+ }
+ case 257: break;
+ case 1:
+ {
+ }
+ case 258: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case INATTR_SINGLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 1644: break;
+ case JS_CHAR: {
+ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 1645: break;
+ case JAVA_EXPRESSION: {
+ addEndToken(INTERNAL_IN_JAVA_EXPRESSION - jspInState); return firstToken;
+ }
+ case 1646: break;
+ case CSS_STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 1647: break;
+ case HIDDEN_COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_HIDDEN_COMMENT); return firstToken;
+ }
+ case 1648: break;
+ case JS_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 1649: break;
+ case CSS_CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 1650: break;
+ case JAVA_DOCCOMMENT: {
+ yybegin(JAVA_EXPRESSION); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JAVA_DOCCOMMENT - jspInState); return firstToken;
+ }
+ case 1651: break;
+ case INTAG_SCRIPT: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+ }
+ case 1652: break;
+ case CSS_PROPERTY: {
+ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 1653: break;
+ case CSS_C_STYLE_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 1654: break;
+ case CSS: {
+ addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 1655: break;
+ case CSS_VALUE: {
+ addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 1656: break;
+ case JSP_DIRECTIVE: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_IN_JSP_DIRECTIVE); return firstToken;
+ }
+ case 1657: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 1658: break;
+ case INATTR_DOUBLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 1659: break;
+ case PI: {
+ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 1660: break;
+ case JAVASCRIPT: {
+ addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 1661: break;
+ case INTAG: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 1662: break;
+ case INTAG_CHECK_TAG_NAME: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 1663: break;
+ case INATTR_SINGLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+ }
+ case 1664: break;
+ case DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 1665: break;
+ case JS_EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 1666: break;
+ case INATTR_DOUBLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+ }
+ case 1667: break;
+ case INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+ }
+ case 1668: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 1669: break;
+ case INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+ }
+ case 1670: break;
+ case JS_STRING: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 1671: break;
+ case JAVA_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JAVA_MLC - jspInState); return firstToken;
+ }
+ case 1672: break;
+ case INTAG_STYLE: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+ }
+ case 1673: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex
new file mode 100644
index 0000000..140fffb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex
@@ -0,0 +1,888 @@
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files. Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker. This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class JavaScriptTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -8;
+
+ /**
+ * Token type specifying we're in a JavaScript documentation comment.
+ */
+ private static final int INTERNAL_IN_JS_COMMENT_DOCUMENTATION = -9;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -10;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -13;
+
+ private static final int INTERNAL_E4X = -14;
+
+ private static final int INTERNAL_E4X_INTAG = -15;
+
+ private static final int INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION = -16;
+
+ private static final int INTERNAL_IN_E4X_COMMENT = -17;
+
+ private static final int INTERNAL_E4X_DTD = -18;
+
+ private static final int INTERNAL_E4X_DTD_INTERNAL = -19;
+
+ private static final int INTERNAL_E4X_ATTR_SINGLE = -20;
+
+ private static final int INTERNAL_E4X_ATTR_DOUBLE = -21;
+
+ private static final int INTERNAL_E4X_MARKUP_CDATA = -22;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Whether we're in an internal DTD. Only valid if in an e4x DTD.
+ */
+ private boolean e4x_inInternalDtd;
+
+ /**
+ * The previous e4x state. Only valid if in an e4x state.
+ */
+ private int e4x_prevState;
+
+ /**
+ * The version of JavaScript being highlighted.
+ */
+ private static String jsVersion;
+
+ /**
+ * Whether e4x is being highlighted.
+ */
+ private static boolean e4xSupported;
+
+ /**
+ * Language state set on JS tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on E4X tokens.
+ */
+ private static final int LANG_INDEX_E4X = 1;
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JavaScriptTokenMaker() {
+ super();
+ }
+
+
+ static {
+ jsVersion = "1.0";
+ e4xSupported = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the closest {@link TokenTypes "standard" token type} for a given
+ * "internal" token type (e.g. one whose value is <code>< 0</code>).
+ *
+ */
+ public int getClosestStandardTokenTypeForInternalType(int type) {
+ switch (type) {
+ case INTERNAL_IN_JS_MLC:
+ return TokenTypes.COMMENT_MULTILINE;
+ case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+ return TokenTypes.COMMENT_DOCUMENTATION;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ case INTERNAL_IN_JS_STRING_VALID:
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ case INTERNAL_IN_JS_CHAR_VALID:
+ return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
+ }
+ return type;
+ }
+
+
+ /**
+ * Returns the JavaScript version being highlighted.
+ *
+ * @return Supported JavaScript version.
+ * @see #isJavaScriptCompatible(String)
+ */
+ public static String getJavaScriptVersion() {
+ return jsVersion;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ validJSString = true;
+ e4x_prevState = YYINITIAL;
+ e4x_inInternalDtd = false;
+ int languageIndex = LANG_INDEX_DEFAULT;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ break;
+ case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+ state = JS_DOCCOMMENT;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ break;
+ case INTERNAL_E4X:
+ state = E4X;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_INTAG:
+ state = E4X_INTAG;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION:
+ state = E4X_PI;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_DTD:
+ state = E4X_DTD;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_DTD_INTERNAL:
+ state = E4X_DTD;
+ e4x_inInternalDtd = true;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_ATTR_SINGLE:
+ state = E4X_INATTR_SINGLE;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_ATTR_DOUBLE:
+ state = E4X_INATTR_DOUBLE;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_MARKUP_CDATA:
+ state = E4X_CDATA;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_E4X_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_E4X_COMMENT:
+ state = E4X_COMMENT;
+ break;
+ }
+ e4x_prevState = -initialTokenType&0xff;
+ languageIndex = LANG_INDEX_E4X;
+ }
+ else { // Shouldn't happen
+ state = Token.NULL;
+ }
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether e4x is being highlighted.
+ *
+ * @return Whether e4x is being highlighted.
+ * @see #setE4xSupported(boolean)
+ */
+ public static boolean isE4xSupported() {
+ return e4xSupported;
+ }
+
+
+ /**
+ * Returns whether features for a specific JS version should be honored
+ * while highlighting.
+ *
+ * @param version JavaScript version required
+ * @return Whether the JavaScript version is the same or greater than
+ * version required.
+ */
+ public static boolean isJavaScriptCompatible(String version) {
+ return jsVersion.compareTo(version) >= 0;
+ }
+
+
+ /**
+ * Sets whether e4x should be highlighted. A repaint should be forced on
+ * all <code>RSyntaxTextArea</code>s editing JavaScript if this property
+ * is changed to see the difference.
+ *
+ * @param supported Whether e4x should be highlighted.
+ * @see #isE4xSupported()
+ */
+ public static void setE4xSupported(boolean supported) {
+ e4xSupported = supported;
+ }
+
+
+ /**
+ * Set the supported JavaScript version because some keywords were
+ * introduced on or after this version.
+ *
+ * @param javaScriptVersion The version of JavaScript to support, such as
+ * "<code>1.5</code>" or "<code>1.6</code>".
+ * @see #isJavaScriptCompatible(String)
+ * @see #getJavaScriptVersion()
+ */
+ public static void setJavaScriptVersion(String javaScriptVersion) {
+ jsVersion = javaScriptVersion;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Whitespace = ([ \t\f]+)
+LineTerminator = ([\n])
+
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+LetterOrDigit = ({Letter}|{Digit})
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({Letter}|"_"|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin = "/*"
+JS_DocCommentBegin = "/**"
+JS_MLCEnd = "*/"
+JS_LineCommentBegin = "//"
+JS_IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral = ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral = ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1 = ([fFdD]?)
+JS_FloatHelper2 = ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1 = ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2 = ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3 = ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral = ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat = (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator = ([\(\)\{\}\[\]\]])
+JS_Separator2 = ([\;,.])
+JS_NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator = ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier = ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier = ({NonSeparator}+)
+JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+JS_E4xAttribute = ("@"{Letter}{LetterOrDigit}*)
+
+JS_BlockTag = ("abstract"|"access"|"alias"|"augments"|"author"|"borrows"|
+ "callback"|"classdesc"|"constant"|"constructor"|"constructs"|
+ "copyright"|"default"|"deprecated"|"desc"|"enum"|"event"|
+ "example"|"exports"|"external"|"file"|"fires"|"global"|
+ "ignore"|"inner"|"instance"|"kind"|"lends"|"license"|
+ "link"|"member"|"memberof"|"method"|"mixes"|"mixin"|"module"|
+ "name"|"namespace"|"param"|"private"|"property"|"protected"|
+ "public"|"readonly"|"requires"|"return"|"returns"|"see"|"since"|
+ "static"|"summary"|"this"|"throws"|"todo"|
+ "type"|"typedef"|"variation"|"version")
+JS_InlineTag = ("link"|"linkplain"|"linkcode"|"tutorial")
+
+e4x_NameStartChar = ([\:A-Z_a-z])
+e4x_NameChar = ({e4x_NameStartChar}|[\-\.0-9])
+e4x_TagName = ({e4x_NameStartChar}{e4x_NameChar}*)
+e4x_Identifier = ([^ \t\n<&;]+)
+e4x_EndXml = ([;])
+e4x_EntityReference = ([&][^; \t]*[;]?)
+e4x_InTagIdentifier = ([^ \t\n\"\'=\/>]+)
+e4x_CDataBegin = ("<![CDATA[")
+e4x_CDataEnd = ("]]>")
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrDigit}|"_"|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{LetterOrDigit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state JS_STRING
+%state JS_CHAR
+%state JS_MLC
+%state JS_DOCCOMMENT
+%state JS_EOL_COMMENT
+%state E4X
+%state E4X_COMMENT
+%state E4X_PI
+%state E4X_DTD
+%state E4X_INTAG
+%state E4X_INATTR_DOUBLE
+%state E4X_INATTR_SINGLE
+%state E4X_CDATA
+
+
+%%
+
+<YYINITIAL> {
+
+ // ECMA 3+ keywords.
+ "break" |
+ "continue" |
+ "delete" |
+ "else" |
+ "for" |
+ "function" |
+ "if" |
+ "in" |
+ "new" |
+ "this" |
+ "typeof" |
+ "var" |
+ "void" |
+ "while" |
+ "with" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ //e4X
+ "each" {if(e4xSupported){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+ //JavaScript 1.7
+ "let" {if(isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+ // e4x miscellaneous
+ {JS_E4xAttribute} { addToken(isE4xSupported() ? Token.MARKUP_TAG_ATTRIBUTE : Token.ERROR_IDENTIFIER); }
+
+ // Reserved (but not yet used) ECMA keywords.
+ "abstract" { addToken(Token.RESERVED_WORD); }
+ "boolean" { addToken(Token.DATA_TYPE); }
+ "byte" { addToken(Token.DATA_TYPE); }
+ "case" { addToken(Token.RESERVED_WORD); }
+ "catch" { addToken(Token.RESERVED_WORD); }
+ "char" { addToken(Token.DATA_TYPE); }
+ "class" { addToken(Token.RESERVED_WORD); }
+ "const" { addToken(Token.RESERVED_WORD); }
+ "debugger" { addToken(Token.RESERVED_WORD); }
+ "default" { addToken(Token.RESERVED_WORD); }
+ "do" { addToken(Token.RESERVED_WORD); }
+ "double" { addToken(Token.DATA_TYPE); }
+ "enum" { addToken(Token.RESERVED_WORD); }
+ "export" { addToken(Token.RESERVED_WORD); }
+ "extends" { addToken(Token.RESERVED_WORD); }
+ "final" { addToken(Token.RESERVED_WORD); }
+ "finally" { addToken(Token.RESERVED_WORD); }
+ "float" { addToken(Token.DATA_TYPE); }
+ "goto" { addToken(Token.RESERVED_WORD); }
+ "implements" { addToken(Token.RESERVED_WORD); }
+ "import" { addToken(Token.RESERVED_WORD); }
+ "instanceof" { addToken(Token.RESERVED_WORD); }
+ "int" { addToken(Token.DATA_TYPE); }
+ "interface" { addToken(Token.RESERVED_WORD); }
+ "long" { addToken(Token.DATA_TYPE); }
+ "native" { addToken(Token.RESERVED_WORD); }
+ "package" { addToken(Token.RESERVED_WORD); }
+ "private" { addToken(Token.RESERVED_WORD); }
+ "protected" { addToken(Token.RESERVED_WORD); }
+ "public" { addToken(Token.RESERVED_WORD); }
+ "short" { addToken(Token.DATA_TYPE); }
+ "static" { addToken(Token.RESERVED_WORD); }
+ "super" { addToken(Token.RESERVED_WORD); }
+ "switch" { addToken(Token.RESERVED_WORD); }
+ "synchronized" { addToken(Token.RESERVED_WORD); }
+ "throw" { addToken(Token.RESERVED_WORD); }
+ "throws" { addToken(Token.RESERVED_WORD); }
+ "transient" { addToken(Token.RESERVED_WORD); }
+ "try" { addToken(Token.RESERVED_WORD); }
+ "volatile" { addToken(Token.RESERVED_WORD); }
+ "null" { addToken(Token.RESERVED_WORD); }
+
+ // Literals.
+ "false" |
+ "true" { addToken(Token.LITERAL_BOOLEAN); }
+ "NaN" { addToken(Token.RESERVED_WORD); }
+ "Infinity" { addToken(Token.RESERVED_WORD); }
+
+ // Functions.
+ "eval" |
+ "parseInt" |
+ "parseFloat" |
+ "escape" |
+ "unescape" |
+ "isNaN" |
+ "isFinite" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {JS_Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ [\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+ [\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
+ {JS_DocCommentBegin} { start = zzMarkedPos-3; yybegin(JS_DOCCOMMENT); }
+ {JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+ /* Attempt to identify regular expressions (not foolproof) - do after comments! */
+ {JS_Regex} {
+ boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* Separators. */
+ {JS_Separator} { addToken(Token.SEPARATOR); }
+ {JS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ [\+]?"="{Whitespace}*"<" {
+ int start = zzStartRead;
+ int operatorLen = yycharat(0)=='+' ? 2 : 1;
+ int yylen = yylength(); // Cache before first addToken() invalidates it
+ //System.out.println("'" + yytext() + "': " + yylength() + ", " + (operatorLen+1));
+ addToken(zzStartRead,zzStartRead+operatorLen-1, Token.OPERATOR);
+ if (yylen>operatorLen+1) {
+ //System.out.println((start+operatorLen) + ", " + (zzMarkedPos-2));
+ addToken(start+operatorLen,zzMarkedPos-2, Token.WHITESPACE);
+ }
+ zzStartRead = zzCurrentPos = zzMarkedPos = zzMarkedPos - 1;
+ if (isE4xSupported()) {
+ // Scanning will continue with "<" as markup tag start
+ yybegin(E4X, LANG_INDEX_E4X);
+ }
+ // Found e4x (or syntax error) but option not enabled;
+ // Scanning will continue at "<" as operator
+ }
+ {JS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<JS_STRING> {
+ [^\n\\\"]+ {}
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ \" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+}
+
+<JS_CHAR> {
+ [^\n\\\']+ {}
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ \' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken; }
+}
+
+<JS_MLC> {
+ // JavaScript MLC's. This state is essentially Java's MLC state.
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {JS_MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+<JS_DOCCOMMENT> {
+ [^hwf\@\{\n\<\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+ [hwf] {}
+
+ "@"{JS_BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "@" {}
+ "{@"{JS_InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "{" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
+ "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+ \< {}
+ {JS_MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+ \* {}
+ <<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken; }
+}
+
+<JS_EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
+
+<E4X> {
+ "<!--" { start = zzStartRead; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
+ {e4x_CDataBegin} { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(E4X_CDATA); }
+ "<!" { start = zzMarkedPos-2; e4x_inInternalDtd = false; yybegin(E4X_DTD); }
+ "<?" { start = zzMarkedPos-2; yybegin(E4X_PI); }
+ "<"{e4x_TagName} {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(E4X_INTAG);
+ }
+ "</"{e4x_TagName} {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(E4X_INTAG);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG); }
+ {e4x_Identifier} { addToken(Token.IDENTIFIER); }
+ {e4x_EndXml} { yybegin(YYINITIAL, LANG_INDEX_DEFAULT); addToken(Token.IDENTIFIER); }
+ {e4x_EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {LineTerminator} |
+ <<EOF>> { addEndToken(INTERNAL_E4X); return firstToken; }
+}
+
+<E4X_COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ "-->" { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(e4x_prevState); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken; }
+}
+
+<E4X_PI> {
+ [^\n\?]+ {}
+ "?>" { yybegin(E4X); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+ "?" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<E4X_DTD> {
+ [^\n\[\]<>]+ {}
+ "<!--" { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT); }
+ "<" {}
+ "[" { e4x_inInternalDtd = true; }
+ "]" { e4x_inInternalDtd = false; }
+ ">" { if (!e4x_inInternalDtd) { yybegin(E4X); addToken(start,zzStartRead, Token.MARKUP_DTD); } }
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken; }
+}
+
+<E4X_INTAG> {
+ {e4x_InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+ "/>" { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(E4X_INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(E4X_INATTR_SINGLE); }
+ <<EOF>> { addToken(start,zzStartRead-1, INTERNAL_E4X_INTAG); return firstToken; }
+}
+
+<E4X_INATTR_DOUBLE> {
+ [^\"]* {}
+ [\"] { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_DOUBLE); return firstToken; }
+}
+
+<E4X_INATTR_SINGLE> {
+ [^\']* {}
+ [\'] { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_SINGLE); return firstToken; }
+}
+
+<E4X_CDATA> {
+ [^\]]+ {}
+ {e4x_CDataEnd} { int temp=zzStartRead; yybegin(E4X); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+ "]" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addEndToken(INTERNAL_E4X_MARKUP_CDATA); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java
new file mode 100644
index 0000000..19c9bee
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java
@@ -0,0 +1,2130 @@
+/* The following code was generated by JFlex 1.4.1 on 4/22/13 10:43 PM */
+
+/*
+ * 02/05/2012
+ *
+ * JavaScriptTokenMaker.java - Parses a document into JavaScript tokens.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for JavaScript files. Its states could be simplified, but are
+ * kept the way they are to keep a degree of similarity (i.e. copy/paste)
+ * between it and HTML/JSP/PHPTokenMaker. This should cause no difference in
+ * performance.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JavaScriptTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class JavaScriptTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int JS_STRING = 1;
+ public static final int E4X = 6;
+ public static final int E4X_INTAG = 10;
+ public static final int E4X_PI = 8;
+ public static final int JS_MLC = 3;
+ public static final int JS_CHAR = 2;
+ public static final int JS_EOL_COMMENT = 5;
+ public static final int E4X_COMMENT = 7;
+ public static final int JS_DOCCOMMENT = 4;
+ public static final int E4X_DTD = 9;
+ public static final int E4X_INATTR_SINGLE = 12;
+ public static final int E4X_INATTR_DOUBLE = 11;
+ public static final int YYINITIAL = 0;
+ public static final int E4X_CDATA = 13;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\73\1\2\1\0\1\1\1\11\22\0\1\73\1\36\1\75"+
+ "\1\12\1\15\1\35\1\40\1\105\2\104\1\17\1\30\1\27\1\24"+
+ "\1\25\1\16\1\5\7\7\2\4\1\41\1\74\1\31\1\32\1\34"+
+ "\1\37\1\44\1\101\1\6\1\77\1\100\1\23\1\22\2\3\1\110"+
+ "\2\3\1\21\1\3\1\107\5\3\1\102\3\3\1\20\2\3\1\76"+
+ "\1\13\1\103\1\33\1\14\1\0\1\45\1\46\1\52\1\64\1\53"+
+ "\1\67\1\56\1\60\1\55\1\3\1\63\1\54\1\43\1\57\1\61"+
+ "\1\65\1\72\1\51\1\47\1\50\1\10\1\70\1\62\1\71\1\66"+
+ "\1\106\1\111\1\33\1\26\1\42\uff81\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 =
+ "\13\0\2\1\1\0\1\2\1\3\1\4\1\5\2\6"+
+ "\1\5\1\2\3\7\1\5\1\10\1\5\6\7\1\2"+
+ "\20\5\1\11\1\12\2\5\1\1\1\13\1\14\1\15"+
+ "\1\1\1\16\1\17\1\20\1\1\1\21\5\1\1\22"+
+ "\10\1\1\23\2\5\1\24\1\25\1\26\1\27\1\1"+
+ "\1\30\5\1\1\31\2\1\1\32\1\1\1\33\1\34"+
+ "\1\35\2\36\1\37\1\40\1\41\1\42\1\1\1\43"+
+ "\3\1\1\2\1\44\1\6\1\45\1\44\1\45\1\44"+
+ "\1\46\1\44\1\5\2\0\1\47\1\50\2\7\2\0"+
+ "\1\51\1\7\1\52\33\5\2\53\7\5\1\53\13\5"+
+ "\1\54\1\55\1\56\1\57\4\0\1\60\2\0\1\61"+
+ "\26\0\1\62\1\25\1\63\1\64\1\26\5\0\1\65"+
+ "\2\0\1\2\1\45\1\0\2\46\1\5\1\66\1\67"+
+ "\32\5\1\70\5\5\1\71\25\5\60\0\1\72\2\0"+
+ "\1\73\5\0\1\74\1\2\1\75\3\5\1\71\3\5"+
+ "\1\76\6\5\1\77\1\5\1\100\24\5\1\0\1\1"+
+ "\1\0\1\101\15\0\1\102\45\0\1\103\3\0\1\104"+
+ "\2\0\1\105\1\0\1\106\1\2\5\5\1\53\17\5"+
+ "\1\53\1\5\15\0\1\102\20\0\1\102\16\0\1\2"+
+ "\4\5\1\107\13\5\33\0\10\5\1\102\4\0\1\102"+
+ "\12\0\3\5\6\0\1\5\2\0\1\110\1\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[603];
+ 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\112\0\224\0\336\0\u0128\0\u0172\0\u01bc\0\u0206"+
+ "\0\u0250\0\u029a\0\u02e4\0\u032e\0\u0378\0\u03c2\0\u040c\0\u0456"+
+ "\0\u04a0\0\u04ea\0\u0534\0\u057e\0\u05c8\0\u04a0\0\u0612\0\u065c"+
+ "\0\u06a6\0\u06f0\0\u04a0\0\u04a0\0\u073a\0\u0784\0\u07ce\0\u0818"+
+ "\0\u04a0\0\u0862\0\u08ac\0\u08f6\0\u0940\0\u098a\0\u09d4\0\u0a1e"+
+ "\0\u0a68\0\u0ab2\0\u0afc\0\u0b46\0\u0b90\0\u0bda\0\u0c24\0\u0c6e"+
+ "\0\u0cb8\0\u0d02\0\u0d4c\0\u04a0\0\u04a0\0\u0d96\0\u0de0\0\u0e2a"+
+ "\0\u04a0\0\u0e74\0\u04a0\0\u0ebe\0\u04a0\0\u0e74\0\u04a0\0\u0f08"+
+ "\0\u04a0\0\u0f52\0\u0f9c\0\u0fe6\0\u1030\0\u107a\0\u04a0\0\u10c4"+
+ "\0\u110e\0\u1158\0\u11a2\0\u11ec\0\u1236\0\u1280\0\u12ca\0\u04a0"+
+ "\0\u1314\0\u135e\0\u04a0\0\u13a8\0\u13f2\0\u04a0\0\u143c\0\u04a0"+
+ "\0\u1486\0\u14d0\0\u151a\0\u1564\0\u15ae\0\u04a0\0\u15f8\0\u1642"+
+ "\0\u04a0\0\u168c\0\u04a0\0\u04a0\0\u04a0\0\u16d6\0\u1720\0\u176a"+
+ "\0\u04a0\0\u04a0\0\u04a0\0\u17b4\0\u04a0\0\u17fe\0\u1848\0\u1892"+
+ "\0\u18dc\0\u1926\0\u1926\0\u1926\0\u1970\0\u19ba\0\u1a04\0\u1a4e"+
+ "\0\u1a98\0\u1ae2\0\u1b2c\0\u1b76\0\u04a0\0\u1bc0\0\u1b2c\0\u1c0a"+
+ "\0\u065c\0\u1c0a\0\u04a0\0\u1c54\0\u1c9e\0\u1ce8\0\u1d32\0\u1d7c"+
+ "\0\u1dc6\0\u1e10\0\u1e5a\0\u1ea4\0\u1eee\0\u1f38\0\u1f82\0\u1fcc"+
+ "\0\u2016\0\u2060\0\u20aa\0\u20f4\0\u213e\0\u2188\0\u21d2\0\u221c"+
+ "\0\u2266\0\u22b0\0\u22fa\0\u2344\0\u238e\0\u23d8\0\u2422\0\u246c"+
+ "\0\u24b6\0\u04ea\0\u2500\0\u254a\0\u2594\0\u25de\0\u2628\0\u2672"+
+ "\0\u26bc\0\u2706\0\u2750\0\u279a\0\u27e4\0\u282e\0\u2878\0\u28c2"+
+ "\0\u290c\0\u2956\0\u29a0\0\u29ea\0\u2a34\0\u04a0\0\u2a7e\0\u2ac8"+
+ "\0\u04a0\0\u2b12\0\u2b5c\0\u2ba6\0\u2bf0\0\u04a0\0\u2c3a\0\u2c84"+
+ "\0\u04a0\0\u2cce\0\u2d18\0\u2d62\0\u2dac\0\u2df6\0\u2e40\0\u2e8a"+
+ "\0\u2ed4\0\u2f1e\0\u2f68\0\u2fb2\0\u2ffc\0\u3046\0\u3090\0\u30da"+
+ "\0\u3124\0\u316e\0\u31b8\0\u3202\0\u324c\0\u3296\0\u32e0\0\u332a"+
+ "\0\u3374\0\u33be\0\u04a0\0\u04a0\0\u3408\0\u3452\0\u349c\0\u34e6"+
+ "\0\u3530\0\u04a0\0\u357a\0\u35c4\0\u360e\0\u3658\0\u36a2\0\u1926"+
+ "\0\u36ec\0\u3736\0\u3780\0\u37ca\0\u3814\0\u385e\0\u38a8\0\u38f2"+
+ "\0\u393c\0\u3986\0\u39d0\0\u3a1a\0\u3a64\0\u3aae\0\u3af8\0\u3b42"+
+ "\0\u3b8c\0\u3bd6\0\u3c20\0\u3c6a\0\u3cb4\0\u3cfe\0\u3d48\0\u3d92"+
+ "\0\u3ddc\0\u3e26\0\u3e70\0\u3eba\0\u3f04\0\u3f4e\0\u04ea\0\u3f98"+
+ "\0\u3fe2\0\u402c\0\u4076\0\u40c0\0\u410a\0\u4154\0\u419e\0\u41e8"+
+ "\0\u4232\0\u427c\0\u42c6\0\u4310\0\u435a\0\u43a4\0\u43ee\0\u4438"+
+ "\0\u4482\0\u44cc\0\u4516\0\u4560\0\u45aa\0\u45f4\0\u463e\0\u4688"+
+ "\0\u46d2\0\u471c\0\u4766\0\u47b0\0\u47fa\0\u4844\0\u488e\0\u48d8"+
+ "\0\u4922\0\u496c\0\u49b6\0\u4a00\0\u4a4a\0\u4a94\0\u4ade\0\u4b28"+
+ "\0\u4b72\0\u4bbc\0\u4c06\0\u4c50\0\u4c9a\0\u4ce4\0\u4d2e\0\u4d78"+
+ "\0\u4dc2\0\u4e0c\0\u4e56\0\u4ea0\0\u4eea\0\u4f34\0\u4f7e\0\u4fc8"+
+ "\0\u5012\0\u505c\0\u50a6\0\u50f0\0\u513a\0\u5184\0\u51ce\0\u5218"+
+ "\0\u5262\0\u52ac\0\u52f6\0\u5340\0\u538a\0\u53d4\0\u541e\0\u5468"+
+ "\0\u54b2\0\u54fc\0\u5546\0\u5590\0\u55da\0\u04a0\0\u5624\0\u566e"+
+ "\0\u56b8\0\u5702\0\u574c\0\u04a0\0\u5796\0\u04a0\0\u57e0\0\u582a"+
+ "\0\u5874\0\u04ea\0\u58be\0\u5908\0\u5952\0\u04ea\0\u599c\0\u59e6"+
+ "\0\u5a30\0\u5a7a\0\u5ac4\0\u5b0e\0\u04ea\0\u5b58\0\u04ea\0\u5ba2"+
+ "\0\u5bec\0\u5c36\0\u5c80\0\u5cca\0\u5d14\0\u5d5e\0\u5da8\0\u5df2"+
+ "\0\u5e3c\0\u5e86\0\u5ed0\0\u5f1a\0\u5f64\0\u5fae\0\u5ff8\0\u6042"+
+ "\0\u608c\0\u60d6\0\u6120\0\u2ac8\0\u04a0\0\u616a\0\u61b4\0\u61fe"+
+ "\0\u6248\0\u6292\0\u62dc\0\u6326\0\u6370\0\u63ba\0\u6404\0\u644e"+
+ "\0\u6498\0\u64e2\0\u652c\0\u6576\0\u04a0\0\u65c0\0\u660a\0\u6654"+
+ "\0\u669e\0\u66e8\0\u6732\0\u677c\0\u67c6\0\u6810\0\u685a\0\u68a4"+
+ "\0\u68ee\0\u6938\0\u6982\0\u69cc\0\u6a16\0\u6a60\0\u6aaa\0\u6af4"+
+ "\0\u6b3e\0\u6b88\0\u6bd2\0\u6c1c\0\u6c66\0\u6cb0\0\u6cfa\0\u6d44"+
+ "\0\u6d8e\0\u6dd8\0\u6e22\0\u6e6c\0\u6eb6\0\u6f00\0\u6f4a\0\u6f94"+
+ "\0\u6fde\0\u7028\0\u7072\0\u70bc\0\u7106\0\u7150\0\u04a0\0\u719a"+
+ "\0\u71e4\0\u722e\0\u7278\0\u04a0\0\u72c2\0\u730c\0\u7356\0\u73a0"+
+ "\0\u73ea\0\u7434\0\u3b8c\0\u747e\0\u74c8\0\u7512\0\u755c\0\u75a6"+
+ "\0\u75f0\0\u763a\0\u7684\0\u76ce\0\u7718\0\u7762\0\u77ac\0\u77f6"+
+ "\0\u7840\0\u788a\0\u78d4\0\u791e\0\u61b4\0\u7968\0\u79b2\0\u79fc"+
+ "\0\u7a46\0\u7a90\0\u7ada\0\u7b24\0\u7b6e\0\u7bb8\0\u7c02\0\u7c4c"+
+ "\0\u7c96\0\u7ce0\0\u7d2a\0\u7d74\0\u7dbe\0\u7e08\0\u7e52\0\u7e9c"+
+ "\0\u7ee6\0\u7f30\0\u7f7a\0\u7fc4\0\u800e\0\u8058\0\u80a2\0\u80ec"+
+ "\0\u8136\0\u8180\0\u81ca\0\u8214\0\u825e\0\u82a8\0\u82f2\0\u833c"+
+ "\0\u8386\0\u83d0\0\u7072\0\u841a\0\u8464\0\u84ae\0\u84f8\0\u722e"+
+ "\0\u8542\0\u858c\0\u85d6\0\u8620\0\u866a\0\u86b4\0\u04ea\0\u86fe"+
+ "\0\u8748\0\u8792\0\u87dc\0\u8826\0\u8870\0\u88ba\0\u8904\0\u894e"+
+ "\0\u8998\0\u89e2\0\u8a2c\0\u8a76\0\u8ac0\0\u8b0a\0\u8b54\0\u8b9e"+
+ "\0\u8be8\0\u8c32\0\u8c7c\0\u8cc6\0\u8d10\0\u8d5a\0\u8da4\0\u8dee"+
+ "\0\u8e38\0\u8e82\0\u8ecc\0\u8f16\0\u8f60\0\u8faa\0\u8ff4\0\u903e"+
+ "\0\u9088\0\u90d2\0\u911c\0\u9166\0\u91b0\0\u91fa\0\u9244\0\u928e"+
+ "\0\u92d8\0\u9322\0\u936c\0\u93b6\0\u9400\0\u944a\0\u9494\0\u94de"+
+ "\0\u9528\0\u9572\0\u6654\0\u95bc\0\u9606\0\u9650\0\u969a\0\u96e4"+
+ "\0\u972e\0\u9778\0\u97c2\0\u980c\0\u9856\0\u98a0\0\u98ea\0\u9934"+
+ "\0\u997e\0\u99c8\0\u9a12\0\u9a5c\0\u9aa6\0\u9af0\0\u9b3a\0\u9b84"+
+ "\0\u9bce\0\u04a0\0\u9c18";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[603];
+ 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 =
+ "\1\17\1\20\1\21\1\22\1\23\1\24\1\22\1\23"+
+ "\1\25\1\26\2\17\2\22\1\27\1\30\4\22\1\31"+
+ "\1\32\1\33\1\34\1\35\1\36\1\37\1\30\1\40"+
+ "\2\30\1\41\1\42\2\41\1\22\1\43\1\44\1\45"+
+ "\1\46\1\47\1\50\1\51\1\52\1\53\1\54\1\55"+
+ "\1\56\2\22\1\57\1\22\1\60\1\61\1\22\1\62"+
+ "\1\63\2\22\1\20\1\34\1\64\1\33\4\22\2\33"+
+ "\1\65\1\22\1\66\1\67\1\33\2\70\1\71\10\70"+
+ "\1\72\61\70\1\73\14\70\2\74\1\75\10\74\1\76"+
+ "\71\74\1\77\4\74\2\100\1\101\14\100\1\102\40\100"+
+ "\1\103\1\100\1\104\4\100\1\105\22\100\2\106\1\107"+
+ "\14\106\1\110\11\106\1\111\12\106\1\112\13\106\1\113"+
+ "\1\106\1\114\4\106\1\115\21\106\1\116\2\117\1\120"+
+ "\55\117\1\103\1\117\1\104\4\117\1\105\22\117\1\121"+
+ "\1\122\1\123\26\121\1\124\6\121\1\125\32\121\1\20"+
+ "\1\126\15\121\2\127\1\130\21\127\1\131\33\127\1\132"+
+ "\1\127\1\133\4\127\1\134\22\127\2\135\1\136\34\135"+
+ "\1\137\52\135\2\140\1\141\26\140\1\142\2\140\1\143"+
+ "\41\140\1\144\4\140\1\145\6\140\1\146\1\147\1\0"+
+ "\13\146\1\150\13\146\1\41\1\146\1\151\36\146\1\20"+
+ "\1\146\1\152\7\146\1\153\4\146\75\154\1\155\14\154"+
+ "\105\156\1\155\4\156\103\157\1\160\6\157\1\17\2\0"+
+ "\6\17\1\0\4\17\2\0\4\17\17\0\30\17\4\0"+
+ "\4\17\3\0\3\17\2\0\1\20\71\0\1\20\130\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\26\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\162\2\0\1\162\2\23\1\162\1\23"+
+ "\1\162\1\0\4\162\2\0\1\162\1\163\1\164\1\165"+
+ "\1\0\1\166\15\0\10\162\1\165\1\163\7\162\1\164"+
+ "\2\162\1\164\3\162\4\0\1\162\1\164\2\162\3\0"+
+ "\3\162\1\0\1\162\2\0\1\162\1\167\1\170\1\162"+
+ "\1\170\1\162\1\0\4\162\2\0\1\171\1\163\1\164"+
+ "\1\165\1\0\1\166\15\0\10\162\1\165\1\163\7\162"+
+ "\1\164\2\162\1\164\1\162\1\171\1\162\4\0\1\162"+
+ "\1\164\2\162\3\0\3\162\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\12\22\1\172\13\22\4\0\4\22\3\0\3\22"+
+ "\1\0\13\173\1\174\2\173\1\175\1\176\12\173\1\177"+
+ "\57\173\32\0\1\41\103\0\1\41\5\0\1\41\63\0"+
+ "\2\166\1\0\1\166\132\0\1\41\1\0\1\200\110\0"+
+ "\1\201\1\41\60\0\1\202\27\0\1\203\1\41\40\0"+
+ "\1\202\50\0\1\41\1\0\1\204\107\0\1\41\5\0"+
+ "\1\41\51\0\1\17\2\0\1\205\2\17\1\205\1\17"+
+ "\1\205\1\0\4\17\2\0\4\205\17\0\1\205\1\17"+
+ "\26\205\4\0\4\205\3\0\3\205\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\1\22\1\206\24\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\4\22\1\207"+
+ "\7\22\1\210\4\22\1\211\4\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\5\22\1\212\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+ "\1\213\7\22\1\214\1\22\1\215\3\22\1\216\4\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\4\22\1\217\6\22\1\220\5\22\1\221\4\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\6\22\1\222\17\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\1\223\6\22\1\224"+
+ "\3\22\1\225\1\226\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\1\227\1\22\1\230"+
+ "\4\22\1\231\2\22\1\232\10\22\1\233\1\234\1\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\6\22\1\235\5\22\1\236\11\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\237\1\17\2\22"+
+ "\1\240\7\22\1\241\7\22\1\242\3\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\14\22"+
+ "\1\243\11\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\5\22\1\244\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\245\5\22\1\246\17\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\10\22\1\247\2\22\1\250\12\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\6\22"+
+ "\1\251\5\22\1\252\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\5\22\1\253\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\1\254\3\22"+
+ "\1\255\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\5\22\1\256\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\257\6\22\1\260\1\261"+
+ "\3\22\1\262\11\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\262\13\22\1\263\11\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\1\264\25\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\265\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\2\70\1\0\10\70\1\0"+
+ "\61\70\1\0\14\70\2\266\1\0\5\266\1\267\60\266"+
+ "\1\270\20\266\2\74\1\0\10\74\1\0\71\74\1\0"+
+ "\4\74\2\100\1\0\14\100\1\0\40\100\1\0\1\100"+
+ "\1\0\4\100\1\0\22\100\16\0\1\271\143\0\1\272"+
+ "\123\0\1\273\77\0\1\274\4\0\1\275\34\0\2\106"+
+ "\1\0\14\106\1\0\11\106\1\0\12\106\1\0\13\106"+
+ "\1\0\1\106\1\0\4\106\1\0\21\106\17\0\1\276"+
+ "\76\0\1\277\2\0\1\277\1\0\1\277\5\0\1\300"+
+ "\1\0\4\277\10\0\1\301\6\0\1\277\1\0\26\277"+
+ "\4\0\4\277\3\0\3\277\44\0\1\302\1\0\1\303"+
+ "\1\304\1\305\1\306\1\307\1\310\1\311\1\312\1\313"+
+ "\1\314\1\315\3\0\1\316\1\317\1\320\1\0\1\321"+
+ "\1\322\71\0\1\323\123\0\1\324\77\0\1\325\4\0"+
+ "\1\326\100\0\1\327\45\0\2\117\1\0\55\117\1\0"+
+ "\1\117\1\0\4\117\1\0\22\117\2\121\1\0\26\121"+
+ "\1\0\6\121\1\0\32\121\2\0\16\121\1\122\1\0"+
+ "\26\121\1\0\6\121\1\0\32\121\1\20\1\0\15\121"+
+ "\3\0\1\330\2\0\1\330\1\0\1\330\3\0\1\330"+
+ "\1\0\1\331\1\0\4\330\12\0\1\332\1\333\1\0"+
+ "\1\330\1\0\1\330\1\0\26\330\4\0\4\330\3\0"+
+ "\3\330\1\0\73\125\1\0\1\334\15\125\2\127\1\0"+
+ "\21\127\1\0\33\127\1\0\1\127\1\0\4\127\1\0"+
+ "\22\127\24\0\1\335\135\0\1\336\123\0\1\337\77\0"+
+ "\1\340\4\0\1\341\34\0\2\135\1\0\34\135\1\0"+
+ "\52\135\34\0\1\342\55\0\2\140\1\0\26\140\1\0"+
+ "\2\140\1\0\41\140\1\0\4\140\1\0\6\140\36\0"+
+ "\1\343\53\0\2\146\1\0\13\146\1\0\13\146\1\0"+
+ "\1\146\1\0\36\146\1\0\1\146\1\0\7\146\1\0"+
+ "\5\146\1\147\1\0\13\146\1\0\13\146\1\0\1\146"+
+ "\1\0\36\146\1\20\1\146\1\0\7\146\1\0\4\146"+
+ "\34\0\1\151\55\0\75\154\1\0\14\154\105\156\1\0"+
+ "\4\156\103\157\1\0\6\157\103\0\1\344\6\0\1\17"+
+ "\2\0\5\17\1\345\1\0\4\17\2\0\4\17\17\0"+
+ "\30\17\4\0\4\17\3\0\3\17\1\0\1\162\2\0"+
+ "\6\162\1\0\4\162\2\0\4\162\17\0\30\162\4\0"+
+ "\4\162\3\0\3\162\1\0\1\162\2\0\1\162\2\346"+
+ "\1\162\1\346\1\162\1\0\4\162\2\0\4\162\1\347"+
+ "\3\0\1\347\12\0\30\162\4\0\4\162\3\0\3\162"+
+ "\1\0\1\162\2\0\1\162\2\166\1\162\1\166\1\162"+
+ "\1\0\4\162\2\0\2\162\1\164\1\165\17\0\10\162"+
+ "\1\165\10\162\1\164\2\162\1\164\3\162\4\0\1\162"+
+ "\1\164\2\162\3\0\3\162\1\0\1\162\2\0\1\162"+
+ "\2\167\1\162\1\167\1\162\1\0\4\162\2\0\2\162"+
+ "\1\164\1\165\1\0\1\166\15\0\10\162\1\165\10\162"+
+ "\1\164\2\162\1\164\3\162\4\0\1\162\1\164\2\162"+
+ "\3\0\3\162\1\0\1\162\2\0\1\162\1\167\1\170"+
+ "\1\162\1\170\1\162\1\0\4\162\2\0\1\162\1\350"+
+ "\1\164\1\165\1\0\1\166\15\0\10\162\1\165\1\350"+
+ "\7\162\1\164\2\162\1\164\3\162\4\0\1\162\1\164"+
+ "\2\162\3\0\3\162\1\0\1\162\2\0\1\162\4\351"+
+ "\1\162\1\0\4\162\2\0\2\162\2\351\17\0\2\162"+
+ "\2\351\3\162\2\351\10\162\1\351\2\162\1\351\3\162"+
+ "\4\0\3\351\1\162\3\0\3\162\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\6\22\1\352\17\22\4\0\4\22\3\0"+
+ "\3\22\1\0\13\173\1\174\2\173\1\353\75\173\1\0"+
+ "\107\173\17\0\1\354\73\0\1\202\27\0\1\203\41\0"+
+ "\1\202\50\0\1\41\1\0\1\30\55\0\1\17\2\0"+
+ "\6\205\1\0\4\17\2\0\4\205\17\0\1\205\1\17"+
+ "\26\205\4\0\4\205\3\0\3\205\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\2\22\1\355\23\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\6\22\1\356"+
+ "\17\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\14\22\1\357\11\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\360"+
+ "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\20\22\1\361\5\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\1\362\25\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\14\22\1\363\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\10\22\1\364\15\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\12\22\1\365\13\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\5\22\1\366\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\1\367\20\22"+
+ "\1\242\4\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\4\22\1\370\3\22\1\371\15\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\20\22\1\372\5\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\3\22\1\373\22\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\2\22\1\374\1\375\22\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\1\376\25\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\1\377\25\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\u0100\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\5\22\1\u0101\20\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\5\22\1\u0102\20\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\2\22\1\374\23\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\5\22\1\u0103\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0104"+
+ "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\3\22\1\u0105\14\22\1\u0106\5\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\3\22\1\u0107\22\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\u0108\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\20\22\1\u0109\5\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\2\22\1\u010a\1\22\17\0\1\22\1\17\26\22\4\0"+
+ "\4\22\3\0\1\22\1\u010b\1\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\2\22\1\u010c\1\u010d\22\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+ "\1\u010e\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\7\22\1\u010f\16\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+ "\1\u0110\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\15\22\1\242\10\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+ "\1\u0111\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\10\22\1\u0112\15\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\22"+
+ "\1\u0113\5\22\1\u0114\12\22\1\u0115\3\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\5\22\1\u0116\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\26\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\1\22\1\u0117\24\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\4\22\1\u0118"+
+ "\1\u0119\20\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\10\22\1\u011a\3\22\1\u011b\11\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\12\22\1\u011c\13\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\7\22\1\u011d\16\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\14\22\1\u011e\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\12\22\1\u011f\13\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\4\22\1\242\21\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\7\22\1\u0120\1\u0121"+
+ "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\26\22\4\0\4\22\3\0\1\22\1\242"+
+ "\1\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\22\22\1\u0122"+
+ "\3\22\4\0\4\22\3\0\3\22\5\0\4\u0123\12\0"+
+ "\2\u0123\21\0\2\u0123\3\0\2\u0123\10\0\1\u0123\2\0"+
+ "\1\u0123\7\0\3\u0123\14\0\4\u0124\12\0\2\u0124\21\0"+
+ "\2\u0124\3\0\2\u0124\10\0\1\u0124\2\0\1\u0124\7\0"+
+ "\3\u0124\60\0\1\u0125\123\0\1\u0126\114\0\1\u0127\100\0"+
+ "\1\u0128\35\0\34\277\1\301\55\277\3\0\1\277\2\0"+
+ "\1\277\1\0\1\277\7\0\4\277\10\0\1\301\6\0"+
+ "\1\277\1\0\26\277\4\0\4\277\3\0\3\277\54\0"+
+ "\1\u0129\1\0\1\u012a\3\0\1\u012b\40\0\1\u012c\35\0"+
+ "\1\u012d\3\0\1\u012e\1\0\1\u012f\116\0\1\u0130\40\0"+
+ "\1\u0131\37\0\1\u0132\2\0\1\u0133\1\0\1\u0134\114\0"+
+ "\1\u0135\1\u0136\4\0\1\u0137\76\0\1\u0138\103\0\1\u0139"+
+ "\6\0\1\u013a\4\0\1\u013b\107\0\1\u013c\10\0\1\u013d"+
+ "\1\u013e\73\0\1\u013f\1\0\1\u0140\112\0\1\u0141\1\u0142"+
+ "\106\0\1\u0143\102\0\1\u0144\121\0\1\u0145\107\0\1\u0146"+
+ "\46\0\1\u0147\34\0\1\u0148\3\0\1\u0149\115\0\1\u014a"+
+ "\101\0\1\u014b\5\0\1\u014c\106\0\1\u014d\123\0\1\u014e"+
+ "\114\0\1\u014f\100\0\1\u0150\105\0\1\u0151\3\0\1\u0152"+
+ "\40\0\6\330\3\0\1\330\3\0\6\330\13\0\1\330"+
+ "\1\0\1\330\1\0\26\330\4\0\4\330\3\0\3\330"+
+ "\4\0\1\u0153\2\0\1\u0153\1\0\1\u0153\3\0\1\u0153"+
+ "\3\0\4\u0153\15\0\1\u0153\1\0\1\u0153\1\0\26\u0153"+
+ "\4\0\4\u0153\3\0\3\u0153\25\0\1\u0154\51\0\1\u0155"+
+ "\47\0\1\u0156\125\0\1\u0157\123\0\1\u0158\114\0\1\u0159"+
+ "\100\0\1\u015a\61\0\1\u015b\121\0\1\u015c\55\0\1\17"+
+ "\2\0\1\17\4\u015d\1\17\1\0\4\17\2\0\2\17"+
+ "\2\u015d\17\0\2\17\2\u015d\3\17\2\u015d\10\17\1\u015d"+
+ "\2\17\1\u015d\3\17\4\0\3\u015d\1\17\3\0\3\17"+
+ "\1\0\1\162\2\0\1\162\2\346\1\162\1\346\1\162"+
+ "\1\0\4\162\2\0\2\162\1\164\1\162\17\0\21\162"+
+ "\1\164\2\162\1\164\3\162\4\0\1\162\1\164\2\162"+
+ "\3\0\3\162\5\0\2\346\1\0\1\346\102\0\1\162"+
+ "\2\0\1\162\4\351\1\162\1\0\4\162\2\0\1\162"+
+ "\1\350\2\351\17\0\2\162\2\351\3\162\2\351\1\350"+
+ "\7\162\1\351\2\162\1\351\3\162\4\0\3\351\1\162"+
+ "\3\0\3\162\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\2\22"+
+ "\1\230\23\22\4\0\4\22\3\0\3\22\44\0\1\353"+
+ "\11\0\2\353\51\0\1\u015e\73\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\3\22\1\u015f\22\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\1\u0160\25\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\7\22\1\u0161\16\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\6\22\1\u0162\17\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\6\22\1\262\17\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\3\22\1\u0163\22\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\4\22\1\u0164\21\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\3\22\1\375\22\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\5\22\1\u0165\20\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\6\22\1\u0166\17\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\12\22\1\u0167\13\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\14\22\1\u0168\11\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\2\22\1\242\23\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\6\22\1\u0169\17\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\5\22\1\u016a"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\26\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\6\22\1\242\17\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\5\22"+
+ "\1\u0111\20\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\2\22\1\371\23\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\4\22"+
+ "\1\u0162\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\2\22\1\u016b\1\u016c\22\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\13\22\1\u016d\12\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\u016e\25\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\242\1\17\26\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\7\22\1\u016f\16\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\6\22\1\u0170\17\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\14\22\1\u0171\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\11\22\1\u0162\14\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\7\22\1\u0172\4\22\1\u0171\11\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\10\22"+
+ "\1\u0173\15\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\1\u0174\25\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\u0175"+
+ "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\6\22\1\u0176\17\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\14\22\1\242"+
+ "\11\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\7\22\1\242\16\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u0177"+
+ "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\13\22\1\242\12\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\7\22\1\374"+
+ "\16\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\5\22\1\u0178\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\26\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\6\22\1\u0179\17\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\1\u017a\25\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\22\1\u017b\24\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\7\22\1\u0163\16\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\2\22\1\u017c\23\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\16\22\1\u017d\7\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\23\22\1\u017e\2\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\3\22\1\u017f\22\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\5\22\1\u0180\20\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\2\22\1\366\23\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\1\u0164\25\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0181"+
+ "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\1\u0182\25\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\17\22\1\242\6\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\10\22\1\u0183\15\22\4\0\4\22\3\0\3\22"+
+ "\5\0\4\u0184\12\0\2\u0184\21\0\2\u0184\3\0\2\u0184"+
+ "\10\0\1\u0184\2\0\1\u0184\7\0\3\u0184\14\0\4\u0185"+
+ "\12\0\2\u0185\21\0\2\u0185\3\0\2\u0185\10\0\1\u0185"+
+ "\2\0\1\u0185\7\0\3\u0185\75\0\1\u0186\51\0\1\u0187"+
+ "\125\0\1\u0188\123\0\1\u0127\101\0\1\u0189\4\0\1\u018a"+
+ "\132\0\1\u018b\104\0\1\u018c\75\0\1\u018d\5\0\1\u018e"+
+ "\102\0\1\u018f\114\0\1\u0190\114\0\1\u0191\105\0\1\u0192"+
+ "\103\0\1\u0193\113\0\1\u0194\117\0\1\u0195\115\0\1\u0196"+
+ "\103\0\1\u0197\3\0\1\u0198\120\0\1\u0199\112\0\1\u019a"+
+ "\71\0\1\u019b\2\0\1\u019c\21\0\1\u019d\73\0\1\u019e"+
+ "\102\0\1\u019f\123\0\1\u01a0\5\0\1\u01a1\34\0\1\u01a2"+
+ "\154\0\1\u01a3\103\0\1\u01a4\2\0\1\u01a5\14\0\1\u01a6"+
+ "\103\0\1\u01a7\104\0\1\u01a8\4\0\1\u01a9\111\0\1\u01aa"+
+ "\101\0\1\u01ab\7\0\1\u01ac\113\0\1\u01ad\73\0\1\u01ae"+
+ "\125\0\1\u01af\101\0\1\u01b0\15\0\1\u01b1\1\0\1\u01b2"+
+ "\70\0\1\u01b3\114\0\1\u01b4\115\0\1\u01b5\3\0\1\u01b6"+
+ "\101\0\1\u01b7\2\0\1\u0133\106\0\1\u01b8\111\0\1\u01b9"+
+ "\125\0\1\u01ba\51\0\1\u01bb\125\0\1\u01bc\123\0\1\u014f"+
+ "\46\0\1\u01bd\156\0\1\u01be\37\0\6\u0153\3\0\1\u0153"+
+ "\3\0\6\u0153\13\0\1\u0153\1\0\1\u0153\1\0\26\u0153"+
+ "\4\0\4\u0153\3\0\3\u0153\25\0\1\u01bf\164\0\1\u01c0"+
+ "\77\0\1\u01c1\51\0\1\u01c2\125\0\1\u01c3\123\0\1\u0159"+
+ "\62\0\1\u01c4\65\0\1\17\2\0\1\17\4\u01c5\1\17"+
+ "\1\0\4\17\2\0\2\17\2\u01c5\17\0\2\17\2\u01c5"+
+ "\3\17\2\u01c5\10\17\1\u01c5\2\17\1\u01c5\3\17\4\0"+
+ "\3\u01c5\1\17\3\0\3\17\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\4\22\1\u01c6\21\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\16\22\1\242\7\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\6\22\1\u01c7\17\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\10\22\1\u01c8\15\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\3\22\1\u0162\22\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\13\22\1\u01c9\12\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\2\22\1\u01ca\23\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\15\22\1\u01cb\10\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\14\22\1\u01cc\11\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\4\22\1\u01cd\21\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\3\22\1\242\22\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\10\22\1\u01ce\15\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\20\22\1\u01cf\5\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\12\22\1\u01d0\13\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\4\22\1\u016b\21\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\6\22\1\u01d1\17\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\12\22\1\u01d2\13\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+ "\3\0\1\22\1\u016f\1\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\1\u01d3\25\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\4\22\1\u01d4\21\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\23\22\1\374\2\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\11\22\1\u01d5\14\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\3\22\1\374\22\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\5\22\1\u01d6\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\26\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\7\22"+
+ "\1\360\16\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\6\22\1\u01d7\17\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u01d8"+
+ "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\1\u0179\25\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\6\22\1\u01d9\17\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\3\22\1\u01da\22\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\7\22\1\u01db\16\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\3\22\1\250\22\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\12\22\1\u01dc\13\22"+
+ "\4\0\4\22\3\0\3\22\42\0\1\u0188\5\0\1\u0127"+
+ "\45\0\6\u0187\1\0\1\u01dd\1\0\1\u01dd\2\u0187\1\u01dd"+
+ "\4\u0187\2\u01dd\1\0\2\u01dd\1\0\1\u01dd\2\0\6\u01dd"+
+ "\1\u0187\1\u01dd\26\u0187\1\0\1\u01dd\1\0\1\u01dd\4\u0187"+
+ "\3\u01dd\3\u0187\17\0\1\u01de\141\0\1\u01df\123\0\1\u01e0"+
+ "\104\0\1\u0198\1\0\1\u01e1\44\0\1\u01e2\161\0\1\u01e3"+
+ "\74\0\1\u01e4\116\0\1\u01e5\114\0\1\u01e6\103\0\1\u0198"+
+ "\115\0\1\u0197\103\0\1\u01e7\116\0\1\u01e8\113\0\1\u0133"+
+ "\120\0\1\u01e9\77\0\1\u0195\123\0\1\u0195\103\0\1\u01ea"+
+ "\122\0\1\u01eb\35\0\1\u01ec\111\0\1\u01ed\155\0\1\u01ee"+
+ "\104\0\1\u01ef\111\0\1\u01f0\130\0\1\u01f1\66\0\1\u0195"+
+ "\125\0\1\u01f2\75\0\1\u01f3\121\0\1\u01f4\117\0\1\u01f5"+
+ "\114\0\1\u0198\100\0\1\u01f6\121\0\1\u0195\107\0\1\u01f7"+
+ "\100\0\1\u01f8\114\0\1\u01f9\104\0\1\u01fa\116\0\1\u01fb"+
+ "\122\0\1\u0195\77\0\1\u0195\110\0\1\u01fc\105\0\1\u01fd"+
+ "\120\0\1\u01e8\102\0\1\u01a2\134\0\1\u01fe\71\0\1\u01ff"+
+ "\14\0\1\u0200\77\0\1\u0198\113\0\1\u0201\103\0\1\u0202"+
+ "\103\0\1\u01bc\5\0\1\u014f\45\0\6\u01bb\1\0\1\u0203"+
+ "\1\0\1\u0203\2\u01bb\1\u0203\4\u01bb\2\u0203\1\0\2\u0203"+
+ "\1\0\1\u0203\2\0\6\u0203\1\u01bb\1\u0203\26\u01bb\1\0"+
+ "\1\u0203\1\0\1\u0203\4\u01bb\3\u0203\3\u01bb\17\0\1\u0204"+
+ "\143\0\1\u0205\120\0\1\u0206\132\0\1\u0207\52\0\1\u01c3"+
+ "\5\0\1\u0159\45\0\6\u01c2\1\0\1\u0208\1\0\1\u0208"+
+ "\2\u01c2\1\u0208\4\u01c2\2\u0208\1\0\2\u0208\1\0\1\u0208"+
+ "\2\0\6\u0208\1\u01c2\1\u0208\26\u01c2\1\0\1\u0208\1\0"+
+ "\1\u0208\4\u01c2\3\u0208\3\u01c2\17\0\1\u0209\73\0\1\17"+
+ "\2\0\1\17\4\u020a\1\17\1\0\4\17\2\0\2\17"+
+ "\2\u020a\17\0\2\17\2\u020a\3\17\2\u020a\10\17\1\u020a"+
+ "\2\17\1\u020a\3\17\4\0\3\u020a\1\17\3\0\3\17"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\1\u020b\25\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\1\u020c\25\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\5\22\1\242\20\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\4\22"+
+ "\1\u020d\21\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\10\22\1\u020e\15\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\22\22"+
+ "\1\242\3\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\12\22\1\u020f\13\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\12\22"+
+ "\1\u0210\13\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\6\22\1\u016f\17\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\17\22"+
+ "\1\371\6\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\u0211\1\17\26\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\10\22\1\u0212\15\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\12\22\1\u0213\13\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\22\22\1\u0214\3\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\11\22\1\361\14\22\4\0\4\22\3\0\3\22"+
+ "\1\0\1\17\2\0\6\22\1\0\1\17\1\161\2\22"+
+ "\2\0\4\22\17\0\1\22\1\17\7\22\1\u016b\16\22"+
+ "\4\0\4\22\3\0\3\22\1\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\2\22\1\u0215\1\22"+
+ "\17\0\1\22\1\17\26\22\4\0\4\22\3\0\2\22"+
+ "\1\u0216\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\11\22\1\374"+
+ "\14\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\5\22\1\u0217\20\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u0218"+
+ "\15\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\7\22\1\u0219\16\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\10\22\1\u021a"+
+ "\15\22\4\0\4\22\3\0\3\22\17\0\1\u0187\146\0"+
+ "\1\u021b\117\0\1\u01af\107\0\1\u0195\106\0\1\u0133\116\0"+
+ "\1\u01f9\103\0\1\u021c\107\0\1\u021d\107\0\1\u0198\107\0"+
+ "\1\u021e\121\0\1\u01b0\116\0\1\u0198\113\0\1\u021f\106\0"+
+ "\1\u0220\101\0\1\u0221\115\0\1\u0222\102\0\1\u0223\112\0"+
+ "\1\u0224\112\0\1\u0225\112\0\1\u0226\110\0\1\u0195\126\0"+
+ "\1\u01e2\75\0\1\u0227\111\0\1\u0228\117\0\1\u0229\103\0"+
+ "\1\u0133\105\0\1\u0134\115\0\1\u0195\105\0\1\u022a\113\0"+
+ "\1\u022b\115\0\1\u022c\46\0\1\u022d\146\0\1\u022e\117\0"+
+ "\1\u022f\111\0\1\u0230\103\0\1\u0231\121\0\1\u0232\52\0"+
+ "\1\u01bb\154\0\1\u0233\113\0\1\u0234\127\0\1\u0235\26\0"+
+ "\1\u01c2\73\0\1\17\2\0\1\17\4\22\1\17\1\0"+
+ "\4\17\2\0\2\17\2\22\17\0\2\17\2\22\3\17"+
+ "\2\22\10\17\1\22\2\17\1\22\3\17\4\0\3\22"+
+ "\1\17\3\0\3\17\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\5\22\1\u016b\20\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\u0162\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\14\22\1\u0236\11\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\6\22\1\u0237\17\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\5\22\1\374"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\26\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\6\22\1\u0238\17\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\3\22"+
+ "\1\u01cf\22\22\4\0\4\22\3\0\3\22\1\0\1\17"+
+ "\2\0\6\22\1\0\1\17\1\161\2\22\2\0\4\22"+
+ "\17\0\1\22\1\17\5\22\1\372\20\22\4\0\4\22"+
+ "\3\0\3\22\1\0\1\17\2\0\6\22\1\0\1\17"+
+ "\1\161\2\22\2\0\4\22\17\0\1\22\1\17\1\u0239"+
+ "\25\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\7\22\1\u023a\16\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\12\22\1\u023b"+
+ "\13\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\3\22\1\u023c\22\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\14\22\1\u023d"+
+ "\11\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\21\22\1\242\4\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\u0219"+
+ "\22\22\4\0\4\22\3\0\3\22\52\0\1\u023e\117\0"+
+ "\1\u0228\77\0\1\u023f\115\0\1\u0240\113\0\1\u0241\115\0"+
+ "\1\u0242\111\0\1\u0243\103\0\1\u01b7\105\0\1\u0244\130\0"+
+ "\1\u0245\72\0\1\u01a3\3\0\1\u0246\115\0\1\u0247\113\0"+
+ "\1\u01fa\102\0\1\u0198\110\0\1\u0133\116\0\1\u0195\122\0"+
+ "\1\u0248\76\0\1\u0249\113\0\1\u01f2\105\0\1\u0133\113\0"+
+ "\1\u024a\110\0\1\u024b\110\0\1\u0202\122\0\1\u01e1\101\0"+
+ "\1\u024c\40\0\26\u0234\1\u0195\63\u0234\102\0\1\u024d\7\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\u024e\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\12\22\1\u016b\13\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\12\22\1\u024f\13\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\5\22\1\374\20\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\14\22\1\u0250\11\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\3\22\1\u016f\22\22\4\0\4\22\3\0\3\22\1\0"+
+ "\1\17\2\0\6\22\1\0\1\17\1\161\2\22\2\0"+
+ "\4\22\17\0\1\22\1\17\6\22\1\u0121\17\22\4\0"+
+ "\4\22\3\0\3\22\1\0\1\17\2\0\6\22\1\0"+
+ "\1\17\1\161\2\22\2\0\4\22\17\0\1\22\1\17"+
+ "\12\22\1\242\13\22\4\0\4\22\3\0\3\22\62\0"+
+ "\1\u0241\102\0\1\u01f2\125\0\1\u0195\112\0\1\u0195\76\0"+
+ "\1\u0240\107\0\1\u01a9\112\0\1\u0251\46\0\1\u0252\157\0"+
+ "\1\u0253\100\0\1\u0196\111\0\1\u024a\114\0\1\u0254\111\0"+
+ "\1\u0240\116\0\1\u0255\135\0\1\u0256\10\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\10\22\1\u0257\15\22\4\0\4\22\3\0"+
+ "\3\22\1\0\1\17\2\0\6\22\1\0\1\17\1\161"+
+ "\2\22\2\0\4\22\17\0\1\22\1\17\3\22\1\371"+
+ "\22\22\4\0\4\22\3\0\3\22\1\0\1\17\2\0"+
+ "\6\22\1\0\1\17\1\161\2\22\2\0\4\22\17\0"+
+ "\1\22\1\17\1\u023b\25\22\4\0\4\22\3\0\3\22"+
+ "\50\0\1\u01b0\114\0\1\u0258\117\0\1\u01f2\104\0\1\u01af"+
+ "\103\0\1\u0259\142\0\1\u025a\13\0\1\17\2\0\6\22"+
+ "\1\0\1\17\1\161\2\22\2\0\4\22\17\0\1\22"+
+ "\1\17\26\22\4\0\4\22\3\0\1\u023c\2\22\51\0"+
+ "\1\u025b\115\0\1\u0234\104\0\1\u0195\11\0\1\u01f9\30\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[40034];
+ 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 =
+ "\13\0\2\1\1\0\2\1\1\11\4\1\1\11\4\1"+
+ "\2\11\4\1\1\11\22\1\2\11\3\1\1\11\1\1"+
+ "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\5\1"+
+ "\1\11\10\1\1\11\2\1\1\11\2\1\1\11\1\1"+
+ "\1\11\5\1\1\11\2\1\1\11\1\1\3\11\3\1"+
+ "\3\11\1\1\1\11\15\1\2\0\1\11\3\1\2\0"+
+ "\1\11\62\1\1\11\2\1\1\11\4\0\1\11\2\0"+
+ "\1\11\26\0\3\1\2\11\5\0\1\11\2\0\2\1"+
+ "\1\0\73\1\60\0\1\1\2\0\1\11\5\0\1\11"+
+ "\1\1\1\11\45\1\1\0\1\11\1\0\1\1\15\0"+
+ "\1\11\45\0\1\1\3\0\1\11\2\0\1\1\1\0"+
+ "\1\11\30\1\15\0\1\1\20\0\1\1\16\0\21\1"+
+ "\33\0\11\1\4\0\1\1\12\0\3\1\6\0\1\1"+
+ "\2\0\1\11\1\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[603];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -8;
+
+ /**
+ * Token type specifying we're in a JavaScript documentation comment.
+ */
+ private static final int INTERNAL_IN_JS_COMMENT_DOCUMENTATION = -9;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -10;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -13;
+
+ private static final int INTERNAL_E4X = -14;
+
+ private static final int INTERNAL_E4X_INTAG = -15;
+
+ private static final int INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION = -16;
+
+ private static final int INTERNAL_IN_E4X_COMMENT = -17;
+
+ private static final int INTERNAL_E4X_DTD = -18;
+
+ private static final int INTERNAL_E4X_DTD_INTERNAL = -19;
+
+ private static final int INTERNAL_E4X_ATTR_SINGLE = -20;
+
+ private static final int INTERNAL_E4X_ATTR_DOUBLE = -21;
+
+ private static final int INTERNAL_E4X_MARKUP_CDATA = -22;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Whether we're in an internal DTD. Only valid if in an e4x DTD.
+ */
+ private boolean e4x_inInternalDtd;
+
+ /**
+ * The previous e4x state. Only valid if in an e4x state.
+ */
+ private int e4x_prevState;
+
+ /**
+ * The version of JavaScript being highlighted.
+ */
+ private static String jsVersion;
+
+ /**
+ * Whether e4x is being highlighted.
+ */
+ private static boolean e4xSupported;
+
+ /**
+ * Language state set on JS tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on E4X tokens.
+ */
+ private static final int LANG_INDEX_E4X = 1;
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JavaScriptTokenMaker() {
+ super();
+ }
+
+
+ static {
+ jsVersion = "1.0";
+ e4xSupported = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the closest {@link TokenTypes "standard" token type} for a given
+ * "internal" token type (e.g. one whose value is <code>< 0</code>).
+ *
+ */
+ public int getClosestStandardTokenTypeForInternalType(int type) {
+ switch (type) {
+ case INTERNAL_IN_JS_MLC:
+ return TokenTypes.COMMENT_MULTILINE;
+ case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+ return TokenTypes.COMMENT_DOCUMENTATION;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ case INTERNAL_IN_JS_STRING_VALID:
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ case INTERNAL_IN_JS_CHAR_VALID:
+ return TokenTypes.LITERAL_STRING_DOUBLE_QUOTE;
+ }
+ return type;
+ }
+
+
+ /**
+ * Returns the JavaScript version being highlighted.
+ *
+ * @return Supported JavaScript version.
+ * @see #isJavaScriptCompatible(String)
+ */
+ public static String getJavaScriptVersion() {
+ return jsVersion;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ validJSString = true;
+ e4x_prevState = YYINITIAL;
+ e4x_inInternalDtd = false;
+ int languageIndex = LANG_INDEX_DEFAULT;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ break;
+ case INTERNAL_IN_JS_COMMENT_DOCUMENTATION:
+ state = JS_DOCCOMMENT;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ break;
+ case INTERNAL_E4X:
+ state = E4X;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_INTAG:
+ state = E4X_INTAG;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION:
+ state = E4X_PI;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_DTD:
+ state = E4X_DTD;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_DTD_INTERNAL:
+ state = E4X_DTD;
+ e4x_inInternalDtd = true;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_ATTR_SINGLE:
+ state = E4X_INATTR_SINGLE;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_ATTR_DOUBLE:
+ state = E4X_INATTR_DOUBLE;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ case INTERNAL_E4X_MARKUP_CDATA:
+ state = E4X_CDATA;
+ languageIndex = LANG_INDEX_E4X;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_E4X_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_E4X_COMMENT:
+ state = E4X_COMMENT;
+ break;
+ }
+ e4x_prevState = -initialTokenType&0xff;
+ languageIndex = LANG_INDEX_E4X;
+ }
+ else { // Shouldn't happen
+ state = Token.NULL;
+ }
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether e4x is being highlighted.
+ *
+ * @return Whether e4x is being highlighted.
+ * @see #setE4xSupported(boolean)
+ */
+ public static boolean isE4xSupported() {
+ return e4xSupported;
+ }
+
+
+ /**
+ * Returns whether features for a specific JS version should be honored
+ * while highlighting.
+ *
+ * @param version JavaScript version required
+ * @return Whether the JavaScript version is the same or greater than
+ * version required.
+ */
+ public static boolean isJavaScriptCompatible(String version) {
+ return jsVersion.compareTo(version) >= 0;
+ }
+
+
+ /**
+ * Sets whether e4x should be highlighted. A repaint should be forced on
+ * all <code>RSyntaxTextArea</code>s editing JavaScript if this property
+ * is changed to see the difference.
+ *
+ * @param supported Whether e4x should be highlighted.
+ * @see #isE4xSupported()
+ */
+ public static void setE4xSupported(boolean supported) {
+ e4xSupported = supported;
+ }
+
+
+ /**
+ * Set the supported JavaScript version because some keywords were
+ * introduced on or after this version.
+ *
+ * @param javaScriptVersion The version of JavaScript to support, such as
+ * "<code>1.5</code>" or "<code>1.6</code>".
+ * @see #isJavaScriptCompatible(String)
+ * @see #getJavaScriptVersion()
+ */
+ public static void setJavaScriptVersion(String javaScriptVersion) {
+ jsVersion = javaScriptVersion;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public JavaScriptTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public JavaScriptTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 172) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 34:
+ { start = zzMarkedPos-1; yybegin(E4X_INATTR_SINGLE);
+ }
+ case 73: break;
+ case 33:
+ { start = zzMarkedPos-1; yybegin(E4X_INATTR_DOUBLE);
+ }
+ case 74: break;
+ case 36:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 75: break;
+ case 71:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 76: break;
+ case 26:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken;
+ }
+ case 77: break;
+ case 15:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ case 78: break;
+ case 3:
+ { addToken(Token.WHITESPACE);
+ }
+ case 79: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 80: break;
+ case 41:
+ { int start = zzStartRead;
+ int operatorLen = yycharat(0)=='+' ? 2 : 1;
+ int yylen = yylength(); // Cache before first addToken() invalidates it
+ //System.out.println("'" + yytext() + "': " + yylength() + ", " + (operatorLen+1));
+ addToken(zzStartRead,zzStartRead+operatorLen-1, Token.OPERATOR);
+ if (yylen>operatorLen+1) {
+ //System.out.println((start+operatorLen) + ", " + (zzMarkedPos-2));
+ addToken(start+operatorLen,zzMarkedPos-2, Token.WHITESPACE);
+ }
+ zzStartRead = zzCurrentPos = zzMarkedPos = zzMarkedPos - 1;
+ if (isE4xSupported()) {
+ // Scanning will continue with "<" as markup tag start
+ yybegin(E4X, LANG_INDEX_E4X);
+ }
+ // Found e4x (or syntax error) but option not enabled;
+ // Scanning will continue at "<" as operator
+ }
+ case 81: break;
+ case 64:
+ { addToken(Token.FUNCTION);
+ }
+ case 82: break;
+ case 49:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+ }
+ case 83: break;
+ case 44:
+ { /* Skip all escaped chars. */
+ }
+ case 84: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 85: break;
+ case 68:
+ { start = zzStartRead; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT);
+ }
+ case 86: break;
+ case 60:
+ { int temp=zzStartRead; yybegin(E4X); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+ }
+ case 87: break;
+ case 58:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(E4X_INTAG);
+ }
+ case 88: break;
+ case 46:
+ { /* Invalid latin-1 character \xXX */ validJSString = false;
+ }
+ case 89: break;
+ case 61:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 90: break;
+ case 52:
+ { start = zzMarkedPos-2; yybegin(E4X_PI);
+ }
+ case 91: break;
+ case 35:
+ { yybegin(E4X_INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 92: break;
+ case 13:
+ { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+ }
+ case 93: break;
+ case 19:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 94: break;
+ case 23:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT); addToken(Token.IDENTIFIER);
+ }
+ case 95: break;
+ case 45:
+ { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+ }
+ case 96: break;
+ case 70:
+ { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; e4x_prevState = zzLexicalState; yybegin(E4X_COMMENT);
+ }
+ case 97: break;
+ case 63:
+ { if(e4xSupported){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 98: break;
+ case 59:
+ { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(e4x_prevState);
+ }
+ case 99: break;
+ case 7:
+ { addToken(Token.OPERATOR);
+ }
+ case 100: break;
+ case 53:
+ { yybegin(E4X); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 101: break;
+ case 48:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+ }
+ case 102: break;
+ case 18:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 103: break;
+ case 25:
+ { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 104: break;
+ case 5:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 105: break;
+ case 42:
+ { addToken(isE4xSupported() ? Token.MARKUP_TAG_ATTRIBUTE : Token.ERROR_IDENTIFIER);
+ }
+ case 106: break;
+ case 65:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 107: break;
+ case 55:
+ { start = zzMarkedPos-3; yybegin(JS_DOCCOMMENT);
+ }
+ case 108: break;
+ case 9:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+ }
+ case 109: break;
+ case 51:
+ { start = zzMarkedPos-2; e4x_inInternalDtd = false; yybegin(E4X_DTD);
+ }
+ case 110: break;
+ case 24:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken;
+ }
+ case 111: break;
+ case 10:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+ }
+ case 112: break;
+ case 28:
+ { e4x_inInternalDtd = true;
+ }
+ case 113: break;
+ case 67:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+ }
+ case 114: break;
+ case 40:
+ { start = zzMarkedPos-2; yybegin(JS_MLC);
+ }
+ case 115: break;
+ case 38:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 116: break;
+ case 72:
+ { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(E4X_CDATA);
+ }
+ case 117: break;
+ case 31:
+ { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+ }
+ case 118: break;
+ case 2:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 119: break;
+ case 69:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+ }
+ case 120: break;
+ case 32:
+ { yybegin(E4X); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 121: break;
+ case 22:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 122: break;
+ case 56:
+ { if(isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 123: break;
+ case 62:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 124: break;
+ case 4:
+ { addNullToken(); return firstToken;
+ }
+ case 125: break;
+ case 43:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 126: break;
+ case 47:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 127: break;
+ case 57:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 128: break;
+ case 21:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(E4X_INTAG);
+ }
+ case 129: break;
+ case 8:
+ { addToken(Token.SEPARATOR);
+ }
+ case 130: break;
+ case 30:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 131: break;
+ case 66:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+ }
+ case 132: break;
+ case 16:
+ { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(YYINITIAL);
+ }
+ case 133: break;
+ case 39:
+ { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+ }
+ case 134: break;
+ case 20:
+ { addEndToken(INTERNAL_E4X); return firstToken;
+ }
+ case 135: break;
+ case 12:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ case 136: break;
+ case 37:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 137: break;
+ case 50:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(E4X_INTAG);
+ }
+ case 138: break;
+ case 54:
+ { boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 139: break;
+ case 27:
+ { if (!e4x_inInternalDtd) { yybegin(E4X); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ }
+ case 140: break;
+ case 6:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 141: break;
+ case 29:
+ { e4x_inInternalDtd = false;
+ }
+ case 142: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 143: break;
+ case 1:
+ {
+ }
+ case 144: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case JS_STRING: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 604: break;
+ case E4X: {
+ addEndToken(INTERNAL_E4X); return firstToken;
+ }
+ case 605: break;
+ case E4X_INTAG: {
+ addToken(start,zzStartRead-1, INTERNAL_E4X_INTAG); return firstToken;
+ }
+ case 606: break;
+ case E4X_PI: {
+ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); addEndToken(INTERNAL_E4X_MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 607: break;
+ case JS_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 608: break;
+ case JS_CHAR: {
+ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 609: break;
+ case JS_EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 610: break;
+ case E4X_COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_E4X_COMMENT - e4x_prevState); return firstToken;
+ }
+ case 611: break;
+ case JS_DOCCOMMENT: {
+ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_IN_JS_COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 612: break;
+ case E4X_DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(e4x_inInternalDtd ? INTERNAL_E4X_DTD_INTERNAL : INTERNAL_E4X_DTD); return firstToken;
+ }
+ case 613: break;
+ case E4X_INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_SINGLE); return firstToken;
+ }
+ case 614: break;
+ case E4X_INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_E4X_ATTR_DOUBLE); return firstToken;
+ }
+ case 615: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 616: break;
+ case E4X_CDATA: {
+ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addEndToken(INTERNAL_E4X_MARKUP_CDATA); return firstToken;
+ }
+ case 617: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex
new file mode 100644
index 0000000..2bfb4db
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex
@@ -0,0 +1,754 @@
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JavaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class JavaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JavaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = ([A-Za-z])
+LetterOrUnderscore = ({Letter}|"_")
+Underscores = ([_]+)
+NonzeroDigit = ([1-9])
+BinaryDigit = ([0-1])
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+UnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
+StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+MLCBegin = "/*"
+MLCEnd = "*/"
+DocCommentBegin = "/**"
+LineCommentBegin = "//"
+
+DigitOrUnderscore = ({Digit}|[_])
+DigitsAndUnderscoresEnd = ({DigitOrUnderscore}*{Digit})
+IntegerHelper = (({NonzeroDigit}{DigitsAndUnderscoresEnd}?)|"0")
+IntegerLiteral = ({IntegerHelper}[lL]?)
+
+BinaryDigitOrUnderscore = ({BinaryDigit}|[_])
+BinaryDigitsAndUnderscores = ({BinaryDigit}({BinaryDigitOrUnderscore}*{BinaryDigit})?)
+BinaryLiteral = ("0"[bB]{BinaryDigitsAndUnderscores})
+
+HexDigitOrUnderscore = ({HexDigit}|[_])
+HexDigitsAndUnderscores = ({HexDigit}({HexDigitOrUnderscore}*{HexDigit})?)
+OctalDigitOrUnderscore = ({OctalDigit}|[_])
+OctalDigitsAndUnderscoresEnd= ({OctalDigitOrUnderscore}*{OctalDigit})
+HexHelper = ("0"(([xX]{HexDigitsAndUnderscores})|({OctalDigitsAndUnderscoresEnd})))
+HexLiteral = ({HexHelper}[lL]?)
+
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+CurrentBlockTag = ("author"|"deprecated"|"exception"|"param"|"return"|"see"|"serial"|"serialData"|"serialField"|"since"|"throws"|"version")
+ProposedBlockTag = ("category"|"example"|"tutorial"|"index"|"exclude"|"todo"|"internal"|"obsolete"|"threadsafety")
+BlockTag = ({CurrentBlockTag}|{ProposedBlockTag})
+InlineTag = ("code"|"docRoot"|"inheritDoc"|"link"|"linkplain"|"literal"|"value")
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+Annotation = ("@"{Identifier}?)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MLC
+%state DOCCOMMENT
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "abstract"|
+ "assert" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "continue" |
+ "default" |
+ "do" |
+ "else" |
+ "enum" |
+ "extends" |
+ "final" |
+ "finally" |
+ "for" |
+ "goto" |
+ "if" |
+ "implements" |
+ "import" |
+ "instanceof" |
+ "interface" |
+ "native" |
+ "new" |
+ "null" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "static" |
+ "strictfp" |
+ "super" |
+ "switch" |
+ "synchronized" |
+ "this" |
+ "throw" |
+ "throws" |
+ "transient" |
+ "try" |
+ "void" |
+ "volatile" |
+ "while" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ /* Data types. */
+ "boolean" |
+ "byte" |
+ "char" |
+ "double" |
+ "float" |
+ "int" |
+ "long" |
+ "short" { addToken(Token.DATA_TYPE); }
+
+ /* Booleans. */
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ /* java.lang classes */
+ "Appendable" |
+ "AutoCloseable" |
+ "CharSequence" |
+ "Cloneable" |
+ "Comparable" |
+ "Iterable" |
+ "Readable" |
+ "Runnable" |
+ "Thread.UncaughtExceptionHandler" |
+ "Boolean" |
+ "Byte" |
+ "Character" |
+ "Character.Subset" |
+ "Character.UnicodeBlock" |
+ "Class" |
+ "ClassLoader" |
+ "Compiler" |
+ "Double" |
+ "Enum" |
+ "Float" |
+ "InheritableThreadLocal" |
+ "Integer" |
+ "Long" |
+ "Math" |
+ "Number" |
+ "Object" |
+ "Package" |
+ "Process" |
+ "ProcessBuilder" |
+ "ProcessBuilder.Redirect" |
+ "Runtime" |
+ "RuntimePermission" |
+ "SecurityManager" |
+ "Short" |
+ "StackTraceElement" |
+ "StrictMath" |
+ "String" |
+ "StringBuffer" |
+ "StringBuilder" |
+ "System" |
+ "Thread" |
+ "ThreadGroup" |
+ "ThreadLocal" |
+ "Throwable" |
+ "Void" |
+ "Character.UnicodeScript" |
+ "ProcessBuilder.Redirect.Type" |
+ "Thread.State" |
+ "ArithmeticException" |
+ "ArrayIndexOutOfBoundsException" |
+ "ArrayStoreException" |
+ "ClassCastException" |
+ "ClassNotFoundException" |
+ "CloneNotSupportedException" |
+ "EnumConstantNotPresentException" |
+ "Exception" |
+ "IllegalAccessException" |
+ "IllegalArgumentException" |
+ "IllegalMonitorStateException" |
+ "IllegalStateException" |
+ "IllegalThreadStateException" |
+ "IndexOutOfBoundsException" |
+ "InstantiationException" |
+ "InterruptedException" |
+ "NegativeArraySizeException" |
+ "NoSuchFieldException" |
+ "NoSuchMethodException" |
+ "NullPointerException" |
+ "NumberFormatException" |
+ "RuntimeException" |
+ "SecurityException" |
+ "StringIndexOutOfBoundsException" |
+ "TypeNotPresentException" |
+ "UnsupportedOperationException" |
+ "AbstractMethodError" |
+ "AssertionError" |
+ "ClassCircularityError" |
+ "ClassFormatError" |
+ "Error" |
+ "ExceptionInInitializerError" |
+ "IllegalAccessError" |
+ "IncompatibleClassChangeError" |
+ "InstantiationError" |
+ "InternalError" |
+ "LinkageError" |
+ "NoClassDefFoundError" |
+ "NoSuchFieldError" |
+ "NoSuchMethodError" |
+ "OutOfMemoryError" |
+ "StackOverflowError" |
+ "ThreadDeath" |
+ "UnknownError" |
+ "UnsatisfiedLinkError" |
+ "UnsupportedClassVersionError" |
+ "VerifyError" |
+ "VirtualMachineError" |
+
+ /* java.io classes*/
+ "Closeable" |
+ "DataInput" |
+ "DataOutput" |
+ "Externalizable" |
+ "FileFilter" |
+ "FilenameFilter" |
+ "Flushable" |
+ "ObjectInput" |
+ "ObjectInputValidation" |
+ "ObjectOutput" |
+ "ObjectStreamConstants" |
+ "Serializable" |
+
+ "BufferedInputStream" |
+ "BufferedOutputStream" |
+ "BufferedReader" |
+ "BufferedWriter" |
+ "ByteArrayInputStream" |
+ "ByteArrayOutputStream" |
+ "CharArrayReader" |
+ "CharArrayWriter" |
+ "Console" |
+ "DataInputStream" |
+ "DataOutputStream" |
+ "File" |
+ "FileDescriptor" |
+ "FileInputStream" |
+ "FileOutputStream" |
+ "FilePermission" |
+ "FileReader" |
+ "FileWriter" |
+ "FilterInputStream" |
+ "FilterOutputStream" |
+ "FilterReader" |
+ "FilterWriter" |
+ "InputStream" |
+ "InputStreamReader" |
+ "LineNumberInputStream" |
+ "LineNumberReader" |
+ "ObjectInputStream" |
+ "ObjectInputStream.GetField" |
+ "ObjectOutputStream" |
+ "ObjectOutputStream.PutField" |
+ "ObjectStreamClass" |
+ "ObjectStreamField" |
+ "OutputStream" |
+ "OutputStreamWriter" |
+ "PipedInputStream" |
+ "PipedOutputStream" |
+ "PipedReader" |
+ "PipedWriter" |
+ "PrintStream" |
+ "PrintWriter" |
+ "PushbackInputStream" |
+ "PushbackReader" |
+ "RandomAccessFile" |
+ "Reader" |
+ "SequenceInputStream" |
+ "SerializablePermission" |
+ "StreamTokenizer" |
+ "StringBufferInputStream" |
+ "StringReader" |
+ "StringWriter" |
+ "Writer" |
+
+ "CharConversionException" |
+ "EOFException" |
+ "FileNotFoundException" |
+ "InterruptedIOException" |
+ "InvalidClassException" |
+ "InvalidObjectException" |
+ "IOException" |
+ "NotActiveException" |
+ "NotSerializableException" |
+ "ObjectStreamException" |
+ "OptionalDataException" |
+ "StreamCorruptedException" |
+ "SyncFailedException" |
+ "UnsupportedEncodingException" |
+ "UTFDataFormatException" |
+ "WriteAbortedException" |
+
+ "IOError" |
+
+ /* java.util classes */
+ "Collection" |
+ "Comparator" |
+ "Deque" |
+ "Enumeration" |
+ "EventListener" |
+ "Formattable" |
+ "Iterator" |
+ "List" |
+ "ListIterator" |
+ "Map" |
+ "Map.Entry" |
+ "NavigableMap" |
+ "NavigableSet" |
+ "Observer" |
+ "Queue" |
+ "RandomAccess" |
+ "Set" |
+ "SortedMap" |
+ "SortedSet" |
+
+ "AbstractCollection" |
+ "AbstractList" |
+ "AbstractMap" |
+ "AbstractMap.SimpleEntry" |
+ "AbstractMap.SimpleImmutableEntry" |
+ "AbstractQueue" |
+ "AbstractSequentialList" |
+ "AbstractSet" |
+ "ArrayDeque" |
+ "ArrayList" |
+ "Arrays" |
+ "BitSet" |
+ "Calendar" |
+ "Collections" |
+ "Currency" |
+ "Date" |
+ "Dictionary" |
+ "EnumMap" |
+ "EnumSet" |
+ "EventListenerProxy" |
+ "EventObject" |
+ "FormattableFlags" |
+ "Formatter" |
+ "GregorianCalendar" |
+ "HashMap" |
+ "HashSet" |
+ "Hashtable" |
+ "IdentityHashMap" |
+ "LinkedHashMap" |
+ "LinkedHashSet" |
+ "LinkedList" |
+ "ListResourceBundle" |
+ "Locale" |
+ "Locale.Builder" |
+ "Objects" |
+ "Observable" |
+ "PriorityQueue" |
+ "Properties" |
+ "PropertyPermission" |
+ "PropertyResourceBundle" |
+ "Random" |
+ "ResourceBundle" |
+ "ResourceBundle.Control" |
+ "Scanner" |
+ "ServiceLoader" |
+ "SimpleTimeZone" |
+ "Stack" |
+ "StringTokenizer" |
+ "Timer" |
+ "TimerTask" |
+ "TimeZone" |
+ "TreeMap" |
+ "TreeSet" |
+ "UUID" |
+ "Vector" |
+ "WeakHashMap" |
+
+ "Formatter.BigDecimalLayoutForm" |
+ "Locale.Category" |
+
+ "ConcurrentModificationException" |
+ "DuplicateFormatFlagsException" |
+ "EmptyStackException" |
+ "FormatFlagsConversionMismatchException" |
+ "FormatterClosedException" |
+ "IllegalFormatCodePointException" |
+ "IllegalFormatConversionException" |
+ "IllegalFormatException" |
+ "IllegalFormatFlagsException" |
+ "IllegalFormatPrecisionException" |
+ "IllegalFormatWidthException" |
+ "IllformedLocaleException" |
+ "InputMismatchException" |
+ "InvalidPropertiesFormatException" |
+ "MissingFormatArgumentException" |
+ "MissingFormatWidthException" |
+ "MissingResourceException" |
+ "NoSuchElementException" |
+ "TooManyListenersException" |
+ "UnknownFormatConversionException" |
+ "UnknownFormatFlagsException" |
+
+ "ServiceConfigurationError" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {DocCommentBegin} { start = zzMarkedPos-3; yybegin(DOCCOMMENT); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ /* Annotations. */
+ {Annotation} { addToken(Token.ANNOTATION); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {BinaryLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as identifiers. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<DOCCOMMENT> {
+
+ [^hwf\@\{\n\<\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos; }
+ [hwf] {}
+
+ "@"{BlockTag} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "@" {}
+ "{@"{InlineTag}[^\}]*"}" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos; }
+ "{" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+ "<"[/]?({Letter}[^\>]*)?">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos; }
+ \< {}
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION); }
+ \* {}
+ <<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java
new file mode 100644
index 0000000..3abe535
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JavaTokenMaker.java
@@ -0,0 +1,4966 @@
+/* The following code was generated by JFlex 1.4.1 on 12/10/11 12:57 AM */
+
+/*
+ * 11/13/2004
+ *
+ * JavaTokenMaker.java - Scanner for the Java programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Java programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JavaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class JavaTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 3;
+ public static final int DOCCOMMENT = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\23\1\11\1\0\1\23\1\20\22\0\1\23\1\53\1\16"+
+ "\1\21\1\22\1\53\1\55\1\10\2\77\1\25\1\46\1\45\1\34"+
+ "\1\35\1\24\1\4\1\5\2\17\4\7\2\3\1\56\1\45\1\47"+
+ "\1\50\1\52\1\54\1\76\1\101\1\27\1\6\1\67\1\33\1\32"+
+ "\1\115\1\107\1\104\2\1\1\26\1\110\1\111\1\112\1\114\1\120"+
+ "\1\74\1\102\1\105\1\106\1\116\1\117\1\31\1\1\1\121\1\77"+
+ "\1\12\1\77\1\51\1\2\1\0\1\41\1\30\1\63\1\61\1\40"+
+ "\1\15\1\72\1\57\1\65\1\113\1\75\1\42\1\66\1\14\1\60"+
+ "\1\62\1\103\1\37\1\43\1\36\1\13\1\71\1\70\1\64\1\73"+
+ "\1\100\1\122\1\51\1\44\1\54\uff81\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 =
+ "\4\0\1\1\1\2\2\3\1\2\1\4\1\5\2\2"+
+ "\1\6\1\1\1\7\2\10\5\2\1\10\7\2\1\11"+
+ "\1\2\5\10\11\2\1\12\16\2\1\13\1\14\5\13"+
+ "\1\15\10\13\1\16\3\13\1\1\2\17\1\20\1\3"+
+ "\1\17\1\20\2\17\1\21\2\17\5\2\1\4\1\22"+
+ "\1\0\1\4\7\2\2\6\1\23\1\24\1\25\40\2"+
+ "\1\0\1\10\1\2\1\26\10\2\1\26\14\2\1\12"+
+ "\56\2\2\0\1\27\4\0\1\30\2\0\1\31\22\0"+
+ "\1\1\1\3\1\20\1\0\2\21\1\3\1\21\10\2"+
+ "\1\4\1\32\2\4\1\22\1\4\5\2\1\6\1\33"+
+ "\1\6\1\34\61\2\1\35\17\2\1\1\10\2\1\36"+
+ "\37\2\1\36\30\2\37\0\1\1\2\17\12\2\1\4"+
+ "\3\2\1\6\1\37\3\2\1\36\3\2\1\36\2\2"+
+ "\1\35\4\2\2\36\6\2\1\40\37\2\1\1\51\2"+
+ "\1\0\32\2\2\0\1\41\2\0\1\42\10\0\1\43"+
+ "\17\0\1\44\1\1\2\2\1\36\10\2\1\4\1\26"+
+ "\1\6\35\2\1\26\25\2\1\1\11\2\1\36\27\2"+
+ "\1\36\6\2\1\0\32\2\35\0\1\1\14\2\1\4"+
+ "\1\2\1\6\1\36\33\2\1\45\16\2\1\36\1\1"+
+ "\11\2\1\36\26\2\1\36\10\2\1\0\2\2\1\36"+
+ "\10\2\1\36\13\2\22\0\13\2\1\0\37\2\1\36"+
+ "\2\2\1\1\40\2\1\0\11\2\1\0\23\2\1\36"+
+ "\7\2\2\0\1\43\6\0\12\2\2\0\75\2\2\0"+
+ "\7\2\1\0\33\2\11\0\4\2\1\36\4\2\2\0"+
+ "\5\2\1\36\10\2\1\36\6\2\1\36\43\2\2\0"+
+ "\6\2\1\36\26\2\5\0\4\2\1\0\2\2\1\36"+
+ "\2\0\3\2\1\0\51\2\2\0\27\2\5\0\3\2"+
+ "\2\0\1\2\2\0\3\2\1\0\1\36\11\2\1\36"+
+ "\14\2\1\36\12\2\2\0\14\2\1\36\4\2\2\0"+
+ "\2\2\2\0\1\2\2\0\3\2\1\0\5\2\1\36"+
+ "\3\2\1\0\1\2\1\36\2\2\1\36\16\2\1\0"+
+ "\13\2\1\36\3\2\1\36\4\2\2\0\1\2\1\0"+
+ "\2\2\1\0\2\2\1\36\6\2\1\0\12\2\1\0"+
+ "\21\2\2\0\3\2\1\0\4\2\1\36\1\2\1\0"+
+ "\12\2\1\0\15\2\1\36\2\0\3\2\1\0\3\2"+
+ "\1\0\1\2\1\0\11\2\1\0\12\2\2\0\2\2"+
+ "\1\0\2\2\1\0\1\2\1\0\7\2\1\0\6\2"+
+ "\2\0\1\2\1\0\1\2\1\0\1\2\1\0\4\2"+
+ "\1\0\3\2\1\36\1\2\3\0\1\2\1\0\1\2"+
+ "\1\0\1\2\1\0\2\2\1\0\3\2\1\0\1\36"+
+ "\3\0\1\2\1\0\1\2\2\0\2\2\1\0\2\2"+
+ "\5\0\1\2\1\0\1\2\2\0\1\2\6\0\1\2"+
+ "\1\0\1\2\16\0\1\36\23\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[1725];
+ 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\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+ "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u033e\0\u048a"+
+ "\0\u04dd\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722"+
+ "\0\u0775\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u033e"+
+ "\0\u033e\0\u09ba\0\u0a0d\0\u0a60\0\u033e\0\u0ab3\0\u0b06\0\u0b59"+
+ "\0\u0bac\0\u0bff\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e\0\u0df1"+
+ "\0\u0e44\0\u0e97\0\u0eea\0\u0f3d\0\u0f90\0\u0fe3\0\u1036\0\u1089"+
+ "\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b\0\u12ce\0\u033e"+
+ "\0\u1321\0\u1374\0\u13c7\0\u141a\0\u146d\0\u033e\0\u14c0\0\u1513"+
+ "\0\u1566\0\u15b9\0\u160c\0\u165f\0\u16b2\0\u1705\0\u033e\0\u1758"+
+ "\0\u17ab\0\u17fe\0\u1851\0\u18a4\0\u18f7\0\u18a4\0\u18a4\0\u194a"+
+ "\0\u199d\0\u19f0\0\u1a43\0\u1a96\0\u1ae9\0\u1b3c\0\u1b8f\0\u1be2"+
+ "\0\u1c35\0\u1c88\0\u1cdb\0\u1d2e\0\u033e\0\u1d81\0\u1dd4\0\u1e27"+
+ "\0\u1e7a\0\u1ecd\0\u1f20\0\u1f73\0\u1fc6\0\u2019\0\u206c\0\u20bf"+
+ "\0\u033e\0\u033e\0\u2112\0\u2165\0\u21b8\0\u220b\0\u225e\0\u22b1"+
+ "\0\u2304\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u24a3\0\u24f6\0\u2549"+
+ "\0\u259c\0\u25ef\0\u2642\0\u2695\0\u26e8\0\u273b\0\u278e\0\u27e1"+
+ "\0\u2834\0\u2887\0\u28da\0\u292d\0\u2980\0\u29d3\0\u2a26\0\u2a79"+
+ "\0\u2acc\0\u2b1f\0\u2b72\0\u0530\0\u2bc5\0\u2c18\0\u2c6b\0\u2cbe"+
+ "\0\u2d11\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u2f03\0\u019f"+
+ "\0\u2f56\0\u2fa9\0\u2ffc\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u319b"+
+ "\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d\0\u33e0\0\u3433"+
+ "\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625\0\u3678\0\u36cb"+
+ "\0\u371e\0\u3771\0\u37c4\0\u3817\0\u386a\0\u38bd\0\u3910\0\u3963"+
+ "\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55\0\u3ba8\0\u3bfb"+
+ "\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a\0\u3ded\0\u3e40\0\u3e93"+
+ "\0\u3ee6\0\u3f39\0\u3f8c\0\u3fdf\0\u4032\0\u4085\0\u40d8\0\u412b"+
+ "\0\u417e\0\u41d1\0\u4224\0\u4277\0\u42ca\0\u033e\0\u431d\0\u4370"+
+ "\0\u43c3\0\u4416\0\u033e\0\u4469\0\u44bc\0\u033e\0\u450f\0\u4562"+
+ "\0\u45b5\0\u4608\0\u465b\0\u46ae\0\u4701\0\u4754\0\u47a7\0\u47fa"+
+ "\0\u484d\0\u48a0\0\u48f3\0\u4946\0\u4999\0\u49ec\0\u4a3f\0\u4a92"+
+ "\0\u4ae5\0\u4b38\0\u4b8b\0\u4bde\0\u4c31\0\u18a4\0\u4c84\0\u4cd7"+
+ "\0\u4d2a\0\u4d7d\0\u4dd0\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u4f6f"+
+ "\0\u4fc2\0\u033e\0\u5015\0\u5068\0\u1d81\0\u50bb\0\u510e\0\u5161"+
+ "\0\u51b4\0\u5207\0\u525a\0\u52ad\0\u033e\0\u5300\0\u5353\0\u53a6"+
+ "\0\u53f9\0\u544c\0\u549f\0\u54f2\0\u5545\0\u5598\0\u55eb\0\u563e"+
+ "\0\u5691\0\u56e4\0\u5737\0\u578a\0\u57dd\0\u5830\0\u5883\0\u58d6"+
+ "\0\u5929\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u5ac8\0\u5b1b\0\u5b6e"+
+ "\0\u5bc1\0\u5c14\0\u5c67\0\u5cba\0\u5d0d\0\u5d60\0\u5db3\0\u5e06"+
+ "\0\u5e59\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u5ff8\0\u604b\0\u609e"+
+ "\0\u60f1\0\u6144\0\u6197\0\u61ea\0\u623d\0\u6290\0\u62e3\0\u6336"+
+ "\0\u6389\0\u63dc\0\u642f\0\u6482\0\u64d5\0\u6528\0\u657b\0\u65ce"+
+ "\0\u6621\0\u6674\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866"+
+ "\0\u68b9\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u6a58\0\u6aab\0\u6afe"+
+ "\0\u6b51\0\u019f\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u6d43"+
+ "\0\u6d96\0\u6de9\0\u6e3c\0\u6e8f\0\u6ee2\0\u6f35\0\u6f88\0\u6fdb"+
+ "\0\u702e\0\u7081\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273"+
+ "\0\u72c6\0\u7319\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b"+
+ "\0\u755e\0\u75b1\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3"+
+ "\0\u77f6\0\u7849\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u7a3b"+
+ "\0\u7a8e\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u7c2d\0\u7c80\0\u7cd3"+
+ "\0\u7d26\0\u7d79\0\u7dcc\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b"+
+ "\0\u7fbe\0\u8011\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203"+
+ "\0\u8256\0\u82a9\0\u82fc\0\u834f\0\u83a2\0\u83f5\0\u8448\0\u849b"+
+ "\0\u84ee\0\u8541\0\u8594\0\u85e7\0\u863a\0\u868d\0\u86e0\0\u8733"+
+ "\0\u8786\0\u87d9\0\u4c84\0\u882c\0\u887f\0\u88d2\0\u8925\0\u8978"+
+ "\0\u89cb\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd\0\u8c10"+
+ "\0\u8c63\0\u8cb6\0\u8d09\0\u033e\0\u8d5c\0\u8daf\0\u8e02\0\u8e55"+
+ "\0\u8ea8\0\u8efb\0\u8f4e\0\u8fa1\0\u8ff4\0\u9047\0\u019f\0\u909a"+
+ "\0\u90ed\0\u9140\0\u9193\0\u91e6\0\u9239\0\u928c\0\u92df\0\u9332"+
+ "\0\u9385\0\u93d8\0\u942b\0\u019f\0\u947e\0\u94d1\0\u9524\0\u9577"+
+ "\0\u95ca\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f"+
+ "\0\u9862\0\u98b5\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7"+
+ "\0\u9afa\0\u9b4d\0\u9ba0\0\u9bf3\0\u9c46\0\u9c99\0\u9cec\0\u9d3f"+
+ "\0\u9d92\0\u9de5\0\u9e38\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7"+
+ "\0\ua02a\0\ua07d\0\ua0d0\0\ua123\0\ua176\0\ua1c9\0\ua21c\0\ua26f"+
+ "\0\ua2c2\0\ua315\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507"+
+ "\0\ua55a\0\ua5ad\0\ua600\0\ua653\0\ua6a6\0\ua6f9\0\ua74c\0\ua79f"+
+ "\0\ua7f2\0\ua845\0\ua898\0\ua8eb\0\ua93e\0\ua991\0\ua9e4\0\uaa37"+
+ "\0\uaa8a\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c\0\uaccf"+
+ "\0\uad22\0\uad75\0\uadc8\0\uae1b\0\uae6e\0\uaec1\0\uaf14\0\uaf67"+
+ "\0\uafba\0\ub00d\0\ub060\0\ub0b3\0\ub106\0\ub159\0\ub1ac\0\ub1ff"+
+ "\0\ub252\0\ub2a5\0\ub2f8\0\ub34b\0\ub39e\0\ub3f1\0\ub444\0\ub497"+
+ "\0\ub4ea\0\ub53d\0\ub590\0\ub5e3\0\ub636\0\ub689\0\ub6dc\0\ub72f"+
+ "\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921\0\u033e\0\ub974"+
+ "\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\ubb13\0\ubb66\0\ubbb9\0\ubc0c"+
+ "\0\ubc5f\0\ubcb2\0\ubd05\0\ubd58\0\ubdab\0\ubdfe\0\ube51\0\ubea4"+
+ "\0\ubef7\0\ubf4a\0\ubf9d\0\ubff0\0\uc043\0\uc096\0\uc0e9\0\uc13c"+
+ "\0\uc18f\0\uc1e2\0\uc235\0\uc288\0\uc2db\0\uc32e\0\uc381\0\uc3d4"+
+ "\0\uc427\0\uc47a\0\uc4cd\0\uc520\0\uc573\0\uc5c6\0\uc619\0\uc66c"+
+ "\0\uc6bf\0\uc712\0\uc765\0\uc7b8\0\uc80b\0\uc85e\0\uc8b1\0\uc904"+
+ "\0\uc957\0\uc9aa\0\uc9fd\0\uca50\0\ucaa3\0\ucaf6\0\ucb49\0\ucb9c"+
+ "\0\ucbef\0\ucc42\0\ucc95\0\u5bc1\0\ucce8\0\ucd3b\0\ucd8e\0\ucde1"+
+ "\0\uce34\0\uce87\0\uceda\0\ucf2d\0\ucf80\0\ucfd3\0\ud026\0\ud079"+
+ "\0\ud0cc\0\ud11f\0\ud172\0\ud1c5\0\ud218\0\ud26b\0\ud2be\0\ud311"+
+ "\0\ud364\0\ud3b7\0\ud40a\0\ud45d\0\ud4b0\0\ud503\0\ud556\0\ud5a9"+
+ "\0\ud5fc\0\ud64f\0\ud6a2\0\ud6f5\0\ud748\0\ud79b\0\ud7ee\0\ud841"+
+ "\0\ud894\0\ud8e7\0\ud93a\0\ud98d\0\ud9e0\0\uda33\0\uda86\0\udad9"+
+ "\0\udb2c\0\udb7f\0\udbd2\0\udc25\0\udc78\0\udccb\0\udd1e\0\udd71"+
+ "\0\uddc4\0\ude17\0\ude6a\0\udebd\0\udf10\0\udf63\0\udfb6\0\ue009"+
+ "\0\ue05c\0\ue0af\0\ue102\0\ue155\0\ue1a8\0\ue1fb\0\ue24e\0\ue2a1"+
+ "\0\ue2f4\0\ue347\0\ue39a\0\ue3ed\0\ue440\0\ue493\0\ue4e6\0\ue539"+
+ "\0\ue58c\0\ue5df\0\ue632\0\ue685\0\ue6d8\0\ue72b\0\ue77e\0\ue7d1"+
+ "\0\ue824\0\ue877\0\ue8ca\0\ue91d\0\ue970\0\ue9c3\0\ub590\0\uea16"+
+ "\0\ub689\0\uea69\0\ueabc\0\ueb0f\0\ueb62\0\uebb5\0\uec08\0\uec5b"+
+ "\0\uecae\0\ued01\0\ued54\0\ueda7\0\uedfa\0\uee4d\0\ueea0\0\ueef3"+
+ "\0\uef46\0\uef99\0\uefec\0\uf03f\0\uf092\0\uf0e5\0\uf138\0\uf18b"+
+ "\0\uf1de\0\ube51\0\uf231\0\uf284\0\uf2d7\0\uf32a\0\uf37d\0\uf3d0"+
+ "\0\uf423\0\uf476\0\uf4c9\0\uf51c\0\uf56f\0\uf5c2\0\uf615\0\uf668"+
+ "\0\uf6bb\0\uf70e\0\uf761\0\uf7b4\0\uf807\0\uf85a\0\uf8ad\0\uf900"+
+ "\0\uf953\0\uf9a6\0\uf9f9\0\ufa4c\0\ufa9f\0\ufaf2\0\ufb45\0\ufb98"+
+ "\0\ufbeb\0\ufc3e\0\ufc91\0\ufce4\0\ufd37\0\ufd8a\0\ufddd\0\ufe30"+
+ "\0\ufe83\0\ufed6\0\uff29\0\uff7c\0\uffcf\1\42\0\u019f\1\165"+
+ "\1\310\1\u011b\1\u016e\1\u01c1\1\u0214\1\u0267\1\u02ba\1\u030d"+
+ "\1\u0360\1\u03b3\1\u0406\1\u0459\1\u04ac\1\u04ff\1\u0552\1\u05a5"+
+ "\1\u05f8\1\u064b\1\u069e\1\u06f1\1\u0744\1\u0797\1\u07ea\1\u083d"+
+ "\1\u0890\1\u08e3\1\u0936\1\u0989\1\u09dc\1\u0a2f\1\u0a82\1\u0ad5"+
+ "\1\u0b28\1\u0b7b\1\u0bce\1\u0c21\1\u0c74\1\u0cc7\1\u0d1a\1\u0d6d"+
+ "\1\u0dc0\1\u0e13\1\u0e66\1\u0eb9\1\u0f0c\1\u0f5f\1\u0fb2\1\u1005"+
+ "\1\u1058\1\u10ab\1\u10fe\1\u1151\1\u11a4\1\u11f7\1\u124a\1\u129d"+
+ "\1\u12f0\1\u1343\1\u1396\1\u13e9\1\u143c\1\u148f\1\u14e2\1\u1535"+
+ "\1\u1588\1\u15db\1\u162e\1\u1681\1\u16d4\1\u1727\1\u177a\1\u17cd"+
+ "\1\u1820\1\u1873\1\u18c6\1\u1919\1\u196c\1\u19bf\1\u1a12\1\u1a65"+
+ "\1\u1ab8\1\u1b0b\1\u1b5e\1\u1bb1\1\u1c04\1\u1c57\1\u1caa\1\u1cfd"+
+ "\1\u1d50\1\u1da3\1\u1df6\1\u1e49\1\u1e9c\1\u1eef\1\u1f42\1\u1f95"+
+ "\1\u1fe8\1\u203b\1\u208e\1\u20e1\1\u2134\1\u2187\1\u21da\1\u222d"+
+ "\1\u2280\1\u22d3\1\u2326\1\u2379\1\u23cc\1\u241f\1\u2472\1\u24c5"+
+ "\1\u2518\1\u256b\1\u25be\1\u2611\1\u2664\1\u26b7\1\u270a\1\u275d"+
+ "\1\u27b0\1\u2803\1\u2856\1\u28a9\1\u28fc\1\u294f\1\u29a2\1\u29f5"+
+ "\1\u2a48\1\u2a9b\1\u2aee\1\u2b41\1\u2b94\1\u2be7\1\u2c3a\1\u2c8d"+
+ "\1\u2ce0\1\u2d33\1\u2d86\1\u2dd9\1\u2e2c\1\u2e7f\1\u2ed2\1\u2f25"+
+ "\1\u2f78\1\u2fcb\1\u301e\1\u3071\1\u30c4\1\u3117\1\u316a\1\u31bd"+
+ "\1\u3210\1\u3263\1\u32b6\1\u3309\1\u335c\1\u33af\1\u3402\1\u3455"+
+ "\1\u34a8\1\u34fb\1\u354e\1\u35a1\1\u35f4\1\u3647\1\u369a\1\u36ed"+
+ "\1\u3740\1\u3793\1\u37e6\1\u3839\1\u388c\1\u38df\1\u3932\1\u3985"+
+ "\1\u39d8\1\u3a2b\1\u3a7e\1\u3ad1\1\u3b24\1\u3b77\1\u3bca\1\u3c1d"+
+ "\1\u3c70\1\u3cc3\1\u13e9\1\u3d16\1\u3d69\1\u3dbc\1\u3e0f\1\u3e62"+
+ "\1\u3eb5\1\u3f08\1\u3f5b\1\u3fae\1\u4001\1\u4054\1\u40a7\1\u40fa"+
+ "\1\u414d\1\u41a0\1\u41f3\1\u4246\1\u4299\1\u42ec\1\u433f\1\u4392"+
+ "\1\u43e5\1\u4438\1\u448b\1\u44de\1\u4531\1\u4584\1\u45d7\1\u462a"+
+ "\1\u467d\1\u46d0\1\u4723\1\u4776\1\u47c9\1\u481c\1\u486f\1\u48c2"+
+ "\1\u4915\1\u4968\1\u49bb\1\u4a0e\1\u4a61\1\u4ab4\1\u4b07\1\u4b5a"+
+ "\1\u4bad\1\u4c00\1\u4c53\1\u4ca6\1\u4cf9\1\u4d4c\1\u4d9f\1\u4df2"+
+ "\1\u4e45\1\u4e98\1\u4eeb\1\u4f3e\1\u4f91\1\u4fe4\1\u5037\1\u508a"+
+ "\1\u50dd\1\u5130\1\u5183\1\u51d6\1\u5229\1\u527c\1\u52cf\1\u5322"+
+ "\1\u5375\1\u53c8\1\u541b\1\u546e\1\u54c1\1\u5514\1\u5567\1\u55ba"+
+ "\1\u560d\1\u5660\1\u56b3\1\u5706\1\u5759\1\u57ac\1\u57ff\1\u5852"+
+ "\1\u58a5\1\u58f8\1\u594b\1\u599e\1\u59f1\1\u5a44\1\u5a97\1\u5aea"+
+ "\1\u5b3d\1\u5b90\1\u5be3\1\u5c36\1\u5c89\1\u5cdc\1\u5d2f\1\u5d82"+
+ "\1\u5dd5\1\u5e28\1\u5e7b\1\u5ece\1\u5f21\1\u5f74\1\u5fc7\1\u601a"+
+ "\1\u606d\1\u60c0\1\u6113\1\u6166\1\u61b9\1\u620c\1\u625f\1\u62b2"+
+ "\1\u6305\1\u6358\1\u63ab\1\u63fe\1\u6451\1\u64a4\1\u64f7\1\u654a"+
+ "\1\u659d\1\u65f0\1\u6643\1\u6696\1\u66e9\1\u673c\1\u678f\1\u67e2"+
+ "\1\u6835\1\u6888\1\u68db\1\u692e\1\u6981\1\u69d4\1\u6a27\1\u6a7a"+
+ "\1\u6acd\1\u6b20\1\u6b73\1\u6bc6\1\u6c19\1\u6c6c\1\u6cbf\1\u6d12"+
+ "\1\u6d65\1\u6db8\1\u6e0b\1\u6e5e\1\u6eb1\1\u6f04\1\u6f57\1\u6faa"+
+ "\1\u6ffd\1\u7050\1\u70a3\1\u70f6\1\u7149\1\u719c\1\u71ef\1\u7242"+
+ "\1\u7295\1\u72e8\1\u733b\1\u738e\1\u73e1\1\u7434\1\u7487\1\u74da"+
+ "\1\u752d\1\u7580\1\u75d3\1\u7626\1\u7679\1\u76cc\1\u771f\1\u7772"+
+ "\1\u77c5\1\u7818\1\u786b\1\u78be\1\u7911\1\u7964\1\u79b7\1\u75d3"+
+ "\1\u7a0a\1\u7a5d\1\u7ab0\1\u7b03\1\u7b56\1\u7ba9\1\u7bfc\1\u7c4f"+
+ "\1\u7ca2\1\u7cf5\1\u7d48\1\u7d9b\1\u7dee\1\u7e41\1\u7e94\1\u7ee7"+
+ "\1\u7f3a\1\u7f8d\1\u7fe0\1\u8033\1\u8086\1\u80d9\1\u812c\1\u817f"+
+ "\1\u81d2\1\u8225\1\u8278\1\u82cb\1\u831e\1\u8371\1\u83c4\1\u8417"+
+ "\1\u846a\1\u84bd\1\u8510\1\u8563\1\u85b6\1\u8609\1\u865c\1\u86af"+
+ "\1\u8702\1\u8755\1\u87a8\0\u033e\1\u87fb\1\u884e\1\u88a1\1\u88f4"+
+ "\1\u8947\1\u899a\1\u89ed\1\u8a40\1\u8a93\1\u8ae6\1\u8b39\1\u8b8c"+
+ "\1\u8bdf\1\u8c32\1\u8c85\1\u8cd8\1\u8d2b\1\u8d7e\1\u8dd1\1\u8e24"+
+ "\1\u8e77\1\u8eca\1\u8f1d\1\u8f70\1\u8fc3\1\u9016\1\u9069\1\u90bc"+
+ "\1\u910f\1\u9162\1\u91b5\1\u9208\1\u925b\1\u92ae\1\u8d2b\1\u9301"+
+ "\1\u9354\1\u93a7\1\u93fa\1\u944d\1\u94a0\1\u94f3\1\u9546\1\u9599"+
+ "\1\u95ec\1\u963f\1\u9692\1\u96e5\1\u9738\1\u978b\1\u97de\1\u9831"+
+ "\1\u9884\1\u98d7\1\u992a\1\u997d\1\u99d0\1\u9a23\1\u9a76\1\u9ac9"+
+ "\1\u9b1c\1\u9b6f\1\u9bc2\1\u9c15\1\u9c68\1\u9cbb\1\u9d0e\1\u9d61"+
+ "\1\u9db4\1\u9e07\1\u9e5a\1\u9ead\1\u9f00\1\u9f53\1\u9fa6\1\u9ff9"+
+ "\1\ua04c\1\ua09f\1\ua0f2\1\ua145\1\ua198\1\ua1eb\1\ua23e\1\ua291"+
+ "\1\ua2e4\1\ua337\1\ua38a\1\ua3dd\1\ua430\1\ua483\1\ua4d6\1\ua529"+
+ "\1\ua57c\1\ua5cf\1\ua622\1\ua675\1\ua6c8\1\ua71b\1\ua76e\1\ua7c1"+
+ "\1\ua814\1\ua867\1\ua8ba\1\ua90d\1\ua960\1\ua9b3\1\uaa06\1\uaa59"+
+ "\1\uaaac\1\uaaff\1\uab52\1\uaba5\1\uabf8\1\uac4b\1\uac9e\1\uacf1"+
+ "\1\uad44\1\uad97\1\uadea\1\uae3d\1\uae90\1\uaee3\1\uaf36\1\uaf89"+
+ "\1\uafdc\1\ub02f\1\ub082\1\ub0d5\1\ub128\1\ub17b\1\ub1ce\1\ub221"+
+ "\1\ub274\1\ub2c7\1\ub31a\1\ub36d\1\ub3c0\1\ub413\1\ub466\1\ub4b9"+
+ "\1\ub50c\1\ub55f\1\ub5b2\1\ub605\1\ub658\1\ub6ab\1\ub6fe\1\ub751"+
+ "\1\ub7a4\1\ub7f7\1\ub84a\1\ub89d\1\ub8f0\1\ub943\1\ub996\1\ub9e9"+
+ "\1\uba3c\1\uba8f\1\ubae2\1\ubb35\1\ubb88\1\ubbdb\1\ubc2e\1\ubc81"+
+ "\1\ubcd4\1\ubd27\1\ubd7a\1\ubdcd\1\ube20\1\ube73\1\ubec6\1\ubf19"+
+ "\1\ubf6c\1\ubfbf\1\uc012\1\uc065\1\uc0b8\1\uc10b\1\uc15e\1\uc1b1"+
+ "\1\uc204\1\uc257\1\uc2aa\1\uc2fd\1\uc350\1\uc3a3\1\uc3f6\1\uc449"+
+ "\1\uc49c\1\uc4ef\1\uc542\1\uc595\1\uc5e8\1\uc63b\1\uc68e\1\uc6e1"+
+ "\1\uc734\1\uc787\1\uc7da\1\uc82d\1\uc880\1\u5a44\1\uc8d3\1\uc926"+
+ "\1\uc979\1\uc9cc\1\uca1f\1\uca72\1\ucac5\1\ucb18\1\ucb6b\1\ucbbe"+
+ "\1\ucc11\1\ucc64\1\uccb7\1\ucd0a\1\ucd5d\1\ucdb0\1\uce03\1\uce56"+
+ "\1\ucea9\1\ucefc\1\ucf4f\1\ucfa2\1\ucff5\1\ud048\1\ud09b\1\ud0ee"+
+ "\1\ud141\1\ud194\1\ud1e7\1\ud23a\1\ud28d\1\ud2e0\1\ud333\1\ud386"+
+ "\1\ud3d9\1\ud42c\1\ud47f\1\ud4d2\1\ud525\1\ud578\1\ud5cb\1\ud61e"+
+ "\1\ud671\1\ud6c4\1\ud717\1\ud76a\1\ud7bd\1\ud810\1\ud863\1\ud8b6"+
+ "\1\ud909\1\ud95c\1\ud9af\1\uda02\1\uda55\1\udaa8\1\udafb\1\udb4e"+
+ "\1\udba1\1\udbf4\1\udc47\1\udc9a\1\udced\1\udd40\1\udd93\1\udde6"+
+ "\1\ude39\1\ude8c\1\udedf\1\udf32\1\udf85\1\udfd8\1\ue02b\1\ue07e"+
+ "\1\ue0d1\1\ue124\1\ue177\1\ue1ca\1\ue21d\1\ue270\1\ue2c3\1\ue316"+
+ "\1\ue369\1\ue3bc\1\ue40f\1\ue462\1\ue4b5\1\ue508\1\ue55b\1\ue5ae"+
+ "\1\ue601\1\ue654\1\ue6a7\1\ue6fa\1\ue74d\1\ue7a0\1\ue7f3\1\ue846"+
+ "\1\ue899\1\ue8ec\1\ue93f\1\ue992\1\ue9e5\1\uea38\1\uea8b\1\ueade"+
+ "\1\ueb31\1\ueb84\1\uebd7\1\uec2a\1\uec7d\1\uecd0\1\ued23\1\ued76"+
+ "\1\uedc9\1\uee1c\1\uee6f\1\ueec2\1\uef15\1\uef68\1\uefbb\1\uf00e"+
+ "\1\uf061\1\uf0b4\1\uf107\1\uf15a\1\uf1ad\1\uf200\1\uf253\1\uf2a6"+
+ "\1\uf2f9\1\uf34c\1\uf39f\1\uf3f2\1\uf445\1\uf498\1\uf4eb\1\uf53e"+
+ "\1\uf591\1\uf5e4\1\uf637\1\uf68a\1\uf6dd\1\uf730\1\uf783\1\uf7d6"+
+ "\1\uf829\1\uf87c\1\uf8cf\1\uf922\1\uf975\1\uf9c8\1\ufa1b\1\ufa6e"+
+ "\1\ufac1\1\ufb14\1\ufb67\1\ufbba\1\ufc0d\1\ufc60\1\ufcb3\1\ufd06"+
+ "\1\ufd59\1\ufdac\1\ufdff\1\ufe52\1\ufea5\1\ufef8\1\uff4b\1\uff9e"+
+ "\1\ufff1\2\104\2\227\2\352\2\u013d\2\u0190\2\u01e3\2\u0236"+
+ "\2\u0289\2\u02dc\2\u032f\2\u0382\2\u03d5\2\u0428\2\u047b\2\u04ce"+
+ "\2\u0521\2\u0574\2\u05c7\2\u061a\2\u066d\2\u06c0\2\u0713\2\u0766"+
+ "\2\u07b9\2\u080c\2\u085f\2\u08b2\2\u0905\2\u0958\2\u09ab\2\u09fe"+
+ "\2\u0a51\2\u0aa4\2\u0af7\2\u0b4a\2\u0b9d\2\u0bf0\2\u0c43\2\u0c96"+
+ "\2\u0ce9\2\u0d3c\2\u0d8f\2\u0de2\2\u0e35\2\u0e88\2\u0edb\2\u0f2e"+
+ "\2\u0f81\2\u0fd4\2\u1027\2\u107a\2\u10cd\2\u1120\2\u1173\2\u11c6"+
+ "\2\u1219\2\u126c\2\u12bf\2\u1312\2\u1365\2\u13b8\2\u140b\2\u145e"+
+ "\2\u14b1\2\u1504\2\u1557\2\u15aa\2\u15fd\2\u1650\2\u16a3\2\u16f6"+
+ "\2\u1749\2\u179c\2\u17ef\2\u1842\2\u1895\2\u18e8\2\u193b\2\u198e"+
+ "\2\u19e1\2\u1a34\2\u1a87\2\u1ada\2\u1b2d\2\u1b80\2\u1bd3\2\u1c26"+
+ "\2\u1c79\2\u1ccc\2\u1d1f\2\u1d72\2\u1dc5\2\u1e18\2\u1e6b\2\u1ebe"+
+ "\2\u1f11\2\u1f64\2\u1fb7\2\u200a\2\u205d\2\u20b0\2\u2103\2\u2156"+
+ "\2\u21a9\2\u21fc\2\u224f\2\u22a2\2\u22f5";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[1725];
+ 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 =
+ "\1\5\2\6\1\7\1\10\1\7\1\11\1\7\1\12"+
+ "\1\13\1\5\1\6\1\14\1\15\1\16\1\7\1\17"+
+ "\1\5\1\6\1\20\1\21\1\22\1\23\1\24\1\25"+
+ "\1\6\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+ "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\2\22"+
+ "\1\44\1\22\1\45\1\46\1\45\2\6\1\47\1\50"+
+ "\1\51\1\6\1\52\1\6\1\53\1\54\1\55\1\56"+
+ "\1\6\1\57\1\6\1\60\1\40\1\6\1\61\1\62"+
+ "\1\6\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+ "\1\6\1\72\1\73\1\74\1\75\1\76\1\6\1\40"+
+ "\11\77\1\100\3\77\1\101\7\77\1\102\31\77\1\103"+
+ "\10\77\1\104\32\77\11\105\1\106\3\105\1\107\7\105"+
+ "\1\110\21\105\1\111\7\105\1\112\10\105\1\113\5\105"+
+ "\1\114\23\105\1\115\11\116\1\117\3\116\1\120\41\116"+
+ "\1\121\10\116\1\122\32\116\10\5\2\0\4\5\1\0"+
+ "\1\5\1\0\2\5\3\0\6\5\2\0\6\5\13\0"+
+ "\20\5\1\0\22\5\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\2\124\1\125\3\7\1\124\1\7\2\0\3\124\1\126"+
+ "\1\0\1\7\1\0\2\124\3\0\1\127\3\124\1\126"+
+ "\1\130\1\0\1\131\2\124\1\130\1\124\1\127\1\124"+
+ "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+ "\1\0\2\124\1\132\1\133\2\134\1\124\1\134\2\0"+
+ "\3\124\1\126\1\0\1\134\1\0\2\124\3\0\1\127"+
+ "\2\135\1\136\1\126\1\130\1\0\1\131\2\124\1\130"+
+ "\1\124\1\127\1\124\13\0\2\124\1\126\2\124\1\136"+
+ "\2\124\1\126\7\124\1\0\22\124\1\0\1\5\7\6"+
+ "\2\0\1\123\1\137\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\140\1\141\1\6"+
+ "\13\0\1\142\1\143\15\6\1\5\1\0\22\6\1\0"+
+ "\10\144\1\145\1\146\1\147\110\144\123\0\1\5\7\6"+
+ "\2\0\1\123\1\150\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\151\1\152\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\153\1\154\1\6\13\0"+
+ "\1\6\1\155\4\6\1\156\10\6\1\5\1\0\22\6"+
+ "\1\0\11\16\1\157\1\160\3\16\1\161\104\16\23\0"+
+ "\1\20\123\0\1\162\1\163\22\0\1\45\122\0\1\45"+
+ "\52\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\164\4\6\1\165\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\166\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\167\4\6\1\170\5\6\1\171\2\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\172\4\6\13\0\1\6\1\173\12\6"+
+ "\1\174\2\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\175\1\6\13\0\1\6"+
+ "\1\176\4\6\1\177\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\200\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\201\4\6\13\0\5\6\1\202\1\6\1\203\2\6"+
+ "\1\204\4\6\1\5\1\0\12\6\1\205\7\6\35\0"+
+ "\1\45\13\0\1\45\55\0\3\131\1\0\1\131\7\0"+
+ "\1\131\103\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\206\4\6\13\0\1\207\16\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\210"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\211\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\212"+
+ "\1\6\13\0\5\6\1\213\11\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\2\6\1\214\3\6\2\0"+
+ "\5\6\1\215\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\216\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\217\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\220\5\6\13\0\1\221"+
+ "\10\6\1\222\2\6\1\223\2\6\1\5\1\0\22\6"+
+ "\47\0\1\45\1\0\1\45\121\0\1\224\1\45\122\0"+
+ "\1\45\1\0\1\225\120\0\1\45\4\0\1\45\45\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\226\3\6"+
+ "\13\0\1\6\1\227\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\230\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\231"+
+ "\1\6\1\232\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\233"+
+ "\1\234\1\6\13\0\1\235\1\236\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\237"+
+ "\1\240\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\7\6\1\241\7\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\242\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\243\1\244\2\6\13\0\1\6\1\245\4\6"+
+ "\1\246\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\247\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\250\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\251\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\252\2\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\253\1\254"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\2\255\3\5\1\255\1\5\2\0\1\5\3\255\1\0"+
+ "\1\5\1\0\1\5\1\255\3\0\6\255\2\0\6\255"+
+ "\13\0\17\255\1\5\1\0\22\255\1\0\1\5\7\6"+
+ "\2\0\1\123\1\256\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\2\6\1\257\3\6\2\0\1\6\1\260"+
+ "\3\6\1\261\13\0\3\6\1\262\13\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\263"+
+ "\1\6\1\264\3\6\13\0\1\265\1\266\2\6\1\267"+
+ "\1\6\1\270\5\6\1\271\2\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\272\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\273\3\6\1\274\1\6\13\0\2\6\1\275\14\6"+
+ "\1\5\1\0\12\6\1\276\7\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\277\4\6\13\0\1\300"+
+ "\1\301\4\6\1\302\5\6\1\303\2\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\304"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\305"+
+ "\1\306\13\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\307\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\310"+
+ "\2\6\13\0\6\6\1\311\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\312\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\313\1\314\2\6\13\0\1\6\1\315\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\316"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+ "\1\317\3\6\2\0\6\6\13\0\3\6\1\320\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\321\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\322\1\6\1\323\2\6\13\0"+
+ "\6\6\1\324\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\325\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\326\3\6\13\0\1\6\1\327"+
+ "\4\6\1\330\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\331\1\332\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\333\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\11\77\1\0\3\77\1\0\7\77"+
+ "\1\0\31\77\1\0\10\77\1\0\32\77\36\0\1\334"+
+ "\26\0\1\335\61\0\1\336\134\0\1\337\154\0\1\340"+
+ "\32\0\11\105\1\0\3\105\1\0\7\105\1\0\21\105"+
+ "\1\0\7\105\1\0\10\105\1\0\5\105\1\0\23\105"+
+ "\37\0\1\341\26\0\1\342\61\0\1\343\77\0\1\344"+
+ "\4\0\1\344\4\0\3\344\6\0\1\345\1\0\6\344"+
+ "\2\0\6\344\6\0\1\346\4\0\17\344\2\0\22\344"+
+ "\37\0\1\347\154\0\1\350\70\0\1\351\1\352\1\353"+
+ "\1\354\1\0\1\355\14\0\1\356\1\357\1\360\1\361"+
+ "\1\0\1\362\3\0\1\363\127\0\1\364\24\0\11\116"+
+ "\1\0\3\116\1\0\41\116\1\0\10\116\1\0\32\116"+
+ "\36\0\1\365\26\0\1\366\73\0\1\367\154\0\1\370"+
+ "\32\0\10\5\2\0\1\5\1\371\2\5\1\0\1\5"+
+ "\1\0\2\5\3\0\6\5\2\0\6\5\13\0\20\5"+
+ "\1\0\22\5\1\0\10\124\2\0\4\124\1\0\1\124"+
+ "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+ "\1\0\22\124\1\0\2\124\1\125\3\372\1\124\1\372"+
+ "\2\0\4\124\1\0\1\372\1\0\2\124\3\0\6\124"+
+ "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+ "\3\373\1\124\1\373\2\0\4\124\1\0\1\373\1\0"+
+ "\2\124\3\0\6\124\1\374\1\0\6\124\2\0\1\374"+
+ "\10\0\20\124\1\0\22\124\1\0\3\124\3\131\1\124"+
+ "\1\131\2\0\3\124\1\126\1\0\1\131\1\0\2\124"+
+ "\3\0\4\124\1\126\1\130\2\0\2\124\1\130\3\124"+
+ "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+ "\1\0\2\124\1\132\1\124\2\375\1\124\1\375\2\0"+
+ "\4\124\1\0\1\375\1\0\2\124\3\0\6\124\2\0"+
+ "\6\124\13\0\20\124\1\0\22\124\1\0\3\124\3\133"+
+ "\1\124\1\133\2\0\3\124\1\126\1\0\1\133\1\0"+
+ "\2\124\3\0\4\124\1\126\1\130\1\0\1\131\2\124"+
+ "\1\130\3\124\13\0\2\124\1\126\5\124\1\126\7\124"+
+ "\1\0\22\124\1\0\2\124\1\132\1\133\2\134\1\124"+
+ "\1\134\2\0\3\124\1\126\1\0\1\134\1\0\2\124"+
+ "\3\0\1\376\3\124\1\126\1\130\1\0\1\131\2\124"+
+ "\1\130\1\124\1\376\1\124\13\0\2\124\1\126\5\124"+
+ "\1\126\7\124\1\0\22\124\1\0\4\124\2\377\2\124"+
+ "\2\0\4\124\1\0\1\124\1\0\2\124\3\0\6\124"+
+ "\2\0\6\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+ "\5\u0100\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124"+
+ "\3\0\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100"+
+ "\2\124\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100"+
+ "\7\124\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0101\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u0102\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0103\2\6\13\0\1\6\1\u0104\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0105\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0106\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0107\1\6\13\0\7\6\1\u0108\7\6\1\5\1\0"+
+ "\22\6\1\0\10\u0109\1\u010a\1\0\111\u0109\10\0\1\u010a"+
+ "\112\0\4\u0109\2\u010b\1\u0109\1\u010c\1\u010d\1\0\1\144"+
+ "\1\u010e\3\144\1\u010b\10\u0109\1\144\5\u0109\2\144\63\u0109"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\4\6\1\u010f\1\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\11\6\1\240\5\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0110\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0111"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0112"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\240\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0113\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\12\157\1\u0114\3\157\1\u0115\110\157\2\16\1\157"+
+ "\2\16\1\0\1\16\1\u0116\4\16\10\157\1\16\5\157"+
+ "\2\16\63\157\25\0\1\u0117\75\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u0118\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0119"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u011a\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u011b\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\2\6\1\u011c\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u011d\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u011e\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u011f\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0120"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0121"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u0122\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u0123\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u0124\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0125"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u0126\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\u0127\2\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0128\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0129\5\6\13\0"+
+ "\4\6\1\u012a\12\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u012b"+
+ "\13\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u012c\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u012d"+
+ "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u012e\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u012f\2\6\13\0\14\6\1\240\2\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0130\4\6\13\0\6\6\1\u0131\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0132"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\u0133\2\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0134\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0135\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\5\6\1\u0136\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u0137\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0138\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0139\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u013a\1\6\1\u013b\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u013c\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\6\6\1\u013d\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u013e\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\51\0\1\45\1\0"+
+ "\1\22\50\0\1\5\7\6\2\0\1\123\2\6\1\u013f"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\u0140\2\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+ "\1\u0141\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u0142\4\6\1\u0143\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u0144\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0145\4\6\1\u0134"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0146\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u0147\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0148"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0149\4\6\1\u014a"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u014b\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\3\6\1\u014c\13\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\3\6\1\u014d\16\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u014e\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\u014f\2\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u0150\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0151\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u0152\1\6\13\0\6\6"+
+ "\1\u0153\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0154\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0155\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0156"+
+ "\1\6\1\u0157\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0158\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\255"+
+ "\2\0\1\u0159\3\255\1\0\1\255\1\0\1\5\1\255"+
+ "\3\0\6\255\2\0\6\255\13\0\17\255\1\5\1\0"+
+ "\22\255\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u015a"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u015b\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u015c\4\6\13\0\6\6\1\u015d\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u015e\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\3\6\1\u015f\13\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0160\1\6\1\u0161"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0162\1\u0163\4\6\13\0"+
+ "\4\6\1\u0164\12\6\1\5\1\0\3\6\1\u0165\16\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u0166\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0167\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u0168\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\7\6\1\u0169\7\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u016a\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u016b\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u016c\4\6\1\u016d"+
+ "\13\0\1\u016e\1\6\1\u016f\1\u0170\1\u0171\5\6\1\u0172"+
+ "\4\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0173\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\4\6\1\u0174\1\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0175"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\5\6\1\u0176\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0177\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0178\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0179\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u017a\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\3\6\1\u017b\13\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u017c\13\0\16\6\1\u017d\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\4\6\1\u017e\1\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\4\6\1\u017f\15\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0180\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0181\5\6"+
+ "\13\0\3\6\1\u0182\13\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0183\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u0184\1\6\13\0\7\6\1\u0185"+
+ "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\13\6\1\u0186\3\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\12\6\1\u0187\4\6\1\5\1\0\22\6"+
+ "\1\0\1\5\5\6\1\u0188\1\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u0189\5\6\13\0\17\6\1\5\1\0\2\6\1\u018a"+
+ "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u018b"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u018c\13\0\17\6"+
+ "\1\5\1\0\13\6\1\u018d\6\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u018e\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u018f\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0190\4\6\1\u0191\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0192\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0193\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0194\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0195\4\6\13\0\4\6\1\u0196\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\6\6\1\u0197\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0198\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0199\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u019a\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u014d\3\6\13\0\17\6\1\5\1\0\22\6\63\0"+
+ "\1\u019b\102\0\1\u019c\116\0\1\u019d\154\0\1\u019e\114\0"+
+ "\1\u019f\102\0\1\u01a0\60\0\52\344\1\346\50\344\1\0"+
+ "\1\344\4\0\1\344\4\0\3\344\10\0\6\344\2\0"+
+ "\6\344\6\0\1\346\4\0\17\344\2\0\22\344\37\0"+
+ "\1\u01a1\154\0\1\u01a2\45\0\1\u01a3\43\0\1\u01a4\1\u01a5"+
+ "\102\0\1\u01a6\146\0\1\u01a7\51\0\1\u01a8\147\0\1\u01a9"+
+ "\24\0\1\u01aa\65\0\1\u01ab\132\0\1\u01ac\123\0\1\u01ad"+
+ "\122\0\1\u01ae\75\0\1\u01af\146\0\1\u01b0\124\0\1\u01b1"+
+ "\16\0\1\u01b2\1\0\1\u01b3\1\0\1\u01b4\3\0\1\u01b5"+
+ "\113\0\1\u01b6\102\0\1\u01b7\116\0\1\u01b8\154\0\1\u01b9"+
+ "\32\0\3\5\5\u01ba\2\0\3\5\1\u01ba\1\0\1\u01ba"+
+ "\1\0\2\5\3\0\1\5\2\u01ba\1\5\2\u01ba\2\0"+
+ "\2\5\2\u01ba\2\5\13\0\2\5\1\u01ba\1\5\1\u01ba"+
+ "\3\5\1\u01ba\7\5\1\0\1\5\1\u01ba\20\5\1\0"+
+ "\2\124\1\125\3\372\1\124\1\372\2\0\4\124\1\0"+
+ "\1\372\1\0\2\124\3\0\1\127\5\124\2\0\4\124"+
+ "\1\127\1\124\13\0\20\124\1\0\22\124\1\0\3\124"+
+ "\3\373\1\124\1\373\2\0\3\124\1\126\1\0\1\373"+
+ "\1\0\2\124\3\0\4\124\1\126\1\124\2\0\6\124"+
+ "\13\0\2\124\1\126\5\124\1\126\7\124\1\0\22\124"+
+ "\4\0\3\373\1\0\1\373\7\0\1\373\103\0\2\124"+
+ "\1\132\1\124\2\375\1\124\1\375\2\0\4\124\1\0"+
+ "\1\375\1\0\2\124\3\0\1\376\5\124\2\0\4\124"+
+ "\1\376\1\124\13\0\20\124\1\0\22\124\1\0\2\124"+
+ "\1\u01bb\1\124\2\377\2\124\2\0\4\124\1\0\1\124"+
+ "\1\0\2\124\3\0\6\124\2\0\6\124\13\0\20\124"+
+ "\1\0\22\124\1\0\2\124\1\u01bc\5\u0100\2\0\3\124"+
+ "\1\u0100\1\0\1\u0100\1\0\2\124\3\0\1\376\2\u0100"+
+ "\1\124\2\u0100\2\0\2\124\2\u0100\1\376\1\124\13\0"+
+ "\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124\1\0"+
+ "\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u01bd\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u01be\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\5\6\1\u01bf\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u01c0\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u01c2\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u01c3\13\0\4\6\1\u01c4\12\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01c5"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\3\6\1\u01c6"+
+ "\13\6\1\5\1\0\22\6\1\0\10\u0109\1\145\1\0"+
+ "\115\u0109\2\u010c\1\u0109\1\u010c\1\u010a\1\0\5\u0109\1\u010c"+
+ "\107\u0109\2\144\1\u0109\1\144\1\u010a\1\0\5\u0109\1\144"+
+ "\106\u0109\5\u01c7\1\145\1\0\3\u0109\1\u01c7\1\u0109\1\u01c7"+
+ "\7\u0109\2\u01c7\1\u0109\2\u01c7\4\u0109\2\u01c7\17\u0109\1\u01c7"+
+ "\1\u0109\1\u01c7\3\u0109\1\u01c7\11\u0109\1\u01c7\21\u0109\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\240\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u01c8\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u012e\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u01c9\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u01ca\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\11\157\1\0\114\157\5\u01cb"+
+ "\2\157\1\u0114\2\157\1\u01cb\1\u0115\1\u01cb\7\157\2\u01cb"+
+ "\1\157\2\u01cb\4\157\2\u01cb\17\157\1\u01cb\1\157\1\u01cb"+
+ "\3\157\1\u01cb\11\157\1\u01cb\21\157\24\0\1\u01cc\76\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\13\6"+
+ "\1\u0162\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u01cd\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u01ce\3\6\13\0\16\6\1\u01cf\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u01d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\2\6\1\u01d1\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u01d2\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\2\6\1\u01d3\17\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01d4"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u01d5\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u01d6\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u01d7\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d8"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u01d9\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\7\6\1\u01da\7\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u01db"+
+ "\1\6\1\u01dc\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\7\6\1\u01dd\7\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u01de"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u01df\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u01e0\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01e1\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u01e2\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+ "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e4"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u01e5\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u01e6\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\240\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u01e7\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\7\6\1\240\7\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\240\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01e8"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u01e9\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u01ea\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\13\6\1\u01d7\3\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\155\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u01eb\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u01ec\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u01c9"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0145\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u01ed\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u01ee\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u01ef\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u01ec\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u01f0\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\12\6\1\u01f1\4\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u01f2"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u01f3\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u0131\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u01d7\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u01f4\4\6\1\u01f5\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u01f6\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u01f7\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u01f8\1\6\13\0\1\6"+
+ "\1\u01ea\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u01f9\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u01fa\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0162"+
+ "\1\u01fb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u01fc\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u01fd\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\4\6\1\u0134\1\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u01fe"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\240"+
+ "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\240\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u01ff\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u0200\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\2\6\1\u0201\14\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0202\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0203\14\6"+
+ "\1\5\1\0\22\6\1\0\10\5\2\0\1\5\1\u0204"+
+ "\2\5\1\0\1\5\1\0\2\5\3\0\6\5\2\0"+
+ "\6\5\13\0\20\5\1\0\22\5\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0205\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0206\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0207"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0208\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0209\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u020a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u020b\3\6"+
+ "\13\0\6\6\1\u020c\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u020d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u020e\3\6"+
+ "\1\u020f\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\u0210\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0211"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u01d9\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0212\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0213\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\3\6\1\u0214\13\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0215"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u0216\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u0217\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0218\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0219\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u021a\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u021b\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u021c\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u021d\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u021e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\2\6\1\u021f\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0220"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u0221\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\201\4\6\13\0\5\6\1\u0222"+
+ "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0223\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0224\3\6\13\0\1\6\1\u0225\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\10\6\1\u0226\11\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0227"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0228\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\u0229\2\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u022a\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u022b\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\10\6\1\u022c\6\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\10\6"+
+ "\1\u0162\6\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\u022d\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\u0162\16\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\1\0\1\u022e\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u022f\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0230\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u0231\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0232\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u0233\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0234\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\1\6\1\u0235\1\u0236\17\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\u0237\2\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\3\6\1\u0238\13\6\1\5\1\0"+
+ "\12\6\1\u0239\7\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u023a\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u023b\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u023c\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\u023d\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\3\6\1\u023e\1\u023f\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0240"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u0241\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\16\6\1\u0242\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0243\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\13\6\1\u0244\3\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0245\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0128\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\2\6\1\u0162\14\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0246\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0247\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0248\1\5"+
+ "\1\0\22\6\57\0\1\u0249\104\0\1\u019b\144\0\1\u024a"+
+ "\75\0\1\u024b\143\0\1\u024c\104\0\1\u019f\144\0\1\u024d"+
+ "\75\0\1\u024e\123\0\1\u024f\123\0\1\u0250\144\0\1\u0251"+
+ "\77\0\1\u0252\125\0\1\u0253\21\0\1\u0254\75\0\1\u0255"+
+ "\123\0\1\u0256\1\u0257\76\0\1\u0258\151\0\1\u0259\141\0"+
+ "\1\u025a\77\0\1\u025b\121\0\1\u025c\122\0\1\u025d\22\0"+
+ "\1\u025e\100\0\1\u025f\150\0\1\u0260\115\0\1\u0261\122\0"+
+ "\1\u0262\56\0\1\u0263\147\0\1\u0264\137\0\1\u0265\104\0"+
+ "\1\u01b6\144\0\1\u0266\75\0\1\u0267\65\0\3\5\5\u0268"+
+ "\2\0\3\5\1\u0268\1\0\1\u0268\1\0\2\5\3\0"+
+ "\1\5\2\u0268\1\5\2\u0268\2\0\2\5\2\u0268\2\5"+
+ "\13\0\2\5\1\u0268\1\5\1\u0268\3\5\1\u0268\7\5"+
+ "\1\0\1\5\1\u0268\20\5\1\0\2\124\1\u01bc\5\u0100"+
+ "\2\0\3\124\1\u0100\1\0\1\u0100\1\0\2\124\3\0"+
+ "\1\124\2\u0100\1\124\2\u0100\2\0\2\124\2\u0100\2\124"+
+ "\13\0\2\124\1\u0100\1\124\1\u0100\3\124\1\u0100\7\124"+
+ "\1\0\1\124\1\u0100\20\124\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0269\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u026a\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u026b"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u026c\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u01ff\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u026e\2\6\13\0\17\6\1\5\1\0"+
+ "\1\6\1\u026f\1\u0270\17\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u01fc\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0271"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0272\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0173\2\6\13\0\6\6"+
+ "\1\u0273\10\6\1\5\1\0\22\6\1\0\3\u0109\5\u0274"+
+ "\1\145\1\0\3\u0109\1\u0274\1\u0109\1\u0274\7\u0109\2\u0274"+
+ "\1\u0109\2\u0274\4\u0109\2\u0274\17\u0109\1\u0274\1\u0109\1\u0274"+
+ "\3\u0109\1\u0274\11\u0109\1\u0274\21\u0109\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\12\6\1\u0134\4\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u01d7\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0275\1\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\3\157\5\u0276"+
+ "\2\157\1\u0114\2\157\1\u0276\1\u0115\1\u0276\7\157\2\u0276"+
+ "\1\157\2\u0276\4\157\2\u0276\17\157\1\u0276\1\157\1\u0276"+
+ "\3\157\1\u0276\11\157\1\u0276\21\157\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u0277\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\11\6\1\u0278\10\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0279"+
+ "\1\u027a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\15\6"+
+ "\1\u027b\1\6\1\5\1\0\4\6\1\u027c\15\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u027d\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u027e\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u01d9\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\1\6\1\u027f\20\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\16\6"+
+ "\1\240\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0280\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\u01ff\16\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0162\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u0281\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0282\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0283\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u0284"+
+ "\1\6\2\0\6\6\13\0\10\6\1\u0285\4\6\1\u0286"+
+ "\1\6\1\5\1\0\4\6\1\u0287\4\6\1\u0288\1\u0289"+
+ "\1\6\1\u028a\2\6\1\u028b\2\6\1\0\1\5\5\6"+
+ "\1\u028c\1\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u028d\3\6"+
+ "\13\0\17\6\1\5\1\0\2\6\1\u01d3\5\6\1\u028e"+
+ "\11\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0162\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u028f\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0290\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\14\6\1\u0291\2\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0292"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\5\6\1\u0222"+
+ "\11\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u0293\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\11\6\1\u0294\5\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0295\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u0296\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u0297\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u01f5\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0298\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0299\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\u029a\16\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u029b\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u0122\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u029c\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u029d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u029e\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\240\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u029f\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\240\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u02a0\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u02a1\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u02a2\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u02a3\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u0162\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\4\6\1\u02a4"+
+ "\5\6\1\u02a5\7\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u01fa\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\6\6\1\u02a6\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\247\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u02a7\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u01de"+
+ "\1\u014f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u02a8\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u02a9\15\6\1\5"+
+ "\1\0\22\6\1\0\3\5\5\u02aa\2\0\3\5\1\u02aa"+
+ "\1\0\1\u02aa\1\0\2\5\3\0\1\5\2\u02aa\1\5"+
+ "\2\u02aa\2\0\2\5\2\u02aa\2\5\13\0\2\5\1\u02aa"+
+ "\1\5\1\u02aa\3\5\1\u02aa\7\5\1\0\1\5\1\u02aa"+
+ "\20\5\1\0\1\5\5\6\1\u02ab\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02ac\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\14\6\1\u02ad\2\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\u02ae\16\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u02af"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u02b0\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u02b1\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u02b2\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\4\6\1\u02b3\12\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\16\6\1\u02b4\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u02b5\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u02b6\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u02b7\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u02b8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02b9\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u02ba\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u02bb\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\4\6\1\u02bc\1\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02bd\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u02be\4\6\13\0\13\6"+
+ "\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u02bf\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u02c0\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\5\6\1\u02c1\11\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u02c2\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\7\6\1\u02c3\7\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\4\6\1\u02c4\1\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02c5"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u02c6"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\13\6\1\u02c7\3\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u02c8\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u02c9\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\2\6\1\u01d3\5\6\1\u028e\11\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u02ca\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\11\6\1\u01ff\5\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u02cb\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u02cc\4\6"+
+ "\13\0\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\11\6\1\u02ce\10\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\3\6\1\u02cf\13\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u02d0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u02d1\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u02d2\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u01ff\5\6\13\0\17\6\1\5\1\0\2\6"+
+ "\1\u01d3\5\6\1\u028e\11\6\34\0\1\u02d3\67\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u02d4"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+ "\1\u02d5\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u02d6\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u02d7\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\13\6\1\u02d8\3\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u02d9\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u02da\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u02db\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\4\6\1\u02dc\12\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u02dd\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\2\6\1\u02de\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u02df\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u02e0\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u02e1\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u02e2\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u02e3\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u02e4\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02e5"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u02e6\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u02e7\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\2\6\1\u02e8\14\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u02e9\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\2\6\1\u02ea\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u02eb\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u02ec"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\7\6\1\u02ed\12\6\25\0\1\u02ee\141\0\1\u019b"+
+ "\12\0\1\u0249\45\0\1\u024b\1\u02ef\5\u024b\1\u02ef\2\0"+
+ "\3\u024b\1\0\1\u024b\1\0\1\u02ef\1\u024b\1\0\1\u024b"+
+ "\1\u02ef\6\u024b\2\u02ef\6\u024b\1\0\2\u02ef\1\0\1\u02ef"+
+ "\2\0\4\u02ef\17\u024b\2\u02ef\22\u024b\25\0\1\u02f0\141\0"+
+ "\1\u019f\12\0\1\u024c\45\0\1\u024e\1\u02f1\5\u024e\1\u02f1"+
+ "\2\0\3\u024e\1\0\1\u024e\1\0\1\u02f1\1\u024e\1\0"+
+ "\1\u024e\1\u02f1\6\u024e\2\u02f1\6\u024e\1\0\2\u02f1\1\0"+
+ "\1\u02f1\2\0\4\u02f1\17\u024e\2\u02f1\22\u024e\61\0\1\u02f2"+
+ "\102\0\1\u02f3\17\0\1\u02f4\122\0\1\u0257\55\0\1\u02f5"+
+ "\175\0\1\u02f6\74\0\1\u02f7\1\0\1\u02f8\137\0\1\u02f9"+
+ "\130\0\1\u02fa\120\0\1\u02fb\117\0\1\u02fc\101\0\1\u02fd"+
+ "\124\0\1\u02fe\121\0\1\u02ff\122\0\1\u0300\122\0\1\u0301"+
+ "\125\0\1\u0302\73\0\1\u0303\21\0\1\u0304\147\0\1\u0305"+
+ "\120\0\1\u0306\120\0\1\u0307\105\0\1\u0308\104\0\1\u0309"+
+ "\141\0\1\u01b6\12\0\1\u0265\45\0\1\u0267\1\u030a\5\u0267"+
+ "\1\u030a\2\0\3\u0267\1\0\1\u0267\1\0\1\u030a\1\u0267"+
+ "\1\0\1\u0267\1\u030a\6\u0267\2\u030a\6\u0267\1\0\2\u030a"+
+ "\1\0\1\u030a\2\0\4\u030a\17\u0267\2\u030a\22\u0267\1\0"+
+ "\3\5\5\u030b\2\0\3\5\1\u030b\1\0\1\u030b\1\0"+
+ "\2\5\3\0\1\5\2\u030b\1\5\2\u030b\2\0\2\5"+
+ "\2\u030b\2\5\13\0\2\5\1\u030b\1\5\1\u030b\3\5"+
+ "\1\u030b\7\5\1\0\1\5\1\u030b\20\5\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u030c\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\2\6\1\u030d\14\6\1\5"+
+ "\1\0\22\6\1\0\1\5\5\6\1\u030e\1\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\1\u030f\3\6\1\u0310\1\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\11\6\1\u0288\10\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u014f\2\6\13\0\17\6"+
+ "\1\5\1\0\11\6\1\u0311\10\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0312\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u0313\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0314\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0315\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0316\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u0317\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u02ba\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\3\u0109\5\u0318\1\145\1\0\3\u0109\1\u0318\1\u0109\1\u0318"+
+ "\7\u0109\2\u0318\1\u0109\2\u0318\4\u0109\2\u0318\17\u0109\1\u0318"+
+ "\1\u0109\1\u0318\3\u0109\1\u0318\11\u0109\1\u0318\21\u0109\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u0319\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\3\157\5\u031a\2\157"+
+ "\1\u0114\2\157\1\u031a\1\u0115\1\u031a\7\157\2\u031a\1\157"+
+ "\2\u031a\4\157\2\u031a\17\157\1\u031a\1\157\1\u031a\3\157"+
+ "\1\u031a\11\157\1\u031a\21\157\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u031b\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u031c\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u031d"+
+ "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\13\6\1\u031e\3\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u031f\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0320\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0193\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u0321\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0322\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0323\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0324\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u02e8\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0325"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0326"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0327\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0328\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0329\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u032a"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\u032b\2\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u032c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u032d\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u032e\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u032f\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0330\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0331\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0332\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0333\17\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\1\u0334\5\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\12\6\1\u0335\7\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0336\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u0337\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u0131\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0338\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0339\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\4\6\1\240\12\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u033a\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u01f5"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u033b"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u0134\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\13\6\1\u0134\3\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u033c\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\2\6\1\u033d\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u033e\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\7\6\1\u033f\7\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0340"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u0341\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u0342"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0343\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0344\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u0345\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\7\6\1\u0346\7\6\1\5\1\0\22\6\1\0"+
+ "\3\5\5\u0347\2\0\3\5\1\u0347\1\0\1\u0347\1\0"+
+ "\2\5\3\0\1\5\2\u0347\1\5\2\u0347\2\0\2\5"+
+ "\2\u0347\2\5\13\0\2\5\1\u0347\1\5\1\u0347\3\5"+
+ "\1\u0347\7\5\1\0\1\5\1\u0347\20\5\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u0348\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u0349\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a\5\6"+
+ "\2\0\5\6\1\u0162\13\0\10\6\1\u034b\6\6\1\5"+
+ "\1\0\2\6\1\u034c\1\6\1\u034d\15\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u034e"+
+ "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u034f\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\2\6\1\u01ff\14\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+ "\1\u0350\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\13\6\1\u0351\3\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0352\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\5\6\1\u0353\4\6\1\u0354\7\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0355"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0356"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u0357\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0358\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\2\6\1\u0223\14\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u01de\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0359\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u035a\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\7\6\1\u0162\7\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u035b\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u035c"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u035d\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u035e\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\12\6\1\u035f\7\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\2\6\1\u0360\5\6\1\u0361\11\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\3\6\1\u0362\13\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0363"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\2\6\1\u01fc\3\6\2\0\1\u0128\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u0364\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0365\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0366\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u0367\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u0368\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0369"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\5\6\1\u036a\14\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u036b\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u036c\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\3\6\1\u036d\13\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u036e\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\11\6\1\u036f\5\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0370\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\15\0\1\u0371\106\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0372\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u0373\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0374\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u0375\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u0376\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0377"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0378\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u0379\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\u037a\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u037b\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\10\6\1\u037c\11\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\12\6\1\u0201\4\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u037d\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u037e\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u037f\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0380\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\5\6\1\u0381\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0382\14\6"+
+ "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0383\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\13\6\1\u01fa\3\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+ "\1\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\4\6"+
+ "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u0384\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\14\6\1\u0385\2\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u0386\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u0162\4\6\13\0\17\6\1\5"+
+ "\1\0\1\6\1\u0387\20\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u0388\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\25\0\1\u024b\122\0\1\u024e\135\0\1\u0389"+
+ "\124\0\1\u038a\151\0\1\u038b\71\0\1\u038c\145\0\1\u038d"+
+ "\122\0\1\u038e\53\0\1\u038f\167\0\1\u0390\103\0\1\u0391"+
+ "\121\0\1\u0257\124\0\1\u0392\120\0\1\u0393\150\0\1\u0257"+
+ "\126\0\1\u0394\67\0\1\u0395\147\0\1\u0257\123\0\1\u0396"+
+ "\132\0\1\u0397\65\0\1\u0398\156\0\1\u0399\66\0\1\u0397"+
+ "\122\0\1\u039a\75\0\1\u0306\133\0\1\u0267\76\0\3\5"+
+ "\5\6\2\0\3\5\1\6\1\0\1\6\1\0\2\5"+
+ "\3\0\1\5\2\6\1\5\2\6\2\0\2\5\2\6"+
+ "\2\5\13\0\2\5\1\6\1\5\1\6\3\5\1\6"+
+ "\7\5\1\0\1\5\1\6\20\5\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\4\6\1\u039b\12\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u01de\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u039c\2\6\13\0\6\6\1\u039d\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u0328\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u039e\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u039f\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u03a0\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a1"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u03a2\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\3\6"+
+ "\1\u03a3\16\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u03a4\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03a5\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\3\u0109\5\144"+
+ "\1\145\1\0\3\u0109\1\144\1\u0109\1\144\7\u0109\2\144"+
+ "\1\u0109\2\144\4\u0109\2\144\17\u0109\1\144\1\u0109\1\144"+
+ "\3\u0109\1\144\11\u0109\1\144\21\u0109\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\14\6\1\240\2\6\1\5"+
+ "\1\0\22\6\1\0\3\157\5\16\2\157\1\u0114\2\157"+
+ "\1\16\1\u0115\1\16\7\157\2\16\1\157\2\16\4\157"+
+ "\2\16\17\157\1\16\1\157\1\16\3\157\1\16\11\157"+
+ "\1\16\21\157\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u03a6"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u03a7"+
+ "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\1\u034a\5\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\7\6\1\u03a8\12\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0385\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u03a9\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u03aa\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u0162\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u03ab\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u01d7\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\4\6\1\u03ac\1\6\2\0\1\u03ad\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u03ae\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u03af\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u03b0\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u03b1\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\3\6\1\u03b2\13\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u03b3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0329\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u03b4\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u03af\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u03b5\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u03b6\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\3\6\1\u0162\13\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u03b7\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u03b8\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u03b9\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u03ba\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\2\6\1\u03bb\3\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u03bc\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\4\6\1\u01f5\12\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\2\6\1\u03bd\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u03be\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u03bf\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u0134\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03c0"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03c1"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u03c2\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u03c3\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\3\6\1\u03c4\13\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0341\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u03c5\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u03c6\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u03c7\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\1\6\1\u03c8\20\6\1\0\3\5\5\u03c9\2\0\3\5"+
+ "\1\u03c9\1\0\1\u03c9\1\0\2\5\3\0\1\5\2\u03c9"+
+ "\1\5\2\u03c9\2\0\2\5\2\u03c9\2\5\13\0\2\5"+
+ "\1\u03c9\1\5\1\u03c9\3\5\1\u03c9\7\5\1\0\1\5"+
+ "\1\u03c9\20\5\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u03ca\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\4\6\1\u03cb\12\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03cc"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\243\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u03cd\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u03ce\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u03cf\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u03d0\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u03d1\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\5\6\1\u03d2"+
+ "\14\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\1\6\1\u03d3\4\6"+
+ "\2\0\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0"+
+ "\4\6\1\u034d\1\u03d2\11\6\1\u028b\2\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\10\6\1\u03d4\11\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u03d5\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\12\6\1\u03d6\4\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u03d7\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u03d8\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u03d9\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u03da\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\5\6\1\u03db\14\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u03dc\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u03dd\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u03de\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u03df\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u03e0\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u03e1\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u03e2\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u03e3\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u03e4"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\u03e5"+
+ "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\7\6\1\u03e6\7\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\4\6\1\u03e7\1\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u03e8\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u03b6\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+ "\5\6\1\0\1\u03ea\6\6\13\0\10\6\1\u03eb\6\6"+
+ "\1\5\1\0\15\6\1\u03ec\4\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\14\6\1\u03ed\2\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u03ee\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u01fa"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u03ef\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u03f0\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u03f1\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u03f2\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u03f3\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\37\0\1\u03f4\64\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\13\6\1\u03f5\3\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u03f6\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\4\6\1\u03f7\1\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\12\6"+
+ "\1\u03f8\4\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\2\6\1\u03f9\3\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u03fa\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u03fb\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u03fc"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\4\6\1\u03fd\1\u03fe\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\10\6\1\u03ff\11\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+ "\1\u0400\17\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0401\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+ "\13\0\17\6\1\5\1\0\2\6\1\u0402\1\6\1\u0403"+
+ "\5\6\1\u0404\7\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u0405\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u0406\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0407\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u0408\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0409"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u040a\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u040b\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\5\6\1\u040c\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u040d\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\2\6\1\u040e\3\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u040f\13\0\17\6\1\5\1\0\22\6\66\0"+
+ "\1\u0410\116\0\1\u0411\104\0\1\u0257\73\0\1\u0257\150\0"+
+ "\1\u02fb\116\0\1\u0302\145\0\1\u02fb\100\0\1\u0257\125\0"+
+ "\1\u0412\120\0\1\u0413\145\0\1\u0414\117\0\1\u0415\56\0"+
+ "\1\u0410\166\0\1\u038c\42\0\44\u0397\1\u0257\56\u0397\37\0"+
+ "\1\u0416\143\0\1\u0417\101\0\1\u0418\63\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0162\2\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0419\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u041a"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u041b\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u041c\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\12\6\1\u041d\4\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u041e\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u041f\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u0420\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0421"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0422"+
+ "\10\6\1\5\1\0\22\6\7\0\1\u0423\20\0\1\u0424"+
+ "\73\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\2\6\1\u0425\3\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u0426\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u0427\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u0428\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0429"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u042a\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u042b\1\u042c\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u042d\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ba"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u042e"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\2\6\1\u02ba\14\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u042f"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\4\6\1\u0430\1\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0431\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0432\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0433\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u0434\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u0435\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0436\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0437\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\13\6"+
+ "\1\u0438\6\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u01f5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\3\6\1\240\13\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u0439\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0153\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\4\6\1\u0134\12\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u043a"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u043b\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u043c\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u043d\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u043e\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\5\6\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u043f\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\4\6\1\u0440\12\6\1\5\1\0\22\6\1\0"+
+ "\3\5\5\255\2\0\3\5\1\255\1\0\1\255\1\0"+
+ "\2\5\3\0\1\5\2\255\1\5\2\255\2\0\2\5"+
+ "\2\255\2\5\13\0\2\5\1\255\1\5\1\255\3\5"+
+ "\1\255\7\5\1\0\1\5\1\255\20\5\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u01c1\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0441\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u01d9"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0442\15\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u016f\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0443"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0444"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u0445\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u0446\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u0447\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0448\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u0449\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u044a\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\1\u044b\21\6\1\0\1\5\5\6\1\u044c"+
+ "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\1\u030f\5\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\14\6\1\u044d\2\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u044e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u044f\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u0450\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u0385\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\3\6\1\u0451\13\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0452\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0453\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0454\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0455"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u0456\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0457\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\5\6\1\u0458\1\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\12\6\1\u0459\1\6"+
+ "\1\u045a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u045b\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\4\6\1\u045c\1\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\1\6\1\u045d\1\u045e"+
+ "\2\6\1\u045f\2\6\1\u0460\11\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\14\6\1\u0248\2\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u0461\15\6\1\5\1\0"+
+ "\22\6\103\0\1\u0462\3\0\1\u0463\14\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u03d4\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u0464\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\1\u0465\5\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u0466\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\14\6\1\u0467"+
+ "\5\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u0468\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\2\6\1\u0469\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\4\6\1\u046a\1\u040c\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\40\0\1\u046b\63\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\4\6\1\u046c\1\6\2\0\6\6\13\0\15\6\1\u046d"+
+ "\1\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u046e\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u046f\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0470"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u0177\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\10\6\1\u0471\6\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\12\6\1\u0472\4\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0473"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0474"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u0475\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0476\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0477\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0478\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0479\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u047a\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\u047b\2\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u047c\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\16\6\1\u047d\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u047e"+
+ "\5\6\1\u047f\2\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\1\6\1\u0480\4\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u0481\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\14\6\1\u0482\2\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0483"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\201\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+ "\1\u0484\11\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u0485\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\u0486\16\6\1\5\1\0\22\6\42\0\1\u0487\124\0"+
+ "\1\u0488\111\0\1\u0489\34\0\1\u048a\71\0\1\u02fb\125\0"+
+ "\1\u048b\120\0\1\u048c\124\0\1\u048d\141\0\1\u048e\127\0"+
+ "\1\u048f\35\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u012d"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0490"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\7\6\1\u0491\7\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\2\6\1\u0492\17\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0493"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0494\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\14\6\1\u0495\2\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0496\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0497\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u0498"+
+ "\15\6\1\5\1\0\22\6\42\0\1\u0499\74\0\1\u049a"+
+ "\107\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u049b"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u049c\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u049d\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0196"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\14\6\1\u049e"+
+ "\2\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u049f\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u04a0\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\2\6\1\u04a1\3\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\4\6\1\u0284\1\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u04a2\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u04a3\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u04a4\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a5\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u04a6\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u04a7\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u04a8"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u04a9\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\4\6\1\u04aa\12\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ab\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u04ac\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u04ad\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04ae\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u0131\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u04af\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u04b0\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u039b\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\1\6\1\u04b1\4\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u04b2\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u04b3\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u034a"+
+ "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+ "\1\u04b4\5\6\1\u04b5\7\6\1\76\1\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0472\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u04b6\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0385\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u04b7"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\16\6\1\u04b8"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\2\6\1\u04b9\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u04ba\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u0181\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u04bb\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u04bc\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u04bd\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04be\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\10\6\1\u04bf\11\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\4\6\1\u0287\15\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\7\6\1\u04c0\7\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u04c1\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04c2\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u04c3\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\2\6"+
+ "\1\u04c4\3\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\12\6\1\u04c5\7\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u04c6\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u04c7\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u04c8\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u04c9\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u04ca\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u04cb\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u04cc\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04cd\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04ce\4\6"+
+ "\13\0\4\6\1\u04cf\12\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u04d0\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\u04d1\16\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04d2\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u04d3\12\6\1\5\1\0\22\6\37\0\1\u04d4\100\0"+
+ "\1\u04d5\106\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04d6\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u04d7\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\16\6\1\u0162\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u04d8\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04d9\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u04da\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u04db\15\6\1\5\1\0"+
+ "\22\6\74\0\1\u04dc\27\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u04dd\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u04de\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u04df\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u04e0\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\1\6\1\u04e1\20\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e2"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u012d\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u04e3\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u04e4\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u04e5"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u04e6\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u04e7\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u04e8\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04e9\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u04ea\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u04eb\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\10\6\1\u04ec\6\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\15\6\1\u0286"+
+ "\1\6\1\5\1\0\4\6\1\u0287\15\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u04ed\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\15\6\1\u027b\1\6\1\5"+
+ "\1\0\14\6\1\u028a\5\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\u04ee\2\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u04ef\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\20\6\1\76\1\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u04f0\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u04f1\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u04f2\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\10\6\1\u028e\11\6\43\0\1\u0257\121\0"+
+ "\1\u04f3\146\0\1\u04f4\76\0\1\u04f5\117\0\1\u04f6\157\0"+
+ "\1\u0257\71\0\1\u0397\116\0\1\u0397\122\0\1\u04f7\64\0"+
+ "\1\5\7\6\2\0\1\123\1\u04f8\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u04f9\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\u04fa"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u04fb\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\1\0\1\u04fc\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\15\6\1\u0286\1\6\1\5\1\0\17\6"+
+ "\1\u028b\2\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u04fd\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04fe\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u04ff\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\37\0\1\u0500\151\0\1\u0501\35\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u047d\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\u0223\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u0502\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\4\6\1\u0287\5\6\1\u0289\7\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\13\6\1\u0503\3\6\1\5\1\0\22\6\1\0\1\5"+
+ "\5\6\1\u0504\1\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\1\0\1\u0505\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\4\6\1\u0506\1\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u0507\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\2\6\1\u0382\17\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u0508\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u0509\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u050a\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0321\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\1\u01ff\21\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\4\6\1\u050b\15\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\16\6\1\u012d\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u050c\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u01d9\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\1\u03bf\21\6\1\0\1\5"+
+ "\7\6\2\0\1\123\2\6\1\240\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+ "\1\u050d\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u050e\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u050f\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u0510\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0511\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0512"+
+ "\1\u0513\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u012d\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0514\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0515\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u0516"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\4\6\1\u03b1\1\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0517\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\2\6"+
+ "\1\u0518\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u0519\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u051a\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u051b\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u051c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+ "\1\u012d\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u051d\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u051e\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u051f"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\2\6\1\u0520\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u0521\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0522\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\2\6\1\u0523\3\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0524\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\13\6\1\u0525"+
+ "\6\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\1\6\1\u0526\15\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\1\u0527\5\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u0528\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\13\6\1\u0529\3\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\4\6\1\u052a\12\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u052b\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u052c\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u052d\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u052e"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\42\0\1\u052f"+
+ "\144\0\1\u0530\37\0\1\5\7\6\2\0\1\123\1\u0330"+
+ "\2\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\5\6\1\u0531\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0532\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0533\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0534"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0535\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u0536\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u0537\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u0538\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0539\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u053a\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\2\6\1\u053b"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u053c"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u053d\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\7\6\1\u053e\7\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\u053f\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u0540\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u02ea\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u0541\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u0542\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\3\6\1\u0543\13\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u0544\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\u0162"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0545\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u02bd\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u0546\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0547\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0450\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\16\0\1\u0548\145\0\1\u0549\120\0\1\u054a"+
+ "\124\0\1\u054b\151\0\1\u054c\33\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u054d\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u0385\5\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+ "\1\u054e\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\5\6\1\u054f\13\0\17\6\1\5"+
+ "\1\0\22\6\103\0\1\u0550\3\0\1\u0551\14\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u01fa"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\10\6"+
+ "\1\u0552\11\6\41\0\1\u0553\124\0\1\u0554\60\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u0555"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u0556\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0557\1\6\13\0\17\6\1\5\1\0\22\6\30\0"+
+ "\1\u0558\73\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u0559\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+ "\1\u0196\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\1\6\1\u04c1\1\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0433\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055a\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u055b\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u055c\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u055d\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u055e\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u055f\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u0560\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u0162"+
+ "\5\6\13\0\17\6\1\5\1\0\3\6\1\u0561\16\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0562\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u0563\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u0564\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\6\1\u0565\1\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0566\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\5\6\1\u0567\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0568\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0569\1\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\2\6\1\u056a\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u056b\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\21\6\1\u02cd\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\2\6\1\u056c\14\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u056d\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u056e\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\1\6\1\u056f\4\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0570\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0571\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u0572"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u0573\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0574\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\3\6\1\u0575\13\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u0576\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0577\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u04e5\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u0578"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0472\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0579\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\6\6\1\u057a\10\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\4\6\1\u0162\1\6"+
+ "\13\0\17\6\1\5\1\0\22\6\37\0\1\u057b\125\0"+
+ "\1\u057c\61\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u057d"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u053e\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u057e\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\2\6\1\u057f\14\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\7\6"+
+ "\1\u0580\7\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\7\6\1\u0581\7\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u0582\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u012d\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u0419\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0583\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\4\6"+
+ "\1\u0584\1\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\1\u0585\21\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\2\6\1\276"+
+ "\14\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0586\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u053d\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0587"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u0588\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u0589\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\u058a\2\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u058b\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u058c\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\140\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\u058d"+
+ "\16\6\1\5\1\0\22\6\41\0\1\u058e\124\0\1\u054b"+
+ "\121\0\1\u0257\142\0\1\u0257\121\0\1\u058f\42\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u0590\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\3\6\1\u040e\13\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0591\10\6\1\5\1\0\22\6"+
+ "\14\0\1\u0592\123\0\1\u0593\106\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u0594\15\6\1\5"+
+ "\1\0\22\6\73\0\1\u0595\111\0\1\u0596\41\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0597\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\5\6\1\u0598"+
+ "\1\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u0599\15\6\1\5\1\0\22\6"+
+ "\66\0\1\u059a\35\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u059b"+
+ "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u0228\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\4\6\1\u059c\15\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u059d\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u059e\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+ "\1\u059f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\5\6\1\u05a0\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\4\6\1\u05a1\1\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u05a2\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\u05a3\16\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\1\0"+
+ "\1\u05a4\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\3\6"+
+ "\1\u04f2\13\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05a5\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u05a6\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u05a7\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u05a8\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u05a9\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u05aa\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u05ab\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\5\6\1\u01e3\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\4\6\1\u05ac\15\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05ad"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\5\6"+
+ "\1\u05ae\14\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\6\1\u05af\15\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\15\6\1\u0286\1\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u05b0"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u05b1\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\5\6\1\u012d\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0419\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u05b2\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\4\6\1\u05b3\12\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u05b4\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\5\6\1\u05b5\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u05b6\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\u05b7\5\6\13\0\17\6\1\5\1\0\22\6\41\0"+
+ "\1\u04dc\75\0\1\u05b8\107\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u05b9\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u05ba\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\5\6"+
+ "\1\u05bb\2\0\6\6\13\0\17\6\1\5\1\0\12\6"+
+ "\1\u05bc\7\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\1\u05bd\5\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u05be\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u05bf\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\u05c0\2\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u05c1"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\1\6\1\u05c2"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u05c3\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0419\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\7\6\1\u05c4\7\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05c5"+
+ "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\2\6"+
+ "\1\u05c6\13\6\1\u05c7\3\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\u05c8\5\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u012d\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+ "\1\u05c9\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05ca\10\6"+
+ "\1\5\1\0\22\6\37\0\1\u048c\147\0\1\u0397\37\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05cb\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u05cc\15\6"+
+ "\1\5\1\0\22\6\31\0\1\u05cd\157\0\1\u05ce\35\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+ "\1\u05cf\14\6\1\5\1\0\22\6\61\0\1\u03f4\102\0"+
+ "\1\u05d0\62\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\1\6\1\u05d1\4\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\1\6"+
+ "\1\u05d2\15\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\5\6\1\u0450\13\0\17\6\1\5"+
+ "\1\0\22\6\73\0\1\u05d3\30\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u05d4\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u05d5\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u05d6"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\7\6\1\u05d7"+
+ "\7\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u05d8\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05d9"+
+ "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05da"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u05db\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6";
+
+ private static final String ZZ_TRANS_PACKED_1 =
+ "\2\0\6\6\13\0\1\6\1\u05dc\15\6\1\5\1\0"+
+ "\22\6\103\0\1\u05dd\20\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\1\u02ba\21\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\2\6\1\u05de"+
+ "\3\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\11\6\1\u0385"+
+ "\5\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\14\6"+
+ "\1\u028a\5\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\13\6\1\u05df\3\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\13\6\1\u02ba\3\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\12\6\1\u012d\7\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\276\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\1\u05e0\16\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u05e1\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\u012d\16\6\1\5\1\0"+
+ "\22\6\1\0\1\5\5\6\1\u05e2\1\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u05e3\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u05e4\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u05e5\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\5\6\1\276"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\2\6\1\u05e6\14\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u05e7\15\6\1\5\1\0"+
+ "\22\6\73\0\1\u05e8\30\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u05e9\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u05ea\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u05eb\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\3\6\1\u05ec\13\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u05ed\10\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u05ee"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u05ef\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u05f0\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\14\6\1\u05f1\2\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\u05f2\2\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\2\6\1\u05e4\3\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\17\6\1\u028b\2\6"+
+ "\1\0\1\5\5\6\1\u05f3\1\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u05f4"+
+ "\1\u01e3\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u05f5\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u05f6\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\2\6\1\u05f7"+
+ "\17\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u05f8\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u031e\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05f9\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u012d\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\44\0\1\u05fa\142\0\1\u05fb\37\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u05fc\10\6"+
+ "\1\5\1\0\22\6\40\0\1\u04dc\63\0\1\5\7\6"+
+ "\2\0\1\123\1\u05fd\2\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u05fe\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\70\0\1\u05ff\33\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u0600\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u0601\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\14\6\1\u0602\5\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\3\6\1\u0603\2\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\2\6\1\u0604\3\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\6\6\1\u01fc\10\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\4\6\1\u03b6"+
+ "\12\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u0605\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\2\6\1\u0385\14\6\1\5\1\0\22\6"+
+ "\66\0\1\u0606\35\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\7\6\1\u0607\7\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\1\u0608\2\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0609\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u060a\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u060b\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\u060c\5\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u0472\1\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\5\6\1\u060d\1\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\4\6\1\u060e\1\u01e3\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\14\6\1\u060f\2\6\1\u0610\2\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\2\6\1\u045e\17\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\1\6\1\u05e6\4\6\13\0\17\6\1\5"+
+ "\1\0\22\6\60\0\1\u0611\43\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0612\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\3\6\1\u0613\2\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\4\6\1\u0614\12\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0615\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\1\6\1\u0616\1\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\5\6\1\u026d\1\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\4\6\1\u060e\1\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\1\6\1\u0617\15\6"+
+ "\1\u0610\2\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\4\6\1\u0472\12\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\2\6\1\u0618\17\6\1\0\1\5"+
+ "\7\6\2\0\1\123\1\6\1\u05dc\1\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\4\6\1\u0619\1\6\13\0\1\6\1\u061a"+
+ "\15\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u061b\10\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\1\6\1\u061c\4\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\4\6\1\u061d"+
+ "\1\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u061e\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u061f\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\u02ea"+
+ "\5\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u0620"+
+ "\142\0\1\u0621\42\0\1\5\7\6\2\0\1\123\2\6"+
+ "\1\u0622\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0623\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\12\6\1\u0624\4\6"+
+ "\1\5\1\0\22\6\41\0\1\u0625\62\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\13\6\1\u04ed\3\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\u0626\5\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\6\1\u0627"+
+ "\4\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\u0628\5\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\1\0\1\u0629\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u062a\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\67\0\1\u062b\34\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u062c\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u062d\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u062e\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\2\6\1\u0573\14\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u062f\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0630\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\1\6\1\u0631\15\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\4\6"+
+ "\1\u0632\1\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\1\6\1\u0633\4\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u0634\10\6"+
+ "\1\5\1\0\22\6\37\0\1\u0635\64\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0573\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0636\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\6\1\u0637\15\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\1\6\1\u0638\4\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\16\6\1\u0385\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\1\6"+
+ "\1\u04ce\4\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0639\10\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u063a\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\1\6\1\u063b\1\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u063c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u063d\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\6\6\1\u063e\10\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u063f\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0640"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\37\0\1\u04dc"+
+ "\145\0\1\u0641\41\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0642\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\2\6\1\u01fc\14\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\2\6\1\u0643\3\6\13\0"+
+ "\17\6\1\5\1\0\22\6\64\0\1\u0644\37\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\6\6\1\u0645"+
+ "\10\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u0646\15\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\4\6\1\u060e"+
+ "\1\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\7\0\1\u0647\114\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0648\10\6\1\5\1\0\22\6"+
+ "\63\0\1\u0649\40\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u01d9\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u02af"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u064a\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u064b\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\2\6"+
+ "\1\u064c\3\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u03a0\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\2\6\1\u064d\14\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\3\6\1\u064e\2\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u064f\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u0650\14\6\1\5\1\0"+
+ "\22\6\34\0\1\u0651\67\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u0652\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\2\6\1\u0653\14\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\3\6\1\u0654\2\6\13\0"+
+ "\17\6\1\5\1\0\22\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u0472"+
+ "\21\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u04ed\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u0655\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u0197\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\3\6"+
+ "\1\u0656\2\6\13\0\17\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\2\6"+
+ "\1\u032f\14\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\2\6\1\u0657\3\6\13\0\17\6"+
+ "\1\5\1\0\22\6\75\0\1\u0658\66\0\1\u0659\62\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0638\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u065a\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\66\0\1\u065b\35\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u065c\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\5\6\1\u039b\11\6\1\5\1\0"+
+ "\22\6\61\0\1\u065d\42\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\3\6\1\u065e\2\6\13\0\17\6\1\5\1\0"+
+ "\22\6\43\0\1\u065f\60\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\2\6\1\u0660\14\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\5\6"+
+ "\1\u0661\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\5\6\1\u03f3\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\2\6\1\u0662\3\6\13\0\17\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\13\6\1\u0573\3\6\1\5\1\0\22\6\1\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\4\6"+
+ "\1\u0663\12\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u05b0\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\65\0\1\u0664\36\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\16\6"+
+ "\1\u0665\3\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\6\6\1\u0666\10\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u054f\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\u0667\5\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\7\6\1\u0668\7\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0669"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\41\0\1\u066a"+
+ "\111\0\1\u066b\52\0\1\u066c\20\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\5\6\1\u066d\13\0\17\6\1\5\1\0"+
+ "\22\6\67\0\1\u066e\34\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u066f\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\15\0\1\u0670\106\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\4\6\1\u0671\1\6\13\0\17\6\1\5\1\0"+
+ "\22\6\41\0\1\u0672\62\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\1\u03e9"+
+ "\5\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\5\6\1\u0673\1\6\2\0\1\123\3\6"+
+ "\1\0\1\6\1\0\1\5\1\6\3\0\6\6\2\0"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\2\0\6\6\13\0\17\6\1\5"+
+ "\1\0\14\6\1\u0674\5\6\1\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\6\6\1\u04fb\10\6\1\5"+
+ "\1\0\22\6\64\0\1\u0675\37\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\2\6\1\u0676\3\6\13\0\17\6\1\5"+
+ "\1\0\22\6\1\0\1\5\7\6\2\0\1\123\1\6"+
+ "\1\u0677\1\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\3\6\1\u0678"+
+ "\2\6\13\0\17\6\1\5\1\0\22\6\1\0\1\5"+
+ "\7\6\2\0\1\123\3\6\1\0\1\6\1\0\1\5"+
+ "\1\6\3\0\6\6\1\0\1\u0679\6\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\7\6\1\u067a\7\6\1\5\1\0"+
+ "\22\6\62\0\1\u067b\103\0\1\u067c\143\0\1\u067d\37\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u067e\10\6\1\5\1\0\22\6\42\0\1\u067f\61\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\6\6\13\0\6\6"+
+ "\1\u0680\10\6\1\5\1\0\22\6\37\0\1\u0681\64\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\1\u034a\5\6\2\0\6\6\13\0"+
+ "\17\6\1\5\1\0\22\6\34\0\1\u02d3\50\0\1\u0682"+
+ "\16\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\6\6\13\0"+
+ "\1\u0683\16\6\1\5\1\0\22\6\1\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\6\6\13\0\1\6\1\u0684\15\6"+
+ "\1\5\1\0\22\6\41\0\1\u0685\62\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\1\6\1\u0686\4\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\13\6\1\u012d\3\6\1\5\1\0"+
+ "\22\6\1\0\1\5\7\6\2\0\1\123\1\6\1\u0687"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\116\0"+
+ "\1\u0688\5\0\1\5\7\6\2\0\1\123\3\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\1\0\1\u0689"+
+ "\6\6\13\0\17\6\1\5\1\0\22\6\66\0\1\u068a"+
+ "\115\0\1\u068b\101\0\1\u068c\63\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\1\6\1\u068d\15\6\1\5"+
+ "\1\0\22\6\43\0\1\u068e\60\0\1\5\7\6\2\0"+
+ "\1\123\3\6\1\0\1\6\1\0\1\5\1\6\3\0"+
+ "\6\6\2\0\6\6\13\0\17\6\1\5\1\0\1\u068f"+
+ "\21\6\40\0\1\u0690\151\0\1\u0691\34\0\1\5\7\6"+
+ "\2\0\1\123\3\6\1\0\1\6\1\0\1\5\1\6"+
+ "\3\0\6\6\2\0\3\6\1\u0692\2\6\13\0\17\6"+
+ "\1\5\1\0\22\6\1\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\6\6\1\u0586\10\6\1\5\1\0"+
+ "\22\6\63\0\1\u0693\40\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\5\6\1\u034f\13\0\17\6\1\5\1\0\22\6"+
+ "\1\0\1\5\7\6\2\0\1\123\3\6\1\0\1\6"+
+ "\1\0\1\5\1\6\3\0\6\6\2\0\1\u04ed\5\6"+
+ "\13\0\17\6\1\5\1\0\22\6\41\0\1\u0694\176\0"+
+ "\1\u0695\45\0\1\u0696\146\0\1\u0697\124\0\1\u0698\35\0"+
+ "\1\5\7\6\2\0\1\123\1\6\1\u0699\1\6\1\0"+
+ "\1\6\1\0\1\5\1\6\3\0\6\6\2\0\6\6"+
+ "\13\0\17\6\1\5\1\0\22\6\27\0\1\u069a\74\0"+
+ "\1\5\7\6\2\0\1\123\3\6\1\0\1\6\1\0"+
+ "\1\5\1\6\3\0\6\6\2\0\2\6\1\u069b\3\6"+
+ "\13\0\17\6\1\5\1\0\22\6\61\0\1\u069c\130\0"+
+ "\1\u069d\34\0\1\5\7\6\2\0\1\123\1\6\1\u027a"+
+ "\1\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\22\6\37\0"+
+ "\1\u069e\122\0\1\u069f\77\0\1\u0694\147\0\1\u06a0\157\0"+
+ "\1\u04dc\107\0\1\u0620\40\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\6\6\13\0\17\6\1\5\1\0\10\6\1\u0361"+
+ "\11\6\42\0\1\u06a1\61\0\1\5\7\6\2\0\1\123"+
+ "\3\6\1\0\1\6\1\0\1\5\1\6\3\0\6\6"+
+ "\2\0\1\6\1\u0385\4\6\13\0\17\6\1\5\1\0"+
+ "\22\6\43\0\1\u04dc\73\0\1\u06a2\174\0\1\u06a3\67\0"+
+ "\1\u06a4\153\0\1\u06a5\132\0\1\u06a6\65\0\1\u06a7\144\0"+
+ "\1\u06a8\127\0\1\u06a9\73\0\1\u06aa\144\0\1\u06ab\103\0"+
+ "\1\u06ac\75\0\1\u06ad\146\0\1\u06ae\117\0\1\u06af\100\0"+
+ "\1\u06b0\137\0\1\u06b1\201\0\1\u06b2\55\0\1\u06b3\165\0"+
+ "\1\u06b4\53\0\1\u06b5\126\0\1\u06b6\121\0\1\u06b7\142\0"+
+ "\1\u04dc\134\0\1\u06b8\61\0\1\u06b9\130\0\1\u022e\76\0"+
+ "\1\u06ba\170\0\1\u057b\120\0\1\u06bb\123\0\1\u06bc\100\0"+
+ "\1\u06bd\125\0\1\u0596\146\0\1\u04dc\34\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[140104];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, 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 =
+ "\4\0\6\1\1\11\3\1\1\11\20\1\2\11\3\1"+
+ "\1\11\32\1\1\11\5\1\1\11\10\1\1\11\25\1"+
+ "\1\11\1\0\12\1\2\11\41\1\1\0\107\1\2\0"+
+ "\1\11\4\0\1\11\2\0\1\11\22\0\3\1\1\0"+
+ "\15\1\1\11\12\1\1\11\205\1\37\0\22\1\1\11"+
+ "\141\1\1\0\32\1\2\0\1\1\2\0\1\1\10\0"+
+ "\1\11\17\0\154\1\1\0\32\1\35\0\146\1\1\0"+
+ "\27\1\22\0\13\1\1\0\103\1\1\0\11\1\1\0"+
+ "\33\1\2\0\1\1\6\0\12\1\2\0\75\1\2\0"+
+ "\7\1\1\0\33\1\11\0\11\1\2\0\71\1\2\0"+
+ "\6\1\1\11\26\1\5\0\4\1\1\0\3\1\2\0"+
+ "\3\1\1\0\51\1\2\0\27\1\5\0\3\1\2\0"+
+ "\1\1\2\0\3\1\1\0\42\1\2\0\21\1\2\0"+
+ "\2\1\2\0\1\1\2\0\3\1\1\0\11\1\1\0"+
+ "\23\1\1\0\24\1\2\0\1\1\1\0\2\1\1\0"+
+ "\11\1\1\0\12\1\1\0\21\1\2\0\3\1\1\0"+
+ "\6\1\1\0\12\1\1\0\16\1\2\0\3\1\1\0"+
+ "\3\1\1\0\1\1\1\0\11\1\1\0\12\1\2\0"+
+ "\2\1\1\0\2\1\1\0\1\1\1\0\7\1\1\0"+
+ "\6\1\2\0\1\1\1\0\1\1\1\0\1\1\1\0"+
+ "\4\1\1\0\5\1\3\0\1\1\1\0\1\1\1\0"+
+ "\1\1\1\0\2\1\1\0\3\1\1\0\1\1\3\0"+
+ "\1\1\1\0\1\1\2\0\2\1\1\0\2\1\5\0"+
+ "\1\1\1\0\1\1\2\0\1\1\6\0\1\1\1\0"+
+ "\1\1\16\0\1\1\23\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[1725];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JavaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public JavaTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public JavaTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 192) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 38: break;
+ case 32:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 39: break;
+ case 13:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 40: break;
+ case 18:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 41: break;
+ case 15:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 42: break;
+ case 4:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 43: break;
+ case 19:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 44: break;
+ case 10:
+ { addToken(Token.ANNOTATION);
+ }
+ case 45: break;
+ case 30:
+ { addToken(Token.FUNCTION);
+ }
+ case 46: break;
+ case 6:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 47: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 48: break;
+ case 34:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_DOCUMENTATION); start = zzMarkedPos;
+ }
+ case 49: break;
+ case 26:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 50: break;
+ case 17:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 51: break;
+ case 21:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 52: break;
+ case 7:
+ { addToken(Token.WHITESPACE);
+ }
+ case 53: break;
+ case 24:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_DOCUMENTATION);
+ }
+ case 54: break;
+ case 29:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 55: break;
+ case 23:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 56: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 57: break;
+ case 25:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_MARKUP); start = zzMarkedPos;
+ }
+ case 58: break;
+ case 28:
+ { start = zzMarkedPos-3; yybegin(DOCCOMMENT);
+ }
+ case 59: break;
+ case 35:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_KEYWORD); start = zzMarkedPos;
+ }
+ case 60: break;
+ case 22:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 61: break;
+ case 33:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 62: break;
+ case 37:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 63: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 64: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 65: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 66: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 67: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 68: break;
+ case 16:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 69: break;
+ case 36:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 70: break;
+ case 20:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 71: break;
+ case 31:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 72: break;
+ case 11:
+ {
+ }
+ case 73: break;
+ case 27:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 74: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 1726: break;
+ case DOCCOMMENT: {
+ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 1727: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 1728: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 1729: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex
new file mode 100644
index 0000000..91ba285
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex
@@ -0,0 +1,260 @@
+/*
+ * 12/23/2012
+ *
+ * JsonTokenMaker.java - Scanner for the JSON.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the JSON.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JsonTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class JsonTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JsonTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns <code>true</code> always as C-style languages use curly braces
+ * to denote code blocks.
+ *
+ * @return <code>true</code> always.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return true;
+ }
+
+
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ public boolean getShouldIndentNextLineAfter(Token t) {
+ if (t!=null && t.textCount==1) {
+ char ch = t.text[t.textOffset];
+ return ch=='{' || ch=='[';
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ start = text.offset;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Whitespace = ([ \t\f]+)
+Digit = ([0-9])
+HexDigit = ({Digit}|[A-Fa-f])
+IdentifierStart = ([^\" \t\f\[\]\{\}\:,0-9\-])
+IdentifierPart = ({IdentifierStart}|{Digit}|[\-])
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"\\/])|{EscapedSourceCharacter}))
+StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+IntegerLiteral = ("-"?{Digit}+)
+FloatLiteral = ({IntegerLiteral}("."({Digit}+))?([eE][+\-]?{Digit}+)?)
+
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\{\}\[\]])
+Separator2 = ([\:,])
+
+%%
+
+<YYINITIAL> {
+
+ "null" { addToken(Token.RESERVED_WORD); }
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ \n |
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as identifiers. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java
new file mode 100644
index 0000000..f76a8c2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/JsonTokenMaker.java
@@ -0,0 +1,699 @@
+/* The following code was generated by JFlex 1.4.1 on 12/23/12 10:47 PM */
+
+/*
+ * 12/23/2012
+ *
+ * JsonTokenMaker.java - Scanner for the JSON.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the JSON.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated JsonTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class JsonTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\1\1\6\1\0\1\1\23\0\1\1\1\0\1\7\10\0"+
+ "\1\16\1\4\1\5\1\14\1\12\12\2\1\4\6\0\4\3\1\15"+
+ "\1\3\24\0\1\26\1\11\1\26\3\0\1\23\1\13\2\3\1\21"+
+ "\1\22\5\0\1\24\1\0\1\27\3\0\1\20\1\25\1\17\1\10"+
+ "\5\0\1\26\1\0\1\26\uff82\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 =
+ "\1\0\1\1\1\2\1\3\2\1\1\4\2\1\1\5"+
+ "\1\1\2\0\1\4\1\6\1\4\3\1\2\7\1\0"+
+ "\1\10\2\4\3\1\1\4\1\11\1\12\2\4";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[33];
+ 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\30\0\60\0\110\0\140\0\170\0\220\0\250"+
+ "\0\300\0\140\0\330\0\360\0\u0108\0\u0120\0\140\0\u0138"+
+ "\0\u0150\0\u0168\0\u0180\0\u0198\0\u01b0\0\u01b0\0\140\0\u01c8"+
+ "\0\u01e0\0\u01f8\0\u0210\0\u0228\0\u0240\0\30\0\30\0\u0258"+
+ "\0\u0270";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[33];
+ 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 =
+ "\1\2\1\3\1\4\1\2\1\5\1\6\1\2\1\7"+
+ "\7\2\1\10\2\2\1\11\3\2\1\12\1\13\1\2"+
+ "\1\0\2\2\1\0\2\2\1\0\16\2\1\0\1\2"+
+ "\1\0\1\3\30\0\1\4\11\0\1\14\1\15\3\0"+
+ "\1\15\40\0\1\4\25\0\6\7\1\16\1\17\1\7"+
+ "\1\20\16\7\1\2\1\0\2\2\1\0\2\2\1\0"+
+ "\10\2\1\21\5\2\1\0\2\2\1\0\2\2\1\0"+
+ "\2\2\1\0\13\2\1\22\2\2\1\0\2\2\1\0"+
+ "\2\2\1\0\2\2\1\0\1\23\15\2\1\0\1\2"+
+ "\2\0\1\24\27\0\1\25\2\0\1\26\10\0\1\26"+
+ "\11\0\7\16\1\27\1\16\1\30\24\16\1\0\1\7"+
+ "\1\31\3\7\3\16\2\7\1\16\1\7\4\16\1\7"+
+ "\1\2\1\0\2\2\1\0\2\2\1\0\1\32\15\2"+
+ "\1\0\2\2\1\0\2\2\1\0\2\2\1\0\14\2"+
+ "\1\33\1\2\1\0\2\2\1\0\2\2\1\0\2\2"+
+ "\1\0\14\2\1\34\1\2\1\0\1\2\2\0\1\24"+
+ "\12\0\1\15\3\0\1\15\10\0\1\25\25\0\6\16"+
+ "\1\0\23\16\2\35\3\16\1\27\1\16\1\30\1\16"+
+ "\1\35\1\16\1\35\3\16\3\35\4\16\1\2\1\0"+
+ "\2\2\1\0\2\2\1\0\11\2\1\36\4\2\1\0"+
+ "\2\2\1\0\2\2\1\0\2\2\1\0\15\2\1\32"+
+ "\1\0\2\2\1\0\2\2\1\0\2\2\1\0\14\2"+
+ "\1\37\1\2\1\0\1\2\2\16\2\40\3\16\1\27"+
+ "\1\16\1\30\1\16\1\40\1\16\1\40\3\16\3\40"+
+ "\6\16\2\41\3\16\1\27\1\16\1\30\1\16\1\41"+
+ "\1\16\1\41\3\16\3\41\6\16\2\7\3\16\1\27"+
+ "\1\16\1\30\1\16\1\7\1\16\1\7\3\16\3\7"+
+ "\4\16";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[648];
+ 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 =
+ "\1\0\3\1\1\11\4\1\1\11\1\1\2\0\1\1"+
+ "\1\11\6\1\1\0\1\11\12\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[33];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public JsonTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns <code>true</code> always as C-style languages use curly braces
+ * to denote code blocks.
+ *
+ * @return <code>true</code> always.
+ */
+ public boolean getCurlyBracesDenoteCodeBlocks() {
+ return true;
+ }
+
+
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ public boolean getShouldIndentNextLineAfter(Token t) {
+ if (t!=null && t.textCount==1) {
+ char ch = t.text[t.textOffset];
+ return ch=='{' || ch=='[';
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ start = text.offset;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public JsonTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public JsonTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 90) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 10:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 11: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 12: break;
+ case 6:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 13: break;
+ case 7:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 14: break;
+ case 2:
+ { addToken(Token.WHITESPACE);
+ }
+ case 15: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 16: break;
+ case 9:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 17: break;
+ case 4:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 18: break;
+ case 8:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 19: break;
+ case 5:
+ { addToken(Token.SEPARATOR);
+ }
+ case 20: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 34: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex
new file mode 100644
index 0000000..d720d06
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex
@@ -0,0 +1,268 @@
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated LatexTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LatexTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LatexTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * ${inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "%", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = ([A-Za-z])
+Digit = ([0-9])
+LetterOrUnderscore = ({Letter}|[_])
+AnyChar = ({LetterOrUnderscore}|{Digit}|[\-])
+Whitespace = ([ \t\f])
+LineCommentBegin = "%"
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ ([\\]{AnyChar}+) { addToken(Token.FUNCTION); }
+ [\{\}] { addToken(Token.SEPARATOR); }
+ ("\\begin{"{AnyChar}+"}") { int temp = zzStartRead;
+ addToken(temp, temp+5, Token.RESERVED_WORD);
+ addToken(temp+6, temp+6, Token.SEPARATOR);
+ addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ }
+ ("\\end{"{AnyChar}+"}") { int temp = zzStartRead;
+ addToken(temp, temp+3, Token.RESERVED_WORD);
+ addToken(temp+4, temp+4, Token.SEPARATOR);
+ addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+ "\n" |
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as identifiers. */
+ {AnyChar}+ |
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java
new file mode 100644
index 0000000..e335280
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LatexTokenMaker.java
@@ -0,0 +1,716 @@
+/* The following code was generated by JFlex 1.4.1 on 4/28/12 4:57 PM */
+
+/*
+ * 04/24/2012
+ *
+ * LatexTokenMaker.java - Scanner for LaTeX.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the LaTeX.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RSTA always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated LatexTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LatexTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\3\1\32\1\0\1\3\23\0\1\3\1\5\1\0\1\5"+
+ "\1\7\1\4\7\5\1\2\1\22\1\6\12\1\1\20\1\5\1\0"+
+ "\1\5\1\0\2\5\32\1\1\5\1\23\1\5\1\0\1\2\1\0"+
+ "\1\1\1\25\1\1\1\31\1\17\1\14\1\26\1\10\1\15\2\1"+
+ "\1\16\1\1\1\27\1\1\1\12\2\1\1\13\1\11\2\1\1\21"+
+ "\3\1\1\30\1\0\1\24\1\5\uff81\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 =
+ "\2\0\2\1\1\2\1\3\1\1\1\4\1\5\4\6"+
+ "\1\7\3\10\4\0\2\10\4\0\2\10\2\0\1\11"+
+ "\1\0\1\10\3\0\1\10\1\12\2\0\1\13";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[42];
+ 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\33\0\66\0\121\0\66\0\66\0\154\0\66"+
+ "\0\66\0\207\0\242\0\275\0\330\0\66\0\363\0\u010e"+
+ "\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195\0\u01b0\0\u01cb\0\u01e6"+
+ "\0\u0201\0\u021c\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3\0\u02be"+
+ "\0\u02d9\0\u02f4\0\u030f\0\u02be\0\u032a\0\u0345\0\66\0\u0360"+
+ "\0\u037b\0\66";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[42];
+ 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 =
+ "\1\3\2\4\1\5\1\6\3\3\10\4\1\3\1\4"+
+ "\1\3\1\7\1\10\3\4\1\10\1\4\1\11\10\12"+
+ "\1\13\3\12\1\14\4\12\1\15\10\12\1\16\34\0"+
+ "\2\4\5\0\10\4\1\0\1\4\3\0\3\4\1\0"+
+ "\1\4\2\0\2\17\5\0\7\17\1\20\1\0\1\17"+
+ "\3\0\1\21\2\17\1\0\1\17\1\0\10\12\1\0"+
+ "\3\12\1\0\4\12\1\0\10\12\12\0\1\22\32\0"+
+ "\1\23\3\0\1\24\36\0\1\25\12\0\2\17\5\0"+
+ "\10\17\1\0\1\17\3\0\3\17\1\0\1\17\2\0"+
+ "\2\17\5\0\10\17\1\0\1\17\3\0\2\17\1\26"+
+ "\1\0\1\17\2\0\2\17\5\0\7\17\1\27\1\0"+
+ "\1\17\3\0\3\17\1\0\1\17\12\0\1\30\33\0"+
+ "\1\31\36\0\1\32\35\0\1\33\12\0\2\17\5\0"+
+ "\10\17\1\0\1\17\3\0\3\17\1\0\1\34\2\0"+
+ "\2\17\5\0\10\17\1\0\1\17\3\0\1\17\1\35"+
+ "\1\17\1\0\1\17\13\0\1\36\40\0\1\37\31\0"+
+ "\1\31\35\0\1\40\11\0\2\17\5\0\10\17\1\0"+
+ "\1\17\3\0\3\17\1\41\1\17\2\0\2\17\5\0"+
+ "\5\17\1\42\2\17\1\0\1\17\3\0\3\17\1\0"+
+ "\1\17\14\0\1\31\4\0\1\37\20\0\1\43\25\0"+
+ "\1\40\1\44\1\0\2\44\12\40\1\44\1\40\1\44"+
+ "\2\0\3\40\1\0\1\40\2\0\2\45\5\0\10\45"+
+ "\1\0\1\45\3\0\3\45\1\0\1\45\2\0\2\17"+
+ "\5\0\10\17\1\0\1\17\3\0\2\17\1\46\1\0"+
+ "\1\17\7\0\1\40\25\0\2\45\5\0\10\45\1\0"+
+ "\1\45\2\0\1\47\3\45\1\0\1\45\2\0\2\17"+
+ "\5\0\10\17\1\0\1\17\3\0\3\17\1\50\1\17"+
+ "\2\0\2\51\5\0\10\51\1\0\1\51\3\0\3\51"+
+ "\1\0\1\51\2\0\2\51\5\0\10\51\1\0\1\51"+
+ "\2\0\1\52\3\51\1\0\1\51\1\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[918];
+ 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 =
+ "\2\0\1\11\1\1\2\11\1\1\2\11\4\1\1\11"+
+ "\3\1\4\0\2\1\4\0\2\1\2\0\1\1\1\0"+
+ "\1\1\3\0\1\1\1\11\2\0\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[42];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LatexTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * ${inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "%", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public LatexTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public LatexTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 112) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 12: break;
+ case 8:
+ { addToken(Token.FUNCTION);
+ }
+ case 13: break;
+ case 2:
+ { addToken(Token.WHITESPACE);
+ }
+ case 14: break;
+ case 9:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 15: break;
+ case 3:
+ { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+ }
+ case 16: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 17: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 18: break;
+ case 10:
+ { int temp = zzStartRead;
+ addToken(temp, temp+3, Token.RESERVED_WORD);
+ addToken(temp+4, temp+4, Token.SEPARATOR);
+ addToken(temp+5, zzMarkedPos-2, Token.RESERVED_WORD);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ }
+ case 19: break;
+ case 11:
+ { int temp = zzStartRead;
+ addToken(temp, temp+5, Token.RESERVED_WORD);
+ addToken(temp+6, temp+6, Token.SEPARATOR);
+ addToken(temp+7, zzMarkedPos-2, Token.RESERVED_WORD);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ }
+ case 20: break;
+ case 6:
+ {
+ }
+ case 21: break;
+ case 4:
+ { addToken(Token.SEPARATOR);
+ }
+ case 22: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 43: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 44: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex
new file mode 100644
index 0000000..6fdbb96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.flex
@@ -0,0 +1,432 @@
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated LispTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class LispTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LispTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+MLCBegin = "#|"
+MLCEnd = "|#"
+LineCommentBegin = ";"
+
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator = ([\(\)])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ "defclass" |
+ "defconstant" |
+ "defgeneric" |
+ "define-compiler-macro" |
+ "define-condition" |
+ "define-method-combination" |
+ "define-modify-macro" |
+ "define-setf-expander" |
+ "define-symbol-macro" |
+ "defmacro" |
+ "defmethod" |
+ "defpackage" |
+ "defparameter" |
+ "defsetf" |
+ "defstruct" |
+ "deftype" |
+ "defun" |
+ "defvar" { addToken(Token.RESERVED_WORD); }
+
+ "abort" |
+ "assert" |
+ "block" |
+ "break" |
+ "case" |
+ "catch" |
+ "ccase" |
+ "cerror" |
+ "cond" |
+ "ctypecase" |
+ "declaim" |
+ "declare" |
+ "do" |
+ "do*" |
+ "do-all-symbols" |
+ "do-external-symbols" |
+ "do-symbols" |
+ "dolist" |
+ "dotimes" |
+ "ecase" |
+ "error" |
+ "etypecase" |
+ "eval-when" |
+ "flet" |
+ "handler-bind" |
+ "handler-case" |
+ "if" |
+ "ignore-errors" |
+ "in-package" |
+ "labels" |
+ "lambda" |
+ "let" |
+ "let*" |
+ "locally" |
+ "loop" |
+ "macrolet" |
+ "multiple-value-bind" |
+ "proclaim" |
+ "prog" |
+ "prog*" |
+ "prog1" |
+ "prog2" |
+ "progn" |
+ "progv" |
+ "provide" |
+ "require" |
+ "restart-bind" |
+ "restart-case" |
+ "restart-name" |
+ "return" |
+ "return-from" |
+ "signal" |
+ "symbol-macrolet" |
+ "tagbody" |
+ "the" |
+ "throw" |
+ "typecase" |
+ "unless" |
+ "unwind-protect" |
+ "when" |
+ "with-accessors" |
+ "with-compilation-unit" |
+ "with-condition-restarts" |
+ "with-hash-table-iterator" |
+ "with-input-from-string" |
+ "with-open-file" |
+ "with-open-stream" |
+ "with-output-to-string" |
+ "with-package-iterator" |
+ "with-simple-restart" |
+ "with-slots" |
+ "with-standard-io-syntax" { addToken(Token.RESERVED_WORD); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+ [\"] { start = zzMarkedPos-1; yybegin(STRING); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+ [^\n\\\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<MLC> {
+
+ [^hwf\n\|]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \| {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java
new file mode 100644
index 0000000..a2a485e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LispTokenMaker.java
@@ -0,0 +1,1308 @@
+/* The following code was generated by JFlex 1.4.1 on 6/11/09 9:34 AM */
+
+/*
+ * 11/13/2004
+ *
+ * LispTokenMaker.java - Scanner for the Lisp programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lisp programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated LispTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class LispTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+ private static final int ZZ_BUFFERSIZE = 16384;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 3;
+ public static final int STRING = 1;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\14\1\13\1\0\1\14\1\10\22\0\1\14\1\34\1\73"+
+ "\1\11\1\1\1\34\1\37\1\42\2\25\1\32\1\26\1\42\1\23"+
+ "\1\24\1\35\1\4\1\71\1\71\5\6\2\3\1\40\1\16\1\27"+
+ "\1\30\1\33\1\36\1\41\3\5\1\21\1\22\1\21\5\1\1\20"+
+ "\13\1\1\17\2\1\1\42\1\12\1\42\1\31\1\2\1\0\1\56"+
+ "\1\64\1\55\1\54\1\52\1\47\1\61\1\43\1\50\1\1\1\67"+
+ "\1\51\1\63\1\60\1\57\1\45\1\72\1\62\1\46\1\44\1\7"+
+ "\1\70\1\53\1\66\1\65\1\1\1\10\1\15\1\10\1\36\uff81\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 =
+ "\4\0\1\1\1\2\2\3\1\2\2\1\1\4\1\5"+
+ "\1\6\1\7\1\6\1\1\1\10\5\6\17\2\1\11"+
+ "\1\12\1\13\1\14\1\15\1\12\1\16\5\12\1\17"+
+ "\3\12\1\1\1\20\1\3\1\21\1\20\1\21\1\20"+
+ "\1\22\1\20\1\2\1\23\1\0\1\6\10\2\1\24"+
+ "\14\2\1\24\12\2\1\13\1\25\10\0\1\1\1\21"+
+ "\1\0\2\22\12\2\1\0\1\2\1\24\13\2\1\0"+
+ "\1\24\16\2\10\0\1\1\7\2\1\24\3\2\1\0"+
+ "\20\2\3\0\11\2\2\0\1\26\2\0\1\27\1\1"+
+ "\10\2\1\0\3\2\2\0\13\2\3\0\5\2\4\0"+
+ "\1\1\5\2\1\0\1\2\10\0\12\2\3\0\1\24"+
+ "\2\2\1\0\1\2\16\0\3\2\1\0\4\2\4\0"+
+ "\2\2\21\0\2\2\3\0\2\2\4\0\1\2\21\0"+
+ "\1\2\5\0\2\2\23\0\1\2\201\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[512];
+ 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\74\0\170\0\264\0\360\0\u012c\0\u0168\0\u01a4"+
+ "\0\u01e0\0\u021c\0\u0258\0\u021c\0\u0294\0\u02d0\0\u021c\0\u030c"+
+ "\0\u0348\0\u021c\0\u0384\0\u03c0\0\u03fc\0\u021c\0\u0438\0\u0474"+
+ "\0\u04b0\0\u04ec\0\u0528\0\u0564\0\u05a0\0\u05dc\0\u0618\0\u0654"+
+ "\0\u0690\0\u06cc\0\u0708\0\u0744\0\u0780\0\u07bc\0\u021c\0\u07f8"+
+ "\0\u0834\0\u021c\0\u021c\0\u0870\0\u021c\0\u08ac\0\u08e8\0\u0924"+
+ "\0\u0960\0\u099c\0\u021c\0\u09d8\0\u0a14\0\u0a50\0\u0a8c\0\u0ac8"+
+ "\0\u0ac8\0\u0ac8\0\u0b04\0\u0b40\0\u0b7c\0\u0bb8\0\u0bf4\0\u0c30"+
+ "\0\u021c\0\u02d0\0\u0c6c\0\u0ca8\0\u0ce4\0\u0d20\0\u0d5c\0\u0d98"+
+ "\0\u0dd4\0\u0e10\0\u0e4c\0\u012c\0\u0e88\0\u0ec4\0\u0f00\0\u0f3c"+
+ "\0\u0f78\0\u0fb4\0\u0ff0\0\u102c\0\u1068\0\u10a4\0\u10e0\0\u111c"+
+ "\0\u1158\0\u1194\0\u11d0\0\u120c\0\u1248\0\u1284\0\u12c0\0\u12fc"+
+ "\0\u1338\0\u1374\0\u13b0\0\u021c\0\u021c\0\u13ec\0\u1428\0\u1464"+
+ "\0\u14a0\0\u14dc\0\u1518\0\u1554\0\u1590\0\u15cc\0\u1608\0\u1644"+
+ "\0\u0ac8\0\u1680\0\u16bc\0\u16f8\0\u1734\0\u1770\0\u17ac\0\u17e8"+
+ "\0\u1824\0\u1860\0\u189c\0\u18d8\0\u1914\0\u1950\0\u198c\0\u19c8"+
+ "\0\u1a04\0\u1a40\0\u1a7c\0\u1ab8\0\u1af4\0\u1b30\0\u1b6c\0\u1ba8"+
+ "\0\u1be4\0\u1c20\0\u1c5c\0\u021c\0\u1c98\0\u1cd4\0\u1d10\0\u1d4c"+
+ "\0\u1d88\0\u1dc4\0\u1e00\0\u1e3c\0\u1e78\0\u1eb4\0\u1ef0\0\u1f2c"+
+ "\0\u1f68\0\u1fa4\0\u1fe0\0\u201c\0\u2058\0\u2094\0\u20d0\0\u210c"+
+ "\0\u2148\0\u2184\0\u21c0\0\u21fc\0\u2238\0\u2274\0\u22b0\0\u22ec"+
+ "\0\u2328\0\u2364\0\u23a0\0\u23dc\0\u2418\0\u2454\0\u2490\0\u24cc"+
+ "\0\u2508\0\u2544\0\u2580\0\u25bc\0\u25f8\0\u2634\0\u2670\0\u26ac"+
+ "\0\u26e8\0\u2724\0\u2760\0\u279c\0\u27d8\0\u2814\0\u2850\0\u288c"+
+ "\0\u28c8\0\u2904\0\u2940\0\u297c\0\u29b8\0\u29f4\0\u2a30\0\u2a6c"+
+ "\0\u2aa8\0\u2ae4\0\u2b20\0\u2b5c\0\u2b98\0\u2bd4\0\u2c10\0\u2c4c"+
+ "\0\u2c88\0\u2cc4\0\u2d00\0\u2d3c\0\u2d78\0\u2db4\0\u2df0\0\u2e2c"+
+ "\0\u2e68\0\u2ea4\0\u2ee0\0\u2f1c\0\u2f58\0\u2f94\0\u2fd0\0\u300c"+
+ "\0\u3048\0\u3084\0\u30c0\0\u30fc\0\u3138\0\u3174\0\u31b0\0\u31ec"+
+ "\0\u3228\0\u3264\0\u32a0\0\u32dc\0\u3318\0\u3354\0\u3390\0\u33cc"+
+ "\0\u3408\0\u3444\0\u3480\0\u34bc\0\u2bd4\0\u34f8\0\u2c88\0\u3534"+
+ "\0\u3570\0\u35ac\0\u35e8\0\u3624\0\u3660\0\u369c\0\u36d8\0\u3714"+
+ "\0\u3750\0\u378c\0\u37c8\0\u3804\0\u3840\0\u387c\0\u38b8\0\u38f4"+
+ "\0\u3930\0\u396c\0\u39a8\0\u39e4\0\u3a20\0\u3a5c\0\u3a98\0\u3ad4"+
+ "\0\u3b10\0\u3b4c\0\u3b88\0\u3bc4\0\u3c00\0\u3c3c\0\u3c78\0\u3cb4"+
+ "\0\u3cf0\0\u3d2c\0\u3d68\0\u3da4\0\u3de0\0\u3e1c\0\u3e58\0\u3e94"+
+ "\0\u3ed0\0\u3f0c\0\u3f48\0\u3f84\0\u3fc0\0\u3ffc\0\u4038\0\u4074"+
+ "\0\u40b0\0\u40ec\0\u4128\0\u4164\0\u41a0\0\u41dc\0\u4218\0\u4254"+
+ "\0\u4290\0\u42cc\0\u4308\0\u4344\0\u4380\0\u43bc\0\u43f8\0\u4434"+
+ "\0\u4470\0\u44ac\0\u44e8\0\u4524\0\u4560\0\u459c\0\u45d8\0\u4614"+
+ "\0\u4650\0\u468c\0\u46c8\0\u4704\0\u4740\0\u477c\0\u47b8\0\u47f4"+
+ "\0\u4830\0\u486c\0\u48a8\0\u48e4\0\u4920\0\u495c\0\u4998\0\u49d4"+
+ "\0\u4a10\0\u4a4c\0\u4a88\0\u4ac4\0\u4b00\0\u4b3c\0\u4b78\0\u4bb4"+
+ "\0\u4bf0\0\u4c2c\0\u4c68\0\u4ca4\0\u4ce0\0\u4d1c\0\u4d58\0\u4d94"+
+ "\0\u4dd0\0\u4e0c\0\u4e48\0\u4e84\0\u4ec0\0\u4efc\0\u4f38\0\u4f74"+
+ "\0\u4fb0\0\u4fec\0\u5028\0\u5064\0\u50a0\0\u50dc\0\u5118\0\u5154"+
+ "\0\u5190\0\u51cc\0\u5208\0\u5244\0\u5280\0\u52bc\0\u52f8\0\u5334"+
+ "\0\u5370\0\u53ac\0\u53e8\0\u5424\0\u5460\0\u549c\0\u54d8\0\u5514"+
+ "\0\u5550\0\u558c\0\u55c8\0\u5604\0\u5640\0\u567c\0\u56b8\0\u56f4"+
+ "\0\u5730\0\u576c\0\u57a8\0\u57e4\0\u5820\0\u585c\0\u5898\0\u58d4"+
+ "\0\u5910\0\u594c\0\u5988\0\u59c4\0\u5a00\0\u5a3c\0\u5a78\0\u5ab4"+
+ "\0\u5af0\0\u5b2c\0\u5b68\0\u5ba4\0\u5be0\0\u5c1c\0\u5c58\0\u5c94"+
+ "\0\u5cd0\0\u5d0c\0\u5d48\0\u5d84\0\u5dc0\0\u5dfc\0\u5e38\0\u5e74"+
+ "\0\u5eb0\0\u5eec\0\u5f28\0\u5f64\0\u5fa0\0\u5fdc\0\u6018\0\u6054"+
+ "\0\u6090\0\u60cc\0\u6108\0\u6144\0\u6180\0\u61bc\0\u61f8\0\u6234"+
+ "\0\u6270\0\u62ac\0\u62e8\0\u6324\0\u6360\0\u639c\0\u63d8\0\u6414"+
+ "\0\u6450\0\u648c\0\u64c8\0\u6504\0\u6540\0\u657c\0\u65b8\0\u65f4"+
+ "\0\u6630\0\u666c\0\u66a8\0\u66e4\0\u6720\0\u675c\0\u6798\0\u67d4"+
+ "\0\u6810\0\u684c\0\u6888\0\u68c4\0\u6900\0\u693c\0\u6978\0\u69b4"+
+ "\0\u69f0\0\u6a2c\0\u6a68\0\u6aa4\0\u6ae0\0\u6b1c\0\u6b58\0\u6b94"+
+ "\0\u6bd0\0\u6c0c\0\u6c48\0\u6c84\0\u6cc0\0\u6cfc\0\u6d38\0\u6d74"+
+ "\0\u6db0\0\u6dec\0\u6e28\0\u6e64\0\u6ea0\0\u6edc\0\u6f18\0\u6f54"+
+ "\0\u6f90\0\u6fcc\0\u7008\0\u7044\0\u7080\0\u70bc\0\u70f8\0\u7134"+
+ "\0\u7170\0\u71ac\0\u71e8\0\u7224\0\u7260\0\u729c\0\u72d8\0\u7314";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[512];
+ 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 =
+ "\1\5\2\6\1\7\1\10\1\6\1\7\1\11\1\12"+
+ "\1\13\1\5\1\14\1\15\1\16\1\17\4\6\1\20"+
+ "\1\21\1\22\1\23\1\24\3\16\1\25\2\16\1\26"+
+ "\1\27\1\26\1\5\1\12\1\30\1\31\1\32\1\33"+
+ "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\1\43"+
+ "\3\6\1\44\1\45\1\46\4\6\1\7\1\6\1\47"+
+ "\12\50\1\51\1\52\57\50\1\53\13\54\1\55\1\54"+
+ "\1\56\25\54\1\57\3\54\1\60\3\54\1\61\20\54"+
+ "\13\62\1\63\27\62\1\64\3\62\1\65\3\62\1\66"+
+ "\20\62\10\5\1\0\2\5\4\0\4\5\16\0\1\5"+
+ "\1\0\30\5\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\30\6\1\0\3\70"+
+ "\2\7\1\70\1\7\1\70\1\0\2\70\4\0\1\70"+
+ "\1\71\1\72\1\73\1\0\1\74\14\0\1\70\1\0"+
+ "\4\70\1\72\1\70\1\71\1\73\1\70\1\72\14\70"+
+ "\1\7\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+ "\1\70\1\0\2\70\4\0\1\77\1\71\1\72\1\73"+
+ "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+ "\1\71\1\73\1\70\1\72\11\70\1\77\2\70\1\76"+
+ "\1\70\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\15\6\1\100\12\6\75\0"+
+ "\10\5\1\0\2\5\2\0\1\101\1\0\4\5\16\0"+
+ "\1\5\1\0\30\5\15\0\1\15\107\0\1\26\66\0"+
+ "\1\26\4\0\1\26\46\0\2\74\1\0\1\74\62\0"+
+ "\1\74\30\0\1\26\1\0\1\26\72\0\1\102\1\26"+
+ "\73\0\1\26\2\0\1\103\70\0\1\26\6\0\1\26"+
+ "\34\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\13\6\1\104\14\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\1\105\12\6\1\106\6\6\1\107\5\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\17\6\1\110\10\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\5\6\1\111\14\6\1\112\5\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\6\6\1\113\21\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\4\6\1\114"+
+ "\10\6\1\115\1\116\11\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+ "\1\117\3\6\1\120\1\121\13\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\1\6\1\122\10\6\1\123\4\6\1\124\5\6\1\125"+
+ "\2\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\1\126\4\6\1\127\22\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\7\6\1\130\4\6\1\131\13\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\1\6\1\122\5\6\1\132\2\6"+
+ "\1\123\1\133\1\134\13\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\3\6"+
+ "\1\135\15\6\1\136\6\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+ "\1\137\20\6\1\0\1\5\6\6\1\140\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\141"+
+ "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\6\6\1\142\10\6\1\143"+
+ "\10\6\1\0\12\50\2\0\57\50\1\0\13\144\1\0"+
+ "\60\144\13\54\1\0\1\54\1\0\25\54\1\0\3\54"+
+ "\1\0\3\54\1\0\20\54\11\0\1\145\126\0\1\146"+
+ "\73\0\1\147\3\0\1\150\76\0\1\151\20\0\13\62"+
+ "\1\0\27\62\1\0\3\62\1\0\3\62\1\0\20\62"+
+ "\44\0\1\152\73\0\1\153\3\0\1\154\76\0\1\155"+
+ "\20\0\7\5\1\156\1\0\2\5\4\0\4\5\16\0"+
+ "\1\5\1\0\30\5\1\0\10\70\1\0\2\70\4\0"+
+ "\4\70\16\0\1\70\1\0\30\70\1\0\3\70\2\157"+
+ "\1\70\1\157\1\70\1\0\2\70\4\0\4\70\1\160"+
+ "\2\0\1\160\12\0\1\70\1\0\26\70\1\157\1\70"+
+ "\1\0\3\70\2\74\1\70\1\74\1\70\1\0\2\70"+
+ "\4\0\2\70\1\72\1\73\16\0\1\70\1\0\4\70"+
+ "\1\72\2\70\1\73\1\70\1\72\14\70\1\74\1\70"+
+ "\1\0\3\70\2\75\1\70\1\75\1\70\1\0\2\70"+
+ "\4\0\2\70\1\72\1\73\1\0\1\74\14\0\1\70"+
+ "\1\0\4\70\1\72\2\70\1\73\1\70\1\72\14\70"+
+ "\1\75\1\70\1\0\3\70\1\75\1\76\1\70\1\76"+
+ "\1\70\1\0\2\70\4\0\1\70\1\161\1\72\1\73"+
+ "\1\0\1\74\14\0\1\70\1\0\4\70\1\72\1\70"+
+ "\1\161\1\73\1\70\1\72\14\70\1\76\1\70\1\0"+
+ "\3\70\4\162\1\70\1\0\2\70\4\0\2\70\2\162"+
+ "\16\0\1\70\1\0\4\70\1\162\2\70\1\162\1\70"+
+ "\3\162\5\70\1\162\4\70\1\162\1\70\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\6\6\1\163\1\6\1\164\17\6\31\0\1\26"+
+ "\2\0\1\16\40\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\15\6\1\165\12\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\7\6\1\114\7\6\1\166\10\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\16\6\1\167\11\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\2\6\1\170\25\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+ "\1\171\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\16\6\1\172\11\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\20\6\1\173\7\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\7\6\1\174\20\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\1\175\15\0\1\5\1\0"+
+ "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\15\6\1\176\12\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\1\6\1\177\26\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\20\6\1\200\1\201\6\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+ "\1\202\1\6\1\203\13\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+ "\1\107\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\13\6\1\204\14\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\17\6\1\205\10\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\13\6\1\206\14\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+ "\1\207\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\1\6\1\210\26\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\4\6\1\211\5\6\1\212\15\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\1\213\6\0\1\214\6\0\1\5\1\0\1\6\1\215"+
+ "\4\6\1\216\21\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\124"+
+ "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\1\6\1\217\1\6\1\220"+
+ "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\15\6\1\221\12\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\3\6\1\222\24\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\14\6\1\223\13\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\1\6\1\224"+
+ "\1\6\1\225\23\6\1\226\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\6\6"+
+ "\1\227\21\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\12\6\1\230\15\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\14\6\1\231\13\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\7\6\1\232\20\6\45\0\1\233\74\0\1\234"+
+ "\77\0\1\235\75\0\1\236\64\0\1\237\74\0\1\240"+
+ "\77\0\1\241\75\0\1\242\20\0\3\5\4\243\1\5"+
+ "\1\0\2\5\4\0\2\5\2\243\16\0\1\5\1\0"+
+ "\4\5\1\243\2\5\1\243\1\5\3\243\5\5\1\243"+
+ "\4\5\1\243\1\5\1\0\3\70\2\157\1\70\1\157"+
+ "\1\70\1\0\2\70\4\0\2\70\1\72\1\70\16\0"+
+ "\1\70\1\0\4\70\1\72\4\70\1\72\14\70\1\157"+
+ "\1\70\4\0\2\157\1\0\1\157\62\0\1\157\2\0"+
+ "\3\70\4\162\1\70\1\0\2\70\4\0\1\70\1\161"+
+ "\2\162\16\0\1\70\1\0\4\70\1\162\1\70\1\161"+
+ "\1\162\1\70\3\162\5\70\1\162\4\70\1\162\1\70"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\7\6\1\244\20\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\5\6\1\245\22\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\11\6"+
+ "\1\246\16\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\14\6\1\247\13\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\21\6\1\250\6\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\7\6\1\251\20\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+ "\1\252\3\6\1\253\6\6\1\254\2\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\15\6\1\255\12\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\21\6"+
+ "\1\256\6\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\1\6\1\114\26\6"+
+ "\46\0\1\257\26\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\14\6\1\260\13\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\7\0\1\214\6\0\1\5\1\0\30\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\21\6\1\261\6\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+ "\1\262\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\13\6\1\263\14\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\2\6\1\114\25\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\3\6\1\220\24\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\14\6"+
+ "\1\264\13\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\6\6\1\265\21\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\15\6\1\114\12\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\1\266\27\6\1\0\1\5\6\6\1\207\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+ "\1\267\1\270\1\271\1\6\1\272\4\6\1\273\3\6"+
+ "\1\274\1\6\1\275\4\6\1\276\2\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\6\6\1\277\21\6\47\0\1\300\3\0\1\301"+
+ "\3\0\1\302\15\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\5\6\1\303\22\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\5\6\1\304\22\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\12\6\1\305\15\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\7\6"+
+ "\1\114\20\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\11\6\1\114\16\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\7\6\1\223\20\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\17\6\1\174\10\6\1\0\1\5\6\6\1\306"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\30\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\1\6\1\307\26\6\1\0"+
+ "\1\5\6\6\1\310\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\30\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\1\6"+
+ "\1\311\26\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\17\6\1\312\10\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\12\6\1\313\15\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\13\6\1\313\14\6\46\0\1\314\66\0\1\315"+
+ "\105\0\1\234\45\0\1\316\114\0\1\317\66\0\1\320"+
+ "\105\0\1\240\45\0\1\321\47\0\3\5\4\322\1\5"+
+ "\1\0\2\5\4\0\2\5\2\322\16\0\1\5\1\0"+
+ "\4\5\1\322\2\5\1\322\1\5\3\322\5\5\1\322"+
+ "\4\5\1\322\1\5\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\323"+
+ "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\15\6\1\324\12\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\6\6\1\325\21\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\10\6\1\114\17\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\326"+
+ "\13\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\12\6\1\123\15\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\6\6\1\327\21\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\7\0\1\214\6\0"+
+ "\1\5\1\0\15\6\1\114\7\6\2\114\1\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\5\6\1\330\22\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\13\6\1\331\14\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\14\6\1\332"+
+ "\13\6\57\0\1\333\15\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\334"+
+ "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\11\6\1\335\16\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\6\6\1\323\21\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\6\6\1\336\21\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\17\6\1\114"+
+ "\10\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\1\337\15\0\1\5\1\0\30\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\1\340\15\0"+
+ "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\22\6\1\341"+
+ "\5\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\13\6\1\342\14\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\1\6\1\343\5\6\1\344\20\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\15\6\1\345\12\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\6\6\1\346\5\6\1\347\13\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\7\6\1\350\20\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\351"+
+ "\3\6\1\352\14\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\264"+
+ "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\13\6\1\353\14\6\66\0"+
+ "\1\354\74\0\1\355\56\0\1\356\22\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\20\6\1\357\7\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\174"+
+ "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\1\114\27\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\17\6\1\360\10\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+ "\1\361\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\5\6\1\362\22\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\5\6\1\363\22\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\14\6\1\34\13\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\24\6"+
+ "\1\114\3\6\41\0\1\315\5\0\1\234\62\0\1\364"+
+ "\37\0\1\316\1\365\5\316\1\0\1\365\4\0\1\365"+
+ "\4\316\4\365\1\0\1\365\1\0\1\365\1\0\1\365"+
+ "\1\316\5\365\30\316\41\0\1\320\5\0\1\240\62\0"+
+ "\1\366\37\0\1\321\1\367\5\321\1\0\1\367\4\0"+
+ "\1\367\4\321\4\367\1\0\1\367\1\0\1\367\1\0"+
+ "\1\367\1\321\5\367\30\321\1\0\3\5\4\370\1\5"+
+ "\1\0\2\5\4\0\2\5\2\370\16\0\1\5\1\0"+
+ "\4\5\1\370\2\5\1\370\1\5\3\370\5\5\1\370"+
+ "\4\5\1\370\1\5\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\3\6\1\114"+
+ "\24\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\11\6\1\371\16\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\7\6\1\372\20\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\11\6\1\373\16\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\374"+
+ "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\11\6\1\220\16\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\6\6\1\114\21\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\6\6\1\375\21\6\56\0\1\376\16\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\7\6\1\377\20\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\114"+
+ "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\6\6\1\373\21\6\54\0"+
+ "\1\u0100\63\0\1\u0101\1\0\1\u0102\1\u0103\1\0\1\u0104"+
+ "\4\0\1\u0105\1\u0106\1\u0107\14\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\2\6"+
+ "\1\220\25\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\12\6\1\u0108\4\6"+
+ "\1\u0109\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\17\6\1\u010a\10\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\1\6\1\u010b\26\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\7\6\1\u010c\20\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\13\6"+
+ "\1\244\14\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\15\6\1\u010d\12\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\15\6\1\u010e\12\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\1\6\1\u010f\26\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\12\6"+
+ "\1\u0110\15\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\11\6"+
+ "\1\220\10\6\64\0\1\u0112\54\0\1\u0113\100\0\1\u0114"+
+ "\22\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\7\6\1\323\20\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\15\6\1\u0115\12\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+ "\1\u0116\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\17\6\1\220\10\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\2\6\1\u0117\25\6\36\0\1\316"+
+ "\73\0\1\321\36\0\3\5\4\6\1\5\1\0\2\5"+
+ "\4\0\2\5\2\6\16\0\1\5\1\0\4\5\1\6"+
+ "\2\5\1\6\1\5\3\6\5\5\1\6\4\5\1\6"+
+ "\1\5\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\1\u0118\15\0\1\5\1\0\30\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\17\6\1\u0119\10\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\22\6"+
+ "\1\114\5\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\5\6\1\u0111\22\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\1\u011a\15\0\1\5\1\0\30\6\70\0\1\u011b\4\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\1\u011c"+
+ "\15\0\1\5\1\0\30\6\44\0\1\u011d\106\0\1\u011e"+
+ "\73\0\1\u011f\61\0\1\u0120\3\0\1\u0121\1\u0122\102\0"+
+ "\1\u0123\72\0\1\u0124\71\0\1\u0125\25\0\1\u0126\35\0"+
+ "\1\u0127\26\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\24\6\1\u0128\3\6\1\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\13\6\1\u0129\14\6\1\0\1\5\6\6"+
+ "\1\u012a\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\30\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\4\6\1\114\23\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\1\u012b\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\3\6\1\u012c\24\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u012d"+
+ "\20\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\1\u012e\27\6\1\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\17\6\1\u012f\10\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+ "\1\114\7\6\65\0\1\u0130\61\0\1\u0131\44\0\1\u0132"+
+ "\50\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\1\u0133\15\0\1\5\1\0\30\6\1\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\1\6\1\u0134\26\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\6\6\1\u0135"+
+ "\21\6\46\0\1\u0136\26\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\1\u0137\15\0\1\5\1\0\30\6"+
+ "\64\0\1\u0138\66\0\1\u0139\67\0\1\u013a\73\0\1\u013b"+
+ "\67\0\1\u013c\102\0\1\u013d\74\0\1\u013e\100\0\1\u013f"+
+ "\67\0\1\u0140\61\0\1\u0141\106\0\1\u0142\2\0\1\u0143"+
+ "\65\0\1\u0144\62\0\1\u0145\101\0\1\u0146\21\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\13\6\1\u0147\14\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\20\6"+
+ "\1\u0148\7\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\12\6\1\174\15\6"+
+ "\47\0\1\u0149\6\0\1\u014a\5\0\1\u014b\10\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\16\0\1\5"+
+ "\1\0\1\6\1\u014c\26\6\1\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\17\6"+
+ "\1\u014d\10\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\14\6\1\221\13\6"+
+ "\1\0\1\5\7\6\1\0\1\5\1\67\4\0\4\6"+
+ "\16\0\1\5\1\0\14\6\1\114\13\6\60\0\1\u014e"+
+ "\76\0\1\u014f\57\0\1\300\74\0\1\u0150\24\0\1\5"+
+ "\7\6\1\0\1\5\1\67\4\0\4\6\1\u0151\15\0"+
+ "\1\5\1\0\30\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0152"+
+ "\20\6\63\0\1\u0153\66\0\1\u0154\6\0\1\u0155\65\0"+
+ "\1\u0156\76\0\1\u0157\74\0\1\u0158\71\0\1\214\56\0"+
+ "\1\u0159\117\0\1\u015a\64\0\1\u015b\60\0\1\u015c\72\0"+
+ "\1\u015d\36\0\1\u015e\140\0\1\u015f\64\0\1\u0160\100\0"+
+ "\1\u0161\66\0\1\u0162\106\0\1\u0163\13\0\1\5\7\6"+
+ "\1\0\1\5\1\67\4\0\4\6\16\0\1\5\1\0"+
+ "\16\6\1\220\11\6\1\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\7\6\1\u0164"+
+ "\20\6\53\0\1\u0165\12\0\1\u0166\65\0\1\u0167\66\0"+
+ "\1\u0168\4\0\1\u0169\14\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\16\0\1\5\1\0\13\6\1\u016a"+
+ "\14\6\1\0\1\5\7\6\1\0\1\5\1\67\4\0"+
+ "\4\6\16\0\1\5\1\0\5\6\1\u016b\22\6\52\0"+
+ "\1\u015d\102\0\1\u016c\75\0\1\u016d\66\0\1\u0154\2\0"+
+ "\1\u016e\3\0\1\u0155\7\0\1\5\7\6\1\0\1\5"+
+ "\1\67\4\0\4\6\1\u016f\15\0\1\5\1\0\30\6"+
+ "\60\0\1\u0170\72\0\1\u0171\65\0\1\u0172\100\0\1\u0173"+
+ "\70\0\1\214\103\0\1\u0174\34\0\1\u0175\126\0\1\u0176"+
+ "\71\0\1\u0177\70\0\1\u0178\70\0\1\214\71\0\1\u0179"+
+ "\77\0\1\u017a\73\0\1\u017b\71\0\1\u017c\34\0\1\u017d"+
+ "\107\0\1\u017e\50\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\1\6\1\u017f\26\6"+
+ "\45\0\1\u0180\112\0\1\u0181\70\0\1\u0182\2\0\1\u0183"+
+ "\54\0\1\u0184\103\0\1\u0185\17\0\1\5\7\6\1\0"+
+ "\1\5\1\67\4\0\4\6\16\0\1\5\1\0\15\6"+
+ "\1\174\12\6\1\0\1\5\7\6\1\0\1\5\1\67"+
+ "\4\0\4\6\16\0\1\5\1\0\12\6\1\114\15\6"+
+ "\57\0\1\356\74\0\1\u0186\72\0\1\u0187\105\0\1\u0188"+
+ "\47\0\1\u0189\75\0\1\u0157\105\0\1\u018a\75\0\1\u018b"+
+ "\70\0\1\u018c\60\0\1\u018d\110\0\1\u018e\70\0\1\u018f"+
+ "\67\0\1\u0190\44\0\1\u0191\114\0\1\u0192\100\0\1\u0193"+
+ "\70\0\1\u0174\71\0\1\u0194\75\0\1\u0195\1\u0196\24\0"+
+ "\1\5\7\6\1\0\1\5\1\67\4\0\4\6\16\0"+
+ "\1\5\1\0\7\6\1\264\20\6\50\0\1\u0197\110\0"+
+ "\1\u0198\63\0\1\u0199\64\0\1\u019a\71\0\1\u019b\100\0"+
+ "\1\u019c\106\0\1\214\73\0\1\u0157\66\0\1\u019d\67\0"+
+ "\1\u019e\75\0\1\214\76\0\1\u019f\76\0\1\u015d\67\0"+
+ "\1\u01a0\67\0\1\u01a1\103\0\1\u01a2\34\0\1\u01a3\117\0"+
+ "\1\u01a4\74\0\1\u01a5\101\0\1\u01a6\40\0\1\u01a7\114\0"+
+ "\1\u01a8\77\0\1\u01a9\46\0\1\u01aa\127\0\1\u01ab\64\0"+
+ "\1\u01ac\73\0\1\u01ad\102\0\1\u01ae\63\0\1\u01af\75\0"+
+ "\1\u01b0\77\0\1\u01b1\67\0\1\u01b2\106\0\1\u01b3\32\0"+
+ "\1\u01b4\124\0\1\u01b5\101\0\1\u01b6\73\0\1\u01b7\70\0"+
+ "\1\u01b8\60\0\1\u01b9\73\0\1\u01ba\111\0\1\u01bb\62\0"+
+ "\1\u0157\74\0\1\u01bc\72\0\1\u01bd\66\0\1\u01be\100\0"+
+ "\1\u01bf\76\0\1\u01c0\104\0\1\u01bd\15\0\1\u01c1\130\0"+
+ "\1\214\101\0\1\u01b1\72\0\1\u018e\72\0\1\u01c2\46\0"+
+ "\1\u01c3\122\0\1\u01c4\100\0\1\u01c5\74\0\1\u01c6\63\0"+
+ "\1\u01c7\102\0\1\u01c8\66\0\1\u01c9\107\0\1\u01ca\30\0"+
+ "\1\u01cb\120\0\1\u01cc\75\0\1\u01cd\44\0\1\u01ce\122\0"+
+ "\1\u01cf\65\0\1\u01d0\77\0\1\u01d1\71\0\1\u01d2\110\0"+
+ "\1\u01c8\33\0\1\u01d3\127\0\1\u01d4\37\0\1\u01d5\126\0"+
+ "\1\u0186\62\0\1\u01d6\111\0\1\u01d7\67\0\1\u013b\76\0"+
+ "\1\u01bd\66\0\1\u01d8\41\0\1\u01d9\122\0\1\u01da\100\0"+
+ "\1\u01db\60\0\1\u01dc\111\0\1\u01dd\71\0\1\u01de\61\0"+
+ "\1\u01df\103\0\1\u01e0\73\0\1\u01e1\74\0\1\u01e2\100\0"+
+ "\1\u0155\71\0\1\u01e3\34\0\1\u01e4\126\0\1\u01e5\67\0"+
+ "\1\u01e6\44\0\1\u01e7\114\0\1\u01e8\107\0\1\u01e9\70\0"+
+ "\1\u01ea\101\0\1\u01eb\66\0\1\u01ec\63\0\1\u01ed\107\0"+
+ "\1\u01b1\57\0\1\u01ee\34\0\1\u01ef\146\0\1\u01f0\65\0"+
+ "\1\u01f1\101\0\1\u01f2\75\0\1\u01f3\53\0\1\u01f4\114\0"+
+ "\1\u01f5\52\0\1\u01f6\107\0\1\u01f7\63\0\1\u01f8\75\0"+
+ "\1\u01f9\100\0\1\214\64\0\1\u01fa\102\0\1\u01f9\74\0"+
+ "\1\u01fb\71\0\1\u01fc\65\0\1\u01b1\103\0\1\u01fd\75\0"+
+ "\1\214\71\0\1\u01fe\57\0\1\u01ff\111\0\1\u0140\72\0"+
+ "\1\214\70\0\1\u01ac\73\0\1\u0200\103\0\1\214\5\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[29520];
+ 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 =
+ "\4\0\5\1\1\11\1\1\1\11\2\1\1\11\2\1"+
+ "\1\11\3\1\1\11\20\1\1\11\2\1\2\11\1\1"+
+ "\1\11\5\1\1\11\15\1\1\11\1\0\41\1\2\11"+
+ "\10\0\2\1\1\0\14\1\1\0\15\1\1\0\1\11"+
+ "\16\1\10\0\14\1\1\0\20\1\3\0\11\1\2\0"+
+ "\1\1\2\0\12\1\1\0\3\1\2\0\13\1\3\0"+
+ "\5\1\4\0\6\1\1\0\1\1\10\0\12\1\3\0"+
+ "\3\1\1\0\1\1\16\0\3\1\1\0\4\1\4\0"+
+ "\2\1\21\0\2\1\3\0\2\1\4\0\1\1\21\0"+
+ "\1\1\5\0\2\1\23\0\1\1\201\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[512];
+ 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LispTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { ";", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public LispTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public LispTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 160) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 4:
+ { addNullToken(); return firstToken;
+ }
+ case 24: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 25: break;
+ case 19:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 26: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 27: break;
+ case 18:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 28: break;
+ case 17:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 29: break;
+ case 20:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 30: break;
+ case 8:
+ { addToken(Token.SEPARATOR);
+ }
+ case 31: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 32: break;
+ case 15:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 33: break;
+ case 11:
+ { /* Skip escaped chars. */
+ }
+ case 34: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 35: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 36: break;
+ case 23:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 37: break;
+ case 22:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 38: break;
+ case 16:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 39: break;
+ case 9:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 40: break;
+ case 7:
+ { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+ }
+ case 41: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 42: break;
+ case 6:
+ { addToken(Token.OPERATOR);
+ }
+ case 43: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 44: break;
+ case 10:
+ {
+ }
+ case 45: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 46: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 513: break;
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 514: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 515: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 516: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex
new file mode 100644
index 0000000..2a15509
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex
@@ -0,0 +1,372 @@
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class LuaTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LuaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "--", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = LONGSTRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z_]
+Digit = [0-9]
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+UnclosedCharLiteral = ([\']([^\'\n]|"\\'")*)
+CharLiteral = ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral = ([\"]([^\"\n]|"\\\"")*)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+LongStringBegin = ("[[")
+LongStringEnd = ("]]")
+
+LineCommentBegin = ("--")
+MLCBegin = ({LineCommentBegin}{LongStringBegin})
+
+Number = ( "."? {Digit} ({Digit}|".")* ([eE][+-]?)? ({Letter}|{Digit})* )
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\{\}\[\]\]])
+Separator2 = ([\;:,.])
+
+ArithmeticOperator = ("+"|"-"|"*"|"/"|"^"|"%")
+RelationalOperator = ("<"|">"|"<="|">="|"=="|"~=")
+LogicalOperator = ("and"|"or"|"not"|"#")
+ConcatenationOperator = ("..")
+Elipsis = ({ConcatenationOperator}".")
+Operator = ({ArithmeticOperator}|{RelationalOperator}|{LogicalOperator}|{ConcatenationOperator}|{Elipsis})
+
+Identifier = ({Letter}({Letter}|{Digit})*)
+
+
+%state MLC
+%state LONGSTRING
+%state LINECOMMENT
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "do" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "end" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "function" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "local" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "nil" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "repeat" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "then" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "until" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "<number>" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<name>" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<string>" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "<eof>" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "NULL" { addToken(Token.DATA_TYPE); }
+
+/* Functions. */
+<YYINITIAL> "_G" { addToken(Token.FUNCTION); }
+<YYINITIAL> "_VERSION" { addToken(Token.FUNCTION); }
+<YYINITIAL> "assert" { addToken(Token.FUNCTION); }
+<YYINITIAL> "collectgarbage" { addToken(Token.FUNCTION); }
+<YYINITIAL> "dofile" { addToken(Token.FUNCTION); }
+<YYINITIAL> "error" { addToken(Token.FUNCTION); }
+<YYINITIAL> "getfenv" { addToken(Token.FUNCTION); }
+<YYINITIAL> "getmetatable" { addToken(Token.FUNCTION); }
+<YYINITIAL> "ipairs" { addToken(Token.FUNCTION); }
+<YYINITIAL> "load" { addToken(Token.FUNCTION); }
+<YYINITIAL> "loadfile" { addToken(Token.FUNCTION); }
+<YYINITIAL> "loadstring" { addToken(Token.FUNCTION); }
+<YYINITIAL> "module" { addToken(Token.FUNCTION); }
+<YYINITIAL> "next" { addToken(Token.FUNCTION); }
+<YYINITIAL> "pairs" { addToken(Token.FUNCTION); }
+<YYINITIAL> "pcall" { addToken(Token.FUNCTION); }
+<YYINITIAL> "print" { addToken(Token.FUNCTION); }
+<YYINITIAL> "rawequal" { addToken(Token.FUNCTION); }
+<YYINITIAL> "rawget" { addToken(Token.FUNCTION); }
+<YYINITIAL> "rawset" { addToken(Token.FUNCTION); }
+<YYINITIAL> "require" { addToken(Token.FUNCTION); }
+<YYINITIAL> "select" { addToken(Token.FUNCTION); }
+<YYINITIAL> "setfenv" { addToken(Token.FUNCTION); }
+<YYINITIAL> "setmetatable" { addToken(Token.FUNCTION); }
+<YYINITIAL> "tonumber" { addToken(Token.FUNCTION); }
+<YYINITIAL> "tostring" { addToken(Token.FUNCTION); }
+<YYINITIAL> "type" { addToken(Token.FUNCTION); }
+<YYINITIAL> "unpack" { addToken(Token.FUNCTION); }
+<YYINITIAL> "xpcall" { addToken(Token.FUNCTION); }
+
+/* Booleans. */
+<YYINITIAL> {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {LongStringBegin} { start = zzMarkedPos-2; yybegin(LONGSTRING); }
+
+ /* Comment literals. */
+ {MLCBegin} { start = zzMarkedPos-4; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(LINECOMMENT); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Identifiers - Comes after Operators for "and", "not" and "or". */
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ /* Numbers */
+ {Number} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<MLC> {
+ [^\n\]]+ {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {LongStringEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \] {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+
+<LONGSTRING> {
+ [^\n\]]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ {LongStringEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \] {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<LINECOMMENT> {
+ [^\n]+ {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java
new file mode 100644
index 0000000..580dfc9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/LuaTokenMaker.java
@@ -0,0 +1,967 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 07/14/2006
+ *
+ * LuaTokenMaker.java - Scanner for the Lua programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Lua programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>LuaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class LuaTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+ public static final int LONGSTRING = 2;
+ public static final int LINECOMMENT = 3;
+ public static final int MLC = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\4\1\3\1\0\1\4\23\0\1\4\1\0\1\7\1\27"+
+ "\1\0\1\27\1\0\1\5\2\26\1\27\1\15\1\0\1\12\1\13"+
+ "\1\27\12\2\2\0\1\30\1\32\1\31\2\0\4\1\1\14\1\1"+
+ "\1\54\1\1\1\60\2\1\1\52\1\1\1\50\1\61\2\1\1\56"+
+ "\1\57\1\1\1\51\1\55\4\1\1\10\1\6\1\11\1\27\1\53"+
+ "\1\0\1\23\1\37\1\42\1\35\1\21\1\22\1\47\1\44\1\41"+
+ "\1\1\1\40\1\24\1\46\1\34\1\36\1\43\1\64\1\17\1\25"+
+ "\1\16\1\20\1\62\1\45\1\63\1\65\1\1\1\26\1\0\1\26"+
+ "\1\33\uff81\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 =
+ "\4\0\2\1\1\2\1\3\1\4\1\5\1\6\2\7"+
+ "\1\10\1\1\1\10\10\1\2\10\16\1\1\11\1\12"+
+ "\1\11\1\13\2\11\1\14\2\2\1\15\1\5\1\6"+
+ "\1\16\1\17\1\20\1\10\21\1\3\0\3\1\1\21"+
+ "\1\10\1\1\1\21\11\1\1\22\2\1\1\23\1\24"+
+ "\1\15\1\16\1\0\24\1\4\0\13\1\1\25\1\26"+
+ "\11\1\1\21\2\1\1\22\3\1\4\0\6\1\1\27"+
+ "\13\1\1\27\2\0\10\1\2\0\15\1";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[201];
+ 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\66\0\154\0\242\0\330\0\u010e\0\u0144\0\330"+
+ "\0\u017a\0\u01b0\0\u01e6\0\u021c\0\330\0\u0252\0\u0288\0\330"+
+ "\0\u02be\0\u02f4\0\u032a\0\u0360\0\u0396\0\u03cc\0\u0402\0\u0438"+
+ "\0\u046e\0\u04a4\0\u04a4\0\u04da\0\u0510\0\u0546\0\u057c\0\u05b2"+
+ "\0\u05e8\0\u061e\0\u0654\0\u068a\0\u06c0\0\u06f6\0\u072c\0\u0762"+
+ "\0\u0798\0\330\0\u07ce\0\330\0\u0804\0\u083a\0\330\0\u0870"+
+ "\0\u08a6\0\330\0\u08dc\0\u0912\0\330\0\330\0\u0948\0\u097e"+
+ "\0\u09b4\0\u09ea\0\u0a20\0\u0a56\0\u0a8c\0\u0ac2\0\u0af8\0\u0b2e"+
+ "\0\u0b64\0\u0b9a\0\u0bd0\0\u0c06\0\u0c3c\0\u0c72\0\u0ca8\0\u0cde"+
+ "\0\u0d14\0\u0d4a\0\u0d80\0\u0db6\0\u0dec\0\u0e22\0\u0e58\0\u0e8e"+
+ "\0\u010e\0\u0ec4\0\u010e\0\u0efa\0\u0f30\0\u0f66\0\u0f9c\0\u0fd2"+
+ "\0\u1008\0\u103e\0\u1074\0\u10aa\0\u010e\0\u10e0\0\u1116\0\330"+
+ "\0\330\0\u01b0\0\u01e6\0\u114c\0\u1182\0\u11b8\0\u11ee\0\u1224"+
+ "\0\u125a\0\u1290\0\u12c6\0\u12fc\0\u1332\0\u1368\0\u139e\0\u13d4"+
+ "\0\u140a\0\u1440\0\u1476\0\u14ac\0\u14e2\0\u1518\0\u154e\0\u1584"+
+ "\0\u15ba\0\u15f0\0\u1626\0\u165c\0\u1692\0\u16c8\0\u16fe\0\u1734"+
+ "\0\u176a\0\u17a0\0\u17d6\0\u180c\0\u1842\0\u1878\0\u18ae\0\330"+
+ "\0\u010e\0\u18e4\0\u191a\0\u1950\0\u1986\0\u19bc\0\u19f2\0\u1a28"+
+ "\0\u1a5e\0\u1a94\0\u1aca\0\u1b00\0\u1b36\0\u1b6c\0\u1ba2\0\u1bd8"+
+ "\0\u1c0e\0\u1c44\0\u1c7a\0\u1cb0\0\u1ce6\0\u1d1c\0\u1d52\0\u1d88"+
+ "\0\u1dbe\0\u1df4\0\u1e2a\0\u010e\0\u1e60\0\u1e96\0\u1ecc\0\u1f02"+
+ "\0\u1f38\0\u1f6e\0\u1fa4\0\u1fda\0\u2010\0\u2046\0\u207c\0\330"+
+ "\0\u20b2\0\u20e8\0\u211e\0\u2154\0\u218a\0\u21c0\0\u21f6\0\u222c"+
+ "\0\u2262\0\u2298\0\u22ce\0\u2304\0\u233a\0\u2370\0\u23a6\0\u23dc"+
+ "\0\u2412\0\u2448\0\u247e\0\u24b4\0\u24ea\0\u2520\0\u2556\0\u258c"+
+ "\0\u25c2";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[201];
+ 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 =
+ "\1\5\1\6\1\7\1\10\1\11\1\12\1\5\1\13"+
+ "\1\14\1\15\1\16\1\17\1\6\1\20\1\21\1\22"+
+ "\1\23\1\24\1\25\1\26\1\27\1\30\1\15\1\20"+
+ "\1\31\1\32\2\33\1\34\1\35\1\36\1\37\1\6"+
+ "\1\40\1\41\1\42\1\6\1\43\1\44\1\45\1\46"+
+ "\2\6\1\47\7\6\1\50\2\6\3\51\1\52\5\51"+
+ "\1\53\57\51\1\54\5\51\1\55\54\51\3\56\1\57"+
+ "\62\56\67\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\32\6\1\0\1\60\1\7\10\0\1\7\1\61\1\0"+
+ "\3\60\1\61\4\60\6\0\32\60\4\0\1\11\61\0"+
+ "\3\12\1\0\1\12\1\62\1\63\57\12\3\13\1\0"+
+ "\2\13\1\64\1\65\56\13\10\0\1\66\67\0\1\67"+
+ "\55\0\1\7\10\0\1\70\53\0\2\6\11\0\1\6"+
+ "\1\0\1\6\1\71\6\6\6\0\2\6\1\72\5\6"+
+ "\1\73\20\6\1\74\1\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\75\1\6\1\76\2\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\10\6\6\0\1\77\31\6"+
+ "\1\0\2\6\11\0\1\6\1\0\1\6\1\100\4\6"+
+ "\1\101\1\6\6\0\1\102\31\6\1\0\2\6\11\0"+
+ "\1\6\1\0\2\6\1\103\2\6\1\104\2\6\6\0"+
+ "\2\6\1\105\27\6\1\0\2\6\11\0\1\6\1\0"+
+ "\7\6\1\106\6\0\1\107\31\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\2\6\1\110\27\6\1\0"+
+ "\2\6\11\0\1\6\1\0\3\6\1\111\4\6\6\0"+
+ "\32\6\21\0\1\112\3\0\1\113\4\0\1\20\1\0"+
+ "\1\114\63\0\1\20\34\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\115\4\6\6\0\2\6\1\116\2\6\1\117"+
+ "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\2\6\1\120\27\6\1\0\2\6\11\0\1\6\1\0"+
+ "\1\6\1\121\6\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\1\6\1\122\6\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+ "\7\6\1\124\22\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\2\6\1\125\27\6\1\0\2\6\11\0"+
+ "\1\6\1\0\1\6\1\126\3\6\1\127\2\6\6\0"+
+ "\6\6\1\130\23\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\10\6\1\131\21\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\2\6\1\132\27\6\1\0"+
+ "\2\6\11\0\1\6\1\0\3\6\1\133\4\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\15\6\1\134\14\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\20\6\1\135\1\136\10\6\1\0\2\6"+
+ "\11\0\1\6\1\0\10\6\6\0\7\6\1\137\22\6"+
+ "\3\51\1\0\5\51\1\0\54\51\11\0\1\140\65\0"+
+ "\1\141\54\0\3\56\1\0\62\56\1\0\2\60\11\0"+
+ "\1\60\1\0\10\60\6\0\32\60\1\0\2\60\7\0"+
+ "\1\60\1\0\12\60\6\0\32\60\3\12\1\0\1\12"+
+ "\1\142\1\63\57\12\3\13\1\0\2\13\1\64\1\143"+
+ "\56\13\10\0\1\144\70\0\1\20\53\0\2\6\11\0"+
+ "\1\6\1\0\2\6\1\145\5\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\7\6\1\146\6\0\1\147"+
+ "\31\6\1\0\2\6\11\0\1\6\1\0\3\6\1\150"+
+ "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\7\6\1\151\22\6\1\0\2\6\11\0"+
+ "\1\6\1\0\1\152\7\6\6\0\7\6\1\153\20\6"+
+ "\1\154\1\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\11\6\1\155\20\6\1\0\2\6\11\0\1\6"+
+ "\1\0\1\156\7\6\6\0\7\6\1\157\22\6\1\0"+
+ "\2\6\11\0\1\6\1\0\1\6\1\160\6\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\161"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\1\6\1\123\30\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\1\162\31\6\1\0\2\6\11\0"+
+ "\1\6\1\0\6\6\1\163\1\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\1\6\1\123\6\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\7\6\1\164"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\1\6\1\121\30\6\1\0\2\6\11\0\1\6"+
+ "\1\0\5\6\1\165\2\6\6\0\6\6\1\166\23\6"+
+ "\1\0\2\6\11\0\1\6\1\0\1\167\5\6\1\170"+
+ "\1\6\6\0\32\6\36\0\1\171\45\0\1\172\67\0"+
+ "\1\173\2\0\1\174\43\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\27\6\1\175\2\6\1\0\2\6\11\0"+
+ "\1\6\1\0\1\121\7\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\6\6\1\123\1\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\4\6\1\176\3\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+ "\1\177\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+ "\1\0\5\6\1\127\2\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\6\6\1\200\1\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\5\6"+
+ "\1\201\24\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\5\6\1\202\24\6\1\0\2\6\11\0\1\6"+
+ "\1\0\5\6\1\203\2\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\10\6\6\0\5\6\1\204\24\6"+
+ "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\1\6"+
+ "\1\205\30\6\1\0\2\6\11\0\1\6\1\0\1\167"+
+ "\7\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\16\6\1\206\13\6\1\0\2\6\11\0"+
+ "\1\207\1\0\10\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\6\6\1\130\23\6\10\0"+
+ "\1\210\56\0\2\6\11\0\1\6\1\0\3\6\1\211"+
+ "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\1\212\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+ "\1\0\2\6\1\213\5\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\10\6\6\0\1\123\31\6\1\0"+
+ "\2\6\11\0\1\6\1\0\3\6\1\135\4\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\214"+
+ "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\215\4\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\2\6\1\216\5\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\3\6\1\217\3\6\1\220"+
+ "\6\0\13\6\1\220\16\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\5\6\1\117\24\6\1\0\2\6"+
+ "\11\0\1\6\1\0\5\6\1\221\2\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\10\6\6\0\2\6"+
+ "\1\222\27\6\1\0\2\6\11\0\1\6\1\0\3\6"+
+ "\1\223\4\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\6\6\1\224\23\6\1\0\2\6"+
+ "\11\0\1\6\1\0\7\6\1\145\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\3\6\1\225\4\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\1\6\1\226\30\6\1\0\2\6\11\0\1\6\1\0"+
+ "\5\6\1\117\2\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\4\6\1\227\3\6\6\0\12\6\1\230"+
+ "\17\6\1\0\2\6\11\0\1\6\1\0\3\6\1\231"+
+ "\4\6\6\0\32\6\22\0\1\232\62\0\1\233\114\0"+
+ "\1\234\65\0\1\235\20\0\2\6\11\0\1\6\1\0"+
+ "\1\135\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\5\6\1\236\24\6\1\0\2\6"+
+ "\11\0\1\6\1\0\5\6\1\237\2\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\6\6\1\240\1\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\1\175\31\6\1\0\2\6\11\0\1\6\1\0"+
+ "\1\6\1\241\6\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\6\6\1\242\1\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\6\6\1\243\1\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\2\6\1\236"+
+ "\5\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\16\6\1\244\13\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\22\6\1\245\7\6\1\0"+
+ "\2\6\11\0\1\6\1\0\1\6\1\246\6\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\12\6\1\247\17\6\1\0\2\6\11\0\1\6\1\0"+
+ "\1\6\1\150\6\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\5\6\1\250\2\6\6\0\32\6\1\0"+
+ "\2\6\11\0\1\6\1\0\10\6\6\0\5\6\1\251"+
+ "\24\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\30\6\1\252\1\6\1\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\175\4\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\6\6\1\253\23\6\1\0"+
+ "\2\6\11\0\1\6\1\0\1\6\1\135\6\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\5\6\1\254\24\6\1\0\2\6\11\0\1\6\1\0"+
+ "\1\255\7\6\6\0\32\6\1\0\2\6\11\0\1\6"+
+ "\1\0\1\6\1\175\6\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\4\6\1\176\2\6\1\146\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\3\6\1\256"+
+ "\4\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\257\4\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\6\6\1\175\23\6\31\0"+
+ "\1\260\75\0\1\261\63\0\1\262\47\0\1\232\45\0"+
+ "\2\6\11\0\1\6\1\0\6\6\1\151\1\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\4\6\1\123\25\6\1\0\2\6\11\0\1\6\1\0"+
+ "\3\6\1\263\4\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\7\6\1\135\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\6\6\1\135\1\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\3\6\1\123\4\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\23\6\1\264\6\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\5\6\1\265\24\6\1\0\2\6"+
+ "\11\0\1\6\1\0\10\6\6\0\3\6\1\266\26\6"+
+ "\1\0\2\6\11\0\1\6\1\0\1\123\7\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\1\6\1\151"+
+ "\6\6\6\0\32\6\1\0\2\6\11\0\1\6\1\0"+
+ "\2\6\1\267\5\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\4\6\1\135\25\6\1\0"+
+ "\2\6\11\0\1\6\1\0\4\6\1\123\3\6\6\0"+
+ "\32\6\1\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\5\6\1\270\24\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\1\271\31\6\1\0\2\6\11\0\1\6"+
+ "\1\0\1\272\7\6\6\0\32\6\34\0\1\273\52\0"+
+ "\1\274\45\0\2\6\11\0\1\6\1\0\10\6\6\0"+
+ "\6\6\1\275\23\6\1\0\2\6\11\0\1\6\1\0"+
+ "\10\6\6\0\24\6\1\276\5\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\1\277\31\6\1\0\2\6"+
+ "\11\0\1\6\1\0\3\6\1\222\4\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\5\6\1\242\2\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\2\6\1\150\27\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\26\6\1\135\3\6\1\0\2\6"+
+ "\11\0\1\6\1\0\5\6\1\300\2\6\6\0\32\6"+
+ "\47\0\1\232\35\0\1\232\47\0\2\6\11\0\1\6"+
+ "\1\0\1\301\7\6\6\0\32\6\1\0\2\6\11\0"+
+ "\1\6\1\0\10\6\6\0\25\6\1\302\4\6\1\0"+
+ "\2\6\11\0\1\6\1\0\10\6\6\0\13\6\1\135"+
+ "\16\6\1\0\2\6\11\0\1\6\1\0\1\303\7\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\13\6\1\304\16\6\1\0\2\6\11\0\1\6"+
+ "\1\0\10\6\6\0\14\6\1\135\15\6\1\0\2\6"+
+ "\11\0\1\6\1\0\5\6\1\305\2\6\6\0\32\6"+
+ "\1\0\2\6\11\0\1\6\1\0\5\6\1\306\2\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\3\6\1\236\26\6\1\0\2\6\11\0\1\6"+
+ "\1\0\1\6\1\307\6\6\6\0\32\6\1\0\2\6"+
+ "\11\0\1\6\1\0\10\6\6\0\3\6\1\310\26\6"+
+ "\1\0\2\6\11\0\1\6\1\0\5\6\1\311\2\6"+
+ "\6\0\32\6\1\0\2\6\11\0\1\6\1\0\10\6"+
+ "\6\0\13\6\1\151\16\6";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[9720];
+ 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 =
+ "\4\0\1\11\2\1\1\11\4\1\1\11\2\1\1\11"+
+ "\31\1\1\11\1\1\1\11\2\1\1\11\2\1\1\11"+
+ "\2\1\2\11\23\1\3\0\23\1\2\11\2\1\1\0"+
+ "\24\1\4\0\13\1\1\11\21\1\4\0\22\1\1\11"+
+ "\2\0\10\1\2\0\15\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[201];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public LuaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "--", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = LONGSTRING;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public LuaTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public LuaTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 164) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 3:
+ { addNullToken(); return firstToken;
+ }
+ case 24: break;
+ case 13:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 25: break;
+ case 15:
+ { start = zzMarkedPos-2; yybegin(LONGSTRING);
+ }
+ case 26: break;
+ case 19:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 27: break;
+ case 4:
+ { addToken(Token.WHITESPACE);
+ }
+ case 28: break;
+ case 2:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 29: break;
+ case 17:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 30: break;
+ case 21:
+ { start = zzMarkedPos-4; yybegin(MLC);
+ }
+ case 31: break;
+ case 7:
+ { addToken(Token.SEPARATOR);
+ }
+ case 32: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 33: break;
+ case 18:
+ { addToken(Token.FUNCTION);
+ }
+ case 34: break;
+ case 5:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 35: break;
+ case 6:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 36: break;
+ case 23:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 37: break;
+ case 22:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 38: break;
+ case 20:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 39: break;
+ case 14:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 40: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 41: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+ }
+ case 42: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 43: break;
+ case 16:
+ { start = zzMarkedPos-2; yybegin(LINECOMMENT);
+ }
+ case 44: break;
+ case 9:
+ {
+ }
+ case 45: break;
+ case 10:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 46: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 202: break;
+ case LONGSTRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 203: break;
+ case LINECOMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); return firstToken;
+ }
+ case 204: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 205: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex
new file mode 100644
index 0000000..5f7ecd3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex
@@ -0,0 +1,336 @@
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated MakefileTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MakefileTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ private Stack varDepths;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public MakefileTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(Token.NULL);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+Digit = [0-9]
+IdentifierStart = ({Letter}|[_\.])
+IdentifierPart = ({IdentifierStart}|{Digit})
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+Label = ({Identifier}":")
+
+CurlyVarStart = ("${")
+ParenVarStart = ("$(")
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+UnclosedCharLiteral = ([\']([^\'\n]|"\\'")*)
+CharLiteral = ({UnclosedCharLiteral}"'")
+UnclosedStringLiteral = ([\"]([^\"\n]|"\\\"")*)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral = ([\`]([^\`\n]|"\\`")*)
+BacktickLiteral = ({UnclosedBacktickLiteral}"`")
+
+LineCommentBegin = "#"
+
+IntegerLiteral = ({Digit}+)
+
+Operator = ([\:\+\?]?"=")
+
+
+%state VAR
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "addprefix" |
+ "addsuffix" |
+ "basename" |
+ "dir" |
+ "filter" |
+ "filter-out" |
+ "findstring" |
+ "firstword" |
+ "foreach" |
+ "join" |
+ "notdir" |
+ "origin" |
+ "pathsubst" |
+ "shell" |
+ "sort" |
+ "strip" |
+ "suffix" |
+ "wildcard" |
+ "word" |
+ "words" |
+ "ifeq" |
+ "ifneq" |
+ "else" |
+ "endif" |
+ "define" |
+ "endef" |
+ "ifdef" |
+ "ifndef" { addToken(Token.RESERVED_WORD); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Label} { addToken(Token.PREPROCESSOR); }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {BacktickLiteral} { addToken(Token.LITERAL_BACKQUOTE); }
+ {BacktickLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+ /* Variables. */
+ {CurlyVarStart} { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR); }
+ {ParenVarStart} { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR); }
+
+ /* Comment literals. */
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch-all for anything else. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+<VAR> {
+ [^\}\)\$\#]+ {}
+ "}" {
+ if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+ varDepths.pop();
+ if (varDepths.empty()) {
+ addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+ }
+ }
+ }
+ ")" {
+ if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+ varDepths.pop();
+ if (varDepths.empty()) {
+ addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+ }
+ }
+ }
+ "${" { varDepths.push(Boolean.TRUE); }
+ "$(" { varDepths.push(Boolean.FALSE); }
+ "$" {}
+ "#".* { int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java
new file mode 100644
index 0000000..1aa26f8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java
@@ -0,0 +1,863 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/20/2008
+ *
+ * MakefileTokenMaker.java - Scanner for makefiles.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import java.util.Stack;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for makefiles.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated MakefileTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MakefileTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int VAR = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\10\1\7\1\0\1\10\23\0\1\10\1\0\1\13\1\15"+
+ "\1\4\2\0\1\11\1\6\1\47\1\0\1\16\1\0\1\37\1\1"+
+ "\1\0\12\2\1\3\2\0\1\17\1\0\1\16\1\0\32\1\1\0"+
+ "\1\12\2\0\1\1\1\14\1\20\1\32\1\43\1\21\1\24\1\25"+
+ "\1\41\1\44\1\26\1\45\1\1\1\35\1\34\1\33\1\40\1\22"+
+ "\1\46\1\23\1\30\1\36\1\31\1\1\1\42\1\27\2\1\1\5"+
+ "\1\0\1\50\uff82\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 =
+ "\2\0\2\1\1\2\2\1\1\3\1\4\1\5\1\6"+
+ "\1\1\1\7\1\10\14\1\2\11\1\12\1\13\1\14"+
+ "\1\15\1\16\1\17\1\20\1\5\1\6\1\21\2\0"+
+ "\1\22\23\1\1\23\1\24\1\20\1\21\1\22\2\1"+
+ "\1\25\43\1\1\25\14\1\1\25\5\1\1\0\2\1"+
+ "\1\0\1\1\1\0\1\25";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[129];
+ 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\51\0\122\0\173\0\244\0\315\0\366\0\122"+
+ "\0\u011f\0\u0148\0\u0171\0\u019a\0\u01c3\0\122\0\u01ec\0\u0215"+
+ "\0\u023e\0\u0267\0\u0290\0\u02b9\0\u02e2\0\u030b\0\u0334\0\u035d"+
+ "\0\u0386\0\u03af\0\u03d8\0\u0401\0\u042a\0\122\0\122\0\122"+
+ "\0\122\0\122\0\122\0\u0453\0\u047c\0\122\0\u019a\0\u04a5"+
+ "\0\122\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b\0\u05c4"+
+ "\0\u05ed\0\u0616\0\u063f\0\u0668\0\u0691\0\u06ba\0\u06e3\0\u070c"+
+ "\0\u0735\0\u075e\0\u0787\0\u07b0\0\122\0\122\0\u0148\0\u0171"+
+ "\0\u019a\0\u07d9\0\u0802\0\173\0\u082b\0\u0854\0\u087d\0\u08a6"+
+ "\0\u08cf\0\u08f8\0\u0921\0\u094a\0\u0973\0\u099c\0\u09c5\0\u09ee"+
+ "\0\u0a17\0\u0a40\0\u0a69\0\u0a92\0\u0abb\0\u0ae4\0\u0b0d\0\u0b36"+
+ "\0\u0b5f\0\u0b88\0\u0bb1\0\u0bda\0\u0c03\0\u0c2c\0\u0c55\0\u0c7e"+
+ "\0\u0ca7\0\u0cd0\0\u0cf9\0\u0d22\0\u0d4b\0\u0d74\0\u0d9d\0\u0dc6"+
+ "\0\u0def\0\u0e18\0\u0e41\0\u0e6a\0\u0e93\0\u0ebc\0\u0ee5\0\u0f0e"+
+ "\0\u0f37\0\u0f60\0\u0f89\0\u0fb2\0\u0fdb\0\u1004\0\u102d\0\u1056"+
+ "\0\u107f\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u1175\0\u119e"+
+ "\0\122";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[129];
+ 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 =
+ "\1\3\1\4\1\5\1\6\1\7\2\3\1\10\1\11"+
+ "\1\12\1\3\1\13\1\14\1\15\1\6\1\16\1\17"+
+ "\1\20\1\21\1\4\1\22\1\23\1\24\1\4\1\25"+
+ "\1\4\1\26\1\27\3\4\1\3\1\30\1\4\1\31"+
+ "\2\4\1\32\1\4\2\3\4\33\1\34\10\33\1\35"+
+ "\31\33\1\36\1\37\52\0\2\4\1\40\14\0\17\4"+
+ "\1\0\7\4\4\0\1\5\65\0\1\16\36\0\1\41"+
+ "\1\42\52\0\1\11\40\0\7\12\1\0\1\12\1\43"+
+ "\1\44\36\12\7\13\1\0\2\13\1\45\1\46\35\13"+
+ "\7\47\1\0\2\47\1\50\1\47\1\51\34\47\7\15"+
+ "\1\0\41\15\1\0\2\4\1\40\14\0\1\4\1\52"+
+ "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\4\4"+
+ "\1\53\1\4\1\54\10\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\1\55\16\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\13\4\1\56\1\4\1\57\1\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\6\4\1\60\10\4"+
+ "\1\0\1\61\6\4\3\0\2\4\1\40\14\0\5\4"+
+ "\1\62\11\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\11\4\1\63\4\4\1\64\1\0\1\65\3\4\1\66"+
+ "\2\4\3\0\2\4\1\40\14\0\1\67\16\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\1\70"+
+ "\6\4\3\0\2\4\1\40\14\0\3\4\1\71\13\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\6\4\1\72"+
+ "\10\4\1\0\1\73\6\4\3\0\2\4\1\40\14\0"+
+ "\17\4\1\0\1\74\6\4\2\0\4\33\1\0\10\33"+
+ "\1\0\31\33\7\0\1\75\1\76\42\0\7\35\1\0"+
+ "\41\35\7\12\1\0\1\12\1\77\1\44\36\12\7\13"+
+ "\1\0\2\13\1\45\1\100\35\13\7\47\1\0\2\47"+
+ "\1\50\1\47\1\101\34\47\1\0\2\4\1\40\14\0"+
+ "\1\4\1\102\15\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\5\4\1\103\11\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\3\4\1\104\13\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\16\4\1\105\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\1\4\1\106\15\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\10\4\1\107\6\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\3\4\1\110\7\4"+
+ "\1\111\1\4\1\112\1\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\3\4\1\113\13\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\1\4\1\114\2\4\1\115\6\4"+
+ "\1\116\3\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\5\4\1\117\11\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\3\4\1\120\13\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\3\4\1\121\13\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\4\4\1\122\12\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\10\4\1\123\6\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\16\4\1\124\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\6\4\1\125\10\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\15\4\1\126"+
+ "\1\4\1\0\7\4\3\0\2\4\1\40\14\0\3\4"+
+ "\1\127\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\6\4\1\130\10\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\2\4\1\131\5\4\1\132\6\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\6\4\1\133\10\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\17\4\1\0\4\4"+
+ "\1\134\2\4\3\0\2\4\1\40\14\0\4\4\1\135"+
+ "\1\4\1\135\10\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\4\4\1\104\12\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\10\4\1\136\6\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\1\4\1\137\15\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\16\4\1\140\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\4\4\1\141\12\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\4\4\1\135\12\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+ "\6\4\1\104\3\0\2\4\1\40\14\0\1\4\1\114"+
+ "\2\4\1\115\12\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\5\4\1\142\11\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\6\4\1\143\10\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\16\4\1\104\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\15\4\1\144\1\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\4\4\1\145\12\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\1\4\1\146\15\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+ "\1\4\1\74\5\4\3\0\2\4\1\40\14\0\1\4"+
+ "\1\147\15\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\1\4\1\150\15\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\13\4\1\104\3\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\3\4\1\151\13\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\11\4\1\63\5\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\13\4\1\107\3\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\10\4\1\152\6\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\5\4\1\104"+
+ "\11\4\1\0\7\4\3\0\2\4\1\40\14\0\16\4"+
+ "\1\153\1\0\7\4\3\0\2\4\1\40\14\0\10\4"+
+ "\1\154\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\4\4\1\155\12\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\1\156\16\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\6\4\1\157\10\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\2\4\1\104\14\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\15\4\1\104\1\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\13\4\1\160\3\4\1\0"+
+ "\7\4\3\0\2\4\1\40\14\0\6\4\1\54\10\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\17\4\1\0"+
+ "\3\4\1\161\3\4\3\0\2\4\1\40\14\0\10\4"+
+ "\1\104\6\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\4\4\1\117\12\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\11\4\1\162\5\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\17\4\1\0\2\4\1\163\4\4\3\0"+
+ "\2\4\1\40\14\0\16\4\1\164\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\3\4\1\165\13\4\1\0\7\4"+
+ "\3\0\2\4\1\40\14\0\17\4\1\0\3\4\1\166"+
+ "\3\4\3\0\2\4\1\40\14\0\7\4\1\104\7\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\1\167\16\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\1\170\16\4"+
+ "\1\0\7\4\3\0\2\4\1\40\14\0\12\4\1\171"+
+ "\4\4\1\0\7\4\3\0\2\4\1\40\14\0\17\4"+
+ "\1\0\1\170\6\4\3\0\2\4\1\40\14\0\3\4"+
+ "\1\172\13\4\1\0\7\4\3\0\2\4\1\40\14\0"+
+ "\17\4\1\173\7\4\3\0\2\4\1\40\14\0\17\4"+
+ "\1\0\4\4\1\104\2\4\3\0\2\4\1\40\14\0"+
+ "\14\4\1\107\2\4\1\0\7\4\3\0\2\4\1\40"+
+ "\14\0\3\4\1\174\13\4\1\0\7\4\3\0\2\4"+
+ "\1\40\14\0\10\4\1\121\6\4\1\0\7\4\3\0"+
+ "\2\4\1\40\14\0\6\4\1\175\10\4\1\0\7\4"+
+ "\42\0\1\176\11\0\2\4\1\40\14\0\1\4\1\104"+
+ "\15\4\1\0\7\4\3\0\2\4\1\40\14\0\13\4"+
+ "\1\177\3\4\1\0\7\4\33\0\1\200\20\0\2\4"+
+ "\1\40\14\0\17\4\1\0\1\4\1\104\5\4\40\0"+
+ "\1\201\12\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[4551];
+ 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 =
+ "\2\0\1\11\4\1\1\11\5\1\1\11\17\1\6\11"+
+ "\2\1\1\11\2\0\1\11\23\1\2\11\74\1\1\0"+
+ "\2\1\1\0\1\1\1\0\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[129];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ private Stack varDepths;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public MakefileTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(Token.NULL);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public MakefileTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public MakefileTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 126) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 13:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 22: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 23: break;
+ case 16:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 24: break;
+ case 15:
+ { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.FALSE); start = zzMarkedPos-2; yybegin(VAR);
+ }
+ case 25: break;
+ case 12:
+ { if (!varDepths.empty() && varDepths.peek()==Boolean.TRUE) {
+ varDepths.pop();
+ if (varDepths.empty()) {
+ addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+ }
+ }
+ }
+ case 26: break;
+ case 11:
+ { if (!varDepths.empty() && varDepths.peek()==Boolean.FALSE) {
+ varDepths.pop();
+ if (varDepths.empty()) {
+ addToken(start,zzStartRead, Token.VARIABLE); yybegin(YYINITIAL);
+ }
+ }
+ }
+ case 27: break;
+ case 4:
+ { addToken(Token.WHITESPACE);
+ }
+ case 28: break;
+ case 21:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 29: break;
+ case 20:
+ { varDepths.push(Boolean.FALSE);
+ }
+ case 30: break;
+ case 18:
+ { addToken(Token.LITERAL_BACKQUOTE);
+ }
+ case 31: break;
+ case 19:
+ { varDepths.push(Boolean.TRUE);
+ }
+ case 32: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 33: break;
+ case 5:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 34: break;
+ case 6:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 35: break;
+ case 10:
+ { int temp1 = zzStartRead; int temp2 = zzMarkedPos; addToken(start,zzStartRead-1, Token.VARIABLE); addToken(temp1, temp2-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 36: break;
+ case 17:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 37: break;
+ case 14:
+ { if (varDepths==null) { varDepths = new Stack(); } else { varDepths.clear(); } varDepths.push(Boolean.TRUE); start = zzMarkedPos-2; yybegin(VAR);
+ }
+ case 38: break;
+ case 7:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 39: break;
+ case 2:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 40: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 41: break;
+ case 9:
+ {
+ }
+ case 42: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case VAR: {
+ addToken(start,zzStartRead-1, Token.VARIABLE); addNullToken(); return firstToken;
+ }
+ case 130: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 131: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex
new file mode 100644
index 0000000..a6b6265
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex
@@ -0,0 +1,809 @@
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class MxmlTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line with an unclosed XML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line with an unclosed Script tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in the middle of a double-quoted attribute in a Script
+ * tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in the middle of a single-quoted attribute in a Script
+ * tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in an ActionScript code block (text content inside a
+ * Script tag).
+ */
+ public static final int INTERNAL_IN_AS = -7;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in an MLC in an ActionScript code block (text content
+ * inside a Script tag).
+ */
+ public static final int INTERNAL_IN_AS_MLC = -8;
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public MxmlTokenMaker() {
+ }
+
+
+ static {
+ completeCloseTags = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns whether markup close tags should be completed. For XML, the
+ * default value is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Static version of {@link #getCompleteCloseTags()}. This hack is
+ * unfortunately needed for applications to be able to query this value
+ * without instantiating this class.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public static boolean getCompleteCloseMarkupTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in XML files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ start = text.offset;
+ break;
+ case Token.MARKUP_DTD:
+ state = DTD;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ start = text.offset;
+ break;
+ case Token.MARKUP_PROCESSING_INSTRUCTION:
+ state = PI;
+ start = text.offset;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ start = text.offset;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_AS:
+ state = AS;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_AS_MLC:
+ state = AS_MLC;
+ start = text.offset;
+ break;
+ case Token.MARKUP_CDATA:
+ state = CDATA;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+/* XML macros (and some building-block macros used by AS macros). */
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+LetterOrUnderscore = ({Letter}|"_")
+NameStartChar = ({Letter}|[\:])
+NameChar = ({NameStartChar}|[\-\.]|{Digit})
+TagName = ({NameStartChar}{NameChar}*)
+Whitespace = ([ \t\f])
+LineTerminator = ([\n])
+Identifier = ([^ \t\n<&]+)
+EntityReference = ([&][^; \t]*[;]?)
+InTagIdentifier = ([^ \t\n\"\'=\/>]+)
+CDataBegin = ("<![CDATA[")
+CDataEnd = ("]]>")
+
+
+/* ActionScript macros. */
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+AS_CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})*[\'])
+AS_UnclosedCharLiteral = ([\']([\\].|[^\\\'])*[^\']?)
+AS_ErrorCharLiteral = ({AS_UnclosedCharLiteral}[\'])
+AS_StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+AS_UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+AS_ErrorStringLiteral = ({AS_UnclosedStringLiteral}[\"])
+
+AS_MLCBegin = ("/*")
+AS_MLCEnd = ("*/")
+AS_LineCommentBegin = ("//")
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+AS_IntegerLiteral = ({IntegerHelper1}[lL]?)
+AS_HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+AS_FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+AS_ErrorNumberFormat = (({AS_IntegerLiteral}|{AS_HexLiteral}|{AS_FloatLiteral}){NonSeparator}+)
+AS_BooleanLiteral = ("true"|"false")
+
+AS_Separator = ([\(\)\{\}\[\]])
+AS_Separator2 = ([\;,.])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+AS_Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+AS_Identifier = ({IdentifierStart}{IdentifierPart}*)
+AS_ErrorIdentifier = ({NonSeparator}+)
+AS_EndScriptTag = ("</"({NameStartChar}{NameChar}*":")?"Script"{Whitespace}*">")
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state CDATA
+
+%state AS
+%state AS_MLC
+%state AS_EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+ "<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
+ {CDataBegin} { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA); }
+ "<!" { start = zzMarkedPos-2; yybegin(DTD); }
+ "<?" { start = zzMarkedPos-2; yybegin(PI); }
+ "<"{TagName} {
+ int count = yylength();
+ String tag = yytext(); // Get before addToken calls
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ if (tag.endsWith(":Script") || tag.equals("<Script")) {
+ yybegin(INTAG_SCRIPT);
+ }
+ else {
+ yybegin(INTAG);
+ }
+ }
+ "</"{TagName} {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^\n\-]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+ "-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+ "-" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<PI> {
+ [^\n\?]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+ "?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+ "?" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+ [^\n>]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+ ">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+ <<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+ [^\']* {}
+ [\'] { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<CDATA> {
+ [^\]]+ {}
+ {CDataEnd} { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+ "]" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
+
+<AS> {
+
+ {AS_EndScriptTag} {
+ int origStart = zzStartRead;
+ String text = yytext();
+ int tagNameEnd = text.length() - 2; // "-1" is '>'
+ while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+ tagNameEnd--;
+ }
+ int tagNameLen = tagNameEnd - 1;
+ yybegin(YYINITIAL);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+ if (tagNameEnd<text.length()-2) {
+ addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+ }
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+
+ /* ActionScript snippets are usually wrapped in CDATA. */
+ {CDataBegin} |
+ {CDataEnd} { addToken(Token.MARKUP_CDATA_DELIMITER); }
+
+ /* Keywords */
+ "add" |
+ "and" |
+ "break" |
+ "case" |
+ "catch" |
+ "class" |
+ "const" |
+ "continue" |
+ "default" |
+ "delete" |
+ "do" |
+ "dynamic" |
+ "else" |
+ "eq" |
+ "extends" |
+ "final" |
+ "finally" |
+ "for" |
+ "for each" |
+ "function" |
+ "ge" |
+ "get" |
+ "gt" |
+ "if" |
+ "ifFrameLoaded" |
+ "implements" |
+ "import" |
+ "in" |
+ "include" |
+ "interface" |
+ "internal" |
+ "label" |
+ "le" |
+ "lt" |
+ "namespace" |
+ "native" |
+ "ne" |
+ "new" |
+ "not" |
+ "on" |
+ "onClipEvent" |
+ "or" |
+ "override" |
+ "package" |
+ "private" |
+ "protected" |
+ "public" |
+ "return" |
+ "set" |
+ "static" |
+ "super" |
+ "switch" |
+ "tellTarget" |
+ "this" |
+ "throw" |
+ "try" |
+ "typeof" |
+ "use" |
+ "var" |
+ "void" |
+ "while" |
+ "with" |
+
+ "null" |
+ "undefined" { addToken(Token.RESERVED_WORD); }
+
+ /* Built-in objects (good idea not to use these names!) */
+ "Array" |
+ "Boolean" |
+ "Color" |
+ "Date" |
+ "Function" |
+ "int" |
+ "Key" |
+ "MovieClip" |
+ "Math" |
+ "Mouse" |
+ "Null" |
+ "Number" |
+ "Object" |
+ "Selection" |
+ "Sound" |
+ "String" |
+ "uint" |
+ "Vector" |
+ "void" |
+ "XML" |
+ "XMLNode" |
+ "XMLSocket" { addToken(Token.DATA_TYPE); }
+
+ /* Global functions */
+ "call" |
+ "escape" |
+ "eval" |
+ "fscommand" |
+ "getProperty" |
+ "getTimer" |
+ "getURL" |
+ "getVersion" |
+ "gotoAndPlay" |
+ "gotoAndStop" |
+ "#include" |
+ "int" |
+ "isFinite" |
+ "isNaN" |
+ "loadMovie" |
+ "loadMovieNum" |
+ "loadVariables" |
+ "loadVariablesNum" |
+ "maxscroll" |
+ "newline" |
+ "nextFrame" |
+ "nextScene" |
+ "Number" |
+ "parseFloat" |
+ "parseInt" |
+ "play" |
+ "prevFrame" |
+ "prevScene" |
+ "print" |
+ "printAsBitmap" |
+ "printAsBitmapNum" |
+ "printNum" |
+ "random" |
+ "removeMovieClip" |
+ "scroll" |
+ "setProperty" |
+ "startDrag" |
+ "stop" |
+ "stopAllSounds" |
+ "stopDrag" |
+ "String" |
+ "targetPath" |
+ "tellTarget" |
+ "toggleHighQuality" |
+ "trace" |
+ "unescape" |
+ "unloadMovie" |
+ "unloadMovieNum" |
+ "updateAfterEvent" { addToken(Token.FUNCTION); }
+
+ /* Booleans. */
+ {AS_BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+ {AS_Identifier} { addToken(Token.IDENTIFIER); }
+
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {AS_CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {AS_UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {AS_ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {AS_StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {AS_UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {AS_ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {AS_MLCBegin} { start = zzMarkedPos-2; yybegin(AS_MLC); }
+ {AS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT); }
+
+ /* Separators. */
+ {AS_Separator} { addToken(Token.SEPARATOR); }
+ {AS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {AS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {AS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {AS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {AS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {AS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {AS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<AS_MLC> {
+
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+ {AS_MLCEnd} { yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken; }
+
+}
+
+
+<AS_EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java
new file mode 100644
index 0000000..a398f3b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java
@@ -0,0 +1,2704 @@
+/* The following code was generated by JFlex 1.4.1 on 3/22/13 7:36 PM */
+
+/*
+ * 01/21/2011
+ *
+ * MxmlTokenMaker.java - Generates tokens for MXML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for MXML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>MXMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class MxmlTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int AS_EOL_COMMENT = 13;
+ public static final int AS_MLC = 12;
+ public static final int INTAG_SCRIPT = 7;
+ public static final int INATTR_DOUBLE_SCRIPT = 8;
+ public static final int CDATA = 10;
+ public static final int INATTR_SINGLE_SCRIPT = 9;
+ public static final int DTD = 3;
+ public static final int INATTR_SINGLE = 6;
+ public static final int INATTR_DOUBLE = 5;
+ public static final int YYINITIAL = 0;
+ public static final int AS = 11;
+ public static final int INTAG = 4;
+ public static final int COMMENT = 1;
+ public static final int PI = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\12\1\10\1\0\1\7\1\36\22\0\1\105\1\16\1\32"+
+ "\1\37\1\40\1\63\1\13\1\31\2\73\1\42\1\51\1\61\1\50"+
+ "\1\6\1\41\1\3\3\27\4\27\2\2\1\5\1\14\1\11\1\15"+
+ "\1\25\1\64\1\72\1\22\1\26\1\20\1\21\1\47\1\45\1\1"+
+ "\1\122\1\121\1\1\1\110\1\44\1\111\1\112\1\113\1\116\1\123"+
+ "\1\120\1\66\1\23\1\117\1\115\1\1\1\43\2\1\1\17\1\30"+
+ "\1\24\1\62\1\4\1\0\1\55\1\35\1\67\1\76\1\54\1\46"+
+ "\1\106\1\74\1\70\1\114\1\77\1\56\1\102\1\34\1\100\1\71"+
+ "\1\103\1\53\1\57\1\52\1\33\1\107\1\75\1\104\1\101\1\1"+
+ "\1\60\1\62\1\60\1\65\uff81\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 =
+ "\5\0\2\1\1\0\2\1\4\0\2\2\1\3\1\4"+
+ "\1\5\1\6\1\1\1\7\2\1\1\10\2\1\1\11"+
+ "\1\12\2\13\1\14\1\15\1\16\1\17\1\20\1\1"+
+ "\1\21\1\1\1\22\1\23\1\24\1\25\2\1\1\26"+
+ "\1\2\2\27\1\2\1\30\2\14\1\2\1\14\1\31"+
+ "\3\2\1\31\1\14\1\2\1\32\1\33\3\2\2\26"+
+ "\1\14\3\2\2\14\25\2\1\1\1\34\5\1\1\35"+
+ "\3\1\1\36\1\37\1\4\1\40\1\6\1\0\1\41"+
+ "\1\0\1\26\1\42\2\43\1\27\2\42\1\44\1\42"+
+ "\3\0\3\2\1\0\1\14\1\2\1\32\1\45\2\33"+
+ "\1\46\5\2\1\47\3\2\1\26\1\50\1\51\21\2"+
+ "\1\47\20\2\2\47\12\2\1\47\2\2\1\47\11\2"+
+ "\1\52\12\0\1\53\1\54\1\55\1\26\1\43\1\0"+
+ "\2\44\3\0\3\2\1\56\1\2\2\32\1\33\1\57"+
+ "\1\33\6\2\1\47\4\2\1\26\1\0\1\60\5\2"+
+ "\1\47\23\2\1\47\10\2\1\60\24\2\1\47\1\2"+
+ "\1\60\7\2\11\0\1\61\1\26\3\0\2\2\1\32"+
+ "\1\62\1\32\1\33\10\2\1\26\1\63\6\2\1\0"+
+ "\1\64\13\2\1\65\3\2\1\65\36\2\2\0\1\66"+
+ "\2\0\1\67\1\0\1\26\2\0\1\2\1\32\1\33"+
+ "\7\2\1\26\5\2\1\47\1\0\26\2\1\65\13\2"+
+ "\5\0\1\26\2\0\1\2\1\32\1\33\6\2\1\26"+
+ "\5\2\1\0\30\2\3\0\4\2\1\26\2\2\1\0"+
+ "\23\2\3\0\1\2\1\65\1\2\1\47\21\2\1\70"+
+ "\1\0\1\71\4\2\1\65\40\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[608];
+ 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\124\0\250\0\374\0\u0150\0\u01a4\0\u01f8\0\u024c"+
+ "\0\u02a0\0\u02f4\0\u0348\0\u039c\0\u03f0\0\u0444\0\u0498\0\u04ec"+
+ "\0\u0540\0\u0594\0\u05e8\0\u063c\0\u0690\0\u0540\0\u06e4\0\u0738"+
+ "\0\u0540\0\u078c\0\u07e0\0\u0540\0\u0540\0\u0834\0\u0888\0\u0540"+
+ "\0\u0540\0\u0540\0\u0540\0\u08dc\0\u0930\0\u0540\0\u0984\0\u0540"+
+ "\0\u0540\0\u0540\0\u0540\0\u09d8\0\u0a2c\0\u0a80\0\u0ad4\0\u0b28"+
+ "\0\u0b7c\0\u0bd0\0\u0540\0\u0c24\0\u0c78\0\u0540\0\u0ccc\0\u0540"+
+ "\0\u0d20\0\u0d74\0\u0dc8\0\u0e1c\0\u0e70\0\u0ec4\0\u0f18\0\u0f6c"+
+ "\0\u0fc0\0\u1014\0\u1068\0\u0540\0\u10bc\0\u1110\0\u1164\0\u11b8"+
+ "\0\u120c\0\u1260\0\u12b4\0\u1308\0\u135c\0\u13b0\0\u1404\0\u1458"+
+ "\0\u14ac\0\u1500\0\u1554\0\u15a8\0\u15fc\0\u1650\0\u16a4\0\u16f8"+
+ "\0\u174c\0\u17a0\0\u17f4\0\u1848\0\u189c\0\u18f0\0\u1944\0\u1998"+
+ "\0\u19ec\0\u0540\0\u1a40\0\u1a94\0\u1ae8\0\u1b3c\0\u1b90\0\u0540"+
+ "\0\u1be4\0\u1c38\0\u1c8c\0\u1ce0\0\u1d34\0\u1d88\0\u0540\0\u0540"+
+ "\0\u1ddc\0\u0540\0\u1e30\0\u1e84\0\u1ed8\0\u1f2c\0\u1ed8\0\u1ed8"+
+ "\0\u1f80\0\u1fd4\0\u2028\0\u207c\0\u0ccc\0\u20d0\0\u2124\0\u2178"+
+ "\0\u21cc\0\u2220\0\u2274\0\u22c8\0\u231c\0\u2370\0\u0540\0\u23c4"+
+ "\0\u2418\0\u0540\0\u246c\0\u24c0\0\u2514\0\u2568\0\u25bc\0\u2610"+
+ "\0\u2664\0\u26b8\0\u270c\0\u2760\0\u0540\0\u27b4\0\u2808\0\u285c"+
+ "\0\u28b0\0\u2904\0\u2958\0\u29ac\0\u2a00\0\u2a54\0\u2aa8\0\u2afc"+
+ "\0\u2b50\0\u2ba4\0\u2bf8\0\u2c4c\0\u2ca0\0\u2cf4\0\u2d48\0\u0ad4"+
+ "\0\u2d9c\0\u2df0\0\u2e44\0\u2e98\0\u2eec\0\u2f40\0\u2f94\0\u2fe8"+
+ "\0\u303c\0\u3090\0\u30e4\0\u3138\0\u318c\0\u31e0\0\u3234\0\u3288"+
+ "\0\u32dc\0\u3330\0\u3384\0\u33d8\0\u342c\0\u3480\0\u34d4\0\u3528"+
+ "\0\u357c\0\u35d0\0\u3624\0\u3678\0\u36cc\0\u3720\0\u3774\0\u37c8"+
+ "\0\u381c\0\u3870\0\u38c4\0\u3918\0\u396c\0\u39c0\0\u3a14\0\u3a68"+
+ "\0\u3abc\0\u0540\0\u3b10\0\u3b64\0\u3bb8\0\u3c0c\0\u3c60\0\u3cb4"+
+ "\0\u3d08\0\u3d5c\0\u3db0\0\u3e04\0\u3e58\0\u0540\0\u0540\0\u3eac"+
+ "\0\u3f00\0\u3f54\0\u1ed8\0\u3fa8\0\u3ffc\0\u4050\0\u40a4\0\u40f8"+
+ "\0\u414c\0\u41a0\0\u0540\0\u41f4\0\u4248\0\u429c\0\u42f0\0\u0540"+
+ "\0\u4344\0\u4398\0\u43ec\0\u4440\0\u4494\0\u44e8\0\u453c\0\u4590"+
+ "\0\u45e4\0\u4638\0\u468c\0\u46e0\0\u4734\0\u4788\0\u47dc\0\u4830"+
+ "\0\u4884\0\u48d8\0\u492c\0\u4980\0\u49d4\0\u4a28\0\u4a7c\0\u4ad0"+
+ "\0\u4b24\0\u4b78\0\u4bcc\0\u4c20\0\u4c74\0\u4cc8\0\u4d1c\0\u4d70"+
+ "\0\u4dc4\0\u4e18\0\u4e6c\0\u4ec0\0\u4f14\0\u4f68\0\u4fbc\0\u5010"+
+ "\0\u5064\0\u50b8\0\u510c\0\u5160\0\u51b4\0\u5208\0\u525c\0\u52b0"+
+ "\0\u5304\0\u5358\0\u53ac\0\u5400\0\u5454\0\u54a8\0\u54fc\0\u5550"+
+ "\0\u55a4\0\u55f8\0\u564c\0\u56a0\0\u56f4\0\u5748\0\u579c\0\u57f0"+
+ "\0\u5844\0\u5898\0\u58ec\0\u5940\0\u5994\0\u59e8\0\u5a3c\0\u5a90"+
+ "\0\u0ad4\0\u5ae4\0\u5b38\0\u5b8c\0\u5be0\0\u5c34\0\u5c88\0\u5cdc"+
+ "\0\u5d30\0\u5d84\0\u5dd8\0\u5e2c\0\u5e80\0\u5ed4\0\u5f28\0\u5f7c"+
+ "\0\u5fd0\0\u0540\0\u6024\0\u6078\0\u60cc\0\u6120\0\u6174\0\u61c8"+
+ "\0\u621c\0\u0540\0\u6270\0\u62c4\0\u6318\0\u636c\0\u63c0\0\u6414"+
+ "\0\u6468\0\u64bc\0\u6510\0\u6564\0\u65b8\0\u0540\0\u660c\0\u6660"+
+ "\0\u66b4\0\u6708\0\u675c\0\u67b0\0\u6804\0\u0ad4\0\u6858\0\u68ac"+
+ "\0\u6900\0\u6954\0\u69a8\0\u69fc\0\u6a50\0\u6aa4\0\u6af8\0\u6b4c"+
+ "\0\u6ba0\0\u0ad4\0\u6bf4\0\u6c48\0\u6c9c\0\u6cf0\0\u6d44\0\u6d98"+
+ "\0\u6dec\0\u6e40\0\u6e94\0\u6ee8\0\u6f3c\0\u6f90\0\u6fe4\0\u7038"+
+ "\0\u708c\0\u70e0\0\u7134\0\u7188\0\u71dc\0\u7230\0\u7284\0\u72d8"+
+ "\0\u732c\0\u7380\0\u73d4\0\u7428\0\u747c\0\u74d0\0\u7524\0\u7578"+
+ "\0\u75cc\0\u7620\0\u7674\0\u76c8\0\u771c\0\u7770\0\u77c4\0\u7818"+
+ "\0\u786c\0\u78c0\0\u7914\0\u7968\0\u79bc\0\u7a10\0\u7a64\0\u7ab8"+
+ "\0\u7b0c\0\u7b60\0\u7bb4\0\u7c08\0\u7c5c\0\u7cb0\0\u7d04\0\u7d58"+
+ "\0\u7dac\0\u7e00\0\u7e54\0\u7ea8\0\u7efc\0\u7f50\0\u7fa4\0\u7ff8"+
+ "\0\u804c\0\u80a0\0\u80f4\0\u8148\0\u819c\0\u81f0\0\u8244\0\u8298"+
+ "\0\u82ec\0\u8340\0\u8394\0\u83e8\0\u843c\0\u8490\0\u84e4\0\u8538"+
+ "\0\u858c\0\u85e0\0\u8634\0\u8688\0\u86dc\0\u8730\0\u8784\0\u87d8"+
+ "\0\u882c\0\u8880\0\u88d4\0\u8928\0\u897c\0\u89d0\0\u8a24\0\u8a78"+
+ "\0\u8acc\0\u8b20\0\u8b74\0\u77c4\0\u8bc8\0\u78c0\0\u8c1c\0\u8c70"+
+ "\0\u8cc4\0\u8d18\0\u8d6c\0\u8dc0\0\u8e14\0\u8e68\0\u8ebc\0\u8f10"+
+ "\0\u8f64\0\u8fb8\0\u900c\0\u9060\0\u90b4\0\u9108\0\u915c\0\u91b0"+
+ "\0\u9204\0\u9258\0\u92ac\0\u9300\0\u9354\0\u93a8\0\u93fc\0\u9450"+
+ "\0\u94a4\0\u94f8\0\u954c\0\u95a0\0\u95f4\0\u9648\0\u969c\0\u96f0"+
+ "\0\u9744\0\u9798\0\u97ec\0\u9840\0\u9894\0\u98e8\0\u993c\0\u9990"+
+ "\0\u99e4\0\u9a38\0\u9a8c\0\u9ae0\0\u9b34\0\u9b88\0\u9bdc\0\u9c30"+
+ "\0\u9c84\0\u9cd8\0\u9d2c\0\u9d80\0\u9dd4\0\u9e28\0\u9e7c\0\u9ed0"+
+ "\0\u9f24\0\u9f78\0\u9fcc\0\ua020\0\ua074\0\ua0c8\0\ua11c\0\ua170"+
+ "\0\ua1c4\0\ua218\0\ua26c\0\ua2c0\0\ua314\0\ua368\0\ua3bc\0\ua410"+
+ "\0\ua464\0\ua4b8\0\ua50c\0\ua560\0\u0a80\0\ua5b4\0\u0540\0\ua608"+
+ "\0\ua65c\0\ua6b0\0\ua704\0\ua758\0\ua7ac\0\ua800\0\ua854\0\ua8a8"+
+ "\0\ua8fc\0\ua950\0\ua9a4\0\ua9f8\0\uaa4c\0\uaaa0\0\uaaf4\0\uab48"+
+ "\0\u0540\0\uab9c\0\u0540\0\uabf0\0\uac44\0\uac98\0\uacec\0\uad40"+
+ "\0\uad94\0\uade8\0\uae3c\0\uae90\0\uaee4\0\uaf38\0\uaf8c\0\uafe0"+
+ "\0\ub034\0\ub088\0\ub0dc\0\ub130\0\ub184\0\ub1d8\0\ub22c\0\ub280"+
+ "\0\ub2d4\0\ub328\0\ub37c\0\ub3d0\0\ub424\0\ub478\0\ub4cc\0\ub520"+
+ "\0\ub574\0\ub5c8\0\ub61c\0\ub670\0\ub6c4\0\ub718\0\ub76c\0\ub7c0";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[608];
+ 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 =
+ "\7\17\1\20\1\21\1\22\1\23\1\24\71\17\1\23"+
+ "\16\17\10\25\1\26\37\25\1\27\53\25\10\30\1\31"+
+ "\53\30\1\32\37\30\10\33\1\34\14\33\1\35\76\33"+
+ "\7\36\1\37\1\0\1\36\1\23\2\36\1\40\7\36"+
+ "\1\41\3\36\1\42\1\43\6\36\1\44\43\36\1\23"+
+ "\16\36\32\45\1\46\71\45\31\47\1\46\72\47\7\36"+
+ "\1\37\1\0\1\36\1\23\2\36\1\40\7\36\1\50"+
+ "\3\36\1\51\1\52\6\36\1\44\43\36\1\23\16\36"+
+ "\32\45\1\53\71\45\31\47\1\53\72\47\24\54\1\55"+
+ "\77\54\1\56\1\57\1\60\1\61\1\57\1\40\1\62"+
+ "\1\23\1\63\1\64\1\23\1\65\1\66\2\67\1\70"+
+ "\1\71\1\72\1\73\1\57\1\74\1\75\1\76\1\60"+
+ "\1\56\1\77\1\100\1\101\1\102\1\103\1\104\1\105"+
+ "\1\57\1\106\1\67\1\107\1\57\1\110\1\111\1\57"+
+ "\1\112\1\113\1\114\1\115\1\116\1\117\1\120\1\121"+
+ "\1\70\1\66\2\67\2\40\1\122\1\123\1\124\1\125"+
+ "\1\56\1\70\1\57\1\126\1\127\1\57\1\130\1\57"+
+ "\1\131\2\57\1\23\1\132\1\133\1\134\1\135\1\136"+
+ "\1\137\1\57\1\140\6\57\10\141\1\142\31\141\1\143"+
+ "\3\141\1\144\25\141\1\145\1\146\26\141\10\147\1\150"+
+ "\35\147\1\151\25\147\1\152\1\153\26\147\10\17\4\0"+
+ "\71\17\1\0\25\17\1\20\2\0\1\23\1\0\71\17"+
+ "\1\23\16\17\125\0\1\154\3\0\1\154\10\0\1\155"+
+ "\1\0\4\154\2\0\1\154\4\0\3\154\3\0\1\156"+
+ "\1\0\5\154\2\0\6\154\4\0\1\157\1\0\4\154"+
+ "\2\0\11\154\1\0\16\154\7\0\1\23\2\0\1\23"+
+ "\72\0\1\23\16\0\12\24\1\0\1\24\1\160\70\24"+
+ "\1\0\16\24\10\25\1\0\37\25\1\0\53\25\50\0"+
+ "\1\161\53\0\10\30\1\0\53\30\1\0\37\30\25\0"+
+ "\1\162\76\0\10\33\1\0\14\33\1\0\76\33\10\36"+
+ "\1\0\1\36\1\0\2\36\1\0\7\36\1\0\3\36"+
+ "\2\0\6\36\1\0\43\36\1\0\25\36\1\37\1\0"+
+ "\1\36\1\23\2\36\1\0\7\36\1\0\3\36\2\0"+
+ "\6\36\1\0\43\36\1\23\16\36\25\0\1\41\76\0"+
+ "\32\45\1\0\71\45\31\47\1\0\72\47\24\54\1\0"+
+ "\77\54\24\0\1\163\77\0\5\56\13\0\4\56\2\0"+
+ "\3\56\2\0\3\56\1\0\2\56\2\0\5\56\2\0"+
+ "\6\56\6\0\5\56\1\0\11\56\1\0\17\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\2\165\2\60\1\165"+
+ "\1\0\1\166\11\0\1\165\1\167\2\165\2\0\1\165"+
+ "\1\60\1\165\2\0\3\165\1\0\2\165\2\0\1\165"+
+ "\1\170\2\167\1\171\2\0\2\165\1\171\1\165\1\170"+
+ "\1\165\6\0\5\165\1\0\2\165\1\167\6\165\1\0"+
+ "\20\165\1\172\1\173\1\165\1\0\1\166\11\0\1\165"+
+ "\1\167\2\165\2\0\1\165\1\173\1\165\2\0\3\165"+
+ "\1\0\2\165\2\0\1\174\1\170\2\167\1\171\2\0"+
+ "\2\165\1\171\1\165\1\170\1\165\6\0\5\165\1\0"+
+ "\2\165\1\167\5\165\1\174\1\0\16\165\2\0\2\166"+
+ "\23\0\1\166\105\0\1\175\3\0\1\40\1\176\22\0"+
+ "\1\177\75\0\1\40\1\0\1\40\123\0\1\40\106\0"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\4\57\1\200\4\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\3\57\1\201\2\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\57\1\202\4\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\24\0\1\203\114\0\1\40\7\0"+
+ "\1\204\76\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\205"+
+ "\4\57\1\0\16\57\30\77\1\206\1\207\72\77\10\100"+
+ "\1\210\17\100\1\211\1\100\1\212\71\100\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\213"+
+ "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\5\57"+
+ "\1\214\6\0\2\57\1\215\1\216\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\217\2\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\220\1\221\2\57\6\0\4\57"+
+ "\1\56\1\0\4\57\1\222\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\223"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\5\56\13\0\4\56\2\0\3\56\2\0\3\56\1\0"+
+ "\2\56\2\0\5\56\2\0\6\56\6\0\2\56\1\224"+
+ "\2\56\1\0\11\56\1\0\16\56\15\0\1\40\23\0"+
+ "\1\225\1\226\61\0\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\3\57\1\227\12\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\230\2\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\231\2\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\232\1\57\1\233"+
+ "\6\0\2\57\1\234\1\57\1\56\1\0\4\57\1\235"+
+ "\4\57\1\0\16\57\15\0\1\40\32\0\1\40\70\0"+
+ "\1\40\33\0\1\40\52\0\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\236\1\237\1\240\2\57"+
+ "\6\0\4\57\1\56\1\0\1\241\3\57\1\242\1\243"+
+ "\3\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\244\1\245\2\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\4\57\1\246\1\247\6\0"+
+ "\4\57\1\56\1\0\7\57\1\250\1\251\1\0\1\57"+
+ "\1\252\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\253\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\2\57\1\253\6\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\250\1\57\1\250\1\254"+
+ "\2\57\6\0\4\57\1\56\1\0\4\57\1\255\4\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\256\2\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\257\1\57\1\260\3\57\6\0\1\57"+
+ "\1\261\2\57\1\56\1\0\1\57\1\262\7\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\263\1\57\1\264\3\57\6\0\4\57\1\56\1\0"+
+ "\4\57\1\265\4\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\266\1\267\1\57"+
+ "\6\0\4\57\1\56\1\0\4\57\1\270\4\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\1\57\1\271\1\57\1\0\1\56\1\57\2\0"+
+ "\3\57\1\272\1\57\2\0\5\57\1\273\6\0\4\57"+
+ "\1\56\1\0\6\57\1\274\2\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\275"+
+ "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+ "\1\276\1\57\1\277\1\300\1\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\2\57\1\301\1\57"+
+ "\1\56\1\0\1\302\10\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\2\57\1\303\3\57"+
+ "\6\0\4\57\1\56\1\0\4\57\1\250\1\304\3\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\305\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\250\4\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\1\57\1\306\14\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\307"+
+ "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\250"+
+ "\1\57\1\310\3\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\311\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\3\57\1\312\2\57\6\0\4\57"+
+ "\1\56\1\0\4\57\1\313\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\314"+
+ "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+ "\1\315\2\57\6\0\4\57\1\56\1\0\4\57\1\316"+
+ "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\317\2\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\2\57\1\320\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\321\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\10\141\1\0\31\141\1\0"+
+ "\3\141\1\0\25\141\2\0\26\141\41\0\1\322\134\0"+
+ "\1\323\15\0\1\324\105\0\1\325\146\0\1\326\26\0"+
+ "\10\147\1\0\35\147\1\0\25\147\2\0\26\147\52\0"+
+ "\1\327\15\0\1\330\105\0\1\331\146\0\1\332\27\0"+
+ "\3\154\1\0\2\154\11\0\4\154\2\0\2\154\3\0"+
+ "\3\154\5\0\6\154\1\0\6\154\6\0\4\154\2\0"+
+ "\11\154\1\0\16\154\17\0\1\333\30\0\1\334\54\0"+
+ "\1\335\3\0\1\335\12\0\4\335\2\0\1\335\4\0"+
+ "\3\335\5\0\5\335\2\0\6\335\6\0\4\335\2\0"+
+ "\11\335\1\0\16\335\25\0\1\336\123\0\1\337\76\0"+
+ "\5\56\13\0\4\56\2\0\3\56\2\0\1\340\2\56"+
+ "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+ "\1\0\11\56\1\0\16\56\5\165\13\0\4\165\2\0"+
+ "\3\165\2\0\3\165\1\0\2\165\2\0\5\165\2\0"+
+ "\6\165\6\0\5\165\1\0\11\165\1\0\20\165\2\166"+
+ "\1\165\13\0\1\165\1\167\2\165\2\0\1\165\1\166"+
+ "\1\165\2\0\3\165\1\0\2\165\2\0\2\165\2\167"+
+ "\1\171\2\0\2\165\1\171\3\165\6\0\5\165\1\0"+
+ "\2\165\1\167\6\165\1\0\20\165\2\341\1\165\13\0"+
+ "\4\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+ "\2\165\2\0\5\165\2\342\6\165\6\0\5\165\1\0"+
+ "\11\165\1\0\20\165\2\172\1\165\1\0\1\166\11\0"+
+ "\1\165\1\167\2\165\2\0\1\165\1\172\1\165\2\0"+
+ "\3\165\1\0\2\165\2\0\2\165\2\167\1\171\2\0"+
+ "\2\165\1\171\3\165\6\0\5\165\1\0\2\165\1\167"+
+ "\6\165\1\0\20\165\1\172\1\173\1\165\1\0\1\166"+
+ "\11\0\1\165\1\167\2\165\2\0\1\165\1\173\1\165"+
+ "\2\0\3\165\1\0\2\165\2\0\1\165\1\343\2\167"+
+ "\1\171\2\0\2\165\1\171\1\165\1\343\1\165\6\0"+
+ "\5\165\1\0\2\165\1\167\6\165\1\0\20\165\2\344"+
+ "\1\165\13\0\3\344\1\165\2\0\2\344\1\165\2\0"+
+ "\2\165\1\344\1\0\2\165\2\0\2\165\3\344\2\0"+
+ "\2\165\2\344\2\165\6\0\1\165\1\344\3\165\1\0"+
+ "\2\165\1\344\6\165\1\0\16\165\17\0\1\345\105\0"+
+ "\1\346\3\0\1\346\12\0\4\346\2\0\1\346\4\0"+
+ "\3\346\5\0\5\346\2\0\6\346\6\0\1\347\3\346"+
+ "\2\0\11\346\1\0\16\346\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\4\57\1\350\1\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\351\5\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\57\1\352\4\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\25\0\1\353"+
+ "\113\0\1\40\7\0\1\67\76\0\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\4\57\1\354\4\57\1\0\16\57\3\355\1\77"+
+ "\4\355\1\0\16\355\4\77\1\356\2\77\10\355\1\77"+
+ "\3\355\2\77\50\355\30\210\1\357\1\210\1\360\74\210"+
+ "\1\100\4\210\1\0\16\210\4\100\1\361\2\100\10\210"+
+ "\1\100\3\210\2\100\50\210\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\362\1\57\1\363\1\57"+
+ "\6\0\4\57\1\56\1\0\2\57\1\364\6\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\250\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\365\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+ "\1\366\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\4\57\1\367\1\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\1\57\1\370\6\57\1\371\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\372\5\57"+
+ "\6\0\4\57\1\56\1\0\6\57\1\373\2\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\250\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\374\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\5\56\13\0\4\56\2\0\3\56\2\0"+
+ "\1\56\1\375\1\56\1\0\2\56\2\0\5\56\2\0"+
+ "\6\56\6\0\5\56\1\0\11\56\1\0\16\56\42\0"+
+ "\1\376\61\0\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\1\57"+
+ "\1\377\3\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\57\1\u0100\1\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\57\1\u0101\1\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\4\57\1\u0102\1\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+ "\1\u0103\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+ "\1\u0104\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+ "\1\u0105\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\1\u0106\2\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u0107\2\57\6\0\4\57\1\56\1\0"+
+ "\5\57\1\250\3\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\4\57\1\u0108\1\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\57\1\u0109\4\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u010a"+
+ "\4\57\6\0\2\57\1\u010b\1\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\1\u010c\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\3\57\1\u010d\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u010e\5\57\6\0\4\57\1\56\1\0\6\57"+
+ "\1\u010f\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\57\1\u0110\1\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\5\57\1\214\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0111"+
+ "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\u0112\5\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0113\2\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\2\57\1\250\6\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\2\57\1\u0114\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+ "\1\u0115\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\3\57\1\u0116\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\3\57\1\u0117\2\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\u0118\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u0119\5\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\u011a\4\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u011b"+
+ "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\57\1\u011c\4\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u011d"+
+ "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\1\u011e\2\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011f"+
+ "\3\57\1\u0113\1\214\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u0120\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\57\1\u0121\1\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u0122\5\57\6\0\1\57\1\u0123"+
+ "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\2\57\1\u0124\2\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\2\57\1\u0125\2\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\4\57"+
+ "\1\u0126\11\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\3\57\1\u0127\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\2\57\1\u0128\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\2\57\1\u0129\3\57\6\0\2\57\1\u012a\1\57"+
+ "\1\56\1\0\4\57\1\u012b\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u012c"+
+ "\4\57\6\0\1\57\1\u012d\2\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u012e\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\u012f\5\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\2\57\1\u0130\1\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\3\57\1\u0131\1\57\2\0\4\57\1\u0132\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+ "\1\u0133\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\1\u0134\3\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0135\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\10\57\1\u0136\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\u0137\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\u0138\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\57\1\250\4\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\2\57\1\253\1\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+ "\1\u0139\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u013a\5\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\u013b\2\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\1\57\1\u013c\14\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\u013d\1\57"+
+ "\6\0\4\57\1\56\1\0\6\57\1\u013e\2\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\6\57"+
+ "\1\u013f\7\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\1\57\1\u0140\2\57\1\56\1\0"+
+ "\11\57\1\0\16\57\71\0\1\u0141\110\0\1\u0142\117\0"+
+ "\1\u0143\146\0\1\u0144\117\0\1\u0145\110\0\1\u0146\117\0"+
+ "\1\u0147\146\0\1\u0148\46\0\1\u0149\153\0\1\u014a\54\0"+
+ "\3\335\1\0\2\335\11\0\4\335\2\0\2\335\3\0"+
+ "\3\335\5\0\6\335\1\0\6\335\6\0\4\335\2\0"+
+ "\11\335\1\0\16\335\2\56\2\u014b\1\56\13\0\3\u014b"+
+ "\1\56\2\0\2\u014b\1\56\2\0\2\56\1\u014b\1\0"+
+ "\2\56\2\0\2\56\3\u014b\2\0\2\56\2\u014b\2\56"+
+ "\6\0\1\56\1\u014b\3\56\1\0\2\56\1\u014b\6\56"+
+ "\1\0\16\56\2\165\2\341\1\165\13\0\1\165\1\167"+
+ "\2\165\2\0\1\165\1\341\1\165\2\0\3\165\1\0"+
+ "\2\165\2\0\2\165\2\167\1\165\2\0\6\165\6\0"+
+ "\5\165\1\0\2\165\1\167\6\165\1\0\16\165\2\0"+
+ "\2\341\23\0\1\341\74\0\2\165\2\344\1\165\13\0"+
+ "\3\344\1\165\2\0\2\344\1\165\2\0\2\165\1\344"+
+ "\1\0\2\165\2\0\1\165\1\343\3\344\2\0\2\165"+
+ "\2\344\1\343\1\165\6\0\1\165\1\344\3\165\1\0"+
+ "\2\165\1\344\6\165\1\0\16\165\20\0\1\u014c\104\0"+
+ "\3\346\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346"+
+ "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\4\346"+
+ "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014d"+
+ "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+ "\6\346\1\0\6\346\6\0\1\346\1\u014e\2\346\2\0"+
+ "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\u014f\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u0139\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\314\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0150\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\30\355"+
+ "\1\u0151\1\u0152\74\355\2\u0153\14\355\3\u0153\3\355\2\u0153"+
+ "\1\u0151\1\u0152\3\355\1\u0153\7\355\3\u0153\4\355\2\u0153"+
+ "\11\355\1\u0153\6\355\1\u0153\25\355\10\210\1\0\115\210"+
+ "\2\u0154\14\210\3\u0154\3\210\2\u0154\1\357\1\210\1\360"+
+ "\2\210\1\u0154\7\210\3\u0154\4\210\2\u0154\11\210\1\u0154"+
+ "\6\210\1\u0154\25\210\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\5\57\1\247\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\u0155\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u0156\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\u0139\5\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\u0157\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\250\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\4\57\1\u0158"+
+ "\1\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u0159"+
+ "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\2\57\1\u015a\1\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u015b\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u015c\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+ "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+ "\6\0\1\56\1\u015d\3\56\1\0\11\56\1\0\16\56"+
+ "\41\0\1\u015e\62\0\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\1\u015f\3\57\1\56\1\0"+
+ "\11\57\1\0\4\57\1\u0160\11\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u0161"+
+ "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\1\57"+
+ "\1\u0162\2\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\u0106"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\4\57\1\u0163\4\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+ "\1\u0164\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\u0165\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0166\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\1\57\1\u0167\2\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\4\57\1\u0168\1\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\1\u0169\15\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\u016a\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\5\57\1\250\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\1\u016b\15\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u016c\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\u016d\2\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\4\57\1\u016e\4\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\2\57\1\u016f\6\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u0170"+
+ "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0171\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\4\57\1\u0172\1\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\2\57\1\367\3\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+ "\1\u0173\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\312\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\u0174\1\u0175\4\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\3\57"+
+ "\1\u0176\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\10\57\1\u0177\5\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\4\57\1\u0178\4\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u011f"+
+ "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\2\57\1\u0179\1\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u0100\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\u017a\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\1\57\1\u012f\2\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\5\57\1\u010b\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u017b\4\57\1\222\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\2\57\1\u017c\3\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\u017d\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u017e"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\2\57\1\u017f\1\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\3\57\1\u0180\2\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\4\57\1\u0181\1\57\6\0\4\57\1\56\1\0"+
+ "\4\57\1\u0182\4\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\4\57\1\u0174\1\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\1\57\1\u0159\14\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+ "\1\u0183\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\57"+
+ "\1\u0184\14\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u0185\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\5\57\1\u0186\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\3\57\1\u0187"+
+ "\5\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+ "\1\u0172\3\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\1\250\10\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\4\57\1\214\1\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\u0188\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\2\57\1\u0189\3\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u018a"+
+ "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+ "\1\u018b\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\57\1\u018c\4\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\5\57\1\u018d\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\3\57\1\u018e\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\7\57\1\u018f\1\u0177\1\u0190\4\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\4\57\1\u0191\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\1\u0139\10\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\5\57\1\351"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\2\57\1\u0192\1\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+ "\1\u0139\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\2\57\1\u0193\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u0194\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\350\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\5\0\1\u0195\172\0\1\u0141\140\0\1\u0196"+
+ "\40\0\1\u0197\122\0\1\u0198\172\0\1\u0145\140\0\1\u0199"+
+ "\40\0\1\u019a\136\0\1\u019b\102\0\2\56\2\u019c\1\56"+
+ "\13\0\3\u019c\1\56\2\0\2\u019c\1\56\2\0\2\56"+
+ "\1\u019c\1\0\2\56\2\0\2\56\3\u019c\2\0\2\56"+
+ "\2\u019c\2\56\6\0\1\56\1\u019c\3\56\1\0\2\56"+
+ "\1\u019c\6\56\1\0\16\56\21\0\1\u019d\103\0\3\346"+
+ "\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346\3\0"+
+ "\3\346\5\0\6\346\1\0\6\346\6\0\1\347\3\346"+
+ "\2\0\11\346\1\0\16\346\1\0\3\346\1\0\1\u014d"+
+ "\1\346\11\0\4\346\2\0\2\346\3\0\3\346\5\0"+
+ "\6\346\1\0\1\346\1\u019e\4\346\6\0\4\346\2\0"+
+ "\11\346\1\0\16\346\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\57\1\u0139\4\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u019f\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\10\355\1\0\115\355"+
+ "\2\u01a0\14\355\3\u01a0\3\355\2\u01a0\1\u0151\1\u0152\3\355"+
+ "\1\u01a0\7\355\3\u01a0\4\355\2\u01a0\11\355\1\u01a0\6\355"+
+ "\1\u01a0\25\355\2\210\2\u01a1\14\210\3\u01a1\3\210\2\u01a1"+
+ "\1\357\1\210\1\360\2\210\1\u01a1\7\210\3\u01a1\4\210"+
+ "\2\u01a1\11\210\1\u01a1\6\210\1\u01a1\25\210\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\3\57\1\u01a2\2\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\3\57\1\u01a3\1\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\u01a4"+
+ "\5\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\2\57\1\u01a5\1\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\2\57\1\u01a6"+
+ "\2\57\2\0\6\57\6\0\1\u01a7\3\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\1\57\1\214\14\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\5\57\1\u01a8\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\3\57\1\250\5\57\1\0\16\57\5\56\13\0\4\56"+
+ "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+ "\2\0\4\56\1\u01a9\1\56\6\0\5\56\1\0\11\56"+
+ "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01aa\4\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\4\57\1\u01ab"+
+ "\4\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\u01ac\5\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\u01ad\5\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+ "\1\u01ae\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\4\57\1\u01af\1\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\54\0\1\u01b0\47\0"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0172\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\3\57\1\u01b1\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u01b2\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\1\57\1\250"+
+ "\7\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\4\57\1\u01b3\1\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\4\57\1\u01b4\4\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\57\1\u01b5\4\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\1\57\1\u01b6\14\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\4\57\1\u01b7\4\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\3\57\1\u0167\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\1\57\1\u01b8\1\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\3\57"+
+ "\1\u01b9\3\57\1\u01ba\6\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\2\57\1\u01bb\1\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\u01bc\5\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\1\57\1\u01bd\1\u01be\1\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01bf"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+ "\1\u0113\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\1\57\1\u01c0\1\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0139"+
+ "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\2\57\1\u01c1\1\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\u01c2\4\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\u01c3\2\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\u01c4\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u01c5"+
+ "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\4\57\1\u0172\11\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u01c6\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\57\1\222\4\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u01c7\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u0189\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\u01c8\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u01c9\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\u01ca\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\1\u01cb\2\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\214\5\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\6\57\1\u0174\2\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\2\57\1\u01cc\1\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+ "\1\u01cd\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\1\57\1\261\2\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\2\57\1\u01ce\1\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\u01cf\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\12\57\1\u01d0\3\57\1\56\4\57\13\0"+
+ "\2\57\1\u01d1\1\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\2\57\1\u01d2\3\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\2\57\1\u014f"+
+ "\3\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\1\57\1\365\2\57\1\56\1\0\11\57\1\0"+
+ "\16\57\41\0\1\u01d3\67\0\1\u0195\51\0\1\u0141\45\0"+
+ "\3\u0197\3\u01d4\4\0\5\u01d4\4\u0197\1\u01d4\1\0\2\u0197"+
+ "\1\0\1\u01d4\1\0\3\u0197\1\0\1\u01d4\2\u0197\1\u01d4"+
+ "\5\u0197\2\u01d4\6\u0197\1\0\1\u01d4\1\0\3\u01d4\4\u0197"+
+ "\2\u01d4\11\u0197\1\0\16\u0197\41\0\1\u01d5\67\0\1\u0198"+
+ "\51\0\1\u0145\45\0\3\u019a\3\u01d6\4\0\5\u01d6\4\u019a"+
+ "\1\u01d6\1\0\2\u019a\1\0\1\u01d6\1\0\3\u019a\1\0"+
+ "\1\u01d6\2\u019a\1\u01d6\5\u019a\2\u01d6\6\u019a\1\0\1\u01d6"+
+ "\1\0\3\u01d6\4\u019a\2\u01d6\11\u019a\1\0\16\u019a\22\0"+
+ "\1\u01d7\101\0\2\56\2\u01d8\1\56\13\0\3\u01d8\1\56"+
+ "\2\0\2\u01d8\1\56\2\0\2\56\1\u01d8\1\0\2\56"+
+ "\2\0\2\56\3\u01d8\2\0\2\56\2\u01d8\2\56\6\0"+
+ "\1\56\1\u01d8\3\56\1\0\2\56\1\u01d8\6\56\1\0"+
+ "\16\56\22\0\1\u01d9\102\0\3\346\1\0\1\u014d\1\346"+
+ "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+ "\1\0\6\346\6\0\2\346\1\u01da\1\346\2\0\11\346"+
+ "\1\0\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u01db\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\2\355\2\u01dc\14\355\3\u01dc\3\355"+
+ "\2\u01dc\1\u0151\1\u0152\3\355\1\u01dc\7\355\3\u01dc\4\355"+
+ "\2\u01dc\11\355\1\u01dc\6\355\1\u01dc\25\355\2\210\2\u01dd"+
+ "\14\210\3\u01dd\3\210\2\u01dd\1\357\1\210\1\360\2\210"+
+ "\1\u01dd\7\210\3\u01dd\4\210\2\u01dd\11\210\1\u01dd\6\210"+
+ "\1\u01dd\25\210\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u01de"+
+ "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\2\57\1\u01df\1\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u01e0\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0167\1\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\57\1\u01e1\4\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\1\57\1\u01e2\2\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\3\57\1\u01e3\1\56\1\0\11\57\1\0\16\57"+
+ "\5\56\13\0\4\56\2\0\3\56\2\0\1\u01e4\2\56"+
+ "\1\0\2\56\2\0\5\56\2\0\6\56\6\0\5\56"+
+ "\1\0\11\56\1\0\17\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\1\57\1\u01e5\2\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\2\57\1\351\6\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u01e6"+
+ "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+ "\1\u01e7\1\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\6\57\1\u01e8\2\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+ "\1\u01e9\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\55\0\1\u01ea\46\0\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\3\57\1\u01eb\2\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\1\u01ec\5\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\2\57\1\u01ed\3\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\3\57\1\250\1\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\57"+
+ "\1\250\1\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u01ee\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\6\57\1\u0172\2\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u010b"+
+ "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\4\57"+
+ "\1\u01ef\4\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\3\57\1\u01f0\2\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\250"+
+ "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\1\57\1\u01bd\2\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u01f1"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\4\57"+
+ "\1\u01f2\1\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01f3\4\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\1\u0139\15\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\u01f4\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\57\1\u01f5\1\57\1\0\1\56"+
+ "\1\57\2\0\3\57\1\u01e3\1\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\2\57\1\214\6\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\6\57\1\u01f6\2\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\2\57\1\u01f7\1\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\6\57\1\u01f8\2\57"+
+ "\1\0\16\57\1\56\4\57\13\0\2\57\1\u01f9\1\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\4\57\1\u01fa\11\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\1\57\1\u01fb"+
+ "\2\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\2\57\1\u01fc\2\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\13\57\1\u01fd"+
+ "\2\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\1\214"+
+ "\15\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\4\57\1\222\1\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\3\57\1\u01fe\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\2\57\1\u01c3\1\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+ "\1\u01ff\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\u0200\4\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\1\57\1\u0172\3\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0201"+
+ "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\1\u0202\3\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\41\0"+
+ "\1\u0197\123\0\1\u019a\105\0\1\u0203\100\0\2\56\2\57"+
+ "\1\56\13\0\3\57\1\56\2\0\2\57\1\56\2\0"+
+ "\2\56\1\57\1\0\2\56\2\0\2\56\3\57\2\0"+
+ "\2\56\2\57\2\56\6\0\1\56\1\57\3\56\1\0"+
+ "\2\56\1\57\6\56\1\0\16\56\23\0\1\u0204\101\0"+
+ "\3\346\1\0\1\u014d\1\346\11\0\4\346\2\0\2\346"+
+ "\3\0\3\346\5\0\6\346\1\0\6\346\6\0\3\346"+
+ "\1\u0205\2\0\11\346\1\0\16\346\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0139\1\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\2\355\2\77"+
+ "\14\355\3\77\3\355\2\77\1\u0151\1\u0152\3\355\1\77"+
+ "\7\355\3\77\4\355\2\77\11\355\1\77\6\355\1\77"+
+ "\25\355\2\210\2\100\14\210\3\100\3\210\2\100\1\357"+
+ "\1\210\1\360\2\210\1\100\7\210\3\100\4\210\2\100"+
+ "\11\210\1\100\6\210\1\100\25\210\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\3\57\1\u01b9\12\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\1\57\1\u0206"+
+ "\1\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\2\57\1\u0207\1\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\3\57"+
+ "\1\u0208\2\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u01a5\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u0209\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\5\56\13\0\4\56\2\0\3\56"+
+ "\2\0\3\56\1\0\2\56\2\0\5\56\2\0\6\56"+
+ "\6\0\5\56\1\0\2\56\1\u020a\6\56\1\0\17\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\3\57\1\u020b\5\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\4\57\1\u01db\4\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\4\57\1\u01b5\4\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\3\57\1\u020c\2\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\5\57"+
+ "\1\250\3\57\1\0\16\57\67\0\1\u020d\34\0\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u020e"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\10\57\1\u020f"+
+ "\5\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\11\57\1\0\14\57"+
+ "\1\u0210\1\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\3\57\1\u0211\12\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\1\57\1\u0212\14\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\57\1\u0213\4\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\3\57\1\u0214\2\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0215\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\3\57\1\u0216\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\1\214"+
+ "\2\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\367"+
+ "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0217\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\1\u0167\5\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\u0218\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\5\57\1\u0219\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\u01b7\2\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u0206\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\4\57\1\u021a\1\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\57\1\u021b\1\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\4\57\1\u021c\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u021d\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\5\57\1\u021e\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\2\57\1\u021f\6\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\u0220\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\22\0"+
+ "\1\u0221\123\0\1\u0222\102\0\3\346\1\0\1\u014d\1\346"+
+ "\11\0\4\346\2\0\2\346\3\0\3\346\5\0\6\346"+
+ "\1\0\1\u0223\5\346\6\0\4\346\2\0\11\346\1\0"+
+ "\16\346\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\253\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\3\57"+
+ "\1\u0224\1\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\6\57"+
+ "\1\u0167\2\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\1\57\1\214\2\57"+
+ "\1\56\1\0\11\57\1\0\16\57\5\56\13\0\4\56"+
+ "\2\0\3\56\2\0\3\56\1\0\2\56\2\0\5\56"+
+ "\2\0\2\56\1\u0225\3\56\6\0\5\56\1\0\11\56"+
+ "\1\0\17\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\2\57\1\365\3\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\u0226\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\74\0\1\u0227\27\0\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\1\u0228\15\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0229\2\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\2\57\1\u022a\1\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\4\57\1\u022b\4\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\2\57\1\u022c\1\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\2\57\1\u022d\1\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\1\u0172\15\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\1\u022e\3\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\u022f\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\1\57\1\u0230\3\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0231\1\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\1\u0232\1\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\4\57\1\u0233\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\u0172\5\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\1\57\1\u0234\14\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+ "\1\u0172\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\2\57\1\u0235\1\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\1\u0236\3\57\1\56\1\0\11\57"+
+ "\1\0\10\57\1\u0237\5\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\2\57\1\u0238\1\57"+
+ "\1\56\1\0\11\57\1\0\16\57\17\0\1\u0239\123\0"+
+ "\1\353\105\0\3\346\1\0\1\u014d\1\346\1\u023a\2\0"+
+ "\1\u023a\5\0\4\346\1\0\1\u023b\2\346\3\0\3\346"+
+ "\5\0\6\346\1\0\6\346\6\0\4\346\2\0\11\346"+
+ "\1\u023a\16\346\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u023c\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\2\57\1\u0172"+
+ "\6\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\222\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u023d\5\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\1\u023e\15\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\1\57\1\u023f\14\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\2\57\1\u0240\3\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\3\57\1\u0241\2\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\4\57\1\u0242\4\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\1\57"+
+ "\1\u0243\4\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\4\57\1\u0244\4\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\1\u010b\5\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\2\57\1\u0245\1\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\3\57\1\u021b\2\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\2\57\1\u0246\3\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\4\57\1\56"+
+ "\1\0\4\57\1\u0247\4\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\1\u0248\5\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\4\57\1\300\1\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\3\57\1\u0139\1\56\1\0\11\57\1\0\16\57\7\0"+
+ "\1\u023a\2\0\1\u023a\12\0\1\u023b\57\0\1\u023a\16\0"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0249\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\1\u0172\10\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\4\57\1\56\1\0\1\u024a\10\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\6\57\6\0\2\57\1\u024b\1\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\6\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\4\57\1\u01fa\11\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\2\57\1\u024c\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\1\u024d\2\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\1\u012e\5\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\3\57\1\u024e\2\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\1\u024f\5\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\1\57\1\222\1\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\57\1\u0172\1\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\6\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\4\57\1\u0250\4\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\1\57\1\u0251"+
+ "\4\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\15\57\1\u0252"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\2\57"+
+ "\1\u0253\3\57\6\0\4\57\1\56\1\0\11\57\1\0"+
+ "\16\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\4\57\1\u0254\1\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\1\57\1\u0255\1\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\4\57\1\56\1\0\2\57"+
+ "\1\u0206\6\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\6\57\6\0\4\57\1\56\1\0"+
+ "\6\57\1\u0256\2\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\3\57\1\u0172"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\4\57\1\u0257\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\1\u0258\2\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\1\u0259\3\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\2\57\1\u025a\3\57\6\0"+
+ "\4\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\4\57"+
+ "\1\56\1\0\2\57\1\u025b\6\57\1\0\16\57\1\56"+
+ "\4\57\13\0\4\57\2\0\2\57\1\164\2\0\3\57"+
+ "\1\0\1\56\1\57\2\0\5\57\2\0\3\57\1\u025c"+
+ "\2\57\6\0\4\57\1\56\1\0\11\57\1\0\16\57"+
+ "\1\56\4\57\13\0\4\57\2\0\2\57\1\164\2\0"+
+ "\3\57\1\0\1\56\1\57\2\0\5\57\2\0\6\57"+
+ "\6\0\4\57\1\56\1\0\11\57\1\0\1\57\1\u025d"+
+ "\14\57\1\56\4\57\13\0\4\57\2\0\2\57\1\164"+
+ "\2\0\3\57\1\0\1\56\1\57\2\0\5\57\2\0"+
+ "\3\57\1\u025e\2\57\6\0\4\57\1\56\1\0\11\57"+
+ "\1\0\16\57\1\56\4\57\13\0\4\57\2\0\2\57"+
+ "\1\164\2\0\3\57\1\0\1\56\1\57\2\0\5\57"+
+ "\2\0\4\57\1\u025f\1\57\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\5\57\1\u0240\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\5\57\1\u0172\6\0\4\57\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\6\57\6\0\3\57\1\u0240\1\56\1\0"+
+ "\11\57\1\0\16\57\1\56\4\57\13\0\4\57\2\0"+
+ "\2\57\1\164\2\0\3\57\1\0\1\56\1\57\2\0"+
+ "\5\57\2\0\2\57\1\u01fd\3\57\6\0\4\57\1\56"+
+ "\1\0\11\57\1\0\16\57\1\56\4\57\13\0\4\57"+
+ "\2\0\2\57\1\164\2\0\3\57\1\0\1\56\1\57"+
+ "\2\0\5\57\2\0\4\57\1\u0260\1\57\6\0\4\57"+
+ "\1\56\1\0\11\57\1\0\16\57\1\56\4\57\13\0"+
+ "\4\57\2\0\2\57\1\164\2\0\3\57\1\0\1\56"+
+ "\1\57\2\0\5\57\2\0\6\57\6\0\2\57\1\u0250"+
+ "\1\57\1\56\1\0\11\57\1\0\16\57\1\56\4\57"+
+ "\13\0\4\57\2\0\2\57\1\164\2\0\3\57\1\0"+
+ "\1\56\1\57\2\0\5\57\2\0\6\57\6\0\2\57"+
+ "\1\u0243\1\57\1\56\1\0\11\57\1\0\16\57";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[47124];
+ 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 =
+ "\5\0\2\1\1\0\2\1\4\0\2\1\1\11\4\1"+
+ "\1\11\2\1\1\11\2\1\2\11\2\1\4\11\2\1"+
+ "\1\11\1\1\4\11\7\1\1\11\2\1\1\11\1\1"+
+ "\1\11\13\1\1\11\35\1\1\11\5\1\1\11\6\1"+
+ "\2\11\1\0\1\11\1\0\11\1\3\0\3\1\1\0"+
+ "\3\1\1\11\2\1\1\11\12\1\1\11\74\1\1\11"+
+ "\12\0\1\1\2\11\2\1\1\0\2\1\3\0\3\1"+
+ "\1\11\4\1\1\11\15\1\1\0\102\1\11\0\1\11"+
+ "\1\1\3\0\3\1\1\11\13\1\1\11\6\1\1\0"+
+ "\57\1\2\0\1\1\2\0\1\1\1\0\1\1\2\0"+
+ "\21\1\1\0\42\1\5\0\1\1\2\0\17\1\1\0"+
+ "\30\1\3\0\7\1\1\0\23\1\3\0\3\1\1\11"+
+ "\21\1\1\11\1\0\1\11\45\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[608];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to JSPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line with an unclosed XML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line with an unclosed Script tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in the middle of a double-quoted attribute in a Script
+ * tag.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in the middle of a single-quoted attribute in a Script
+ * tag.
+ */
+ public static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in an ActionScript code block (text content inside a
+ * Script tag).
+ */
+ public static final int INTERNAL_IN_AS = -7;
+
+ /**
+ * Token type specific to this class; this signals that the user has
+ * ended a line in an MLC in an ActionScript code block (text content
+ * inside a Script tag).
+ */
+ public static final int INTERNAL_IN_AS_MLC = -8;
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public MxmlTokenMaker() {
+ }
+
+
+ static {
+ completeCloseTags = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns whether markup close tags should be completed. For XML, the
+ * default value is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Static version of {@link #getCompleteCloseTags()}. This hack is
+ * unfortunately needed for applications to be able to query this value
+ * without instantiating this class.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public static boolean getCompleteCloseMarkupTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in XML files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ start = text.offset;
+ break;
+ case Token.MARKUP_DTD:
+ state = DTD;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ start = text.offset;
+ break;
+ case Token.MARKUP_PROCESSING_INSTRUCTION:
+ state = PI;
+ start = text.offset;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ start = text.offset;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_AS:
+ state = AS;
+ start = text.offset;
+ break;
+ case INTERNAL_IN_AS_MLC:
+ state = AS_MLC;
+ start = text.offset;
+ break;
+ case Token.MARKUP_CDATA:
+ state = CDATA;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public MxmlTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public MxmlTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 190) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 58: break;
+ case 52:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 59: break;
+ case 29:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+ }
+ case 60: break;
+ case 50:
+ { addToken(Token.ERROR_CHAR);
+ }
+ case 61: break;
+ case 34:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 62: break;
+ case 24:
+ { addEndToken(INTERNAL_IN_AS); return firstToken;
+ }
+ case 63: break;
+ case 19:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+ }
+ case 64: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 65: break;
+ case 26:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 66: break;
+ case 38:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 67: break;
+ case 53:
+ { addToken(Token.FUNCTION);
+ }
+ case 68: break;
+ case 43:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ case 69: break;
+ case 31:
+ { start = zzMarkedPos-2; yybegin(DTD);
+ }
+ case 70: break;
+ case 27:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 71: break;
+ case 21:
+ { yybegin(INTAG_SCRIPT); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 72: break;
+ case 56:
+ { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA);
+ }
+ case 73: break;
+ case 22:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 74: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 75: break;
+ case 28:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+ }
+ case 76: break;
+ case 46:
+ { addToken(Token.MARKUP_CDATA_DELIMITER);
+ }
+ case 77: break;
+ case 45:
+ { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+ }
+ case 78: break;
+ case 17:
+ { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 79: break;
+ case 37:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 80: break;
+ case 32:
+ { start = zzMarkedPos-2; yybegin(PI);
+ }
+ case 81: break;
+ case 15:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+ }
+ case 82: break;
+ case 42:
+ { yybegin(AS); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 83: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 84: break;
+ case 9:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 85: break;
+ case 36:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 86: break;
+ case 8:
+ { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 87: break;
+ case 20:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+ }
+ case 88: break;
+ case 41:
+ { start = zzMarkedPos-2; yybegin(AS_MLC);
+ }
+ case 89: break;
+ case 16:
+ { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+ }
+ case 90: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 91: break;
+ case 30:
+ { int count = yylength();
+ String tag = yytext(); // Get before addToken calls
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ if (tag.endsWith(":Script") || tag.equals("<Script")) {
+ yybegin(INTAG_SCRIPT);
+ }
+ else {
+ yybegin(INTAG);
+ }
+ }
+ case 92: break;
+ case 48:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 93: break;
+ case 23:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 94: break;
+ case 14:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+ }
+ case 95: break;
+ case 11:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 96: break;
+ case 33:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 97: break;
+ case 6:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 98: break;
+ case 44:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+ }
+ case 99: break;
+ case 40:
+ { start = zzMarkedPos-2; yybegin(AS_EOL_COMMENT);
+ }
+ case 100: break;
+ case 49:
+ { start = zzMarkedPos-4; yybegin(COMMENT);
+ }
+ case 101: break;
+ case 39:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 102: break;
+ case 54:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 103: break;
+ case 25:
+ { addToken(Token.SEPARATOR);
+ }
+ case 104: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 105: break;
+ case 10:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+ }
+ case 106: break;
+ case 18:
+ { yybegin(AS); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 107: break;
+ case 12:
+ { addToken(Token.OPERATOR);
+ }
+ case 108: break;
+ case 35:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 109: break;
+ case 55:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 110: break;
+ case 51:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 111: break;
+ case 57:
+ { int origStart = zzStartRead;
+ String text = yytext();
+ int tagNameEnd = text.length() - 2; // "-1" is '>'
+ while (Character.isWhitespace(text.charAt(tagNameEnd))) {
+ tagNameEnd--;
+ }
+ int tagNameLen = tagNameEnd - 1;
+ yybegin(YYINITIAL);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(origStart+2,origStart+2+tagNameLen-1, Token.MARKUP_TAG_NAME);
+ if (tagNameEnd<text.length()-2) {
+ addToken(origStart+tagNameEnd+1, zzMarkedPos-2, Token.WHITESPACE);
+ }
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 112: break;
+ case 47:
+ { addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 113: break;
+ case 1:
+ {
+ }
+ case 114: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case AS_EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_AS); return firstToken;
+ }
+ case 609: break;
+ case AS_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_AS_MLC); return firstToken;
+ }
+ case 610: break;
+ case INTAG_SCRIPT: {
+ addToken(start,zzStartRead-1, INTERNAL_INTAG_SCRIPT); return firstToken;
+ }
+ case 611: break;
+ case INATTR_DOUBLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 612: break;
+ case CDATA: {
+ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+ }
+ case 613: break;
+ case INATTR_SINGLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 614: break;
+ case DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 615: break;
+ case INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+ }
+ case 616: break;
+ case INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+ }
+ case 617: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 618: break;
+ case AS: {
+ addEndToken(INTERNAL_IN_AS); return firstToken;
+ }
+ case 619: break;
+ case INTAG: {
+ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+ }
+ case 620: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 621: break;
+ case PI: {
+ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 622: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex
new file mode 100644
index 0000000..e7af3dd
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex
@@ -0,0 +1,745 @@
+/*
+ * 07/14/2014
+ *
+ * NSISTokenMaker.java - Scanner for NSIS installer scripts.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for NSIS installer scripts.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated NSISTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ *
+ */
+%%
+
+%public
+%class NSISTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public NSISTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ break;
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = ([A-Za-z])
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = ([1-9])
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|[$/])
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+MLCBegin = ("/*")
+MLCEnd = ("*/")
+LineCommentBegin = ([;#])
+
+IntegerLiteral = (({NonzeroDigit}{Digit}*)|"0")
+HexLiteral = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+Operator = ({NonAssignmentOperator}|{AssignmentOperator})
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+VariableStart = ("$")
+Variable = ({VariableStart}({Identifier}|"{"{Identifier}"}"))
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state STRING
+%state CHAR_LITERAL
+%state BACKTICKS
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "function" |
+ "functionend" |
+ "section" |
+ "sectionend" |
+ "subsection" |
+ "subsectionend" { addToken(Token.RESERVED_WORD); }
+
+ /* Instructions */
+ "addbrandingimage" |
+ "addsize" |
+ "allowrootdirinstall" |
+ "allowskipfiles" |
+ "autoclosewindow" |
+ "bggradient" |
+ "brandingtext" |
+ "bringtofront" |
+ "callinstdll" |
+ "caption" |
+ "changeui" |
+ "checkbitmap" |
+ "completedtext" |
+ "componenttext" |
+ "copyfiles" |
+ "crccheck" |
+ "createdirectory" |
+ "createfont" |
+ "createshortcut" |
+ "delete" |
+ "deleteinisec" |
+ "deleteinistr" |
+ "deleteregkey" |
+ "deleteregvalue" |
+ "detailprint" |
+ "detailsbuttontext" |
+ "dirshow" |
+ "dirtext" |
+ "enumregkey" |
+ "enumregvalue" |
+ "exch" |
+ "exec" |
+ "execshell" |
+ "execwait" |
+ "expandenvstrings" |
+ "file" |
+ "fileclose" |
+ "fileerrortext" |
+ "fileopen" |
+ "fileread" |
+ "filereadbyte" |
+ "fileseek" |
+ "filewrite" |
+ "filewritebyte" |
+ "findclose" |
+ "findfirst" |
+ "findnext" |
+ "findwindow" |
+ "flushini" |
+ "getcurinsttype" |
+ "getcurrentaddress" |
+ "getdlgitem" |
+ "getdllversion" |
+ "getdllversionlocal" |
+ "getfiletime" |
+ "getfiletimelocal" |
+ "getfullpathname" |
+ "getfunctionaddress" |
+ "getlabeladdress" |
+ "gettempfilename" |
+ "getwindowtext" |
+ "hidewindow" |
+ "icon" |
+ "initpluginsdir" |
+ "installbuttontext" |
+ "installcolors" |
+ "installdir" |
+ "installdirregkey" |
+ "instprogressflags" |
+ "insttype" |
+ "insttypegettext" |
+ "insttypesettext" |
+ "intfmt" |
+ "intop" |
+ "langstring" |
+ "langstringup" |
+ "licensebkcolor" |
+ "licensedata" |
+ "licenseforceselection" |
+ "licensetext" |
+ "loadlanguagefile" |
+ "loadlanguagefile" |
+ "logset" |
+ "logtext" |
+ "miscbuttontext" |
+ "name" |
+ "nop" |
+ "outfile" |
+ "page" |
+ "plugindir" |
+ "pop" |
+ "push" |
+ "readenvstr" |
+ "readinistr" |
+ "readregdword" |
+ "readregstr" |
+ "regdll" |
+ "rename" |
+ "requestexecutionlevel" |
+ "reservefile" |
+ "rmdir" |
+ "searchpath" |
+ "sectiongetflags" |
+ "sectiongetinsttypes" |
+ "sectiongetsize" |
+ "sectiongettext" |
+ "sectionin" |
+ "sectionsetflags" |
+ "sectionsetinsttypes" |
+ "sectionsetsize" |
+ "sectionsettext" |
+ "sendmessage" |
+ "setautoclose" |
+ "setbkcolor" |
+ "setbrandingimage" |
+ "setcompress" |
+ "setcompressor" |
+ "setcurinsttype" |
+ "setdatablockoptimize" |
+ "setdatesave" |
+ "setdetailsprint" |
+ "setdetailsview" |
+ "setfileattributes" |
+ "setfont" |
+ "setoutpath" |
+ "setoverwrite" |
+ "setpluginunload" |
+ "setrebootflag" |
+ "setshellvarcontext" |
+ "setstaticbkcolor" |
+ "setwindowlong" |
+ "showinstdetails" |
+ "showuninstdetails" |
+ "showwindow" |
+ "silentinstall" |
+ "silentuninstall" |
+ "sleep" |
+ "spacetexts" |
+ "strcpy" |
+ "strlen" |
+ "subcaption" |
+ "uninstallbuttontext" |
+ "uninstallcaption" |
+ "uninstallicon" |
+ "uninstallsubcaption" |
+ "uninstalltext" |
+ "uninstpage" |
+ "unregdll" |
+ "var" |
+ "viaddversionkey" |
+ "videscription" |
+ "vicompanyname" |
+ "vicomments" |
+ "vilegalcopyrights" |
+ "vilegaltrademarks" |
+ "viproductname" |
+ "viproductversion" |
+ "windowicon" |
+ "writeinistr" |
+ "writeregbin" |
+ "writeregdword" |
+ "writeregexpandstr" |
+ "writeregstr" |
+ "writeuninstaller" |
+ "xpstyle" |
+
+ /* Flow control instructions */
+ "abort" |
+ "call" |
+ "clearerrors" |
+ "goto" |
+ "ifabort" |
+ "iferrors" |
+ "iffileexists" |
+ "ifrebootflag" |
+ "intcmp" |
+ "intcmpu" |
+ "iswindow" |
+ "messagebox" |
+ "reboot" |
+ "return" |
+ "quit" |
+ "seterrors" |
+ "strcmp" |
+ "strcmps" { addToken(Token.FUNCTION); }
+
+ /* Compiler utility commands */
+ "!addincludedir" |
+ "!addplugindir" |
+ "!define" |
+ "!include" |
+ "!cd" |
+ "!echo" |
+ "!error" |
+ "!insertmacro" |
+ "!packhdr" |
+ "!system" |
+ "!warning" |
+ "!undef" |
+ "!verbose" |
+
+ /* Conditional compilation */
+ "!ifdef" |
+ "!ifndef" |
+ "!if" |
+ "!else" |
+ "!endif" |
+ "!macro" |
+ "!macroend" { addToken(Token.RESERVED_WORD); }
+
+ /* Global variables */
+ "$0" |
+ "$1" |
+ "$2" |
+ "$3" |
+ "$4" |
+ "$5" |
+ "$6" |
+ "$7" |
+ "$8" |
+ "$9" |
+ "$INSTDIR" |
+ "$OUTDIR" |
+ "$CMDLINE" |
+ "$LANGUAGE" |
+
+ /* Local variables */
+ ("$R0"{Digit}) |
+
+ /* Constants */
+ "ARCHIVE" |
+ "CENTER" |
+ "CONTROL" |
+ "CUR" |
+ "EXT" |
+ ("F"{NonzeroDigit}) |
+ ("F1"{Digit}) |
+ ("F2"[0-4]) |
+ "FILE_ATTRIBUTE_ARCHIVE" |
+ "MB_ABORTRETRYIGNORE" |
+ "RIGHT" |
+ "RO" |
+ "SET" |
+ "SHIFT" |
+ "SW_SHOWMAXIMIZED" |
+ "SW_SHOWMINIMIZED" |
+ "SW_SHOWNORMAL" |
+ "a" |
+ "admin" |
+ "all" |
+ "alwaysoff" |
+ "auto" |
+ "both" |
+ "bottom" |
+ "bzip2" |
+ "checkbox" |
+ "colored" |
+ "components" |
+ "current" |
+ "custom" |
+ "directory" |
+ "force" |
+ "hide" |
+ "highest" |
+ "ifnewer" |
+ "instfiles" |
+ "license" |
+ "listonly" |
+ "manual" |
+ "nevershow" |
+ "none" |
+ "off" |
+ "on" |
+ "r" |
+ "radiobuttons" |
+ "show" |
+ "silent" |
+ "silentlog" |
+ "smooth" |
+ "textonly" |
+ "top" |
+ "try" |
+ "uninstConfirm" |
+ "user" |
+ "w" |
+ "zlib" |
+ "$$" |
+ "$DESKTOP" |
+ "$EXEDIR" |
+ "$HWNDPARENT" |
+ "$PLUGINSDIR" |
+ "$PROGRAMFILES" |
+ "$QUICKLAUNCH" |
+ "$SMPROGRAMS" |
+ "$SMSTARTUP" |
+ "$STARTMENU" |
+ "$SYSDIR" |
+ "$TEMP" |
+ "$WINDIR" |
+ "$\n" |
+ "$\r" |
+ "${NSISDIR}" |
+ "ALT" |
+ "END" |
+ "FILE_ATTRIBUTE_HIDDEN" |
+ "FILE_ATTRIBUTE_NORMAL" |
+ "FILE_ATTRIBUTE_OFFLINE" |
+ "FILE_ATTRIBUTE_READONLY" |
+ "FILE_ATTRIBUTE_SYSTEM" |
+ "FILE_ATTRIBUTE_TEMPORARY" |
+ "HIDDEN" |
+ "HKCC" |
+ "HKCR" |
+ "HKCU" |
+ "HKDD" |
+ "HKLM" |
+ "HKPD" |
+ "HKU" |
+ "SHCTX" |
+ "IDABORT" |
+ "IDCANCEL" |
+ "IDIGNORE" |
+ "IDNO" |
+ "IDOK" |
+ "IDRETRY" |
+ "IDYES" |
+ "LEFT" |
+ "MB_DEFBUTTON1" |
+ "MB_DEFBUTTON2" |
+ "MB_DEFBUTTON3" |
+ "MB_DEFBUTTON4" |
+ "MB_ICONEXCLAMATION" |
+ "MB_ICONINFORMATION" |
+ "MB_ICONQUESTION" |
+ "MB_ICONSTOP" |
+ "MB_OK" |
+ "MB_OKCANCEL" |
+ "MB_RETRYCANCEL" |
+ "MB_RIGHT" |
+ "MB_SETFOREGROUND" |
+ "MB_TOPMOST" |
+ "MB_YESNO" |
+ "MB_YESNOCANCEL" |
+ "NORMAL" |
+ "OFFLINE" |
+ "READONLY" |
+ "SYSTEM" |
+ "TEMPORARY" { addToken(Token.VARIABLE); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {Variable} { addToken(Token.VARIABLE); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ \" { start = zzMarkedPos-1; yybegin(STRING); }
+ \' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+ \` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as identifiers. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<STRING> {
+ [^\n\\\$\"]+ {}
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ return firstToken;
+ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+ [^\n\\\$\']+ {}
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ return firstToken;
+ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+ [^\n\\\$\`]+ {}
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+ return firstToken;
+ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<MLC> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java
new file mode 100644
index 0000000..4efeb39
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/NSISTokenMaker.java
@@ -0,0 +1,2979 @@
+/* The following code was generated by JFlex 1.4.1 on 10/7/12 12:43 AM */
+
+/*
+ * 07/14/2014
+ *
+ * NSISTokenMaker.java - Scanner for NSIS installer scripts.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for NSIS installer scripts.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated NSISTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ *
+ */
+
+public class NSISTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 5;
+ public static final int STRING = 1;
+ public static final int CHAR_LITERAL = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 4;
+ public static final int BACKTICKS = 3;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\16\1\15\1\0\1\16\1\75\22\0\1\16\1\42\1\10"+
+ "\1\11\1\13\1\41\1\44\1\51\2\31\1\17\1\33\1\52\1\34"+
+ "\1\32\1\14\1\4\1\72\1\73\1\74\1\74\1\6\1\6\1\6"+
+ "\1\3\1\3\1\45\1\20\1\35\1\36\1\40\1\43\1\50\1\26"+
+ "\1\5\1\60\1\62\1\24\1\25\1\63\1\53\1\55\1\1\1\66"+
+ "\1\27\1\64\1\57\1\61\1\54\1\71\1\23\1\30\1\22\1\7"+
+ "\1\70\1\56\1\21\1\67\1\65\1\31\1\12\1\31\1\37\1\2"+
+ "\1\76\1\26\1\5\1\60\1\62\1\24\1\77\1\63\1\100\1\55"+
+ "\1\1\1\66\1\27\1\64\1\57\1\61\1\54\1\71\1\23\1\30"+
+ "\1\22\1\7\1\70\1\101\1\21\1\67\1\65\1\46\1\37\1\47"+
+ "\1\43\uff81\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 =
+ "\6\0\2\1\2\2\2\1\1\3\1\4\2\1\1\5"+
+ "\1\6\1\7\2\1\1\10\2\1\1\10\2\1\1\11"+
+ "\7\7\1\12\3\1\1\10\11\1\1\13\1\14\1\15"+
+ "\1\16\1\14\1\17\1\14\1\20\1\21\1\22\1\14"+
+ "\1\23\1\14\1\24\1\25\1\14\1\26\10\14\1\27"+
+ "\6\14\1\0\1\30\1\31\1\30\6\1\2\10\5\1"+
+ "\1\0\10\1\1\32\17\1\2\10\23\1\1\0\1\7"+
+ "\13\0\45\1\1\33\1\34\1\0\1\35\1\0\1\36"+
+ "\4\14\4\0\4\14\5\0\1\31\17\1\1\0\11\1"+
+ "\1\0\33\1\1\10\12\1\1\10\13\1\10\0\1\37"+
+ "\2\0\1\37\3\0\7\1\1\40\26\1\1\10\16\1"+
+ "\1\10\20\1\4\0\4\14\4\0\4\14\5\0\14\1"+
+ "\1\0\6\1\1\41\1\1\1\42\11\1\1\40\4\1"+
+ "\1\40\1\1\1\10\34\1\1\10\5\1\16\0\1\10"+
+ "\30\1\1\40\43\1\2\0\1\34\2\0\1\35\3\14"+
+ "\1\43\2\0\3\14\1\44\3\0\11\1\1\0\101\1"+
+ "\14\0\61\1\1\10\11\1\4\0\1\14\2\0\1\14"+
+ "\3\0\10\1\1\0\41\1\1\40\22\1\1\10\1\1"+
+ "\7\0\1\37\3\1\1\40\25\1\1\40\32\1\4\0"+
+ "\12\1\1\0\30\1\1\10\20\1\1\37\6\1\5\0"+
+ "\55\1\4\0\7\1\1\0\11\1\1\37\1\1\1\40"+
+ "\42\1\3\0\2\1\1\40\45\1\2\0\44\1\3\0"+
+ "\60\1\1\40\13\1\1\37\4\1\3\0\2\1\1\40"+
+ "\45\1\1\40\6\1\1\0\10\1\1\40\147\1";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[1322];
+ 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\102\0\204\0\306\0\u0108\0\u014a\0\u018c\0\u01ce"+
+ "\0\u0210\0\u0252\0\u0294\0\u02d6\0\u018c\0\u018c\0\u0318\0\u035a"+
+ "\0\u018c\0\u039c\0\u03de\0\u0420\0\u0462\0\u04a4\0\u04e6\0\u0528"+
+ "\0\u056a\0\u05ac\0\u05ee\0\u018c\0\u0630\0\u0672\0\u06b4\0\u06f6"+
+ "\0\u0738\0\u018c\0\u077a\0\u018c\0\u07bc\0\u07fe\0\u0840\0\u0882"+
+ "\0\u08c4\0\u0906\0\u0948\0\u098a\0\u09cc\0\u0a0e\0\u0a50\0\u0a92"+
+ "\0\u0ad4\0\u018c\0\u0b16\0\u018c\0\u0b58\0\u0b9a\0\u018c\0\u0bdc"+
+ "\0\u0b58\0\u018c\0\u018c\0\u0c1e\0\u0b58\0\u0c60\0\u018c\0\u018c"+
+ "\0\u0ca2\0\u018c\0\u0ce4\0\u0d26\0\u0d68\0\u0daa\0\u0dec\0\u0e2e"+
+ "\0\u0e70\0\u0eb2\0\u018c\0\u0ef4\0\u0f36\0\u0f78\0\u0fba\0\u0ffc"+
+ "\0\u103e\0\u1080\0\u10c2\0\u1104\0\u1146\0\u1188\0\u11ca\0\u120c"+
+ "\0\u124e\0\u1290\0\u12d2\0\u01ce\0\u018c\0\u1314\0\u1356\0\u1398"+
+ "\0\u13da\0\u141c\0\u145e\0\u14a0\0\u14e2\0\u1524\0\u1566\0\u15a8"+
+ "\0\u15ea\0\u162c\0\u166e\0\u16b0\0\u16f2\0\u1734\0\u1776\0\u17b8"+
+ "\0\u17fa\0\u183c\0\u187e\0\u18c0\0\u1902\0\u1944\0\u1986\0\u19c8"+
+ "\0\u1a0a\0\u1a4c\0\u1a8e\0\u1ad0\0\u1b12\0\u1b54\0\u1b96\0\u1bd8"+
+ "\0\u1c1a\0\u1c5c\0\u1c9e\0\u1ce0\0\u1d22\0\u1d64\0\u1da6\0\u1de8"+
+ "\0\u1e2a\0\u1e6c\0\u1eae\0\u1ef0\0\u1f32\0\u1f74\0\u1fb6\0\u1ff8"+
+ "\0\u03de\0\u203a\0\u207c\0\u20be\0\u2100\0\u2142\0\u2184\0\u21c6"+
+ "\0\u2208\0\u224a\0\u228c\0\u22ce\0\u2310\0\u2352\0\u2394\0\u23d6"+
+ "\0\u2418\0\u245a\0\u249c\0\u24de\0\u2520\0\u2562\0\u25a4\0\u25e6"+
+ "\0\u2628\0\u266a\0\u26ac\0\u26ee\0\u2730\0\u2772\0\u27b4\0\u27f6"+
+ "\0\u2838\0\u287a\0\u28bc\0\u28fe\0\u2940\0\u2982\0\u29c4\0\u2a06"+
+ "\0\u2a48\0\u2a8a\0\u2acc\0\u2b0e\0\u2b50\0\u2b92\0\u2bd4\0\u2c16"+
+ "\0\u2c58\0\u2c9a\0\u018c\0\u2cdc\0\u2d1e\0\u2d60\0\u2da2\0\u018c"+
+ "\0\u2de4\0\u2e26\0\u2e68\0\u2eaa\0\u2eec\0\u2f2e\0\u2f70\0\u2fb2"+
+ "\0\u2ff4\0\u3036\0\u3078\0\u30ba\0\u30fc\0\u313e\0\u3180\0\u31c2"+
+ "\0\u3204\0\u1146\0\u3246\0\u3288\0\u32ca\0\u330c\0\u334e\0\u3390"+
+ "\0\u33d2\0\u3414\0\u3456\0\u1ad0\0\u3498\0\u34da\0\u351c\0\u355e"+
+ "\0\u35a0\0\u35e2\0\u3624\0\u3666\0\u36a8\0\u36ea\0\u372c\0\u376e"+
+ "\0\u37b0\0\u37f2\0\u3834\0\u3876\0\u38b8\0\u38fa\0\u393c\0\u397e"+
+ "\0\u39c0\0\u3a02\0\u3a44\0\u3a86\0\u3ac8\0\u3b0a\0\u3b4c\0\u3b8e"+
+ "\0\u3bd0\0\u3c12\0\u3c54\0\u3c96\0\u3cd8\0\u3d1a\0\u3d5c\0\u3d9e"+
+ "\0\u3de0\0\u3e22\0\u3e64\0\u3ea6\0\u3ee8\0\u3f2a\0\u3f6c\0\u3fae"+
+ "\0\u3ff0\0\u4032\0\u4074\0\u40b6\0\u40f8\0\u413a\0\u417c\0\u41be"+
+ "\0\u4200\0\u4242\0\u4284\0\u42c6\0\u4308\0\u434a\0\u438c\0\u43ce"+
+ "\0\u4410\0\u4452\0\u4494\0\u44d6\0\u4518\0\u455a\0\u459c\0\u45de"+
+ "\0\u4620\0\u4662\0\u46a4\0\u46e6\0\u4728\0\u476a\0\u47ac\0\u47ee"+
+ "\0\u4830\0\u018c\0\u4872\0\u48b4\0\u48f6\0\u4938\0\u497a\0\u49bc"+
+ "\0\u49fe\0\u4a40\0\u4a82\0\u4ac4\0\u01ce\0\u4b06\0\u4b48\0\u4b8a"+
+ "\0\u4bcc\0\u4c0e\0\u4c50\0\u4c92\0\u4cd4\0\u4d16\0\u4d58\0\u4d9a"+
+ "\0\u4ddc\0\u4e1e\0\u4e60\0\u4ea2\0\u4ee4\0\u4f26\0\u4f68\0\u4faa"+
+ "\0\u4fec\0\u502e\0\u5070\0\u50b2\0\u50f4\0\u5136\0\u5178\0\u51ba"+
+ "\0\u51fc\0\u523e\0\u5280\0\u52c2\0\u5304\0\u5346\0\u5388\0\u53ca"+
+ "\0\u540c\0\u544e\0\u5490\0\u54d2\0\u5514\0\u5556\0\u5598\0\u55da"+
+ "\0\u561c\0\u565e\0\u56a0\0\u56e2\0\u5724\0\u5766\0\u57a8\0\u57ea"+
+ "\0\u582c\0\u586e\0\u58b0\0\u58f2\0\u5934\0\u5976\0\u59b8\0\u59fa"+
+ "\0\u5a3c\0\u5a7e\0\u5ac0\0\u5b02\0\u5b44\0\u5b86\0\u5bc8\0\u5c0a"+
+ "\0\u5c4c\0\u5c8e\0\u5cd0\0\u5d12\0\u5d54\0\u5d96\0\u5dd8\0\u5e1a"+
+ "\0\u5e5c\0\u5e9e\0\u5ee0\0\u5f22\0\u5f64\0\u5fa6\0\u5fe8\0\u602a"+
+ "\0\u606c\0\u60ae\0\u60f0\0\u6132\0\u6174\0\u61b6\0\u61f8\0\u623a"+
+ "\0\u5490\0\u627c\0\u62be\0\u018c\0\u6300\0\u01ce\0\u6342\0\u6384"+
+ "\0\u63c6\0\u6408\0\u644a\0\u648c\0\u64ce\0\u6510\0\u6552\0\u6594"+
+ "\0\u65d6\0\u6618\0\u665a\0\u669c\0\u66de\0\u6720\0\u6762\0\u67a4"+
+ "\0\u67e6\0\u6828\0\u686a\0\u68ac\0\u68ee\0\u6930\0\u6972\0\u69b4"+
+ "\0\u69f6\0\u6a38\0\u6a7a\0\u6abc\0\u6afe\0\u6b40\0\u6b82\0\u6bc4"+
+ "\0\u6c06\0\u6c48\0\u6c8a\0\u6ccc\0\u6d0e\0\u6d50\0\u6d92\0\u6dd4"+
+ "\0\u6e16\0\u6e58\0\u6e9a\0\u6edc\0\u6f1e\0\u6f60\0\u6fa2\0\u6fe4"+
+ "\0\u7026\0\u7068\0\u70aa\0\u70ec\0\u712e\0\u7170\0\u71b2\0\u71f4"+
+ "\0\u7236\0\u7278\0\u72ba\0\u72fc\0\u733e\0\u7380\0\u73c2\0\u2520"+
+ "\0\u7404\0\u7446\0\u7488\0\u74ca\0\u750c\0\u754e\0\u7590\0\u75d2"+
+ "\0\u7614\0\u7656\0\u7698\0\u76da\0\u771c\0\u775e\0\u77a0\0\u77e2"+
+ "\0\u7824\0\u7866\0\u78a8\0\u78ea\0\u792c\0\u796e\0\u79b0\0\u79f2"+
+ "\0\u7a34\0\u7a76\0\u7ab8\0\u7afa\0\u7b3c\0\u7b7e\0\u7bc0\0\u7c02"+
+ "\0\u7c44\0\u7c86\0\u7cc8\0\u7d0a\0\u7d4c\0\u7d8e\0\u7dd0\0\u7e12"+
+ "\0\u7e54\0\u7e96\0\u7ed8\0\u7f1a\0\u7f5c\0\u7f9e\0\u7fe0\0\u8022"+
+ "\0\u8064\0\u80a6\0\u80e8\0\u812a\0\u816c\0\u81ae\0\u81f0\0\u8232"+
+ "\0\u8274\0\u82b6\0\u82f8\0\u833a\0\u837c\0\u83be\0\u018c\0\u8400"+
+ "\0\u8442\0\u018c\0\u8484\0\u84c6\0\u8508\0\u854a\0\u858c\0\u85ce"+
+ "\0\u8610\0\u8652\0\u8694\0\u86d6\0\u8718\0\u875a\0\u879c\0\u87de"+
+ "\0\u8820\0\u8862\0\u88a4\0\u88e6\0\u8928\0\u896a\0\u89ac\0\u89ee"+
+ "\0\u8a30\0\u8a72\0\u8ab4\0\u8af6\0\u8b38\0\u8b7a\0\u8bbc\0\u8bfe"+
+ "\0\u8c40\0\u8c82\0\u8cc4\0\u8d06\0\u8d48\0\u8d8a\0\u8dcc\0\u8e0e"+
+ "\0\u8e50\0\u8e92\0\u8ed4\0\u8f16\0\u8f58\0\u8f9a\0\u8fdc\0\u901e"+
+ "\0\u9060\0\u90a2\0\u90e4\0\u9126\0\u9168\0\u91aa\0\u91ec\0\u922e"+
+ "\0\u9270\0\u92b2\0\u92f4\0\u9336\0\u9378\0\u93ba\0\u93fc\0\u943e"+
+ "\0\u9480\0\u94c2\0\u9504\0\u9546\0\u9588\0\u95ca\0\u960c\0\u964e"+
+ "\0\u9690\0\u96d2\0\u9714\0\u9756\0\u9798\0\u97da\0\u981c\0\u985e"+
+ "\0\u98a0\0\u98e2\0\u9924\0\u9966\0\u99a8\0\u99ea\0\u9a2c\0\u9a6e"+
+ "\0\u9ab0\0\u9af2\0\u9b34\0\u9b76\0\u9bb8\0\u9bfa\0\u9c3c\0\u9c7e"+
+ "\0\u9cc0\0\u9d02\0\u9d44\0\u9d86\0\u9dc8\0\u9e0a\0\u9e4c\0\u9e8e"+
+ "\0\u9ed0\0\u9f12\0\u9f54\0\u9f96\0\u9fd8\0\ua01a\0\ua05c\0\ua09e"+
+ "\0\ua0e0\0\ua122\0\ua164\0\ua1a6\0\ua1e8\0\ua22a\0\ua26c\0\ua2ae"+
+ "\0\ua2f0\0\ua332\0\ua374\0\ua3b6\0\ua3f8\0\ua43a\0\ua47c\0\ua4be"+
+ "\0\ua500\0\ua542\0\ua584\0\ua5c6\0\ua608\0\ua64a\0\ua68c\0\ua6ce"+
+ "\0\ua710\0\ua752\0\ua794\0\ua7d6\0\ua818\0\ua85a\0\ua89c\0\ua8de"+
+ "\0\ua920\0\ua962\0\ua9a4\0\ua9e6\0\uaa28\0\uaa6a\0\uaaac\0\uaaee"+
+ "\0\uab30\0\uab72\0\uabb4\0\uabf6\0\uac38\0\uac7a\0\uacbc\0\uacfe"+
+ "\0\uad40\0\uad82\0\uadc4\0\uae06\0\uae48\0\uae8a\0\u854a\0\uaecc"+
+ "\0\uaf0e\0\u86d6\0\uaf50\0\uaf92\0\uafd4\0\ub016\0\ub058\0\ub09a"+
+ "\0\ub0dc\0\ub11e\0\ub160\0\ub1a2\0\ub1e4\0\ub226\0\ub268\0\ub2aa"+
+ "\0\ub2ec\0\ub32e\0\ub370\0\ub3b2\0\ub3f4\0\ub436\0\ub478\0\ub4ba"+
+ "\0\ub4fc\0\ub53e\0\ub580\0\ub5c2\0\ub604\0\ub646\0\ub688\0\ub6ca"+
+ "\0\ub70c\0\ub74e\0\ub790\0\ub7d2\0\ub814\0\ub856\0\ub898\0\ub8da"+
+ "\0\ub91c\0\ub95e\0\ub9a0\0\ub9e2\0\uba24\0\uba66\0\ubaa8\0\ubaea"+
+ "\0\ubb2c\0\ubb6e\0\ubbb0\0\ubbf2\0\ubc34\0\ubc76\0\ubcb8\0\ubcfa"+
+ "\0\ubd3c\0\ubd7e\0\ubdc0\0\ube02\0\ube44\0\ube86\0\ubec8\0\ubf0a"+
+ "\0\ubf4c\0\ubf8e\0\ubfd0\0\uc012\0\uc054\0\uc096\0\uc0d8\0\uc11a"+
+ "\0\uc15c\0\uc19e\0\uc1e0\0\uc222\0\uc264\0\uc2a6\0\uc2e8\0\uc32a"+
+ "\0\uc36c\0\uc3ae\0\uc3f0\0\uc432\0\uc474\0\uc4b6\0\uc4f8\0\uc53a"+
+ "\0\uc57c\0\uc5be\0\uc600\0\uc642\0\uc684\0\uc6c6\0\uc708\0\uc74a"+
+ "\0\uc78c\0\uc7ce\0\uc810\0\uc852\0\uc894\0\uc8d6\0\uc918\0\uc95a"+
+ "\0\uc99c\0\uc9de\0\uca20\0\uca62\0\ucaa4\0\ucae6\0\ucb28\0\ucb6a"+
+ "\0\ucbac\0\ucbee\0\ucc30\0\ucc72\0\uccb4\0\uccf6\0\ucd38\0\ucd7a"+
+ "\0\ucdbc\0\ucdfe\0\uce40\0\uce82\0\ucec4\0\ucf06\0\ucf48\0\ucf8a"+
+ "\0\ucfcc\0\ud00e\0\ud050\0\ud092\0\ud0d4\0\ud116\0\ud158\0\ud19a"+
+ "\0\ud1dc\0\ud21e\0\ud260\0\ud2a2\0\ud2e4\0\ud326\0\u50b2\0\ud368"+
+ "\0\ud3aa\0\ud3ec\0\ud42e\0\ud470\0\ud4b2\0\ud4f4\0\ud536\0\ud578"+
+ "\0\ud5ba\0\ud5fc\0\ud63e\0\ud680\0\ud6c2\0\ud704\0\ud746\0\ud788"+
+ "\0\ud7ca\0\ud80c\0\ud84e\0\ud890\0\ud8d2\0\ud914\0\ud956\0\ud998"+
+ "\0\ud9da\0\uda1c\0\uda5e\0\udaa0\0\udae2\0\udb24\0\udb66\0\udba8"+
+ "\0\udbea\0\udc2c\0\udc6e\0\udcb0\0\udcf2\0\udd34\0\udd76\0\uddb8"+
+ "\0\uddfa\0\ude3c\0\ude7e\0\udec0\0\udf02\0\udf44\0\udf86\0\udfc8"+
+ "\0\ue00a\0\ue04c\0\ue08e\0\ue0d0\0\ubaa8\0\ue112\0\ue154\0\ue196"+
+ "\0\ue1d8\0\ue21a\0\ue25c\0\ue29e\0\ue2e0\0\ue322\0\ue364\0\ue3a6"+
+ "\0\ue3e8\0\ue42a\0\ue46c\0\ue4ae\0\ue4f0\0\ue532\0\ue574\0\ue5b6"+
+ "\0\ue5f8\0\ue63a\0\ue67c\0\ue6be\0\ue700\0\ue742\0\ue784\0\ue7c6"+
+ "\0\ue808\0\ue84a\0\ue88c\0\ue8ce\0\ue910\0\ue952\0\ue994\0\ue9d6"+
+ "\0\uea18\0\uea5a\0\uea9c\0\ueade\0\ueb20\0\ueb62\0\ueba4\0\uebe6"+
+ "\0\uec28\0\uec6a\0\uecac\0\uecee\0\ued30\0\ued72\0\uedb4\0\uedf6"+
+ "\0\uee38\0\uee7a\0\ueebc\0\ueefe\0\uef40\0\uef82\0\uefc4\0\uf006"+
+ "\0\uf048\0\uf08a\0\uf0cc\0\uf10e\0\uf150\0\uf192\0\uf1d4\0\uf216"+
+ "\0\uf258\0\uf29a\0\uf2dc\0\uf31e\0\uf360\0\uf3a2\0\uf3e4\0\uf426"+
+ "\0\uf468\0\uf4aa\0\uf4ec\0\uf52e\0\uf570\0\uf5b2\0\uf5f4\0\uf636"+
+ "\0\uf678\0\uf6ba\0\uf6fc\0\uf73e\0\uf780\0\uf7c2\0\uf804\0\uf846"+
+ "\0\uf888\0\uf8ca\0\uf90c\0\uf94e\0\uf990\0\uf9d2\0\ufa14\0\ufa56"+
+ "\0\ufa98\0\ufada\0\ufb1c\0\ufb5e\0\ufba0\0\ufbe2\0\ufc24\0\ufc66"+
+ "\0\ufca8\0\ufcea\0\ufd2c\0\ufd6e\0\ufdb0\0\ufdf2\0\ufe34\0\ufe76"+
+ "\0\ufeb8\0\ufefa\0\uff3c\0\uff7e\0\uffc0\1\2\1\104\1\206"+
+ "\1\310\1\u010a\1\u014c\1\u018e\1\u01d0\1\u0212\1\u0254\0\uaaee"+
+ "\1\u0296\1\u02d8\1\u031a\1\u035c\1\u039e\1\u03e0\1\u0422\1\u0464"+
+ "\1\u04a6\1\u04e8\1\u052a\1\u056c\1\u05ae\1\u05f0\1\u0632\1\u0674"+
+ "\1\u06b6\1\u06f8\1\u073a\1\u077c\1\u07be\1\u0800\1\u0842\1\u0884"+
+ "\1\u08c6\1\u0908\1\u094a\1\u098c\1\u09ce\1\u0a10\1\u0a52\1\u0a94"+
+ "\1\u0ad6\1\u0b18\1\u0b5a\1\u0b9c\1\u0bde\1\u0c20\1\u0c62\1\u0ca4"+
+ "\1\u0ce6\1\u0d28\1\u0d6a\1\u0dac\1\u0dee\1\u0e30\1\u0e72\1\u0eb4"+
+ "\1\u0ef6\1\u0f38\1\u0f7a\1\u0fbc\1\u0ffe\1\u1040\1\u1082\1\u10c4"+
+ "\1\u1106\1\u1148\1\u118a\1\u11cc\1\u120e\1\u1250\1\u1292\1\u12d4"+
+ "\1\u1316\1\u1358\1\u139a\1\u13dc\1\u141e\1\u1460\1\u14a2\1\u14e4"+
+ "\1\u1526\1\u1568\1\u15aa\1\u15ec\1\u162e\1\u1670\1\u16b2\1\u16f4"+
+ "\1\u1736\1\u1778\1\u17ba\1\u17fc\1\u183e\1\u1880\1\u18c2\1\u1904"+
+ "\1\u1946\1\u1988\1\u19ca\1\u1a0c\1\u1a4e\1\u1a90\1\u1ad2\1\u1b14"+
+ "\1\u1b56\1\u1b98\1\u1bda\1\u1c1c\1\u1c5e\1\u1ca0\1\u1ce2\1\u1d24"+
+ "\1\u1d66\1\u1da8\1\u1dea\1\u1e2c\1\u1e6e\1\u1eb0\1\u1ef2\1\u1f34"+
+ "\1\u1f76\1\u1fb8\0\u01ce\1\u1ffa\1\u203c\1\u207e\1\u20c0\1\u2102"+
+ "\1\u2144\1\u2186\1\u21c8\1\u220a\1\u224c\1\u228e\1\u22d0\1\u2312"+
+ "\1\u2354\1\u2396\1\u23d8\1\u241a\1\u245c\1\u249e\1\u24e0\1\u2522"+
+ "\1\u2564\1\u25a6\1\u25e8\1\u262a\1\u266c\1\u26ae\1\u26f0\1\u2732"+
+ "\1\u2774\1\u27b6\1\u27f8\1\u283a\1\u287c\1\u28be\1\u2900\1\u2942"+
+ "\1\u2984\1\u29c6\1\u2a08\1\u2a4a\1\u2a8c\1\u2ace\1\u2b10\1\u2b52"+
+ "\1\u2b94\1\u2bd6\0\uf570\1\u2c18\1\u2c5a\1\u2c9c\1\u2cde\1\u2d20"+
+ "\1\u2d62\1\u2da4\1\u2de6\1\u2e28\1\u2e6a\1\u2eac\1\u2eee\1\u2f30"+
+ "\1\u2f72\1\u2fb4\1\u2ff6\1\u3038\1\u307a\1\u30bc\1\u30fe\1\u3140"+
+ "\1\u3182\1\u31c4\1\u3206\1\u3248\1\u328a\1\u32cc\1\u330e\1\u3350"+
+ "\1\u3392\1\u33d4\1\u3416\1\u3458\1\u349a\1\u34dc\1\u351e\1\u3560"+
+ "\1\u35a2\1\u35e4\1\u3626\1\u3668\1\u36aa\1\u36ec\1\u372e\1\u3770"+
+ "\1\u37b2\1\u37f4\1\u3836\1\u3878\1\u38ba\1\u38fc\1\u393e\1\u3980"+
+ "\1\u39c2\1\u3a04\1\u3a46\1\u3a88\1\u3aca\1\u3b0c\1\u3b4e\1\u3b90"+
+ "\1\u3bd2\1\u3c14\1\u3c56\1\u3c98\1\u3cda\1\u3d1c\1\u3d5e\1\u3da0"+
+ "\1\u3de2\1\u3e24\1\u3e66\1\u3ea8\1\u3eea\1\u3f2c\1\u3f6e\1\u3fb0"+
+ "\1\u3ff2\1\u4034\1\u4076\1\u40b8\1\u40fa\1\u413c\1\u417e\1\u41c0"+
+ "\1\u4202\1\u4244\1\u4286\1\u42c8\1\u430a\1\u434c\1\u438e\1\u43d0"+
+ "\1\u4412\1\u4454\1\u4496\1\u44d8\1\u451a\1\u455c\1\u459e\1\u45e0"+
+ "\1\u4622\1\u4664\1\u46a6\1\u46e8\1\u472a\1\u476c\1\u47ae\1\u47f0"+
+ "\1\u4832\1\u4874\1\u48b6\1\u48f8\1\u493a\1\u497c\1\u49be\1\u4a00"+
+ "\1\u4a42\1\u4a84";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[1322];
+ 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 =
+ "\1\7\2\10\1\11\1\12\1\13\1\11\1\14\1\15"+
+ "\1\16\1\7\1\17\1\20\1\21\1\22\1\23\1\16"+
+ "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+ "\1\34\1\7\1\35\1\36\1\37\2\23\1\40\1\23"+
+ "\1\41\1\42\1\43\1\42\2\34\1\7\1\44\1\7"+
+ "\1\45\1\46\1\47\1\50\1\51\1\52\1\53\1\54"+
+ "\1\55\1\56\1\57\2\10\1\60\1\61\3\11\1\7"+
+ "\1\62\1\30\1\45\1\50\10\63\1\64\1\63\1\65"+
+ "\1\66\1\63\1\67\64\63\12\70\1\71\1\66\1\70"+
+ "\1\72\33\70\1\73\30\70\12\74\1\75\1\76\1\74"+
+ "\1\77\60\74\1\100\3\74\15\101\1\102\1\101\1\103"+
+ "\5\101\1\104\25\101\1\105\2\101\1\106\20\101\1\107"+
+ "\1\110\1\111\15\112\1\113\7\112\1\114\25\112\1\115"+
+ "\2\112\1\116\20\112\1\117\1\120\1\121\103\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+ "\3\10\3\123\2\11\1\123\1\11\1\123\1\0\3\123"+
+ "\5\0\10\123\17\0\1\123\2\0\17\123\3\11\1\0"+
+ "\10\123\1\124\1\123\1\124\1\123\1\0\3\123\5\0"+
+ "\1\125\7\123\17\0\1\123\2\0\17\123\3\124\1\0"+
+ "\4\123\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\126\5\10\22\0\6\10\1\127\1\10\1\130\1\10"+
+ "\1\131\7\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\7\10\1\132\22\0\4\10\1\133\15\10"+
+ "\2\0\3\10\1\0\2\10\2\134\1\10\1\134\1\10"+
+ "\2\0\1\122\1\134\1\10\1\135\3\0\1\10\1\136"+
+ "\1\137\1\140\2\10\1\141\1\142\15\0\1\143\4\0"+
+ "\1\144\1\145\1\146\1\147\1\10\1\150\1\151\1\152"+
+ "\6\10\1\153\3\134\1\135\1\0\1\10\1\144\1\147"+
+ "\1\0\7\10\2\0\1\122\2\10\2\0\1\154\1\0"+
+ "\10\10\5\0\1\42\14\0\22\10\2\0\3\10\16\0"+
+ "\1\22\121\0\1\42\44\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\1\10\1\155\20\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\156"+
+ "\1\157\4\10\22\0\6\10\1\160\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\161"+
+ "\1\10\1\162\2\10\22\0\2\10\1\163\3\10\1\134"+
+ "\2\10\1\164\10\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\165\7\10\22\0\4\10\1\166"+
+ "\15\10\2\0\3\10\1\0\2\10\1\134\2\10\1\134"+
+ "\1\167\2\0\1\122\2\10\4\0\5\10\1\170\1\171"+
+ "\1\10\22\0\2\10\1\172\3\10\1\173\10\10\1\174"+
+ "\1\175\1\134\2\0\3\10\1\0\4\10\1\176\1\10"+
+ "\1\177\2\0\1\122\2\10\4\0\2\10\1\200\3\10"+
+ "\1\201\1\10\22\0\7\10\1\202\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\203"+
+ "\1\10\1\204\2\10\22\0\2\10\1\205\3\10\1\206"+
+ "\13\10\2\0\3\10\1\0\6\10\1\207\2\0\1\122"+
+ "\2\10\4\0\1\10\1\210\1\10\1\211\2\10\1\212"+
+ "\1\10\22\0\1\213\1\214\1\215\1\216\5\10\1\217"+
+ "\2\10\1\220\5\10\2\0\1\10\1\213\1\216\33\0"+
+ "\1\42\2\0\1\42\77\0\1\42\1\0\1\42\100\0"+
+ "\1\221\1\42\101\0\1\42\1\0\1\222\50\0\1\223"+
+ "\14\0\1\224\1\0\1\225\1\0\1\226\5\0\1\42"+
+ "\15\0\1\227\1\230\1\231\1\0\1\232\1\0\1\233"+
+ "\1\0\1\234\3\0\1\235\10\0\1\231\36\0\1\42"+
+ "\5\0\1\42\36\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\236\10\10\1\237\6\10\2\0"+
+ "\3\10\1\0\6\10\1\240\2\0\1\122\2\10\4\0"+
+ "\5\10\1\241\1\242\1\10\22\0\6\10\1\243\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\4\10\1\244\2\10\1\245\22\0\4\10\1\246\1\247"+
+ "\1\10\1\250\12\10\2\0\1\244\2\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\251\5\10\22\0"+
+ "\2\10\1\252\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\253\1\10\1\254\2\10"+
+ "\22\0\6\10\1\255\13\10\2\0\3\10\1\0\6\10"+
+ "\1\256\2\0\1\122\2\10\4\0\2\10\1\257\1\260"+
+ "\1\10\1\261\1\262\1\10\22\0\1\263\5\10\1\264"+
+ "\13\10\2\0\1\10\1\263\1\10\1\0\6\10\1\265"+
+ "\2\0\1\122\2\10\4\0\4\10\1\266\3\10\22\0"+
+ "\4\10\1\134\15\10\2\0\1\266\2\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\267\4\10\22\0"+
+ "\2\10\1\270\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\271\4\10\22\0\6\10"+
+ "\1\272\13\10\2\0\3\10\1\0\4\10\1\273\2\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\274\1\10\1\275"+
+ "\2\10\22\0\2\10\1\276\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\277\1\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\300\2\10\22\0\2\10\1\301"+
+ "\17\10\2\0\3\10\1\0\6\10\1\302\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\10\63"+
+ "\1\0\1\63\2\0\1\63\1\0\64\63\15\303\1\0"+
+ "\64\303\1\0\2\304\2\0\1\304\1\0\1\304\3\0"+
+ "\2\304\4\0\10\304\15\0\1\305\4\0\17\304\5\0"+
+ "\3\304\12\70\2\0\1\70\1\0\33\70\1\0\30\70"+
+ "\12\74\2\0\1\74\1\0\60\74\1\0\3\74\1\0"+
+ "\2\306\2\0\1\306\1\0\1\306\3\0\2\306\4\0"+
+ "\10\306\15\0\1\307\4\0\17\306\5\0\3\306\15\101"+
+ "\1\0\1\101\1\0\57\101\17\0\1\310\65\0\15\101"+
+ "\1\0\1\101\1\0\2\101\1\311\32\101\1\312\21\101"+
+ "\3\0\15\101\1\0\1\101\1\0\2\101\1\313\54\101"+
+ "\3\0\15\101\1\0\1\101\1\0\36\101\1\314\20\101"+
+ "\2\0\1\315\22\0\1\316\32\0\1\317\46\0\1\320"+
+ "\135\0\1\315\22\0\1\315\15\112\1\0\61\112\3\0"+
+ "\15\112\1\0\4\112\1\321\32\112\1\322\21\112\3\0"+
+ "\15\112\1\0\4\112\1\323\54\112\3\0\15\112\1\0"+
+ "\40\112\1\324\20\112\2\0\1\325\22\0\1\326\32\0"+
+ "\1\327\46\0\1\330\135\0\1\325\22\0\1\325\7\0"+
+ "\1\331\72\0\10\123\1\0\3\123\5\0\10\123\17\0"+
+ "\1\123\2\0\22\123\1\0\10\123\1\124\1\123\1\124"+
+ "\1\123\1\0\3\123\5\0\10\123\17\0\1\123\2\0"+
+ "\17\123\3\124\1\0\7\123\4\332\1\123\1\0\3\123"+
+ "\5\0\3\123\3\332\2\123\17\0\1\123\2\0\5\123"+
+ "\1\332\1\123\1\332\7\123\3\332\1\0\1\123\1\332"+
+ "\2\123\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\333\2\10\22\0\2\10\1\334\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\335"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\10\10\1\336\11\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\337\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\340\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\341\5\10\22\0\2\10\1\342"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\343\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\3\10\1\344\3\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\345\7\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\346\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\347\6\10\22\0"+
+ "\11\10\1\350\2\10\1\351\5\10\2\0\3\10\1\0"+
+ "\2\352\2\0\1\352\1\0\1\352\3\0\2\352\4\0"+
+ "\10\352\22\0\17\352\5\0\3\352\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\3\10\1\353\16\10"+
+ "\2\0\2\10\1\353\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\354\3\10\1\355\1\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\356\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\357\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\11\10\1\360\10\10\2\0"+
+ "\3\10\1\0\6\10\1\361\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\362\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\6\10\1\363\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\17\0\1\364"+
+ "\63\0\7\10\2\0\1\122\2\10\4\0\7\10\1\365"+
+ "\22\0\22\10\2\0\3\10\1\0\6\10\1\366\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\14\10\1\134\5\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\367\7\10\22\0\11\10\1\370\10\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\1\10\1\134\20\10\2\0\3\10\1\0\4\10\1\371"+
+ "\2\10\2\0\1\122\2\10\4\0\1\10\1\372\3\10"+
+ "\1\373\1\10\1\374\22\0\4\10\1\375\3\10\1\376"+
+ "\5\10\1\377\3\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0100\12\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\10\10\1\u0101\11\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+ "\1\u0102\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\134\1\10\1\u0103\4\10\22\0"+
+ "\1\10\1\u0104\3\10\1\u0105\14\10\2\0\3\10\1\0"+
+ "\6\10\1\u0106\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\134\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u0107\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u0108\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\6\10\1\u0109\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u010a\1\10\22\0\4\10\1\u010b\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u010c\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\2\10\2\134\1\10\1\134\1\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\17\10\3\134\2\0\3\10\1\0"+
+ "\3\10\1\134\3\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\17\10\3\134\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u010d\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u010e\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+ "\1\u010f\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\134\4\10\1\u0110\1\10\22\0"+
+ "\3\10\1\u0111\16\10\2\0\2\10\1\u0111\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u0112"+
+ "\1\10\1\u0113\10\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\4\10\1\u0114\3\10\22\0\22\10"+
+ "\2\0\1\u0114\2\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0115\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\367"+
+ "\22\0\5\10\1\u0116\14\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u0117\2\10\22\0"+
+ "\10\10\1\u0118\11\10\2\0\3\10\1\0\4\10\1\u0119"+
+ "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u011a\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u011b\3\10"+
+ "\1\u011c\2\10\22\0\4\10\1\u011d\1\u011e\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u011f\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\203"+
+ "\2\10\1\u0120\1\u0121\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u0122\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u0123\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\1\10\1\u0124\5\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0125\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0126\22\0\22\10\2\0\3\10\36\0\1\42"+
+ "\1\0\1\23\120\0\1\u0127\45\0\1\u0128\3\0\1\u0129"+
+ "\27\0\1\u012a\1\u012b\103\0\1\u012c\106\0\1\u012d\40\0"+
+ "\1\u012e\100\0\1\u012f\31\0\1\u0130\17\0\1\u012f\30\0"+
+ "\1\u0131\135\0\1\u0132\43\0\1\u0133\103\0\1\u0134\77\0"+
+ "\1\u0135\56\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u0136\1\u0137\11\10\2\0\3\10\1\0"+
+ "\6\10\1\134\2\0\1\122\2\10\4\0\6\10\1\u0138"+
+ "\1\10\22\0\1\10\1\u0139\3\10\1\u013a\1\10\1\u0139"+
+ "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\u0105\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u013b\11\10\2\0\3\10\1\0\6\10\1\u013c\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\1\10\1\u013d\20\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u013e\1\u013f\1\u0140\1\u0141"+
+ "\2\10\22\0\4\10\1\u0142\15\10\2\0\1\u0140\2\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\3\10\1\u0143\16\10\2\0\2\10\1\u0143\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u0144\5\10\1\u0145"+
+ "\22\0\2\10\1\u0146\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0147"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u0148\2\10\1\u0149\2\10\22\0\2\10"+
+ "\1\u014a\1\10\1\u014b\1\u014c\1\u014d\5\10\1\u014e\5\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u014f\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0150\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\15\10\1\u0151\4\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\11\10\1\u013b\10\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u0152\5\10\22\0"+
+ "\1\10\1\u013d\2\10\1\u0153\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0154\4\10"+
+ "\1\u0155\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0156\4\10\22\0\5\10"+
+ "\1\u0157\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0158\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u0159\1\10\22\0\1\10\1\u015a\20\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u015b"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u015c\1\10\1\u015d\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u015e\1\10\22\0\1\10\1\u015f"+
+ "\2\10\1\u0160\4\10\1\u0161\10\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0162\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\4\10\1\u0163\3\10\22\0\22\10\2\0"+
+ "\1\u0163\2\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u0164\4\10\1\u0165\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u0166\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u0167\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0168\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\1\10\1\u0169\5\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u016a\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\4\10\1\u016b\15\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\u016c\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u016d\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u013d\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u016e\1\u016f\1\10\22\0\1\10"+
+ "\1\u0170\3\10\1\u0171\1\10\1\u0172\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u0173\17\10\2\0\3\10\1\0\7\304\2\0"+
+ "\1\u0174\2\304\4\0\10\304\22\0\22\304\2\0\3\304"+
+ "\1\0\2\u0175\2\0\1\u0175\1\0\1\u0175\3\0\2\u0175"+
+ "\4\0\10\u0175\22\0\17\u0175\5\0\3\u0175\1\0\7\306"+
+ "\2\0\1\u0176\2\306\4\0\10\306\22\0\22\306\2\0"+
+ "\3\306\1\0\2\u0177\2\0\1\u0177\1\0\1\u0177\3\0"+
+ "\2\u0177\4\0\10\u0177\22\0\17\u0177\5\0\3\u0177\15\101"+
+ "\1\0\1\101\1\0\34\101\1\u0178\22\101\3\0\15\101"+
+ "\1\0\1\101\1\0\7\101\1\u0179\47\101\3\0\15\101"+
+ "\1\0\1\101\1\0\2\101\1\u017a\54\101\3\0\15\101"+
+ "\1\0\1\101\1\0\36\101\1\u017b\20\101\2\0\1\u017c"+
+ "\56\0\1\u017c\22\0\1\u017c\54\0\1\u017d\54\0\1\u017e"+
+ "\74\0\1\u017f\57\0\15\112\1\0\36\112\1\u0180\22\112"+
+ "\3\0\15\112\1\0\11\112\1\u0181\47\112\3\0\15\112"+
+ "\1\0\4\112\1\u0182\54\112\3\0\15\112\1\0\40\112"+
+ "\1\u0183\20\112\2\0\1\u0184\56\0\1\u0184\22\0\1\u0184"+
+ "\54\0\1\u0185\54\0\1\u0186\74\0\1\u0187\62\0\4\u0188"+
+ "\15\0\3\u0188\31\0\1\u0188\1\0\1\u0188\7\0\3\u0188"+
+ "\2\0\1\u0188\3\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0189\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u018a\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u018b\6\10\22\0\1\134\21\10"+
+ "\2\0\1\10\1\134\1\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u018c\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u018d\20\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\134\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u018e\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u018f\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\11\10\1\160\10\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0190\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0191\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u0192\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u0193\22\0\1\10\1\u0194\20\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0190\22\0"+
+ "\22\10\2\0\3\10\1\0\7\352\2\0\1\u0195\2\352"+
+ "\4\0\10\352\16\0\1\135\3\0\22\352\2\0\3\352"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u0196\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0197\13\10"+
+ "\2\0\3\10\1\0\6\10\1\u0198\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\361\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0190\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+ "\1\u0199\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u0190\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u019a\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u019b\17\10"+
+ "\2\0\3\10\14\0\1\u019c\66\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u019d\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u019e\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u019f\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\1\10\1\u01a0\20\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u01a1\13\10\2\0\3\10\1\0\6\10\1\u01a2"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u01a3\12\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u01a4\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\254\2\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u01a5\12\10\2\0\3\10\1\0\6\10\1\u01a6"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u01a7\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\1\u0114\21\10"+
+ "\2\0\1\10\1\u0114\1\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\300\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\5\10\1\u01a8\14\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u01a9\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\1\u013d\21\10\2\0\1\10\1\u013d"+
+ "\1\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\11\10\1\u01aa\10\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u01ab"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\366\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u01ac\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u01ad\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u01ae\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\5\10\1\u0153\14\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u0173\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u01af\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\u01b0\21\10\2\0\1\10"+
+ "\1\u01b0\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u01b1\13\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u01b2\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\4\10\1\u01b3\2\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\u01b4\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u01b5\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\134\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\10\10\1\u01b6\11\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u01b7\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u01b8"+
+ "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u01b9\5\10\1\u01ba\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u01bb\22\0\5\10\1\u01bc\14\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\u01bd\1\10"+
+ "\22\0\5\10\1\u01be\14\10\2\0\3\10\1\0\4\10"+
+ "\1\u01bf\2\10\2\0\1\122\2\10\4\0\2\10\1\u013e"+
+ "\1\u013f\1\u01c0\1\u01c1\1\10\1\u01c2\22\0\1\10\1\u01c3"+
+ "\1\10\1\u01c4\1\10\1\u01c5\1\u01c6\1\u01c7\12\10\2\0"+
+ "\1\u01c0\1\10\1\u01c4\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u01c8\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u01c9\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u01ca\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\243\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u01cb\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\3\10\1\u01cc\16\10\2\0"+
+ "\2\10\1\u01cc\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\5\10\1\u01cd\14\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u01ce\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\7\10\1\u01cf\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u01d0\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u01d1\6\10\22\0\22\10"+
+ "\2\0\3\10\62\0\1\u01d2\42\0\1\u01d3\106\0\1\u01d4"+
+ "\133\0\1\u01d5\72\0\1\u01d6\24\0\1\u01d6\63\0\1\u01d7"+
+ "\47\0\1\u01d8\131\0\1\u01d9\100\0\1\u0127\2\0\1\u01d2"+
+ "\47\0\1\u01da\27\0\1\u01db\44\0\1\u01dc\103\0\1\u01dd"+
+ "\51\0\1\u01dd\62\0\1\u01de\44\0\1\u01df\57\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u01e0\4\10\22\0"+
+ "\7\10\1\u01e1\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\1\u01e2\21\10\2\0"+
+ "\1\10\1\u01e2\1\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\11\10\1\134\10\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\134\12\10\2\0\3\10\1\0\6\10\1\134"+
+ "\2\0\1\122\2\10\4\0\2\10\1\134\5\10\22\0"+
+ "\5\10\1\134\14\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u013d\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\10\10\1\u01e3\11\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u01e4\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u01e5\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u01e6\17\10\2\0\3\10\1\0\4\10"+
+ "\1\176\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u01e7\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u01e8\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\4\10\1\u01e9\3\10\22\0\5\10"+
+ "\1\u01ea\1\243\13\10\2\0\1\u01e9\2\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u01eb\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u01ec\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u013d\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u01ed\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\4\10\1\u01ee\2\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u01ef\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\134\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\u01f0\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\134"+
+ "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u01f1\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01f2"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\7\10\1\u01f3\12\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u01f4\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+ "\1\u01f5\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\134\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u01f6\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u018b\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\u01f7\2\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\5\10\1\u01f8\14\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\132\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u01f9\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u01fa\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u01fb\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\5\10\1\u01fc\14\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u01fd"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u01fe\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\14\10\1\u01ff\5\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0200\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\1\10\1\u0201\20\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\4\10\1\u0202\3\10"+
+ "\22\0\22\10\2\0\1\u0202\2\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\6\10\1\u0203\1\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u0204\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0205\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u01b9\1\10\1\u0206\3\10\1\u0207"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u0208\2\10\1\u0209\1\10\1\u020a"+
+ "\1\10\22\0\3\10\1\u020b\1\10\1\u020c\1\10\1\u020d"+
+ "\12\10\2\0\1\u0209\1\10\1\u020b\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u013d\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u020e\1\u020f\2\10\1\u0210\1\10\1\u0211\22\0"+
+ "\2\10\1\u0212\3\10\1\u0213\1\u0214\4\10\1\u0215\5\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0216\22\0\22\10\2\0\3\10\1\0\6\10"+
+ "\1\u01f5\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\5\10\1\u0217\14\10\2\0\3\10\1\0"+
+ "\4\10\1\134\2\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\7\10\1\u0218\12\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0219\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u021a\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u021b\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u021c"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u013d\6\10\22\0\22\10"+
+ "\2\0\3\10\7\0\1\u021d\73\0\7\u0175\2\0\1\u021e"+
+ "\2\u0175\4\0\10\u0175\16\0\1\u021f\3\0\22\u0175\2\0"+
+ "\3\u0175\7\0\1\u0220\73\0\7\u0177\2\0\1\u0221\2\u0177"+
+ "\4\0\10\u0177\16\0\1\u0222\3\0\22\u0177\2\0\3\u0177"+
+ "\15\101\1\0\1\101\1\0\25\101\1\u0223\31\101\3\0"+
+ "\15\101\1\0\1\101\1\0\4\101\1\u0178\52\101\3\0"+
+ "\15\101\1\0\1\101\1\0\34\101\1\u0224\22\101\3\0"+
+ "\15\101\1\0\1\101\1\0\12\101\1\u0225\44\101\35\0"+
+ "\1\u0226\114\0\1\u0227\60\0\1\u017d\131\0\1\u0228\25\0"+
+ "\15\112\1\0\27\112\1\u0229\31\112\3\0\15\112\1\0"+
+ "\6\112\1\u0180\52\112\3\0\15\112\1\0\36\112\1\u022a"+
+ "\22\112\3\0\15\112\1\0\14\112\1\u022b\44\112\35\0"+
+ "\1\u022c\114\0\1\u022d\60\0\1\u0185\131\0\1\u022e\30\0"+
+ "\4\u022f\15\0\3\u022f\31\0\1\u022f\1\0\1\u022f\7\0"+
+ "\3\u022f\2\0\1\u022f\3\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\7\10\1\u0230\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\10\10\1\u0231\11\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0138\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u0232\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\20\10"+
+ "\1\134\1\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\10\10\1\376\11\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u0233\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0234\12\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\10\10\1\u0235\11\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0236\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u0237\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u0238\5\10\22\0\22\10\2\0\3\10\7\0\1\u0239"+
+ "\73\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u023a\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\10\10\1\u023b\11\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\10\10\1\u023c\11\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\13\10"+
+ "\1\u023d\6\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u023e\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\14\10\1\u023f\5\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0240"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u0241\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u0173\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u0147\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u0242\1\u0243\4\10\22\0\2\10\1\u0244\3\10"+
+ "\1\u0240\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u0245\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u0246\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0247\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u0248\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u0249"+
+ "\22\0\3\10\1\u024a\16\10\2\0\2\10\1\u024a\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u024b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u024c\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u024d\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\1\u024e\21\10"+
+ "\2\0\1\10\1\u024e\1\10\1\0\1\10\1\u024f\5\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u0250\1\u0251\3\10"+
+ "\1\u0252\22\0\3\10\1\u0253\1\10\1\u0254\1\u0255\13\10"+
+ "\2\0\2\10\1\u0253\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\4\10\1\u0256\3\10\22\0\3\10\1\u0143\1\u01b9"+
+ "\1\u0254\14\10\2\0\1\u0256\1\10\1\u0143\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u0257"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0258\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\3\10\1\u0259\16\10\2\0\2\10\1\u0259\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\14\10\1\u025a"+
+ "\5\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u025b\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u025c\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\134\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u025d\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u025e"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u025f\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0260"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0173\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0107\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u0261\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u0147\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u0262\7\10\1\u0263\10\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u025b"+
+ "\5\10\22\0\13\10\1\u0264\6\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u0265\3\10\1\u0266\13\10\2\0\3\10\1\0\6\10"+
+ "\1\u0267\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u0268\6\10\22\0\1\u0269\21\10\2\0\1\10"+
+ "\1\u0269\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u026a\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u026b\17\10\2\0\3\10\1\0\6\10\1\u026c\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u026d\13\10"+
+ "\2\0\3\10\1\0\6\10\1\u026e\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\15\10\1\u026f\4\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0270"+
+ "\1\10\1\u0271\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+ "\1\u0272\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\11\10\1\u0273\10\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u0274\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\134\7\10\22\0\22\10"+
+ "\2\0\3\10\1\0\6\10\1\u0275\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0276\1\u0143\16\10\2\0"+
+ "\2\10\1\u0143\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0277\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0278\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\u0279\21\10\2\0\1\10"+
+ "\1\u0279\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u027a\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0138\4\10"+
+ "\22\0\22\10\2\0\3\10\24\0\1\u027b\136\0\1\u027c"+
+ "\44\0\1\u0132\132\0\1\u027b\105\0\1\u0132\74\0\1\u027d"+
+ "\1\u027e\46\0\1\u027f\145\0\1\u0280\37\0\1\u0281\104\0"+
+ "\1\u0282\131\0\1\u0283\77\0\1\u0284\47\0\1\u0285\63\0"+
+ "\1\u0286\75\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u01b5\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0287\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0288\17\10\2\0\3\10"+
+ "\1\0\4\10\1\u0289\2\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u028a\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u028b\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+ "\1\132\16\10\2\0\2\10\1\132\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u028c\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\11\10\1\u0173\10\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+ "\1\u028d\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u028e\2\10\1\u028f\1\u0290\2\10"+
+ "\22\0\1\10\1\u0291\20\10\2\0\1\u028f\2\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+ "\1\u0292\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u0293\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u0294\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u0295"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0296\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\134"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u0297\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u0298\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u0299\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\u029a\2\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u029b"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u029c\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\1\u029d\21\10\2\0\1\10\1\u029d\1\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u029e\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\247\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u029f\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\13\10"+
+ "\1\u02a0\6\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\10\10\1\u02a1\11\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u02a2\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\4\10\1\u02a3\3\10\22\0"+
+ "\22\10\2\0\1\u02a3\2\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u02a4\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u02a5\1\10\22\0\6\10\1\u02a6\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u023f\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u02a7\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u02a8\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02a9\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u02aa\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\u02ab\21\10\2\0\1\10\1\u02ab\1\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u02ac\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\6\10\1\u02ad\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u02ae\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u02af\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u02b0\17\10\2\0\3\10\1\0\6\10\1\u02b1\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u02b2"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u02b3\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u02b4\4\10\22\0\2\10\1\163\17\10\2\0"+
+ "\3\10\1\0\4\10\1\u02b5\2\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u02b6\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\5\10\1\u02b7\14\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\13\10\1\u02b8\6\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u02b9\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u02ba\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u02bb\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\4\10\1\u02bc\2\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u02bd\12\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u02be"+
+ "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u02bf\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\11\10\1\u02c0\10\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u02c1\22\0\22\10\2\0"+
+ "\3\10\3\0\4\u02c2\15\0\3\u02c2\31\0\1\u02c2\1\0"+
+ "\1\u02c2\7\0\3\u02c2\2\0\1\u02c2\11\0\1\u02c3\75\0"+
+ "\4\u02c4\15\0\3\u02c4\31\0\1\u02c4\1\0\1\u02c4\7\0"+
+ "\3\u02c4\2\0\1\u02c4\11\0\1\u02c5\72\0\14\101\1\u02c6"+
+ "\1\0\1\101\1\0\57\101\3\0\15\101\1\0\1\101"+
+ "\1\0\10\101\1\u0178\14\101\1\u0223\31\101\3\0\1\101"+
+ "\7\u0225\1\101\1\u0225\1\101\2\u0225\1\0\1\101\1\u02c7"+
+ "\15\u0225\1\101\1\u0225\2\101\5\u0225\2\101\25\u0225\2\101"+
+ "\3\u0226\1\0\1\u0226\1\u02c7\5\u0226\1\0\1\u02c7\1\0"+
+ "\2\u0226\2\0\2\u02c7\10\u0226\4\u02c7\1\0\1\u02c7\2\0"+
+ "\5\u02c7\2\0\3\u02c7\22\u0226\2\0\3\u0226\14\0\1\u02c8"+
+ "\115\0\1\u017d\14\0\1\u0227\34\0\14\112\1\u02c9\1\0"+
+ "\61\112\3\0\15\112\1\0\12\112\1\u0180\14\112\1\u0229"+
+ "\31\112\3\0\1\112\7\u022b\1\112\1\u022b\1\112\2\u022b"+
+ "\1\0\1\112\16\u022b\1\112\1\u022b\2\112\5\u022b\2\112"+
+ "\25\u022b\2\112\3\u022c\1\0\1\u022c\1\u02ca\5\u022c\1\0"+
+ "\1\u02ca\1\0\2\u022c\2\0\2\u02ca\10\u022c\4\u02ca\1\0"+
+ "\1\u02ca\2\0\5\u02ca\2\0\3\u02ca\22\u022c\2\0\3\u022c"+
+ "\14\0\1\u02cb\115\0\1\u0185\14\0\1\u022d\37\0\4\u02cc"+
+ "\15\0\3\u02cc\31\0\1\u02cc\1\0\1\u02cc\7\0\3\u02cc"+
+ "\2\0\1\u02cc\3\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u02cd\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02ce\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\7\10\1\u02cf\12\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u02d0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\340"+
+ "\17\10\2\0\3\10\1\0\6\10\1\u02d1\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u02d2\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u02d3\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u02d4\13\10\2\0\3\10\3\0\4\u02d5"+
+ "\15\0\3\u02d5\31\0\1\u02d5\1\0\1\u02d5\7\0\3\u02d5"+
+ "\2\0\1\u02d5\3\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\1\10\1\u02d6\20\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u02d7\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u02d8\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u02d9\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\u02da"+
+ "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u013b\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u02db\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u02dc\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u02dd\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u02de\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u02df\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\15\10\1\u02e0\4\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\6\10\1\u013d\1\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\u02e1\22\0\22\10\2\0\3\10\1\0"+
+ "\4\10\1\u02e2\2\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\u02e3\21\10\2\0\1\10"+
+ "\1\u02e3\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\302\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+ "\1\u02e4\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u02e5\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u02e6\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u02e7"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\u02e8\2\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u02e9"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u02ea\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u02eb\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u02ec\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u02ed\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u01bd\20\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u02ee"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u02ef\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\15\10\1\u0153\4\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u02f0\4\10\1\u02f1\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\u02f2\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u02f3\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\12\10\1\u013b\7\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u02f4\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\u02f5\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u02f6\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\u0173\7\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\1\10\1\u015a\20\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\14\10\1\u013d\5\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\1\10\1\u02f7\20\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\5\10\1\u02f8\14\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\u02f9\1\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0173\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u02fa\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u02fb\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u02fc\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\6\10\1\u02fd\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u02fe\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u02ff\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u0300"+
+ "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0301\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0302"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0303\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u0304\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\u0301"+
+ "\21\10\2\0\1\10\1\u0301\1\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0305\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u0306\13\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0307\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0308\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u0309\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u030a\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u030b\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\1\134\21\10\2\0\1\10\1\134\1\10\25\0\1\u0132"+
+ "\51\0\1\u0132\25\0\1\u0132\105\0\1\u030c\131\0\1\u030d"+
+ "\46\0\1\u030e\130\0\1\u030f\24\0\1\u030f\24\0\1\u0310"+
+ "\65\0\1\u0311\147\0\1\u0312\103\0\1\u01d4\103\0\1\u0313"+
+ "\101\0\1\u0129\21\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0114\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\164"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u0314\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u0315\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0316\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\7\10\1\u02ab\12\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+ "\1\u0317\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\14\10\1\u0318\5\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u0319\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\6\10\1\u031a\1\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u031b\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u031c"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u031d\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u0114\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u031e\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u031f\14\10\2\0"+
+ "\3\10\1\0\6\10\1\u0320\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u0321\5\10\22\0\2\10\1\u0244\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\3\10\1\u0322\16\10\2\0\2\10\1\u0322\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0323\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\134\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u0114\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0324\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0325\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0326\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u013f\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\4\10\1\u0327\2\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0328\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u0139\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u0329\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u029a\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u032a\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u032b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0153\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u032c\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u032d\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u032e\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u032f\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\11\10\1\u0330\10\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u0331\1\10\22\0\4\10\1\u0332\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u0333\1\10\22\0\22\10\2\0\3\10\1\0\4\10"+
+ "\1\u0334\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0335\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0336"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\6\10\1\u0337\1\10\22\0\10\10"+
+ "\1\u0338\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u0339\20\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u033a\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u033b"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u033c\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u033d\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\5\10\1\u014c\14\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\4\10\1\u033e\3\10\22\0\22\10\2\0\1\u033e\2\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u033f"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\10\10\1\u0340\11\10\2\0"+
+ "\3\10\1\0\6\10\1\u0341\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\15\10\1\u0342\4\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u0343\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+ "\1\u0344\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u0345\7\10\1\u0346"+
+ "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\5\10\1\u0347\14\10\2\0\3\10"+
+ "\3\0\4\u0348\15\0\3\u0348\31\0\1\u0348\1\0\1\u0348"+
+ "\7\0\3\u0348\2\0\1\u0348\5\0\4\u0349\15\0\3\u0349"+
+ "\31\0\1\u0349\1\0\1\u0349\7\0\3\u0349\2\0\1\u0349"+
+ "\5\0\4\u034a\15\0\3\u034a\31\0\1\u034a\1\0\1\u034a"+
+ "\7\0\3\u034a\2\0\1\u034a\5\0\4\u034b\15\0\3\u034b"+
+ "\31\0\1\u034b\1\0\1\u034b\7\0\3\u034b\2\0\1\u034b"+
+ "\2\0\14\101\1\u0225\1\0\1\101\1\0\57\101\17\0"+
+ "\1\u0226\65\0\14\112\1\u022b\1\0\61\112\17\0\1\u022c"+
+ "\70\0\4\10\15\0\3\10\31\0\1\10\1\0\1\10"+
+ "\7\0\3\10\2\0\1\10\3\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u034c\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u034d\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u034e"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\u034f\2\10\22\0\1\10\1\u0350\3\10"+
+ "\1\u0351\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u0352\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\11\10\1\u0353\10\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u0354\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\10\10\1\u0355\11\10\2\0\3\10"+
+ "\3\0\4\u0356\15\0\3\u0356\31\0\1\u0356\1\0\1\u0356"+
+ "\7\0\3\u0356\2\0\1\u0356\3\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u0357\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\u0358\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\351"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\160\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0359"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\6\10\1\u031d\1\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u0293\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u035a\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\15\10\1\u035b\4\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u035b\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0162\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u035c\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\6\10\1\u035d\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u01a5\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u035e\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u035f"+
+ "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u0360\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u0361\15\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0362\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u0363\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0364\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u0365\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u0366\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0367"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u0368\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u0369\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u036a\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\13\10\1\u036b\6\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u036c\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u036d\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u036e\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u036f\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0370\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u013d"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\u0371\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0372\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0373"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0374\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0375"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\10\10\1\u0376\11\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\7\10\1\u0377\12\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u0378\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u0379\20\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u037a\20\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u037b\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\5\10\1\u037c\2\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u037d"+
+ "\1\10\1\u037e\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u037f\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0380\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u0276\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u0381\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0382\4\10\22\0\22\10\2\0\3\10\1\0\6\10"+
+ "\1\u0383\2\0\1\122\2\10\4\0\6\10\1\u0384\1\10"+
+ "\22\0\2\10\1\u0385\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\3\10\1\u0386"+
+ "\16\10\2\0\2\10\1\u0386\7\0\1\u0387\152\0\1\u0388"+
+ "\105\0\1\u0132\77\0\1\u027c\41\0\1\u0389\141\0\1\u01d4"+
+ "\76\0\1\u038a\46\0\1\u038b\56\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\u038c\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u038d\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u038e\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\6\10\1\u013d\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+ "\1\u038f\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u014e\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u0390\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0391"+
+ "\13\10\2\0\3\10\1\0\6\10\1\u0392\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+ "\1\134\5\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u0153\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u029a\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u0393"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u0394\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u0395\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\1\u0396\21\10\2\0"+
+ "\1\10\1\u0396\1\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\4\10\1\u0397\2\10\1\u0398\22\0\7\10\1\u0399"+
+ "\12\10\2\0\1\u0397\2\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u0365\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u039a\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u039b\3\10"+
+ "\1\u01cb\13\10\2\0\3\10\1\0\6\10\1\u0361\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u039c"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u039d\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u039e\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u0217\22\0"+
+ "\1\10\1\u039f\20\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u024c\5\10\22\0\2\10"+
+ "\1\u03a0\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\u0293\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\3\10\1\u013d\16\10\2\0\2\10\1\u013d\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+ "\1\u03a1\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u03a2\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\5\10\1\u03a3\14\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u03a4\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u03a5\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u03a6\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u03a7\5\10\22\0\2\10"+
+ "\1\u0378\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\15\10\1\u03a8\4\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u03a9\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u03aa"+
+ "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u03ab\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u03ac"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\4\10\1\u03ad\3\10\22\0\22\10"+
+ "\2\0\1\u03ad\2\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u03ae\15\10\2\0\3\10"+
+ "\1\0\4\10\1\u03af\2\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u03b0\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u03b1\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u03b2\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u03b3\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u03b4\1\10\22\0\22\10\2\0\3\10\1\0\6\10"+
+ "\1\u03b5\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u03b6\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u03b7\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u03b8\5\10\22\0\22\10\2\0"+
+ "\3\10\3\0\4\u03b9\15\0\3\u03b9\31\0\1\u03b9\1\0"+
+ "\1\u03b9\7\0\3\u03b9\2\0\1\u03b9\5\0\4\u03ba\15\0"+
+ "\3\u03ba\31\0\1\u03ba\1\0\1\u03ba\7\0\3\u03ba\2\0"+
+ "\1\u03ba\5\0\4\u03bb\15\0\3\u03bb\31\0\1\u03bb\1\0"+
+ "\1\u03bb\7\0\3\u03bb\2\0\1\u03bb\5\0\4\u03bc\15\0"+
+ "\3\u03bc\31\0\1\u03bc\1\0\1\u03bc\7\0\3\u03bc\2\0"+
+ "\1\u03bc\3\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\10\10\1\u03bd\11\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\4\10\1\u03be\3\10\22\0"+
+ "\22\10\2\0\1\u03be\2\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u0266\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\6\10"+
+ "\1\u03bf\1\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\241\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u03c0\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\10\10\1\u0153\11\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u03c1\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u03c2\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u03c3\5\10"+
+ "\22\0\22\10\2\0\3\10\3\0\4\u03c4\15\0\3\u03c4"+
+ "\31\0\1\u03c4\1\0\1\u03c4\7\0\3\u03c4\2\0\1\u03c4"+
+ "\3\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\11\10\1\u03c5\10\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u03c6\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u03c7\22\0\7\10\1\u03c8\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u03c7"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u03c9\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u03ca\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u03cb"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\13\10\1\u03cc\1\10\1\u03cd\4\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u03ce\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u013d\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u03cf\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u03d0\12\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u03d1"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\13\10\1\u013d\6\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u03d2"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u013b\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u0173\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u03d3\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u03d4\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u03d5"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\4\10\1\u03d6\3\10\22\0\22\10\2\0\1\u03d6"+
+ "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u03d7\12\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u03d8"+
+ "\17\10\2\0\3\10\1\0\4\10\1\u03d9\2\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u01b9\2\10\1\u03da\3\10"+
+ "\22\0\7\10\1\u03db\12\10\2\0\1\u03da\2\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u03dc\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u03dd\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\u03de\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u0254"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u03df\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u03e0"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u03e1\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u03e2\13\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u03e3\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u03e4\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\u03e5\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\3\10\1\u03e6"+
+ "\16\10\2\0\2\10\1\u03e6\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u03e7\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u03e8\22\0\22\10\2\0\3\10\1\0\4\10\1\u03e9"+
+ "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0350\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u03ea\3\10\1\u03eb"+
+ "\22\0\2\10\1\u0147\5\10\1\u03eb\11\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u03ec"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\u03ed\7\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\4\10\1\u03ee\15\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u03ef"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u03f0\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u03f1\4\10\1\u03f2\10\10\2\0\3\10\63\0"+
+ "\1\u03f3\45\0\1\u03f4\136\0\1\u03f5\100\0\1\u0132\75\0"+
+ "\1\232\23\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u03f6\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\u03f7\7\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u03f8\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\4\10\1\u02bc\2\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\5\10\1\u03f9\1\10\1\u03fa\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\10\10\1\u03fb\11\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\10\10\1\u03fc\11\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u03fd\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u03fe\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\247\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u03ff\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0266"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\1\u0400\21\10\2\0\1\10\1\u0400"+
+ "\1\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u0401\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\376\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0402\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u038d"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0403\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0404\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0405\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0406\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\4\10"+
+ "\1\u0407\3\10\22\0\22\10\2\0\1\u0407\2\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\10"+
+ "\1\u0408\20\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u0409\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u040a\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\6\10\1\u040b\1\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u040c\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u040d"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u040e\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u040f\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u0287\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\14\10\1\u0410\5\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u0411\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0412"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u0413\3\10\1\u023d\22\0\2\10\1\u0414"+
+ "\13\10\1\u0415\3\10\2\0\3\10\1\0\6\10\1\u0416"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u02b8\13\10\2\0\3\10\1\0\4\10"+
+ "\1\u0417\2\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0418\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0419"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u041a\6\10\22\0\5\10"+
+ "\1\u041b\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u041c\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\4\10\1\u041d\15\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u03ed"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0261\17\10\2\0\3\10"+
+ "\3\0\4\304\15\0\3\304\31\0\1\304\1\0\1\304"+
+ "\7\0\3\304\2\0\1\304\5\0\4\u041e\15\0\3\u041e"+
+ "\31\0\1\u041e\1\0\1\u041e\7\0\3\u041e\2\0\1\u041e"+
+ "\5\0\4\306\15\0\3\306\31\0\1\306\1\0\1\306"+
+ "\7\0\3\306\2\0\1\306\5\0\4\u041f\15\0\3\u041f"+
+ "\31\0\1\u041f\1\0\1\u041f\7\0\3\u041f\2\0\1\u041f"+
+ "\3\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01b9"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u0397\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u0420\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u0421\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0422\15\10\2\0"+
+ "\3\10\1\0\6\10\1\160\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u0423\2\10\22\0\22\10"+
+ "\2\0\3\10\3\0\4\352\15\0\3\352\31\0\1\352"+
+ "\1\0\1\352\7\0\3\352\2\0\1\352\3\0\7\10"+
+ "\2\0\1\122\2\10\4\0\4\10\1\u028f\3\10\22\0"+
+ "\22\10\2\0\1\u028f\2\10\1\0\6\10\1\u0424\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\300"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\3\10\1\u0425\16\10"+
+ "\2\0\2\10\1\u0425\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\u0426\7\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0427\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\15\10\1\u0428\4\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0262\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u0429\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u03ea\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u042a"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\4\10\1\u042b"+
+ "\2\10\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u03bd\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u03d0\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\245\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u042c\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\1\10\1\u01ff"+
+ "\20\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\4\10\1\134\3\10\22\0\22\10\2\0\1\134"+
+ "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u042d\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\u042e"+
+ "\15\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\13\10\1\u0264\6\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u042f\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u0430\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\6\10\1\u0431\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\300"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0432\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\5\10\1\u0433\14\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\15\10\1\u0434\4\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0435\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+ "\1\u0436\16\10\2\0\2\10\1\u0436\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u0437\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0438\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u0105\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u0439\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u043a"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u043b\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u043c\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u043d\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u043e\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\7\10\1\u043f\12\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u038d\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0385\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\10\10\1\134\11\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u0440\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u0441\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u0442\2\10\22\0"+
+ "\2\10\1\u0443\17\10\2\0\3\10\55\0\1\u0444\33\0"+
+ "\1\u0445\120\0\1\u0446\54\0\7\10\2\0\1\122\2\10"+
+ "\4\0\4\10\1\u0447\3\10\22\0\22\10\2\0\1\u0447"+
+ "\2\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u0448\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\u0449\22\0\10\10"+
+ "\1\u0449\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\u044a\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\2\10\1\u044b\17\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u044c\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u044d\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\4\10\1\u044e\15\10\2\0\3\10\1\0\4\10\1\u044f"+
+ "\2\10\2\0\1\122\2\10\4\0\3\10\1\u0450\3\10"+
+ "\1\u03c7\22\0\7\10\1\u03c8\12\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\3\10"+
+ "\1\134\16\10\2\0\2\10\1\134\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0451\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u0452\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+ "\1\u0453\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\7\10\1\u03bd\12\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u0454\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0266"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0455\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u0456\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u0457\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u0458\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u0459\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u045a\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\3\10\1\u03bd\16\10\2\0\2\10\1\u03bd\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u045b\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u045c\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u045d\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u045e\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u045f\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\u0460\7\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u0461\15\10\2\0"+
+ "\3\10\1\0\6\10\1\u0462\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0463\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u0464\13\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u0465\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\7\10\1\u0466\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u0467"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u0468\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u0469\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+ "\1\u046a\5\10\2\0\3\10\3\0\4\u0175\15\0\3\u0175"+
+ "\31\0\1\u0175\1\0\1\u0175\7\0\3\u0175\2\0\1\u0175"+
+ "\5\0\4\u0177\15\0\3\u0177\31\0\1\u0177\1\0\1\u0177"+
+ "\7\0\3\u0177\2\0\1\u0177\3\0\4\10\1\u02bc\2\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u01b9\5\10\1\u046b"+
+ "\22\0\2\10\1\u0395\2\10\1\u01bc\14\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\4\10\1\u046c"+
+ "\3\10\22\0\22\10\2\0\1\u046c\2\10\1\0\6\10"+
+ "\1\134\2\0\1\122\2\10\4\0\10\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\11\10\1\u01f1\10\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u046d\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\6\10\1\u046e\13\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u046f\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u0470"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\u0471\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\u0472\1\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u0473\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\14\10\1\u0474\5\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\7\10\1\u0475"+
+ "\12\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\4\10\1\u0476\15\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\10\10\1\u0477\11\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u0478\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\1\10\1\u0479\6\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u047a\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u047b\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\4\10\1\u03d9\2\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u047c\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\6\10\1\u047d\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\u047e\1\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\1\10\1\u047f\6\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u0480\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u0474\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0481\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\15\10\1\u013b"+
+ "\4\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u0482\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\7\10\1\u0483\12\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0484\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0485\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0486\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u0152\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\u0487"+
+ "\7\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u0487\15\10"+
+ "\2\0\3\10\57\0\1\u0488\104\0\1\u0489\77\0\1\u048a"+
+ "\22\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u048b"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u03ed\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u048c\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\6\10\1\u028a\1\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u048d\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u048e"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u048f\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\7\10\1\u0490\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0147"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\u0491\7\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0492\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u0493\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\243\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u01b9\5\10\1\134"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\7\10\1\u0494\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u0495"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u0496\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u0497\13\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+ "\1\u0498\10\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\7\10\1\u0499\12\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u040b\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\7\10\1\u049a\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\11\10\1\u013d\10\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u049b\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u049c\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\5\10\1\u049d\14\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\4\10\1\u049e\3\10\22\0"+
+ "\22\10\2\0\1\u049e\2\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\3\10\1\u049f\4\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u04a0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\u013d\7\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u03bd\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u04a1\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u04a2\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u04a3\20\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\4\10\1\375"+
+ "\10\10\1\u04a4\4\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\375\15\10"+
+ "\2\0\3\10\1\0\6\10\1\u04a5\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u04a6"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\5\10\1\u027a\14\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\2\10\1\u04a7"+
+ "\5\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\5\10\1\u04a8\14\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u01f1\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u04a9\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\6\10\1\u013b\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\4\10\1\u04aa\2\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u013b\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u04ab\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u04ac\11\10\2\0\3\10\1\0\6\10\1\243\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\5\10\1\u04ad\14\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u013d\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\10\10\1\u02e0\11\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u04ae\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u04af\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\4\10\1\u04b0\15\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u04b1"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u04b2\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u04b3"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u039f\13\10\1\u04b4"+
+ "\4\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\5\10\1\u04b5\14\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u01b9"+
+ "\2\10\1\u04b6\2\10\1\u01b4\22\0\2\10\1\u04b7\17\10"+
+ "\2\0\1\u04b6\2\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u04b8\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u01a5"+
+ "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04b9\17\10"+
+ "\2\0\3\10\62\0\1\u04ba\43\0\1\u0488\100\0\1\u01d6"+
+ "\57\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u04bb"+
+ "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u03bd\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u04bc\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u04bd\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\164\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u04be\6\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u04bf\20\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u04c0\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u04c1"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\300\1\10\1\u04c2\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u046a\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\1\u046a"+
+ "\21\10\2\0\1\10\1\u046a\1\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u040b\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u04c3\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\7\10"+
+ "\1\u04c4\12\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u04c5\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u04c6\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u04c7"+
+ "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u04c8\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u04c9\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\7\10\1\u04ca\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u04cb\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\6\10\1\u04cc"+
+ "\13\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\7\10\1\u04cd\12\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\14\10\1\u04ce\5\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u04cf\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\4\10\1\u04d0\2\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0138\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\7\10\1\u013d\12\10\2\0"+
+ "\3\10\1\0\6\10\1\u04d1\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\2\10\1\u04d2\5\10\22\0\22\10"+
+ "\2\0\3\10\1\0\6\10\1\u04d3\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\2\10\1\u03ee\5\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u04d4\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u04d5"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04d6\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\5\10\1\u0418\14\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\6\10\1\u04d7\1\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u04bb\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\14\10\1\u04d8\5\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u04d9"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\13\10\1\u04da\6\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\6\10\1\u04db"+
+ "\1\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u04dc\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\5\10\1\u04dd\2\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\11\10"+
+ "\1\u04de\10\10\2\0\3\10\55\0\1\u027c\25\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\10\10\1\u013d"+
+ "\11\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\3\10\1\u04df\4\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\7\10\1\u04e0"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u04e1\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\5\10"+
+ "\1\u04e2\2\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u04e3"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u04e4\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\5\10\1\u013d\14\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\6\10\1\u04e5\1\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\u04e6\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u04e7\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u04e8\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u04e9\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u04ea\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\2\10\1\u04ea\5\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\1\10\1\u04eb"+
+ "\6\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\4\10\1\u04ec\15\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u04ed\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u04ee\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\2\10\1\u04ef\5\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\2\10"+
+ "\1\u04f0\5\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\5\10\1\u01bc"+
+ "\14\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u04f1\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\2\10\1\u04f2\17\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\1\10\1\u04f3\6\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\11\10\1\u0350\10\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\7\10\1\u04f4\22\0"+
+ "\22\10\2\0\3\10\1\0\4\10\1\u04f5\2\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u04f6\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\1\10\1\u013b\20\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u032f\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\6\10"+
+ "\1\u04f7\13\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\5\10\1\u04f8\2\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u04f9\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u04fa\17\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\2\10\1\u04fb\17\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\10\10"+
+ "\1\u04ed\11\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\4\10\1\u04b6\3\10\22\0\22\10\2\0"+
+ "\1\u04b6\2\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\6\10\1\u04fc\1\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u04fd\15\10\2\0\3\10\1\0\6\10\1\u0173\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\6\10\1\u04fe\13\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\6\10\1\u04ff\13\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\3\10\1\u0500\4\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\4\10"+
+ "\1\u04c3\15\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\14\10\1\u0501\5\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\6\10\1\u0502\13\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\11\10\1\u0503"+
+ "\10\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\2\10\1\u0504\17\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\17\10\3\134\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\13\10\1\u03cc\6\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\11\10\1\u0505\10\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\2\10\1\u0506"+
+ "\17\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\7\10\1\u01fa\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\2\10"+
+ "\1\u0507\17\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\4\10\1\u04f8\15\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\3\10"+
+ "\1\u0508\4\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0509\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\6\10\1\u050a\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\5\10\1\u04a7\2\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\10\1\u050b\20\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\10\10\1\u038d\11\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u050c\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u038d\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\12\10\1\u02a2\7\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\6\10\1\u050d\1\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\7\10\1\u035b\12\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0262\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\5\10\1\u050e\14\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\7\10"+
+ "\1\u038d\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\2\10\1\u014a\17\10"+
+ "\2\0\3\10\1\0\6\10\1\u050f\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\5\10\1\u04ca\2\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\6\10\1\u01b5\13\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u0510"+
+ "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\10\10\1\u0511\11\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\6\10\1\u0512\13\10\2\0\3\10\1\0"+
+ "\1\10\1\u0513\5\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\6\10\1\u0514\1\10\22\0\22\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\1\10"+
+ "\1\u039c\6\10\22\0\22\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\1\10\1\u0515\6\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\1\10\1\u0516\6\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\300"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\5\10\1\u0246\2\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0139\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\2\10\1\u0517\5\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\1\u03ed\21\10\2\0\1\10"+
+ "\1\u03ed\1\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\4\10\1\u0518\15\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\1\10\1\u0519\1\u051a"+
+ "\2\10\1\u051b\1\10\1\u051c\22\0\1\u051d\3\10\1\u03f1"+
+ "\1\10\1\u051e\13\10\2\0\1\10\1\u051d\1\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u051f\4\10"+
+ "\22\0\22\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u0520\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\14\10\1\u0521\5\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\10\10\22\0\13\10\1\u038d"+
+ "\6\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\6\10\1\u0522\1\10\22\0\22\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\3\10\1\u0523"+
+ "\4\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\3\10\1\u0524\4\10\22\0\22\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\2\10\1\200\5\10\22\0\22\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\14\10"+
+ "\1\220\5\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\2\10\1\u0525\17\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\4\10"+
+ "\1\u0526\3\10\22\0\22\10\2\0\1\u0526\2\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\10\10\22\0\5\10"+
+ "\1\u015a\14\10\2\0\3\10\1\0\7\10\2\0\1\122"+
+ "\2\10\4\0\10\10\22\0\11\10\1\u01b4\10\10\2\0"+
+ "\3\10\1\0\7\10\2\0\1\122\2\10\4\0\10\10"+
+ "\22\0\1\10\1\u039c\20\10\2\0\3\10\1\0\7\10"+
+ "\2\0\1\122\2\10\4\0\3\10\1\u0527\4\10\22\0"+
+ "\22\10\2\0\3\10\1\0\7\10\2\0\1\122\2\10"+
+ "\4\0\10\10\22\0\11\10\1\370\10\10\2\0\3\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\5\10\1\u0528"+
+ "\2\10\22\0\22\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\7\10\1\u0529\12\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\4\10\1\u0199\3\10\22\0\22\10\2\0\1\u0199\2\10"+
+ "\1\0\7\10\2\0\1\122\2\10\4\0\10\10\22\0"+
+ "\15\10\1\u052a\4\10\2\0\3\10\1\0\7\10\2\0"+
+ "\1\122\2\10\4\0\10\10\22\0\7\10\1\u019f\12\10"+
+ "\2\0\3\10\1\0\7\10\2\0\1\122\2\10\4\0"+
+ "\10\10\22\0\7\10\1\u01e1\12\10\2\0\3\10\1\0"+
+ "\7\10\2\0\1\122\2\10\4\0\3\10\1\u0246\4\10"+
+ "\22\0\22\10\2\0\3\10";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[84678];
+ 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 =
+ "\6\0\1\11\5\1\2\11\2\1\1\11\12\1\1\11"+
+ "\5\1\1\11\1\1\1\11\15\1\1\11\1\1\1\11"+
+ "\2\1\1\11\2\1\2\11\3\1\2\11\1\1\1\11"+
+ "\10\1\1\11\6\1\1\0\12\1\1\11\5\1\1\0"+
+ "\55\1\1\0\1\1\13\0\45\1\1\11\1\1\1\0"+
+ "\1\1\1\0\1\11\4\1\4\0\4\1\5\0\20\1"+
+ "\1\0\11\1\1\0\62\1\10\0\1\1\2\0\1\11"+
+ "\3\0\76\1\4\0\4\1\4\0\4\1\5\0\14\1"+
+ "\1\0\6\1\1\11\65\1\16\0\75\1\2\0\1\11"+
+ "\2\0\1\11\4\1\2\0\4\1\3\0\11\1\1\0"+
+ "\101\1\14\0\73\1\4\0\1\1\2\0\1\1\3\0"+
+ "\10\1\1\0\66\1\7\0\65\1\4\0\12\1\1\0"+
+ "\60\1\5\0\55\1\4\0\7\1\1\0\56\1\3\0"+
+ "\50\1\2\0\44\1\3\0\101\1\3\0\57\1\1\0"+
+ "\160\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[1322];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public NSISTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ break;
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public NSISTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public NSISTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 204) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 37: break;
+ case 34:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 38: break;
+ case 29:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 39: break;
+ case 19:
+ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+ return firstToken;
+ }
+ case 40: break;
+ case 27:
+ { /* Skip all escaped chars. */
+ }
+ case 41: break;
+ case 24:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 42: break;
+ case 3:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 43: break;
+ case 32:
+ { addToken(Token.FUNCTION);
+ }
+ case 44: break;
+ case 8:
+ { addToken(Token.VARIABLE);
+ }
+ case 45: break;
+ case 16:
+ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ return firstToken;
+ }
+ case 46: break;
+ case 14:
+ { /* Line ending in '\' => continue to next line. */
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ return firstToken;
+ }
+ case 47: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken;
+ }
+ case 48: break;
+ case 18:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 49: break;
+ case 25:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 50: break;
+ case 26:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 51: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 52: break;
+ case 30:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 53: break;
+ case 10:
+ { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+ }
+ case 54: break;
+ case 2:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 55: break;
+ case 28:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 56: break;
+ case 4:
+ { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+ }
+ case 57: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+ }
+ case 58: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 59: break;
+ case 15:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+ }
+ case 60: break;
+ case 31:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 61: break;
+ case 35:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 62: break;
+ case 20:
+ { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 63: break;
+ case 23:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 64: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 65: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 66: break;
+ case 22:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 67: break;
+ case 7:
+ { addToken(Token.OPERATOR);
+ }
+ case 68: break;
+ case 36:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 69: break;
+ case 33:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 70: break;
+ case 11:
+ { start = zzMarkedPos-1; yybegin(BACKTICKS);
+ }
+ case 71: break;
+ case 12:
+ {
+ }
+ case 72: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 1323: break;
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); return firstToken;
+ }
+ case 1324: break;
+ case CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.ERROR_CHAR); return firstToken;
+ }
+ case 1325: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 1326: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 1327: break;
+ case BACKTICKS: {
+ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 1328: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex
new file mode 100644
index 0000000..bcb9e1d
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex
@@ -0,0 +1,2319 @@
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated PHPTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+%%
+
+%public
+%class PHPTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to PHPTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ private static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to PHPTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ private static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specifying that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ private static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ private static final int INTERNAL_IN_JS = -10;
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -15;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ private static final int INTERNAL_CSS = -16;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ private static final int INTERNAL_CSS_PROPERTY = -17;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ private static final int INTERNAL_CSS_VALUE = -18;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * Token type specifying we're in PHP. This particular field is public so
+ * that we can hack and key off of it for code completion.
+ */
+ public static final int INTERNAL_IN_PHP = -(4<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline comment.
+ */
+ private static final int INTERNAL_IN_PHP_MLC = -(5<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline string.
+ */
+ private static final int INTERNAL_IN_PHP_STRING = -(6<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline char.
+ */
+ private static final int INTERNAL_IN_PHP_CHAR = -(7<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * Whether closing markup tags are automatically completed for PHP.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+ */
+ private int phpInState;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PHPTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.FUNCTION || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ phpInState = YYINITIAL; // Shouldn't be necessary
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = LANG_INDEX_DEFAULT;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_PHP:
+ state = PHP;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_MLC:
+ state = PHP_MLC;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_STRING:
+ state = PHP_STRING;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_CHAR:
+ state = PHP_CHAR;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ }
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+// HTML-specific stuff.
+Whitespace = ([ \t\f]+)
+LineTerminator = ([\n])
+Identifier = ([^ \t\n<&]+)
+EntityReference = ([&][^; \t]*[;]?)
+InTagIdentifier = ([^ \t\n\"\'/=>]+)
+EndScriptTag = ("</" [sS][cC][rR][iI][pP][tT] ">")
+EndStyleTag = ("</" [sS][tT][yY][lL][eE] ">")
+
+
+// General stuff.
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+LetterOrUnderscore = ({Letter}|"_")
+LetterOrUnderscoreOrDash = ({LetterOrUnderscore}|[\-])
+
+
+// JavaScript stuff.
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({Letter}|"_"|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+JS_MLCBegin = "/*"
+JS_MLCEnd = "*/"
+JS_LineCommentBegin = "//"
+JS_IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+JS_IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+JS_IntegerLiteral = ({JS_IntegerHelper1}[lL]?)
+JS_HexLiteral = ({JS_IntegerHelper2}[lL]?)
+JS_FloatHelper1 = ([fFdD]?)
+JS_FloatHelper2 = ([eE][+-]?{Digit}+{JS_FloatHelper1})
+JS_FloatLiteral1 = ({Digit}+"."({JS_FloatHelper1}|{JS_FloatHelper2}|{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2})))
+JS_FloatLiteral2 = ("."{Digit}+({JS_FloatHelper1}|{JS_FloatHelper2}))
+JS_FloatLiteral3 = ({Digit}+{JS_FloatHelper2})
+JS_FloatLiteral = ({JS_FloatLiteral1}|{JS_FloatLiteral2}|{JS_FloatLiteral3}|({Digit}+[fFdD]))
+JS_ErrorNumberFormat = (({JS_IntegerLiteral}|{JS_HexLiteral}|{JS_FloatLiteral}){NonSeparator}+)
+JS_Separator = ([\(\)\{\}\[\]\]])
+JS_Separator2 = ([\;,.])
+JS_NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>")
+JS_AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+JS_Operator = ({JS_NonAssignmentOperator}|{JS_AssignmentOperator})
+JS_Identifier = ({IdentifierStart}{IdentifierPart}*)
+JS_ErrorIdentifier = ({NonSeparator}+)
+JS_Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[gim]*)
+BooleanLiteral = ("true"|"false")
+
+
+// PHP stuff (most PHP stuff is shared with JS for simplicity)
+PHP_Start = ("<?""php"?)
+LetterOrUnderscoreOrDigit = ({LetterOrUnderscore}|{Digit})
+PHP_Variable = ("$"{LetterOrUnderscore}{LetterOrUnderscoreOrDigit}*)
+PHP_LineCommentBegin = ("//"|[#])
+
+
+// CSS stuff.
+CSS_SelectorPiece = (("*"|"."|{LetterOrUnderscoreOrDash})({LetterOrUnderscoreOrDash}|"."|{Digit})*)
+CSS_PseudoClass = (":"("root"|"nth-child"|"nth-last-child"|"nth-of-type"|"nth-last-of-type"|"first-child"|"last-child"|"first-of-type"|"last-of-type"|"only-child"|"only-of-type"|"empty"|"link"|"visited"|"active"|"hover"|"focus"|"target"|"lang"|"enabled"|"disabled"|"checked"|":first-line"|":first-letter"|":before"|":after"|"not"))
+CSS_AtKeyword = ("@"{CSS_SelectorPiece})
+CSS_Id = ("#"{CSS_SelectorPiece})
+CSS_Separator = ([;\(\)\[\]])
+CSS_MlcStart = ({JS_MLCBegin})
+CSS_MlcEnd = ({JS_MLCEnd})
+CSS_Property = ([\*]?{LetterOrUnderscoreOrDash}({LetterOrUnderscoreOrDash}|{Digit})*)
+CSS_ValueChar = ({LetterOrUnderscoreOrDash}|[\\/])
+CSS_Value = ({CSS_ValueChar}*)
+CSS_Function = ({CSS_Value}\()
+CSS_Digits = ([\-]?{Digit}+([0-9\.]+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%)?)
+CSS_Hex = ("#"[0-9a-fA-F]+)
+CSS_Number = ({CSS_Digits}|{CSS_Hex})
+
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscoreOrDigit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state DTD
+%state INTAG
+%state INTAG_CHECK_TAG_NAME
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state INTAG_SCRIPT
+%state INATTR_DOUBLE_SCRIPT
+%state INATTR_SINGLE_SCRIPT
+%state INTAG_STYLE
+%state INATTR_DOUBLE_STYLE
+%state INATTR_SINGLE_STYLE
+%state JAVASCRIPT
+%state JS_CHAR
+%state JS_STRING
+%state JS_MLC
+%state JS_EOL_COMMENT
+%state PHP
+%state PHP_MLC
+%state PHP_STRING
+%state PHP_CHAR
+%state CSS
+%state CSS_PROPERTY
+%state CSS_VALUE
+%state CSS_STRING
+%state CSS_CHAR_LITERAL
+%state CSS_C_STYLE_COMMENT
+
+
+%%
+
+<YYINITIAL> {
+ "<!--" { start = zzMarkedPos-4; yybegin(COMMENT); }
+ "<"[sS][cC][rR][iI][pP][tT] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ "<"[sS][tT][yY][lL][eE] {
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ "<!" { start = zzMarkedPos-2; yybegin(DTD); }
+ {PHP_Start} { addToken(Token.MARKUP_TAG_DELIMITER); phpInState = zzLexicalState; yybegin(PHP); }
+ "<"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "</"({Letter}|{Digit})+ {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); } // Catches everything.
+ {EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ "-->" { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken; }
+}
+
+<DTD> {
+ [^\n>]+ {}
+ ">" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken; }
+}
+
+<INTAG_CHECK_TAG_NAME> {
+ [Aa] |
+ [aA][bB][bB][rR] |
+ [aA][cC][rR][oO][nN][yY][mM] |
+ [aA][dD][dD][rR][eE][sS][sS] |
+ [aA][pP][pP][lL][eE][tT] |
+ [aA][rR][eE][aA] |
+ [aA][rR][tT][iI][cC][lL][eE] |
+ [aA][sS][iI][dD][eE] |
+ [aA][uU][dD][iI][oO] |
+ [bB] |
+ [bB][aA][sS][eE] |
+ [bB][aA][sS][eE][fF][oO][nN][tT] |
+ [bB][dD][oO] |
+ [bB][gG][sS][oO][uU][nN][dD] |
+ [bB][iI][gG] |
+ [bB][lL][iI][nN][kK] |
+ [bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE] |
+ [bB][oO][dD][yY] |
+ [bB][rR] |
+ [bB][uU][tT][tT][oO][nN] |
+ [cC][aA][nN][vV][aA][sS] |
+ [cC][aA][pP][tT][iI][oO][nN] |
+ [cC][eE][nN][tT][eE][rR] |
+ [cC][iI][tT][eE] |
+ [cC][oO][dD][eE] |
+ [cC][oO][lL] |
+ [cC][oO][lL][gG][rR][oO][uU][pP] |
+ [cC][oO][mM][mM][aA][nN][dD] |
+ [cC][oO][mM][mM][eE][nN][tT] |
+ [dD][dD] |
+ [dD][aA][tT][aA][gG][rR][iI][dD] |
+ [dD][aA][tT][aA][lL][iI][sS][tT] |
+ [dD][aA][tT][aA][tT][eE][mM][pP][lL][aA][tT][eE] |
+ [dD][eE][lL] |
+ [dD][eE][tT][aA][iI][lL][sS] |
+ [dD][fF][nN] |
+ [dD][iI][aA][lL][oO][gG] |
+ [dD][iI][rR] |
+ [dD][iI][vV] |
+ [dD][lL] |
+ [dD][tT] |
+ [eE][mM] |
+ [eE][mM][bB][eE][dD] |
+ [eE][vV][eE][nN][tT][sS][oO][uU][rR][cC][eE] |
+ [fF][iI][eE][lL][dD][sS][eE][tT] |
+ [fF][iI][gG][uU][rR][eE] |
+ [fF][oO][nN][tT] |
+ [fF][oO][oO][tT][eE][rR] |
+ [fF][oO][rR][mM] |
+ [fF][rR][aA][mM][eE] |
+ [fF][rR][aA][mM][eE][sS][eE][tT] |
+ [hH][123456] |
+ [hH][eE][aA][dD] |
+ [hH][eE][aA][dD][eE][rR] |
+ [hH][rR] |
+ [hH][tT][mM][lL] |
+ [iI] |
+ [iI][fF][rR][aA][mM][eE] |
+ [iI][lL][aA][yY][eE][rR] |
+ [iI][mM][gG] |
+ [iI][nN][pP][uU][tT] |
+ [iI][nN][sS] |
+ [iI][sS][iI][nN][dD][eE][xX] |
+ [kK][bB][dD] |
+ [kK][eE][yY][gG][eE][nN] |
+ [lL][aA][bB][eE][lL] |
+ [lL][aA][yY][eE][rR] |
+ [lL][eE][gG][eE][nN][dD] |
+ [lL][iI] |
+ [lL][iI][nN][kK] |
+ [mM][aA][pP] |
+ [mM][aA][rR][kK] |
+ [mM][aA][rR][qQ][uU][eE][eE] |
+ [mM][eE][nN][uU] |
+ [mM][eE][tT][aA] |
+ [mM][eE][tT][eE][rR] |
+ [mM][uU][lL][tT][iI][cC][oO][lL] |
+ [nN][aA][vV] |
+ [nN][eE][sS][tT] |
+ [nN][oO][bB][rR] |
+ [nN][oO][eE][mM][bB][eE][dD] |
+ [nN][oO][fF][rR][aA][mM][eE][sS] |
+ [nN][oO][lL][aA][yY][eE][rR] |
+ [nN][oO][sS][cC][rR][iI][pP][tT] |
+ [oO][bB][jJ][eE][cC][tT] |
+ [oO][lL] |
+ [oO][pP][tT][gG][rR][oO][uU][pP] |
+ [oO][pP][tT][iI][oO][nN] |
+ [oO][uU][tT][pP][uU][tT] |
+ [pP] |
+ [pP][aA][rR][aA][mM] |
+ [pP][lL][aA][iI][nN][tT][eE][xX][tT] |
+ [pP][rR][eE] |
+ [pP][rR][oO][gG][rR][eE][sS][sS] |
+ [qQ] |
+ [rR][uU][lL][eE] |
+ [sS] |
+ [sS][aA][mM][pP] |
+ [sS][cC][rR][iI][pP][tT] |
+ [sS][eE][cC][tT][iI][oO][nN] |
+ [sS][eE][lL][eE][cC][tT] |
+ [sS][eE][rR][vV][eE][rR] |
+ [sS][mM][aA][lL][lL] |
+ [sS][oO][uU][rR][cC][eE] |
+ [sS][pP][aA][cC][eE][rR] |
+ [sS][pP][aA][nN] |
+ [sS][tT][rR][iI][kK][eE] |
+ [sS][tT][rR][oO][nN][gG] |
+ [sS][tT][yY][lL][eE] |
+ [sS][uU][bB] |
+ [sS][uU][pP] |
+ [tT][aA][bB][lL][eE] |
+ [tT][bB][oO][dD][yY] |
+ [tT][dD] |
+ [tT][eE][xX][tT][aA][rR][eE][aA] |
+ [tT][fF][oO][oO][tT] |
+ [tT][hH] |
+ [tT][hH][eE][aA][dD] |
+ [tT][iI][mM][eE] |
+ [tT][iI][tT][lL][eE] |
+ [tT][rR] |
+ [tT][tT] |
+ [uU] |
+ [uU][lL] |
+ [vV][aA][rR] |
+ [vV][iI][dD][eE][oO] { addToken(Token.MARKUP_TAG_NAME); }
+ {InTagIdentifier} { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG); }
+ . { /* Shouldn't happen */ yypushback(1); yybegin(INTAG); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INTAG> {
+ {PHP_Start} { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+ {PHP_Start} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ [^\"<]* {}
+ "<" { /* Allowing "<?" and "<?php" to start PHP */ }
+ [\"] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+ {PHP_Start} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ [^\'<]* {}
+ "<" { /* Allowing "<?" and "<?php" to start PHP */ }
+ [\'] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<INTAG_SCRIPT> {
+ {PHP_Start} { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken; }
+}
+
+<INATTR_DOUBLE_SCRIPT> {
+ {PHP_Start} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ [^\"<]* {}
+ "<" { /* Allowing "<?" and "<?php" to start PHP */ }
+ [\"] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INATTR_SINGLE_SCRIPT> {
+ {PHP_Start} { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+ [^\'<]* {}
+ "<" { /* Allowing "<?" and "<?php" to start PHP */ }
+ [\'] { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken; }
+}
+
+<INTAG_STYLE> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ "/>" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); } // Won't appear in valid HTML.
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE); }
+ <<EOF>> { addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken; }
+}
+
+<INATTR_DOUBLE_STYLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken; }
+}
+
+<INATTR_SINGLE_STYLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken; }
+}
+
+<JAVASCRIPT> {
+
+ {EndScriptTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+
+ // ECMA 3+ keywords.
+ "break" |
+ "continue" |
+ "delete" |
+ "else" |
+ "for" |
+ "function" |
+ "if" |
+ "in" |
+ "new" |
+ "this" |
+ "typeof" |
+ "var" |
+ "void" |
+ "while" |
+ "with" { addToken(Token.RESERVED_WORD); }
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ //JavaScript 1.6
+ "each" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+ //JavaScript 1.7
+ "let" {if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);} }
+
+ // Reserved (but not yet used) ECMA keywords.
+ "abstract" { addToken(Token.RESERVED_WORD); }
+ "boolean" { addToken(Token.DATA_TYPE); }
+ "byte" { addToken(Token.DATA_TYPE); }
+ "case" { addToken(Token.RESERVED_WORD); }
+ "catch" { addToken(Token.RESERVED_WORD); }
+ "char" { addToken(Token.DATA_TYPE); }
+ "class" { addToken(Token.RESERVED_WORD); }
+ "const" { addToken(Token.RESERVED_WORD); }
+ "debugger" { addToken(Token.RESERVED_WORD); }
+ "default" { addToken(Token.RESERVED_WORD); }
+ "do" { addToken(Token.RESERVED_WORD); }
+ "double" { addToken(Token.DATA_TYPE); }
+ "enum" { addToken(Token.RESERVED_WORD); }
+ "export" { addToken(Token.RESERVED_WORD); }
+ "extends" { addToken(Token.RESERVED_WORD); }
+ "final" { addToken(Token.RESERVED_WORD); }
+ "finally" { addToken(Token.RESERVED_WORD); }
+ "float" { addToken(Token.DATA_TYPE); }
+ "goto" { addToken(Token.RESERVED_WORD); }
+ "implements" { addToken(Token.RESERVED_WORD); }
+ "import" { addToken(Token.RESERVED_WORD); }
+ "instanceof" { addToken(Token.RESERVED_WORD); }
+ "int" { addToken(Token.DATA_TYPE); }
+ "interface" { addToken(Token.RESERVED_WORD); }
+ "long" { addToken(Token.DATA_TYPE); }
+ "native" { addToken(Token.RESERVED_WORD); }
+ "package" { addToken(Token.RESERVED_WORD); }
+ "private" { addToken(Token.RESERVED_WORD); }
+ "protected" { addToken(Token.RESERVED_WORD); }
+ "public" { addToken(Token.RESERVED_WORD); }
+ "short" { addToken(Token.DATA_TYPE); }
+ "static" { addToken(Token.RESERVED_WORD); }
+ "super" { addToken(Token.RESERVED_WORD); }
+ "switch" { addToken(Token.RESERVED_WORD); }
+ "synchronized" { addToken(Token.RESERVED_WORD); }
+ "throw" { addToken(Token.RESERVED_WORD); }
+ "throws" { addToken(Token.RESERVED_WORD); }
+ "transient" { addToken(Token.RESERVED_WORD); }
+ "try" { addToken(Token.RESERVED_WORD); }
+ "volatile" { addToken(Token.RESERVED_WORD); }
+ "null" { addToken(Token.RESERVED_WORD); }
+
+ // Literals.
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+ "NaN" { addToken(Token.RESERVED_WORD); }
+ "Infinity" { addToken(Token.RESERVED_WORD); }
+
+ // Functions.
+ "eval" |
+ "parseInt" |
+ "parseFloat" |
+ "escape" |
+ "unescape" |
+ "isNaN" |
+ "isFinite" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_JS); return firstToken; }
+ {JS_Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ [\'] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR); }
+ [\"] { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING); }
+
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(JS_MLC); }
+ {JS_LineCommentBegin} { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT); }
+
+ /* Attempt to identify regular expressions (not foolproof) - do after comments! */
+ {JS_Regex} {
+ boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* Separators. */
+ {JS_Separator} { addToken(Token.SEPARATOR); }
+ {JS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ {PHP_Start} { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP); }
+
+ /* Operators. */
+ {JS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<JS_STRING> {
+ [^\n\\\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ \" { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_CHAR> {
+ [^\n\\\']+ {}
+ \n { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ \\x{HexDigit}{2} {}
+ \\x { /* Invalid latin-1 character \xXX */ validJSString = false; }
+ \\u{HexDigit}{4} {}
+ \\u { /* Invalid Unicode character \\uXXXX */ validJSString = false; }
+ \\. { /* Skip all escaped chars. */ }
+ \\ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ \' { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken; }
+}
+
+<JS_MLC> {
+ // JavaScript MLC's. This state is essentially Java's MLC state.
+ [^hwf<\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ yybegin(YYINITIAL);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+ {JS_MLCEnd} { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken; }
+}
+
+
+<JS_EOL_COMMENT> {
+ [^hwf<\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ {EndScriptTag} {
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ "<" {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken; }
+
+}
+
+
+<CSS> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_SelectorPiece} { addToken(Token.DATA_TYPE); }
+ {CSS_PseudoClass} { addToken(Token.RESERVED_WORD); }
+ ":" { /* Unknown pseudo class */ addToken(Token.DATA_TYPE); }
+ {CSS_AtKeyword} { addToken(Token.REGEX); }
+ {CSS_Id} { addToken(Token.VARIABLE); }
+ "{" { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY); }
+ [,] { addToken(Token.IDENTIFIER); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ [+>~\^$\|=] { addToken(Token.OPERATOR); }
+ {CSS_Separator} { addToken(Token.SEPARATOR); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS); return firstToken; }
+}
+
+<CSS_PROPERTY> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Property} { addToken(Token.RESERVED_WORD); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ ":" { addToken(Token.OPERATOR); yybegin(CSS_VALUE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken; }
+}
+
+<CSS_VALUE> {
+ {EndStyleTag} {
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ {CSS_Value} { addToken(Token.IDENTIFIER); }
+ "!important" { addToken(Token.ANNOTATION); }
+ {CSS_Function} { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ {CSS_Number} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ \" { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING); }
+ \' { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL); }
+ ")" { /* End of a function */ addToken(Token.SEPARATOR); }
+ [;] { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY); }
+ [,\.] { addToken(Token.IDENTIFIER); }
+ "}" { addToken(Token.SEPARATOR); yybegin(CSS); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {CSS_MlcStart} { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT); }
+ . { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER); }
+ "\n" |
+ <<EOF>> { addEndToken(INTERNAL_CSS_VALUE); return firstToken; }
+}
+
+<CSS_STRING> {
+ [^\n\\\"]+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \" { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken; }
+}
+
+<CSS_CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped chars. */ }
+ \' { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState); }
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken; }
+}
+
+<CSS_C_STYLE_COMMENT> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {CSS_MlcEnd} { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken; }
+}
+
+
+<PHP> {
+
+ "?>" { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(phpInState); }
+
+ /* Error control operator */
+ ("@"{JS_Identifier}) {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ }
+
+ /* Keywords */
+ "__CLASS__" |
+ "__DIR__" |
+ "__FILE__" |
+ "__FUNCTION__" |
+ "__METHOD__" |
+ "__NAMESPACE__" |
+ "abstract" |
+ "and" |
+ "array" |
+ "as" |
+ "break" |
+ "case" |
+ "catch" |
+ "cfunction" |
+ "class" |
+ "clone" |
+ "const" |
+ "continue" |
+ "declare" |
+ "default" |
+ "die" |
+ "do" |
+ "echo" |
+ "else" |
+ "elseif" |
+ "empty" |
+ "enddeclare" |
+ "endfor" |
+ "endforeach" |
+ "endif" |
+ "endswitch" |
+ "endwhile" |
+ "eval" |
+ "extends" |
+ "final" |
+ "for" |
+ "foreach" |
+ "function" |
+ "global" |
+ "goto" |
+ "if" |
+ "implements" |
+ "include" |
+ "include_once" |
+ "interface" |
+ "instanceof" |
+ "isset" |
+ "list" |
+ "namespace" |
+ "new" |
+ "old_function" |
+ "or" |
+ "print" |
+ "private" |
+ "protected" |
+ "public" |
+ "require" |
+ "require_once" |
+ "static" |
+ "switch" |
+ "throw" |
+ "try" |
+ "unset" |
+ "use" |
+ "var" |
+ "while" |
+ "xor" |
+
+ "parent" |
+ "self" |
+ "stdClass" { addToken(Token.RESERVED_WORD); }
+
+ "exit" |
+ "return" { addToken(Token.RESERVED_WORD_2); }
+
+ /* Functions */
+ "__call" |
+ "__construct" |
+ "__getfunctions" |
+ "__getlastrequest" |
+ "__getlastresponse" |
+ "__gettypes" |
+ "__tostring" |
+ "abs" |
+ "acos" |
+ "acosh" |
+ "add" |
+ ("add"("_namespace"|"_root"|"action"|"color"|"cslashes"|"entry"|"fill"|"function"|"shape"|"slashes"|"string")) |
+ "aggregate" |
+ "aggregate_info" |
+ "aggregate_methods" |
+ "aggregate_methods_by_list" |
+ "aggregate_methods_by_regexp" |
+ "aggregate_properties" |
+ "aggregate_properties_by_list" |
+ "aggregate_properties_by_regexp" |
+ "aggregation_info" |
+ "align" |
+ ("apd_"("breakpoint"|"callstack"|"clunk"|"continue"|"croak"|"dump_function_table"|"dump_persistent_resources"|"dump_regular_resources"|"echo"|"get_active_symbols"|"set_pprof_trace"|"set_session"|"set_session_trace"|"set_socket_session_trace")) |
+ "append" |
+ "append_child" |
+ "append_sibling" |
+ "appendchild" |
+ "appenddata" |
+ ("array_"("change_key_case"|"chunk"|"combine"|"count_values"|"diff"|"diff_assoc"|"diff_key"|"diff_uassoc"|"diff_ukey"|"fill"|"filter"|"flip"|"intersect"|"intersect_assoc"|"intersect_key"|"intersect_uassoc"|"intersect_ukey"|"key_exists"|"keys"|"map"|"merge"|"merge_recursive"|"multisort"|"pad"|"pop"|"push"|"rand"|"reduce"|"reverse"|"search"|"shift"|"slice"|"splice"|"sum"|"udiff"|"udiff_assoc"|"udiff_uassoc"|"uintersect"|"uintersect_assoc"|"uintersect_uassoc"|"unique"|"unshift"|"values"|"w [...]
+ "arsort" |
+ "ascii2ebcdic" |
+ "asin" |
+ "asinh" |
+ "asort" |
+ "assert" |
+ "assert_options" |
+ "assign" |
+ "assignelem" |
+ "asxml" |
+ "atan" |
+ "atan2" |
+ "atanh" |
+ "attreditable" |
+ "attributes" |
+ "base64_decode" |
+ "base64_encode" |
+ "base_convert" |
+ "basename" |
+ "bcadd" |
+ "bccomp" |
+ "bcdiv" |
+ "bcmod" |
+ "bcmul" |
+ "bcpow" |
+ "bcpowmod" |
+ "bcscale" |
+ "bcsqrt" |
+ "bcsub" |
+ "begintransaction" |
+ "bin2hex" |
+ "bind_textdomain_codeset" |
+ "bindcolumn" |
+ "bindec" |
+ "bindparam" |
+ "bindtextdomain" |
+ "bzclose" |
+ "bzcompress" |
+ "bzdecompress" |
+ "bzerrno" |
+ "bzerror" |
+ "bzerrstr" |
+ "bzflush" |
+ "bzopen" |
+ "bzread" |
+ "bzwrite" |
+ "cal_days_in_month" |
+ "cal_from_jd" |
+ "cal_info" |
+ "cal_to_jd" |
+ "call_user_func" |
+ "call_user_func_array" |
+ "call_user_method" |
+ "call_user_method_array" |
+ ("ccvs_"("add"|"auth"|"command"|"count"|"delete"|"done"|"init"|"lookup"|"new"|"report"|"return"|"reverse"|"sale"|"status"|"textvalue"|"void")) |
+ "ceil" |
+ "chdir" |
+ "checkdate" |
+ "checkdnsrr" |
+ "checkin" |
+ "checkout" |
+ "chgrp" |
+ "child_nodes" |
+ "children" |
+ "chmod" |
+ "chop" |
+ "chown" |
+ "chr" |
+ "chroot" |
+ "chunk_split" |
+ "class_exists" |
+ "class_implements" |
+ "class_parents" |
+ "classkit_import" |
+ "classkit_method_add" |
+ "classkit_method_copy" |
+ "classkit_method_redefine" |
+ "classkit_method_remove" |
+ "classkit_method_rename" |
+ "clearstatcache" |
+ "clone_node" |
+ "clonenode" |
+ "close" |
+ "closedir" |
+ "closelog" |
+ "com" |
+ "commit" |
+ "compact" |
+ "connect" |
+ "connection_aborted" |
+ "connection_status" |
+ "connection_timeout" |
+ "constant" |
+ "content" |
+ "convert_cyr_string" |
+ "convert_uudecode" |
+ "convert_uuencode" |
+ "copy" |
+ "cos" |
+ "cosh" |
+ "count" |
+ "count_chars" |
+ "crack_check" |
+ "crack_closedict" |
+ "crack_getlastmessage" |
+ "crack_opendict" |
+ "crc32" |
+ ("create"("_attribute"|"_cdata_section"|"_comment"|"_element"|"_element_ns"|"_entity_reference"|"_function"|"_processing_instruction"|"_text_node"|"attribute"|"attributens"|"cdatasection"|"comment"|"document"|"documentfragment"|"documenttype"|"element"|"elementns"|"entityreference"|"processinginstruction"|"textnode")) |
+ "crypt" |
+ ("curl_"("close"|"copy_handle"|"errno"|"error"|"exec"|"getinfo"|"init"|"multi_add_handle"|"multi_close"|"multi_exec"|"multi_getcontent"|"multi_info_read"|"multi_init"|"multi_remove_handle"|"multi_select"|"setopt"|"version")) |
+ "current" |
+ "cybercash_base64_decode" |
+ "cybercash_base64_encode" |
+ "cybercash_decr" |
+ "cybercash_encr" |
+ "cyrus_authenticate" |
+ "cyrus_bind" |
+ "cyrus_close" |
+ "cyrus_connect" |
+ "cyrus_query" |
+ "cyrus_unbind" |
+ "data" |
+ "date" |
+ "date_sunrise" |
+ "date_sunset" |
+ "dblist" |
+ "dbmclose" |
+ "dbmdelete" |
+ "dbmexists" |
+ "dbmfetch" |
+ "dbmfirstkey" |
+ "dbminsert" |
+ "dbmnextkey" |
+ "dbmopen" |
+ "dbmreplace" |
+ "dbstat" |
+ "dcgettext" |
+ "dcngettext" |
+ "dcstat" |
+ "deaggregate" |
+ "debug_backtrace" |
+ "debug_print_backtrace" |
+ "debug_zval_dump" |
+ "debugger_off" |
+ "debugger_on" |
+ "decbin" |
+ "dechex" |
+ "decoct" |
+ "decrement" |
+ "define" |
+ "define_syslog_variables" |
+ "defined" |
+ "deg2rad" |
+ "delete" |
+ "deletedata" |
+ "description" |
+ "dgettext" |
+ ("dio_"("close"|"fcntl"|"open"|"read"|"seek"|"stat"|"tcsetattr"|"truncate"|"write")) |
+ "dir" |
+ "dirname" |
+ "disk_free_space" |
+ "disk_total_space" |
+ "diskfreespace" |
+ "dl" |
+ "dngettext" |
+ "dns_check_record" |
+ "dns_get_mx" |
+ "dns_get_record" |
+ "doctype" |
+ "document_element" |
+ "dom_import_simplexml" |
+ ("domxml_"("new_doc"|"open_file"|"open_mem"|"version"|"xmltree"|"xslt_stylesheet"|"xslt_stylesheet_doc"|"xslt_stylesheet_file")) |
+ "dotnet" |
+ "dotnet_load" |
+ "doubleval" |
+ "drawcurve" |
+ "drawcurveto" |
+ "drawline" |
+ "drawlineto" |
+ "dstanchors" |
+ "dstofsrcanchors" |
+ "dump_file" |
+ "dump_mem" |
+ "dump_node" |
+ "each" |
+ "easter_date" |
+ "easter_days" |
+ "ebcdic2ascii" |
+ "end" |
+ "entities" |
+ "eof" |
+ "erase" |
+ "ereg" |
+ "ereg_replace" |
+ "eregi" |
+ "eregi_replace" |
+ "error_log" |
+ "error_reporting" |
+ "errorcode" |
+ "errorinfo" |
+ "escapeshellarg" |
+ "escapeshellcmd" |
+ "exec" |
+ "execute" |
+ "exif_imagetype" |
+ "exif_read_data" |
+ "exif_tagname" |
+ "exif_thumbnail" |
+ "exp" |
+ "explode" |
+ "expm1" |
+ "export" |
+ "extension_loaded" |
+ "extract" |
+ "ezmlm_hash" |
+ "fclose" |
+ "feof" |
+ "fetch" |
+ "fetchall" |
+ "fetchsingle" |
+ "fflush" |
+ "fgetc" |
+ "fgetcsv" |
+ "fgets" |
+ "fgetss" |
+ "file" |
+ ("file"("_exists"|"_get_contents"|"_put_contents"|"atime"|"ctime"|"group"|"inode"|"mtime"|"owner"|"perms"|"pro"|"pro_fieldcount"|"pro_fieldname"|"pro_fieldtype"|"pro_fieldwidth"|"pro_retrieve"|"pro_rowcount"|"size"|"type")) |
+ "find" |
+ "first_child" |
+ "floatval" |
+ "flock" |
+ "floor" |
+ "flush" |
+ "fmod" |
+ "fnmatch" |
+ "fopen" |
+ "fpassthru" |
+ "fprintf" |
+ "fputcsv" |
+ "fputs" |
+ "fread" |
+ "free" |
+ "frenchtojd" |
+ "fribidi_log2vis" |
+ "fscanf" |
+ "fseek" |
+ "fsockopen" |
+ "fstat" |
+ "ftell" |
+ "ftok" |
+ ("ftp_"("alloc"|"cdup"|"chdir"|"chmod"|"close"|"connect"|"delete"|"exec"|"fget"|"fput"|"get"|"get_option"|"login"|"mdtm"|"mkdir"|"nb_continue"|"nb_fget"|"nb_fput"|"nb_get"|"nb_put"|"nlist"|"pasv"|"put"|"pwd"|"quit"|"raw"|"rawlist"|"rename"|"rmdir"|"set_option"|"site"|"size"|"ssl_connect"|"systype")) |
+ "ftruncate" |
+ "ftstat" |
+ "func_get_arg" |
+ "func_get_args" |
+ "func_num_args" |
+ "function_exists" |
+ "fwrite" |
+ "gd_info" |
+ "get" |
+ ("get"("_attr"|"_attribute"|"_attribute_node"|"_browser"|"_cfg_var"|"_class"|"_class_methods"|"_class_vars"|"_content"|"_current_user"|"_declared_classes"|"_declared_interfaces"|"_defined_constants"|"_defined_functions"|"_defined_vars"|"_element_by_id"|"_elements_by_tagname"|"_extension_funcs"|"_headers"|"_html_translation_table"|"_include_path"|"_included_files"|"_loaded_extensions"|"_magic_quotes_gpc"|"_magic_quotes_runtime"|"_meta_tags"|"_nodes"|"_object_vars"|"_parent_class"|"_requi [...]
+ "glob" |
+ "gmdate" |
+ "gmmktime" |
+ ("gmp_"("abs"|"add"|"and"|"clrbit"|"cmp"|"com"|"div"|"div_q"|"div_qr"|"div_r"|"divexact"|"fact"|"gcd"|"gcdext"|"hamdist"|"init"|"intval"|"invert"|"jacobi"|"legendre"|"mod"|"mul"|"neg"|"or"|"perfect_square"|"popcount"|"pow"|"powm"|"prob_prime"|"random"|"scan0"|"scan1"|"setbit"|"sign"|"sqrt"|"sqrtrem"|"strval"|"sub"|"xor")) |
+ "gmstrftime" |
+ "gregoriantojd" |
+ ("gz"("close"|"compress"|"deflate"|"encode"|"eof"|"file"|"getc"|"gets"|"getss"|"inflate"|"open"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"uncompress"|"write")) |
+ "handle" |
+ ("has"("_attribute"|"_attributes"|"_child_nodes"|"attribute"|"attributens"|"attributes"|"childnodes"|"children"|"feature"|"next"|"siblings")) |
+ "header" |
+ "headers_list" |
+ "headers_sent" |
+ "hebrev" |
+ "hebrevc" |
+ "hexdec" |
+ "highlight_file" |
+ "highlight_string" |
+ "html_dump_mem" |
+ "html_entity_decode" |
+ "htmlentities" |
+ "htmlspecialchars" |
+ "http_build_query" |
+ ("hw_"("array2objrec"|"changeobject"|"children"|"childrenobj"|"close"|"connect"|"connection_info"|"cp"|"deleteobject"|"docbyanchor"|"docbyanchorobj"|"document_attributes"|"document_bodytag"|"document_content"|"document_setcontent"|"document_size"|"dummy"|"edittext"|"error"|"errormsg"|"free_document"|"getanchors"|"getanchorsobj"|"getandlock"|"getchildcoll"|"getchildcollobj"|"getchilddoccoll"|"getchilddoccollobj"|"getobject"|"getobjectbyquery"|"getobjectbyquerycoll"|"getobjectbyquerycollo [...]
+ "hwapi_hgcsp" |
+ "hwstat" |
+ "hypot" |
+ ("ibase_"("add_user"|"affected_rows"|"backup"|"blob_add"|"blob_cancel"|"blob_close"|"blob_create"|"blob_echo"|"blob_get"|"blob_import"|"blob_info"|"blob_open"|"close"|"commit"|"commit_ret"|"connect"|"db_info"|"delete_user"|"drop_db"|"errcode"|"errmsg"|"execute"|"fetch_assoc"|"fetch_object"|"fetch_row"|"field_info"|"free_event_handler"|"free_query"|"free_result"|"gen_id"|"maintain_db"|"modify_user"|"name_result"|"num_fields"|"num_params"|"param_info"|"pconnect"|"prepare"|"query"|"restore [...]
+ "iconv" |
+ ("iconv_"("get_encoding"|"mime_decode"|"mime_decode_headers"|"mime_encode"|"set_encoding"|"strlen"|"strpos"|"strrpos"|"substr")) |
+ "identify" |
+ "ignore_user_abort" |
+ ("image"("2wbmp"|"_type_to_extension"|"_type_to_mime_type"|"alphablending"|"antialias"|"arc"|"char"|"charup"|"colorallocate"|"colorallocatealpha"|"colorat"|"colorclosest"|"colorclosestalpha"|"colorclosesthwb"|"colordeallocate"|"colorexact"|"colorexactalpha"|"colormatch"|"colorresolve"|"colorresolvealpha"|"colorset"|"colorsforindex"|"colorstotal"|"colortransparent"|"copy"|"copymerge"|"copymergegray"|"copyresampled"|"copyresized"|"create"|"createfromgd"|"createfromgd2"|"createfromgd2part" [...]
+ ("imap_"("8bit"|"alerts"|"append"|"base64"|"binary"|"body"|"bodystruct"|"check"|"clearflag_full"|"close"|"createmailbox"|"delete"|"deletemailbox"|"errors"|"expunge"|"fetch_overview"|"fetchbody"|"fetchheader"|"fetchstructure"|"get_quota"|"get_quotaroot"|"getacl"|"getmailboxes"|"getsubscribed"|"header"|"headerinfo"|"headers"|"last_error"|"list"|"listmailbox"|"listscan"|"listsubscribed"|"lsub"|"mail"|"mail_compose"|"mail_copy"|"mail_move"|"mailboxmsginfo"|"mime_header_decode"|"msgno"|"num_ [...]
+ "implode" |
+ "import" |
+ "import_request_variables" |
+ "importnode" |
+ "in_array" |
+ "increment" |
+ "inet_ntop" |
+ "inet_pton" |
+ "info" |
+ ("ini_"("alter"|"get"|"get_all"|"restore"|"set")) |
+ "insert" |
+ "insert_before" |
+ "insertanchor" |
+ "insertbefore" |
+ "insertcollection" |
+ "insertdata" |
+ "insertdocument" |
+ "interface_exists" |
+ "internal_subset" |
+ "intval" |
+ "ip2long" |
+ "iptcembed" |
+ "iptcparse" |
+ ("is_"("a"|"array"|"blank_node"|"bool"|"callable"|"dir"|"double"|"executable"|"file"|"finite"|"float"|"infinite"|"int"|"integer"|"link"|"long"|"nan"|"null"|"numeric"|"object"|"readable"|"real"|"resource"|"scalar"|"soap_fault"|"string"|"subclass_of"|"uploaded_file"|"writable"|"writeable")) |
+ ("is"("asp"|"comment"|"dir"|"dot"|"executable"|"file"|"html"|"id"|"jste"|"link"|"php"|"readable"|"samenode"|"supported"|"text"|"whitespaceinelementcontent"|"writable"|"xhtml"|"xml")) |
+ "item" |
+ "iterator_count" |
+ "iterator_to_array" |
+ "java_last_exception_clear" |
+ "java_last_exception_get" |
+ "jddayofweek" |
+ "jdmonthname" |
+ "jdtofrench" |
+ "jdtogregorian" |
+ "jdtojewish" |
+ "jdtojulian" |
+ "jdtounix" |
+ "jewishtojd" |
+ "join" |
+ "jpeg2wbmp" |
+ "juliantojd" |
+ "key" |
+ "krsort" |
+ "ksort" |
+ "langdepvalue" |
+ "last_child" |
+ "lastinsertid" |
+ "lcg_value" |
+ ("ldap_"("8859_to_t61"|"add"|"bind"|"close"|"compare"|"connect"|"count_entries"|"delete"|"dn2ufn"|"err2str"|"errno"|"error"|"explode_dn"|"first_attribute"|"first_entry"|"first_reference"|"free_result"|"get_attributes"|"get_dn"|"get_entries"|"get_option"|"get_values"|"get_values_len"|"list"|"mod_add"|"mod_del"|"mod_replace"|"modify"|"next_attribute"|"next_entry"|"next_reference"|"parse_reference"|"parse_result"|"read"|"rename"|"sasl_bind"|"search"|"set_option"|"set_rebind_proc"|"sort"|"s [...]
+ "levenshtein" |
+ "link" |
+ "linkinfo" |
+ "load" |
+ "loadhtml" |
+ "loadhtmlfile" |
+ "loadxml" |
+ "localeconv" |
+ "localtime" |
+ "lock" |
+ "log" |
+ "log10" |
+ "log1p" |
+ "long2ip" |
+ "lookupnamespaceuri" |
+ "lookupprefix" |
+ "lstat" |
+ "ltrim" |
+ "lzf_compress" |
+ "lzf_decompress" |
+ "lzf_optimized_for" |
+ "mail" |
+ "main" |
+ "max" |
+ ("mb_"("convert_case"|"convert_encoding"|"convert_kana"|"convert_variables"|"decode_mimeheader"|"decode_numericentity"|"detect_encoding"|"detect_order"|"encode_mimeheader"|"encode_numericentity"|"ereg"|"ereg_match"|"ereg_replace"|"ereg_search"|"ereg_search_getpos"|"ereg_search_getregs"|"ereg_search_init"|"ereg_search_pos"|"ereg_search_regs"|"ereg_search_setpos"|"eregi"|"eregi_replace"|"get_info"|"http_input"|"http_output"|"internal_encoding"|"language"|"list_encodings"|"output_handler"| [...]
+ ("mcal_"("append_event"|"close"|"create_calendar"|"date_compare"|"date_valid"|"day_of_week"|"day_of_year"|"days_in_month"|"delete_calendar"|"delete_event"|"event_add_attribute"|"event_init"|"event_set_alarm"|"event_set_category"|"event_set_class"|"event_set_description"|"event_set_end"|"event_set_recur_daily"|"event_set_recur_monthly_mday"|"event_set_recur_monthly_wday"|"event_set_recur_none"|"event_set_recur_weekly"|"event_set_recur_yearly"|"event_set_start"|"event_set_title"|"expunge" [...]
+ ("mcrypt_"("cbc"|"cfb"|"create_iv"|"decrypt"|"ecb"|"enc_get_algorithms_name"|"enc_get_block_size"|"enc_get_iv_size"|"enc_get_key_size"|"enc_get_modes_name"|"enc_get_supported_key_sizes"|"enc_is_block_algorithm"|"enc_is_block_algorithm_mode"|"enc_is_block_mode"|"enc_self_test"|"encrypt"|"generic"|"generic_deinit"|"generic_end"|"generic_init"|"get_block_size"|"get_cipher_name"|"get_iv_size"|"get_key_size"|"list_algorithms"|"list_modes"|"module_close"|"module_get_algo_block_size"|"module_g [...]
+ "md5" |
+ "md5_file" |
+ "mdecrypt_generic" |
+ "memcache_debug" |
+ "memory_get_usage" |
+ "metaphone" |
+ "method_exists" |
+ "mhash" |
+ "mhash_count" |
+ "mhash_get_block_size" |
+ "mhash_get_hash_name" |
+ "mhash_keygen_s2k" |
+ "microtime" |
+ "mime_content_type" |
+ "mimetype" |
+ "min" |
+ "ming_setcubicthreshold" |
+ "ming_setscale" |
+ "ming_useswfversion" |
+ "mkdir" |
+ "mktime" |
+ "money_format" |
+ "move" |
+ "move_uploaded_file" |
+ "movepen" |
+ "movepento" |
+ "moveto" |
+ ("msession_"("connect"|"count"|"create"|"destroy"|"disconnect"|"find"|"get"|"get_array"|"get_data"|"inc"|"list"|"listvar"|"lock"|"plugin"|"randstr"|"set"|"set_array"|"set_data"|"timeout"|"uniq"|"unlock")) |
+ "msg_get_queue" |
+ "msg_receive" |
+ "msg_remove_queue" |
+ "msg_send" |
+ "msg_set_queue" |
+ "msg_stat_queue" |
+ "msql" |
+ "mt_getrandmax" |
+ "mt_rand" |
+ "mt_srand" |
+ "name" |
+ "natcasesort" |
+ "natsort" |
+ "next" |
+ "next_sibling" |
+ "nextframe" |
+ "ngettext" |
+ "nl2br" |
+ "nl_langinfo" |
+ ("node_"("name"|"type"|"value")) |
+ "normalize" |
+ "notations" |
+ ("notes_"("body"|"copy_db"|"create_db"|"create_note"|"drop_db"|"find_note"|"header_info"|"list_msgs"|"mark_read"|"mark_unread"|"nav_create"|"search"|"unread"|"version")) |
+ ("nsapi_"("request_headers"|"response_headers"|"virtual")) |
+ "number_format" |
+ ("ob_"("clean"|"end_clean"|"end_flush"|"flush"|"get_clean"|"get_contents"|"get_flush"|"get_length"|"get_level"|"get_status"|"gzhandler"|"iconv_handler"|"implicit_flush"|"list_handlers"|"start"|"tidyhandler")) |
+ "object" |
+ "objectbyanchor" |
+ ("oci"("_bind_by_name"|"_cancel"|"_close"|"_commit"|"_connect"|"_define_by_name"|"_error"|"_execute"|"_fetch"|"_fetch_all"|"_fetch_array"|"_fetch_assoc"|"_fetch_object"|"_fetch_row"|"_field_is_null"|"_field_name"|"_field_precision"|"_field_scale"|"_field_size"|"_field_type"|"_field_type_raw"|"_free_statement"|"_internal_debug"|"_lob_copy"|"_lob_is_equal"|"_new_collection"|"_new_connect"|"_new_cursor"|"_new_descriptor"|"_num_fields"|"_num_rows"|"_parse"|"_password_change"|"_pconnect"|"_r [...]
+ "octdec" |
+ ("odbc_"("autocommit"|"binmode"|"close"|"close_all"|"columnprivileges"|"columns"|"commit"|"connect"|"cursor"|"data_source"|"do"|"error"|"errormsg"|"exec"|"execute"|"fetch_array"|"fetch_into"|"fetch_object"|"fetch_row"|"field_len"|"field_name"|"field_num"|"field_precision"|"field_scale"|"field_type"|"foreignkeys"|"free_result"|"gettypeinfo"|"longreadlen"|"next_result"|"num_fields"|"num_rows"|"pconnect"|"prepare"|"primarykeys"|"procedurecolumns"|"procedures"|"result"|"result_all"|"rollbac [...]
+ "offsetexists" |
+ "offsetget" |
+ "offsetset" |
+ "offsetunset" |
+ "opendir" |
+ "openlog" |
+ ("openssl_"("csr_export"|"csr_export_to_file"|"csr_new"|"csr_sign"|"error_string"|"free_key"|"get_privatekey"|"get_publickey"|"open"|"pkcs7_decrypt"|"pkcs7_encrypt"|"pkcs7_sign"|"pkcs7_verify"|"pkey_export"|"pkey_export_to_file"|"pkey_get_private"|"pkey_get_public"|"pkey_new"|"private_decrypt"|"private_encrypt"|"public_decrypt"|"public_encrypt"|"seal"|"sign"|"verify"|"x509_check_private_key"|"x509_checkpurpose"|"x509_export"|"x509_export_to_file"|"x509_free"|"x509_parse"|"x509_read")) |
+ ("ora_"("bind"|"close"|"columnname"|"columnsize"|"columntype"|"commit"|"commitoff"|"commiton"|"do"|"error"|"errorcode"|"exec"|"fetch"|"fetch_into"|"getcolumn"|"logoff"|"logon"|"numcols"|"numrows"|"open"|"parse"|"plogon"|"rollback")) |
+ "ord" |
+ "output" |
+ "output_add_rewrite_var" |
+ "output_reset_rewrite_vars" |
+ "overload" |
+ "override_function" |
+ "owner_document" |
+ "pack" |
+ "parent_node" |
+ "parents" |
+ "parse_ini_file" |
+ "parse_str" |
+ "parse_url" |
+ "parsekit_compile_file" |
+ "parsekit_compile_string" |
+ "parsekit_func_arginfo" |
+ "passthru" |
+ "pathinfo" |
+ "pclose" |
+ ("pcntl_"("alarm"|"exec"|"fork"|"getpriority"|"setpriority"|"signal"|"wait"|"waitpid"|"wexitstatus"|"wifexited"|"wifsignaled"|"wifstopped"|"wstopsig"|"wtermsig")) |
+ "pconnect" |
+ ("pdf_"("add_annotation"|"add_bookmark"|"add_launchlink"|"add_locallink"|"add_note"|"add_outline"|"add_pdflink"|"add_thumbnail"|"add_weblink"|"arc"|"arcn"|"attach_file"|"begin_page"|"begin_pattern"|"begin_template"|"circle"|"clip"|"close"|"close_image"|"close_pdi"|"close_pdi_page"|"closepath"|"closepath_fill_stroke"|"closepath_stroke"|"concat"|"continue_text"|"curveto"|"delete"|"end_page"|"end_pattern"|"end_template"|"endpath"|"fill"|"fill_stroke"|"findfont"|"fit_pdi_page"|"get_buffer"| [...]
+ "pfpro_cleanup" |
+ "pfpro_init" |
+ "pfpro_process" |
+ "pfpro_process_raw" |
+ "pfpro_version" |
+ "pfsockopen" |
+ ("pg_"("affected_rows"|"cancel_query"|"client_encoding"|"close"|"connect"|"connection_busy"|"connection_reset"|"connection_status"|"convert"|"copy_from"|"copy_to"|"dbname"|"delete"|"end_copy"|"escape_bytea"|"escape_string"|"fetch_all"|"fetch_array"|"fetch_assoc"|"fetch_object"|"fetch_result"|"fetch_row"|"field_is_null"|"field_name"|"field_num"|"field_prtlen"|"field_size"|"field_type"|"free_result"|"get_notify"|"get_pid"|"get_result"|"host"|"insert"|"last_error"|"last_notice"|"last_oid"| [...]
+ "php_check_syntax" |
+ "php_ini_scanned_files" |
+ "php_logo_guid" |
+ "php_sapi_name" |
+ "php_strip_whitespace" |
+ "php_uname" |
+ "phpcredits" |
+ "phpinfo" |
+ "phpversion" |
+ "pi" |
+ "png2wbmp" |
+ "popen" |
+ "pos" |
+ ("posix_"("ctermid"|"get_last_error"|"getcwd"|"getegid"|"geteuid"|"getgid"|"getgrgid"|"getgrnam"|"getgroups"|"getlogin"|"getpgid"|"getpgrp"|"getpid"|"getppid"|"getpwnam"|"getpwuid"|"getrlimit"|"getsid"|"getuid"|"isatty"|"kill"|"mkfifo"|"setegid"|"seteuid"|"setgid"|"setpgid"|"setsid"|"setuid"|"strerror"|"times"|"ttyname"|"uname")) |
+ "pow" |
+ "prefix" |
+ "preg_grep" |
+ "preg_match" |
+ "preg_match_all" |
+ "preg_quote" |
+ "preg_replace" |
+ "preg_replace_callback" |
+ "preg_split" |
+ "prepare" |
+ "prev" |
+ "previous_sibling" |
+ "print_r" |
+ ("printer_"("abort"|"close"|"create_brush"|"create_dc"|"create_font"|"create_pen"|"delete_brush"|"delete_dc"|"delete_font"|"delete_pen"|"draw_bmp"|"draw_chord"|"draw_elipse"|"draw_line"|"draw_pie"|"draw_rectangle"|"draw_roundrect"|"draw_text"|"end_doc"|"end_page"|"get_option"|"list"|"logical_fontheight"|"open"|"select_brush"|"select_font"|"select_pen"|"set_option"|"start_doc"|"start_page"|"write")) |
+ "printf" |
+ "proc_close" |
+ "proc_get_status" |
+ "proc_nice" |
+ "proc_open" |
+ "proc_terminate" |
+ "process" |
+ "public_id" |
+ "putenv" |
+ "qdom_error" |
+ "qdom_tree" |
+ "query" |
+ "quoted_printable_decode" |
+ "quotemeta" |
+ "rad2deg" |
+ "rand" |
+ "range" |
+ "rar_close" |
+ "rar_entry_get" |
+ "rar_list" |
+ "rar_open" |
+ "rawurldecode" |
+ "rawurlencode" |
+ "read" |
+ "read_exif_data" |
+ "readdir" |
+ "readfile" |
+ "readgzfile" |
+ "readline" |
+ ("readline_"("add_history"|"callback_handler_install"|"callback_handler_remove"|"callback_read_char"|"clear_history"|"completion_function"|"info"|"list_history"|"on_new_line"|"read_history"|"redisplay"|"write_history")) |
+ "readlink" |
+ "realpath" |
+ "reason" |
+ "recode" |
+ "recode_file" |
+ "recode_string" |
+ "register_shutdown_function" |
+ "register_tick_function" |
+ "registernamespace" |
+ "relaxngvalidate" |
+ "relaxngvalidatesource" |
+ "remove" |
+ "remove_attribute" |
+ "remove_child" |
+ "removeattribute" |
+ "removeattributenode" |
+ "removeattributens" |
+ "removechild" |
+ "rename" |
+ "rename_function" |
+ "replace" |
+ "replace_child" |
+ "replace_node" |
+ "replacechild" |
+ "replacedata" |
+ "reset" |
+ "restore_error_handler" |
+ "restore_exception_handler" |
+ "restore_include_path" |
+ "result_dump_file" |
+ "result_dump_mem" |
+ "rewind" |
+ "rewinddir" |
+ "rmdir" |
+ "rollback" |
+ "rotate" |
+ "rotateto" |
+ "round" |
+ "rowcount" |
+ "rsort" |
+ "rtrim" |
+ "save" |
+ "savehtml" |
+ "savehtmlfile" |
+ "savexml" |
+ "scale" |
+ "scaleto" |
+ "scandir" |
+ "schemavalidate" |
+ "schemavalidatesource" |
+ "seek" |
+ "sem_acquire" |
+ "sem_get" |
+ "sem_release" |
+ "sem_remove" |
+ "serialize" |
+ ("sesam_"("affected_rows"|"commit"|"connect"|"diagnostic"|"disconnect"|"errormsg"|"execimm"|"fetch_array"|"fetch_result"|"fetch_row"|"field_array"|"field_name"|"free_result"|"num_fields"|"query"|"rollback"|"seek_row"|"sesam_settransaction")) |
+ ("session_"("cache_expire"|"cache_limiter"|"commit"|"decode"|"destroy"|"encode"|"get_cookie_params"|"id"|"is_registered"|"module_name"|"name"|"regenerate_id"|"register"|"save_path"|"set_cookie_params"|"set_save_handler"|"start"|"unregister"|"unset"|"write_close")) |
+ "set" |
+ ("set"("_attribute"|"_content"|"_error_handler"|"_exception_handler"|"_file_buffer"|"_include_path"|"_magic_quotes_runtime"|"_name"|"_namespace"|"_time_limit"|"action"|"attribute"|"attributenode"|"attributenodens"|"attributens"|"background"|"bounds"|"buffering"|"class"|"color"|"commitedversion"|"cookie"|"depth"|"dimension"|"down"|"font"|"frames"|"height"|"hit"|"indentation"|"leftfill"|"leftmargin"|"line"|"linespacing"|"locale"|"margins"|"name"|"over"|"persistence"|"rate"|"ratio"|"rawcoo [...]
+ "sha1" |
+ "sha1_file" |
+ "shell_exec" |
+ "shm_attach" |
+ "shm_detach" |
+ "shm_get_var" |
+ "shm_put_var" |
+ "shm_remove" |
+ "shm_remove_var" |
+ "shmop_close" |
+ "shmop_delete" |
+ "shmop_open" |
+ "shmop_read" |
+ "shmop_size" |
+ "shmop_write" |
+ "show_source" |
+ "shuffle" |
+ "similar_text" |
+ "simplexml_import_dom" |
+ "simplexml_load_file" |
+ "simplexml_load_string" |
+ "sin" |
+ "sinh" |
+ "size" |
+ "sizeof" |
+ "skewx" |
+ "skewxto" |
+ "skewy" |
+ "skewyto" |
+ "sleep" |
+ ("socket_"("accept"|"bind"|"clear_error"|"close"|"connect"|"create"|"create_listen"|"create_pair"|"get_option"|"get_status"|"getpeername"|"getsockname"|"last_error"|"listen"|"read"|"recv"|"recvfrom"|"select"|"send"|"sendto"|"set_block"|"set_blocking"|"set_nonblock"|"set_option"|"set_timeout"|"shutdown"|"strerror"|"write")) |
+ "sort" |
+ "soundex" |
+ "specified" |
+ "spl_classes" |
+ "split" |
+ "spliti" |
+ "splittext" |
+ "sprintf" |
+ "sql_regcase" |
+ "sqrt" |
+ "srand" |
+ "srcanchors" |
+ "srcsofdst" |
+ "sscanf" |
+ "stat" |
+ ("str_"("ireplace"|"pad"|"repeat"|"replace"|"rot13"|"shuffle"|"split"|"word_count")) |
+ "strcasecmp" |
+ "strchr" |
+ "strcmp" |
+ "strcoll" |
+ "strcspn" |
+ ("stream_"("context_create"|"context_get_default"|"context_get_options"|"context_set_option"|"context_set_params"|"copy_to_stream"|"filter_append"|"filter_prepend"|"filter_register"|"filter_remove"|"get_contents"|"get_filters"|"get_line"|"get_meta_data"|"get_transports"|"get_wrappers"|"register_wrapper"|"select"|"set_blocking"|"set_timeout"|"set_write_buffer"|"socket_accept"|"socket_client"|"socket_enable_crypto"|"socket_get_name"|"socket_recvfrom"|"socket_sendto"|"socket_server"|"wrapp [...]
+ ("str"("eammp3"|"ftime"|"ip_tags"|"ipcslashes"|"ipos"|"ipslashes"|"istr"|"len"|"natcasecmp"|"natcmp"|"ncasecmp"|"ncmp"|"pbrk"|"pos"|"ptime"|"rchr"|"rev"|"ripos"|"rpos"|"spn"|"str"|"tok"|"tolower"|"totime"|"toupper"|"tr"|"val")) |
+ "substr" |
+ "substr_compare" |
+ "substr_count" |
+ "substr_replace" |
+ "substringdata" |
+ ("swf_"("actiongeturl"|"actiongotoframe"|"actiongotolabel"|"actionnextframe"|"actionplay"|"actionprevframe"|"actionsettarget"|"actionstop"|"actiontogglequality"|"actionwaitforframe"|"addbuttonrecord"|"addcolor"|"closefile"|"definebitmap"|"definefont"|"defineline"|"definepoly"|"definerect"|"definetext"|"endbutton"|"enddoaction"|"endshape"|"endsymbol"|"fontsize"|"fontslant"|"fonttracking"|"getbitmapinfo"|"getfontinfo"|"getframe"|"labelframe"|"lookat"|"modifyobject"|"mulcolor"|"nextid"|"on [...]
+ "swfbutton_keypress" |
+ "symlink" |
+ "syslog" |
+ "system" |
+ "system_id" |
+ "tagname" |
+ "tan" |
+ "tanh" |
+ "target" |
+ "tcpwrap_check" |
+ "tell" |
+ "tempnam" |
+ "textdomain" |
+ ("tidy_"("access_count"|"clean_repair"|"config_count"|"diagnose"|"error_count"|"get_body"|"get_config"|"get_error_buffer"|"get_head"|"get_html"|"get_html_ver"|"get_output"|"get_release"|"get_root"|"get_status"|"getopt"|"is_xhtml"|"is_xml"|"load_config"|"parse_file"|"parse_string"|"repair_file"|"repair_string"|"reset_config"|"save_config"|"set_encoding"|"setopt"|"warning_count")) |
+ "time" |
+ "time_nanosleep" |
+ "title" |
+ "tmpfile" |
+ "token_get_all" |
+ "token_name" |
+ "touch" |
+ "trigger_error" |
+ "trim" |
+ "truncate" |
+ "type" |
+ "uasort" |
+ "ucfirst" |
+ "ucwords" |
+ "uksort" |
+ "umask" |
+ "uniqid" |
+ "unixtojd" |
+ "unlink" |
+ "unlink_node" |
+ "unlock" |
+ "unpack" |
+ "unregister_tick_function" |
+ "unserialize" |
+ "urldecode" |
+ "urlencode" |
+ "user" |
+ "user_error" |
+ "userlist" |
+ "usleep" |
+ "usort" |
+ "utf8_"("decode"|"encode") |
+ "valid" |
+ "validate" |
+ "value" |
+ "values" |
+ "var_"("dump"|"export") |
+ ("variant_"("abs"|"add"|"and"|"cast"|"cat"|"cmp"|"date_from_timestamp"|"date_to_timestamp"|"div"|"eqv"|"fix"|"get_type"|"idiv"|"imp"|"int"|"mod"|"mul"|"neg"|"not"|"or"|"pow"|"round"|"set"|"set_type"|"sub"|"xor")) |
+ "version_compare" |
+ "vfprintf" |
+ "virtual" |
+ ("vpopmail_"("add_alias_domain"|"add_alias_domain_ex"|"add_domain"|"add_domain_ex"|"add_user"|"alias_add"|"alias_del"|"alias_del_domain"|"alias_get"|"alias_get_all"|"auth_user"|"del_domain"|"del_domain_ex"|"del_user"|"error"|"passwd"|"set_user_quota")) |
+ "vprintf" |
+ "vsprintf" |
+ ("w32api_"("deftype"|"init_dtype"|"invoke_function"|"register_function"|"set_call_method")) |
+ "wddx_add_vars" |
+ "wddx_deserialize" |
+ "wddx_packet_end" |
+ "wddx_packet_start" |
+ "wddx_serialize_value" |
+ "wddx_serialize_vars" |
+ "wordwrap" |
+ "write" |
+ "writetemporary" |
+ "xattr_get" |
+ "xattr_list" |
+ "xattr_remove" |
+ "xattr_set" |
+ "xattr_supported" |
+ "xinclude" |
+ ("xml"("_error_string"|"_get_current_byte_index"|"_get_current_column_number"|"_get_current_line_number"|"_get_error_code"|"_parse"|"_parse_into_struct"|"_parser_create"|"_parser_create_ns"|"_parser_free"|"_parser_get_option"|"_parser_set_option"|"_set_character_data_handler"|"_set_default_handler"|"_set_element_handler"|"_set_end_namespace_decl_handler"|"_set_external_entity_ref_handler"|"_set_notation_decl_handler"|"_set_object"|"_set_processing_instruction_handler"|"_set_start_namesp [...]
+ "xpath" |
+ "xpath_eval" |
+ "xpath_eval_expression" |
+ "xpath_new_context" |
+ "xptr_eval" |
+ "xptr_new_context" |
+ ("xsl_xsltprocessor_"("get_parameter"|"has_exslt_support"|"import_stylesheet"|"register_php_functions"|"remove_parameter"|"set_parameter"|"transform_to_doc"|"transform_to_uri"|"transform_to_xml"|"xslt_backend_info")) |
+ ("xslt_"("backend_name"|"backend_version"|"create"|"errno"|"error"|"free"|"getopt"|"process"|"set_base"|"set_encoding"|"set_error_handler"|"set_log"|"set_object"|"set_sax_handler"|"set_sax_handlers"|"set_scheme_handler"|"set_scheme_handlers"|"setopt")) |
+ ("yp_"("all"|"cat"|"err_string"|"errno"|"first"|"get_default_domain"|"master"|"match"|"next"|"yp_order")) |
+ "zend_logo_guid" |
+ "zend_version" |
+ ("zip_"("close"|"entry_close"|"entry_compressedsize"|"entry_compressionmethod"|"entry_filesize"|"entry_name"|"entry_open"|"entry_read"|"open"|"read")) |
+ "zlib_get_coding_type" |
+
+ /* mysql functions */
+ ("mysql_"("affected_rows"|"client_encoding"|"close"|"connect"|"create_db"|"data_seek"|"db_"("name"|"query")|"drop_db"|"errno"|"error"|"escape_string"|"fetch_"("array"|"assoc"|"field"|"lengths"|"object"|"row")|"field_"("flags"|"len"|"name"|"seek"|"table"|"type")|"free_result"|"get_"("client_info"|"host_info"|"proto_info"|"server_info")|"info"|"insert_id"|"list_"("dbs"|"fields"|"processes"|"tables")|"num_"("fields"|"rows")|"pconnect"|"ping"|"query"|"real_escape_string"|"result"|"select_db [...]
+
+ /* Function aliases */
+ "apache_request_headers" |
+ "apache_response_headers" |
+ "attr_get" |
+ "attr_set" |
+ "autocommit" |
+ "bind_param" |
+ "bind_result" |
+ "bzclose" |
+ "bzflush" |
+ "bzwrite" |
+ "change_user" |
+ "character_set_name" |
+ "checkdnsrr" |
+ "chop" |
+ "client_encoding" |
+ "close" |
+ "commit" |
+ "connect" |
+ "data_seek" |
+ "debug" |
+ "disable_reads_from_master" |
+ "disable_rpl_parse" |
+ "diskfreespace" |
+ "doubleval" |
+ "dump_debug_info" |
+ "enable_reads_from_master" |
+ "enable_rpl_parse" |
+ "escape_string" |
+ "execute" |
+ "fbsql" |
+ "fbsql_tablename" |
+ "fetch" |
+ "fetch_array" |
+ "fetch_assoc" |
+ "fetch_field" |
+ "fetch_field_direct" |
+ "fetch_fields" |
+ "fetch_object" |
+ "fetch_row" |
+ "field_count" |
+ "field_seek" |
+ "fputs" |
+ "free" |
+ "free_result" |
+ "ftp_quit" |
+ "get_client_info" |
+ "get_required_files" |
+ "get_server_info" |
+ "getallheaders" |
+ "getmxrr" |
+ "gmp_div" |
+ ("gz"("close"|"eof"|"getc"|"gets"|"getss"|"passthru"|"puts"|"read"|"rewind"|"seek"|"tell"|"gzwrite")) |
+ "imap_create" |
+ "imap_fetchtext" |
+ "imap_header" |
+ "imap_listmailbox" |
+ "imap_listsubscribed" |
+ "imap_rename" |
+ "ini_alter" |
+ "init" |
+ "is_double" |
+ "is_int" |
+ "is_integer" |
+ "is_real" |
+ "is_writeable" |
+ "join" |
+ "key_exists" |
+ "kill" |
+ "ldap_close" |
+ "ldap_modify" |
+ "magic_quotes_runtime" |
+ "master_query" |
+ "ming_keypress" |
+ "ming_setcubicthreshold" |
+ "ming_setscale" |
+ "ming_useconstants" |
+ "ming_useswfversion" |
+ "more_results" |
+ "next_result" |
+ "num_rows" |
+ ("oci"("_free_cursor"|"bindbyname"|"cancel"|"collappend"|"collassignelem"|"collgetelem"|"collmax"|"collsize"|"colltrim"|"columnisnull"|"columnname"|"columnprecision"|"columnscale"|"columnsize"|"columntype"|"columntyperaw"|"commit"|"definebyname"|"error"|"execute"|"fetch"|"fetchstatement"|"freecollection"|"freecursor"|"freedesc"|"freestatement"|"internaldebug"|"loadlob"|"logoff"|"logon"|"newcollection"|"newcursor"|"newdescriptor"|"nlogon"|"numcols"|"parse"|"passwordchange"|"plogon"|"resu [...]
+ "odbc_do" |
+ "odbc_field_precision" |
+ "openssl_free_key" |
+ "openssl_get_privatekey" |
+ "openssl_get_publickey" |
+ "options" |
+ ("pg_"("clientencoding"|"cmdtuples"|"errormessage"|"exec"|"fieldisnull"|"fieldname"|"fieldnum"|"fieldprtlen"|"fieldsize"|"fieldtype"|"freeresult"|"getlastoid"|"loclose"|"locreate"|"loexport"|"loimport"|"loopen"|"loread"|"loreadall"|"lounlink"|"lowrite"|"numfields"|"numrows"|"result"|"setclientencoding")) |
+ "ping" |
+ "pos" |
+ "posix_errno" |
+ "prepare" |
+ "query" |
+ "read_exif_data" |
+ "real_connect" |
+ "real_escape_string" |
+ "real_query" |
+ "recode" |
+ "reset" |
+ "result_metadata" |
+ "rollback" |
+ "rpl_parse_enabled" |
+ "rpl_probe" |
+ "rpl_query_type" |
+ "select_db" |
+ "send_long_data" |
+ "session_commit" |
+ "set_file_buffer" |
+ "set_local_infile_default" |
+ "set_local_infile_handler" |
+ "set_opt" |
+ "show_source" |
+ "sizeof" |
+ "slave_query" |
+ "snmpwalkoid" |
+ "socket_get_status" |
+ "socket_getopt" |
+ "socket_set_blocking" |
+ "socket_set_timeout" |
+ "socket_setopt" |
+ "sqlite_fetch_string" |
+ "sqlite_has_more" |
+ "ssl_set" |
+ "stat" |
+ "stmt" |
+ "stmt_init" |
+ "store_result" |
+ "strchr" |
+ "stream_register_wrapper" |
+ "thread_safe" |
+ "use_result" |
+ "user_error" |
+ ("velocis_"("autocommit"|"close"|"commit"|"connect"|"exec"|"fetch"|"fieldname"|"fieldnum"|"freeresult"|"off_autocommit"|"result"|"rollback")) |
+ "virtual" { addToken(Token.FUNCTION); }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+ {PHP_Variable} { addToken(Token.VARIABLE); }
+
+ {LineTerminator} { addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+ {JS_Identifier} { addToken(Token.IDENTIFIER); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ [\"] { start = zzMarkedPos-1; yybegin(PHP_STRING); }
+ [\'] { start = zzMarkedPos-1; yybegin(PHP_CHAR); }
+
+ /* Comment literals. */
+ "/**/" { addToken(Token.COMMENT_MULTILINE); }
+ {JS_MLCBegin} { start = zzMarkedPos-2; yybegin(PHP_MLC); }
+ {PHP_LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+ /* Separators. */
+ {JS_Separator} { addToken(Token.SEPARATOR); }
+ {JS_Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {JS_Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {JS_IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {JS_HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {JS_FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {JS_ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {JS_ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken; }
+
+ /* Catch any other (unhandled) characters and assume they are okay. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<PHP_MLC> {
+ // PHP MLC's. This state is essentially Java's MLC state.
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+ {JS_MLCEnd} { yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken; }
+}
+
+
+<PHP_STRING> {
+ [^\n\\\$\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {PHP_Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ "$" {}
+ \" { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken; }
+}
+
+
+<PHP_CHAR> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped single quotes only, but this should still work. */ }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+ \' { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java
new file mode 100644
index 0000000..7809a9c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PHPTokenMaker.java
@@ -0,0 +1,25424 @@
+/* The following code was generated by JFlex 1.4.1 on 3/23/13 9:46 AM */
+
+/*
+ * 01/28/2009
+ *
+ * PHPTokenMaker.java - Generates tokens for PHP syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for PHP files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated PHPTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+
+public class PHPTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int PHP = 18;
+ public static final int INATTR_SINGLE_SCRIPT = 9;
+ public static final int JS_CHAR = 14;
+ public static final int CSS_STRING = 25;
+ public static final int JS_MLC = 16;
+ public static final int CSS_CHAR_LITERAL = 26;
+ public static final int INTAG_SCRIPT = 7;
+ public static final int CSS_PROPERTY = 23;
+ public static final int CSS_C_STYLE_COMMENT = 27;
+ public static final int PHP_MLC = 19;
+ public static final int CSS = 22;
+ public static final int CSS_VALUE = 24;
+ public static final int COMMENT = 1;
+ public static final int INATTR_DOUBLE_SCRIPT = 8;
+ public static final int PHP_STRING = 20;
+ public static final int JAVASCRIPT = 13;
+ public static final int INTAG = 3;
+ public static final int INTAG_CHECK_TAG_NAME = 4;
+ public static final int INATTR_SINGLE_STYLE = 12;
+ public static final int DTD = 2;
+ public static final int PHP_CHAR = 21;
+ public static final int JS_EOL_COMMENT = 17;
+ public static final int INATTR_DOUBLE_STYLE = 11;
+ public static final int INATTR_SINGLE = 6;
+ public static final int YYINITIAL = 0;
+ public static final int INATTR_DOUBLE = 5;
+ public static final int JS_STRING = 15;
+ public static final int INTAG_STYLE = 10;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\4\1\2\1\0\1\1\1\33\22\0\1\4\1\51\1\7"+
+ "\1\34\1\36\1\50\1\5\1\106\1\103\1\102\1\37\1\42\1\45"+
+ "\1\31\1\43\1\10\1\25\1\135\1\130\1\134\1\132\1\123\1\131"+
+ "\1\27\1\136\1\24\1\53\1\6\1\3\1\46\1\17\1\52\1\101"+
+ "\1\110\1\26\1\12\1\114\1\22\1\41\1\116\1\122\1\14\1\124"+
+ "\1\117\1\21\1\113\1\112\1\111\1\15\1\120\1\13\1\11\1\16"+
+ "\1\115\1\121\1\23\1\40\1\20\1\23\1\105\1\35\1\105\1\47"+
+ "\1\30\1\0\1\63\1\100\1\72\1\73\1\61\1\62\1\56\1\67"+
+ "\1\55\1\133\1\76\1\64\1\75\1\71\1\70\1\66\1\127\1\60"+
+ "\1\65\1\57\1\32\1\77\1\107\1\104\1\74\1\125\1\126\1\47"+
+ "\1\44\1\54\uff81\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 =
+ "\5\0\2\1\1\0\2\1\1\0\2\1\13\0\1\2"+
+ "\3\0\2\2\1\3\1\4\1\5\1\6\1\1\1\7"+
+ "\5\1\1\10\1\11\3\12\1\13\1\14\1\15\1\16"+
+ "\1\17\1\20\1\21\1\22\2\20\2\22\3\20\2\22"+
+ "\1\20\1\22\7\20\1\22\1\1\1\23\1\24\1\1"+
+ "\1\25\1\14\1\26\1\27\1\30\1\31\1\32\1\33"+
+ "\1\1\1\34\1\1\1\35\1\36\2\16\1\2\1\37"+
+ "\1\16\2\2\1\16\2\40\1\16\1\2\1\35\2\16"+
+ "\1\2\1\41\17\2\1\42\2\2\1\1\1\43\1\44"+
+ "\1\45\1\1\1\46\1\47\1\50\1\1\1\51\6\1"+
+ "\1\52\4\1\1\53\1\16\1\54\1\16\2\2\1\55"+
+ "\1\2\1\16\24\2\1\35\1\2\1\56\4\2\1\1"+
+ "\1\57\2\1\1\60\1\61\1\62\1\1\1\63\1\64"+
+ "\1\65\1\66\1\67\1\66\1\70\1\66\1\71\1\66"+
+ "\1\72\1\66\1\73\1\74\1\75\1\76\2\75\1\77"+
+ "\1\75\1\100\1\101\1\102\1\103\1\102\1\104\2\2"+
+ "\1\40\1\2\2\102\1\105\1\106\1\107\1\110\1\111"+
+ "\1\112\1\113\1\1\1\4\2\114\1\115\1\116\1\6"+
+ "\5\0\1\117\32\20\2\22\2\20\1\22\44\20\1\120"+
+ "\1\121\2\0\1\117\1\0\1\122\1\0\1\123\1\16"+
+ "\1\35\1\2\1\16\1\124\1\40\1\124\2\125\1\124"+
+ "\1\126\1\124\1\2\1\77\1\2\1\77\44\2\1\77"+
+ "\7\2\1\127\1\130\1\131\1\0\1\132\11\0\1\133"+
+ "\10\2\1\134\1\135\100\2\1\77\37\2\1\136\20\2"+
+ "\1\77\36\2\1\136\1\2\1\77\34\2\1\137\24\2"+
+ "\1\140\1\62\1\141\1\64\1\0\1\142\1\134\15\0"+
+ "\1\143\1\40\5\0\1\40\1\0\1\144\1\145\2\114"+
+ "\2\0\1\146\4\0\1\12\14\20\1\22\63\20\3\0"+
+ "\1\147\1\0\1\35\1\2\1\125\1\0\2\126\3\2"+
+ "\1\71\25\2\1\150\33\2\14\0\12\2\1\77\53\2"+
+ "\1\136\32\2\1\136\44\2\1\136\5\2\1\136\27\2"+
+ "\1\77\23\2\2\136\5\2\1\136\20\2\1\136\50\2"+
+ "\1\136\63\2\1\136\6\2\1\136\4\2\1\136\25\2"+
+ "\1\136\21\2\1\136\3\2\1\136\4\2\1\77\16\2"+
+ "\1\35\27\2\25\0\2\114\1\151\3\0\1\152\1\12"+
+ "\22\20\1\22\7\20\1\22\10\20\3\0\1\153\1\35"+
+ "\7\2\1\154\4\2\1\155\5\2\1\71\17\2\1\0"+
+ "\1\1\3\0\1\156\3\0\1\157\15\2\1\136\16\2"+
+ "\1\136\72\2\1\136\15\2\1\136\15\2\1\136\21\2"+
+ "\1\136\1\2\1\77\12\2\1\160\3\2\1\136\6\2"+
+ "\1\136\4\2\1\136\15\2\1\136\15\2\1\136\4\2"+
+ "\1\136\11\2\1\136\11\2\1\136\2\2\1\136\105\2"+
+ "\1\136\110\2\1\136\1\2\1\136\54\2\2\136\42\2"+
+ "\1\136\44\2\1\35\27\2\20\0\1\77\3\0\2\114"+
+ "\1\116\2\0\1\117\11\20\1\22\12\20\1\120\1\0"+
+ "\1\117\1\35\5\2\1\77\3\2\1\77\12\2\6\0"+
+ "\63\2\1\136\153\2\1\136\23\2\2\136\16\2\1\136"+
+ "\4\2\1\136\5\2\1\77\131\2\1\136\12\2\1\136"+
+ "\60\2\1\77\217\2\1\77\1\136\1\77\5\2\1\136"+
+ "\1\77\22\2\1\136\37\2\1\136\36\2\1\136\10\2"+
+ "\1\136\1\2\1\35\5\2\1\136\5\2\1\136\20\2"+
+ "\16\0\1\114\1\161\12\20\1\0\1\35\13\2\2\0"+
+ "\14\2\1\136\3\2\1\136\31\2\1\136\43\2\1\136"+
+ "\134\2\4\136\53\2\2\136\2\2\1\136\41\2\1\136"+
+ "\72\2\1\136\35\2\1\77\52\2\1\77\51\2\2\136"+
+ "\31\2\1\136\102\2\1\136\61\2\1\136\1\2\1\136"+
+ "\5\2\1\136\110\2\1\35\41\2\12\0\1\162\3\20"+
+ "\1\0\6\2\2\0\25\2\1\136\11\2\1\77\7\2"+
+ "\1\136\143\2\1\136\1\2\1\136\11\2\1\136\2\2"+
+ "\1\136\6\2\1\136\1\2\1\136\33\2\1\136\27\2"+
+ "\3\136\133\2\1\136\172\2\1\136\237\2\1\136\116\2"+
+ "\1\136\25\2\1\35\36\2\6\0\1\20\1\0\2\2"+
+ "\2\0\161\2\1\136\37\2\1\136\32\2\1\136\24\2"+
+ "\1\77\47\2\1\136\46\2\1\136\161\2\1\136\16\2"+
+ "\1\136\1\2\1\136\30\2\1\136\37\2\1\136\322\2"+
+ "\1\163\4\0\1\20\1\164\1\2\1\165\1\166\31\2"+
+ "\1\136\22\2\1\136\1\2\1\136\13\2\1\136\12\2"+
+ "\1\136\1\2\1\136\37\2\1\136\15\2\1\136\53\2"+
+ "\1\136\155\2\1\136\13\2\1\136\116\2\1\136\35\2"+
+ "\2\136\14\2\1\136\230\2\1\136\42\2\1\136\22\2"+
+ "\3\0\214\2\1\136\2\2\1\136\66\2\1\136\51\2"+
+ "\1\136\36\2\1\136\73\2\1\136\6\2\1\136\253\2"+
+ "\1\136\33\2\3\0\1\167\26\2\1\136\14\2\1\136"+
+ "\10\2\1\136\101\2\1\136\3\2\1\136\71\2\1\136"+
+ "\114\2\1\136\31\2\1\136\204\2\1\136\126\2\1\136"+
+ "\22\2\1\136\2\2\1\136\160\2\1\136\15\2\1\136"+
+ "\10\2\1\136\10\2\1\136\4\2\2\136\2\2\1\136"+
+ "\112\2\1\136\207\2\1\136\2\2\1\136\104\2\1\136"+
+ "\23\2\1\136\24\2\1\136\24\2\1\136\43\2\1\136"+
+ "\73\2\1\136\27\2\2\136\105\2\1\136\65\2\1\136"+
+ "\3\2\1\136\1\2\1\136\14\2\1\136\17\2\1\136"+
+ "\53\2\1\136\22\2\1\136\7\2\1\136\5\2\1\136"+
+ "\257\2\1\136\4\2\1\136\113\2\1\136\1\2\1\136"+
+ "\1\2\1\136\13\2\1\136\125\2\1\136\37\2\1\136"+
+ "\22\2\1\136\45\2\1\136\27\2\1\136\154\2\1\136"+
+ "\171\2\1\136\32\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[7921];
+ 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\137\0\276\0\u011d\0\u017c\0\u01db\0\u023a\0\u0299"+
+ "\0\u02f8\0\u0357\0\u03b6\0\u0415\0\u0474\0\u04d3\0\u0532\0\u0591"+
+ "\0\u05f0\0\u064f\0\u06ae\0\u070d\0\u076c\0\u07cb\0\u082a\0\u0889"+
+ "\0\u08e8\0\u0947\0\u09a6\0\u0a05\0\u0a64\0\u0ac3\0\u0b22\0\u0b81"+
+ "\0\u0be0\0\u0c3f\0\u0c9e\0\u0b22\0\u0cfd\0\u0d5c\0\u0dbb\0\u0e1a"+
+ "\0\u0e79\0\u0b22\0\u0b22\0\u0ed8\0\u0f37\0\u0f96\0\u0b22\0\u0ff5"+
+ "\0\u0b22\0\u0b22\0\u0b22\0\u1054\0\u0b22\0\u10b3\0\u1112\0\u1171"+
+ "\0\u11d0\0\u122f\0\u128e\0\u12ed\0\u134c\0\u13ab\0\u140a\0\u1469"+
+ "\0\u14c8\0\u1527\0\u1586\0\u15e5\0\u1644\0\u16a3\0\u1702\0\u1761"+
+ "\0\u1054\0\u17c0\0\u181f\0\u0b22\0\u187e\0\u0b22\0\u18dd\0\u0b22"+
+ "\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u193c\0\u0b22\0\u199b"+
+ "\0\u19fa\0\u0b22\0\u1a59\0\u1ab8\0\u0b22\0\u0b22\0\u1b17\0\u1b76"+
+ "\0\u1bd5\0\u1c34\0\u1c93\0\u1cf2\0\u1d51\0\u1db0\0\u0b22\0\u1e0f"+
+ "\0\u1e6e\0\u1ecd\0\u0b22\0\u1f2c\0\u1f8b\0\u1fea\0\u2049\0\u20a8"+
+ "\0\u2107\0\u2166\0\u21c5\0\u2224\0\u2283\0\u22e2\0\u2341\0\u23a0"+
+ "\0\u23ff\0\u245e\0\u0b22\0\u24bd\0\u251c\0\u257b\0\u0b22\0\u25da"+
+ "\0\u0b22\0\u2639\0\u0b22\0\u0b22\0\u25da\0\u2698\0\u0b22\0\u26f7"+
+ "\0\u2756\0\u27b5\0\u2814\0\u2873\0\u28d2\0\u0b22\0\u2931\0\u2990"+
+ "\0\u29ef\0\u2a4e\0\u0b22\0\u2aad\0\u0b22\0\u2b0c\0\u2b6b\0\u2bca"+
+ "\0\u2c29\0\u2c88\0\u2ce7\0\u2d46\0\u2da5\0\u2e04\0\u2e63\0\u2ec2"+
+ "\0\u2f21\0\u2f80\0\u2fdf\0\u303e\0\u309d\0\u30fc\0\u315b\0\u31ba"+
+ "\0\u3219\0\u3278\0\u32d7\0\u3336\0\u3395\0\u33f4\0\u3453\0\u34b2"+
+ "\0\u3511\0\u0b22\0\u3570\0\u35cf\0\u362e\0\u368d\0\u36ec\0\u0b22"+
+ "\0\u374b\0\u37aa\0\u0b22\0\u0b22\0\u3809\0\u3868\0\u0b22\0\u38c7"+
+ "\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u0b22\0\u3985\0\u39e4\0\u3a43"+
+ "\0\u3aa2\0\u3b01\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u3985"+
+ "\0\u3b60\0\u3bbf\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3926\0\u0b22"+
+ "\0\u3c1e\0\u3c7d\0\u3cdc\0\u3d3b\0\u3d9a\0\u3df9\0\u0b22\0\u0b22"+
+ "\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u0b22\0\u3e58\0\u3eb7\0\u3f16"+
+ "\0\u3f75\0\u3fd4\0\u4033\0\u0b22\0\u4092\0\u40f1\0\u4150\0\u41af"+
+ "\0\u420e\0\u426d\0\u42cc\0\u432b\0\u438a\0\u43e9\0\u4448\0\u44a7"+
+ "\0\u4506\0\u4565\0\u45c4\0\u4623\0\u4682\0\u46e1\0\u4740\0\u479f"+
+ "\0\u47fe\0\u485d\0\u48bc\0\u491b\0\u497a\0\u49d9\0\u4a38\0\u4a97"+
+ "\0\u4af6\0\u4b55\0\u4bb4\0\u4c13\0\u4c72\0\u4cd1\0\u4d30\0\u4d8f"+
+ "\0\u4dee\0\u4e4d\0\u4eac\0\u4f0b\0\u4f6a\0\u4fc9\0\u5028\0\u5087"+
+ "\0\u50e6\0\u5145\0\u51a4\0\u5203\0\u5262\0\u52c1\0\u5320\0\u537f"+
+ "\0\u53de\0\u543d\0\u549c\0\u54fb\0\u555a\0\u55b9\0\u5618\0\u5677"+
+ "\0\u56d6\0\u5735\0\u5794\0\u57f3\0\u5852\0\u58b1\0\u5910\0\u596f"+
+ "\0\u59ce\0\u5a2d\0\u5a8c\0\u5aeb\0\u5b4a\0\u5ba9\0\u0b22\0\u1e0f"+
+ "\0\u5c08\0\u5c67\0\u5cc6\0\u0b22\0\u5d25\0\u5d84\0\u5cc6\0\u5de3"+
+ "\0\u5e42\0\u5ea1\0\u5f00\0\u5f00\0\u5f5f\0\u5f00\0\u5fbe\0\u601d"+
+ "\0\u607c\0\u60db\0\u613a\0\u1b76\0\u6199\0\u61f8\0\u6257\0\u62b6"+
+ "\0\u6315\0\u6374\0\u63d3\0\u6432\0\u6491\0\u64f0\0\u654f\0\u65ae"+
+ "\0\u660d\0\u666c\0\u66cb\0\u672a\0\u6789\0\u67e8\0\u6847\0\u68a6"+
+ "\0\u6905\0\u6964\0\u69c3\0\u6a22\0\u6a81\0\u6ae0\0\u6b3f\0\u6b9e"+
+ "\0\u6bfd\0\u6c5c\0\u6cbb\0\u6d1a\0\u6d79\0\u6dd8\0\u6e37\0\u6e96"+
+ "\0\u6ef5\0\u6f54\0\u6fb3\0\u7012\0\u7071\0\u70d0\0\u712f\0\u718e"+
+ "\0\u71ed\0\u724c\0\u0b22\0\u72ab\0\u730a\0\u7369\0\u0b22\0\u73c8"+
+ "\0\u7427\0\u7486\0\u74e5\0\u7544\0\u75a3\0\u7602\0\u7661\0\u76c0"+
+ "\0\u5d84\0\u771f\0\u777e\0\u77dd\0\u783c\0\u789b\0\u78fa\0\u7959"+
+ "\0\u79b8\0\u7a17\0\u0b22\0\u7a76\0\u7ad5\0\u7b34\0\u7b93\0\u7bf2"+
+ "\0\u7c51\0\u7cb0\0\u7d0f\0\u7d6e\0\u7dcd\0\u7e2c\0\u7e8b\0\u7eea"+
+ "\0\u7f49\0\u7fa8\0\u8007\0\u8066\0\u80c5\0\u8124\0\u8183\0\u81e2"+
+ "\0\u8241\0\u82a0\0\u82ff\0\u835e\0\u83bd\0\u841c\0\u847b\0\u84da"+
+ "\0\u8539\0\u8598\0\u85f7\0\u8656\0\u86b5\0\u8714\0\u8773\0\u87d2"+
+ "\0\u8831\0\u8890\0\u88ef\0\u894e\0\u89ad\0\u8a0c\0\u8a6b\0\u8aca"+
+ "\0\u8b29\0\u8b88\0\u8be7\0\u8c46\0\u8ca5\0\u8d04\0\u8d63\0\u8dc2"+
+ "\0\u8e21\0\u8e80\0\u8edf\0\u8f3e\0\u8f9d\0\u8ffc\0\u905b\0\u90ba"+
+ "\0\u9119\0\u9178\0\u91d7\0\u9236\0\u9295\0\u92f4\0\u9353\0\u93b2"+
+ "\0\u9411\0\u9470\0\u94cf\0\u952e\0\u958d\0\u95ec\0\u964b\0\u96aa"+
+ "\0\u9709\0\u9768\0\u97c7\0\u9826\0\u9885\0\u98e4\0\u9943\0\u99a2"+
+ "\0\u9a01\0\u9a60\0\u9abf\0\u9b1e\0\u9b7d\0\u9bdc\0\u9c3b\0\u9c9a"+
+ "\0\u9cf9\0\u9d58\0\u9db7\0\u9e16\0\u9e75\0\u9ed4\0\u9f33\0\u9f92"+
+ "\0\u9ff1\0\ua050\0\ua0af\0\ua10e\0\ua16d\0\ua1cc\0\ua22b\0\ua28a"+
+ "\0\ua2e9\0\ua348\0\ua3a7\0\ua406\0\ua465\0\ua4c4\0\ua523\0\ua582"+
+ "\0\ua5e1\0\ua640\0\ua69f\0\ua6fe\0\ua75d\0\ua7bc\0\ua81b\0\ua87a"+
+ "\0\ua8d9\0\ua938\0\ua997\0\ua9f6\0\uaa55\0\uaab4\0\uab13\0\uab72"+
+ "\0\uabd1\0\uac30\0\uac8f\0\uacee\0\uad4d\0\uadac\0\uae0b\0\uae6a"+
+ "\0\uaec9\0\uaf28\0\uaf87\0\u1b76\0\uafe6\0\ub045\0\ub0a4\0\ub103"+
+ "\0\ub162\0\ub1c1\0\ub220\0\ub27f\0\ub2de\0\ub33d\0\ub39c\0\ub3fb"+
+ "\0\ub45a\0\ub4b9\0\ub518\0\ub577\0\ub5d6\0\ub635\0\ub694\0\ub6f3"+
+ "\0\ub752\0\ub7b1\0\ub810\0\ub86f\0\ub8ce\0\ub92d\0\ub98c\0\ub9eb"+
+ "\0\uba4a\0\ubaa9\0\ubb08\0\ubb67\0\ubbc6\0\ubc25\0\ubc84\0\ubce3"+
+ "\0\ubd42\0\ubda1\0\ube00\0\ube5f\0\ubebe\0\ubf1d\0\ubf7c\0\ubfdb"+
+ "\0\uc03a\0\uc099\0\uc0f8\0\uc157\0\uc1b6\0\uc215\0\uc274\0\u0b22"+
+ "\0\u0b22\0\uc2d3\0\u0b22\0\uc332\0\u0b22\0\uc391\0\uc3f0\0\uc44f"+
+ "\0\uc4ae\0\uc50d\0\uc56c\0\uc5cb\0\uc62a\0\uc689\0\uc6e8\0\uc747"+
+ "\0\uc7a6\0\uc805\0\uc864\0\uc8c3\0\u0b22\0\uc922\0\uc981\0\uc9e0"+
+ "\0\uca3f\0\uca9e\0\u3d9a\0\ucafd\0\u0b22\0\u3eb7\0\ucb5c\0\ucbbb"+
+ "\0\ucc1a\0\ucc79\0\u0b22\0\uccd8\0\ucd37\0\ucd96\0\ucdf5\0\uce54"+
+ "\0\uceb3\0\ucf12\0\ucf71\0\ucfd0\0\ud02f\0\ud08e\0\ud0ed\0\ud14c"+
+ "\0\ud1ab\0\ud20a\0\ud269\0\ud2c8\0\ud327\0\ud386\0\ud3e5\0\ud444"+
+ "\0\ud4a3\0\ud502\0\ud561\0\ud5c0\0\ud61f\0\ud67e\0\ud6dd\0\ud73c"+
+ "\0\ud79b\0\ud7fa\0\ud859\0\ud8b8\0\ud917\0\ud976\0\u4cd1\0\ud9d5"+
+ "\0\uda34\0\uda93\0\udaf2\0\udb51\0\udbb0\0\udc0f\0\udc6e\0\udccd"+
+ "\0\udd2c\0\udd8b\0\uddea\0\ude49\0\udea8\0\udf07\0\udf66\0\udfc5"+
+ "\0\u140a\0\ue024\0\ue083\0\ue0e2\0\ue141\0\ue1a0\0\ue1ff\0\ue25e"+
+ "\0\ue2bd\0\ue31c\0\ue37b\0\ue3da\0\ue439\0\ue498\0\ue4f7\0\ue556"+
+ "\0\ue5b5\0\ue614\0\ue673\0\ue6d2\0\ue731\0\ue790\0\ue7ef\0\ue84e"+
+ "\0\ue8ad\0\u5f00\0\ue90c\0\ue96b\0\ue9ca\0\uea29\0\uea88\0\ueae7"+
+ "\0\ueb46\0\ueba5\0\uec04\0\uec63\0\uecc2\0\ued21\0\ued80\0\ueddf"+
+ "\0\uee3e\0\uee9d\0\ueefc\0\uef5b\0\uefba\0\uf019\0\uf078\0\uf0d7"+
+ "\0\uf136\0\uf195\0\uf1f4\0\uf253\0\u1b76\0\uf2b2\0\uf311\0\uf370"+
+ "\0\uf3cf\0\uf42e\0\uf48d\0\uf4ec\0\uf54b\0\uf5aa\0\uf609\0\uf668"+
+ "\0\uf6c7\0\uf726\0\uf785\0\uf7e4\0\uf843\0\uf8a2\0\uf901\0\uf960"+
+ "\0\uf9bf\0\ufa1e\0\ufa7d\0\ufadc\0\ufb3b\0\ufb9a\0\ufbf9\0\ufc58"+
+ "\0\ufcb7\0\ufd16\0\ufd75\0\ufdd4\0\ufe33\0\ufe92\0\ufef1\0\uff50"+
+ "\0\uffaf\1\16\1\155\1\314\1\u012b\1\u018a\1\u01e9\1\u0248"+
+ "\1\u02a7\1\u0306\1\u0365\1\u03c4\1\u0423\1\u0482\1\u04e1\1\u0540"+
+ "\1\u059f\1\u05fe\1\u065d\1\u06bc\1\u071b\1\u077a\1\u07d9\1\u0838"+
+ "\1\u0897\1\u08f6\1\u0955\1\u09b4\1\u0a13\1\u0a72\1\u0ad1\1\u0b30"+
+ "\1\u0b8f\1\u0bee\1\u0c4d\1\u0cac\1\u0d0b\1\u0d6a\1\u0dc9\1\u0e28"+
+ "\1\u0e87\1\u0ee6\1\u0f45\1\u0fa4\1\u1003\1\u1062\1\u10c1\1\u1120"+
+ "\1\u117f\1\u11de\1\u123d\1\u129c\1\u12fb\1\u135a\1\u13b9\1\u1418"+
+ "\1\u1477\1\u14d6\1\u1535\1\u1594\1\u15f3\1\u1652\1\u16b1\1\u1710"+
+ "\1\u176f\1\u17ce\1\u182d\1\u188c\1\u18eb\1\u194a\1\u19a9\1\u1a08"+
+ "\1\u1a67\1\u1ac6\1\u1b25\1\u1b84\1\u1be3\1\u1c42\1\u1ca1\1\u1d00"+
+ "\1\u1d5f\1\u1dbe\1\u1e1d\1\u1e7c\1\u1edb\1\u1f3a\1\u1f99\1\u1ff8"+
+ "\1\u2057\1\u20b6\1\u2115\1\u2174\1\u21d3\1\u2232\1\u2291\1\u22f0"+
+ "\1\u234f\1\u23ae\1\u240d\1\u246c\1\u24cb\1\u252a\1\u2589\1\u25e8"+
+ "\1\u2647\1\u26a6\1\u2705\1\u2764\1\u27c3\1\u2822\1\u2881\1\u28e0"+
+ "\1\u293f\1\u299e\1\u29fd\1\u2a5c\1\u2abb\1\u1f3a\1\u2b1a\1\u2b79"+
+ "\1\u2bd8\1\u2c37\1\u2c96\1\u2cf5\1\u2d54\1\u2db3\1\u2e12\1\u2e71"+
+ "\1\u2ed0\1\u2f2f\1\u2f8e\1\u2fed\1\u304c\1\u30ab\1\u310a\1\u3169"+
+ "\1\u31c8\1\u3227\1\u3286\1\u32e5\1\u3344\1\u33a3\1\u3402\1\u3461"+
+ "\1\u34c0\1\u351f\1\u357e\1\u35dd\1\u363c\1\u369b\1\u36fa\1\u3759"+
+ "\1\u37b8\1\u3817\1\u3876\1\u38d5\1\u3934\1\u3993\1\u39f2\1\u3a51"+
+ "\1\u3ab0\1\u3b0f\1\u3b6e\1\u3bcd\1\u3c2c\1\u3c8b\1\u3cea\1\u3d49"+
+ "\1\u3da8\1\u3e07\1\u3e66\1\u3ec5\1\u3f24\0\uf253\1\u3f83\1\u3fe2"+
+ "\1\u4041\1\u40a0\1\u40ff\1\u415e\1\u41bd\1\u421c\1\u427b\1\u42da"+
+ "\1\u4339\1\u4398\1\u43f7\1\u4456\1\u44b5\1\u4514\1\u4573\1\u45d2"+
+ "\1\u4631\1\u4690\1\u46ef\1\u474e\1\u47ad\1\u480c\1\u486b\1\u48ca"+
+ "\1\u4929\1\u4988\1\u49e7\1\u4a46\1\u4aa5\1\u4b04\1\u4b63\1\u4bc2"+
+ "\1\u4c21\1\u4c80\1\u4cdf\1\u4d3e\1\u4d9d\1\u4dfc\1\u4e5b\1\u4eba"+
+ "\1\u4f19\1\u4f78\1\u4fd7\1\u5036\1\u5095\1\u50f4\1\u5153\1\u51b2"+
+ "\1\u5211\1\u5270\1\u52cf\1\u532e\1\u538d\1\u53ec\1\u544b\1\u54aa"+
+ "\1\u5509\1\u5568\1\u55c7\1\u5626\1\u5685\1\u56e4\1\u5743\1\u57a2"+
+ "\1\u5801\1\u5860\1\u58bf\1\u591e\1\u597d\1\u59dc\1\u5a3b\1\u5a9a"+
+ "\1\u5af9\1\u5b58\1\u5bb7\1\u5c16\1\u5c75\1\u5cd4\1\u5d33\1\u5d92"+
+ "\1\u5df1\1\u5e50\1\u5eaf\1\u5f0e\1\u5f6d\1\u5fcc\1\u602b\1\u608a"+
+ "\1\u60e9\1\u6148\1\u61a7\1\u6206\1\u6265\1\u62c4\1\u6323\1\u6382"+
+ "\1\u63e1\1\u6440\1\u649f\1\u64fe\1\u655d\1\u65bc\1\u661b\1\u667a"+
+ "\1\u66d9\1\u6738\1\u6797\1\u67f6\1\u6855\1\u68b4\1\u6913\1\u6972"+
+ "\1\u69d1\1\u6a30\1\u6a8f\1\u6aee\1\u6b4d\1\u6bac\1\u6c0b\1\u6c6a"+
+ "\1\u6cc9\1\u6d28\1\u6d87\1\u6de6\1\u6e45\1\u1e7c\1\u6ea4\1\u6f03"+
+ "\1\u6f62\1\u6fc1\1\u7020\1\u707f\1\u70de\1\u713d\1\u719c\1\u71fb"+
+ "\1\u725a\1\u72b9\1\u7318\1\u7377\1\u73d6\1\u7435\1\u7494\1\u74f3"+
+ "\1\u7552\1\u75b1\1\u7610\1\u766f\1\u76ce\1\u772d\1\u778c\1\u77eb"+
+ "\1\u784a\1\u78a9\1\u7908\1\u7967\1\u79c6\1\u7a25\1\u7a84\1\u7ae3"+
+ "\1\u7b42\1\u7ba1\1\u7c00\1\u7c5f\1\u7cbe\1\u7d1d\1\u7d7c\1\u7ddb"+
+ "\1\u7e3a\1\u7e99\1\u7ef8\1\u7f57\1\u7fb6\1\u8015\1\u8074\1\u80d3"+
+ "\1\u8132\1\u8191\1\u81f0\1\u824f\1\u82ae\1\u830d\1\u836c\1\u83cb"+
+ "\1\u842a\1\u8489\1\u84e8\1\u8547\1\u85a6\1\u8605\1\u8664\1\u86c3"+
+ "\1\u8722\1\u8781\1\u87e0\1\u883f\1\u889e\1\u88fd\1\u895c\1\u89bb"+
+ "\1\u8a1a\1\u8a79\1\u8ad8\1\u8b37\1\u8b96\1\u8bf5\1\u8c54\1\u8cb3"+
+ "\1\u8d12\1\u8d71\1\u8dd0\1\u8e2f\1\u8e8e\1\u8eed\1\u8f4c\1\u8fab"+
+ "\1\u900a\1\u9069\1\u90c8\1\u9127\1\u9186\1\u91e5\1\u9244\1\u92a3"+
+ "\1\u9302\1\u9361\1\u93c0\1\u941f\1\u947e\1\u94dd\1\u953c\1\u959b"+
+ "\1\u95fa\1\u9659\1\u96b8\1\u9717\0\u0b22\1\u9776\1\u97d5\1\u9834"+
+ "\1\u9893\1\u98f2\1\u9951\1\u99b0\1\u9a0f\1\u9a6e\1\u9acd\1\u9b2c"+
+ "\1\u9b8b\1\u9bea\1\u9c49\1\u9ca8\1\u9d07\1\u9d66\1\u9dc5\1\u9e24"+
+ "\1\u9e83\1\u9ee2\1\u9f41\1\u9fa0\1\u9fff\1\ua05e\1\ua0bd\1\ua11c"+
+ "\1\ua17b\1\ua1da\1\ua239\1\ua298\0\ud859\0\u4dee\1\ua2f7\1\ua356"+
+ "\1\ua3b5\1\ua414\1\ua473\1\ua4d2\1\ua531\1\ua590\1\ua5ef\1\ua64e"+
+ "\0\u0b22\1\ua6ad\1\ua70c\1\ua76b\1\ua7ca\1\ua829\1\ua888\1\ua8e7"+
+ "\1\ua946\0\u1b76\1\ua9a5\1\uaa04\1\uaa63\1\uaac2\0\u1b76\1\uab21"+
+ "\1\uab80\1\uabdf\1\uac3e\1\uac9d\0\u1b76\1\uacfc\1\uad5b\1\uadba"+
+ "\1\uae19\1\uae78\1\uaed7\1\uaf36\1\uaf95\1\uaff4\1\ub053\1\ub0b2"+
+ "\1\ub111\1\ub170\1\ub1cf\1\ub22e\0\u730a\0\u0b22\1\ub28d\1\ub2ec"+
+ "\1\ub34b\1\ub3aa\1\ub409\1\ub468\1\ub4c7\1\ub526\1\ub585\1\ub5e4"+
+ "\1\ub643\1\ub6a2\1\ub701\1\ub760\1\ub7bf\1\ub81e\1\ub87d\1\ub8dc"+
+ "\1\ub93b\1\ub99a\1\ub9f9\1\uba58\1\ubab7\1\ubb16\1\ubb75\1\ubbd4"+
+ "\1\ubc33\1\ubc92\1\ubcf1\1\ubd50\1\ubdaf\1\ube0e\1\ube6d\1\ubecc"+
+ "\1\ubf2b\1\ubf8a\1\ubfe9\1\uc048\1\uc0a7\1\uc106\1\uc165\1\uc1c4"+
+ "\1\uc223\1\uc282\1\uc2e1\1\uc340\1\uc39f\1\uc3fe\1\uc45d\1\uc4bc"+
+ "\1\uc51b\1\uc57a\1\uc5d9\1\uc638\1\uc697\1\uc6f6\1\uc755\1\uc7b4"+
+ "\1\uc813\1\ubfe9\1\uc872\1\uc8d1\1\uc930\1\uc98f\1\uc9ee\1\uca4d"+
+ "\1\ucaac\1\ucb0b\1\ucb6a\1\ucbc9\1\ucc28\1\ucc87\1\ucce6\1\ucd45"+
+ "\1\ucda4\1\uce03\1\uce62\1\ucec1\1\ucf20\1\ucf7f\1\ucfde\1\ud03d"+
+ "\1\ud09c\1\ud0fb\1\ud15a\1\ud1b9\1\ud218\1\ud277\1\ud2d6\1\ud335"+
+ "\1\ud394\1\ud3f3\1\ud452\1\ud4b1\1\ud510\0\u88ef\1\ud56f\1\ud5ce"+
+ "\1\ud62d\1\ud68c\1\ud6eb\1\ud74a\1\ud7a9\1\ud808\1\ud867\1\ud8c6"+
+ "\1\ud925\1\ud984\1\ud9e3\1\uda42\1\udaa1\1\udb00\1\udb5f\1\udbbe"+
+ "\1\udc1d\1\udc7c\1\udcdb\1\udd3a\1\udd99\1\uddf8\1\ude57\1\udeb6"+
+ "\1\udf15\1\udf74\1\udfd3\1\ue032\1\ue091\1\ue0f0\1\ue14f\1\ue1ae"+
+ "\1\ue20d\1\ue26c\1\ue2cb\1\ue32a\1\ue389\1\ue3e8\1\ue447\1\ue4a6"+
+ "\1\ue505\1\ue564\1\ue5c3\1\ue622\1\ue681\1\ue6e0\1\ue73f\1\ue79e"+
+ "\1\ue7fd\1\ue85c\1\ue8bb\1\ue91a\1\ue979\1\ue9d8\1\uea37\1\uea96"+
+ "\0\u1b76\1\ueaf5\1\ueb54\1\uebb3\1\uec12\1\uec71\1\uecd0\1\ued2f"+
+ "\1\ued8e\1\ueded\1\uee4c\1\ueeab\1\uef0a\1\uef69\1\uefc8\1\uf027"+
+ "\1\uf086\1\uf0e5\1\uf144\1\uf1a3\1\uf202\1\uf261\1\uf2c0\1\uf31f"+
+ "\1\uf37e\1\uf3dd\1\uf43c\1\uf49b\1\uf4fa\1\uf559\1\uf5b8\1\uf617"+
+ "\1\uf676\1\uf6d5\1\uf734\1\uf793\1\uf7f2\1\uf851\1\uf8b0\1\uf90f"+
+ "\1\uf96e\1\uf9cd\1\ufa2c\1\ufa8b\1\u15f3\1\ufaea\1\ufb49\1\ufba8"+
+ "\1\ufc07\1\ufc66\1\ufcc5\1\ufd24\1\ufd83\1\ufde2\1\ufe41\1\ufea0"+
+ "\1\ufeff\1\uff5e\1\uffbd\2\34\2\173\2\332\2\u0139\2\u0198"+
+ "\2\u01f7\2\u0256\2\u02b5\2\u0314\2\u0373\1\uacfc\2\u03d2\2\u0431"+
+ "\2\u0490\2\u04ef\2\u054e\2\u05ad\2\u060c\2\u066b\2\u06ca\2\u0729"+
+ "\2\u0788\2\u07e7\2\u0846\2\u08a5\2\u0904\2\u0963\2\u09c2\2\u0a21"+
+ "\2\u0a80\2\u0adf\2\u0b3e\2\u0b9d\2\u0bfc\2\u0c5b\2\u0cba\2\u0d19"+
+ "\2\u0d78\2\u0dd7\2\u0e36\2\u0e95\2\u0ef4\2\u0f53\2\u0fb2\2\u1011"+
+ "\2\u1070\2\u10cf\2\u112e\2\u118d\2\u11ec\2\u124b\2\u12aa\2\u1309"+
+ "\2\u1368\2\u13c7\2\u1426\2\u1485\2\u14e4\2\u1543\2\u15a2\2\u1601"+
+ "\2\u1660\2\u16bf\2\u171e\2\u177d\2\u17dc\2\u183b\2\u189a\2\u18f9"+
+ "\2\u1958\2\u19b7\2\u1a16\2\u1a75\2\u1ad4\2\u1b33\2\u1b92\2\u1bf1"+
+ "\2\u1c50\2\u1caf\2\u1d0e\2\u1d6d\2\u1dcc\2\u1e2b\2\u1e8a\2\u1ee9"+
+ "\2\u1f48\2\u1fa7\2\u2006\2\u2065\2\u20c4\2\u2123\2\u2182\2\u21e1"+
+ "\2\u2240\2\u229f\2\u22fe\2\u235d\2\u23bc\2\u241b\2\u247a\2\u24d9"+
+ "\2\u2538\2\u2597\2\u25f6\2\u2655\2\u26b4\2\u2713\2\u2772\2\u27d1"+
+ "\2\u2830\1\u6a30\2\u288f\2\u28ee\2\u294d\2\u29ac\2\u2a0b\2\u2a6a"+
+ "\2\u2ac9\2\u2b28\2\u2b87\2\u2be6\2\u2c45\2\u2ca4\2\u2d03\2\u2d62"+
+ "\2\u2dc1\2\u2e20\2\u2e7f\2\u2ede\2\u2f3d\2\u2f9c\2\u2ffb\2\u305a"+
+ "\2\u30b9\2\u3118\2\u3177\2\u31d6\2\u3235\2\u3294\2\u32f3\2\u3352"+
+ "\2\u33b1\2\u3410\2\u346f\2\u34ce\2\u352d\2\u358c\2\u35eb\2\u364a"+
+ "\2\u36a9\2\u3708\2\u3767\2\u37c6\2\u3825\2\u3884\2\u38e3\2\u3942"+
+ "\2\u39a1\2\u3a00\2\u3a5f\2\u3abe\2\u3b1d\2\u3b7c\2\u3bdb\2\u3c3a"+
+ "\2\u3c99\2\u3cf8\2\u3d57\2\u3db6\2\u3e15\2\u3e74\2\u3ed3\2\u3f32"+
+ "\2\u3f91\2\u3ff0\2\u404f\2\u40ae\2\u410d\2\u416c\2\u41cb\2\u422a"+
+ "\2\u4289\2\u42e8\2\u4347\2\u43a6\2\u4405\2\u4464\2\u44c3\2\u4522"+
+ "\2\u4581\2\u45e0\2\u463f\2\u469e\2\u46fd\2\u475c\2\u47bb\2\u481a"+
+ "\2\u4879\2\u48d8\2\u4937\2\u4996\2\u49f5\2\u4a54\2\u4ab3\2\u4b12"+
+ "\2\u4b71\2\u4bd0\2\u4c2f\2\u4c8e\2\u4ced\2\u4d4c\2\u4dab\2\u4e0a"+
+ "\2\u4e69\2\u4ec8\2\u4f27\2\u4f86\2\u4fe5\2\u5044\2\u50a3\2\u5102"+
+ "\2\u5161\2\u51c0\2\u521f\2\u527e\2\u52dd\2\u533c\2\u539b\2\u53fa"+
+ "\2\u5459\2\u54b8\2\u5517\2\u5576\2\u55d5\2\u5634\2\u5693\2\u56f2"+
+ "\2\u5751\2\u57b0\2\u580f\2\u586e\2\u58cd\2\u592c\2\u598b\2\u59ea"+
+ "\2\u5a49\2\u5aa8\2\u5b07\2\u5b66\2\u5bc5\2\u5c24\2\u5c83\2\u5ce2"+
+ "\2\u5d41\2\u5da0\2\u5dff\2\u5e5e\2\u5ebd\2\u5f1c\2\u5f7b\2\u5fda"+
+ "\2\u6039\2\u6098\2\u60f7\2\u6156\2\u61b5\2\u6214\2\u6273\2\u62d2"+
+ "\2\u6331\2\u6390\2\u63ef\2\u644e\2\u64ad\2\u650c\2\u656b\2\u65ca"+
+ "\2\u6629\2\u6688\2\u66e7\2\u6746\2\u67a5\2\u6804\2\u6863\2\u68c2"+
+ "\2\u6921\2\u6980\2\u69df\2\u6a3e\2\u6a9d\2\u6afc\2\u6b5b\2\u6bba"+
+ "\2\u6c19\2\u6c78\2\u6cd7\2\u6d36\2\u6d95\2\u6df4\2\u6e53\2\u6eb2"+
+ "\2\u6f11\2\u6f70\2\u6fcf\2\u702e\2\u708d\2\u70ec\2\u714b\2\u71aa"+
+ "\2\u7209\2\u7268\2\u72c7\2\u7326\2\u7385\2\u73e4\2\u7443\0\u0b22"+
+ "\2\u74a2\2\u7501\2\u7560\2\u75bf\2\u761e\0\u0b22\2\u767d\1\u9893"+
+ "\0\u0ed8\2\u76dc\2\u773b\2\u779a\2\u77f9\2\u7858\2\u78b7\2\u7916"+
+ "\2\u7975\2\u79d4\2\u7a33\2\u7a33\2\u7a92\2\u7af1\2\u7b50\2\u7baf"+
+ "\2\u7c0e\2\u7c6d\2\u7ccc\2\u7d2b\2\u7d8a\0\u0b22\2\u7de9\0\u0b22"+
+ "\2\u7e48\2\u7ea7\2\u7f06\2\u7f65\2\u7fc4\2\u8023\0\uecc2\2\u8082"+
+ "\2\u80e1\2\u8140\2\u819f\2\u81fe\2\u825d\2\u82bc\2\u831b\2\u837a"+
+ "\2\u83d9\2\u8438\2\u8497\2\u84f6\2\u8555\2\u85b4\2\u8613\1\ub3aa"+
+ "\2\u8672\2\u86d1\1\ub526\2\u8730\2\u878f\2\u87ee\2\u884d\2\u88ac"+
+ "\2\u890b\2\u896a\2\u89c9\2\u8a28\2\u8a87\2\u8ae6\2\u8b45\2\u8ba4"+
+ "\2\u8c03\2\u8c62\2\u8cc1\2\u8d20\2\u8d7f\2\u8dde\2\u8e3d\2\u8e9c"+
+ "\2\u8efb\2\u8f5a\0\u9e16\2\u8fb9\2\u9018\2\u9077\2\u90d6\2\u9135"+
+ "\2\u9194\2\u91f3\2\u9252\2\u92b1\2\u9310\2\u936f\2\u93ce\2\u942d"+
+ "\2\u948c\2\u94eb\2\u954a\2\u95a9\2\u9608\2\u9667\2\u96c6\2\u9725"+
+ "\2\u9784\2\u97e3\2\u9842\2\u98a1\2\u9900\2\u995f\2\u99be\2\u9a1d"+
+ "\2\u9a7c\2\u9adb\2\u9b3a\2\u9b99\2\u9bf8\2\u9c57\2\u9cb6\2\u9d15"+
+ "\2\u9d74\2\u9dd3\2\u9e32\2\u9e91\2\u9ef0\2\u9f4f\2\u9fae\2\ua00d"+
+ "\2\ua06c\2\ua0cb\2\ua12a\2\ua189\2\ua1e8\2\ua247\2\ua2a6\2\ua305"+
+ "\2\ua364\2\ua3c3\2\ua422\2\ua481\2\ua4e0\2\ua53f\2\ua59e\2\ua5fd"+
+ "\2\ua65c\2\ua6bb\2\ua71a\2\ua779\2\ua7d8\2\ua837\2\ua896\2\ua8f5"+
+ "\2\ua954\2\ua9b3\2\uaa12\2\uaa71\2\uaad0\2\uab2f\2\uab8e\2\uabed"+
+ "\2\uac4c\2\uacab\2\uad0a\2\uad69\2\uadc8\2\uae27\2\uae86\2\uaee5"+
+ "\2\uaf44\2\uafa3\2\ub002\2\ub061\2\ub0c0\2\ub11f\2\ub17e\2\ub1dd"+
+ "\2\ub23c\2\ub29b\2\ub2fa\2\ub359\2\ub3b8\2\ub417\2\ub476\2\ub4d5"+
+ "\2\ub534\2\ub593\2\ub5f2\2\ub651\2\ub6b0\2\ub70f\2\ub76e\2\ub7cd"+
+ "\2\ub82c\2\ub88b\2\ub8ea\2\ub949\2\ub9a8\2\uba07\2\uba66\2\ubac5"+
+ "\2\ubb24\2\ubb83\2\ubbe2\2\ubc41\2\ubca0\2\ubcff\2\ubd5e\2\ubdbd"+
+ "\2\ube1c\2\ube7b\2\ubeda\2\ubf39\2\ubf98\2\ubff7\2\uc056\2\uc0b5"+
+ "\2\uc114\2\uc173\2\uc1d2\2\uc231\2\uc290\2\uc2ef\2\uc34e\2\uc3ad"+
+ "\2\uc40c\2\uc46b\2\uc4ca\2\uc529\2\uc588\2\uc5e7\2\uc646\2\uc6a5"+
+ "\2\uc704\2\uc763\2\uc7c2\2\uc821\2\uc880\2\uc8df\2\ub651\2\uc93e"+
+ "\2\uc99d\2\uc9fc\2\uca5b\2\ucaba\2\ucb19\2\ucb78\2\ucbd7\2\ucc36"+
+ "\2\ucc95\2\uccf4\2\ucd53\2\ucdb2\2\uce11\2\uce70\2\ucecf\2\ucf2e"+
+ "\2\ucf8d\2\uc93e\2\ucfec\2\ud04b\2\ud0aa\2\ud109\2\ud168\2\ud1c7"+
+ "\2\ud226\2\ud285\2\ud2e4\2\ud343\2\ud3a2\2\ud401\2\ud460\2\ud4bf"+
+ "\2\ud51e\2\ud57d\2\ud5dc\2\ud63b\2\ud69a\2\ud6f9\2\ud758\2\ud7b7"+
+ "\2\ud816\2\ud875\2\ud8d4\2\ud933\2\ud992\2\ud9f1\2\uda50\2\udaaf"+
+ "\2\udb0e\2\udb6d\2\udbcc\2\udc2b\2\udc8a\2\udce9\2\udd48\2\udda7"+
+ "\2\ude06\2\ude65\2\udec4\2\udf23\2\udf82\2\udfe1\2\ue040\2\ue09f"+
+ "\2\ue0fe\2\ue15d\2\ue1bc\2\ue21b\2\ue27a\2\ue2d9\2\ue338\2\ue397"+
+ "\2\ue3f6\1\uf086\2\ue455\2\ue4b4\2\ue513\2\ue572\2\ue5d1\2\ue630"+
+ "\2\ue68f\2\ue6ee\2\ue74d\2\ue7ac\2\ue80b\2\ue86a\2\ue8c9\2\ue928"+
+ "\2\ue987\2\ue9e6\2\uea45\2\ueaa4\2\ueb03\2\ueb62\2\uebc1\2\uec20"+
+ "\2\uec7f\2\uecde\2\ued3d\2\ued9c\2\uedfb\2\uee5a\2\ueeb9\2\uef18"+
+ "\2\uef77\2\uefd6\2\uf035\2\uf094\2\uf0f3\2\uf152\2\uf1b1\2\uf210"+
+ "\2\uf26f\2\uf2ce\2\uf32d\2\uf38c\2\uf3eb\2\uf44a\2\uf4a9\2\uf508"+
+ "\2\uf567\2\uf5c6\2\uf625\2\uf684\2\uf6e3\2\uf742\2\uf7a1\2\uf800"+
+ "\2\uf85f\2\uf8be\2\uf91d\2\uf97c\2\uf9db\2\ufa3a\2\ufa99\2\ufaf8"+
+ "\2\ufb57\2\ufbb6\2\ufc15\2\ufc74\2\ufcd3\2\ufd32\2\ufd91\2\ufdf0"+
+ "\2\ufe4f\2\ufeae\2\uff0d\2\uff6c\2\uffcb\3\52\3\211\3\350"+
+ "\3\u0147\3\u01a6\3\u0205\3\u0264\3\u02c3\3\u0322\3\u0381\3\u03e0"+
+ "\3\u043f\3\u049e\3\u04fd\3\u055c\3\u05bb\3\u061a\3\u0679\3\u06d8"+
+ "\3\u0737\3\u0796\3\u07f5\3\u0854\3\u08b3\3\u0912\3\u0971\3\u09d0"+
+ "\3\u0a2f\3\u0a8e\3\u0aed\3\u0b4c\3\u0bab\3\u0c0a\3\u0c69\3\u0cc8"+
+ "\3\u0d27\3\u0d86\3\u0de5\3\u0e44\3\u0ea3\3\u0f02\3\u0f61\3\u0fc0"+
+ "\3\u101f\3\u107e\3\u10dd\3\u113c\3\u119b\3\u11fa\3\u1259\3\u12b8"+
+ "\3\u1317\3\u1376\3\u13d5\3\u1434\3\u1493\3\u14f2\3\u1551\3\u15b0"+
+ "\3\u160f\3\u166e\3\u16cd\3\u172c\3\u178b\3\u17ea\3\u1849\3\u18a8"+
+ "\3\u1907\3\u1966\3\u19c5\3\u1a24\3\u1a83\3\u1ae2\3\u1b41\3\u1ba0"+
+ "\3\u1bff\3\u1c5e\3\u1cbd\3\u1d1c\3\u1d7b\3\u1dda\3\u1e39\3\u1e98"+
+ "\3\u1ef7\3\u1f56\3\u1fb5\3\u2014\3\u2073\3\u20d2\3\u2131\3\u2190"+
+ "\3\u21ef\3\u224e\3\u22ad\3\u230c\3\u236b\3\u23ca\3\u2429\3\u2488"+
+ "\3\u24e7\3\u2546\3\u25a5\3\u2604\3\u2663\3\u26c2\3\u2721\3\u2780"+
+ "\3\u27df\3\u283e\3\u289d\3\u28fc\3\u295b\3\u29ba\3\u2a19\3\u2a78"+
+ "\3\u2ad7\3\u2b36\3\u2b95\3\u2bf4\3\u2c53\3\u2cb2\3\u2d11\3\u2d70"+
+ "\3\u2dcf\3\u2e2e\3\u2e8d\3\u2eec\3\u2f4b\3\u2faa\3\u3009\3\u3068"+
+ "\3\u30c7\3\u3126\3\u3185\3\u31e4\3\u3243\3\u32a2\3\u3301\3\u3360"+
+ "\3\u33bf\3\u341e\3\u347d\3\u34dc\3\u353b\3\u359a\3\u35f9\3\u3658"+
+ "\3\u36b7\3\u3716\3\u3775\3\u37d4\3\u3833\3\u3892\3\u38f1\3\u3950"+
+ "\3\u39af\3\u3a0e\3\u3a6d\3\u3acc\3\u3b2b\3\u3b8a\3\u3be9\3\u3c48"+
+ "\3\u3ca7\3\u3d06\3\u3d65\3\u3dc4\3\u3e23\3\u3e82\3\u3ee1\3\u3f40"+
+ "\3\u3f9f\3\u3ffe\3\u405d\3\u40bc\3\u411b\3\u417a\3\u41d9\3\u4238"+
+ "\3\u4297\3\u42f6\3\u4355\3\u43b4\3\u4413\3\u4472\3\u44d1\3\u4530"+
+ "\3\u458f\3\u45ee\3\u464d\3\u46ac\3\u470b\3\u476a\3\u47c9\3\u4828"+
+ "\3\u4887\3\u48e6\3\u4945\3\u49a4\3\u4a03\3\u4a62\3\u4ac1\3\u4b20"+
+ "\3\u4b7f\3\u4bde\3\u4c3d\3\u4c9c\3\u4cfb\3\u4d5a\3\u4db9\3\u4e18"+
+ "\3\u4e77\3\u4ed6\3\u4f35\3\u4f94\3\u4ff3\3\u5052\3\u50b1\3\u5110"+
+ "\3\u516f\3\u51ce\3\u522d\3\u528c\3\u52eb\3\u534a\3\u53a9\3\u5408"+
+ "\3\u5467\3\u54c6\3\u5525\3\u5584\3\u55e3\3\u5642\3\u56a1\3\u5700"+
+ "\3\u575f\3\u57be\3\u581d\3\u587c\3\u58db\3\u593a\3\u5999\3\u59f8"+
+ "\3\u5a57\3\u5ab6\3\u5b15\3\u5b74\3\u5bd3\3\u5c32\3\u5c91\3\u5cf0"+
+ "\3\u5d4f\3\u5dae\3\u5e0d\3\u5e6c\3\u5ecb\3\u5f2a\3\u5f89\3\u5fe8"+
+ "\3\u6047\3\u60a6\1\u1710\3\u6105\3\u6164\3\u61c3\3\u6222\3\u6281"+
+ "\3\u62e0\3\u633f\3\u639e\3\u63fd\3\u645c\3\u64bb\3\u651a\3\u6579"+
+ "\3\u65d8\3\u6637\3\u6696\3\u66f5\3\u6754\3\u67b3\3\u6812\3\u6871"+
+ "\3\u68d0\3\u692f\3\u698e\3\u69ed\3\u6a4c\3\u6aab\3\u6b0a\3\u6b69"+
+ "\3\u6bc8\3\u6c27\3\u6c86\3\u6ce5\3\u6d44\3\u6da3\3\u6e02\3\u6e61"+
+ "\3\u6ec0\3\u6f1f\3\u6f7e\3\u6fdd\3\u703c\3\u709b\3\u70fa\3\u7159"+
+ "\3\u71b8\3\u7217\3\u7276\3\u72d5\3\u7334\3\u7393\3\u73f2\3\u7451"+
+ "\3\u74b0\0\u3f75\3\u750f\3\u756e\3\u75cd\3\u762c\3\u768b\3\u76ea"+
+ "\3\u7749\3\u77a8\3\u7807\3\u7866\3\u78c5\3\u7924\3\u7983\3\u79e2"+
+ "\3\u7a41\3\u7aa0\3\u7aff\3\u7b5e\3\u7bbd\3\u7c1c\3\u7c7b\3\u7cda"+
+ "\3\u7d39\3\u7d98\3\u7df7\3\u7e56\3\u7eb5\3\u7f14\3\u7f73\3\u7fd2"+
+ "\3\u8031\3\u8090\3\u80ef\3\u814e\3\u81ad\3\u820c\3\u826b\3\u82ca"+
+ "\3\u8329\3\u8388\3\u83e7\3\u8446\3\u84a5\3\u8504\3\u8563\3\u85c2"+
+ "\3\u8621\3\u8680\3\u86df\3\u873e\3\u879d\3\u87fc\3\u885b\3\u88ba"+
+ "\3\u8919\3\u8978\3\u89d7\3\u8a36\3\u8a95\3\u8af4\3\u8b53\3\u8bb2"+
+ "\3\u8c11\3\u8c70\3\u8ccf\3\u8d2e\3\u8d8d\3\u8dec\3\u8e4b\3\u8eaa"+
+ "\3\u8f09\3\u8f68\3\u8fc7\3\u9026\3\u9085\3\u90e4\3\u9143\3\u91a2"+
+ "\3\u9201\3\u9260\3\u92bf\3\u931e\3\u937d\3\u93dc\3\u943b\3\u949a"+
+ "\3\u94f9\3\u9558\3\u95b7\3\u9616\3\u9675\3\u96d4\3\u9733\3\u9792"+
+ "\3\u97f1\3\u9850\3\u98af\3\u990e\3\u996d\3\u99cc\3\u9a2b\3\u9a8a"+
+ "\3\u9ae9\3\u9b48\3\u9ba7\3\u9c06\3\u9c65\3\u9cc4\3\u9d23\3\u9d82"+
+ "\3\u9de1\3\u9e40\3\u9e9f\3\u9efe\3\u9f5d\3\u9fbc\3\ua01b\3\ua07a"+
+ "\3\ua0d9\3\ua138\3\ua197\3\ua1f6\3\ua255\3\ua2b4\3\ua313\3\ua372"+
+ "\3\ua3d1\3\ua430\3\ua48f\3\ua4ee\3\ua54d\3\ua5ac\3\ua60b\3\ua66a"+
+ "\3\ua6c9\3\ua728\3\ua787\3\ua7e6\3\ua845\3\ua8a4\3\ua903\3\ua962"+
+ "\3\ua9c1\3\uaa20\3\uaa7f\3\uaade\3\uab3d\3\uab9c\3\uabfb\3\uac5a"+
+ "\3\uacb9\3\uad18\3\uad77\3\uadd6\3\uae35\3\uae94\3\uaef3\3\uaf52"+
+ "\3\uafb1\3\ub010\3\ub06f\3\ub0ce\3\ub12d\3\ub18c\3\ub1eb\3\ub24a"+
+ "\3\ub2a9\3\ub308\3\ub367\3\ub3c6\3\ub425\3\ub484\3\ub4e3\3\ub542"+
+ "\3\ub5a1\3\ub600\3\ub65f\3\ub6be\3\ub71d\3\ub77c\3\ub7db\3\ub83a"+
+ "\3\ub899\3\ub8f8\3\ub957\3\ub9b6\3\uba15\3\uba74\3\ubad3\3\ubb32"+
+ "\3\ubb91\3\ubbf0\3\ubc4f\3\ubcae\3\ubd0d\3\ubd6c\3\ubdcb\3\ube2a"+
+ "\3\ube89\0\u8598\3\ubee8\3\ubf47\3\ubfa6\3\uc005\3\uc064\3\uc0c3"+
+ "\3\uc122\3\uc181\3\uc1e0\3\uc23f\3\uc29e\3\uc2fd\3\uc35c\3\uc3bb"+
+ "\3\uc41a\3\uc479\3\uc4d8\3\uc537\3\uc596\3\uc5f5\3\uc654\3\uc6b3"+
+ "\3\uc712\3\uc771\3\uc7d0\3\uc82f\3\uc88e\3\uc8ed\3\uc94c\3\uc9ab"+
+ "\3\uca0a\3\uca69\3\ucac8\3\ucb27\3\ucb86\3\ucbe5\3\ucc44\3\ucca3"+
+ "\3\ucd02\3\ucd61\3\ucdc0\3\uce1f\3\uce7e\3\ucedd\3\ucf3c\3\ucf9b"+
+ "\3\ucffa\3\ud059\3\ud0b8\3\ud117\3\ud176\3\ud1d5\3\ud234\3\ud293"+
+ "\3\ud2f2\3\ud351\3\ud3b0\3\ud40f\3\ud46e\3\ud4cd\3\ud52c\3\ud58b"+
+ "\3\ud5ea\3\ud649\3\ud6a8\3\ud707\3\ud766\3\ud7c5\3\ud824\3\ud883"+
+ "\3\ud8e2\3\ud941\3\ud9a0\3\ud9ff\3\uda5e\3\udabd\3\udb1c\3\udb7b"+
+ "\3\udbda\3\udc39\3\udc98\3\udcf7\3\udd56\3\uddb5\3\ude14\3\ude73"+
+ "\3\uded2\3\udf31\3\udf90\3\udfef\3\ue04e\3\ue0ad\3\ue10c\3\ue16b"+
+ "\3\ue1ca\3\ue229\3\ue288\3\ue2e7\3\ue346\3\ue3a5\3\ue404\3\ue463"+
+ "\3\ue4c2\3\ue521\3\ue580\3\ue5df\3\ue63e\3\ue69d\3\ue6fc\3\ue75b"+
+ "\3\ue7ba\3\ue819\3\ue878\3\ue8d7\3\ue936\3\ue995\3\ue9f4\3\uea53"+
+ "\3\ueab2\3\ueb11\3\ueb70\3\uebcf\3\uec2e\3\uec8d\3\uecec\3\ued4b"+
+ "\3\uedaa\3\uee09\3\uee68\3\ueec7\3\uef26\3\uef85\3\uefe4\3\uf043"+
+ "\3\uf0a2\3\uf101\3\uf160\3\uf1bf\3\uf21e\3\uf27d\3\uf2dc\3\uf33b"+
+ "\3\uf39a\3\uf3f9\3\uf458\3\uf4b7\3\uf516\3\uf575\3\uf5d4\3\uf633"+
+ "\3\uf692\3\uf6f1\3\uf750\3\uf7af\3\uf80e\3\uf86d\3\uf8cc\3\uf92b"+
+ "\3\uf98a\3\uf9e9\3\ufa48\3\ufaa7\3\ufb06\3\ufb65\3\ufbc4\3\ufc23"+
+ "\3\ufc82\3\ufce1\3\ufd40\3\ufd9f\3\uf2dc\3\ufdfe\3\ufe5d\3\ufebc"+
+ "\3\uff1b\3\uff7a\3\uffd9\4\70\4\227\4\366\4\u0155\4\u01b4"+
+ "\4\u0213\4\u0272\4\u02d1\4\u0330\4\u038f\4\u03ee\4\u044d\4\u04ac"+
+ "\4\u050b\4\u056a\4\u05c9\4\u0628\4\u0687\4\u06e6\4\u0745\4\u07a4"+
+ "\4\u0803\4\u0862\4\u08c1\4\u0920\4\u097f\4\u09de\4\u0a3d\4\u0a9c"+
+ "\4\u0afb\4\u0b5a\4\u0bb9\4\u0c18\4\u0c77\4\u0cd6\4\u0d35\4\u0d94"+
+ "\4\u0df3\4\u0e52\4\u0eb1\4\u0f10\4\u0f6f\4\u0fce\4\u102d\4\u108c"+
+ "\4\u10eb\4\u114a\4\u11a9\4\u1208\4\u1267\4\u12c6\4\u1325\4\u1384"+
+ "\4\u13e3\4\u1442\4\u14a1\4\u1500\4\u155f\4\u15be\4\u161d\4\u167c"+
+ "\4\u16db\4\u173a\4\u1799\4\u17f8\4\u1857\4\u18b6\4\u1915\4\u1974"+
+ "\4\u19d3\4\u1a32\4\u1a91\4\u1af0\4\u1b4f\4\u1bae\4\u1c0d\4\u1c6c"+
+ "\4\u1ccb\4\u1d2a\2\uabed\4\u1d89\4\u1de8\4\u1e47\4\u1ea6\4\u1f05"+
+ "\4\u1f64\4\u1fc3\4\u2022\4\u2081\4\u20e0\4\u213f\4\u219e\4\u21fd"+
+ "\4\u225c\4\u22bb\4\u231a\4\u2379\4\u23d8\4\u2437\4\u2496\4\u24f5"+
+ "\4\u2554\4\u25b3\4\u2612\4\u2671\4\u26d0\4\u272f\4\u278e\4\u27ed"+
+ "\4\u284c\4\u28ab\4\u290a\4\u2969\4\u29c8\4\u2a27\4\u2a86\4\u2ae5"+
+ "\4\u2b44\4\u2ba3\4\u2c02\4\u2c61\4\u2cc0\4\u2d1f\4\u2d7e\4\u2ddd"+
+ "\4\u2e3c\4\u2e9b\4\u2efa\4\u2f59\4\u2fb8\4\u3017\4\u3076\4\u30d5"+
+ "\4\u3134\4\u3193\4\u31f2\4\u3251\4\u32b0\4\u330f\4\u336e\4\u33cd"+
+ "\4\u342c\4\u348b\4\u34ea\4\u3549\4\u35a8\4\u3607\4\u3666\4\u36c5"+
+ "\4\u3724\4\u3783\4\u37e2\4\u3841\4\u38a0\4\u38ff\4\u395e\4\u39bd"+
+ "\4\u3a1c\4\u3a7b\4\u3ada\4\u3b39\4\u3b98\4\u3bf7\4\u3c56\4\u3cb5"+
+ "\4\u3d14\4\u3d73\4\u3dd2\4\u3e31\4\u3e90\4\u3eef\4\u3f4e\4\u3fad"+
+ "\4\u400c\4\u406b\4\u40ca\4\u4129\4\u4188\4\u41e7\4\u4246\4\u42a5"+
+ "\4\u4304\4\u4363\4\u43c2\4\u4421\4\u4480\4\u44df\4\u453e\4\u459d"+
+ "\4\u45fc\4\u465b\4\u46ba\4\u4719\4\u4778\4\u47d7\4\u4836\4\u4895"+
+ "\4\u48f4\4\u4953\4\u49b2\4\u4a11\4\u4a70\4\u4acf\4\u4b2e\4\u4b8d"+
+ "\4\u4bec\4\u4c4b\4\u4caa\4\u4d09\4\u4d68\4\u4dc7\4\u4e26\4\u4e85"+
+ "\4\u4ee4\4\u4f43\4\u4fa2\4\u5001\4\u5060\4\u50bf\4\u511e\4\u517d"+
+ "\4\u51dc\4\u523b\4\u529a\4\u52f9\4\u5358\4\u53b7\4\u5416\4\u5475"+
+ "\4\u54d4\4\u5533\4\u5592\4\u55f1\4\u5650\4\u56af\4\u570e\4\u576d"+
+ "\4\u57cc\4\u582b\4\u588a\4\u58e9\4\u5948\4\u59a7\4\u5a06\4\u5a65"+
+ "\4\u5ac4\4\u5b23\4\u5b82\4\u5be1\1\u7e99\4\u5c40\4\u5c9f\4\u5cfe"+
+ "\4\u5d5d\4\u5dbc\4\u5e1b\4\u5e7a\4\u5ed9\4\u5f38\4\u5f97\4\u5ff6"+
+ "\4\u6055\4\u60b4\4\u6113\4\u6172\4\u61d1\4\u6230\4\u628f\4\u62ee"+
+ "\4\u634d\4\u63ac\4\u640b\4\u646a\4\u64c9\4\u6528\4\u6587\4\u65e6"+
+ "\4\u6645\4\u66a4\4\u6703\4\u6762\4\u67c1\4\u6820\4\u687f\4\u68de"+
+ "\4\u693d\4\u699c\4\u69fb\4\u6a5a\4\u6ab9\4\u6b18\4\u6b77\4\u6bd6"+
+ "\4\u6c35\4\u6c94\4\u6cf3\4\u6d52\4\u6db1\4\u6e10\4\u6e6f\4\u6ece"+
+ "\4\u6f2d\4\u6f8c\4\u6feb\4\u704a\4\u70a9\4\u7108\4\u7167\4\u71c6"+
+ "\4\u7225\4\u7284\4\u72e3\4\u7342\4\u73a1\4\u7400\4\u745f\4\u74be"+
+ "\4\u751d\4\u757c\4\u75db\4\u763a\4\u7699\4\u76f8\4\u7757\4\u77b6"+
+ "\4\u7815\4\u7874\4\u78d3\4\u7932\4\u7991\4\u79f0\4\u7a4f\4\u7aae"+
+ "\4\u7b0d\4\u7b6c\4\u7bcb\4\u7c2a\4\u7c89\4\u7ce8\4\u7d47\4\u7da6"+
+ "\4\u7e05\4\u7e64\4\u7ec3\4\u7f22\4\u7f81\4\u7fe0\0\u3f75\4\u803f"+
+ "\4\u809e\4\u80fd\4\u815c\4\u81bb\4\u821a\4\u8279\4\u82d8\4\u8337"+
+ "\4\u8396\4\u83f5\4\u8454\4\u84b3\4\u8512\4\u8571\4\u85d0\4\u862f"+
+ "\4\u868e\4\u86ed\4\u874c\4\u87ab\4\u880a\4\u8869\4\u88c8\4\u8927"+
+ "\4\u8986\4\u89e5\4\u8a44\4\u8aa3\4\u8b02\4\u8b61\4\u8bc0\4\u8c1f"+
+ "\4\u8c7e\4\u8cdd\4\u8d3c\4\u8d9b\4\u8dfa\4\u8e59\4\u8eb8\4\u8f17"+
+ "\4\u8f76\4\u8fd5\4\u9034\4\u9093\4\u90f2\4\u9151\4\u91b0\4\u920f"+
+ "\4\u926e\4\u92cd\2\u3db6\4\u932c\4\u938b\4\u93ea\4\u9449\4\u94a8"+
+ "\4\u9507\4\u9566\4\u95c5\4\u9624\4\u9683\4\u96e2\4\u9741\4\u97a0"+
+ "\4\u97ff\4\u985e\4\u98bd\4\u991c\4\u997b\4\u99da\4\u9a39\4\u9a98"+
+ "\4\u9af7\4\u9b56\4\u9bb5\4\u9c14\4\u9c73\4\u9cd2\4\u9d31\4\u9d90"+
+ "\4\u9def\4\u9e4e\4\u9ead\4\u9f0c\4\u9f6b\4\u9fca\4\ua029\4\ua088"+
+ "\4\ua0e7\4\ua146\4\ua1a5\4\ua204\4\ua263\4\ua2c2\4\ua321\4\ua380"+
+ "\4\ua3df\4\ua43e\4\ua49d\4\ua4fc\4\ua55b\4\ua5ba\4\ua619\4\ua678"+
+ "\4\ua6d7\4\ua736\4\ua795\4\ua7f4\4\ua853\4\ua8b2\4\ua911\4\ua970"+
+ "\4\ua9cf\4\uaa2e\4\uaa8d\4\uaaec\4\uab4b\4\uabaa\4\uac09\4\uac68"+
+ "\4\uacc7\4\uad26\4\uad85\4\uade4\4\uae43\4\uaea2\4\uaf01\4\uaf60"+
+ "\4\uafbf\4\ub01e\4\ub07d\4\ub0dc\4\ub13b\4\ub19a\4\ub1f9\4\ub258"+
+ "\4\ub2b7\4\ub316\4\ub375\4\ub3d4\4\ub433\4\ub492\4\ub4f1\4\ub550"+
+ "\4\ub5af\4\ub60e\4\ub66d\4\ub6cc\4\ub72b\4\ub78a\4\ub7e9\4\ub848"+
+ "\4\ub8a7\4\ub906\3\u63fd\4\ub965\4\ub9c4\4\uba23\4\uba82\4\ubae1"+
+ "\4\ubb40\4\ubb9f\4\ubbfe\4\ubc5d\4\ubcbc\1\u0a72\4\ubd1b\4\ubd7a"+
+ "\4\ubdd9\4\ube38\4\ube97\4\ubef6\1\uddf8\4\ubf55\4\ubfb4\4\uc013"+
+ "\4\uc072\4\uc0d1\4\uc130\4\uc18f\4\uc1ee\4\uc24d\4\uc2ac\4\uc30b"+
+ "\4\uc36a\4\uc3c9\4\uc428\4\uc487\4\uc4e6\4\uc545\4\uc5a4\4\uc603"+
+ "\4\uc662\4\uc6c1\4\uc720\4\uc77f\4\uc7de\4\uc83d\4\uc89c\4\uc8fb"+
+ "\4\uc95a\4\uc9b9\4\uca18\4\uca77\4\ucad6\4\ucb35\4\ucb94\4\ucbf3"+
+ "\4\ucc52\4\uccb1\4\ucd10\4\ucd6f\4\ucdce\4\uce2d\4\uce8c\4\uceeb"+
+ "\4\ucf4a\4\ucfa9\4\ud008\4\ud067\4\ud0c6\4\ud125\4\ud184\4\ud1e3"+
+ "\4\ud242\4\ud2a1\4\ud300\4\ud35f\4\ud3be\4\ud41d\4\ud35f\4\ud47c"+
+ "\4\ud4db\4\ud53a\4\ud599\4\ud5f8\4\ud657\4\ud6b6\4\ud715\4\ud774"+
+ "\4\ud7d3\4\ud832\4\ud891\4\ud8f0\4\ud94f\4\ud9ae\4\uda0d\4\uda6c"+
+ "\4\udacb\4\udb2a\4\udb89\4\udbe8\4\udc47\4\udca6\4\udd05\4\udd64"+
+ "\4\uddc3\4\ude22\4\ude81\4\udee0\4\udf3f\4\udf9e\4\udffd\4\ue05c"+
+ "\4\ue0bb\4\ue11a\4\ue179\4\ue1d8\4\ue237\4\ue296\4\ue2f5\4\ue354"+
+ "\4\ue3b3\4\ue412\4\ue471\4\ue4d0\4\ue52f\4\ue58e\4\ue5ed\4\ue64c"+
+ "\4\ue6ab\4\ue70a\4\ue769\4\ue7c8\4\ue827\4\ue886\4\ue8e5\4\ue944"+
+ "\4\ue9a3\4\uea02\4\uea61\4\ueac0\4\ueb1f\4\ueb7e\4\uebdd\4\uec3c"+
+ "\4\uec9b\4\uecfa\4\ued59\4\uedb8\4\uee17\4\uee76\4\ueed5\4\uef34"+
+ "\4\uef93\4\ueff2\4\uf051\4\uf0b0\4\uf10f\4\uf16e\4\uf1cd\4\uf22c"+
+ "\4\uf28b\4\uf2ea\4\uf349\4\uf3a8\4\uf407\4\uf466\4\uf4c5\4\ub8a7"+
+ "\4\uf524\4\uf583\4\uf5e2\4\uf641\4\uf6a0\4\uf6ff\4\uf75e\4\uf7bd"+
+ "\4\uf81c\4\uf87b\4\uf8da\4\uf939\4\uf998\4\uf9f7\4\ufa56\4\ufab5"+
+ "\4\ufb14\4\ufb73\4\ufbd2\4\ufc31\4\ufc90\4\ufcef\4\ufd4e\4\ufdad"+
+ "\4\ufe0c\4\ufe6b\4\ufeca\4\uff29\4\uff88\4\uffe7\5\106\5\245"+
+ "\5\u0104\5\u0163\5\u01c2\5\u0221\5\u0280\5\u02df\5\u033e\5\u039d"+
+ "\5\u03fc\5\u045b\5\u04ba\5\u0519\5\u0578\5\u05d7\5\u0636\5\u0695"+
+ "\5\u06f4\5\u0753\5\u07b2\5\u0811\5\u0870\5\u08cf\5\u092e\5\u098d"+
+ "\5\u09ec\5\u0a4b\5\u0aaa\5\u0b09\5\u0b68\5\u0bc7\5\u0c26\5\u0c85"+
+ "\5\u0ce4\5\u0d43\5\u0da2\5\u0e01\5\u0e60\5\u0ebf\5\u0f1e\5\u0f7d"+
+ "\5\u0fdc\5\u103b\5\u109a\5\u10f9\5\u1158\5\u11b7\5\u1216\5\u1275"+
+ "\5\u12d4\5\u1333\5\u1392\5\u13f1\5\u1450\5\u14af\5\u150e\5\u156d"+
+ "\5\u15cc\5\u162b\5\u168a\5\u16e9\5\u1748\5\u17a7\5\u1806\5\u1865"+
+ "\5\u18c4\5\u1923\5\u1982\5\u19e1\5\u1a40\5\u1a9f\5\u1afe\5\u1b5d"+
+ "\5\u1bbc\5\u1c1b\5\u1c7a\5\u1cd9\5\u1d38\5\u1d97\5\u1df6\5\u1e55"+
+ "\5\u1eb4\5\u1f13\5\u1f72\5\u1fd1\5\u2030\5\u208f\5\u20ee\5\u214d"+
+ "\5\u21ac\5\u220b\5\u226a\1\u8d71\5\u22c9\5\u2328\5\u2387\5\u23e6"+
+ "\5\u2445\5\u24a4\5\u2503\5\u2562\5\u25c1\5\u2620\5\u267f\5\u26de"+
+ "\5\u273d\5\u279c\5\u27fb\5\u285a\5\u28b9\5\u2918\5\u2977\5\u29d6"+
+ "\5\u2a35\5\u2a94\5\u2af3\5\u2b52\5\u2bb1\5\u2c10\5\u2c6f\5\u2cce"+
+ "\5\u2d2d\5\u2d8c\5\u2deb\5\u2e4a\5\u2ea9\5\u2f08\5\u2f67\5\u2fc6"+
+ "\5\u3025\5\u3084\5\u30e3\5\u3142\5\u31a1\5\u3200\5\u325f\5\u32be"+
+ "\5\u331d\5\u337c\5\u33db\5\u343a\5\u3499\5\u34f8\5\u3557\5\u35b6"+
+ "\5\u3615\5\u3674\5\u36d3\5\u3732\5\u3791\5\u37f0\5\u384f\5\u38ae"+
+ "\5\u390d\5\u396c\5\u39cb\5\u3a2a\5\u3a89\5\u3ae8\5\u3b47\5\u3ba6"+
+ "\5\u3c05\5\u3c64\5\u3cc3\5\u3d22\1\uec12\5\u3d81\5\u3de0\5\u3e3f"+
+ "\5\u3e9e\5\u3efd\5\u3f5c\5\u3fbb\5\u401a\5\u4079\5\u40d8\5\u4137"+
+ "\5\u4196\5\u41f5\5\u4254\5\u42b3\5\u4312\5\u4371\5\u43d0\5\u442f"+
+ "\5\u448e\5\u44ed\5\u454c\5\u45ab\5\u460a\5\u4669\5\u46c8\5\u4727"+
+ "\5\u4786\5\u47e5\5\u4844\5\u48a3\5\u4902\5\u4961\5\u49c0\5\u4a1f"+
+ "\5\u4a7e\5\u4add\5\u4b3c\5\u4b9b\5\u4bfa\5\u4c59\5\u4cb8\5\u4d17"+
+ "\5\u4d76\5\u4dd5\5\u4e34\5\u4e93\5\u4ef2\5\u4f51\5\u4fb0\5\u500f"+
+ "\5\u506e\5\u50cd\5\u512c\5\u518b\5\u51ea\5\u5249\5\u52a8\5\u5307"+
+ "\5\u5366\5\u53c5\5\u5424\5\u5483\5\u54e2\5\u5541\5\u55a0\5\u55ff"+
+ "\5\u565e\5\u56bd\5\u571c\5\u577b\5\u57da\5\u5839\5\u5898\5\u58f7"+
+ "\5\u5956\5\u59b5\5\u5a14\5\u5a73\5\u5ad2\5\u5b31\5\u5b90\5\u5bef"+
+ "\5\u5c4e\5\u5cad\5\u5d0c\5\u5d6b\5\u5dca\5\u5e29\5\u5e88\5\u5ee7"+
+ "\5\u5f46\5\u5fa5\5\u6004\5\u6063\5\u60c2\5\u6121\5\u6180\5\u61df"+
+ "\5\u623e\5\u629d\5\u62fc\5\u635b\5\u63ba\5\u6419\5\u6478\5\u64d7"+
+ "\5\u6536\5\u6595\5\u65f4\5\u6653\5\u66b2\5\u6711\5\u6770\5\u67cf"+
+ "\5\u682e\5\u688d\5\u68ec\5\u694b\5\u69aa\5\u6a09\5\u6a68\5\u6ac7"+
+ "\5\u6b26\5\u6b85\5\u6be4\5\u6c43\5\u6ca2\5\u6d01\5\u6d60\5\u6dbf"+
+ "\5\u6e1e\5\u6e7d\5\u6edc\5\u6f3b\5\u6f9a\5\u6ff9\5\u7058\5\u70b7"+
+ "\5\u7116\5\u7175\5\u71d4\5\u7233\5\u7292\5\u72f1\5\u7350\5\u73af"+
+ "\5\u740e\5\u746d\5\u74cc\5\u752b\5\u758a\5\u75e9\5\u7648\5\u76a7"+
+ "\5\u7706\5\u7765\5\u77c4\5\u7823\5\u7882\5\u78e1\5\u7940\5\u799f"+
+ "\5\u79fe\5\u7a5d\5\u7abc\5\u7b1b\5\u7b7a\5\u7bd9\5\u7c38\5\u7c97"+
+ "\5\u7cf6\5\u7d55\5\u7db4\5\u7e13\5\u7e72\5\u7ed1\5\u7f30\5\u7f8f"+
+ "\5\u7fee\5\u804d\5\u80ac\5\u810b\5\u816a\5\u81c9\5\u8228\5\u8287"+
+ "\5\u82e6\5\u8345\5\u83a4\5\u8403\5\u8462\5\u84c1\5\u8520\5\u857f"+
+ "\5\u85de\5\u863d\5\u869c\5\u86fb\5\u875a\5\u87b9\5\u8818\5\u8877"+
+ "\5\u88d6\5\u8935\5\u8994\5\u89f3\5\u8a52\5\u8ab1\5\u8b10\5\u8b6f"+
+ "\5\u8bce\5\u8c2d\5\u8c8c\5\u8ceb\5\u8d4a\5\u8da9\5\u8e08\5\u8e67"+
+ "\5\u8ec6\5\u8f25\5\u8f84\5\u8fe3\5\u9042\5\u90a1\5\u9100\5\u915f"+
+ "\5\u91be\5\u921d\5\u927c\5\u92db\5\u933a\5\u9399\5\u93f8\5\u9457"+
+ "\5\u94b6\5\u9515\5\u9574\5\u95d3\5\u9632\5\u9691\5\u96f0\3\u82ca"+
+ "\5\u974f\5\u97ae\5\u980d\5\u986c\5\u98cb\5\u992a\5\u9989\5\u99e8"+
+ "\5\u9a47\5\u9aa6\5\u9b05\5\u9b64\5\u9bc3\5\u9c22\5\u9c81\5\u9ce0"+
+ "\5\u9d3f\5\u9d9e\5\u9dfd\5\u9e5c\5\u9ebb\5\u9f1a\5\u9f79\5\u9fd8"+
+ "\5\ua037\5\ua096\5\ua0f5\5\ua154\5\ua1b3\5\ua212\5\ua271\5\ua2d0"+
+ "\5\ua32f\5\ua38e\5\ua3ed\5\ua44c\5\ua4ab\5\ua50a\5\ua569\5\ua5c8"+
+ "\5\ua627\5\ua686\5\ua6e5\5\ua744\5\ua7a3\5\ua802\5\ua861\5\ua8c0"+
+ "\5\ua91f\5\ua97e\5\ua9dd\5\uaa3c\5\uaa9b\5\uaafa\5\uab59\5\uabb8"+
+ "\5\uac17\5\uac76\5\uacd5\5\uad34\5\uad93\5\uadf2\5\uae51\5\uaeb0"+
+ "\5\uaf0f\5\uaf6e\5\uafcd\5\ub02c\5\ub08b\5\ub0ea\5\ub149\5\ub1a8"+
+ "\5\ub207\5\ub266\5\ub2c5\5\ub324\5\ub383\5\ub3e2\5\ub441\5\ub4a0"+
+ "\5\ub4ff\5\ub55e\5\ub5bd\5\ub61c\5\ub67b\5\ub6da\5\ub739\5\ub798"+
+ "\5\ub7f7\5\ub856\5\ub8b5\5\ub914\5\ub973\5\ub9d2\5\uba31\5\uba90"+
+ "\5\ubaef\5\ubb4e\5\ubbad\5\ubc0c\5\ubc6b\5\ubcca\5\ubd29\5\ubd88"+
+ "\5\ubde7\5\ube46\5\ubea5\5\ubf04\5\ubf63\5\ubfc2\5\uc021\5\uc080"+
+ "\5\uc0df\5\uc13e\5\uc19d\5\uc1fc\5\uc25b\5\uc2ba\5\uc319\5\uc378"+
+ "\5\uc3d7\5\uc436\5\uc495\5\uc4f4\5\uc553\5\uc5b2\5\uc611\5\uc670"+
+ "\5\uc6cf\5\uc72e\5\uc78d\5\uc7ec\5\uc84b\5\uc8aa\5\uc909\5\uc968"+
+ "\5\uc9c7\5\uca26\5\uca85\5\ucae4\5\ucb43\5\ucba2\5\ucc01\5\ucc60"+
+ "\5\uccbf\5\ucd1e\5\ucd7d\5\ucddc\5\uce3b\5\uce9a\5\ucef9\5\ucf58"+
+ "\5\ucfb7\5\ud016\5\ud075\5\ud0d4\5\ud133\5\ud192\5\ud1f1\5\ud250"+
+ "\5\ud2af\5\ud30e\5\ud36d\5\ud3cc\5\ud42b\5\ud48a\5\ud4e9\5\ud548"+
+ "\5\ud5a7\5\ud606\5\ud665\5\ud6c4\5\ud723\5\ud782\5\ud7e1\5\ud840"+
+ "\5\ud89f\5\ud8fe\5\ud95d\5\ud9bc\1\u7e99\5\uda1b\5\uda7a\5\udad9"+
+ "\5\udb38\5\udb97\5\udbf6\5\udc55\5\udcb4\5\udd13\5\udd72\5\uddd1"+
+ "\5\ude30\5\ude8f\5\udeee\5\udf4d\5\udfac\5\ue00b\5\ue06a\5\ue0c9"+
+ "\5\ue128\5\ue187\5\ue1e6\5\ue245\5\ue2a4\5\ue303\5\ue362\5\ue3c1"+
+ "\5\ue420\5\ue47f\5\ue4de\5\ue53d\5\ue59c\5\ue5fb\5\ue65a\5\ue6b9"+
+ "\5\ue718\5\ue777\5\ue7d6\5\ue835\1\u2174\5\ue894\5\ue8f3\5\ue952"+
+ "\5\ue9b1\5\uea10\5\uea6f\5\ueace\5\ueb2d\5\ueb8c\5\uebeb\5\uec4a"+
+ "\5\ueca9\5\ued08\5\ued67\5\uedc6\5\uee25\5\uee84\5\ueee3\5\uef42"+
+ "\5\uefa1\5\uf000\5\uf05f\5\uf0be\5\uf11d\5\uf17c\5\uf1db\5\uf23a"+
+ "\5\uf299\5\uf2f8\5\uf357\5\uf3b6\5\uf415\5\uf474\5\uf4d3\5\uf532"+
+ "\5\uf591\5\uf5f0\5\uf64f\5\ue718\5\uf6ae\5\uf70d\5\uf76c\5\uf7cb"+
+ "\5\uf82a\5\uf889\5\uf8e8\5\uf947\5\uf9a6\5\ufa05\5\ufa64\5\ufac3"+
+ "\5\ufb22\5\ufb81\5\ufbe0\5\ufc3f\5\ufc9e\5\ufcfd\5\ufd5c\5\ufdbb"+
+ "\5\ufe1a\5\ufe79\5\ufed8\5\uff37\5\uff96\5\ufff5\6\124\6\263"+
+ "\6\u0112\6\u0171\6\u01d0\6\u022f\6\u028e\6\u02ed\6\u034c\6\u03ab"+
+ "\6\u040a\6\u0469\6\u04c8\6\u0527\6\u0586\6\u05e5\6\u0644\6\u06a3"+
+ "\6\u0702\6\u0761\6\u07c0\6\u081f\6\u087e\6\u08dd\6\u093c\6\u099b"+
+ "\6\u09fa\6\u0a59\6\u0ab8\6\u0b17\6\u0b76\6\u0bd5\6\u0c34\6\u0c93"+
+ "\6\u0cf2\6\u0d51\6\u0db0\6\u0e0f\6\u0e6e\6\u0ecd\6\u0f2c\6\u0f8b"+
+ "\6\u0fea\6\u1049\6\u10a8\6\u1107\6\u1166\6\u11c5\6\u1224\6\u1283"+
+ "\6\u12e2\4\u52f9\6\u1341\6\u13a0\6\u13ff\6\u145e\6\u14bd\6\u151c"+
+ "\6\u157b\6\u15da\6\u1639\6\u1698\6\u16f7\6\u1756\6\u17b5\6\u1814"+
+ "\6\u1873\6\u18d2\6\u1931\6\u1990\6\u19ef\6\u1a4e\6\u1aad\6\u1b0c"+
+ "\6\u1b6b\6\u1bca\6\u1c29\6\u1c88\6\u1ce7\6\u1d46\6\u1da5\6\u1e04"+
+ "\6\u1e63\6\u1ec2\6\u1f21\6\u1f80\6\u1fdf\6\u203e\6\u209d\6\u20fc"+
+ "\6\u215b\2\uf7a1\6\u21ba\6\u2219\6\u2278\6\u22d7\6\u2336\6\u2395"+
+ "\6\u23f4\6\u2453\6\u24b2\6\u2511\6\u2570\6\u25cf\6\u262e\6\u268d"+
+ "\6\u26ec\6\u274b\6\u27aa\6\u2809\6\u2868\6\u28c7\6\u2926\6\u2985"+
+ "\6\u29e4\6\u2a43\6\u2aa2\6\u2b01\6\u2b60\6\u2bbf\6\u2c1e\6\u2c7d"+
+ "\6\u2cdc\6\u2d3b\6\u2d9a\6\u2df9\6\u2e58\6\u2eb7\6\u2f16\6\u2f75"+
+ "\6\u2fd4\6\u3033\6\u3092\6\u30f1\6\u3150\6\u31af\6\u320e\6\u326d"+
+ "\6\u32cc\6\u332b\6\u338a\6\u33e9\6\u3448\6\u34a7\6\u3506\6\u3565"+
+ "\6\u35c4\6\u3623\6\u3682\6\u36e1\6\u3740\6\u379f\6\u37fe\6\u385d"+
+ "\6\u38bc\6\u391b\6\u397a\6\u39d9\6\u3a38\6\u3a97\6\u3af6\6\u3b55"+
+ "\6\u3bb4\6\u3c13\6\u3c72\6\u3cd1\6\u3d30\6\u3d8f\6\u3dee\6\u3e4d"+
+ "\6\u3eac\6\u3f0b\6\u3f6a\6\u3fc9\6\u4028\6\u4087\6\u40e6\6\u4145"+
+ "\6\u41a4\6\u4203\6\u4262\6\u42c1\6\u4320\6\u437f\6\u43de\6\u443d"+
+ "\6\u449c\6\u44fb\6\u455a\6\u45b9\6\u4618\6\u4677\3\ubdcb\6\u46d6"+
+ "\6\u4735\6\u4794\6\u47f3\6\u4852\6\u48b1\6\u4910\6\u496f\6\u49ce"+
+ "\6\u4a2d\6\u4a8c\6\u4aeb\6\u4b4a\6\u4ba9\6\u4c08\6\u4c67\6\u4cc6"+
+ "\6\u4d25\6\u4d84\6\u4de3\6\u4e42\6\u4ea1\6\u4f00\6\u4f5f\6\u4fbe"+
+ "\6\u501d\6\u507c\6\u50db\6\u513a\6\u5199\6\u51f8\6\u5257\6\u52b6"+
+ "\6\u5315\6\u5374\6\u53d3\6\u5432\6\u5491\6\u54f0\6\u554f\6\u55ae"+
+ "\6\u560d\6\u566c\6\u56cb\6\u572a\6\u5789\6\u57e8\6\u5847\6\u58a6"+
+ "\6\u5905\6\u5964\6\u59c3\6\u5a22\6\u5a81\6\u5ae0\6\u5b3f\6\u5b9e"+
+ "\6\u5bfd\6\u5c5c\6\u5cbb\6\u5d1a\6\u5d79\6\u5dd8\6\u5e37\6\u5e96"+
+ "\6\u5ef5\6\u5f54\6\u5fb3\6\u6012\6\u6071\6\u60d0\6\u612f\6\u618e"+
+ "\6\u61ed\6\u624c\6\u62ab\6\u630a\6\u6369\6\u63c8\6\u6427\6\u6486"+
+ "\6\u64e5\6\u6544\6\u65a3\6\u6602\6\u6661\6\u66c0\6\u671f\6\u677e"+
+ "\6\u67dd\6\u683c\6\u689b\6\u68fa\6\u6959\6\u69b8\6\u6a17\6\u6a76"+
+ "\6\u6ad5\6\u6b34\6\u6b93\6\u6bf2\6\u6c51\6\u6cb0\6\u6d0f\6\u6d6e"+
+ "\6\u6dcd\6\u6e2c\6\u6e8b\6\u6eea\6\u6f49\6\u6fa8\6\u7007\6\u7066"+
+ "\6\u70c5\6\u7124\6\u7183\6\u71e2\6\u7241\6\u72a0\6\u72ff\6\u735e"+
+ "\6\u73bd\6\u741c\6\u747b\6\u74da\6\u7539\6\u7598\6\u75f7\6\u7656"+
+ "\6\u76b5\6\u7714\6\u7773\6\u77d2\6\u7831\6\u7890\6\u78ef\6\u794e"+
+ "\6\u79ad\6\u7a0c\6\u7a6b\6\u7aca\6\u7b29\6\u7b88\6\u7be7\6\u7c46"+
+ "\6\u7ca5\6\u7d04\6\u7d63\6\u7dc2\6\u7e21\6\u7e80\6\u7edf\6\u7f3e"+
+ "\6\u7f9d\6\u7ffc\6\u805b\6\u80ba\6\u8119\6\u8178\6\u81d7\6\u8236"+
+ "\6\u8295\6\u82f4\6\u8353\6\u83b2\6\u8411\6\u8470\6\u84cf\6\u852e"+
+ "\6\u858d\6\u85ec\6\u864b\6\u86aa\6\u8709\6\u8768\6\u87c7\6\u8826"+
+ "\6\u8885\6\u88e4\0\u0b22\6\u8943\6\u89a2\6\u8a01\6\u8a60\6\u8abf"+
+ "\0\u0b22\6\u8b1e\0\u0b22\0\u0b22\6\u8b7d\6\u8bdc\6\u8c3b\6\u8c9a"+
+ "\6\u8cf9\6\u8d58\6\u8db7\6\u8e16\6\u8e75\6\u8ed4\6\u8f33\6\u8f92"+
+ "\6\u8ff1\6\u9050\6\u90af\6\u910e\6\u916d\6\u91cc\6\u922b\6\u928a"+
+ "\6\u92e9\6\u9348\6\u93a7\6\u9406\6\u9465\6\u94c4\6\u9523\6\u9582"+
+ "\6\u95e1\6\u9640\6\u969f\6\u96fe\6\u975d\6\u97bc\6\u981b\6\u987a"+
+ "\6\u98d9\6\u9938\6\u9997\6\u99f6\6\u9a55\6\u9ab4\6\u9b13\6\u9b72"+
+ "\3\ua4ee\6\u9bd1\6\u9c30\6\u9c8f\6\u9cee\6\u9d4d\6\u9dac\6\u9e0b"+
+ "\6\u9e6a\6\u9ec9\6\u9f28\6\u9f87\6\u9fe6\6\ua045\6\ua0a4\6\ua103"+
+ "\6\ua162\6\ua1c1\6\ua220\6\ua27f\6\ua2de\6\ua33d\6\ua39c\6\ua3fb"+
+ "\6\ua45a\6\ua4b9\6\ua518\2\u890b\6\ua577\3\uf2dc\6\ua5d6\6\ua635"+
+ "\6\ua694\6\ua6f3\6\ua752\6\ua7b1\6\ua810\6\ua86f\6\ua8ce\6\ua92d"+
+ "\6\ua98c\6\ua9eb\6\uaa4a\6\uaaa9\6\uab08\6\uab67\6\uabc6\6\uac25"+
+ "\6\uac84\6\uace3\6\uad42\6\uada1\6\uae00\6\uae5f\6\uaebe\6\uaf1d"+
+ "\6\uaf7c\6\uafdb\6\ub03a\6\ub099\6\ub0f8\6\ub157\6\ub1b6\6\ub215"+
+ "\6\ub274\6\ub2d3\6\ub332\6\ub391\6\ub3f0\6\ub44f\6\ub4ae\6\ub50d"+
+ "\6\ub56c\1\uc638\6\ub5cb\6\ub62a\6\ub689\6\ub6e8\6\ub747\6\ub7a6"+
+ "\6\ub805\6\ub864\6\ub8c3\6\ub922\6\ub981\6\ub9e0\6\uba3f\6\uba9e"+
+ "\4\u8c7e\6\ubafd\6\ubb5c\6\ubbbb\6\ubc1a\6\ubc79\6\ubcd8\6\ubd37"+
+ "\6\ubd96\6\ubdf5\6\ube54\6\ubeb3\6\ubf12\6\ubf71\6\ubfd0\6\uc02f"+
+ "\6\uc08e\6\uc0ed\6\uc14c\6\uc1ab\6\uc20a\6\uc269\6\uc2c8\6\uc327"+
+ "\6\uc386\6\uc3e5\6\uc444\6\uc4a3\6\uc502\6\uc561\6\uc5c0\6\uc61f"+
+ "\6\uc67e\6\uc6dd\6\uc73c\6\uc79b\6\uc7fa\6\uc859\6\uc8b8\6\uc917"+
+ "\6\uc976\6\uc9d5\6\uca34\6\uca93\6\ucaf2\6\ucb51\6\ucbb0\6\ucc0f"+
+ "\6\ucc6e\6\ucccd\6\ucd2c\6\ucd8b\6\ucdea\6\uce49\6\ucea8\6\ucf07"+
+ "\6\ucf66\6\ucfc5\6\ud024\6\ud083\6\ud0e2\6\ud141\6\ud1a0\6\ud1ff"+
+ "\6\ud25e\6\ud2bd\6\ud31c\6\ud37b\6\ud3da\6\ud439\6\ud498\6\ud4f7"+
+ "\6\ud556\6\ud5b5\6\ud614\6\ud673\6\ud6d2\6\ud731\6\ud790\6\ud7ef"+
+ "\6\ud84e\6\ud8ad\6\ud90c\6\ud96b\6\ud9ca\6\uda29\6\uda88\6\udae7"+
+ "\6\udb46\6\udba5\6\udc04\6\udc63\6\udcc2\6\udd21\6\udd80\6\udddf"+
+ "\6\ude3e\6\ude9d\6\udefc\6\udf5b\6\udfba\6\ue019\6\ue078\6\ue0d7"+
+ "\6\ue136\6\ue195\6\ue1f4\6\ue253\6\ue2b2\6\ue311\6\ue370\6\ue3cf"+
+ "\6\ue42e\6\ue48d\6\ue4ec\6\ue54b\6\ue5aa\6\ue609\6\ue668\6\ue6c7"+
+ "\6\ue726\6\ue785\6\ue7e4\6\ue843\6\ue8a2\6\ue901\6\ue960\6\ue9bf"+
+ "\6\uea1e\6\uea7d\6\ueadc\6\ueb3b\6\ueb9a\6\uebf9\6\uec58\6\uecb7"+
+ "\6\ued16\6\ued75\6\uedd4\6\uee33\6\uee92\6\ueef1\6\uef50\6\uefaf"+
+ "\6\uf00e\6\uf06d\6\uf0cc\6\uf12b\6\uf18a\6\uf1e9\6\uf248\5\u980d"+
+ "\6\uf2a7\6\uf306\6\uf365\6\uf3c4\6\uf423\6\uf482\6\uf4e1\6\uf540"+
+ "\6\uf59f\6\uf5fe\6\uf65d\6\uf6bc\6\uf71b\6\uf77a\6\uf7d9\6\uf838"+
+ "\6\uf897\6\uf8f6\6\uf955\6\uf9b4\6\ufa13\6\ufa72\1\u7d1d\6\ufad1"+
+ "\6\ufb30\6\ufb8f\6\ufbee\6\ufc4d\6\ufcac\6\ufd0b\6\ufd6a\6\ufdc9"+
+ "\6\ufe28\6\ufe87\6\ufee6\6\uff45\6\uffa4\7\3\7\142\7\301"+
+ "\7\u0120\7\u017f\7\u01de\7\u023d\7\u029c\7\u02fb\7\u035a\7\u03b9"+
+ "\7\u0418\7\u0477\7\u04d6\7\u0535\7\u0594\7\u05f3\7\u0652\7\u06b1"+
+ "\7\u0710\7\u076f\7\u07ce\7\u082d\7\u088c\7\u08eb\7\u094a\7\u09a9"+
+ "\7\u0a08\7\u0a67\7\u0ac6\7\u0b25\7\u0b84\7\u0be3\7\u0c42\7\u0ca1"+
+ "\7\u0d00\7\u0d5f\7\u0dbe\7\u0e1d\7\u0e7c\7\u0edb\7\u0f3a\7\u0f99"+
+ "\7\u0ff8\7\u1057\3\ube2a\7\u10b6\7\u1115\7\u1174\7\u11d3\7\u1232"+
+ "\7\u1291\7\u12f0\7\u134f\7\u13ae\7\u140d\7\u146c\7\u14cb\7\u152a"+
+ "\7\u1589\7\u15e8\7\u1647\7\u16a6\7\u1705\7\u1764\7\u17c3\7\u1822"+
+ "\7\u1881\7\u18e0\7\u193f\7\u199e\1\ud8c6\7\u19fd\7\u1a5c\7\u1abb"+
+ "\7\u1b1a\7\u1b79\7\u1bd8\7\u1c37\7\u1c96\7\u1cf5\7\u1d54\7\u1db3"+
+ "\7\u1e12\7\u1e71\7\u1ed0\7\u1f2f\7\u1f8e\7\u1fed\7\u204c\7\u20ab"+
+ "\7\u210a\7\u2169\7\u21c8\7\u2227\7\u2286\7\u22e5\7\u2344\7\u23a3"+
+ "\7\u2402\7\u2461\7\u24c0\7\u251f\7\u257e\7\u25dd\7\u263c\7\u269b"+
+ "\7\u26fa\7\u2759\7\u27b8\7\u2817\7\u2876\7\u28d5\7\u2934\7\u2993"+
+ "\7\u29f2\7\u2a51\7\u2ab0\7\u2b0f\7\u2b6e\7\u2bcd\7\u2c2c\7\u2c8b"+
+ "\7\u2cea\7\u2d49\7\u2da8\7\u2e07\7\u2e66\7\u2ec5\7\u2f24\7\u2f83"+
+ "\7\u2fe2\7\u3041\7\u30a0\7\u30ff\7\u315e\7\u31bd\7\u321c\7\u327b"+
+ "\7\u32da\7\u3339\7\u3398\7\u33f7\7\u3456\7\u34b5\7\u3514\7\u3573"+
+ "\7\u35d2\7\u3631\7\u3690\7\u36ef\7\u374e\7\u37ad\7\u380c\7\u386b"+
+ "\7\u38ca\7\u3929\7\u3988\7\u39e7\7\u3a46\7\u3aa5\7\u3b04\7\u3b63"+
+ "\7\u3bc2\7\u3c21\7\u3c80\7\u3cdf\7\u3d3e\7\u3d9d\7\u3dfc\7\u3e5b"+
+ "\7\u3eba\7\u3f19\7\u3f78\7\u3fd7\7\u4036\7\u4095\7\u40f4\7\u4153"+
+ "\7\u41b2\7\u4211\7\u4270\7\u42cf\7\u432e\7\u438d\7\u43ec\7\u444b"+
+ "\7\u44aa\7\u4509\7\u4568\7\u45c7\7\u4626\7\u4685\7\u46e4\7\u4743"+
+ "\7\u47a2\7\u4801\7\u4860\7\u48bf\7\u491e\7\u497d\7\u49dc\7\u4a3b"+
+ "\7\u4a9a\7\u4af9\7\u4b58\7\u4bb7\7\u4c16\7\u4c75\7\u4cd4\7\u4d33"+
+ "\7\u4d92\7\u4df1\7\u4e50\7\u4eaf\7\u4f0e\7\u4f6d\7\u4fcc\7\u502b"+
+ "\7\u508a\7\u50e9\7\u5148\7\u51a7\7\u5206\7\u5265\7\u52c4\7\u5323"+
+ "\7\u5382\7\u53e1\7\u5440\7\u549f\7\u54fe\7\u555d\7\u55bc\7\u561b"+
+ "\7\u567a\7\u56d9\7\u5738\5\uf0be\7\u5797\7\u57f6\7\u5855\7\u58b4"+
+ "\7\u5913\7\u5972\7\u59d1\7\u5a30\7\u5a8f\7\u5aee\7\u5b4d\7\u5bac"+
+ "\7\u5c0b\7\u5c6a\7\u5cc9\7\u5d28\7\u5d87\7\u5de6\7\u5e45\7\u5ea4"+
+ "\7\u5f03\7\u5f62\7\u5fc1\7\u6020\7\u607f\7\u60de\7\u613d\7\u619c"+
+ "\7\u61fb\7\u625a\7\u62b9\7\u6318\7\u6377\7\u63d6\7\u6435\7\u6494"+
+ "\7\u64f3\7\u6552\7\u65b1\7\u6610\7\u666f\7\u66ce\7\u672d\7\u678c"+
+ "\7\u67eb\7\u684a\7\u68a9\7\u6908\7\u6967\7\u69c6\7\u6a25\7\u6a84"+
+ "\7\u6ae3\7\u6b42\7\u6ba1\7\u6c00\7\u6c5f\7\u6cbe\7\u6d1d\7\u6d7c"+
+ "\7\u6ddb\7\u6e3a\7\u6e99\7\u6ef8\7\u6f57\7\u6fb6\7\u7015\7\u7074"+
+ "\7\u70d3\7\u7132\7\u7191\7\u71f0\7\u724f\7\u72ae\7\u730d\7\u736c"+
+ "\7\u73cb\7\u742a\7\u7489\7\u74e8\7\u7547\7\u75a6\7\u7605\7\u7664"+
+ "\7\u76c3\7\u7722\7\u7781\7\u77e0\7\u783f\7\u789e\7\u78fd\7\u795c"+
+ "\7\u79bb\7\u7a1a\7\u7a79\7\u7ad8\7\u7b37\7\u7b96\7\u7bf5\7\u7c54"+
+ "\7\u7cb3\7\u7d12\7\u7d71\7\u7dd0\7\u7e2f\7\u7e8e\7\u7eed\7\u7f4c"+
+ "\7\u7fab\7\u800a\7\u8069\7\u80c8\7\u8127\7\u8186\7\u81e5\7\u8244"+
+ "\7\u82a3\7\u8302\7\u8361\7\u83c0\7\u841f\7\u847e\7\u84dd\7\u853c"+
+ "\7\u859b\7\u85fa\7\u8659\7\u86b8\7\u8717\7\u8776\7\u87d5\7\u8834"+
+ "\7\u8893\7\u88f2\7\u8951\7\u89b0\7\u8a0f\7\u8a6e\7\u8acd\7\u8b2c"+
+ "\7\u8b8b\7\u8bea\7\u8c49\7\u8ca8\7\u8d07\7\u8d66\7\u8dc5\7\u8e24"+
+ "\7\u8e83\7\u8ee2\7\u8f41\7\u8fa0\7\u8fff\7\u905e\7\u90bd\7\u911c"+
+ "\7\u917b\7\u91da\7\u9239\7\u9298\7\u92f7\7\u9356\7\u93b5\7\u9414"+
+ "\7\u9473\7\u94d2\7\u9531\7\u9590\7\u95ef\7\u964e\7\u96ad\7\u970c"+
+ "\7\u976b\7\u97ca\7\u9829\7\u9888\7\u98e7\7\u9946\7\u99a5\7\u9a04"+
+ "\7\u9a63\7\u9ac2\7\u9b21\7\u9b80\7\u9bdf\7\u9c3e\7\u9c9d\7\u9cfc"+
+ "\7\u9d5b\7\u9dba\7\u9e19\7\u9e78\7\u9ed7\7\u9f36\7\u9f95\7\u9ff4"+
+ "\7\ua053\7\ua0b2\7\ua111\7\ua170\7\ua1cf\7\ua22e\7\ua28d\7\ua2ec"+
+ "\7\ua34b\7\ua3aa\7\ua409\7\ua468\7\ua4c7\7\ua526\7\ua585\7\ua5e4"+
+ "\7\ua643\7\ua6a2\7\ua701\7\ua760\7\ua7bf\7\ua81e\7\ua87d\7\ua8dc"+
+ "\7\ua93b\7\ua99a\7\ua9f9\7\uaa58\7\uaab7\7\uab16\7\uab75\7\uabd4"+
+ "\7\uac33\7\uac92\7\uacf1\7\uad50\7\uadaf\7\uae0e\7\uae6d\7\uaecc"+
+ "\7\uaf2b\7\uaf8a\7\uafe9\7\ub048\7\ub0a7\7\ub106\7\ub165\7\ub1c4"+
+ "\7\ub223\7\ub282\7\ub2e1\7\ub340\7\ub39f\7\ub3fe\7\ub45d\7\ub4bc"+
+ "\7\ub51b\7\ub57a\4\ub1f9\7\ub5d9\7\ub638\7\ub697\7\ub6f6\7\ub755"+
+ "\7\ub7b4\7\ub813\7\ub872\7\ub8d1\7\ub930\7\ub98f\7\ub9ee\7\uba4d"+
+ "\3\u4297\7\ubaac\7\ubb0b\7\ubb6a\7\ubbc9\7\ubc28\7\ubc87\7\ubce6"+
+ "\7\ubd45\7\ubda4\7\ube03\7\ube62\7\ubec1\7\ubf20\7\ubf7f\7\ubfde"+
+ "\7\uc03d\7\uc09c\7\uc0fb\7\uc15a\7\uc1b9\7\uc218\7\uc277\7\uc2d6"+
+ "\7\uc335\7\uc394\7\uc3f3\7\uc452\7\uc4b1\7\uc510\7\uc56f\7\uc5ce"+
+ "\7\uc62d\7\uc68c\7\uc6eb\7\uc74a\7\uc7a9\7\uc808\7\uc867\7\uc8c6"+
+ "\7\uc925\7\uc984\7\uc9e3\7\uca42\7\ucaa1\7\ucb00\7\ucb5f\7\ucbbe"+
+ "\7\ucc1d\7\ucc7c\7\uccdb\7\ucd3a\7\ucd99\7\ucdf8\7\uce57\7\uceb6"+
+ "\7\ucf15\7\ucf74\7\ucfd3\3\u21ef\7\ud032\7\ud091\7\ud0f0\7\ud14f"+
+ "\7\ud1ae\7\ud20d\7\ud26c\7\ud2cb\7\ud32a\7\ud389\7\ud3e8\7\ud447"+
+ "\7\ud4a6\7\ud505\7\ud564\7\ud5c3\7\ud622\7\ud681\7\ud6e0\7\ud73f"+
+ "\7\ud79e\7\ud7fd\7\ud85c\7\ud8bb\7\ud91a\7\ud979\7\ud9d8\7\uda37"+
+ "\7\uda96\7\udaf5\7\udb54\7\udbb3\7\udc12\7\udc71\7\udcd0\7\udd2f"+
+ "\7\udd8e\7\udded\7\ude4c\7\udeab\7\udf0a\7\udf69\7\udfc8\7\ue027"+
+ "\7\ue086\7\ue0e5\7\ue144\7\ue1a3\7\ue202\7\ue261\7\ue2c0\7\ue31f"+
+ "\7\ue37e\7\ue3dd\7\ue43c\7\ue49b\7\ue4fa\7\ue559\7\ue5b8\7\ue617"+
+ "\7\ue676\7\ue6d5\7\ue734\7\ue793\7\ue7f2\7\ue851\4\u3134\7\ue8b0"+
+ "\7\ue90f\7\ue96e\7\ue9cd\7\uea2c\7\uea8b\7\ueaea\7\ueb49\7\ueba8"+
+ "\7\uec07\7\uec66\7\uecc5\7\ued24\7\ued83\7\uede2\7\uee41\7\ueea0"+
+ "\7\ueeff\7\uef5e\7\uefbd\7\uf01c\7\uf07b\7\uf0da\7\uf139\7\uf198"+
+ "\7\uf1f7\3\ucedd\7\uf256\7\uf2b5\7\uf314\7\uf373\7\uf3d2\7\uf431"+
+ "\7\uf490\7\uf4ef\7\uf54e\7\uf5ad\7\uf60c\7\uf66b\7\uf6ca\7\uf729"+
+ "\7\uf788\7\uf7e7\7\uf846\7\uf8a5\7\uf904\7\uf963\7\uf9c2\7\ufa21"+
+ "\7\ufa80\7\ufadf\7\ufb3e\7\ufb9d\7\ufbfc\7\ufc5b\7\ufcba\7\ufd19"+
+ "\7\ufd78\7\ufdd7\7\ufe36\7\ufe95\7\ufef4\7\uff53\7\uffb2\10\21"+
+ "\10\160\10\317\10\u012e\10\u018d\10\u01ec\10\u024b\10\u02aa\10\u0309"+
+ "\10\u0368\10\u03c7\10\u0426\10\u0485\10\u04e4\10\u0543\10\u05a2\10\u0601"+
+ "\10\u0660\10\u06bf\10\u071e\10\u077d\10\u07dc\10\u083b\10\u089a\10\u08f9"+
+ "\10\u0958\10\u09b7\10\u0a16\10\u0a75\10\u0ad4\10\u0b33\10\u0b92\10\u0bf1"+
+ "\10\u0c50\10\u0caf\10\u0d0e\10\u0d6d\10\u0dcc\10\u0e2b\10\u0e8a\10\u0ee9"+
+ "\10\u0f48\10\u0fa7\10\u1006\10\u1065\10\u10c4\10\u1123\10\u1182\10\u11e1"+
+ "\10\u1240\10\u129f\10\u12fe\10\u135d\10\u13bc\10\u141b\10\u147a\10\u14d9"+
+ "\10\u1538\10\u1597\10\u15f6\10\u1655\10\u16b4\10\u1713\10\u1772\10\u17d1"+
+ "\10\u1830\10\u188f\10\u18ee\10\u194d\10\u19ac\10\u1a0b\10\u1a6a\10\u1ac9"+
+ "\10\u1b28\10\u1b87\10\u1be6\10\u1c45\10\u1ca4\2\u4b12\10\u1d03\10\u1d62"+
+ "\10\u1dc1\10\u1e20\10\u1e7f\10\u1ede\10\u1f3d\10\u1f9c\10\u1ffb\10\u205a"+
+ "\10\u20b9\10\u2118\10\u2177\10\u21d6\10\u2235\10\u2294\10\u22f3\10\u2352"+
+ "\10\u23b1\10\u2410\10\u246f\10\u24ce\10\u252d\10\u258c\10\u25eb\10\u264a"+
+ "\10\u26a9\10\u2708\10\u2767\10\u27c6\10\u2825\10\u2884\10\u28e3\10\u2942"+
+ "\10\u29a1\10\u2a00\10\u2a5f\10\u2abe\10\u2b1d\10\u2b7c\10\u2bdb\10\u2c3a"+
+ "\10\u2c99\10\u2cf8\10\u2d57\10\u2db6\10\u2e15\10\u2e74\10\u2ed3\10\u2f32"+
+ "\10\u2f91\10\u2ff0\10\u304f\10\u30ae\10\u310d\10\u316c\10\u31cb\10\u322a"+
+ "\10\u3289\0\u0b22\10\u32e8\10\u3347\10\u33a6\10\u3405\10\u3464\10\u34c3"+
+ "\10\u3522\10\u3581\10\u35e0\10\u363f\10\u369e\10\u36fd\10\u375c\10\u37bb"+
+ "\10\u381a\10\u3879\10\u38d8\10\u3937\10\u3996\10\u39f5\10\u3a54\10\u3ab3"+
+ "\10\u3b12\10\u3b71\10\u3bd0\10\u3c2f\10\u3c8e\10\u3ced\10\u3d4c\10\u3dab"+
+ "\10\u3e0a\10\u3e69\10\u3ec8\10\u3f27\10\u3f86\6\ua27f\10\u3fe5\10\u4044"+
+ "\10\u40a3\10\u4102\10\u4161\10\u41c0\10\u421f\10\u427e\10\u42dd\10\u433c"+
+ "\10\u439b\10\u43fa\10\u4459\10\u44b8\10\u4517\10\u4576\10\u45d5\10\u4634"+
+ "\10\u4693\10\u46f2\10\u4751\10\u47b0\10\u480f\10\u486e\10\u48cd\10\u492c"+
+ "\10\u498b\10\u49ea\10\u4a49\10\u4aa8\10\u4b07\10\u4b66\10\u4bc5\10\u4c24"+
+ "\10\u4c83\10\u4ce2\10\u4d41\10\u4da0\10\u4dff\10\u4e5e\10\u4ebd\10\u4f1c"+
+ "\10\u4f7b\10\u4fda\10\u5039\10\u5098\10\u50f7\10\u5156\10\u51b5\10\u5214"+
+ "\10\u5273\10\u52d2\10\u5331\10\u5390\10\u53ef\10\u544e\10\u54ad\10\u550c"+
+ "\10\u556b\10\u55ca\10\u5629\10\u5688\10\u56e7\10\u5746\10\u57a5\10\u5804"+
+ "\10\u5863\10\u58c2\10\u5921\10\u5980\10\u59df\10\u5a3e\10\u5a9d\10\u5afc"+
+ "\10\u5b5b\10\u5bba\10\u5c19\10\u5c78\10\u5cd7\10\u5d36\10\u5d95\10\u5df4"+
+ "\10\u5e53\10\u5eb2\10\u5f11\10\u5f70\10\u5fcf\10\u602e\10\u608d\10\u60ec"+
+ "\10\u614b\10\u61aa\10\u6209\10\u6268\10\u62c7\10\u6326\10\u6385\10\u63e4"+
+ "\10\u6443\10\u64a2\10\u6501\10\u6560\10\u65bf\10\u661e\10\u667d\10\u66dc"+
+ "\10\u673b\10\u679a\10\u67f9\10\u6858\10\u68b7\10\u6916\10\u6975\10\u69d4"+
+ "\10\u6a33\10\u6a92\10\u6af1\10\u6b50\6\u2f75\10\u6baf\10\u6c0e\10\u6c6d"+
+ "\10\u6ccc\10\u6d2b\10\u6d8a\10\u6de9\10\u6e48\10\u6ea7\10\u6f06\10\u6f65"+
+ "\10\u6fc4\10\u7023\10\u7082\10\u70e1\10\u7140\10\u719f\10\u71fe\10\u725d"+
+ "\10\u72bc\10\u731b\10\u737a\10\u73d9\10\u7438\10\u7497\10\u74f6\10\u7555"+
+ "\10\u75b4\10\u7613\10\u7672\10\u76d1\10\u7730\10\u778f\10\u77ee\10\u784d"+
+ "\10\u78ac\10\u790b\10\u796a\10\u79c9\10\u7a28\10\u7a87\10\u7ae6\10\u7b45"+
+ "\10\u7ba4\10\u7c03\10\u7c62\10\u7cc1\10\u7d20\10\u7d7f\10\u7dde\10\u7e3d"+
+ "\10\u7e9c\10\u7efb\10\u7f5a\10\u7fb9\10\u8018\10\u8077\10\u80d6\10\u8135"+
+ "\10\u8194\10\u81f3\10\u8252\10\u82b1\10\u8310\10\u836f\10\u83ce\10\u842d"+
+ "\10\u848c\10\u84eb\10\u854a\10\u85a9\10\u8608\10\u8667\10\u86c6\10\u8725"+
+ "\10\u8784\10\u87e3\10\u8842\10\u88a1\10\u8900\10\u895f\10\u89be\10\u8a1d"+
+ "\10\u8a7c\10\u8adb\10\u8b3a\10\u8b99\10\u8bf8\10\u8c57\10\u8cb6\10\u8d15"+
+ "\10\u8d74\10\u8dd3\10\u8e32\10\u8e91\10\u8ef0\10\u8f4f\10\u8fae\10\u900d"+
+ "\10\u906c\10\u90cb\10\u912a\10\u9189\10\u91e8\10\u9247\10\u92a6\10\u9305"+
+ "\10\u9364\10\u93c3\10\u9422\10\u9481\10\u94e0\10\u953f\10\u959e\10\u95fd"+
+ "\10\u965c\10\u96bb\10\u971a\10\u9779\10\u97d8\10\u9837\10\u9896\10\u98f5"+
+ "\10\u9954\10\u99b3\10\u9a12\10\u9a71\10\u9ad0\10\u9b2f\10\u9b8e\10\u9bed"+
+ "\10\u9c4c\10\u9cab\10\u9d0a\10\u9d69\10\u9dc8\10\u9e27\10\u9e86\10\u9ee5"+
+ "\10\u9f44\10\u9fa3\10\ua002\10\ua061\10\ua0c0\10\ua11f\10\ua17e\10\ua1dd"+
+ "\10\ua23c\10\ua29b\10\ua2fa\10\ua359\10\ua3b8\10\ua417\10\ua476\10\ua4d5"+
+ "\10\ua534\10\ua593\10\ua5f2\10\ua651\10\ua6b0\10\ua70f\10\ua76e\10\ua7cd"+
+ "\10\ua82c\10\ua88b\10\ua8ea\10\ua949\10\ua9a8\10\uaa07\10\uaa66\10\uaac5"+
+ "\10\uab24\10\uab83\10\uabe2\10\uac41\10\uaca0\10\uacff\10\uad5e\10\uadbd"+
+ "\10\uae1c\10\uae7b\10\uaeda\10\uaf39\10\uaf98\10\uaff7\10\ub056\10\ub0b5"+
+ "\10\ub114\10\ub173\10\ub1d2\10\ub231\10\ub290\10\ub2ef\10\ub34e\10\ub3ad"+
+ "\10\ub40c\10\ub46b\10\ub4ca\10\ub529\10\ub588\10\ub5e7\10\ub646\10\ub6a5"+
+ "\10\ub704\10\ub763\10\ub7c2\10\ub821\10\ub880\10\ub8df\10\ub93e\10\ub99d"+
+ "\10\ub9fc\10\uba5b\10\ubaba\10\ubb19\10\ubb78\10\ubbd7\10\ubc36\10\ubc95"+
+ "\10\ubcf4\10\ubd53\10\ubdb2\10\ube11\10\ube70\10\ubecf\10\ubf2e\10\ubf8d"+
+ "\10\ubfec\10\uc04b\10\uc0aa\10\uc109\10\uc168\10\uc1c7\10\uc226\10\uc285"+
+ "\10\uc2e4\10\uc343\10\uc3a2\10\uc401\10\uc460\10\uc4bf\10\uc51e\10\uc57d"+
+ "\10\uc5dc\10\uc63b\10\uc69a\10\uc6f9\10\uc758\10\uc7b7\10\uc816\10\uc875"+
+ "\10\uc8d4\10\uc933\6\ube54\10\uc992\10\uc9f1\10\uca50\10\ucaaf\10\ucb0e"+
+ "\10\ucb6d\10\ucbcc\10\ucc2b\10\ucc8a\10\ucce9\10\ucd48\10\ucda7\10\uce06"+
+ "\10\uce65\10\ucec4\10\ucf23\10\ucf82\10\ucfe1\10\ud040\10\ud09f\10\ud0fe"+
+ "\10\ud15d\10\ud1bc\10\ud21b\10\ud27a\10\ud2d9\10\ud338\10\ud397\10\ud3f6"+
+ "\10\ud455\10\ud4b4\10\ud513\10\ud572\10\ud5d1\10\ud630\10\ud68f\10\ud6ee"+
+ "\10\ud74d\10\ud7ac\10\ud80b\10\ud86a\10\ud8c9\10\ud928\10\ud987\2\34"+
+ "\10\ud9e6\10\uda45\10\udaa4\10\udb03\10\udb62\10\udbc1\10\udc20\10\udc7f"+
+ "\10\udcde\10\udd3d\10\udd9c\10\uddfb\10\ude5a\10\udeb9\10\udf18\10\udf77"+
+ "\10\udfd6\10\ue035\10\ue094\10\ue0f3\10\ue152\10\ue1b1\10\ue210\10\ue26f"+
+ "\10\ue2ce\10\ue32d\10\ue38c\10\ue3eb\10\ue44a\10\ue4a9\10\ue508\10\ue567"+
+ "\10\ue5c6\10\ue625\10\ue684\10\ue6e3\10\ue742\10\ue7a1\10\ue800\10\ue85f"+
+ "\10\ue8be\10\ue91d\10\ue97c\10\ue9db\10\uea3a\10\uea99\10\ueaf8\10\ueb57"+
+ "\10\uebb6\10\uec15\10\uec74\10\uecd3\10\ued32\10\ued91\10\uedf0\10\uee4f"+
+ "\10\ueeae\10\uef0d\10\uef6c\10\uefcb\10\uf02a\10\uf089\10\uf0e8\3\u26c2"+
+ "\10\uf147\10\uf1a6\10\uf205\10\uf264\10\uf2c3\10\uf322\10\uf381\10\uf3e0"+
+ "\10\uf43f\10\uf49e\10\uf4fd\10\uf55c\10\uf5bb\10\uf61a\10\uf679\10\uf6d8"+
+ "\10\uf737\10\uf796\10\uf7f5\10\uf854\10\uf8b3\10\uf912\10\uf971\10\uf9d0"+
+ "\10\ufa2f\10\ufa8e\10\ufaed\10\ufb4c\10\ufbab\10\ufc0a\10\ufc69\10\ufcc8"+
+ "\10\ufd27\10\ufd86\10\ufde5\10\ufe44\10\ufea3\10\uff02\10\uff61\10\uffc0"+
+ "\11\37\11\176\11\335\11\u013c\11\u019b\11\u01fa\11\u0259\11\u02b8"+
+ "\11\u0317\11\u0376\11\u03d5\11\u0434\11\u0493\11\u04f2\11\u0551\11\u05b0"+
+ "\11\u060f\11\u066e\11\u06cd\11\u072c\11\u078b\11\u07ea\11\u0849\11\u08a8"+
+ "\11\u0907\11\u0966\11\u09c5\11\u0a24\11\u0a83\11\u0ae2\11\u0b41\11\u0ba0"+
+ "\11\u0bff\11\u0c5e\11\u0cbd\11\u0d1c\11\u0d7b\11\u0dda\11\u0e39\11\u0e98"+
+ "\11\u0ef7\11\u0f56\11\u0fb5\11\u1014\11\u1073\11\u10d2\11\u1131\11\u1190"+
+ "\11\u11ef\11\u124e\11\u12ad\11\u130c\11\u136b\11\u13ca\11\u1429\11\u1488"+
+ "\11\u14e7\11\u1546\11\u15a5\11\u1604\11\u1663\11\u16c2\11\u1721\11\u1780"+
+ "\11\u17df\11\u183e\11\u189d\11\u18fc\11\u195b\11\u19ba\11\u1a19\11\u1a78"+
+ "\11\u1ad7\11\u1b36\11\u1b95\11\u1bf4\11\u1c53\11\u1cb2\11\u1d11\11\u1d70"+
+ "\11\u1dcf\11\u1e2e\11\u1e8d\11\u1eec\11\u1f4b\11\u1faa\11\u2009\11\u2068"+
+ "\11\u20c7\11\u2126\11\u2185\11\u21e4\11\u2243\11\u22a2\11\u2301\11\u2360"+
+ "\11\u23bf\11\u241e\11\u247d\11\u24dc\11\u253b\11\u259a\11\u25f9\11\u2658"+
+ "\10\u89be\11\u26b7\11\u2716\11\u2775\11\u27d4\11\u2833\11\u2892\11\u28f1"+
+ "\11\u2950\11\u29af\11\u2a0e\11\u2a6d\11\u2acc\11\u2b2b\11\u2b8a\11\u2be9"+
+ "\11\u2c48\11\u2ca7\11\u2d06\11\u2d65\11\u2dc4\11\u2e23\11\u2e82\11\u2ee1"+
+ "\11\u2f40\11\u2f9f\11\u2ffe\11\u305d\11\u30bc\11\u311b\11\u317a\11\u31d9"+
+ "\11\u3238\11\u3297\11\u32f6\11\u3355\11\u33b4\11\u3413\11\u3472\11\u34d1"+
+ "\11\u3530\11\u358f\11\u35ee\11\u364d\11\u36ac\11\u370b\11\u376a\11\u37c9"+
+ "\11\u3828\11\u3887\11\u38e6\11\u3945\11\u39a4\11\u3a03\11\u3a62\11\u3ac1"+
+ "\11\u3b20\11\u3b7f\11\u3bde\11\u3c3d\11\u3c9c\11\u3cfb\11\u3d5a\11\u3db9"+
+ "\11\u3e18\11\u3e77\11\u3ed6\11\u3f35\11\u3f94\11\u3ff3\11\u4052\11\u40b1"+
+ "\11\u4110\11\u416f\11\u41ce\11\u422d\11\u428c\11\u42eb\11\u434a\11\u43a9"+
+ "\11\u4408\11\u4467\11\u44c6\11\u4525\11\u4584\11\u45e3\11\u4642\11\u46a1"+
+ "\11\u4700\11\u475f\11\u47be\11\u481d\11\u487c\11\u48db\11\u493a\11\u4999"+
+ "\11\u49f8\11\u4a57\11\u4ab6\11\u4b15\11\u4b74\11\u4bd3\11\u4c32\11\u4c91"+
+ "\11\u4cf0\11\u4d4f\11\u4dae\11\u4e0d\11\u4e6c\11\u4ecb\11\u4f2a\11\u4f89"+
+ "\11\u4fe8\11\u5047\11\u50a6\11\u5105\11\u5164\11\u51c3\11\u5222\11\u5281"+
+ "\3\ucf3c\11\u52e0\11\u533f\11\u539e\11\u53fd\11\u545c\11\u54bb\11\u551a"+
+ "\11\u5579\11\u55d8\11\u5637\11\u5696\11\u56f5\11\u5754\11\u57b3\11\u5812"+
+ "\11\u5871\11\u58d0\11\u592f\11\u598e\11\u59ed\11\u5a4c\11\u5aab\11\u5b0a"+
+ "\11\u5b69\11\u5bc8\11\u5c27\11\u5c86\11\u5ce5\11\u5d44\11\u5da3\11\u5e02"+
+ "\11\u5e61\11\u5ec0\11\u5f1f\11\u5f7e\11\u5fdd\11\u603c\11\u609b\11\u60fa"+
+ "\11\u6159\11\u61b8\11\u6217\11\u6276\11\u62d5\11\u6334\11\u6393\11\u63f2"+
+ "\11\u6451\11\u64b0\11\u650f\11\u656e\11\u65cd\11\u662c\11\u668b\11\u66ea"+
+ "\11\u6749\11\u67a8\11\u6807\11\u6866\11\u68c5\11\u6924\11\u6983\11\u69e2"+
+ "\11\u6a41\11\u6aa0\11\u6aff\11\u6b5e\11\u6bbd\11\u6c1c\11\u6c7b\11\u6cda"+
+ "\11\u6d39\11\u6d98\11\u6df7\11\u6e56\11\u6eb5\11\u6f14\11\u6f73\11\u6fd2"+
+ "\11\u7031\11\u7090\11\u70ef\11\u714e\11\u71ad\11\u720c\11\u726b\11\u72ca"+
+ "\11\u7329\11\u7388\11\u73e7\11\u7446\11\u74a5\11\u7504\11\u7563\11\u75c2"+
+ "\11\u7621\11\u7680\11\u76df\11\u773e\0\uefba\11\u779d\11\u77fc\11\u785b"+
+ "\11\u78ba\11\u7919\11\u7978\11\u79d7\11\u7a36\11\u7a95\11\u7af4\11\u7b53"+
+ "\11\u7bb2\11\u7c11\11\u7c70\11\u7ccf\11\u7d2e\11\u7d8d\11\u7dec\11\u7e4b"+
+ "\11\u7eaa\11\u7f09\11\u7f68\11\u7fc7\11\u8026\11\u8085\11\u80e4\11\u8143"+
+ "\11\u81a2\11\u8201\11\u8260\11\u82bf\11\u831e\11\u837d\11\u83dc\11\u843b"+
+ "\11\u849a\11\u84f9\11\u8558\11\u85b7\11\u8616\11\u8675\11\u86d4\11\u8733"+
+ "\11\u8792\11\u87f1\11\u8850\11\u88af\11\u890e\11\u896d\11\u89cc\11\u8a2b"+
+ "\11\u8a8a\11\u8ae9\11\u8b48\11\u8ba7\11\u8c06\11\u8c65\11\u8cc4\11\u8d23"+
+ "\11\u8d82\11\u8de1\11\u8e40\11\u8e9f\11\u8efe\11\u8f5d\11\u8fbc\11\u901b"+
+ "\11\u907a\11\u90d9\11\u9138\11\u9197\11\u91f6\11\u9255\11\u92b4\11\u9313"+
+ "\11\u9372\11\u93d1\11\u9430\11\u948f\11\u94ee\11\u954d\11\u95ac\11\u960b"+
+ "\11\u966a\11\u96c9\11\u9728\11\u9787\11\u97e6\11\u9845\11\u98a4\11\u9903"+
+ "\11\u9962\11\u99c1\11\u9a20\11\u9a7f\11\u9ade\11\u9b3d\11\u9b9c\11\u9bfb"+
+ "\11\u9c5a\11\u9cb9\11\u9d18\11\u9d77\11\u9dd6\11\u9e35\11\u9e94\11\u9ef3"+
+ "\4\uf524\11\u9f52\11\u9fb1\11\ua010\11\ua06f\11\ua0ce\11\ua12d\11\ua18c"+
+ "\11\ua1eb\11\ua24a\11\ua2a9\11\ua308\11\ua367\11\ua3c6\11\ua425\11\ua484"+
+ "\11\ua4e3\11\ua542\11\ua5a1\11\ua600\11\ua65f\11\ua6be\11\ua71d\11\ua77c"+
+ "\11\ua7db\11\ua83a\11\ua899\11\ua8f8\11\ua957\11\ua9b6\11\uaa15\11\uaa74"+
+ "\11\uaad3\11\uab32\11\uab91\11\uabf0\11\uac4f\11\uacae\11\uad0d\11\uad6c"+
+ "\11\uadcb\11\uae2a\11\uae89\11\uaee8\11\uaf47\11\uafa6\11\ub005\11\ub064"+
+ "\11\ub0c3\11\ub122\11\ub181\11\ub1e0\11\ub23f\11\ub29e\11\ub2fd\11\ub35c"+
+ "\11\ub3bb\11\ub41a\11\ub479\11\ub4d8\11\ub537\11\ub596\5\ubf63\11\ub5f5"+
+ "\11\ub654\11\ub6b3\11\ub712\11\ub771\11\ub7d0\11\ub82f\11\ub88e\11\ub8ed"+
+ "\11\ub94c\11\ub9ab\11\uba0a\11\uba69\11\ubac8\11\ubb27\11\ubb86\11\ubbe5"+
+ "\11\ubc44\11\ubca3\11\ubd02\11\ubd61\11\ubdc0\11\ube1f\11\ube7e\11\ubedd"+
+ "\11\ubf3c\11\ubf9b\11\ubffa\11\uc059\11\uc0b8\11\uc117\11\uc176\11\uc1d5"+
+ "\11\uc234\11\uc293\11\uc2f2\11\uc351\11\uc3b0\11\uc40f\11\uc46e\11\uc4cd"+
+ "\11\uc52c\11\uc58b\11\uc5ea\11\uc649\11\uc6a8\11\uc707\11\uc766\11\uc7c5"+
+ "\11\uc824\11\uc883\11\uc8e2\11\uc941\11\uc9a0\11\uc9ff\11\uca5e\11\ucabd"+
+ "\11\ucb1c\11\ucb7b\11\ucbda\11\ucc39\11\ucc98\11\uccf7\11\ucd56\11\ucdb5"+
+ "\11\uce14\11\uce73\11\uced2\11\ucf31\11\ucf90\11\ucfef\11\ud04e\11\ud0ad"+
+ "\11\ud10c\11\ud16b\11\ud1ca\11\ud229\11\ud288\11\ud2e7\11\ud346\11\ud3a5"+
+ "\11\ud404\11\ud463\11\ud4c2\7\ue559\11\ud521\11\ud580\11\ud5df\11\ud63e"+
+ "\11\ud69d\11\ud6fc\11\ud75b\11\ud7ba\11\ud819\11\ud878\11\ud8d7\11\ud936"+
+ "\11\ud995\11\ud9f4\11\uda53\11\udab2\11\udb11\11\udb70\11\udbcf\11\udc2e"+
+ "\11\udc8d\11\udcec\11\udd4b\11\uddaa\11\ude09\11\ude68\11\udec7\11\udf26"+
+ "\11\udf85\11\udfe4\11\ue043\11\ue0a2\11\ue101\11\ue160\11\ue1bf\11\ue21e"+
+ "\11\ue27d\11\ue2dc\11\ue33b\11\ue39a\11\ue3f9\11\ue458\11\ue4b7\11\ue516"+
+ "\11\ue575\11\ue5d4\11\ue633\11\ue692\11\ue6f1\11\ue750\11\ue7af\11\ue80e"+
+ "\11\ue86d\11\ue8cc\11\ue92b\11\ue98a\11\ue9e9\11\uea48\11\ueaa7\11\ueb06"+
+ "\11\ueb65\11\uebc4\11\uec23\11\uec82\11\uece1\11\ued40\11\ued9f\11\uedfe"+
+ "\11\uee5d\2\uf44a\11\ueebc\11\uef1b\11\uef7a\11\uefd9\11\uf038\11\uf097"+
+ "\11\uf0f6\11\uf155\11\uf1b4\11\uf213\11\uf272\11\uf2d1\11\uf330\11\uf38f"+
+ "\11\ua899\11\uf3ee\11\uf44d\11\uf4ac\11\uf50b\11\uf56a\11\uf5c9\11\uf628"+
+ "\11\uf687\11\uf6e6\11\uf745\11\uf7a4\11\uf803\11\uf862\11\uf8c1\11\uf920"+
+ "\11\uf97f\11\uf9de\11\ufa3d\11\ufa9c\11\ufafb\11\ufb5a\11\ufbb9\11\ufc18"+
+ "\11\ufc77\11\ufcd6\11\ufd35\11\ufd94\11\ufdf3\11\ufe52\11\ufeb1\11\uff10"+
+ "\11\uff6f\11\uffce\12\55\12\214\12\353\12\u014a\12\u01a9\12\u0208"+
+ "\12\u0267\12\u02c6\12\u0325\12\u0384\12\u03e3\10\u3405\12\u0442\12\u04a1"+
+ "\12\u0500\12\u055f\12\u05be\12\u061d\12\u067c\12\u06db\12\u073a\12\u0799"+
+ "\12\u07f8\12\u0857\12\u08b6\12\u0915\12\u0974\12\u09d3\12\u0a32\12\u0a91"+
+ "\12\u0af0\12\u0b4f\12\u0bae\12\u0c0d\12\u0c6c\12\u0ccb\12\u0d2a\12\u0d89"+
+ "\12\u0de8\12\u0e47\12\u0ea6\12\u0f05\12\u0f64\12\u0fc3\12\u1022\12\u1081"+
+ "\12\u10e0\12\u113f\12\u119e\12\u11fd\12\u125c\12\u12bb\12\u131a\12\u1379"+
+ "\12\u13d8\12\u1437\12\u1496\12\u14f5\12\u1554\12\u15b3\12\u1612\12\u1671"+
+ "\12\u16d0\12\u172f\12\u178e\12\u17ed\12\u184c\12\u18ab\12\u190a\12\u1969"+
+ "\12\u19c8\12\u1a27\12\u1a86\12\u1ae5\12\u1b44\12\u1ba3\12\u1c02\12\u1c61"+
+ "\12\u1cc0\12\u1d1f\12\u1d7e\12\u1ddd\12\u1e3c\12\u1e9b\6\u98d9\12\u1efa"+
+ "\12\u1f59\12\u1fb8\12\u2017\12\u2076\12\u20d5\12\u2134\12\u2193\12\u21f2"+
+ "\12\u2251\12\u22b0\12\u230f\12\u236e\12\u23cd\12\u242c\12\u248b\12\u24ea"+
+ "\12\u2549\12\u25a8\12\u2607\12\u2666\12\u26c5\12\u2724\12\u2783\12\u27e2"+
+ "\12\u2841\11\u82bf\12\u28a0\12\u28ff\12\u295e\12\u29bd\12\u2a1c\12\u2a7b"+
+ "\12\u2ada\12\u2b39\12\u2b98\12\u2bf7\12\u2c56\12\u2cb5\12\u2d14\12\u2d73"+
+ "\12\u2dd2\12\u2e31\12\u2e90\12\u2eef\12\u2f4e\12\u2fad\12\u300c\12\u306b"+
+ "\12\u30ca\12\u3129\12\u3188\12\u31e7\12\u3246\12\u32a5\12\u3304\12\u3363"+
+ "\12\u33c2\12\u3421\12\u3480\12\u34df\12\u353e\12\u359d\12\u35fc\12\u365b"+
+ "\12\u36ba\12\u3719\12\u3778\12\u37d7\12\u3836\12\u3895\12\u38f4\12\u3953"+
+ "\12\u39b2\12\u3a11\12\u3a70\12\u3acf\12\u3b2e\12\u3b8d\12\u3bec\10\u9837"+
+ "\12\u3c4b\12\u3caa\12\u3d09\12\u3d68\12\u3dc7\12\u3e26\12\u3e85\12\u3ee4"+
+ "\12\u3f43\12\u3fa2\12\u4001\12\u4060\12\u40bf\12\u411e\12\u417d\12\u41dc"+
+ "\12\u423b\12\u429a\12\u42f9\12\u4358\12\u43b7\12\u4416\12\u4475\12\u44d4"+
+ "\12\u4533\12\u4592\12\u45f1\12\u4650\12\u46af\12\u470e\12\u476d\12\u47cc"+
+ "\12\u482b\12\u488a\12\u48e9\12\u4948\12\u49a7\12\u4a06\12\u4a65\12\u4ac4"+
+ "\12\u4b23\12\u4b82\12\u4be1\12\u4c40\12\u4c9f\12\u4cfe\12\u4d5d\12\u4dbc"+
+ "\12\u4e1b\12\u4e7a\12\u4ed9\12\u4f38\12\u4f97\12\u4ff6\12\u5055\12\u50b4"+
+ "\12\u5113\12\u5172\12\u51d1\12\u5230\12\u528f\12\u52ee\12\u534d\12\u53ac"+
+ "\12\u540b\12\u546a\12\u54c9\12\u5528\12\u5587\12\u55e6\12\u5645\12\u56a4"+
+ "\12\u5703\12\u5762\12\u57c1\12\u5820\12\u587f\12\u58de\12\u593d\12\u599c"+
+ "\12\u59fb\12\u5a5a\12\u5ab9\12\u5b18\12\u5b77\12\u5bd6\12\u5c35\12\u5c94"+
+ "\12\u5cf3\12\u5d52\12\u5db1\12\u5e10\12\u5e6f\12\u5ece\12\u5f2d\12\u5f8c"+
+ "\12\u5feb\12\u604a\12\u60a9\12\u6108\12\u6167\12\u61c6\12\u6225\12\u6284"+
+ "\12\u62e3\12\u6342\12\u63a1\12\u6400\12\u645f\12\u64be\12\u651d\12\u657c"+
+ "\12\u65db\12\u663a\12\u6699\12\u66f8\12\u6757\12\u67b6\12\u6815\12\u6874"+
+ "\12\u68d3\12\u6932\12\u6991\12\u69f0\12\u6a4f\12\u6aae\12\u6b0d\3\u8621"+
+ "\12\u6b6c\12\u6bcb\12\u6c2a\12\u6c89\5\uf05f\12\u6ce8\12\u6d47\12\u6da6"+
+ "\12\u6e05\12\u6e64\12\u6ec3\12\u6f22\12\u6f81\12\u6fe0\12\u703f\12\u709e"+
+ "\12\u70fd\12\u715c\12\u71bb\12\u721a\12\u7279\12\u72d8\12\u7337\12\u7396"+
+ "\12\u73f5\12\u7454\12\u74b3\12\u7512\12\u7571\12\u75d0\12\u762f\12\u768e"+
+ "\12\u76ed\12\u774c\12\u77ab\12\u780a\12\u7869\12\u78c8\12\u7927\12\u7986"+
+ "\12\u79e5\12\u7a44\12\u7aa3\12\u7b02\12\u7b61\12\u7bc0\12\u7c1f\12\u7c7e"+
+ "\12\u7cdd\12\u7d3c\12\u7d9b\12\u7dfa\12\u7e59\12\u7eb8\12\u7f17\12\u7f76"+
+ "\12\u7fd5\12\u8034\12\u8093\12\u80f2\12\u8151\12\u81b0\12\u820f\12\u826e"+
+ "\12\u82cd\12\u832c\12\u838b\12\u83ea\12\u8449\12\u84a8\12\u8507\12\u8566"+
+ "\12\u85c5\12\u8624\12\u8683\12\u86e2\12\u8741\12\u87a0\12\u87ff\12\u885e"+
+ "\11\uabf0\12\u88bd\12\u891c\12\u897b\12\u89da\12\u8a39\12\u8a98\12\u8af7"+
+ "\12\u8b56\12\u8bb5\12\u8c14\12\u8c73\12\u8cd2\12\u8d31\12\u8d90\12\u8def"+
+ "\12\u8e4e\12\u8ead\12\u8f0c\12\u8f6b\12\u8fca\12\u9029\12\u9088\12\u90e7"+
+ "\12\u9146\12\u91a5\12\u9204\12\u9263\12\u92c2\12\u9321\12\u9380\12\u93df"+
+ "\12\u943e\12\u949d\12\u94fc\12\u955b\12\u95ba\12\u9619\12\u9678\12\u96d7"+
+ "\12\u9736\12\u9795\12\u97f4\12\u9853\12\u98b2\12\u9911\12\u9970\12\u99cf"+
+ "\12\u9a2e\12\u9a8d\12\u9aec\12\u9b4b\12\u9baa\12\u9c09\12\u9c68\12\u9cc7"+
+ "\12\u9d26\12\u9d85\12\u9de4\12\u9e43\12\u9ea2\12\u9f01\12\u9f60\12\u9fbf"+
+ "\12\ua01e\12\ua07d\12\ua0dc\12\ua13b\12\ua19a\12\ua1f9\12\ua258\12\ua2b7"+
+ "\12\ua316\12\ua375\12\ua3d4\12\ua433\12\ua492\12\ua4f1\12\ua550\12\ua5af"+
+ "\12\ua60e\12\ua66d\12\ua6cc\12\ua72b\12\ua78a\12\ua7e9\12\ua848\12\ua8a7"+
+ "\12\ua906\12\ua965\12\ua9c4\12\uaa23\12\uaa82\12\uaae1\12\uab40\12\uab9f"+
+ "\12\uabfe\12\uac5d\12\uacbc\12\uad1b\12\uad7a\12\uadd9\12\uae38\12\uae97"+
+ "\12\uaef6\12\uaf55\12\uafb4\12\ub013\12\ub072\12\ub0d1\12\ub130\12\ub18f"+
+ "\12\ub1ee\12\ub24d\12\ub2ac\12\ub30b\12\ub36a\12\ub3c9\10\u71fe\12\ub428"+
+ "\12\ub487\12\ub4e6\12\ub545\12\ub5a4\12\ub603\12\ub662\12\ub6c1\12\ub720"+
+ "\12\ub77f\6\u203e\12\ub7de\12\ub83d\12\ub89c\12\ub8fb\12\ub95a\12\ub9b9"+
+ "\12\uba18\12\uba77\12\ubad6\12\ubb35\12\ubb94\12\ubbf3\12\ubc52\12\ubcb1"+
+ "\12\ubd10\12\ubd6f\12\ubdce\12\ube2d\12\ube8c\12\ubeeb\12\ubf4a\12\ubfa9"+
+ "\12\uc008\12\u067c\12\uc067\12\uc0c6\12\uc125\12\uc184\12\uc1e3\12\uc242"+
+ "\12\uc2a1\12\uc300\12\uc35f\12\uc3be\12\uc41d\12\uc47c\12\uc4db\12\uc53a"+
+ "\12\uc599\12\uc5f8\12\uc657\12\uc6b6\12\uc715\12\uc774\12\uc7d3\12\uc832"+
+ "\12\uc891\12\uc8f0\12\uc94f\12\uc9ae\12\uca0d\12\uca6c\12\ucacb\12\ucb2a"+
+ "\12\ucb89\12\ucbe8\12\ucc47\12\ucca6\12\ucd05\12\ucd64\12\ucdc3\12\uce22"+
+ "\12\uce81\12\ucee0\12\ucf3f\12\ucf9e\12\ucffd\12\ud05c\12\ud0bb\12\ud11a"+
+ "\12\ud179\12\ud1d8\12\ud237\12\ud296\12\ud2f5\12\ud354\12\ud3b3\12\ud412"+
+ "\12\ud471\12\ud4d0\12\ud52f\12\ud58e\12\ud5ed\12\ud64c\12\ud6ab\12\ud70a"+
+ "\12\ud769\12\ud7c8\12\ud827\12\ud886\12\ud8e5\12\ud944\12\ud9a3\12\uda02"+
+ "\12\uda61\12\udac0\12\udb1f\12\udb7e\12\udbdd\12\udc3c\12\udc9b\12\udcfa"+
+ "\12\udd59\12\uddb8\12\ude17\12\ude76\12\uded5\12\udf34\12\udf93\12\udff2"+
+ "\12\ue051\12\ue0b0\12\ue10f\12\ue16e\12\ue1cd\12\ue22c\12\ue28b\12\ue2ea"+
+ "\12\ue349\12\ue3a8\12\ue407\12\ue466\12\ue4c5\12\ue524\12\ue583\12\ue5e2"+
+ "\12\ue641\12\ue6a0\12\ue6ff\12\ue75e\12\ue7bd\12\ue81c\12\ue87b\12\ue8da"+
+ "\12\ue939\12\ue998\12\ue9f7\12\uea56\12\ueab5\12\ueb14\12\ueb73\12\uebd2"+
+ "\12\uec31\12\uec90\12\uecef\12\ued4e\12\uedad\12\uee0c\12\uee6b\12\ueeca"+
+ "\12\uef29\12\uef88\12\uefe7\12\uf046\4\ud3be\12\uf0a5\12\uf104\12\uf163"+
+ "\12\uf1c2\12\uf221\12\uf280\12\uf2df\12\uf33e\12\uf39d\12\uf3fc\12\uf45b"+
+ "\12\uf4ba\12\uf519\12\uf578\12\uf5d7\12\uf636\12\uf695\12\uf6f4\12\uf753"+
+ "\12\uf7b2\12\uf811\12\uf870\12\uf8cf\12\uf92e\12\uf98d\12\uf9ec\12\ufa4b"+
+ "\12\ufaaa\12\ufb09\12\ufb68\12\ufbc7\12\ufc26\12\ufc85\12\ufce4\12\ufd43"+
+ "\12\ufda2\12\ufe01\12\ufe60\12\ufebf\12\uff1e\12\uff7d\12\uffdc\13\73"+
+ "\13\232\13\371\13\u0158\13\u01b7\13\u0216\13\u0275\13\u02d4\13\u0333"+
+ "\13\u0392\13\u03f1\13\u0450\13\u04af\13\u050e\13\u056d\13\u05cc\13\u062b"+
+ "\13\u068a\13\u06e9\13\u0748\13\u07a7\13\u0806\13\u0865\13\u08c4\13\u0923"+
+ "\13\u0982\13\u09e1\13\u0a40\13\u0a9f\13\u0afe\13\u0b5d\13\u0bbc\13\u0c1b"+
+ "\13\u0c7a\13\u0cd9\13\u0d38\13\u0d97\13\u0df6\13\u0e55\13\u0eb4\13\u0f13"+
+ "\13\u0f72\13\u0fd1\13\u1030\13\u108f\13\u10ee\13\u114d\13\u11ac\13\u120b"+
+ "\13\u126a\13\u12c9\13\u1328\13\u1387\13\u13e6\13\u1445\13\u14a4\13\u1503"+
+ "\13\u1562\13\u15c1\13\u1620\13\u167f\13\u16de\13\u173d\13\u179c\13\u17fb"+
+ "\13\u185a\13\u18b9\13\u1918\13\u1977\13\u19d6\13\u1a35\13\u1a94\13\u1af3"+
+ "\13\u1b52\13\u1bb1\13\u1c10\13\u1c6f\13\u1cce\13\u1d2d\13\u1d8c\13\u1deb"+
+ "\13\u1e4a\13\u1ea9\13\u1f08\13\u1f67\13\u1fc6\13\u2025\13\u2084\13\u20e3"+
+ "\13\u2142\13\u21a1\13\u2200\13\u225f\13\u22be\13\u231d\13\u237c\13\u23db"+
+ "\13\u243a\13\u2499\13\u24f8\13\u2557\13\u25b6\13\u2615\13\u2674\13\u26d3"+
+ "\13\u2732\13\u2791\13\u27f0\13\u284f\13\u28ae\13\u290d\13\u296c\13\u29cb"+
+ "\13\u2a2a\13\u2a89\13\u2ae8\13\u2b47\13\u2ba6\13\u2c05\13\u2c64\13\u2cc3"+
+ "\13\u2d22\13\u2d81\13\u2de0\13\u2e3f\13\u2e9e\13\u2efd\13\u2f5c\13\u2fbb"+
+ "\13\u301a\13\u3079\13\u30d8\13\u3137\13\u3196\13\u31f5\13\u3254\13\u32b3"+
+ "\13\u3312\13\u3371\13\u33d0\13\u342f\13\u348e\13\u34ed\13\u354c\13\u35ab"+
+ "\11\u1ad7";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[7921];
+ 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 =
+ "\1\35\1\36\1\37\1\40\1\41\1\42\131\35\2\43"+
+ "\1\44\26\43\1\45\30\43\1\46\4\43\1\47\17\43"+
+ "\1\50\27\43\2\51\1\52\14\51\1\53\117\51\1\54"+
+ "\1\55\1\0\1\56\1\41\2\54\1\57\1\60\6\54"+
+ "\1\61\26\54\1\62\37\54\1\63\30\54\2\64\1\0"+
+ "\1\64\1\65\2\64\2\65\1\66\1\67\1\70\1\71"+
+ "\1\72\1\73\1\65\1\64\1\74\1\75\3\64\1\76"+
+ "\3\64\1\77\6\64\1\100\4\64\1\65\6\64\1\71"+
+ "\1\64\1\73\1\70\1\75\1\100\1\101\1\74\1\66"+
+ "\1\72\1\102\1\103\1\104\1\67\1\105\1\64\1\106"+
+ "\1\107\1\110\1\76\5\64\1\65\1\64\1\101\1\103"+
+ "\1\104\1\106\1\105\1\77\1\64\1\107\1\111\1\110"+
+ "\1\102\4\64\1\111\7\64\3\112\1\113\3\112\1\114"+
+ "\127\112\3\115\1\113\102\115\1\114\30\115\1\54\1\55"+
+ "\1\0\1\56\1\41\2\54\1\116\1\117\6\54\1\120"+
+ "\26\54\1\62\37\54\1\121\30\54\3\112\1\113\3\112"+
+ "\1\122\127\112\3\115\1\113\102\115\1\122\30\115\1\54"+
+ "\1\55\1\0\1\54\1\41\2\54\1\123\1\117\6\54"+
+ "\1\124\26\54\1\62\37\54\1\125\30\54\7\126\1\127"+
+ "\127\126\106\130\1\127\30\130\1\131\1\41\1\132\1\133"+
+ "\1\41\1\134\1\135\1\136\1\137\3\140\1\141\2\140"+
+ "\1\142\4\140\1\143\1\144\1\140\1\143\1\140\1\145"+
+ "\1\146\1\147\2\131\1\140\1\150\2\140\1\151\1\152"+
+ "\1\153\1\135\4\150\3\62\1\154\1\155\1\156\1\157"+
+ "\1\160\1\161\1\162\1\163\1\164\1\165\2\140\1\166"+
+ "\1\167\1\170\3\140\1\171\1\172\1\131\2\153\1\140"+
+ "\1\153\1\173\1\174\2\140\1\175\10\140\1\143\2\140"+
+ "\1\153\1\140\3\143\1\140\3\143\2\176\1\177\32\176"+
+ "\1\200\50\176\1\201\30\176\2\202\1\203\4\202\1\204"+
+ "\25\202\1\205\101\202\2\206\1\207\1\210\33\206\1\211"+
+ "\22\206\1\212\4\206\1\213\17\206\1\214\27\206\2\215"+
+ "\1\216\1\217\56\215\1\220\4\215\1\221\17\215\1\222"+
+ "\27\215\1\131\1\41\1\223\1\224\1\41\1\134\1\135"+
+ "\1\225\1\226\6\140\1\142\4\140\1\143\1\144\1\140"+
+ "\1\143\1\227\1\145\1\230\1\135\1\231\1\131\1\232"+
+ "\1\150\2\140\1\151\1\152\1\153\1\135\4\150\1\233"+
+ "\2\62\1\234\1\235\1\236\1\237\1\240\1\241\1\242"+
+ "\1\243\1\244\1\245\1\246\1\247\1\250\1\251\1\252"+
+ "\1\253\1\254\1\255\1\256\1\257\1\260\2\153\1\261"+
+ "\1\153\1\262\1\263\13\140\1\143\1\140\1\264\1\153"+
+ "\1\265\3\143\1\266\3\143\2\267\1\270\34\267\1\271"+
+ "\22\267\1\212\4\267\1\213\17\267\1\214\27\267\2\272"+
+ "\1\273\4\272\1\274\25\272\1\275\1\276\100\272\2\176"+
+ "\1\277\32\176\1\300\50\176\1\301\30\176\1\302\1\41"+
+ "\1\303\1\304\1\41\1\302\1\153\1\305\1\306\6\307"+
+ "\1\62\4\307\2\302\1\307\1\302\3\307\1\302\1\310"+
+ "\1\302\1\62\3\307\1\62\1\307\1\302\1\135\2\62"+
+ "\3\302\1\311\1\62\24\307\1\312\2\153\1\307\1\153"+
+ "\1\313\14\307\1\302\2\307\1\314\1\307\3\302\1\307"+
+ "\3\302\1\315\1\41\1\316\1\317\1\41\3\315\1\320"+
+ "\6\321\1\315\4\321\2\315\1\321\1\315\3\321\4\315"+
+ "\1\322\2\321\2\315\1\323\6\315\1\324\1\315\24\321"+
+ "\3\315\1\321\2\315\14\321\1\315\2\321\1\315\1\321"+
+ "\3\315\1\321\3\315\1\325\1\41\1\326\1\327\1\41"+
+ "\1\325\1\330\1\305\1\331\6\332\1\325\4\332\2\333"+
+ "\1\332\1\333\1\332\1\334\1\332\1\325\1\335\1\332"+
+ "\2\325\2\332\1\325\1\135\1\323\1\135\3\325\1\336"+
+ "\3\325\24\332\1\325\1\337\1\340\1\332\1\325\1\313"+
+ "\14\332\1\333\2\332\1\325\1\332\3\333\1\332\3\333"+
+ "\2\202\1\341\4\202\1\342\25\202\1\275\101\202\2\176"+
+ "\1\343\32\176\1\275\50\176\1\344\30\176\2\267\1\345"+
+ "\34\267\1\346\22\267\1\212\4\267\1\213\17\267\1\214"+
+ "\27\267\2\35\4\0\132\35\1\36\2\0\1\41\1\0"+
+ "\131\35\147\0\1\347\1\350\5\351\1\0\10\351\2\0"+
+ "\1\351\5\0\2\351\7\0\1\352\1\353\2\0\10\351"+
+ "\1\350\13\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+ "\1\0\1\41\2\0\1\41\132\0\4\42\1\0\1\42"+
+ "\1\354\130\42\2\43\1\0\26\43\1\0\30\43\1\0"+
+ "\4\43\1\0\17\43\1\0\27\43\31\0\1\355\162\0"+
+ "\1\356\1\0\1\357\136\0\1\360\166\0\1\361\27\0"+
+ "\2\51\1\0\14\51\1\0\117\51\2\54\1\0\1\54"+
+ "\1\0\2\54\2\0\6\54\1\0\26\54\1\0\37\54"+
+ "\1\0\31\54\1\55\1\0\1\54\1\41\2\54\2\0"+
+ "\6\54\1\0\26\54\1\0\37\54\1\0\32\54\1\0"+
+ "\1\54\1\0\2\54\2\0\6\54\1\0\26\54\1\0"+
+ "\3\54\1\362\33\54\1\0\30\54\17\0\1\61\117\0"+
+ "\2\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\37\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\1\64\1\363\2\64\1\364\1\365\1\0"+
+ "\2\64\1\366\7\64\1\367\13\64\1\0\10\64\1\365"+
+ "\1\64\1\366\1\64\1\370\2\64\1\364\1\64\1\371"+
+ "\1\64\1\363\2\64\1\372\10\64\1\0\1\64\1\370"+
+ "\1\371\1\64\1\372\1\64\1\367\23\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\373\2\64\1\0\2\64"+
+ "\1\374\23\64\1\0\6\64\1\373\3\64\1\374\1\64"+
+ "\1\375\4\64\1\376\15\64\1\0\1\64\1\375\1\376"+
+ "\27\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\12\64\1\377\13\64\1\0\37\64\1\0\6\64\1\377"+
+ "\23\64\1\0\1\64\1\0\2\64\2\0\1\u0100\5\64"+
+ "\1\0\1\64\1\u0101\17\64\1\u0102\4\64\1\0\13\64"+
+ "\1\u0102\1\64\1\u0101\1\u0100\3\64\1\u0103\3\64\1\u0104"+
+ "\10\64\1\0\3\64\1\u0103\1\u0104\25\64\1\0\1\64"+
+ "\1\0\2\64\2\0\2\64\1\u0105\3\64\1\0\1\64"+
+ "\1\u0106\24\64\1\0\11\64\1\u0105\2\64\1\u0107\1\u0106"+
+ "\21\64\1\0\1\64\1\u0107\30\64\1\0\1\64\1\0"+
+ "\2\64\2\0\2\64\1\111\1\u0108\1\64\1\111\1\0"+
+ "\2\64\1\u0109\3\64\1\u010a\12\64\1\u010b\4\64\1\0"+
+ "\6\64\1\u0108\1\64\2\111\1\u0109\1\u010b\1\u010c\3\64"+
+ "\1\u010d\3\64\1\111\4\64\1\u010a\5\64\1\0\1\64"+
+ "\1\u010c\3\64\1\111\5\64\1\u010d\16\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\u010e\2\64\1\0\2\64"+
+ "\1\u010f\23\64\1\0\6\64\1\u010e\3\64\1\u010f\1\64"+
+ "\1\u0110\22\64\1\0\1\64\1\u0110\30\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\26\64"+
+ "\1\u0111\1\64\1\u0112\6\64\1\0\4\64\1\u0111\5\64"+
+ "\1\u0112\17\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+ "\1\111\1\u0104\2\64\1\0\1\64\1\u0113\10\64\1\u0114"+
+ "\13\64\1\0\6\64\1\u0104\1\u0115\1\64\1\111\2\64"+
+ "\1\u0116\1\u0113\3\64\1\u0117\2\64\1\u0118\12\64\1\0"+
+ "\1\64\1\u0116\1\u0117\2\64\1\u0118\1\u0114\1\u0115\22\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+ "\1\111\24\64\1\0\15\64\1\111\21\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\2\64\1\u0119\1\u011a"+
+ "\2\64\1\0\26\64\1\0\6\64\1\u011a\2\64\1\u0119"+
+ "\7\64\1\u011b\15\64\1\0\2\64\1\u011b\27\64\1\0"+
+ "\1\64\1\0\2\64\2\0\1\u011c\1\u011d\1\u011e\1\64"+
+ "\1\u011f\1\64\1\0\6\64\1\u0120\3\64\1\u0121\13\64"+
+ "\1\0\11\64\1\u011e\4\64\1\u011c\1\u011f\3\64\1\u011d"+
+ "\1\u0122\4\64\1\u0120\5\64\1\0\5\64\1\u0122\1\u0121"+
+ "\23\64\1\0\1\64\1\0\2\64\2\0\2\64\1\111"+
+ "\2\64\1\u0123\1\0\2\64\1\u0124\23\64\1\0\10\64"+
+ "\1\u0123\1\111\1\u0124\24\64\1\0\14\64\1\111\4\64"+
+ "\3\111\1\64\2\111\3\64\1\0\1\64\1\0\2\64"+
+ "\2\0\4\64\1\u0125\1\64\1\0\1\64\1\111\4\64"+
+ "\1\u0126\3\64\1\u0127\13\64\1\0\15\64\1\111\1\64"+
+ "\1\u0125\11\64\1\u0126\5\64\1\0\6\64\1\u0127\23\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u0128\23\64\1\0\12\64\1\u0128\1\64\1\u0129\4\64"+
+ "\1\u012a\15\64\1\0\1\64\1\u0129\1\u012a\27\64\1\0"+
+ "\1\64\1\0\2\64\2\0\3\64\1\u012b\1\64\1\111"+
+ "\1\0\1\64\1\111\1\u012c\16\64\1\u012d\4\64\1\0"+
+ "\6\64\1\u012b\1\64\1\111\1\64\1\u012c\1\u012d\1\u012e"+
+ "\1\111\6\64\1\111\12\64\1\0\1\64\1\u012e\3\64"+
+ "\1\111\24\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\2\64\1\u012f\7\64\1\u0130\13\64\1\0\12\64"+
+ "\1\u012f\1\64\1\u0131\22\64\1\0\1\64\1\u0131\4\64"+
+ "\1\u0130\23\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\2\64\1\u0132\3\64\1\u0133\17\64\1\0\12\64"+
+ "\1\u0132\16\64\1\u0133\5\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\u0134\2\64\1\0\26\64"+
+ "\1\0\6\64\1\u0134\5\64\1\u0135\22\64\1\0\1\64"+
+ "\1\u0135\26\64\3\112\1\0\3\112\1\0\127\112\52\0"+
+ "\1\u0136\64\0\3\115\1\0\102\115\1\0\30\115\17\0"+
+ "\1\u0137\117\0\7\126\1\0\127\126\106\130\1\0\30\130"+
+ "\1\131\10\0\6\131\1\0\11\131\1\0\1\131\1\0"+
+ "\3\131\1\0\2\131\13\0\25\131\2\0\1\131\2\0"+
+ "\17\131\1\0\10\131\3\0\1\u0138\4\0\1\u0139\35\0"+
+ "\1\62\3\0\1\u013a\71\0\1\62\40\0\1\62\70\0"+
+ "\10\u013b\1\u013c\24\u013b\1\u013d\1\u013b\1\u013e\6\u013b\1\u013f"+
+ "\70\u013b\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0141\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\17\0"+
+ "\1\u0142\26\0\1\62\70\0\1\u0143\10\0\6\u0143\1\0"+
+ "\1\u0143\1\u0144\1\u0145\1\u0143\2\143\1\u0143\1\143\1\u0143"+
+ "\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u0146\1\0"+
+ "\1\u0147\11\0\4\u0143\1\u0145\1\u0146\1\u0143\1\u0144\6\u0143"+
+ "\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143\1\u0146\6\u0143"+
+ "\1\143\2\u0143\1\0\1\u0143\3\143\1\u0143\3\143\1\u0143"+
+ "\10\0\6\u0143\1\0\1\u0143\1\u0144\1\u0145\1\u0143\1\u0148"+
+ "\1\u0149\1\u0143\1\u0149\1\u0143\1\0\1\u0143\1\0\3\u0143"+
+ "\1\0\1\u014a\1\u0146\1\0\1\u0147\11\0\4\u0143\1\u0145"+
+ "\1\u0146\1\u0143\1\u0144\6\u0143\1\u0146\6\u0143\2\0\1\u014a"+
+ "\2\0\5\u0143\1\u0146\6\u0143\1\u0149\2\u0143\1\0\1\u0143"+
+ "\3\u0149\1\u0143\2\u0149\1\u0148\31\0\1\62\14\0\1\62"+
+ "\70\0\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u014b\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\46\0\1\62\132\0\1\62\3\0\1\62\114\0"+
+ "\2\u0147\1\0\1\u0147\73\0\1\u0147\4\0\3\u0147\1\0"+
+ "\3\u0147\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u014c\2\140\1\u014d\3\140\1\u014e\3\140\1\u014f\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0150\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0151\6\140"+
+ "\1\u0152\4\140\1\u0153\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0154\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0155\1\u0156\1\u0157\3\140\1\u0158\5\140"+
+ "\1\u0159\1\140\1\131\2\0\1\u015a\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u015b"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u015c"+
+ "\5\140\1\u015d\1\u015e\3\140\1\u015f\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u0160\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0161\6\140\1\u0162\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0163\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0164\7\140\1\u0165"+
+ "\4\140\1\u0166\4\140\1\131\2\0\1\140\2\0\1\u0167"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0168\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0169\2\140\1\u016a\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u016b\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u016c\1\140\1\u016d\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u016e\1\u016f"+
+ "\2\140\1\u0170\1\u0171\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0172\6\140\1\u0173\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u015f\4\140\1\u0174\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0175\7\140"+
+ "\1\u0176\3\140\1\u0177\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0178\11\140\1\u0179\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u017a\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\2\176\1\0\32\176\1\0"+
+ "\50\176\1\0\30\176\2\u017b\1\0\27\u017b\1\u017c\51\u017b"+
+ "\1\u017d\32\u017b\2\202\1\0\4\202\1\0\25\202\1\0"+
+ "\101\202\2\206\2\0\33\206\1\0\22\206\1\0\4\206"+
+ "\1\0\17\206\1\0\27\206\10\0\1\u017e\136\0\1\u017f"+
+ "\203\0\1\u0180\1\0\1\u0181\136\0\1\u0182\166\0\1\u0183"+
+ "\27\0\2\215\2\0\56\215\1\0\4\215\1\0\17\215"+
+ "\1\0\27\215\10\0\1\u0184\203\0\1\u0185\1\0\1\u0186"+
+ "\136\0\1\u0187\166\0\1\u0188\32\0\1\u0138\42\0\1\62"+
+ "\100\0\1\231\26\0\1\u0189\6\0\1\62\70\0\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u018a\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u018b\1\u018c\2\140"+
+ "\1\u018d\1\140\1\u018e\3\140\1\u018f\1\u0190\2\140\1\u0191"+
+ "\1\u018d\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\2\231\1\0\134\231\1\131\10\0\6\u0192\1\0"+
+ "\4\u0192\2\140\1\u0192\1\140\1\u0192\1\0\1\u0192\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\u0192\13\0\24\u0192\1\131"+
+ "\2\0\1\u0192\2\0\14\u0192\1\140\2\u0192\1\0\1\u0192"+
+ "\3\140\1\u0192\3\140\17\0\1\u0193\117\0\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0194\1\u0195\2\140"+
+ "\1\u014c\2\140\1\u0196\1\u0197\2\140\1\u0198\1\u0199\1\u019a"+
+ "\1\140\1\u019b\2\140\1\u019c\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u019d\1\u019e\2\140\1\u019f\3\140\1\u0150"+
+ "\2\140\1\u01a0\1\140\1\u01a1\3\140\1\131\2\0\1\140"+
+ "\2\0\16\140\1\u01a2\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u01a3\2\140\1\u01a4\1\u01a5\1\140"+
+ "\1\u01a6\3\140\1\u01a7\1\u01a8\1\140\1\u01a9\1\140\1\u01aa"+
+ "\1\u01ab\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u01ac\1\140\1\u01ad\1\140\1\u01ae\1\140\1\u01af\1\u01b0"+
+ "\1\140\1\u01b1\4\140\1\u01b2\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u01b3\2\140\1\u01b4\1\u01b5\1\u01b6"+
+ "\2\140\1\u01b7\1\u01b8\1\u01b9\2\140\1\u01ba\1\140\1\u01bb"+
+ "\1\u01bc\1\131\2\0\1\u01bd\2\0\16\140\1\u01be\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01bf"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01c0"+
+ "\1\u01c1\1\u01c2\1\u01c3\1\u01c4\1\u01c5\1\u015d\1\u01c6\1\u01c7"+
+ "\1\u01c8\1\140\1\u01c9\1\u01ca\1\u01cb\2\140\1\u01cc\2\140"+
+ "\1\u01cd\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01cf"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u01d0\1\u01d1\1\u01d2\3\140\1\u01d3\1\u01d4\1\u01d5\2\140"+
+ "\1\u01d6\1\u01d7\1\u01d8\4\140\1\u01d9\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u01da\1\140\1\u01ac\1\140\1\u01db\1\140"+
+ "\1\u01dc\1\140\1\u01dd\2\140\1\u01de\1\140\1\u01df\1\u01e0"+
+ "\5\140\1\131\2\0\1\140\2\0\16\140\1\u01e1\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u01e2"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01e3"+
+ "\1\140\1\u01e4\1\u01e5\1\u01e6\1\140\1\u01e7\1\u01e8\1\u01e9"+
+ "\1\u01ea\1\u01eb\1\u01ec\1\u01ed\1\u01ee\1\140\1\u01ef\1\140"+
+ "\1\u01f0\2\140\1\131\2\0\1\140\2\0\1\u01f1\16\140"+
+ "\1\0\1\u01f2\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u01f3\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u01f4\1\u01f5\1\140\1\u01f6\1\140\1\u01f7\1\u01f8"+
+ "\3\140\1\u01f9\1\u01fa\1\u01fb\1\u01fc\1\u01fd\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u01fe\1\140\1\u01ff\1\140"+
+ "\1\u0200\1\140\1\u0201\10\140\1\u0202\4\140\1\131\2\0"+
+ "\1\140\2\0\1\u0203\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0204\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0205\1\140\1\u0206"+
+ "\1\140\1\u0207\1\140\1\u0208\3\140\1\u0209\1\u020a\3\140"+
+ "\1\u020b\1\u020c\1\131\2\0\1\140\2\0\1\u020d\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u020e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u020f\2\140\1\u0210\1\140\1\u0211\1\u0212\1\u0213"+
+ "\2\140\1\u0214\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0215\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0216\1\u0217\1\u0218\1\u0219\1\u021a\2\140\1\u021b"+
+ "\1\u021c\1\140\1\u021d\1\140\1\u021e\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u021f\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0220\1\u020f\1\140\1\u0221\1\u0222"+
+ "\1\140\1\u0223\1\u0224\1\u0225\2\140\1\u0226\1\u0227\1\u0228"+
+ "\5\140\1\u0229\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u022a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u022b"+
+ "\1\140\1\u022c\1\140\1\u022d\1\140\1\u022e\1\140\1\u022f"+
+ "\1\140\1\u0230\1\u0231\1\140\1\u0232\1\u0233\1\u0234\1\140"+
+ "\1\u0235\1\140\1\u0236\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0237\2\140\1\u018d\1\u0238\3\140\1\u01af\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0239\3\140\1\u023a\1\u023b"+
+ "\1\u023c\1\140\1\u023b\1\u023d\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u023e\2\140\1\u0175\1\u023f\1\140\1\u0240"+
+ "\6\140\1\u0241\6\140\1\131\2\0\1\140\2\0\16\140"+
+ "\1\u0242\1\0\10\140\1\131\10\0\6\u0243\1\0\4\u0243"+
+ "\2\131\1\u0243\1\131\1\u0243\1\0\1\u0243\1\0\2\131"+
+ "\1\u0243\1\0\2\u0243\13\0\24\u0243\1\131\2\0\1\u0243"+
+ "\2\0\14\u0243\1\131\2\u0243\1\0\1\u0243\3\131\1\u0243"+
+ "\4\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0244\5\140"+
+ "\1\u0245\1\140\1\u0246\1\u0247\1\140\1\u015f\4\140\1\u0248"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0249"+
+ "\6\140\1\u0179\1\u024a\2\140\1\u024b\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\5\140\1\u024c\2\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u024d\3\140\1\u024e"+
+ "\2\140\1\u024f\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0250\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0251\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0252\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0253\1\140\1\u0254\2\140\1\u0255\1\140\1\u0256"+
+ "\2\140\1\u0257\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\2\267\1\0\34\267\1\0\22\267\1\0"+
+ "\4\267\1\0\17\267\1\0\27\267\10\0\1\u0258\126\0"+
+ "\2\272\1\0\4\272\1\0\25\272\2\0\100\272\2\u0259"+
+ "\1\0\134\u0259\11\0\6\u025a\1\0\4\u025a\2\0\1\u025a"+
+ "\1\0\1\u025a\1\0\1\u025a\5\0\2\u025a\13\0\24\u025a"+
+ "\3\0\1\u025a\2\0\14\u025a\1\0\2\u025a\1\0\1\u025a"+
+ "\3\0\1\u025a\3\0\2\u025b\1\0\134\u025b\10\0\1\u025c"+
+ "\165\0\1\u025d\110\0\6\307\1\0\13\307\5\0\2\307"+
+ "\1\0\1\307\11\0\24\307\3\0\1\307\2\0\17\307"+
+ "\1\0\10\307\11\0\6\u025e\1\0\4\u025e\2\0\1\u025e"+
+ "\1\0\3\u025e\4\0\3\u025e\1\0\1\u025e\11\0\24\u025e"+
+ "\3\0\1\u025e\2\0\14\u025e\1\0\2\u025e\1\0\1\u025e"+
+ "\3\0\1\u025e\56\0\1\u025f\3\0\1\u0260\1\u0261\1\u0262"+
+ "\1\u0263\1\u0264\1\u0265\2\0\1\u0266\1\u0267\1\u0268\1\u0269"+
+ "\1\u026a\3\0\1\u026b\50\0\6\u026c\1\0\4\u026c\2\0"+
+ "\1\u026c\1\0\3\u026c\4\0\3\u026c\1\0\1\u026c\11\0"+
+ "\24\u026c\3\0\1\u026c\2\0\14\u026c\1\0\2\u026c\1\0"+
+ "\1\u026c\3\0\1\u026c\14\0\6\321\1\0\13\321\5\0"+
+ "\2\321\13\0\24\321\3\0\1\321\2\0\17\321\1\0"+
+ "\10\321\11\0\6\321\1\0\4\321\2\0\1\321\1\0"+
+ "\3\321\5\0\2\321\13\0\24\321\3\0\1\321\2\0"+
+ "\14\321\1\0\2\321\1\0\1\321\3\0\1\321\13\0"+
+ "\7\332\1\0\4\332\2\0\1\332\1\0\3\332\2\0"+
+ "\1\332\1\0\1\u025d\2\332\13\0\24\332\2\0\1\340"+
+ "\1\332\2\0\14\332\1\0\2\332\1\0\1\332\3\0"+
+ "\1\332\13\0\7\332\1\0\4\332\2\0\1\332\1\0"+
+ "\3\332\2\0\1\332\2\0\2\332\13\0\24\332\2\0"+
+ "\1\340\1\332\2\0\14\332\1\0\2\332\1\0\1\332"+
+ "\3\0\1\332\27\0\2\333\1\0\1\333\13\0\1\333"+
+ "\4\0\1\u026d\4\0\1\u026e\3\0\1\u026f\3\0\1\u026d"+
+ "\1\u0270\3\0\1\u0271\2\0\1\u0272\25\0\1\333\4\0"+
+ "\3\333\1\0\3\333\10\0\7\332\1\0\4\332\2\333"+
+ "\1\332\1\333\3\332\2\0\1\332\2\0\2\332\13\0"+
+ "\24\332\2\0\1\340\1\332\2\0\14\332\1\333\2\332"+
+ "\1\0\1\332\3\333\1\332\3\333\12\0\1\u0273\7\0"+
+ "\1\u0273\1\0\4\u0273\11\0\1\u0273\17\0\3\u0273\6\0"+
+ "\2\u0273\4\0\1\u0273\7\0\1\u0273\3\0\1\u0273\6\0"+
+ "\1\u0273\4\0\3\u0273\1\0\3\u0273\55\0\1\u0274\71\0"+
+ "\1\u0275\137\0\6\u0276\1\0\10\u0276\2\0\1\u0276\5\0"+
+ "\2\u0276\13\0\24\u0276\3\0\1\u0276\2\0\17\u0276\1\0"+
+ "\10\u0276\11\0\1\351\1\u0277\3\351\1\u0278\1\0\10\351"+
+ "\2\0\1\351\5\0\2\351\13\0\2\351\1\u0278\12\351"+
+ "\1\u0277\6\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+ "\11\0\6\351\1\0\10\351\2\0\1\351\5\0\2\351"+
+ "\13\0\24\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+ "\31\0\1\u0279\173\0\1\u027a\67\0\1\u027b\203\0\1\u027c"+
+ "\140\0\1\u027d\127\0\1\u027e\166\0\1\u027f\27\0\2\54"+
+ "\1\0\1\54\1\0\2\54\2\0\6\54\1\0\26\54"+
+ "\1\0\17\54\1\u0280\17\54\1\0\30\54\2\64\1\0"+
+ "\1\64\1\0\2\64\2\0\2\64\1\u0281\3\64\1\0"+
+ "\26\64\1\0\11\64\1\u0281\25\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\6\64\1\0\26\64\1\0"+
+ "\14\64\1\u0282\22\64\1\0\1\64\1\u0282\30\64\1\0"+
+ "\1\64\1\0\2\64\2\0\2\64\1\u0283\3\64\1\0"+
+ "\1\377\25\64\1\0\11\64\1\u0283\13\64\1\377\11\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\1\64"+
+ "\1\u0284\1\u0285\3\64\1\0\1\64\1\u0286\24\64\1\0"+
+ "\11\64\1\u0285\3\64\1\u0286\5\64\1\u0284\13\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\4\64\1\111"+
+ "\1\64\1\0\6\64\1\111\17\64\1\0\17\64\1\111"+
+ "\11\64\1\111\5\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\26\64\1\u0287"+
+ "\10\64\1\0\4\64\1\u0287\25\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\12\64\1\u0288\13\64\1\0"+
+ "\37\64\1\0\6\64\1\u0288\23\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0289"+
+ "\22\64\1\0\1\64\1\u0289\30\64\1\0\1\64\1\0"+
+ "\2\64\2\0\5\64\1\u028a\1\0\26\64\1\0\10\64"+
+ "\1\u028a\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\22\64\1\u028b\14\64"+
+ "\1\0\3\64\1\u028b\26\64\1\0\1\64\1\0\2\64"+
+ "\2\0\4\64\1\u0284\1\64\1\0\26\64\1\0\17\64"+
+ "\1\u0284\2\64\1\u028c\14\64\1\0\3\64\1\u028c\26\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+ "\1\u028d\24\64\1\0\15\64\1\u028d\6\64\1\u028a\1\64"+
+ "\1\u028e\10\64\1\0\4\64\1\u028e\1\u028a\24\64\1\0"+
+ "\1\64\1\0\2\64\2\0\6\64\1\0\1\64\1\u028a"+
+ "\24\64\1\0\15\64\1\u028a\21\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\3\64\1\u028f\2\64\1\0"+
+ "\26\64\1\0\6\64\1\u028f\30\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\6\64\1\0\26\64\1\0"+
+ "\14\64\1\u0290\22\64\1\0\1\64\1\u0290\30\64\1\0"+
+ "\1\64\1\0\2\64\2\0\2\64\1\u0291\3\64\1\0"+
+ "\26\64\1\0\11\64\1\u0291\25\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\1\111\3\64\1\u0292\1\64"+
+ "\1\0\26\64\1\0\16\64\1\111\1\u0292\17\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\7\64\1\111\27\64\1\0\7\64\1\111"+
+ "\22\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\2\64\1\111\23\64\1\0\12\64\1\111\6\64\1\u0293"+
+ "\15\64\1\0\2\64\1\u0293\27\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0294"+
+ "\22\64\1\0\1\64\1\u0294\30\64\1\0\1\64\1\0"+
+ "\2\64\2\0\2\64\1\u0295\3\64\1\0\26\64\1\0"+
+ "\11\64\1\u0295\25\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\5\64\1\377\1\0\26\64\1\0\10\64"+
+ "\1\377\15\64\1\u028a\10\64\1\0\4\64\1\u028a\25\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\20\64"+
+ "\1\u0296\5\64\1\0\35\64\1\u0296\1\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\21\64\1\u0117\15\64\1\0\2\64\1\u0117\27\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\21\64\1\u0297\15\64\1\0\2\64\1\u0297\27\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\6\64"+
+ "\1\377\17\64\1\0\31\64\1\377\5\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u0298\23\64\1\0\12\64\1\u0298\24\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\22\64\1\u0299\14\64\1\0\3\64\1\u0299\26\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\7\64\1\u029a\27\64\1\0\7\64\1\u029a\22\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\u029b"+
+ "\5\64\1\u029c\17\64\1\0\25\64\1\u029b\3\64\1\u029c"+
+ "\5\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\6\64\1\u029d\17\64\1\0\31\64\1\u029d"+
+ "\5\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u029e\23\64\1\0\12\64\1\u029e"+
+ "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\3\64\1\u029f\2\64\1\0\26\64\1\0\6\64\1\u029f"+
+ "\12\64\1\u02a0\15\64\1\0\2\64\1\u02a0\27\64\1\0"+
+ "\1\64\1\0\2\64\2\0\5\64\1\u02a1\1\0\26\64"+
+ "\1\0\10\64\1\u02a1\26\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\1\u02a2\5\64\1\0\26\64\1\0"+
+ "\16\64\1\u02a2\20\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\1\u02a3\5\64\1\0\26\64\1\0\16\64"+
+ "\1\u02a3\20\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\24\64\1\u02a4\12\64"+
+ "\1\0\5\64\1\u02a4\24\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\21\64\1\111\15\64"+
+ "\1\0\2\64\1\111\27\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\14\64\1\u02a5\22\64"+
+ "\1\0\1\64\1\u02a5\30\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\2\64\1\u02a6\23\64\1\0\7\64"+
+ "\1\u02a7\2\64\1\u02a6\24\64\1\0\7\64\1\u02a7\22\64"+
+ "\1\0\1\64\1\0\2\64\2\0\2\64\1\u02a8\3\64"+
+ "\1\0\26\64\1\0\11\64\1\u02a8\7\64\1\u028b\1\u02a9"+
+ "\14\64\1\0\2\64\1\u028b\1\u02a9\26\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\u02aa\2\64\1\0\26\64"+
+ "\1\0\6\64\1\u02aa\30\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\2\64\1\u02ab\3\64\1\0\26\64"+
+ "\1\0\11\64\1\u02ab\25\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\5\64\1\u02ac\1\0\2\64\1\u02ad"+
+ "\23\64\1\0\10\64\1\u02ac\1\64\1\u02ad\24\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\4\64\1\u02ae"+
+ "\1\64\1\0\26\64\1\0\17\64\1\u02ae\17\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\6\64\1\u0135\17\64\1\0\31\64\1\u0135\5\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\24\64\1\u02af\12\64\1\0\5\64\1\u02af"+
+ "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\24\64\1\u02b0\12\64\1\0\5\64\1\u02b0"+
+ "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\26\64\1\u02b1\10\64\1\0\4\64\1\u02b1"+
+ "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\14\64\1\u02b2\22\64\1\0\1\64\1\u02b2"+
+ "\30\64\1\0\1\64\1\0\2\64\2\0\5\64\1\u02b3"+
+ "\1\0\26\64\1\0\10\64\1\u02b3\26\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\37\64\1\0\15\64\1\u0286\6\64\1\u0286\5\64"+
+ "\1\0\1\64\1\0\2\64\2\0\5\64\1\u02b4\1\0"+
+ "\26\64\1\0\10\64\1\u02b4\26\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\1\u02a9\5\64\1\0\26\64"+
+ "\1\0\16\64\1\u02a9\20\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\30\64"+
+ "\1\111\6\64\1\0\12\64\1\111\17\64\1\0\1\64"+
+ "\1\0\2\64\2\0\1\u02b5\5\64\1\0\1\64\1\u0101"+
+ "\1\u02b6\3\64\1\u0135\12\64\1\u02b7\4\64\1\0\12\64"+
+ "\1\u02b6\1\u02b7\1\64\1\u0101\1\u02b5\12\64\1\u0135\5\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+ "\1\111\3\64\1\0\26\64\1\0\11\64\1\111\2\64"+
+ "\1\u02b8\13\64\1\111\6\64\1\0\1\64\1\u02b8\10\64"+
+ "\1\111\17\64\1\0\1\64\1\0\2\64\2\0\5\64"+
+ "\1\u02b9\1\0\1\64\1\111\24\64\1\0\10\64\1\u02b9"+
+ "\4\64\1\111\21\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\111"+
+ "\14\64\1\0\3\64\1\111\26\64\1\0\1\64\1\0"+
+ "\2\64\2\0\5\64\1\u02ba\1\0\26\64\1\0\10\64"+
+ "\1\u02ba\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\5\64\1\u02bb\1\0\26\64\1\0\10\64\1\u02bb"+
+ "\11\64\1\u02bc\14\64\1\0\3\64\1\u02bc\26\64\1\0"+
+ "\1\64\1\0\2\64\2\0\6\64\1\0\1\64\1\u02bd"+
+ "\24\64\1\0\15\64\1\u02bd\21\64\1\0\32\64\1\0"+
+ "\1\64\1\0\2\64\2\0\2\64\1\u02be\1\64\1\111"+
+ "\1\64\1\0\26\64\1\0\11\64\1\u02be\5\64\1\111"+
+ "\17\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\1\u02bf\25\64\1\0\25\64\1\u02bf\11\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\26\64\1\0\24\64\1\111\12\64\1\0\5\64"+
+ "\1\111\24\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\26\64\1\0\24\64\1\u02c0\12\64\1\0\5\64"+
+ "\1\u02c0\24\64\1\0\1\64\1\0\2\64\2\0\2\64"+
+ "\1\111\3\64\1\0\26\64\1\0\11\64\1\111\25\64"+
+ "\1\0\30\64\66\0\1\u02c1\61\0\1\u02c2\53\0\1\u02c2"+
+ "\137\0\1\u02c3\50\0\10\u013b\1\u02c4\24\u013b\1\u013d\103\u013b"+
+ "\1\0\134\u013b\37\0\1\u02c5\77\0\1\131\10\0\6\131"+
+ "\1\0\11\131\1\0\1\u02c6\1\0\3\131\1\0\2\131"+
+ "\13\0\25\131\2\0\1\131\2\0\17\131\1\0\11\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u02c7\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\17\0"+
+ "\1\150\26\0\1\62\70\0\1\u0143\10\0\6\u0143\1\0"+
+ "\11\u0143\1\0\1\u0143\1\0\3\u0143\1\0\2\u0143\13\0"+
+ "\25\u0143\2\0\1\u0143\2\0\17\u0143\1\0\11\u0143\10\0"+
+ "\6\u0143\1\0\4\u0143\2\u02c8\1\u0143\1\u02c8\1\u0143\1\u02c9"+
+ "\1\u0143\1\0\3\u0143\1\0\2\u0143\1\u02c9\12\0\25\u0143"+
+ "\2\0\1\u0143\2\0\14\u0143\1\u02c8\2\u0143\1\0\1\u0143"+
+ "\3\u02c8\1\u0143\3\u02c8\1\u0143\10\0\6\u0143\1\0\2\u0143"+
+ "\1\u0145\1\u0143\2\u0147\1\u0143\1\u0147\1\u0143\1\0\1\u0143"+
+ "\1\0\3\u0143\1\0\1\u0143\1\u0146\13\0\4\u0143\1\u0145"+
+ "\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143"+
+ "\1\u0146\6\u0143\1\u0147\2\u0143\1\0\1\u0143\3\u0147\1\u0143"+
+ "\3\u0147\1\u0143\10\0\6\u0143\1\0\2\u0143\1\u0145\1\u0143"+
+ "\2\u0148\1\u0143\1\u0148\1\u0143\1\0\1\u0143\1\0\3\u0143"+
+ "\1\0\1\u0143\1\u0146\1\0\1\u0147\11\0\4\u0143\1\u0145"+
+ "\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143\2\0\5\u0143"+
+ "\1\u0146\6\u0143\1\u0148\2\u0143\1\0\1\u0143\3\u0148\1\u0143"+
+ "\3\u0148\1\u0143\10\0\6\u0143\1\0\1\u0143\1\u02ca\1\u0145"+
+ "\1\u0143\1\u0148\1\u0149\1\u0143\1\u0149\1\u0143\1\0\1\u0143"+
+ "\1\0\3\u0143\1\0\1\u0143\1\u0146\1\0\1\u0147\11\0"+
+ "\4\u0143\1\u0145\1\u0146\1\u0143\1\u02ca\6\u0143\1\u0146\6\u0143"+
+ "\2\0\1\u0143\2\0\5\u0143\1\u0146\6\u0143\1\u0149\2\u0143"+
+ "\1\0\1\u0143\3\u0149\1\u0143\2\u0149\1\u0148\1\u0143\10\0"+
+ "\1\u0143\1\u02cb\4\u0143\1\0\2\u0143\1\u02cb\1\u0143\4\u02cb"+
+ "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u02cb"+
+ "\13\0\4\u0143\3\u02cb\6\u0143\2\u02cb\4\u0143\1\u02cb\1\u0143"+
+ "\2\0\1\u0143\2\0\1\u0143\1\u02cb\3\u0143\1\u02cb\6\u0143"+
+ "\1\u02cb\2\u0143\1\0\1\u0143\3\u02cb\1\u0143\3\u02cb\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u02cc\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\1\140\1\u02cd\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\3\140\1\u02ce\13\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u02cf"+
+ "\5\140\1\u02d0\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u02d1\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u02d2\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u02d3\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u02d4\10\140\1\u014c\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u02d5\2\140\1\u02d6\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u02d7\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u02d8\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u02d9\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u02da\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u02db\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u02dc\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u02dd\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u02de\6\140\1\u02df\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u02e0\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u02e1\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u02e2\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u02e3\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u014c\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u02e4\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u02e5\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u02e6\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u02e7\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u02e8\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u02e9\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u02ea\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u02eb\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u02ec\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u02ed\12\140\1\u02ee\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u02ef\11\140\1\u02f0\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u02f1\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u014c\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u02f2\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u02f3\5\140\1\u02da\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u02f4\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u02f5\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u02f6\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u02f7\1\140"+
+ "\1\u02f8\13\140\1\u02f9\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u02fa\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01d6\6\140"+
+ "\1\u02fb\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u02fc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u02fd\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u02fe\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u02ff\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0300"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\3\140\1\u014c\13\140\1\0\10\140"+
+ "\12\0\1\u0301\7\0\1\u0301\1\0\4\u0301\11\0\1\u0301"+
+ "\17\0\3\u0301\6\0\2\u0301\4\0\1\u0301\7\0\1\u0301"+
+ "\3\0\1\u0301\6\0\1\u0301\4\0\3\u0301\1\0\3\u0301"+
+ "\12\0\1\u0302\7\0\1\u0302\1\0\4\u0302\11\0\1\u0302"+
+ "\17\0\3\u0302\6\0\2\u0302\4\0\1\u0302\7\0\1\u0302"+
+ "\3\0\1\u0302\6\0\1\u0302\4\0\3\u0302\1\0\3\u0302"+
+ "\11\0\1\u0303\53\0\1\u0303\135\0\1\u0304\140\0\1\u0305"+
+ "\127\0\1\u0306\166\0\1\u0307\40\0\1\u0308\53\0\1\u0308"+
+ "\135\0\1\u0309\140\0\1\u030a\127\0\1\u030b\166\0\1\u030c"+
+ "\27\0\1\131\10\0\1\140\1\u030d\4\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\1\140"+
+ "\1\u030e\13\0\1\140\1\u030f\1\u0310\12\140\1\u0311\6\140"+
+ "\1\131\2\0\1\140\2\0\3\140\1\u0312\1\u0313\1\u0314"+
+ "\11\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0315\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0316\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u01af\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0317\2\140\1\u0318\3\140\1\u0319\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u031a\2\140\1\u031b"+
+ "\3\140\1\u031c\1\u031d\1\u031e\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u031f\16\140\1\131\2\0\1\140"+
+ "\2\0\1\u0320\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0321\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\u0192"+
+ "\1\0\11\u0192\1\0\1\u0192\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\u0192\13\0\24\u0192\1\131\2\0\1\u0192\2\0"+
+ "\17\u0192\1\0\10\u0192\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0322\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0323\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0324\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0325\1\140\1\u0326\1\u0327\1\u0328\1\u0329"+
+ "\1\u032a\1\u032b\1\u032c\1\u032d\1\u032e\2\140\1\u032f\1\u0330"+
+ "\5\140\1\131\2\0\1\u0331\2\0\1\u0332\16\140\1\0"+
+ "\4\140\1\u0333\3\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0334\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\140\1\u0335\6\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0336\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0337\1\140\1\u0338\1\140"+
+ "\1\u0339\1\u033a\2\140\1\u033b\4\140\1\u033c\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u033d\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u033e\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u033f\2\140\1\u0340"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0341"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0342"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0343"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0344"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0345\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0346\1\u0347"+
+ "\4\140\1\u0348\1\140\1\u0349\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u034a\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u034b\1\u034c\1\u034d\1\u034e\1\u034f\1\u0329"+
+ "\2\140\1\u0350\1\u0351\1\140\1\u0352\1\140\1\u0353\1\u0354"+
+ "\5\140\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0355\13\140\1\u0356\1\140\1\u0357\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0358\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0359\16\140\1\u014c\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u02dd\10\140\1\u035a"+
+ "\3\140\1\131\2\0\1\u035b\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u035c"+
+ "\1\140\1\u035d\10\140\1\u035e\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u035f\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0360\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\21\140\1\u0361\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0362\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0363\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0364\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0365\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0366\1\u02d8\3\140\1\u0367\1\u0368"+
+ "\1\u0369\1\u036a\2\140\1\u036b\1\u036c\2\140\1\u036d\3\140"+
+ "\1\131\2\0\1\140\2\0\1\u036e\16\140\1\0\1\u036f"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0370\10\140\1\u0371\1\140\1\u0372\5\140\1\131\2\0"+
+ "\1\140\2\0\1\u0373\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0319\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0374\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0375\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0376\4\140\1\u0377"+
+ "\14\140\1\131\2\0\1\140\2\0\1\u0378\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u0379\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u037a\1\u037b\1\140\1\u037c\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u037d\4\140\1\u037e\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u037f\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0380\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u0224\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0381\3\140\1\u0382"+
+ "\7\140\1\u0383\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u02d2\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0384\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u02f1\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0385\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0386\1\140\1\u0387\1\140\1\u0388\4\140\1\u0389\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u038a\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u038b\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u038c\1\u038d"+
+ "\2\140\1\u038e\4\140\1\u038f\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0390\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0391\1\u0237\3\140\1\u01dd\1\u0392"+
+ "\1\140\1\u0393\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0394\3\140\1\u0395\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0396\10\140\1\u01b7\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0397\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0398\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0399\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u039a\1\140\1\u039b\6\140"+
+ "\1\u039c\1\140\1\u039d\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u039e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u039f\2\140\1\u03a0\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u03a1\5\140\1\u03a2\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u03a3\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0325\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u03a5\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03a6\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03a7\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u03a8\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03a9\3\140"+
+ "\1\u03aa\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u03ab\4\140\1\u01af\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u03ac\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u03ad\7\140\1\u03ae\2\140\1\u0319\1\140\1\u03af\6\140"+
+ "\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03b1\2\140"+
+ "\1\u03b2\4\140\1\u03b3\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u014c\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u03b4\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u03b5\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u03b6\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u03b7\3\140\1\u03b8\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u03b9\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u03ba\3\140\1\u03bb\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u039a\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u03bc\4\140"+
+ "\1\u03bd\4\140\1\u03be\1\u03bf\1\u03c0\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u03c1\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u03c2\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u03c3\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u03c4\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u035e\3\140\1\u03c5\3\140\1\131"+
+ "\2\0\1\140\2\0\16\140\1\u03c6\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03c7\2\140"+
+ "\1\u03c8\4\140\1\u03c9\2\140\1\u03ca\1\140\1\u03cb\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0375\6\140"+
+ "\1\u03cc\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u03cd\1\u03ce\1\u0393\2\140\1\u03cf\1\u03d0\3\140\1\u03d1"+
+ "\3\140\1\u03d2\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u03d3\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u03d4\1\140\1\u03d5\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03d6\5\140\1\u039d\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u039f\1\u03d7\2\140"+
+ "\1\u03d8\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u03d9"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u03da\1\140\1\u03db\4\140\1\u03dc\4\140\1\u03dd\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u03de\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03df\11\140"+
+ "\1\u03e0\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u03e1\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u03e2\3\140\1\u03e3\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u03e4\7\140\1\u03e5\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u03e6\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u02eb\4\140\1\u03e7\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u03df\3\140\1\u03e8"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03e9"+
+ "\20\140\1\u03ea\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u03eb\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u03ec\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u03ed\3\140"+
+ "\1\u03ee\6\140\1\u03ef\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u03f0\1\u03f1\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u03f2\1\u03f3\4\140\1\u03f4\4\140"+
+ "\1\u0393\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u03f5\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u03f6\1\u03a2\12\140\1\131\2\0\1\140\2\0\1\u0224"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u03f7\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u03a4\3\140\1\u03f8\1\u03f9\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u03fa\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u03fb\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u03fc\15\140\1\u03fd"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03fe"+
+ "\14\140\1\u03ff\1\131\2\0\1\u0400\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0401\3\140\1\u0402\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0403\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0404\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0405\1\140\1\u01dd\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0406\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0407\7\140\1\u0224"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0408"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0409"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u040a"+
+ "\1\140\1\u040b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u040c\1\140\1\u0400\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u040d\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u040e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u040f"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\4\140\1\u0410\3\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0411\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u0412\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0413\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u0414\2\0\1\u014c\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0415\15\140\1\u0416\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0417\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\140\1\u0418\6\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0419\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u041a\1\u041b\12\140\1\u041c"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u041d"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u041e"+
+ "\1\140\1\u041f\6\140\1\u0420\1\140\1\u0421\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u02dd\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u015b\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u02f3\4\140\1\u0422\1\u02da\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0423\3\140\1\u0424\1\140"+
+ "\1\u0425\4\140\1\u0426\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0427\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0428\1\u0429\1\140\1\u042a\1\u042b\1\140\1\u042c"+
+ "\4\140\1\u042d\2\140\1\u0379\1\140\1\u01cc\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u042e\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u035e\1\u042f\2\140"+
+ "\1\u0430\3\140\1\u0431\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u0432\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0433\17\140\1\u0434\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0435\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0436\1\u014c\3\140\1\u0437\2\140"+
+ "\1\u0438\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0439\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u043a\3\140\1\u043b\1\u043c\1\u043d\1\u043e\4\140\1\u043f"+
+ "\5\140\1\u0440\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0441\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0442\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0443"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0444\12\140\1\u0445\2\140\1\u0446\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u020f\6\140\1\u0447\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u020f\6\140"+
+ "\1\u01dd\3\140\1\u0448\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0449\1\u01dd\7\140\1\u044a\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u044b\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u044c\1\u044d\2\140\1\u044e"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u044f\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0450\15\140"+
+ "\1\u0451\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0452"+
+ "\1\u0453\6\140\1\u0454\13\140\1\131\2\0\1\u0224\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0455\2\140\1\u0456\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u02dd\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0457\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0458\10\140\1\u0459"+
+ "\5\140\1\u045a\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u045b\2\140\1\u045c\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u045d\17\140\1\131\2\0\1\140"+
+ "\2\0\14\140\1\u045e\2\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u045f\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0460\13\140\1\u0379"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0461\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u02dd\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0462\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0463\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0464\3\140"+
+ "\1\u0465\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0466\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0467\3\140\1\u0468\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u039f\7\140\1\u0469\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u046a\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u046b\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u046c\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u046d\1\140\1\u046e\1\u046f"+
+ "\3\140\1\u0470\1\u0471\1\140\1\u0472\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0473\1\u0474\1\u01c5\5\140"+
+ "\1\u0352\1\140\1\u0353\1\u0475\5\140\1\131\2\0\1\140"+
+ "\2\0\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\u0243"+
+ "\1\0\11\u0243\1\0\1\u0243\1\0\1\131\1\u0476\1\u0243"+
+ "\1\0\2\u0243\13\0\24\u0243\1\131\2\0\1\u0243\2\0"+
+ "\17\u0243\1\0\10\u0243\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0477\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0478\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0479\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u047a\3\140\1\u047b\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u047c\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u047d\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u047e\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u047f\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\140\1\u0480\6\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0481\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0482\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0483\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0484\6\140\1\u0485\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0486\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0487\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u0488\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u0489\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u01fb\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u048a\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u048b\13\140\1\u048c\1\140\1\u048d\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\11\0"+
+ "\6\u025a\1\0\11\u025a\1\0\1\u025a\5\0\2\u025a\13\0"+
+ "\24\u025a\3\0\1\u025a\2\0\17\u025a\1\0\10\u025a\11\0"+
+ "\1\u048e\53\0\1\u048e\62\0\6\u025e\1\0\13\u025e\5\0"+
+ "\2\u025e\1\0\1\u025e\11\0\24\u025e\3\0\1\u025e\2\0"+
+ "\17\u025e\1\0\10\u025e\62\0\1\u048f\1\u0490\14\0\1\u0491"+
+ "\121\0\1\u0492\143\0\1\u0493\137\0\1\u0494\3\0\1\u0495"+
+ "\116\0\1\u0496\12\0\1\u0497\140\0\1\u0498\121\0\1\u0499"+
+ "\5\0\1\u049a\143\0\1\u049b\137\0\1\u049c\124\0\1\u049d"+
+ "\10\0\1\u049e\135\0\1\u049f\124\0\1\u04a0\136\0\1\u04a1"+
+ "\72\0\6\u026c\1\0\13\u026c\5\0\2\u026c\1\0\1\u026c"+
+ "\11\0\24\u026c\3\0\1\u026c\2\0\17\u026c\1\0\10\u026c"+
+ "\71\0\1\u026d\142\0\1\u026d\6\0\1\u026d\111\0\1\u026d"+
+ "\12\0\1\u026d\11\0\1\u026d\127\0\1\u026d\126\0\1\u026d"+
+ "\7\0\1\u026d\136\0\1\u04a2\52\0\2\351\1\u04a3\3\351"+
+ "\1\0\10\351\2\0\1\351\5\0\2\351\13\0\3\351"+
+ "\1\u04a3\20\351\3\0\1\351\2\0\17\351\1\0\10\351"+
+ "\11\0\6\351\1\0\1\u04a4\7\351\2\0\1\351\5\0"+
+ "\2\351\13\0\17\351\1\u04a4\4\351\3\0\1\351\2\0"+
+ "\17\351\1\0\10\351\31\0\1\u04a5\174\0\1\u04a6\130\0"+
+ "\1\u027d\130\0\1\u04a7\151\0\1\u04a8\113\0\1\u04a9\73\0"+
+ "\2\54\1\0\1\54\1\0\2\54\2\0\6\54\1\0"+
+ "\26\54\1\0\20\54\1\u04aa\16\54\1\0\30\54\2\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04ab\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u04ab\30\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\1\64\1\u029b\4\64"+
+ "\1\0\26\64\1\0\22\64\1\111\1\u029b\13\64\1\0"+
+ "\3\64\1\111\26\64\1\0\1\64\1\0\2\64\2\0"+
+ "\3\64\1\u04ac\2\64\1\0\26\64\1\0\6\64\1\u04ac"+
+ "\12\64\1\u04ad\15\64\1\0\2\64\1\u04ad\27\64\1\0"+
+ "\1\64\1\0\2\64\2\0\5\64\1\u04ae\1\0\26\64"+
+ "\1\0\10\64\1\u04ae\26\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\30\64"+
+ "\1\u029b\6\64\1\0\12\64\1\u029b\17\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\u04af\23\64"+
+ "\1\0\12\64\1\u04af\24\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\4\64\1\111\1\64\1\0\26\64"+
+ "\1\0\17\64\1\111\17\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\2\64\1\u04b0\3\64\1\0\26\64"+
+ "\1\0\11\64\1\u04b0\25\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\1\64\1\u02b1\24\64"+
+ "\1\0\15\64\1\u02b1\21\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\111\23\64"+
+ "\1\0\12\64\1\111\24\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\5\64\1\u029b\1\0\26\64\1\0"+
+ "\10\64\1\u029b\26\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\30\64\1\u04b1"+
+ "\6\64\1\0\12\64\1\u04b1\17\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\7\64\1\u04b2"+
+ "\27\64\1\0\7\64\1\u04b2\22\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\26\64\1\u04b3"+
+ "\10\64\1\0\4\64\1\u04b3\25\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u04b4"+
+ "\14\64\1\0\3\64\1\u04b4\26\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\1\u029b\25\64\1\0\25\64"+
+ "\1\u029b\11\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\14\64\1\u04b5\22\64"+
+ "\1\0\1\64\1\u04b5\30\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\12\64\1\u02a9\13\64\1\0\37\64"+
+ "\1\0\6\64\1\u02a9\23\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\7\64\1\u02b0\27\64"+
+ "\1\0\7\64\1\u02b0\22\64\1\0\1\64\1\0\2\64"+
+ "\2\0\3\64\1\u04b6\2\64\1\0\26\64\1\0\6\64"+
+ "\1\u04b6\30\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\14\64\1\u02a8\22\64"+
+ "\1\0\1\64\1\u02a8\30\64\1\0\1\64\1\0\2\64"+
+ "\2\0\5\64\1\u04b7\1\0\26\64\1\0\10\64\1\u04b7"+
+ "\26\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\21\64\1\u02a9\15\64\1\0"+
+ "\2\64\1\u02a9\27\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\14\64\1\u0133\22\64\1\0"+
+ "\1\64\1\u0133\30\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\27\64\1\111\7\64\1\0"+
+ "\10\64\1\111\21\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u04b8\23\64\1\0\12\64\1\u04b8"+
+ "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u0135\23\64\1\0\12\64\1\u0135"+
+ "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u02b1\23\64\1\0\12\64\1\u02b1"+
+ "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u0133\23\64\1\0\12\64\1\u0133"+
+ "\24\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\22\64\1\u04b9\14\64\1\0"+
+ "\3\64\1\u04b9\26\64\1\0\1\64\1\0\2\64\2\0"+
+ "\1\64\1\u04ba\4\64\1\0\26\64\1\0\23\64\1\u04ba"+
+ "\13\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\5\64\1\u04bb\1\0\26\64\1\0\10\64\1\u04bb\26\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\26\64\1\0\21\64\1\u04bc\15\64\1\0\2\64"+
+ "\1\u04bc\27\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\2\64\1\u04bd\23\64\1\0\12\64\1\u04bd\24\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\1\111\25\64\1\0\25\64\1\111\11\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\26\64\1\u04be\10\64\1\0\4\64\1\u04be"+
+ "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\1\64\1\u04bf\24\64\1\0\15\64\1\u04bf\21\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\12\64\1\u04c0\13\64\1\0\37\64\1\0\6\64\1\u04c0"+
+ "\23\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\26\64\1\111\10\64\1\0\4\64\1\111"+
+ "\25\64\1\0\1\64\1\0\2\64\2\0\5\64\1\111"+
+ "\1\0\26\64\1\0\10\64\1\111\26\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\24\64\1\u028a\12\64\1\0\5\64\1\u028a\24\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\21\64\1\u04c1\15\64\1\0\2\64\1\u04c1\27\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04c2\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u04c2\30\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\14\64\1\111\22\64\1\0\1\64\1\111\30\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+ "\1\u04c3\24\64\1\0\15\64\1\u04c3\21\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0118\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u0118\30\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\2\64\1\u04c4\3\64"+
+ "\1\0\26\64\1\0\11\64\1\u04c4\25\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\24\64\1\u04c5\12\64\1\0\5\64\1\u04c5\24\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u04bb\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u04bb\1\u04b2\27\64\1\0"+
+ "\7\64\1\u04b2\22\64\1\0\1\64\1\0\2\64\2\0"+
+ "\4\64\1\u0292\1\64\1\0\26\64\1\0\17\64\1\u0292"+
+ "\17\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\1\64\1\363\4\64\1\0\26\64\1\0\23\64\1\363"+
+ "\13\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\26\64\1\u04c6\10\64\1\0"+
+ "\4\64\1\u04c6\25\64\1\0\1\64\1\0\2\64\2\0"+
+ "\2\64\1\u04c7\3\64\1\0\26\64\1\0\11\64\1\u04c7"+
+ "\25\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\1\64\1\u04c8\24\64\1\0\15\64\1\u04c8"+
+ "\21\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\14\64\1\u04c9\22\64\1\0"+
+ "\1\64\1\u04c9\30\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\14\64\1\u04ca\22\64\1\0"+
+ "\1\64\1\u04ca\30\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\2\64\1\u0135\23\64\1\0\12\64\1\u0135"+
+ "\1\64\1\111\22\64\1\0\1\64\1\111\30\64\1\0"+
+ "\1\64\1\0\2\64\2\0\6\64\1\0\12\64\1\111"+
+ "\13\64\1\0\37\64\1\0\6\64\1\111\23\64\1\0"+
+ "\1\64\1\0\2\64\2\0\5\64\1\u04cb\1\0\26\64"+
+ "\1\0\10\64\1\u04cb\26\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\27\64"+
+ "\1\111\7\64\1\0\10\64\1\111\1\u04cc\6\64\1\u04cc"+
+ "\11\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\7\64\1\u04cd\27\64\1\0\7\64\1\u04cd"+
+ "\22\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\2\64\1\u0118\23\64\1\0\12\64\1\u0118\24\64\1\0"+
+ "\30\64\67\0\1\u04ce\61\0\1\u04cf\57\0\1\u04cf\133\0"+
+ "\1\u04d0\124\0\2\u02c4\16\0\1\u02c4\51\0\1\u04d1\126\0"+
+ "\1\131\10\0\1\131\1\u04d2\4\131\1\0\2\131\1\u04d2"+
+ "\1\131\4\u04d2\1\131\1\0\1\131\1\0\3\131\1\0"+
+ "\1\131\1\u04d2\13\0\4\131\3\u04d2\6\131\2\u04d2\4\131"+
+ "\1\u04d2\1\131\2\0\1\131\2\0\1\131\1\u04d2\3\131"+
+ "\1\u04d2\6\131\1\u04d2\2\131\1\0\1\131\3\u04d2\1\131"+
+ "\3\u04d2\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u04d3"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\u0143\10\0\6\u0143\1\0\4\u0143\2\u02c8\1\u0143\1\u02c8"+
+ "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u0146"+
+ "\13\0\5\u0143\1\u0146\10\u0143\1\u0146\6\u0143\2\0\1\u0143"+
+ "\2\0\5\u0143\1\u0146\6\u0143\1\u02c8\2\u0143\1\0\1\u0143"+
+ "\3\u02c8\1\u0143\3\u02c8\24\0\2\u02c8\1\0\1\u02c8\73\0"+
+ "\1\u02c8\4\0\3\u02c8\1\0\3\u02c8\1\u0143\10\0\1\u0143"+
+ "\1\u02cb\4\u0143\1\0\1\u0143\1\u02ca\1\u02cb\1\u0143\4\u02cb"+
+ "\1\u0143\1\0\1\u0143\1\0\3\u0143\1\0\1\u0143\1\u02cb"+
+ "\13\0\4\u0143\3\u02cb\1\u02ca\5\u0143\2\u02cb\4\u0143\1\u02cb"+
+ "\1\u0143\2\0\1\u0143\2\0\1\u0143\1\u02cb\3\u0143\1\u02cb"+
+ "\6\u0143\1\u02cb\2\u0143\1\0\1\u0143\3\u02cb\1\u0143\3\u02cb"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0157"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u04d4\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04d5\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04d6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04d7\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u04d8\3\140"+
+ "\1\u04d9\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u014c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u04da\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u04db\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u014c\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u04dc\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u04dd\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u04de"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u04df\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u014c\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u01aa\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u014c\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0224\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04e0\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u04d9\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u04e1\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04e2\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u02d3\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04e3\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e4\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u04e5\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u015f\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e6\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u04e3\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u04e7\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u02f3\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u04e6\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u04e8\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e9\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u04ea\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u04eb\2\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u014c\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u04ec\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u02ff\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u02d5\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u04e5\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u04ed\5\140\1\u03b7"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u04ee"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u04ef"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u04f0\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u04f1\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u04f2\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u04f3\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u04f4\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u04e5\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u014c\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u02da\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\12\0\1\u04f5\7\0"+
+ "\1\u04f5\1\0\4\u04f5\11\0\1\u04f5\17\0\3\u04f5\6\0"+
+ "\2\u04f5\4\0\1\u04f5\7\0\1\u04f5\3\0\1\u04f5\6\0"+
+ "\1\u04f5\4\0\3\u04f5\1\0\3\u04f5\12\0\1\u04f6\7\0"+
+ "\1\u04f6\1\0\4\u04f6\11\0\1\u04f6\17\0\3\u04f6\6\0"+
+ "\2\u04f6\4\0\1\u04f6\7\0\1\u04f6\3\0\1\u04f6\6\0"+
+ "\1\u04f6\4\0\3\u04f6\1\0\3\u04f6\12\0\1\u04f7\57\0"+
+ "\1\u04f7\125\0\1\u0305\130\0\1\u04f8\151\0\1\u04f9\113\0"+
+ "\1\u04fa\105\0\1\u04fb\57\0\1\u04fb\125\0\1\u030a\130\0"+
+ "\1\u04fc\151\0\1\u04fd\113\0\1\u04fe\73\0\1\131\10\0"+
+ "\6\140\1\0\1\140\1\u04ff\7\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\3\140\1\u0500\2\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\6\140\1\u0501\10\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0502"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0503"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0237"+
+ "\4\140\1\u0504\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\140\1\u0505\15\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\2\140\1\u0506"+
+ "\6\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\3\140\1\u0507\2\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\7\140"+
+ "\1\u0508\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0509\11\140\1\u050a\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u050b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u050c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u03d4\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u03df\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u050d\2\0\17\140"+
+ "\1\0\1\u050e\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u050f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0510\12\140\1\u0511\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0512\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0511\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0513\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0514\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0393\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0515\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0516\14\140\1\u0224\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0517\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0518\2\140\1\u0519\1\u0328\1\u051a"+
+ "\1\u051b\1\u051c\1\u051d\2\140\1\u051e\1\u051f\1\u0520\1\u0521"+
+ "\4\140\1\u0522\1\131\2\0\1\140\2\0\1\u0523\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0224\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0524\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0525\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u0526\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0355\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0527\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0528\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0529\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u03b7\1\140\1\u052a"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0527"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03b0"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u052b"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u052c\12\140"+
+ "\1\u03df\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u032e\5\140\1\u02dd\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u052d\6\140\1\u052e\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u052f\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0530\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0531\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0532\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0533\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0224\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0534\15\140\1\u0159"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0535"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0224"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04d7"+
+ "\1\140\1\u0536\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0537\3\140\1\u0538\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0539\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u053a\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u053b\7\140\1\u053c\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u053d\3\140\1\u053e"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u053f"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0540"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0541\1\0\1\u0542"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0543"+
+ "\1\u0544\1\u0545\1\u0546\1\u0547\1\u0548\1\u0549\1\u054a\1\u054b"+
+ "\1\u054c\1\u054d\1\u054e\1\u054f\1\u0550\1\u0551\1\140\1\u0552"+
+ "\1\140\1\u0553\1\u0554\1\131\2\0\1\140\2\0\1\u0555"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u0556\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0557\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0558\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0559\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u052f"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u055a"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u055b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u055c"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u055d"+
+ "\17\140\1\131\2\0\1\140\2\0\16\140\1\u055e\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0237\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u055f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u01b7\1\u0560\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u039b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0561\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u03a0\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u03a2\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u03a4\3\140\1\u0562\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u055c\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0363\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u0563\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0564\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u04da\7\140\1\u0565\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0566\16\140\1\u0224"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0567"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0568"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0569"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0224"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u056b"+
+ "\6\140\1\u016c\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u037e\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u056c\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u056d\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0224\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u0329\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u056e"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u056f\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0570\1\u0571"+
+ "\5\140\1\u0572\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0573\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0574\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0575\1\140\1\u03df\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0576\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0577\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0578\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0579\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u057a\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u057b\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u057c\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0363"+
+ "\14\140\1\u0224\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+ "\1\u057d\6\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u057e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u057f\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0325\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0580\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0581\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0582\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u052c\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0583\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0584\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0363\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0585\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0586\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0587\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0588\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u0589\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u058a\4\140\1\u058b\2\140\1\u058c\5\140"+
+ "\1\u058d\5\140\1\131\2\0\1\140\2\0\1\u058e\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u058f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0590\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0591\2\140\1\u0592\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0593\1\u0594\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0595\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0596\3\140\1\u0319\4\140"+
+ "\1\u0597\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0598\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0599\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u059a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u059b\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u059c\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u02f1\7\140\1\u0224\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u059d\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u059e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u059f\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0224"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u05a0"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05a1\1\140"+
+ "\1\u0325\5\140\1\u05a2\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u05a3\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0398\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u037e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u05a4\4\140\1\u052c\1\140\1\u0393\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u03df\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0393\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u05a5\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u05a6\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u05a7\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u05a8\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u03f4\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u05a9\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u048a\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u05aa\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u037c\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\u05ab\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u052f\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u05ac\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u05ad\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u05ae\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u05af\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u05b0\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u048a\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u035e\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u05b1\3\140\1\u05b2\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u05b3\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u02dd\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u05b4\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u05b5\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05b6"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u035e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05b7\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u05b8\1\u05b9\1\u05ba\1\140\1\u05bb\4\140\1\u05bc"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u014c"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u05bd"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05be"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05bf"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u05c0"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\6\140\1\u05c1\1\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u05c2"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u05c3"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u05c4"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05c5"+
+ "\12\140\1\u0224\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05c6"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u05c7\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05c8\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u05c9"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u05ca\10\140"+
+ "\1\u05cb\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u05cc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05cd\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u05ce\1\140\1\u05cf\1\u05d0\1\u05d1\1\u055a\1\140\1\u03a2"+
+ "\1\u05d2\1\u05d3\2\140\1\u05d4\1\u05d5\4\140\1\u0159\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05d6\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u05d7\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\1\140\1\u05d8\4\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05d9\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05da\1\140"+
+ "\1\u05db\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05dc\1\0"+
+ "\1\u0527\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u05dd\1\140\1\u05de\1\u05df\1\140\1\u05e0\1\u05e1\1\u05e2"+
+ "\1\u05e3\1\u05e4\1\u05e5\1\u05e6\1\u0569\1\u05e7\1\u05e8\1\140"+
+ "\1\u05e9\2\140\1\u05ea\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u05eb\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u05ec\1\u014c\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u05ed\1\140\1\u05ee\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u05ef\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u05f0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u05c2\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0527\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u05f1\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u05f2\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u05f3\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u05f4"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u05f5\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u05f6\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u05f7\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\6\140"+
+ "\1\u045e\1\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u05f8\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u05f9\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u05fa\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u05fb\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0224\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u05fc\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u05fd\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u05fe\4\140\1\u01b2\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u05ff\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0600\4\140\1\u0601\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u032b\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u0602\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0603\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u0604\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0605\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0606\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0607\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0608\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0224\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0609\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u060a\1\u060b\1\u060c\1\u060d\1\u060e"+
+ "\1\u060f\1\u0610\1\u0611\1\u0612\1\u0613\1\u0614\1\u0615\1\u0616"+
+ "\1\u0617\1\u0618\1\140\1\u0619\1\140\1\u0553\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u061b\5\140"+
+ "\1\u04e8\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u061c\3\140\1\u061d\3\140\1\u061e\10\140\1\u061f\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e9\12\140"+
+ "\1\u0620\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u039c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0621\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u0345\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0622\3\140\1\u0623\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0624\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0625\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0557\14\140\1\u0626\4\140\1\u0553\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0627\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\1\140\1\u0628\6\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0629\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u062a\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u062b\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u062c\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u062d\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u062e\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u062f\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0630\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0631\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0632\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u0633\1\u0634\1\140"+
+ "\1\u0635\3\140\1\u0326\1\u0636\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0355\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u03df\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0637\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0638\1\u0639\1\140\1\u063a\1\u063b\1\u063c"+
+ "\1\u063d\1\140\1\u063e\1\u063f\1\140\1\u0640\1\u0641\1\u0642"+
+ "\1\u0643\1\140\1\u0644\3\140\1\131\2\0\1\140\2\0"+
+ "\1\u0645\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0646\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0647\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0648\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0649\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u064a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u064b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u064c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u064d\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u064e\2\140\1\u064f\1\u0650\1\u0651\1\140\1\u0652\1\u0653"+
+ "\1\u0654\2\140\1\u0655\1\u0656\1\u0657\4\140\1\u0658\1\131"+
+ "\2\0\1\140\2\0\1\u0659\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u065a\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u065b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u065c\1\u065d\1\u065e"+
+ "\1\140\1\u065f\1\u01c5\1\140\1\u0660\1\u0661\4\140\1\u0662"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0663"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0664"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0665\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u0666\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0667"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0668"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u01af"+
+ "\4\140\1\u0669\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u066a\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u066b\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u052c\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u066c\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u066d\1\140\1\u066e\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u05eb\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u066f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0670\3\140\1\u0671\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0672\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0673\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\5\140\1\u0674\2\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u03df\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0675\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0676\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0677\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0678\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0679\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u067a\3\140\1\u067b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u067c"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u067d"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0527"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0403"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u067e"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u067f"+
+ "\10\140\1\u0680\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0224\12\140\1\131\2\0\1\140\2\0\1\u048a"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0681\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u0224\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0682\5\140\1\u0683\3\140\1\u0684\5\140"+
+ "\1\u0685\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0593\6\140\1\u0686\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0687\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0688\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0689\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u068a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0382\12\140\1\u068b\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u068c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u068d\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u068e"+
+ "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u068f"+
+ "\5\140\1\u04ee\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u0690\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0691\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0692\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0537\3\140\1\u0693\2\140\1\u0694\1\u0695\7\140"+
+ "\1\u0256\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0696\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0697\1\140\1\u0698"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05da"+
+ "\4\140\1\u0699\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u069a\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u069b\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u069c"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u069d\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u069e\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u069f\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u020f\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u06a0\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u060a\2\140\1\u06a1\1\u06a2"+
+ "\1\u06a3\5\140\1\u0352\1\u06a4\1\u01cb\1\u06a5\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u06a6\2\140\1\u06a7"+
+ "\1\u031f\1\u0237\5\140\1\u0326\1\u039a\1\140\1\u06a8\1\u06a9"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u06aa"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06ab"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06ac"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u06ad"+
+ "\1\140\1\u06ae\4\140\1\u06af\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u06b0\3\140\1\u06b1\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u06b2\1\140\1\u06b3"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0224"+
+ "\4\140\1\u0224\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u06b4\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u06b5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u06b6\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06b7"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06b8"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06b9"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06ba"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06bb"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u06bc"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u06bd"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06be"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0364\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u06bf\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u06c0\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u06c1\1\u06c2\1\140\1\u06c3\1\u06c4"+
+ "\2\140\1\u06c5\1\u06c6\1\u06c7\1\u06c8\1\u06c9\1\140\1\u06ca"+
+ "\1\u06cb\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u06cc\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u06cd"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u06ce"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u06cf"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u039f"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u06d0\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d1"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d2\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d3\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u06d4\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u06d5\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u06d6"+
+ "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06d7"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06d8"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0325"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d9\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06da"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u0319"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u06db\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u06dc\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06dd"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u02dd\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0325"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u06de"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06df"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u055b"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\131\1\0\11\131\1\0\1\u06e0\1\0"+
+ "\3\131\1\0\2\131\13\0\25\131\2\0\1\131\2\0"+
+ "\17\131\1\0\11\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u06e1\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u06e2\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u06e3"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u06e4\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u06e5\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u06e6\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u06e7\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u06e8\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u06e9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u06ea\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u06eb\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u06ec\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u06ed"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u06ee\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u06ef\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u042f"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u06f0"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u06f1"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u06f2\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u06f3\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u06f4\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0224\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u06f5\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u06f6\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u06f7\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\16\0\1\u06f8"+
+ "\40\0\1\u06f8\134\0\1\u06f9\143\0\1\u06fa\135\0\1\u06fb"+
+ "\135\0\1\u06fc\146\0\1\u049e\131\0\1\u06fd\141\0\1\u06fe"+
+ "\130\0\1\u06ff\150\0\1\u0700\123\0\1\u0701\150\0\1\u0702"+
+ "\132\0\1\u0703\3\0\1\u0704\144\0\1\u0705\123\0\1\u0706"+
+ "\141\0\1\u0707\126\0\1\u0708\140\0\1\u0709\142\0\1\u0494"+
+ "\136\0\1\u070a\137\0\1\u070b\61\0\3\351\1\u070c\2\351"+
+ "\1\0\10\351\2\0\1\351\5\0\2\351\13\0\1\u070c"+
+ "\23\351\3\0\1\351\2\0\17\351\1\0\10\351\11\0"+
+ "\6\351\1\0\1\351\1\u070d\6\351\2\0\1\351\5\0"+
+ "\2\351\13\0\7\351\1\u070d\14\351\3\0\1\351\2\0"+
+ "\17\351\1\0\10\351\66\0\1\u070e\60\0\1\u070f\201\0"+
+ "\1\u04a7\11\0\1\u027d\56\0\2\u0710\1\0\7\u04a9\1\0"+
+ "\10\u04a9\2\u0710\1\u04a9\1\0\1\u0710\1\0\1\u04a9\1\u0710"+
+ "\2\u04a9\2\u0710\1\0\2\u0710\1\0\5\u0710\24\u04a9\3\u0710"+
+ "\1\u04a9\2\u0710\17\u04a9\1\0\10\u04a9\2\54\1\0\1\54"+
+ "\1\0\2\54\2\0\6\54\1\0\26\54\1\0\17\54"+
+ "\1\u0711\17\54\1\0\30\54\2\64\1\0\1\64\1\0"+
+ "\2\64\2\0\4\64\1\u02a9\1\64\1\0\26\64\1\0"+
+ "\17\64\1\u02a9\17\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\27\64\1\u028a"+
+ "\7\64\1\0\10\64\1\u028a\21\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u0104"+
+ "\14\64\1\0\3\64\1\u0104\26\64\1\0\1\64\1\0"+
+ "\2\64\2\0\3\64\1\u04bb\2\64\1\0\26\64\1\0"+
+ "\6\64\1\u04bb\30\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\1\64\1\u02a9\4\64\1\0\26\64\1\0"+
+ "\23\64\1\u02a9\13\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\1\64\1\u028a\4\64\1\0\26\64\1\0"+
+ "\23\64\1\u028a\13\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\14\64\1\u0712"+
+ "\22\64\1\0\1\64\1\u0712\30\64\1\0\1\64\1\0"+
+ "\2\64\2\0\2\64\1\u0713\3\64\1\0\26\64\1\0"+
+ "\11\64\1\u0713\25\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\2\64\1\u0714\23\64\1\0"+
+ "\12\64\1\u0714\1\64\1\u04b8\22\64\1\0\1\64\1\u04b8"+
+ "\30\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\24\64\1\u0715\12\64\1\0\5\64\1\u0715"+
+ "\24\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\26\64\1\u028a\10\64\1\0\4\64\1\u028a"+
+ "\25\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\22\64\1\u0716\14\64\1\0\3\64\1\u0716"+
+ "\26\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\14\64\1\u0717\22\64\1\0\1\64\1\u0717"+
+ "\30\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\26\64\1\0\22\64\1\u0133\14\64\1\0\3\64\1\u0133"+
+ "\26\64\1\0\1\64\1\0\2\64\2\0\5\64\1\u0718"+
+ "\1\0\26\64\1\0\10\64\1\u0718\26\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\27\64\1\u0719\7\64\1\0\10\64\1\u0719\21\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\21\64\1\u012d\15\64\1\0\2\64\1\u012d\27\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\12\64"+
+ "\1\u04b8\13\64\1\0\37\64\1\0\6\64\1\u04b8\23\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\21\64"+
+ "\1\u071a\4\64\1\0\13\64\1\u071a\23\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u071b\23\64\1\0\12\64\1\u071b\24\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\24\64\1\u071c\12\64\1\0\5\64\1\u071c\24\64"+
+ "\1\0\1\64\1\0\2\64\2\0\2\64\1\u028a\3\64"+
+ "\1\0\26\64\1\0\11\64\1\u028a\25\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\22\64\1\u071d\14\64\1\0\3\64\1\u071d\26\64"+
+ "\1\0\1\64\1\0\2\64\2\0\1\64\1\377\4\64"+
+ "\1\0\26\64\1\0\23\64\1\377\13\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u02a9\23\64\1\0\12\64\1\u02a9\24\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u071e\23\64\1\0\12\64\1\u071e\24\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\14\64\1\u071f\22\64\1\0\1\64\1\u071f\30\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\21\64\1\u0104\15\64\1\0\2\64\1\u0104\27\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0720\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u0720\30\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\5\64\1\u0721\1\0"+
+ "\1\64\1\u0722\24\64\1\0\7\64\1\u0723\1\u0721\4\64"+
+ "\1\u0722\21\64\1\0\7\64\1\u0723\22\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\u0724\2\64\1\0\26\64"+
+ "\1\0\6\64\1\u0724\30\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0725\13\64"+
+ "\1\0\37\64\1\0\6\64\1\u0725\23\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\u012d\23\64"+
+ "\1\0\12\64\1\u012d\24\64\1\0\30\64\66\0\1\u0726"+
+ "\63\0\1\u0727\44\0\1\u0727\144\0\1\u0728\50\0\1\131"+
+ "\10\0\1\131\1\u0729\4\131\1\0\2\131\1\u0729\1\131"+
+ "\4\u0729\1\131\1\0\1\131\1\0\3\131\1\0\1\131"+
+ "\1\u0729\13\0\4\131\3\u0729\6\131\2\u0729\4\131\1\u0729"+
+ "\1\131\2\0\1\131\2\0\1\131\1\u0729\3\131\1\u0729"+
+ "\6\131\1\u0729\2\131\1\0\1\131\3\u0729\1\131\3\u0729"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u072a"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u03a6"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\3\140\1\u0224\13\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u072b"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u072c"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u072d"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u03b7"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u072e"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\1\u072f\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u058a\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0730\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0731\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0732\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0733\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u04e5\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0734\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0735\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0736\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u04ef\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0737\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0738\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0739\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u02da\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u073a\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u073b\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u02da\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u073c\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u02fe\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0179\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u014c\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u073d\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\13\0\1\u073e\44\0\1\u073e\66\0"+
+ "\1\u073f\201\0\1\u04f8\11\0\1\u0305\56\0\2\u0740\1\0"+
+ "\7\u04fa\1\0\10\u04fa\2\u0740\1\u04fa\1\0\1\u0740\1\0"+
+ "\1\u04fa\1\u0740\2\u04fa\2\u0740\1\0\2\u0740\1\0\5\u0740"+
+ "\24\u04fa\3\u0740\1\u04fa\2\u0740\17\u04fa\1\0\10\u04fa\13\0"+
+ "\1\u0741\44\0\1\u0741\66\0\1\u0742\201\0\1\u04fc\11\0"+
+ "\1\u030a\56\0\2\u0743\1\0\7\u04fe\1\0\10\u04fe\2\u0743"+
+ "\1\u04fe\1\0\1\u0743\1\0\1\u04fe\1\u0743\2\u04fe\2\u0743"+
+ "\1\0\2\u0743\1\0\5\u0743\24\u04fe\3\u0743\1\u04fe\2\u0743"+
+ "\17\u04fe\1\0\10\u04fe\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\140\1\u0744"+
+ "\15\140\1\0\10\140\1\131\10\0\6\140\1\0\1\140"+
+ "\1\u0745\7\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\3\140\1\u0746"+
+ "\13\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0747\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0748\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0749\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\4\140\1\u074a"+
+ "\12\140\1\0\10\140\1\131\10\0\5\140\1\u074b\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\2\140\1\u074c\3\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0316"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0560\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0560\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u074d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u074e\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0449\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u074f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0325\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0750\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0751\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0393\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u014c\1\u03ce\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u06a0\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0752\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0753\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0754\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0755\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0756\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0757\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0758\6\140\1\u0759\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u075a\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0528\12\140\1\u075b\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u075c\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u075d\10\140\1\u075e\1\140\1\u075f"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0760"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0761\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u048a\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0762\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u052c\12\140\1\u0763"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0764"+
+ "\3\140\1\u0765\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0766\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u03df\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0767"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0768"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0224"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0";
+
+ private static final String ZZ_TRANS_PACKED_1 =
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0393"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0769"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u076a"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u076b"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0224"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u076c\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u076d\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0363\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u076e\4\140\1\u076f"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u075b"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0770"+
+ "\1\140\1\u0771\2\140\1\u0772\1\140\1\u056a\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0773\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0774\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0775\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u076b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0776\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u0777\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0778\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0779\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u077a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u072d\6\140\1\u077b\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u077c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u077d\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u077e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u077f\2\140\1\u0780\1\u0781\1\140\1\u0782"+
+ "\1\u0783\1\u0784\1\u0785\1\u0786\1\u0787\1\u0788\1\u0789\1\u078a"+
+ "\1\140\1\u078b\2\140\1\u078c\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u078d\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u078e\11\140\1\u078f\3\140\1\u0790\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0791\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0792\3\140\1\u0524"+
+ "\12\140\1\u01aa\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0793\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0794\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0795\4\140\1\u06dd\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0796\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0797\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0798\4\140\1\u0799\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u079a\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u079b\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u079c\1\140\1\u079d\1\140\1\u079e"+
+ "\5\140\1\u079f\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u07a0\1\u07a1\1\140\1\u07a2\4\140\1\u07a3\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u07a4\6\140"+
+ "\1\u07a5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u03df\12\140\1\131\2\0\1\140\2\0\1\u07a6\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u07a7\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0460\1\u07a8\6\140\1\u07a9\11\140\1\131\2\0"+
+ "\1\140\2\0\1\u0325\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u07aa\1\140\1\u052f"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+ "\1\140\1\u07ab\12\140\1\u07ac\4\140\1\131\2\0\1\u07ad"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u07ae\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u07af\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u07b0\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u07b1\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u07b2\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07b3"+
+ "\1\u07b4\1\140\1\u07b5\1\140\1\u0593\1\u07b6\1\u07b7\1\u07b8"+
+ "\1\u07b9\1\u07ba\1\u052c\1\u07bb\1\u07bc\1\u07bd\1\140\1\u0472"+
+ "\3\140\1\131\2\0\1\u07be\2\0\17\140\1\0\4\140"+
+ "\1\u07bf\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0460\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u07c0\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u07c1\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u07c2\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0325\15\140\1\131\2\0\1\140\2\0\1\u07c3\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0596\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u07c4\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u07c5\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u07c6"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u07c7\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0348"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u07c8"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07c9"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u07ca"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06c0"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u03df"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07cb"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07cc"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07cd"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0224"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07ce"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u07cf\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u07d0\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u048a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u07d1\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u07d2\3\140\1\u0329\1\140\1\u07d3\6\140\1\u0379"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\u07d4\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u07d5\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u07d6\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u07d7\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u07d8\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u07d9\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u07da\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u07db\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u07dc\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u07dd\2\140\1\u0449\3\140"+
+ "\1\u0352\1\140\1\u01cb\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u07bb\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u018c\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u07de\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u07df\7\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u05fe\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u031e\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u07e0\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u07e1\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u07e2\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u07e3\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u07e4\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u058a\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u07e5\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u07e6\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u07e7\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u014c\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u07e8\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u0167\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u07e9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u0179\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u014c\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07ea"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u07eb\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0695\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u07ec\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u052f\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u077b\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\6\140\1\u0224\1\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u07ed\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u07ee\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u07ef\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u07f0\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u07f1\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u07f2\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u07f3\1\u0544\1\u05de"+
+ "\3\140\1\u055a\1\140\1\u07f4\1\u07f5\1\140\1\u07f6\1\140"+
+ "\1\u055a\2\140\1\u055a\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u07f7\4\140\1\u07f8\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0565\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u07f9\1\140\1\u07fa\1\u07fb"+
+ "\1\u07fc\1\u07fd\1\u07fe\1\u07ff\1\u0800\2\140\1\u0801\1\u0802"+
+ "\1\u06a5\1\140\1\u0803\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u0804\7\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0805\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u050b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0806\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u0807\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0808\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u0809\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u01b7\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0224\4\140\1\u080a\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u080b\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u02f3\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0360\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u080c\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u080d\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u080e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u080f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0810\3\140\1\u0811\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0224\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\1\140\1\u0224\6\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0812"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0813"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0814"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0815\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0816\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0817\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0818\2\140"+
+ "\1\u0819\3\140\1\u081a\4\140\1\u081b\1\u081c\4\140\1\u081d"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u063a\10\140"+
+ "\1\u081e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u081f\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0820"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0237"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0821"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u075d"+
+ "\4\140\1\u0822\2\140\1\u02db\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0823\2\140\1\u0824\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0825\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0826\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0827\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0828\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\5\140\1\u0224\3\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0224"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0829"+
+ "\11\140\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u082a\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\1\140\1\u082b\6\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u082c\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u082d\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u082e\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u082f\1\140\1\u07c0\1\u0475"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0830"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0831"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0832"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u01b7"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07e2\2\140"+
+ "\1\u0833\4\140\1\u0834\1\u06de\12\140\1\131\2\0\1\140"+
+ "\2\0\1\u0835\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0836\1\u0837\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0224\7\140\1\u0838"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0839\3\140"+
+ "\1\u06dd\4\140\1\u083a\3\140\1\u083b\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u083c\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u052c\6\140\1\u048a\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460\10\140"+
+ "\1\u07c4\7\140\1\u083d\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u083e\6\140\1\u083f\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0840\1\140\1\u0841\1\140\1\u052c"+
+ "\1\u0237\4\140\1\u0527\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0842\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u016f\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0843\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0844\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0845\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0846\1\140\1\u0847\1\140\1\u0848\1\u0849\1\u084a\1\u084b"+
+ "\3\140\1\u0421\1\u084c\1\u084d\2\140\1\u084e\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u084f\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u01aa\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0850\5\140\1\u0851\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0852\7\140"+
+ "\1\u0853\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0854\12\140\1\u0821\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0855\3\140\1\u0856\6\140\1\u0857\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0858\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0859\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u03df\3\140\1\u07a4\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u085a\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u085b\3\140"+
+ "\1\u085c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u085d"+
+ "\3\140\1\u07aa\6\140\1\u085e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u085f\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u07af\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0860\4\140\1\u0861\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0862\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0863\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0864\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0865\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0866\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u056a\1\140\1\u0867\2\140\1\u0868"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0869"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u056a"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u086a\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u086b\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u086c\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0355\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u086d\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u086e\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u086f\1\140\1\u0870"+
+ "\2\140\1\u0871\2\140\1\u0872\4\140\1\u0873\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0874\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0694\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0875\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u0876\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0877\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0878\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0879\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u03eb\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u0877\4\140\1\131\2\0"+
+ "\1\u0877\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u087a\1\u087b\1\u087c\1\u087d"+
+ "\1\u087e\1\u087f\1\u0880\1\u0881\1\u0882\1\140\1\u0883\1\u0884"+
+ "\1\u0885\1\u0886\1\140\1\u0887\1\140\1\u0888\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0889\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u088a\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u088b\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u06dd\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u088c\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u088d\2\140\1\u088e\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u088f\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0890\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u042f\1\u0891\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0892\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0893\4\140\1\u0894"+
+ "\3\140\1\u0895\7\140\1\131\2\0\1\u0631\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0896\2\140\1\u0897\1\u0898\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u0899\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u089a\4\140\1\u089b\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u089c\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u089d\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u075b\5\140\1\u089e\4\140"+
+ "\1\u0319\1\140\1\u089f\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u06a0\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u066e\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u08a0\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u08a1\1\u08a2\3\140\1\u08a3\4\140\1\u08a4\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u08a5\16\140\1\u035c"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u08a6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u08a7\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u08a8\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u08a9\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u08aa\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u08ab\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u08ac\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u08ad"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u08ae\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u08af\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u08b0\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u08b1\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u08b2\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u035c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u08b3\6\140\1\u08b4\1\u08b5\4\140\1\u08b6\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08b7\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u08b8\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u08b9\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u08ba\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u08bb\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u08bc\1\u08bd\1\u08be\1\u08bf\1\u08c0\1\u08c1"+
+ "\1\u08c2\1\u08c3\1\u08c4\1\u08c5\1\140\1\u08c6\1\u08c7\1\u08c8"+
+ "\1\u06a5\1\140\1\u08c9\2\140\1\u08ca\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u08cb\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u08cc\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u08cd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u08ce\3\140\1\u08cf\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u08d0\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u08d1\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u07a8\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u08d2\6\140\1\u08d3"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u08d4"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u08d5"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u08d6\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u08d7\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u08d8\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u08d9\1\140"+
+ "\1\u019a\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u08da\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u08db\12\140\1\u08dc\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u08dd\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u08de\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u039a\1\140\1\u08df\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u08e0\14\140\1\u089f\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u08e1\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u08e2\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u08e3\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u03a4\1\140\1\u0224\1\u08e4"+
+ "\1\u08e5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u08e6"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u08e7\6\140\1\u08e8\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u08e9\4\140\1\u08ea\6\140\1\u0224\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u033a\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u08eb\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u08ec\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u08ed\1\140\1\u08ee\1\u08ef\1\u08f0"+
+ "\1\140\1\u08f1\1\140\1\u08f2\1\140\1\u0352\1\u08f3\1\u08f4"+
+ "\1\u033a\4\140\1\u07c3\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u08f5\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u0218\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u08f6\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0601\1\u08f7\5\140\1\u0379\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u08f8\2\140\1\u08f9\1\u0650\1\u08fa"+
+ "\1\140\1\u08fb\1\u08fc\1\u08fd\2\140\1\u08fe\1\u08ff\1\u0900"+
+ "\4\140\1\u0901\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0902\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0903\6\140\1\u0904\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0905\20\140\1\131\2\0\1\u0906\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0907\1\u0908\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0909\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u090a\1\140\1\u090b\1\140\1\u090c"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u090d"+
+ "\1\u090e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u090f"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0910\2\140\1\u090e\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0911\1\u0912\3\140\1\u0913\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0914\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0915\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0916\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0917\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0918\3\140\1\u0919\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u091a\2\140\1\u091b"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u091c"+
+ "\17\140\1\131\2\0\1\140\2\0\16\140\1\u091d\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u091e"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u091f"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0920\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0921\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0922\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0923\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0924\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0926\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0326\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0927\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0928"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0929"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u092a"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u092b"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u092c\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u092d\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u040a\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u092e\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0853\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u092f\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0930\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u0931\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\140\1\u0224\6\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0557\1\140\1\u0932\2\140\1\u0933"+
+ "\10\140\1\u0934\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0935"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0936\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0937\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0938\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0939\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u093a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+ "\1\u093b\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u093c\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+ "\1\u093d\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u093e\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u093f\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0940\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u073a"+
+ "\3\140\1\u0853\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0941\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0942\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0943\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u03df\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0944\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0945"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0946"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0947\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0948\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0949"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u094a"+
+ "\1\u0473\1\140\1\u094b\2\140\1\u094c\2\140\1\u0352\1\140"+
+ "\1\u01cb\6\140\1\131\2\0\1\140\2\0\1\u01ce\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u094d\5\140\1\u094e\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u06de\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u094f\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0950\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0951\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0952\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0953\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u08aa\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u03df\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0954\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0955\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0956\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u0957\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0958\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0959\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u095a\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u095b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u095c\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u095d\13\140\1\u095e\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u03df\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u095f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u0960\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0961"+
+ "\3\140\1\u05aa\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0962\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u08a5\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0963\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0964\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0965\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0966\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0967"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u055a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0968\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0969\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0375\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u06ae\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u096a\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u096b\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u096c\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u096d\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u096e\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u096f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u0970\1\140\1\u0971\4\140\1\u0972\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0973\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0974\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0975\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u0976\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0977\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u033a\6\140\1\u0978"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0979"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u097a\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u097b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u097c\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0363\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u097d\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u097e\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u097f\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0980\10\140"+
+ "\1\u0981\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0982"+
+ "\5\140\1\u0983\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0984\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0985\1\140\1\u0986\4\140\1\u0987\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0988\2\140\1\u0989"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u098a"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u098b\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u098c\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u098d\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u06a2\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0159\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u098e\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u098f\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0990\11\140\1\u0991\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0992\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u07f7\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0993\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0994\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0995\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0996\1\140\1\u07a8"+
+ "\4\140\1\u0997\3\140\1\u0998\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u0694\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0999\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u099a\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0569\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\2\140\1\u099b\5\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0224\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0355\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u099c\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0527\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u0224\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0325\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u099d\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\1\131"+
+ "\1\u099e\4\131\1\0\2\131\1\u099e\1\131\4\u099e\1\131"+
+ "\1\0\1\131\1\0\3\131\1\0\1\131\1\u099e\13\0"+
+ "\4\131\3\u099e\6\131\2\u099e\4\131\1\u099e\1\131\2\0"+
+ "\1\131\2\0\1\131\1\u099e\3\131\1\u099e\6\131\1\u099e"+
+ "\2\131\1\0\1\131\3\u099e\1\131\3\u099e\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u099f\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u09a0\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u09a1"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u09a2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u09a3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u09a4\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u09a5\2\140\1\u09a6\3\140\1\u09a7\1\u09a8\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u09a9\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u09aa\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u09ab\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u09ac\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u09ad\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0473\1\u09ae\6\140\1\u0352"+
+ "\1\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u09af"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u09b0\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u09b1"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u09b2\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09b3\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0806\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u09b4\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u09b5\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u09b6\3\140\1\u09b7"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+ "\1\u09b8\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u09b9\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u09ba\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\20\0\1\u09bb\53\0\1\u09bb\122\0\1\u09bc"+
+ "\135\0\1\u0705\141\0\1\u09bd\132\0\1\u09be\160\0\1\u09bf"+
+ "\115\0\1\u09c0\144\0\1\u0703\103\0\1\u09c1\161\0\1\u09c2"+
+ "\157\0\1\u0708\117\0\1\u09c3\135\0\1\u0708\141\0\1\u09c4"+
+ "\151\0\1\u09c3\73\0\1\u09c5\177\0\1\u09c6\121\0\1\u09c7"+
+ "\151\0\1\u09c8\57\0\4\351\1\u09c9\1\351\1\0\10\351"+
+ "\2\0\1\351\5\0\2\351\13\0\11\351\1\u09c9\12\351"+
+ "\3\0\1\351\2\0\17\351\1\0\10\351\11\0\6\351"+
+ "\1\0\2\351\1\u09ca\5\351\2\0\1\351\5\0\2\351"+
+ "\13\0\4\351\1\u09ca\17\351\3\0\1\351\2\0\17\351"+
+ "\1\0\10\351\10\0\1\u04a9\126\0\2\64\1\0\1\64"+
+ "\1\0\2\64\2\0\1\111\5\64\1\0\26\64\1\0"+
+ "\16\64\1\111\20\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\21\64\1\u09cb"+
+ "\15\64\1\0\2\64\1\u09cb\27\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\26\64\1\0\22\64\1\u02a9"+
+ "\14\64\1\0\3\64\1\u02a9\26\64\1\0\1\64\1\0"+
+ "\2\64\2\0\6\64\1\0\2\64\1\u09cc\23\64\1\0"+
+ "\12\64\1\u09cc\24\64\1\0\32\64\1\0\1\64\1\0"+
+ "\2\64\2\0\5\64\1\u09cd\1\0\26\64\1\0\10\64"+
+ "\1\u09cd\26\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\2\64\1\u09ce\3\64\1\0\26\64\1\0\11\64"+
+ "\1\u09ce\25\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\1\u09cf\5\64\1\0\26\64\1\0\16\64\1\u09cf"+
+ "\20\64\1\0\32\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\37\64\1\0\11\64\1\u09d0"+
+ "\6\64\1\u09d0\11\64\1\0\1\64\1\0\2\64\2\0"+
+ "\6\64\1\0\26\64\1\0\21\64\1\u0714\15\64\1\0"+
+ "\2\64\1\u0714\27\64\1\0\1\64\1\0\2\64\2\0"+
+ "\1\u04c3\5\64\1\0\26\64\1\0\16\64\1\u04c3\20\64"+
+ "\1\0\32\64\1\0\1\64\1\0\2\64\2\0\6\64"+
+ "\1\0\1\u02a8\25\64\1\0\25\64\1\u02a8\11\64\1\0"+
+ "\32\64\1\0\1\64\1\0\2\64\2\0\1\u0712\5\64"+
+ "\1\0\26\64\1\0\16\64\1\u0712\20\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\26\64"+
+ "\1\0\26\64\1\u09d1\10\64\1\0\4\64\1\u09d1\25\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\1\64"+
+ "\1\u0712\24\64\1\0\15\64\1\u0712\21\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u09d2\23\64\1\0\12\64\1\u09d2\24\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\3\64\1\u0128\2\64"+
+ "\1\0\26\64\1\0\6\64\1\u0128\30\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\2\64\1\u09d3\3\64"+
+ "\1\0\26\64\1\0\11\64\1\u09d3\25\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\1\64\1\u09d4\4\64"+
+ "\1\0\26\64\1\0\23\64\1\u09d4\13\64\1\0\32\64"+
+ "\1\0\1\64\1\0\2\64\2\0\6\64\1\0\2\64"+
+ "\1\u028a\23\64\1\0\12\64\1\u028a\24\64\1\0\30\64"+
+ "\14\0\1\u09d5\40\0\1\u09d5\61\0\1\131\10\0\1\131"+
+ "\1\u09d6\4\131\1\0\2\131\1\u09d6\1\131\4\u09d6\1\131"+
+ "\1\0\1\131\1\0\3\131\1\0\1\131\1\u09d6\13\0"+
+ "\4\131\3\u09d6\6\131\2\u09d6\4\131\1\u09d6\1\131\2\0"+
+ "\1\131\2\0\1\131\1\u09d6\3\131\1\u09d6\6\131\1\u09d6"+
+ "\2\131\1\0\1\131\3\u09d6\1\131\3\u09d6\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0384\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u09d7\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u09d8\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u09d9\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u09da\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0591\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u02d5\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u09db\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u058f\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u09dc\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u014c\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u09dd\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u09de\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\3\140\1\u0853\2\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\1\140\1\u09df\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u02da\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u09e0\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03b7\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u02e7\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u09e1\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\14\0\1\u09e2\40\0\1\u09e2"+
+ "\71\0\1\u04fa\142\0\1\u09e3\40\0\1\u09e3\71\0\1\u04fe"+
+ "\126\0\1\131\10\0\1\u09e4\5\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\2\140\1\u074c\6\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\1\140\1\u09e5\4\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u09e6"+
+ "\2\140\1\u09e7\1\140\1\u09e8\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u075d\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u09e9\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\2\140\1\u09ea\6\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\13\140"+
+ "\1\u09eb\3\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u09ec\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0903\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u09ed\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u09ee\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u09ef\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u09f0\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u07c4\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u09f1\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u09f2\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u09f3\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u09f4\2\140\1\u02cd\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u09f5\1\140\1\u09f6\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0363\4\140\1\u03a6"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u039a"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u09f7"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u09f8"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u09f9\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09fa\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09fb\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\4\140\1\u08ba\3\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u02dd\10\140"+
+ "\1\u09fc\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u09fd\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u09fe"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u09ff\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u02dd\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0a00\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0a01\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0a02\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0a03\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u07f3\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0670\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0a01\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0a04\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0a05\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0a06\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a07\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a08\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0a09\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u0a0a\6\140\1\u0a0b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0a0c"+
+ "\2\140\1\u0a0d\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0a0e\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0a0f\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0a10"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a11"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0a12\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a13"+
+ "\1\u0a14\1\u0a15\1\u0a16\1\u0a17\1\u0a18\1\u0a19\1\u0a1a\1\u0a1b"+
+ "\1\u0a1c\3\140\1\u0a1d\1\u0a1e\5\140\1\131\2\0\1\u0a1f"+
+ "\2\0\1\u08b9\16\140\1\0\1\140\1\u0628\2\140\1\u0a20"+
+ "\3\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a21"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0a22\1\u0a23\1\u0a24\1\u0a25\1\u0a26\1\u0a27\1\u0a28\1\u0a29"+
+ "\1\u09f9\1\u0a2a\1\u0352\1\u0a2b\1\u0a2c\1\u0a2d\1\140\1\u0a2e"+
+ "\2\140\1\u0a2f\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\1\u0a30\6\140\1\u0a31\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0363\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0a32\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0a33\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0487\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0a34\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0a35\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0a36\14\140\1\131\2\0\1\u0a37\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0a38\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0a39\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0a3a\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0a3b\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0a3c\1\140\1\u0a3d\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0a3e\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0a3f\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0a40\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0a41\1\140\1\u0a42\3\140\1\u0a43\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a44\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a45\1\140"+
+ "\1\u0a46\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0a47\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0a48\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0a49\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u077b\1\u0a4a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0a4b\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0a4c\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u0a4d\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0a4e\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0a4f\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0a50\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0a51\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0a52\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u06c0\1\140\1\u0a53\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0a54\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0a55\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u0a56\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\16\140\1\u0363\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0561\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0a57\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0a58\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0a59\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0a5a\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0a5b\12\140\1\u0a5c\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0a5d\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0a5e\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0a5f\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u085a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u0a60\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0224\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0a61\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0a62\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0a63\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u050e"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u07f3"+
+ "\1\u050e\7\140\1\u050e\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u052c\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0a64\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0a65\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0a62\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u033a\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u055a\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0a66\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0a67\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0a68\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0325\1\140\1\u0325\4\140\1\u07c4\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a69\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u06d9\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u03ac\1\140\1\u0a6a\1\140"+
+ "\1\u0a6b\10\140\1\u0a6c\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u0a6d\7\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0a6e\1\u0a6f\6\140\1\u0a70\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0a71\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u03eb\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0a72\3\140"+
+ "\1\u056e\4\140\1\u0527\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0a73\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u052c\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0a74\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0562\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0348\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u07f7\4\140\1\u0224\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0375\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0a75\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0a76\1\u0a77\1\140\1\u0a78\1\u0a79\1\140\1\u0a7a"+
+ "\1\u0a7b\1\u0a7c\1\u0a7d\3\140\1\u0a7e\1\u0a7f\5\140\1\131"+
+ "\2\0\1\140\2\0\1\u0a80\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a81\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a82\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u056e\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0a83\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0a84\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0a85\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0a86\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0a87\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a88\10\140\1\u089f"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0a62\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0a89\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\16\140\1\u0364\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0a8a\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a8b\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a8c\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a8d\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0a8e\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a8f\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a90\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a91\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0a92\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a0f\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0a93\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a94\2\140"+
+ "\1\u0a95\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a96"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0853\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0a97\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0557\14\140\1\u0596\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u06a1\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u07e2\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0a98\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a99\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0a9a\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0a9b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u03a1\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0a9c\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0a9d\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0a9e\1\140\1\u0a9f\1\u0aa0\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0aa1\5\140"+
+ "\1\u02d5\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0aa2\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0aa3"+
+ "\12\140\1\u0aa4\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0aa5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0826\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0aa6\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0aa7\2\140"+
+ "\1\u06a2\4\140\1\u0aa8\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0596\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u079c\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0aa9\1\u07a1\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\u07a6\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u06dd\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0aaa\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u035c\1\140\1\u0aab\11\140\1\u01b2\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0631"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u056a\7\140\1\u0aac\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0aad\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0aae\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0aaf\3\140\1\u0ab0\3\140"+
+ "\1\u0ab1\6\140\1\u0ab2\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u03df\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u080a\15\140\1\131\2\0\1\140\2\0"+
+ "\1\u0325\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0449\13\140\1\u0ab3\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u03a4\2\140\1\u0ab4\1\u03f8"+
+ "\2\140\1\u0a4c\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0ab5\2\140\1\u01b2\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0686\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0ab6\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u050d\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ab7"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0237\1\140\1\u0ab8\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u0159\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0352\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u01b7\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0ab9\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0aba\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0abb\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u056a\6\140\1\u056a\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u0abc\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u052d\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0abd\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0abe\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0abf\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\140\1\u0ac0\6\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ac1\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0ac2\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ac3\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0645\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ac4\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0ac5\2\140\1\u0ac6\1\u0ac7\3\140"+
+ "\1\u0ac8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ac9"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0aca\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0acb\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0484\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u05ba\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0acc\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0acd\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0822\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u07be\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0ace\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0acf\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ad0\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ad1\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ad2\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0ad3\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0527\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0460\1\140\1\u0ad4"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0ad5"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ad6\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0ad7"+
+ "\1\u0ad8\1\u0ad9\1\u0ada\1\u0adb\1\u046d\1\u0449\1\u0adc\1\u0add"+
+ "\2\140\1\u0ade\1\u0adf\1\u0ae0\1\140\1\u0ae1\2\140\1\u07c3"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\7\140\1\u0ae2"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0ae3"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0ae4"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0ae5"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ae6"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ae7"+
+ "\6\140\1\u0ae8\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0987\1\u0ae9\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0aea\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u052c\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0aeb\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0823\2\140\1\u07c4\1\140\1\u0aec"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0aed\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+ "\4\140\1\u0aee\11\140\1\u0224\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u083a\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u07c4\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u052c\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0aef\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0393\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0af0\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0840\11\140\1\u0527\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0af1\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u048a\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0af2\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0af3\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0af4\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0af5\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0af6\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0af7\20\140\1\131\2\0\1\u0af8"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0af9\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0afa\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0afb\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0afc\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0a43\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0afd\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0afe\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0aff\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b00\21\140\1\131\2\0\1\140\2\0"+
+ "\1\u0b01\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0b02\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u03df\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0b03\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0b04\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u0b05\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u06da\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0b06\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0b07\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u052c\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u08ae\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u07be\3\140\1\u0b08\4\140\1\u0b09"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0b0a"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\1\u048a\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b0b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0b0c\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0b0d\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u07f4\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b0e\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0b0f\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0b10\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0b11\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b12\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0b13\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0b14\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0b15\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0b16\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0224\1\140\1\u0326\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0b17\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u09f6\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b18\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b19\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b1a\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0b18\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0b1a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0b1b\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b1c"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0b1d"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u033a"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0b1e"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0b1f"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b20"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b21"+
+ "\1\u0b22\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0b23\6\140\1\u0b24\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0b25\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0b26\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0b27\1\u0b28\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0b29\4\140\1\u0b2a\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0b2b\1\140\1\u0b2c"+
+ "\5\140\1\u0b2d\2\140\1\u06da\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0b2e\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b2f\2\140\1\u0b30\3\140\1\u0b31"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b32"+
+ "\5\140\1\u0b33\2\140\1\u0b34\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b35\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0b36\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b37\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0b38\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u08ea\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0b39\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b3a\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b3b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b3c\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0b3d\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0348\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b3e\1\140\1\u0b3f\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0b40\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b41\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0b42\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0b43\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0b44\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0b45\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0b46\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0b47\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0b48\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b49\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0b4a\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0b4b\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0b4c\1\0\1\u0b4d\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0b4e\2\140\1\u0b4f\1\u0990"+
+ "\6\140\1\u0352\1\140\1\u0b50\6\140\1\131\2\0\1\140"+
+ "\2\0\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b51\4\140\1\u08ba\4\140"+
+ "\1\u0b52\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0b53\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0b54\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u03f8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u0b55\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0b56\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b57"+
+ "\12\140\1\u037c\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0b58\2\140\1\u0b59\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0b5a\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0b5b\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0b5c\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0484\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u052c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0b5d\1\u0224\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0b5e\1\140\1\u0b5f"+
+ "\4\140\1\u0b60\7\140\1\u0b61\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\1\u0b62\7\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u0224\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0363\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0b63\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0b64\1\u0b65\10\140\1\u0352\1\u0b66\1\u01cb"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07c4"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0b67\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b68\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0b69\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0b6a"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0b6b"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0b6c"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0b6d"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b6e"+
+ "\3\140\1\u0b6f\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u0b70\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0b71\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0b72"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u06dc\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0695"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0b73\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0b74\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b75\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b21\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b76\6\140"+
+ "\1\u0b24\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0b77\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b78"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b79"+
+ "\1\u0b7a\12\140\1\u0b7b\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0b7c\12\140\1\u0b7d\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0b7e\1\140\1\u0b7f\1\140\1\u0b80"+
+ "\3\140\1\u0b81\2\140\1\u06da\3\140\1\u08c7\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0b82\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0b83\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0b84\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0b85\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0b86\6\140\1\u0b87\3\140"+
+ "\1\u0b88\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0b89\4\140\1\u0b8a\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b8b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0b8c\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u0b8d\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0b8e\11\140\1\u0b8f\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0b90\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0b91\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0b92\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u0b93\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b94\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u0b95\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0b96\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0b97\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u0b98\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0b99\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0b9a\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u033a\2\140\1\u0b9b\4\140\1\u0b9c\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b9d\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0b9e\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0413\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b9f\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0ba0\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0ba1\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0ba2\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0ba3\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\4\140\1\u0ba4\3\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0924"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0ba5\5\140\1\u0ba6\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0ba7\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0ba8\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0ba9\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0baa\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u050e\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0bab\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0bac\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0bad\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0bae\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0baf\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0bb0\20\140\1\131\2\0\1\u0631\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0bb1\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0bb2\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0a06\1\u090e\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0bb3\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u03a4\3\140\1\u0bb4\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0bb5\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u07c4\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0bb6\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0bb7\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0903\6\140\1\u0baf\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0bb8\2\140\1\u0bb9\1\u0bba"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0bbb"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bbc"+
+ "\1\140\1\u0bbd\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0bbe\6\140\1\u089f\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0bbf\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0bc0\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0911\1\u03a4\3\140\1\u0bc1\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc2\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0bc3\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0bc4\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0bc5\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0377\14\140\1\131"+
+ "\2\0\1\140\2\0\1\u0378\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07be\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bc7\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bc8\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0bc9\4\140"+
+ "\1\u0bca\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0bcb\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0bcc\1\u0bcd\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u0bce\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u037c\4\140\1\u0bcf\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0bd0\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0bd1\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0bd2"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0bd3\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0bd4\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0bd5\10\140\1\u0bd6\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0bd7\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0bd8\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0bd9\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0bda\1\u0bdb\1\u0bdc\1\u0bdd\1\u0bde"+
+ "\1\u0bdf\1\u0be0\1\u0be1\1\u0be2\2\140\1\u0be3\1\u0be4\1\u0be5"+
+ "\4\140\1\u0be6\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0be7"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u06de"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0be8"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0be9"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bea"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0beb"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0bec"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0bed"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0bee"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0319"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0bef"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0bf0"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0bf1\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0bf2\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0976\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u074d\4\140"+
+ "\1\u0bf3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0569\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0bf4\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u09d7\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0bf5\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0bf6\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0bf7\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de\11\140"+
+ "\1\u0569\5\140\1\u082d\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0af2\1\u0bf8\2\140\1\u0bf9\3\140\1\u0bfa\4\140"+
+ "\1\u0bfb\2\140\1\u0bfc\1\140\1\u0553\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0bfd\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0bfe\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0bff\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0c00\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0c01\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0c02\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0c03\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0c04\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c05"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u0c06\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0601\6\140\1\u0379\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u07f3\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0596\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0c07\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0c08\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u03a2\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u048a\12\140\1\u0aac\2\140"+
+ "\1\u0c09\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0c0a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0c0b\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c0c\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0853"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0c0d"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c0e"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0af2\1\140"+
+ "\1\u0c0f\1\u0c10\2\140\1\u0c11\1\u0c12\1\u0c13\3\140\1\u08c7"+
+ "\1\u0c14\1\u0c15\3\140\1\u0c16\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0c17\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0c18\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0329\6\140\1\u0596\1\140\1\u0c19\1\140"+
+ "\1\u0c1a\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0c1b\2\140\1\u0c1c\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0c1d\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0391\11\140\1\u0c1e\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0c1f\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u039a\1\140\1\u039b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0c20\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0c21\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0c22\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0c23\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0c24\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0c25\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u02da\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0c26\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0c27\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0c28\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0350\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0c29\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0808\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0c2a\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0c2b\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0c2c\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0c2d\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0c2e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u0c2f\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0c30\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0c31\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0c32\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u0c33\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0c34\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0c35\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0c36\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0360"+
+ "\5\140\1\u0a09\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0c37\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0c38\10\140\1\u0c39\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0c3a\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0c3b\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u0c3c\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0c3d\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u0c3e\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0c3f\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0c40\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0869\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0c41\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0c42\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0c43\1\140\1\u0c44\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0c45\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0c46\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0c47\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0c48\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0";
+
+ private static final String ZZ_TRANS_PACKED_2 =
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0517"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0c49\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c4a\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0c4b\1\140\1\u0c4c"+
+ "\1\u0c4d\1\u0c4e\1\u0c4f\1\u0c50\1\u0c51\1\u0c52\1\u0809\1\140"+
+ "\1\u0352\1\u0c53\1\u0c54\1\u0c55\5\140\1\131\2\0\1\140"+
+ "\2\0\1\u0c56\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u0c57\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0c58\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0c59\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u01a0\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0c5a\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0c5b\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0c5c\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0c5d\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0c5e\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0c5f\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0c60\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0c61\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0686\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0c62\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0c63\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0c64\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0c65\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0c66\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0c67\12\140\1\u0c5c\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0c68\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0c69\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u0c6a\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u06dc\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0c6b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0c6c"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c6d"+
+ "\1\u074d\5\140\1\u0997\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0c6e\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0c6f\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0c70\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0c71\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0c72\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\3\140\1\u0508\4\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u01cc\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0836\2\140\1\u052c\1\u033a\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\1\131\1\u0c73\4\131\1\0\2\131\1\u0c73\1\131\4\u0c73"+
+ "\1\131\1\0\1\131\1\0\3\131\1\0\1\131\1\u0c73"+
+ "\13\0\4\131\3\u0c73\6\131\2\u0c73\4\131\1\u0c73\1\131"+
+ "\2\0\1\131\2\0\1\131\1\u0c73\3\131\1\u0c73\6\131"+
+ "\1\u0c73\2\131\1\0\1\131\3\u0c73\1\131\3\u0c73\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u077b\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0c74\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0c75\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0bfa\2\140\1\u0c76\1\u0c77\2\140"+
+ "\1\u0c78\1\u0c79\3\140\1\u0c7a\5\140\1\u0c7b\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0808\7\140\1\u0c7c\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0c7d\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0c7e\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0c7f\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0c80\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0c81\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0c82\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0c83\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0c84\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0c85\1\140\1\u0c86"+
+ "\1\u0c87\4\140\1\u0c88\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0c89\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0c8a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u08b4\12\140\1\u0553\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0c8b\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0c8c\1\140\1\u0c8d\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0c77\1\140\1\u09ed"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u050d"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0c8e"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u061d"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c8f"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c90"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0c91\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0c92"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0c93"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0c94"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\21\0\1\u0c95\42\0\1\u0c95\137\0\1\u0c96\141\0\1\u0c97"+
+ "\127\0\1\u049e\141\0\1\u0c98\146\0\1\u0708\127\0\1\u0708"+
+ "\150\0\1\u0c99\70\0\1\u0c9a\165\0\1\u0708\142\0\1\u0c9b"+
+ "\3\0\1\u0c9c\1\0\1\u0c9d\142\0\1\u0c98\117\0\1\u0c98"+
+ "\137\0\1\u0c9e\67\0\5\351\1\u0c9f\1\0\10\351\2\0"+
+ "\1\351\5\0\2\351\13\0\2\351\1\u0c9f\21\351\3\0"+
+ "\1\351\2\0\17\351\1\0\10\351\2\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0287\13\64"+
+ "\1\0\37\64\1\0\6\64\1\u0287\23\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\20\64\1\111\5\64"+
+ "\1\0\35\64\1\111\1\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\u0ca0\23\64"+
+ "\1\0\12\64\1\u0ca0\24\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\u02ad\23\64"+
+ "\1\0\12\64\1\u02ad\24\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\21\64"+
+ "\1\371\15\64\1\0\2\64\1\371\27\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\12\64\1\u0ca1\13\64"+
+ "\1\0\37\64\1\0\6\64\1\u0ca1\23\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\2\64\1\u0712\23\64"+
+ "\1\0\12\64\1\u0712\24\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\26\64"+
+ "\1\u0ca2\10\64\1\0\4\64\1\u0ca2\25\64\1\0\1\64"+
+ "\1\0\2\64\2\0\3\64\1\u0133\2\64\1\0\26\64"+
+ "\1\0\6\64\1\u0133\30\64\1\0\32\64\1\0\1\64"+
+ "\1\0\2\64\2\0\6\64\1\0\26\64\1\0\21\64"+
+ "\1\u02b1\15\64\1\0\2\64\1\u02b1\25\64\15\0\1\u0ca3"+
+ "\50\0\1\u0ca3\50\0\1\131\10\0\1\131\1\140\4\131"+
+ "\1\0\2\131\1\140\1\131\4\140\1\131\1\0\1\131"+
+ "\1\0\3\131\1\0\1\131\1\140\13\0\4\131\3\140"+
+ "\6\131\2\140\4\131\1\140\1\131\2\0\1\131\2\0"+
+ "\1\131\1\140\3\131\1\140\6\131\1\140\2\131\1\0"+
+ "\1\131\3\140\1\131\3\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0ca4\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u02d7\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ca5\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ca6\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0ca7\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u03b7\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0ca8\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0ca9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0759\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u02da\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u04e5\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\15\0\1\u0caa\50\0\1\u0caa\65\0\1\u0cab"+
+ "\50\0\1\u0cab\50\0\1\131\10\0\1\u074c\5\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\5\140\1\u0cac\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u0cad\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0796"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cae\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0caf\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\1\u0cb0\5\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\2\140\1\u0cb1\14\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u014c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0905\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\4\140\1\u0325\3\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0cb2\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u07f3\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0cb3\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0cb4\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0cb5\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0cb6\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0224\6\140\1\u0a01\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0cb7\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u042f\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0cb8\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u075b\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0cb9\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0cba\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0cbb\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0a01\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0355\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0cbc\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0cbd\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u09fe\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u076c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0cbe\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0cbf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u0cc0\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u037c"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0cc1"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0cc2"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u085a"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cc3"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cc4"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0571"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0cc5"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0cc6\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0cc7\6\140\1\u0cc8\1\u0cc9\4\140\1\u0cca\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0ccb\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0ccc\6\140\1\u0ccd\7\140"+
+ "\1\u0cce\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u042f\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0ccf\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0cd0\3\140\1\u0cd1\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u01b7\5\140\1\u0cd2\7\140\1\u0cd3\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0cd4\1\u0cd5\13\140"+
+ "\1\u0cad\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0cd6\6\140\1\u0b24\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0cd7\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0cd8\1\140\1\u0cd9\10\140\1\u0cda\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u07a8\3\140\1\u0cdb"+
+ "\4\140\1\u0cdc\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0cdd\5\140\1\u0cde\4\140\1\u0cdf\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0ce0\1\140\1\u0ce1\1\140"+
+ "\1\u0ce2\10\140\1\u0224\4\140\1\131\2\0\1\u0224\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0ce3\1\140\1\u0ce4\2\140\1\u0ce5\1\u03eb"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0ce6"+
+ "\6\140\1\u0ce7\1\u0ce8\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0ce9\1\140\1\u0cea\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u056e\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u07bb\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0325\1\140\1\u0ceb\11\140\1\u0cec\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ced\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0cee\11\140\1\u0cef"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cf0"+
+ "\1\u0cf1\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0cf2\20\140\1\131\2\0\1\u0cf3\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0cf4\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0cf5\1\140\1\u0cf6\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0cf7\5\140\1\u0cf8\1\140\1\u0cf9\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0cfa\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0cfb\1\140\1\u0cfc"+
+ "\6\140\1\u0319\1\140\1\u0cfd\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0cfe\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0cff\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0d00\3\140\1\u0d01\2\140\1\u0d02\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0d03\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0d04\5\140\1\u0d05\1\140"+
+ "\1\u0d06\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0d07"+
+ "\5\140\1\u0d08\4\140\1\u0d09\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0d0a\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0686\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0d0b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0596\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0d0c\1\u0d0d\1\u0d0e\1\u0d0f\1\u0d10"+
+ "\1\u0d11\1\140\1\u0d12\1\u0d13\2\140\1\u0d14\1\u0d15\1\u0d16"+
+ "\1\140\1\u0d17\2\140\1\u0d18\1\131\2\0\1\140\2\0"+
+ "\1\u0d19\16\140\1\0\1\u061a\7\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0d1a\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0d1b\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u0d1c\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0d1d\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0d1e\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0d1f\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0d20\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0d21\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0d22\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0d23\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0d24\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\4\140\1\u0d25\3\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0a9a\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0d26\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0d27\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0d28\5\140\1\u0d29\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d2a\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0d2b\7\140"+
+ "\1\u0d2c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0d2d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0d2e\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0d2f\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0d30\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0d31\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d32\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0d33\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0527"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d34\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0d35\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d36\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0d37\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u066e\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d38\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d39\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d3a\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0d3b\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0d3c\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u0d3d\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0d3e\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0d3f\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u07c4\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0436\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u0d40\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0821\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0d41\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0d42\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0d43\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0d44\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u037e\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u01cc\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0acc\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0d45\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u03df\1\140\1\u0808\17\140\1\u0b40"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d46"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d47"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0d48"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0808"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a31"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0d49"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d4a"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0d4b"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d4c"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0378"+
+ "\12\140\1\131\2\0\1\140\2\0\1\u0d4d\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u0d4e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0a31\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u0d4f\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0d50\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0d51\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0d52\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d53\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d54\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0d55\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0d56\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0d57\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d58\1\140\1\u0d59\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0d5a\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0d5b\3\140\1\u0d5c\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0d5d\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0d5e\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0d5f\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0d60\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0d61\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0d62\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0d63\12\140\1\u0569\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u0d64\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0d65\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0d66\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u0d67\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0d68\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0b1e\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0d69\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0d6a\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0d6b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d6c"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d6d\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0d6e\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0d6f\6\140\1\u0acf\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0d70\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0d71\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0d72\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0d73\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0d74\3\140\1\u0601\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0d75\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0503\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0d76\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u07c4\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0d77\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0693\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\140\1\u0d78\6\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0d79\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0d7a\3\140\1\u0d7b\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0d7c\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0d7d\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u0d7e\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0d7f\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0d80\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0d81\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0350\4\140\1\u0582\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0d82\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0d82\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0d83\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0d84\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\u0d85\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u03df\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0d86"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0256"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0363"+
+ "\21\140\1\131\2\0\1\140\2\0\16\140\1\u0363\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0d87\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0d88\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0d89\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d8a\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0379"+
+ "\1\140\1\u01cc\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u056e\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0d8b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0d8c\1\140\1\u0d8d\1\u0d8e\4\140\1\u051e\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0d8f\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0d90\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0bd6\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0d91\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0d92\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0d93\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0d94\2\140\1\u0d95\1\140\1\u0d96\2\140\1\u0d97"+
+ "\1\u0d98\3\140\1\u0d99\1\u0d9a\1\140\1\u0d9b\1\u0d9c\1\u0d9d"+
+ "\1\140\1\131\2\0\1\140\2\0\1\u0d9e\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d9f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0da0\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0da1"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0da2\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0da3\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0acf"+
+ "\1\u0da4\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0da5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0da6\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0da7\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0da8\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0528"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0da9\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0daa\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dab\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dac\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0571\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0dad\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0dae\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0daf\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0db0\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u05c6\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0db1\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0db2\2\140\1\u0db3"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0db4"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0db5"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0db6"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0db7"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\2\140\1\u0db8\5\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0db9"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0dba"+
+ "\20\140\1\131\2\0\1\u0dbb\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0dbc\2\140"+
+ "\1\u0dbd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0dbe\1\140\1\u0dbf\1\140\1\u0dc0\4\140\1\u0319\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0dc1\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dc2\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\3\140"+
+ "\1\u0dc3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u08a5\7\140\1\u0dc4\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0dc5\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\7\140\1\u0dc6\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0dc7\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0dc8"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0dc9\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0dca\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u0dcb\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0dcc"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0dcd"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u03d9\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0dce\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0dcf\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0823\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0dd0\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0dd1\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0dd2\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dd3\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u083f\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dd4\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0686\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0dd5\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u06a0\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0dd6\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0dd7\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0dd8\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0dd9\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0dda\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ddb\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0ddc\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0ddd\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0453\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0dde\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0b05\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u033a\3\140\1\u0224"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0ddf"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0a9a"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0de0"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0de1"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0de2"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u09f9"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0de3"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0de4"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0de5"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0de6"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0de7"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u0de8"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0752"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0de9\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08ee\1\u0dea"+
+ "\1\u0deb\1\u0610\1\140\1\u0dec\3\140\1\u0ded\1\u0dee\1\u0def"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0df0\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0df1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0df2\10\140\1\u0df3\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\1\u0df4\7\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0cc0"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0df5"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u07fb"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0d27"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0df6"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0df7"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0473"+
+ "\4\140\1\u07f4\2\140\1\u0352\1\140\1\u01cb\1\u06a5\5\140"+
+ "\1\131\2\0\1\140\2\0\1\u01ce\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0df8\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0df9\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0dfa\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u050e\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0dfb\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0dfc\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0dfd"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0dfe\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0348\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0dff\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0e00\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0e01\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0e02\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0e03\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0e04\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e05\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0e06\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e07\4\140\1\u0e08\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0e09\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0e0a\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0e0b\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0e0c\1\u0e0d\1\u0e0e\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0e0f\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e10\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0e11\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u0e12\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0e13\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0e14\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0e15\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0e16\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0e17\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0e18\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0e19\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0891\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0e1a\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0319\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0e1b\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0e1c\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0363\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0e1d\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0e1e\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e1f\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0e20\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0e21\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0e22\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0e23\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0e24\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0e25\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0b4d\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0b4e\1\140\1\u034d\1\u0e26\1\u0990\3\140\1\u0350\2\140"+
+ "\1\u0352\1\140\1\u0b50\6\140\1\131\2\0\1\140\2\0"+
+ "\1\u01ce\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u03e5\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0c6a\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0e27\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0e28\3\140\1\u03a4\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0e29\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0e2a\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0869\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0e2b\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0e2c\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0e2d\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\1\140"+
+ "\1\u0e2e\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0e2f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0e30\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u0e31\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e32\5\140\1\u0b40\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0e33\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u052f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e34\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0e35\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u03d4\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0e36\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0987\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e37\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0e38\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e39"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e3a\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0e3b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0b42\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0af2\10\140\1\u0e3c\3\140"+
+ "\1\u0e3d\4\140\1\u0553\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u07f3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0e3e\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0e3f\7\140\1\u0836\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0e40\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0e41\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0e42\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0e43\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0e44\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0e45\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0e46\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0e47\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u035c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0e48\1\u0e49\1\u0e4a\1\140\1\u0e4b\3\140\1\u0e4c"+
+ "\4\140\1\u0e4d\2\140\1\u0e4e\1\u0e4f\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0e50\2\140\1\u07fb\1\u0e51"+
+ "\1\u0e52\1\140\1\u0e53\13\140\1\131\2\0\1\140\2\0"+
+ "\1\u0e54\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0e55\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0e56\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0cc2\4\140\1\u03df\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0e57\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0e58\4\140\1\u0e59\4\140"+
+ "\1\u0e5a\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0e5b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u0e5c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u0e5d\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e5e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0e5f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0e60\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0e61\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u0363\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0e62\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0e63\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0e64\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\1\u0224\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0b8a"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0e65"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0527\12\140"+
+ "\1\u0e66\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e67\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+ "\1\u0e68\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u0e5e\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0e69\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0e6a\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e6b"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0e6c\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0e6d\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0381\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0e6e\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0e6f\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0e70\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0e71\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0e72\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0e73\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0e74\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0e75\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0511\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0e76\10\140\1\u0e77\1\u0d86\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0e78\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0e79\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0326\1\u0e7a"+
+ "\2\140\1\u0e7b\1\140\1\u0e7c\1\u0e7d\1\140\1\u0e7e\1\140"+
+ "\1\u0e7f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0e80\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0924\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0e81\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0e82\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0bf1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0e83\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0e84\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u0e85\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e86\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e87\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u042f\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0e88\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e89"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u0e8a\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0e8b\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0e8c\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0e8d\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0e8e\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0377\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0e8f\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0e90\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0bc9\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0e91\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0e92\10\140\1\u0e93"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0e94\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a"+
+ "\2\140\1\u06a2\3\140\1\u056a\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0e95\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0e96\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0e97\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0e98\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0e99\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u0e9a\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0e9b\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0e9c\1\u0e9d\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u037c\4\140\1\u0e9e\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0e9f\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u0ea0\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0629\3\140\1\u0bd6\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0ea1\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ea2\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ea3\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0ea4\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0ea5\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0ea6\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0ea7\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0ea8\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0ea9\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0eaa\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u0eab\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u0eac\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0ead\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0eae\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0571\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0eaf\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0eb0\1\u0eb1\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0eb2\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0eb3\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0eb4\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0eb5\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0686\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0eb6\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0eb7\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0eb8\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0eb9\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0eba\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0ebb\6\140\1\u0baf\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08db\20\140"+
+ "\1\131\2\0\1\u0ebc\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0ebd\2\140\1\u0dbd"+
+ "\1\u0ebe\6\140\1\u0ebf\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u01cf\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0ec0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0ec1\1\140\1\u0ec2\4\140\1\u0ec3\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0ec4\11\140\1\u089f\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0bbf\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0ec5\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0ec6\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0ec7\3\140"+
+ "\1\u0ec8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0ec9\4\140\1\u0224\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0eca\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0ecb\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0ecc\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0ecd\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ece"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0ecf\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u091d\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ed0\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ed1"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u048a"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0ed2"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0ed3\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u07c4\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0ed4\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u018d\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0345\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0ed5\16\140\1\u0ed6\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0ed7\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0ed8\1\140"+
+ "\1\u0ed9\1\u0eda\1\140\1\u0edb\1\140\1\u0edc\1\u0edd\1\u0ede"+
+ "\1\140\1\u0edf\1\140\1\u0553\1\u0ee0\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ee1\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0ee2\20\140\1\131\2\0\1\u0631"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ee3\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03a4\3\140\1\u0ee4\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0ee5\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0ee6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0ee7\1\140\1\u0ee8\1\140"+
+ "\1\u0ee9\2\140\1\u0eea\3\140\1\u0eeb\1\u0eec\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0eed\11\140\1\u0eee"+
+ "\1\140\1\u0eef\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u09ee"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0ef0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u0ef1\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0ef2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0ef3\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0ef4"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0ef5\3\140"+
+ "\1\u06a2\4\140\1\u0ef6\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0ef7\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0b60\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0788\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u052f\5\140\1\u0ef8\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0ef9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0efa\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u0efb\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0efc\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0efd\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0efe\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0eff\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0a62\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u0325\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0f00\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0cfb\3\140\1\u0355\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0f01\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u08a5\6\140\1\u0cdd\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u050e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0ad6\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f02\6\140"+
+ "\1\u0f03\5\140\1\u07c3\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\u061a\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0f04\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0f05\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u056e\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0f06\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0f07\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0dac\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0f08\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0f09\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u05fe\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0f0a\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0f0b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0224\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0f0c\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0da4\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0821\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0f0d\11\140\1\u0f0e\1\131\2\0"+
+ "\1\140\2\0\16\140\1\u0f0f\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0f10\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0f11\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0f12\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0f13\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0f14\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0f15\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0f16\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0f17\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0f18\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0891\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0561\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0c33\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0f19\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0f1a"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0503\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u033a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0f1b\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0f1c\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0f1d\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0f1e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0f1f\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0f20\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u0cdd\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u0f21"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u0f22\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\u0f23\7\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0f24"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0f25"+
+ "\2\140\1\u0f26\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0c41\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0f24\11\140\1\u0325\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0f27\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0f28\13\140\1\u0582\3\140\1\u0f29"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f2a"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0f2b"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0877"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0f2c\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f2d\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0f2e\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0f2f\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u0f30\1\140\1\131"+
+ "\2\0\1\u0cf3\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0f31\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0f32\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0f33\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0f34\11\140\1\u0f35\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f36\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f37\3\140"+
+ "\1\u03a4\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0f38\1\140\1\u0f39\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0f3a\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0f3b\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u0f3c\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0f3d\1\u0f3e\1\u0f3f\1\u0f40\1\u0f41\1\u0f42\1\u0610"+
+ "\1\u0f43\1\u0f44\1\u0f45\2\140\1\u0f46\1\u0f47\1\u0f48\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f49"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f4a"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0f4b"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0f4c"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0f4d"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0f4e"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f4f"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0f50\1\140"+
+ "\1\u0f51\1\u0839\3\140\1\u03a2\1\140\1\u083a\3\140\1\u0aac"+
+ "\6\140\1\131\2\0\1\140\2\0\1\u0555\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u0f52\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u0f53\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0f54\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0f55\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0f56\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u0f57\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0f58\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0f59\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0f5a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u01af\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0f5b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0f5c"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f5d"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\u035b\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u07c9\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0f5e\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0f5f\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0f60\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\1\131\1\u0f61\4\131\1\0\2\131\1\u0f61\1\131\4\u0f61"+
+ "\1\131\1\0\1\131\1\0\3\131\1\0\1\131\1\u0f61"+
+ "\13\0\4\131\3\u0f61\6\131\2\u0f61\4\131\1\u0f61\1\131"+
+ "\2\0\1\131\2\0\1\131\1\u0f61\3\131\1\u0f61\6\131"+
+ "\1\u0f61\2\131\1\0\1\131\3\u0f61\1\131\3\u0f61\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u056a\1\140"+
+ "\1\u0f62\3\140\1\u0449\1\u0f63\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0f64\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0ee2\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0f65\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0f66\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0f67\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0e28\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0f68\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0f69\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0f6a\7\140\1\u0c7c\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0f6b\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0f6c\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0f6d\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0f6e\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0f6f\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0f70\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0527\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0f71\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0f72\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0f73\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0f74\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0f75\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0f76\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0f77\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0f78\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0f79\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0f7a\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0f7b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0f7c\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0f7d\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\u0f7e\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u0f7f\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u035c\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\22\0\1\u0f80\36\0\1\u0f80\134\0\1\u0f81"+
+ "\137\0\1\u0c99\137\0\1\u0f82\136\0\1\u0708\145\0\1\u0c9c"+
+ "\1\0\1\u0c9d\127\0\1\u06ff\135\0\1\u0f83\143\0\1\u0f84"+
+ "\126\0\1\u0f85\57\0\2\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\20\64\1\u02a9\5\64\1\0\35\64"+
+ "\1\u02a9\1\64\1\0\32\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\21\64\1\373\15\64"+
+ "\1\0\2\64\1\373\27\64\1\0\1\64\1\0\2\64"+
+ "\2\0\4\64\1\u0f86\1\64\1\0\26\64\1\0\17\64"+
+ "\1\u0f86\17\64\1\0\30\64\16\0\1\u0f87\40\0\1\u0f87"+
+ "\57\0\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u02da\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0f88\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u03b7\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u014c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0f89\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u01d6\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\16\0\1\u0f8a\40\0\1\u0f8a\75\0\1\u0f8b\40\0"+
+ "\1\u0f8b\57\0\1\131\10\0\3\140\1\u0f8c\2\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0a9a\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0f8d\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0f8e\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\4\140\1\u0f8f\1\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\5\140\1\u074c\11\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0f90\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0f91\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f92"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f93"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u085a"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0f94\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0f95\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0f96\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u052c\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0f97\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u0f98\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0a01\1\140\1\u09fe\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0f99\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0f9a\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0325\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0f9b\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0f9c\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0f9d\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0f9e\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0527\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u0cca\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0f9f\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0fa0\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0f79\4\140\1\u0fa1\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0fa2\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0fa3\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0936\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0fa4\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0fa5\1\140\1\u0936"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0fa6\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0fa7\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0fa8\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0fa9\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0faa\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0cd9\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0fab\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0fac\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0fad\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0fae\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0326\20\140\1\u0faf\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0fb0\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0fb1\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0fb2\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0363\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u0fb3\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0e5a\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0fb4\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0fb5\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u0fb6\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0fb7\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0326\1\140\1\u0fb8"+
+ "\1\u0fb9\1\140\1\u0fba\1\u0fbb\4\140\1\u0fbc\5\140\1\u0faf"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0fbd\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0fbe\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0fbf\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0fc0\1\140"+
+ "\1\u0fc1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0fc2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0fc3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u0fc4\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0fc5\5\140\1\u06a5\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0fc6\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u0fc7\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0473\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0352\1\u0fc8\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0fc9\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0dd5\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0fca\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0fcb\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0fcc\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u0fcd\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0fce\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0fcf\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u06d9\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u0fd0\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0fd1\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0fd2\3\140\1\u0fd3\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0fd4\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0fd5\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u0fd6\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0fd7\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0fd8\6\140\1\u037c\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0511\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0fd9\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0fda\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0fdb\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0fdc\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0fdd\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0fde\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0fdf\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0fe0\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0fe1\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0fe2\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0fe3\2\140\1\u0fe4\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0a08\6\140\1\u0fe5\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0fe6\20\140"+
+ "\1\131\2\0\1\u0906\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0fe7\2\140\1\u0fe8"+
+ "\1\u0fe9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u0899\10\140\1\u0fea\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0feb\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0fec\2\140\1\u0fed\6\140\1\u089f\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0fee\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0fef\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03a4\3\140"+
+ "\1\u0ff0\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0ff1\1\u0ff2\16\140\1\u01a0\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0ff3\4\140\1\u0ff4\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0ff5\1\u0ff6\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0ff7\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0ff8\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0ff9\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0ffa\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0ffb\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ffc\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0ffd\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0ffe\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u0fff\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1000\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1001\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1002\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1003\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1004\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1005\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1006\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1007\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0670\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1008\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1009\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u100a\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u100b\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\1\u100c\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0a5c"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u100d"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0a56"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u100e"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u100f"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0363"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1010"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1011"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0460"+
+ "\11\140\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1012\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0a3d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u078e\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1013\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1014"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1015"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1016"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u03df"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u07c4"+
+ "\7\140\1\u1017\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1018\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1019\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u075d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u101a\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u101b\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u101c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u101d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u101e\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u101f"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0449"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1020\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1021\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1022\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u08ae\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1023\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1024"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1025"+
+ "\1\u1026\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1027\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1028\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1029\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u102a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u102b\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u102c\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u102d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u102e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u102f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1030\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1031\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u074e\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0256"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1032"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1033"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1034\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1035\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1036\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1037\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1038\14\140\1\u0224"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1039"+
+ "\1\140\1\u103a\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u103b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u103c\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u0acf\1\u0da4\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u103d\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0329\2\140\1\u0748\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u084a\6\140\1\u0acf\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u103e\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u103f\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0363\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1040\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1041\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1042\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1043\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u1044\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1045\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1046\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1047\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u035c\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1048\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1049\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u104a\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0398\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u104b\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u104c\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u104d\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u104e\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u104f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1050\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0449\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u07a8\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1051"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u05de\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u056a\3\140\1\u07fc\3\140\1\u0aac\3\140\1\u1052\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1053\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0b84\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1054\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u075a\4\140\1\u1055\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1056\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1057\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1058\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a9a\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1059\13\140\1\u105a"+
+ "\1\140\1\u105b\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u105c\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u105d\1\140\1\u0375\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u105e\6\140\1\u082b\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u056e\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u105f\2\140\1\u0b66\1\140"+
+ "\1\u1060\1\u1061\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0398\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0325\4\140\1\u0527\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u1062\1\u1063\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1064\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u1065\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1066\1\140\1\u0527\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1067\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1068\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1069\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0c1a\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0615\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u106a\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0ed5\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0bf3\4\140\1\u0acf\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0f79\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u106b\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u106c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0393\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u106d\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u106e\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u106f\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1070\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1071\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u0a9a\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1072\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1073\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1074\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1075\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1076\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1077\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0607\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0363\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u07c3\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1078\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\6\140\1\u1079"+
+ "\1\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0325\5\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u107a\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u107b\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u107c\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u05d7\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u107d\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u107e\3\140\1\u0fd3\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u107f\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1080\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1081\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u1082\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0629\3\140\1\u1083\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\140\1\u1084\6\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u1085\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\14\140\1\u1086\2\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1087\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u06a1\11\140\1\u1088\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1089\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0667\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u108a\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u039a\2\140\1\u0891\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131";
+
+ private static final String ZZ_TRANS_PACKED_3 =
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\6\140\1\u108b\1\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u108c\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u108d\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u085a\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u085a\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u108e\1\140\1\u108f"+
+ "\1\140\1\u1090\2\140\1\u1091\4\140\1\u1092\6\140\1\131"+
+ "\2\0\1\140\2\0\1\u1093\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u108b\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u06dc\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1094\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1095\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1096\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1097\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1098\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1099\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u109a\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u109b\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u109c\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u109d\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u109e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u05e3\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0e4f\12\140"+
+ "\1\u109f\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u10a0"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0363\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u10a1\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0a64\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u08f6\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0e0d\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u06d9\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u10a2\20\140\1\131\2\0"+
+ "\1\u10a3\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u10a4\2\140\1\u0dbd\1\u10a5\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10a6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u10a7\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0bc1\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u10a8\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u10a9\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u10aa\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u10ab\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0b80\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u10ac\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u10ad\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u10ae\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0360\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u10af\1\140\1\u10b0\2\140\1\u10b1\1\u10b2\1\u10b3\4\140"+
+ "\1\u10b4\5\140\1\u07c3\1\131\2\0\1\140\2\0\1\u01ce"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u0c16\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u10b5\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u10b6\15\140\1\u10b7\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u10b8\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u10b9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u10ba\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u10bb\5\140\1\u10bc\4\140\1\u10bd"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u10be\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u10bf\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u10c0\5\140\1\u10c1"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10c2\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u039a\2\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u10c3\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u10c4\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u10c5\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u10c6\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u0e0e\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u10c7\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u10c8\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u10c9\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u10ca\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u10cb\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u10cc\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0364\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u10cd\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u050e\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u10ce\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u10cf\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u10c0\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u0c6a\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u10d0\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u10ab\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u10d1\4\140\1\u10d2\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u10d3\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u074d\5\140\1\u050e"+
+ "\2\140\1\u10d4\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u10d5\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u10d6\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u10d7\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u10d8\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u10d9\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u10da\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u050b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u074d\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u10db\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u10dc\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u10dd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u10de\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u10df\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0348\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u10e0\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u10e1\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u10e2\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u10e3\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0925\1\140\1\u0e2e\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u10e4\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u10e5\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u10e6\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u10e7\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u10e8\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u10e9\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u10ea\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u10eb\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u10ec\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u10ed\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u052f\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u10ee\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u10ef\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u10f0\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u10f1\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u10f2\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u02dd\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u10f3\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u10f4\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0224\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u10f5\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u10f6\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u10f7\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u10f8\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u10f9\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0561"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u10fa"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10fb"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0b02\1\140"+
+ "\1\u10fc\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u10fd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u10fe\1\140\1\u10ff\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1100\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u1101\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0237\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1102\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u083d\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1103\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1104\3\140\1\u1102\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1105\1\140\1\u1106\1\140\1\u1107\1\140\1\u1108"+
+ "\1\140\1\u1109\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u110a\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u110b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u110c\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u07d0\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u110d"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u110e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u110f\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1110\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1111\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1112"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1113"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1114\12\140"+
+ "\1\u1115\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1116\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u1117\1\140\1\u1118\1\140\1\u1119\1\140\1\u111a"+
+ "\1\140\1\u111b\3\140\1\u10c0\1\u0d7e\1\140\1\u111c\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u111d\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u111e\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u111f\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0355\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1120\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1121\12\140\1\u039a"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1122"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1123\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1124\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1125\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1126\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1127\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u1128\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1129\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u112a\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u112b\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u08ab\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u112c\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u112d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u112e\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u112f\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0237\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1130\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1131\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1132\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1133\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1134\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1135\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1136\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1137"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1138"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1139"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u113a\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u113b\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u113c\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u113d\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u10c8\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u113e\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u10c8\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u113f\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u1140\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1141\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1142\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1143\2\140\1\u1144\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0998\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1145\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1146\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0925\11\140"+
+ "\1\u0eaf\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1147"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1148\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u05f2\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1149\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u114a\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u114b\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u114c\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u114d\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u114e\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u114f\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0bcc\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u1150\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1151\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0e2d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1152\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1153\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1154\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1155\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u03df\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1156\4\140\1\u0eb0\1\u1157\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u1158\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u01b7\6\140\1\u0224\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1159\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u115a\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u115b\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u115c\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u115d\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u115e\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u115f\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0ec6\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0fa0\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1160\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u02dd\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0ea9\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1161\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1162\1\u01ac\3\140\1\u1163"+
+ "\1\140\1\u07f4\7\140\1\u1010\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1164\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u10fc\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1165\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1166\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u1167\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1168\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0388\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1169\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u116a\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u116b\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u116c\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u116d\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1050\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u116e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u116f\3\140\1\u1083\6\140\1\u1170\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1171\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1172\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1173\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1174\4\140\1\u0629\3\140\1\u0bd6\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1175\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1176\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1177\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1178\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1179\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u01c5\1\140\1\u117a"+
+ "\1\u117b\4\140\1\u117c\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u117d\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u01c5\7\140\1\u0662\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u117e\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u117f\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0fa1\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u1180\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1181\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0239\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0cef\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1182\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1183"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u105f"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1184"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1185"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1186"+
+ "\7\140\1\u1187\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0ff1\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1188\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1189\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0345\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u118a\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u118b\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u118c\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u118d\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u118e\1\140\1\u118f\1\u103d\1\u084a\2\140\1\u1190"+
+ "\3\140\1\u1191\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1192\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1193\4\140\1\u1194\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1195\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1196\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u052b\2\140\1\u1197\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1198\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1199\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u119a\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u119b\2\140\1\u0d02"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0bff"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u119c"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119d"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119e"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u119f"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u11a0"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u11a1"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11a2"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u07ad"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11a3"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u100c\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u11a4\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u11a5\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u11a6\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u11a7\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u11a8\6\140\1\u01af\10\140\1\u11a9\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u11aa\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0853\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u11ab\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u11ac\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03a4\3\140\1\u03f8\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u11ad\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u11ae\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u11af\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u11b0\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u11b1\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u02dd\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u05fe\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u11b2\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u0348\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u11b3\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u11b4\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u11b5\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u11b6\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u11b7\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u11b8\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0919\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u11b9\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u11ba\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u11bb\1\u11bc\5\140\1\u0553"+
+ "\1\140\1\131\2\0\1\u11bd\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u11be\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u11bf\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u11c0\2\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u11c1\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u11c2\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11c3\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11c4\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u07c5\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11c5\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0794\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u11c6\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11c7\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u11c8\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u11c9\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u11ca\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u11cb\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u11cc\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u11cd\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u11ce\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u11cf\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u11d0\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u11d1\2\140\1\u11d2\2\140\1\u11d3"+
+ "\3\140\1\u11d4\1\140\1\u11d5\1\u11d6\1\140\1\u11d7\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u11d8\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u11d9\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0352\1\u11da\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11db\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11dc\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u11dd\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u11de\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11df\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11e0\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u11e1\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u11e2\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u11e3\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u11e4\14\140\1\u11e5\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11e6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11e7\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11e8\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u11e9\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u11ea\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1057\3\140"+
+ "\1\u11eb\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u11ec\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0ee2\4\140\1\u0d66\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u11ed\2\140\1\u0dbd\1\u11ee\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u11ef\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u039a\1\140\1\u11f0\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u075b\14\140\1\u089f\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0bbf\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u11f1\3\140\1\u11f2\3\140"+
+ "\1\u03f8\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0ff1\2\140\1\u11f3\14\140\1\u11f4\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u11f5\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u11f6\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u11f7"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u07e3\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u11f8\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u11f9"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0a4e"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11fa\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u10b9\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u11fb\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u11fc\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u11fd\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u11fe\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u11ff\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1200\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1201\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1202\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1203\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1204"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1205\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1206"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\u1207\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1208\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1209\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u120a\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\1\131\1\u0243"+
+ "\4\131\1\0\2\131\1\u0243\1\131\4\u0243\1\131\1\0"+
+ "\1\131\1\0\3\131\1\0\1\131\1\u0243\13\0\4\131"+
+ "\3\u0243\6\131\2\u0243\4\131\1\u0243\1\131\2\0\1\131"+
+ "\2\0\1\131\1\u0243\3\131\1\u0243\6\131\1\u0243\2\131"+
+ "\1\0\1\131\3\u0243\1\131\3\u0243\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u120b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0529\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u03df\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u120c\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0363\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u120d\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u120e\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u120f\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u1210\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u1211\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1212\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1213\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1214\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1215\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1216\1\u1217\2\140\1\u1218\3\140\1\u1219\1\u121a\4\140"+
+ "\1\u121b\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u121c\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u121d\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u121e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u121f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1220\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1221"+
+ "\2\140\1\u1222\4\140\1\u1223\5\140\1\u1224\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1225\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1226\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1227\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1228\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1229\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u122a\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0360\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0bef\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0398\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u0350"+
+ "\16\140\1\0\10\140\17\0\1\u122b\150\0\1\u122c\200\0"+
+ "\1\u0708\74\0\1\u122d\162\0\1\u122e\144\0\1\u122f\53\0"+
+ "\2\64\1\0\1\64\1\0\2\64\2\0\6\64\1\0"+
+ "\1\64\1\u1230\24\64\1\0\15\64\1\u1230\21\64\1\0"+
+ "\30\64\17\0\1\u1231\117\0\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u02d5\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1232\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\17\0\1\u1233\136\0\1\u1234\117\0"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\2\140\1\u1235\14\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1236"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0695\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\140\1\u1237\15\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1238\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1239\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u123a\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u123b\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0b42\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u123c\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u123d\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u07a8\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0cc0\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u123e\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0237\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u08ab\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u104d\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u123f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1240\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1241\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1242\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0f9c\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1243\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u1244\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1245\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u1246\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1247\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1248\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1249\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u124a\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u124b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u124c\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u124d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u085a\4\140\1\u124e\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u124f\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1250\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1251\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1252\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1253\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1254"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1255"+
+ "\5\140\1\u1256\1\u1257\11\140\1\u1258\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1259\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u125a\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u125b\7\140\1\131\2\0\1\u125c"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u125d\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0cdf\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u125e\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u125f\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u0bd0\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1260\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1261\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1262\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u1263\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1264\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u1265\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\7\140\1\u0508\1\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\7\140\1\u0224\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u0cfa\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1266\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1267\1\140\1\u1268\7\140\1\u1269"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u126a"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u126b"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\7\140\1\u126c\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u126d\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u126e\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0561\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0375\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u126f\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0d60\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1270\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1271\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1272\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u1273\1\u1267\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0360\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1274\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1275\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1276\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1277\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1278\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1277\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1279\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u127a\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u033a\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0484\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u127b\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u127c\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0853\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u127d\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u127e\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u127f\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u08f6\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1280\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1281\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1282\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1283\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1284\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0c0b\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1285\1\u1286\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1083\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1287\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1288\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u05d7\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0629\3\140\1\u1289"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u128a"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u128b"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u128c\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u128d\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u11aa\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u128e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u128f\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1290\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u1291\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1292\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1293\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1294\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1295"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1296"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1297"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1298"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1299\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1094\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u129a\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u129b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0cba\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u097e\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u129c\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u129d\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u129e\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0aeb\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u129f\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u085a\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u07be\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u07f4\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u12a0\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u08aa\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u12a1\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u12a2\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u12a3\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\140\1\u0224\4\140\1\u0224\1\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u12a4\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u100e\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u12a5\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u12a6\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u03a2\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u056e\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u12a7\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\5\140\1\u0224\3\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\6\140\1\u0224\1\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0c1a\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u12a8\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u12a9\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0224\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\1\u12aa\7\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u0593\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u12ab\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u0331\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12ac"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0421\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u12ad\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u12ae\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u12af\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u12b0\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u12b1\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0ef3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u12b1\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u12b2\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u12b3\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u12b4\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u12b5\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u12b6\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u12b7\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u12b8\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u12b9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u12ba\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u12bb\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u081e\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u12bc\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0e34\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u12bd\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u12be\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u12bf\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0846\3\140\1\u0848\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0596\1\u0acf\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0820\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u12c0\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u12c1\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u12c2\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u12c3\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u12c4\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u12c5\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u12c6\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u12c7\4\140\1\u12c8\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u12c9\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u12ca\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u12cb\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0e34\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u12cc\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u12cd\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u12ce\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12cf"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u12d0\1\140\1\u12d1\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0c25\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u089f\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u0ac8\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u12d2\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u12d3\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0d86\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u0355\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u12d4\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u12d5\3\140\1\u12d6\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u12d7\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u12d8\7\140\1\u12d9\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u12da\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u12db\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u12dc\3\140\1\u11a9\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u12dd\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0fd3\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0b66\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u12de\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0528\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u12df\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u12e0\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u12e1\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u12e2\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u12e3\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u12e4\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u12e5\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u12e6\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u12e7\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u12e8\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u12e9\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u12ea\1\u12eb\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u12ec\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u12ed\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u12ee\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u12ef\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u12f0\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0256\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0325\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0e12\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u12f1\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u12f2\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u12f3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u12f4"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u052c\1\u033a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\140\1\u1244\6\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u12f5\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1081\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u12f6\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u12f7\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u12f8\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u12f9\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u12fa\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u12fb\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u061e\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u12fc\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u12fd\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0a11\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\4\140\1\u12fe\4\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u12ff\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1300\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u10ea\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1301\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\5\140\1\u0224"+
+ "\2\140\1\131\10\0\6\140\1\0\10\140\1\u0378\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u07c4"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1302"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1303"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1304\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1305\6\140"+
+ "\1\u1306\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1307\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1308\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u07c4\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1309"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u130a\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1178\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u130b\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u130c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u130d\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u130e\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u130f\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0b08\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1310\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1311\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1312\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1313\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1314\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1315\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1316\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1317\3\140\1\u1318\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1319\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u131a\1\140\1\u1051"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u131b\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u131c\1\u131d"+
+ "\1\140\1\u131e\1\u0509\3\140\1\u131f\3\140\1\u0569\1\u1320"+
+ "\1\u1321\1\140\1\u1322\3\140\1\131\2\0\1\140\2\0"+
+ "\1\u1323\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u0e34\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u037c\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u08ab\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0a9a\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u1324\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1325\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1326\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1327\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1328\5\140\1\u0cf8\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u10fe\1\140\1\u1329\5\140\1\u132a"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u132b"+
+ "\3\140\1\u132c\3\140\1\u03f8\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u132d\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0569\7\140\1\u132e\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u132f\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u07c1\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u0555\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u10c8\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u02db\4\140\1\u1330\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1331\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1332\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1333\5\140\1\u1334\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1335\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0824\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1336\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u10c6\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0dff\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0569\7\140\1\u0853\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1337\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u0928\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1338\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1339\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u133a\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u133b\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u133c\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0cd3\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u133d\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0364\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u133e\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u133f\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1340\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1341\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1342\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u053a\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1343\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1344\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1345\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1346\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1347\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1348\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1349\1\140\1\u05de"+
+ "\5\140\1\u07f4\1\u134a\2\140\1\u134b\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u134c\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u134d\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u09ed\6\140\1\u050e\1\u134e\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u134f\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1350\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1351\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1352\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u0cdd\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1353\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1354\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0869\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1355\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u033a\2\140\1\u1356\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1357\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1358\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1359\2\140"+
+ "\1\u135a\1\140\1\u135b\1\u135c\1\u135d\2\140\1\u0352\1\140"+
+ "\1\u135e\1\u135f\5\140\1\131\2\0\1\140\2\0\1\u01ce"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1360\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1361\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1362\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1363"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u1364\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1365\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1366\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1367"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1368\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1369\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u136a\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u136b\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u035c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u136c\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u136d\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u136e\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u035c\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0fdc\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u074e\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u136f\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1370\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1371\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1372\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1373\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1374\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1375\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1376\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1377\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1378\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1379\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u137a\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u137b\4\140\1\u137c\3\140\1\u137d\6\140\1\u137e\1\140"+
+ "\1\u082d\1\u137f\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1380\6\140\1\u1381\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1382\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1383\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u1384\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1385\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1386\3\140\1\u1387\1\u1388\1\140\1\u1389\1\140"+
+ "\1\u138a\1\u0e38\6\140\1\u138b\1\131\2\0\1\140\2\0"+
+ "\1\u138c\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u110f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u138d\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u0363\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u138e\1\140\1\u138f\2\140\1\u1384\1\140\1\u1390"+
+ "\1\140\1\u1391\1\u1392\2\140\1\u1393\1\u1394\3\140\1\u082d"+
+ "\1\u1395\1\131\2\0\1\140\2\0\1\u1396\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1397\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u1398\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u039a\3\140\1\u0853\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1399\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u139a\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u139b\5\140\1\u133c\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u139c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u139d\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u139e"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u139f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13a0"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u13a1"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u13a2"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13a3"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0b52"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13a4\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u13a5\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u13a6\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0449\1\u0670\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u13a7\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u13a8\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u13a9\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u108d\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u03a2\10\140\1\u0788\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13aa\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u13ab\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u13ac\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u03e5\10\140"+
+ "\1\u13ad\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u13ae\1\u08d8\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u13af\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u13b0\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+ "\1\u13b1\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u13b2\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u13b3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u13b4"+
+ "\6\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u13b5\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0924\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u13b6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u13b7\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u13b8\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u13b9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u13ba\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u1339\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u032a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u13bb\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u13bc\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u13bd\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u13be\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u13bf\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13c0"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u13c1"+
+ "\2\140\1\u09a6\1\u13c2\2\140\1\u13c3\1\u13c4\1\140\1\u0352"+
+ "\1\140\1\u13c5\4\140\1\u13c6\1\140\1\131\2\0\1\u13c7"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u13c8\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u13c9\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u13ca\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u13cb\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u13cc\14\140\1\u10d9\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u13cd\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u13ce\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\1\u13cf"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u13d0\1\u0eb1\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u13d1\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u13d2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u13d3\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u13d4\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u13d5\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u13d6\7\140\1\u1156\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u06d9\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u13d7\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u13d8\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u13d9\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u13da\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u13db\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u07c4\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u13dc\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u13dd\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u13de\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u13df\1\u0cf6\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0eb7\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u13e0\4\140\1\u13e1\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u13e2\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u13e3\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u13e4\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u13e5\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u13e6\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u13e7\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u13e8\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u13e9\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u13ea\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u13eb\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u13ec\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0842\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u07be\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u13ed\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u13ee\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u05f8\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u0596\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u091d\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u13ef\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u13f0\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0cfb\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0922\3\140\1\u13f1\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u13f2\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u13f3\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0cc7\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u09f9\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u13f4\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\1\u13f5\7\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u13f6\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u13f7\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u13f8\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u13f9\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u13fa\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u13fb\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u13fc\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u042f\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u052c\1\u033a\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u13fd\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u13fe\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u13ff\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1400\4\140\1\u1401"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1402"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u052b"+
+ "\2\140\1\u1403\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u1404\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1405"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1406"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1407"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1408"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1409"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u140a"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u140b"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u140c"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u140d"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u140e\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u140f\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1410\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1411\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1412\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1413\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1414\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1415\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1094\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1416\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1417\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u1418\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u05c6\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1419\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0a06\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\21\140\1\u0a4c\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u06ae\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u141a\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u141b\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u141c\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u141d\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u141e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u141f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1420\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1421\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1422\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1423\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0bc9\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1424"+
+ "\4\140\1\u056a\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u05da\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1425"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1426\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1427\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1428\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1429\7\140\1\u142a\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u142b\14\140\1\u08aa\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u142c\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u042f\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u142d\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u085a\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u142e\4\140\1\u142f\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0857\4\140"+
+ "\1\u1430\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1431\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1432\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1433\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1434"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\1\u1435\7\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0b80\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u1436\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1437\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1438\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u1439\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u143a\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u143b\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u143c\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u143d\1\u06d9\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u143e\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u06d9\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u143f\1\140\1\u06d9\15\140\1\u07a8\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1440\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1441\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1442\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1443\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1444\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1445\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u1446\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1447\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1448\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1449\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u079c\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u144a\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u144b\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u144c\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u144d\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u144e\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u119c\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u144f\2\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1450\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u1451\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u033a\2\140\1\u1452\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1453\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1454\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1455\1\140"+
+ "\1\u0bc5\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1456\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1457\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1458\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1459\4\140\1\u145a\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u145b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0423\12\140\1\u037c\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u145c\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u145d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u145e\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u145f\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u06a1\4\140\1\u1460\7\140\1\u03a3\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1461\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1462\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1463\2\140\1\u1464\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0aed\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0aee\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1465\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1466\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1244\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1467\12\140\1\u1468\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1178\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1469\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u146a\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u146b\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08f9\1\u07fb"+
+ "\1\u146c\1\u0bdf\4\140\1\u146d\1\140\1\u146e\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u146f\1\u1217\1\140\1\u10ca"+
+ "\1\u1470\1\u061d\1\u07b6\1\140\1\u1471\1\u0d8c\1\140\1\u052c"+
+ "\1\u1472\1\u1473\1\u1474\1\140\1\u0472\3\140\1\131\2\0"+
+ "\1\u07be\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1475\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1476\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u048a\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1477\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u0b40\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0df3\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u1478\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1479\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u0d51\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u147a\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u147b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u147c\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u147d\10\140\1\u147e\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u147f\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1480\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1481\3\140\1\u1482"+
+ "\1\u1483\1\140\1\u051e\1\u1484\1\u1485\1\u1486\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1487\17\140\1\131"+
+ "\2\0";
+
+ private static final String ZZ_TRANS_PACKED_4 =
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0cb9\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1488\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1489\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u148a\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u148b\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1489\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u148c\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u148d\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u148e\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u148f\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1490\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1491\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1492\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1493\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1494\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u1495\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1496\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1497\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0224\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1498\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1499\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\64\0\1\u149a\131\0\1\u149b\143\0\1\u0f82"+
+ "\143\0\1\u149c\45\0\2\64\1\0\1\64\1\0\2\64"+
+ "\2\0\6\64\1\0\26\64\1\0\14\64\1\373\22\64"+
+ "\1\0\1\64\1\373\26\64\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\16\140"+
+ "\1\u0ca9\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\3\140\1\u074c"+
+ "\13\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u149d\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\1\140\1\u0745\4\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u149e\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u149f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u14a0\12\140\1\u0582\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u14a1\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u14a2\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0bc5\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u14a3\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u14a4\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u07be\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u14a5\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u076b\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0ca4\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0836\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0839\3\140\1\u03a2\1\140\1\u083a\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14a6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14a7\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u14a8\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0c30\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u14a9\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u14aa\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0d8f\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u037c\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u14ab\1\140\1\u14ac\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u08aa\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u14ad\11\140"+
+ "\1\131\2\0\1\140\2\0\1\u0555\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14ae"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14af"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14b0"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u14b1"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0355\11\140"+
+ "\1\u14b2\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u14b3\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u14b4"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0397"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14b5"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14b6"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u14b7"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14b8"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14b9"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14ba"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u14bb"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14bc"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14bd"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14be"+
+ "\14\140\1\u14bf\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u14c0\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u14c1\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u14c2"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u02dd\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u14c3"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14c4\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0aac\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u14c5\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\140\1\u14c6\6\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d35\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u14c7\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u14c8\7\140"+
+ "\1\u14c9\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u14ca\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u07c4"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u14cb\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u14cc\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u14c9\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u14cd\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u14ce\14\140\1\u13b3"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u14c5"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u14cf"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u14d0\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u14d1\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u14d2"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\2\140\1\u14d3\5\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u14d4\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u14d5\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u14d6\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0596\2\140\1\u13b3"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u14d7"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u14d8"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u14d9"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u14da\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u14db\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u14dc\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u14dd\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u14de\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u0b0e\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u14df\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u14e0\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u14e1\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u14e2\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u14e3\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u14e4\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u14e5\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u14e6\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u14e7\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u14e8\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u14e9\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u14ea\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u01a0\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u14eb\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u14ec\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u121d\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u14ed\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u14ee\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u14ef\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u14f0\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u14f1"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u09f7\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u14f2\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u14f3"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u01af\2\140"+
+ "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u14f4\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u14f5\5\140\1\u14f6\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u14f7\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u08ab\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u14f8\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u14f9\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0224\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u14fa\1\u14fb\3\140\1\u117b\1\140\1\u14fc\1\u1468"+
+ "\1\140\1\u14fd\5\140\1\u0ee0\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u12b1\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u14fe\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u108c\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u14ff\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1500"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u13a3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1501\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1502"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u03a4"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1503\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1504\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u0363\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d02\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1505\5\140"+
+ "\1\u1506\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1507\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0557"+
+ "\2\140\1\u1508\2\140\1\u1509\1\u150a\3\140\1\u150b\1\140"+
+ "\1\u150c\6\140\1\131\2\0\1\140\2\0\1\u150d\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u150e\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u150f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1510\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u035d"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1511\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0d89\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1512\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0363\14\140"+
+ "\1\u07c4\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1513\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1514\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1515\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1516\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0d89\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1517\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1518\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1519\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u151a\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u151b\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u151c\6\140"+
+ "\1\u151d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u151e"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u151f"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1520"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1521"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1522"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1523\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1524\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u0db5\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u1061\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u1525\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1526\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0b42\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u085a\4\140\1\u0224\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u03df\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1527\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1528\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u10e2\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1529\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u152a\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u152b\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u06cc\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u0224\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0a9a\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\21\140\1\u152c\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0f97\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u152d\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u152e\6\140\1\u152f\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1530\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u031e\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0db5\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1531\1\140\1\u1532"+
+ "\3\140\1\u1533\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1534\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0891\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u061d\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1535\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1536\1\140\1\u1537\4\140\1\u0c25\2\140\1\u048a"+
+ "\3\140\1\u1538\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1539\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u153a\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u153b\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u153c\7\140\1\u0c25\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0db6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u153d\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u153e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u153f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u048a\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u06a1\2\140\1\u046d\7\140\1\u0eb2\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1540\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1541\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0853\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u1083\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1542\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1543\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1544\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1545\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1546\4\140\1\u08ba\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1547\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u1548\2\140\1\u1549\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u154a\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u154b\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u154c\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u154d\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u137f\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u0ea5\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u154e\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0821\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u0aae\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u154f\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1550\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1551\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1552\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1553\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1554\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\21\140\1\u1555\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1556\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1557\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1558\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1559\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u155a\5\140\1\u0224\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u155b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u155c\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0921\1\140\1\u155d\1\140"+
+ "\1\u155e\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u155f\4\140\1\u0aba\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1560\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1561\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1562\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1563\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1564\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u0325\6\140\1\u1565\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1566\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1567\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1568\4\140\1\u08ba\4\140"+
+ "\1\u1569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u156a"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u156b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u156c\6\140"+
+ "\1\u037c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u156d"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0ee1"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u156e"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u156f"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u05ba"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0a0c"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1570"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u079c\6\140"+
+ "\1\u1571\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1572\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1573\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u1574\1\u1575\1\u1576\5\140\1\u1577\2\140\1\u1578\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1579\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u051e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u157a\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0375\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u157b\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0a5d\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u157c\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u157d\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u157e\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u157f\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u1580\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0c16\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1581\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1582\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1583\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u042f\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1584\1\140\1\u05de\5\140\1\u07f4\1\u134a\2\140\1\u134b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1585"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1586"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u056e\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06c0"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1587"+
+ "\2\140\1\u1588\4\140\1\u051e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1589\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u158a\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u0cc1\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0423\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u158b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u158c\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0752\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0ef3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u119e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u101a\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u158d\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0a9a\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0ab0\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u158e\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u01af\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u06a0\12\140\1\u158f\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1590\1\140\1\u1591\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1592\3\140\1\u03a4"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1593"+
+ "\1\u1594\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1595\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u0cc1\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0bf3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u117b\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1596"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1597"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1598"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1599"+
+ "\7\140\1\u159a\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u159b\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u159c\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u159d"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u159e\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u159f"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u15a0\1\0\1\u050e"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u15a1\1\140\1\u130a\1\u15a2\2\140\1\u07fe\1\u050e\1\u15a3"+
+ "\3\140\1\u15a4\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u050e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u050e\2\140\1\u15a2\3\140\1\u050e\1\u15a5\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15a6\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u07b1\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u15a7\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u056e\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0159\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u15a8\3\140\1\u15a9"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15aa"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u15ab\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u15ac\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15ad\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u15ae\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u15af\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15b0\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b1\7\140"+
+ "\1\u15b2\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u15b3"+
+ "\5\140\1\u15b4\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u15b5\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15b6"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b7"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u15b8"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u15b9"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0853"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1367"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0d7b"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15ba"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15bb"+
+ "\4\140\1\u15bc\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u15bd\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u15be\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15bf"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c0"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u10b9"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15c1"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c2"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u15c3"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u15b1"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u15c4"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u15c5"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u15c6\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u15c7\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u15c8\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u15c9\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u15ca\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u15cb\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u15cc\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u15cd\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u15ce\1\131\2\0\1\u042f"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u15cf\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u15d0\1\u15d1\1\u15d2\2\140\1\u0329\3\140\1\u15d3"+
+ "\3\140\1\u15d4\2\140\1\u15d5\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\4\140\1\u0a20\3\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u15d6\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u15d7\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u15d8\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u15d9\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u110c\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u15da\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u15db\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u15dc\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u15dd\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0c08\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u15de\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u05da\4\140\1\u051e\2\140\1\u0ed3\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0a51\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u035c\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u15df\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u15e0\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u15e1\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u15e2\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u15e3\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u15e4\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u03eb\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u15e5\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\21\140\1\u15e6\2\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\140\1\u0336\6\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u15e7\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u15e8\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u15e9\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u15ea\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u15eb\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u15ec\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u15ed\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u15ee\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u15ef\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u15f0\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u15f1\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u03ac\3\140\1\u0159\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u15f2\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u15f3\15\140\1\u15f4\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u15f5\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u15f6\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\14\140\1\u15f7\2\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u15f8\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u15f9\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1156\4\140\1\u15fa\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u15fb\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u15fc\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1431\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u15fd\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u15fe\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0ec6\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u15ff\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1154\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u1600\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1601\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1602\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u07a8\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1112\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1603\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1604\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u0553\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u1075\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1605\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1606\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1349\1\140\1\u1607\5\140\1\u1608\1\u1609"+
+ "\2\140\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u160a\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u160b\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u160c\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u160d\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u160e\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u160f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0a07\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1610\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1611\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1612\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1613\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1614"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1615\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1616\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1617\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cc1\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1618\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1619\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u161a\5\140\1\u0eb2"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u161b"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u085a"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u161c"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u161d"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u161e\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u161f\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1620\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0fff\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1621\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1622\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u0b0e\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u1623\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1624\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1625\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u1626\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1627\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1628\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1629\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u162a\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u07f3\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u162b\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u162c"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u162d"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u162e"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u162f"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1630\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1631\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1632\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1633\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1634\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1635\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1636\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1637\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1638\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1639\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0b4e\17\140\1\u163a\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u163b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u163c\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0316\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1213\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u048a\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u163d\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u163e"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u01a0\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u141e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1071\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u163f"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1640"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1641"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1642"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1643"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u037c\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1644\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1645\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1646\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u1647\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1648\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1649\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u164a\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u164b\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u164c\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u164d\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u164e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u164f\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1650\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1651\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1652\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1653\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u1654\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0f24"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1655\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1656\1\u1657"+
+ "\1\u1658\1\u1659\1\140\1\u07c3\1\140\1\u165a\1\u1657\1\u165b"+
+ "\3\140\1\u165c\1\u165d\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u165e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u165f\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0561\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u039a\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1660\11\140\1\u1661\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1662\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1663\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1664\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1665\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1666\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1667\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1668\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1669\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u166a\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u166b\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u166c\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u166d\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u14e3\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u166e"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1669\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u166f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1670\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1671"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1672\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1673\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1674\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1675\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1676\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1677\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1678\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1679\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u167a\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u167b\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u167c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u05ec\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u167d\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u167e\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u061a\7\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u167f\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u119e\3\140\1\u1680\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1681\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1682\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1683\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1684\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0217\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1685\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1686\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1687\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1688\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1689\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u168a\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u168b\2\140\1\u168c\1\u05aa\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u168d\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03a4\3\140\1\u0bc1\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u03df\1\140\1\u0471"+
+ "\1\140\1\u0527\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\u06dd"+
+ "\7\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u06d9"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u168e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u03eb\6\140\1\u03df\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u168f\11\140\1\u0527\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u06dd\5\140\1\u1690\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u09ed\1\140\1\u1691"+
+ "\1\140\1\u1692\1\u1693\4\140\1\u1694\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u1695\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1331\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1696\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1697\2\140\1\u0601\1\u1698"+
+ "\2\140\1\u051e\7\140\1\u10ab\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1699\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u169a\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u169b\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u169c\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u169d\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0503\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u169e"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u169f"+
+ "\4\140\1\u16a0\7\140\1\131\2\0\1\u16a1\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u16a2\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u16a3\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u16a4\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u16a5\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u16a6\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u16a7"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u16a8\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u12c3\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u16a9\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u12c3\1\u16aa\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u16ab\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u16ac\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u11a4\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u16ad\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u16ae\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u03ce\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u16af\21\140\1\u16b0\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u16b1\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u16b2\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0d89\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u16b3\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u16b4\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u16b5\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u16b6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0f7d\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\55\0\1\u16b7\3\0\1\u16b8\151\0\1\u16b9"+
+ "\121\0\1\u16ba\57\0\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u16bb\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u16bc\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u16bd\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u16be\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1367\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u16bf\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u16c0\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u16c1\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u05ba"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u16c2\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u16c3\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0e15\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u16c4\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u16c5\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u16c6\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u16c7\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u07a4\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u16c8\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u16c9\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u16ca\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1261\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u16cb\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u0355\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u0eb2\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u16cc\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u16cd\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u16ce\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u16cf\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u110f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u16d0\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u110f\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u16d1\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u16d2\1\u16d3\1\u16d4\1\140\1\u16d5\1\140\1\u16d6"+
+ "\4\140\1\u16d7\1\u16d8\1\140\1\u03a3\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u16d9\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u16da\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u042f\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0e2b\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u16db\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u16dc\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u16dd\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u16de\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\140\1\u16df"+
+ "\6\140\1\131\10\0\6\140\1\0\10\140\1\u16e0\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0326\5\140\1\u16e1\1\140\1\u16e2\10\140\1\u0ee0"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u14c3\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0bef\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u16e3\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u16e4\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u16e5\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u16e6\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u16e7\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u16e8\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1273\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u16e9\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u16ea\2\140\1\u0df3\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u16eb\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\3\140\1\u0224\4\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u16ec\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u16ed\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u16ee\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u01a0\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u16ef\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u16f0\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u16f1\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u16f2\3\140\1\u1297\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u01a0\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u0e2e\3\140\1\u16f3\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u16f4\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u093f\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u16f5\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u16f6\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u16f7\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u16f8\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u16f9\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u16fa\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u16fb\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u16fc\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u16fd\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u16fe\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u16ff\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1700\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1701\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0c0b\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1702\1\140\1\u11a4"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1703"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1704"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\1\u1705\7\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1706\12\140"+
+ "\1\u1707\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1708"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1709"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u170a"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u170b"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u170c"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0460"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u170d"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u170e"+
+ "\6\140\1\u0403\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u170f\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1710\1\140\1\u06de\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1711\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u13a3\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u108c\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u14fd\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1712\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u108c\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1502\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u0318\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1713\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1714\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u147f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1715\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1716\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1717\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1718\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1719\1\u171a\3\140\1\u171b\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u171c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u171d\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u10ea\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u171e\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u171f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1720\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1721\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1722\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1723\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u12ab\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1465\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1724\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1725\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u108d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u13f1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1726\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\1\u0378\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1727"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1728"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1729"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u035c"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u01a0"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0557\10\140"+
+ "\1\u172a\6\140\1\u172b\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u172c\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u172d\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u172e\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u172f\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1730\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1731\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u018d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u152c\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1732\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1733"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1734"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1735"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1736"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1737"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1738\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1739\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0fe0\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u173a\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u173b\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u173c\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u173d\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u173e\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u173f\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1740\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1741\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1742\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1743\1\u05b8\1\140\1\u084a\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1744\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1745\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\16\140\1\u1746\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1747\6\140\1\u1748\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1749\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u174a\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u174b\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u174c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u174d\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u174e\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u174f\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1750\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1751\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0bd6\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1752\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1753"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1754"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u13d9"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1755"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1756\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1757\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1758\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1759\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u175a\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u0e2e\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u175b\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u175c\4\140\1\u056a"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u175d\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u175e\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u175f\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1760\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u154b\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1761\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0fc2\4\140"+
+ "\1\u0596\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1762\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1763"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1764\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1765\1\u1766\1\140\1\u0421\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u1767\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0421\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u03a2\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1768\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u0421\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0877\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1769\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u176a\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0a82\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u176b\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u176c\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u0765\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u176d\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u176e\1\u176f\5\140\1\u1770\1\u1771"+
+ "\2\140\1\u1772\7\140\1\131\2\0\1\140\2\0\1\u1773"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1774\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1775\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u07a8\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1776\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1777"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0b8a\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1778\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u08c7\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u061d\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u0326\1\u08ba\1\140"+
+ "\1\u1384\1\140\1\u10e2\1\140\1\u1779\11\140\1\u177a\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u0c39\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u177b\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u177c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u177d\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u09ed\3\140\1\u177e\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0793\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0748\12\140"+
+ "\1\u177f\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1780"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1781"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1782"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0903"+
+ "\6\140\1\u0b84\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u075a\3\140\1\u02dd\1\u1055\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u1783\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0b66\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1784\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1785\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1786\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1787\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1788\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1789\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0d87\4\140\1\u178a\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u178b\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u178c\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u178d\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u178e\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0348\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u178f\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0a4c\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1790\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1791\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1792\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u050e\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\1\u1793\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1794\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u042f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1795\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0325"+
+ "\2\140\1\u1796\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u050e\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u050e\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0325\1\u1797\7\140\1\u050e\12\140\1\131\2\0\1\140"+
+ "\2\0\1\u1798\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u0325\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u050e\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u050e\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1799\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u179a\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u179b\1\140\1\u179c\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u179d\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1363\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u179d\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u179e\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u179f\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u17a0\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u17a1\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u17a2\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u17a3\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\4\140"+
+ "\1\u17a3\3\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u17a4\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u17a5\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u0363\1\u17a6\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u17a7\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u17a8\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u17a9\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u17aa\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u17ab"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u03e5"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0e2b"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u17ac"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u03e5"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u17ad\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u17ae\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u17af\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u17b0\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u17b1\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u130f\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u17b2\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u17b3\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u17b4\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u17b5\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u17b6\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u17b7\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u17b8\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u17b9\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u17ba\10\140\1\u1382\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u17bb\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u01b7\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u17bc\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u03eb\1\140\1\u17bd\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u17be\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u17bf\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u17ba\10\140\1\u17c0\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u17c1\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u17c2\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u17c3\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u17c4\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u0c1a\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u0c0c\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u17c5\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u17c6\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u17c7\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u17c8\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u17c9\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u17ca\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u17cb\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u17cc\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u17cd\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u063a\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u17ce\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u12d5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u17cf\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u17d0\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u17d1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u17d2\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u13d6\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de\5\140"+
+ "\1\u07f4\3\140\1\u0569\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u17d3\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u17d4\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u17d5\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u17d6\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u17d7\10\140\1\u17d8\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u17d9\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u0778\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\5\140"+
+ "\1\u17da\3\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u17db\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1584\1\140\1\u17dc\5\140\1\u1608\1\u1609\2\140"+
+ "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ec6"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c\2\140"+
+ "\1\u1588\4\140\1\u051e\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u17dd\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u13d9"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u17de\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1241\4\140\1\u0629\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u10f8\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1433\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0537\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u17df\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u05aa\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u17e0\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u17e1\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u17e2\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u079c\14\140\1\u06da\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u17e3\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u05b1\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u17e4\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u17e5\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u17e6\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u0224\1\u17e7\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u17e8\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u17e9"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u17ea\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u17eb\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u17ec\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u17ed\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u17ee\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u17ef\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u160f\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u17f0\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u0a62\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1413\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u17f1\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u17f2\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u17f3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u17f4\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u17f5\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0c7a\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u17f6\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u17f7\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u17f8\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u17f9\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0f98\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u17fa\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u17fb\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u17fc\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u17fd\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u17fe\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u17ff\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1800\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1801\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1802\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1803\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1804\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1805\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1632\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1806\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u1807\12\140\1\u1808\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u17af\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1809\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u180a\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0561\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u180b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u180c\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u180d\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u180e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u180f\11\140\1\u1810\4\140\1\u1811"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0836\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1812\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1813\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0b3e\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1814\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u0537\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1815\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u171d\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1816\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1817\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u0c77\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1818\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u142b\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1819\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u13d9\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u181a\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u181b\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1488\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u181c\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u181d\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u181e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0db5\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u181f\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u07a8\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1820\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0cee\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1821\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1822"+
+ "\12\140\1\u0511\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1823\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0e28\7\140\1\u1824\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1825\3\140\1\u0ce9\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1826\10\140\1\u1827\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1828\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1829\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u182a\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u182b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u182c\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u182d\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u182e\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u182c\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u182f\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1830\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u1831\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1832\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1833\1\0\1\140\1\0\1\131";
+
+ private static final String ZZ_TRANS_PACKED_5 =
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1834\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u14e3\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1835\1\140\1\u1836\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1837\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1838\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u146b\4\140\1\u1831"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1839"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u183a"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u183b"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u183c"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u183d"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0784"+
+ "\1\u183e\1\u183f\2\140\1\u1840\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1841\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1842\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1843\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1844\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1845\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1846\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1847\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0c03\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1848\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1849\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u184a\3\140\1\u184b\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u184c\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u184d\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u184e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u0aac\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1686\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u184f"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u119e\6\140\1\u0f1b\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1083\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1850\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1851\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u1852\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1853\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0224\5\140\1\u03df\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1854\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1855\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1856\6\140\1\u1857\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1858\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1859\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u185a\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u185b\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u185c\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0af7\10\140"+
+ "\1\u1410\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u185d\6\140\1\u185e\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u185f\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1860\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1861\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1862\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1863\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1864\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1865\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1866\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1867\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1868\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1869\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u186a\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u186b\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u186c\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u186d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u186e\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u186f"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1870"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1871"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0fdd"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1872"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1873"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1874"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1875"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1876\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1877\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u0473\1\140\1\u1878"+
+ "\5\140\1\u0352\1\u0569\1\u1879\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u187a\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u187b\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u187c\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\71\0\1\u0c99\124\0\1\u06fa"+
+ "\145\0\1\u0c99\50\0\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u187d\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u187e\7\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1505\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u187f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0336\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1880"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1881\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u05f2\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0509"+
+ "\11\140\1\u1882\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1883\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1884\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1885\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u0c36\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1886\1\u0a17\1\140\1\u1575\2\140\1\u1887\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1888\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1889\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u188a\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u188b\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u188c\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0e20\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u14b9\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0e5a\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u110f\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0fa8\2\140\1\u188d\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u188e\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u188f\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\u1890\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0224\4\140\1\u1891\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1892\1\140"+
+ "\1\u03df\1\u1893\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1894\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1895\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1896\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1897\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1898\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1899\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u189a\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u189b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u189c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u189d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u189e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u189f"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0d71\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0f79\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u18a0\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0557\7\140\1\u0224"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0670"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18a1"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18a2"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\u18a3\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u18a4\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u03df\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u18a5\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u074d\1\u16f1\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\1\u061a\7\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u18a6\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u18a7\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u18a8\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18a9\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u18aa\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18ab\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u0c0b\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u18ac\1\u056a\2\140"+
+ "\1\u0819\1\140\1\u046d\4\140\1\u0352\1\140\1\u18ad\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u18af\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18b0"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u12c3"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18b0"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u18b1\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u18b2\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u18b3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u18b4\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u18b5\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u18b6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u18b7\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u18b8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u18b9\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u18ba"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u18bb\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u18bc\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u050e\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u18bd\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u18be\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u06c0\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u052c\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u18bf\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u18c0\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u18c1\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0df2\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u18c2\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u18c3\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u18c4\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u18c5\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u18c6\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u18c7\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1716\7\140\1\u18c8\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u18c9\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u18ca\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u18cb\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u18cc\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u18cd\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u18ce\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u18cf\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18d0"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u18d1\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u18d2"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u09f9"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u18d3"+
+ "\6\140\1\u18d4\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u18d5\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u076f\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u18d6\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u07f7\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u18d7\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u18d8\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+ "\1\u18d9\6\140\1\131\10\0\6\140\1\0\10\140\1\u18da"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0224\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u18db\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u18dc\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u18dd\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u18de\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u18df\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u18e0\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18e1"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u18e2"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u18e3\12\140\1\u11c0\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u18e4\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u18e5\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u18e6\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u18e7\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u18e8\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u18e9\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u18ea\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u18eb\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u18ec\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u18ed\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u18ee\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u18ef\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18f0"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u18f1\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u115f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u18f2\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u18f3"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18f4"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1536"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18f5"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18f6"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u18f7"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u18f8"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u18f9"+
+ "\2\140\1\u18fa\1\140\1\u10e2\5\140\1\u151b\2\140\1\u0619"+
+ "\3\140\1\131\2\0\1\140\2\0\1\u18fb\16\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u18fc\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u18fd\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1658\20\140\1\u18fe\1\131\2\0\1\140\2\0\1\u18ff"+
+ "\16\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1900\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1901\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1902\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1903\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u18af"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1904\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1905\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0b42\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u056e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1906\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1907\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1908\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1909\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u190a\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u190b\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u190c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u190d\3\140\1\u190e\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u190f\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1910\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1911\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1912\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u117b\2\140\1\u0c25\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1913\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1131\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1356\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1658\10\140\1\u0c25\1\u1914"+
+ "\6\140\1\u1915\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1916\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1917\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1918\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1919\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u191a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u191b\6\140\1\u191c\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u191d\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0cc5\1\140\1\u191e\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u191f\3\140\1\u09f7\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1920\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1921\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1922\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1923\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1924\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1925\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u11ca\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1926\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1927\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u147f\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u0f9c\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1928\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0cfb\1\140\1\u039b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1929\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1585\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u0237\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u03a2\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0665\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0ef3\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u10ef\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u192a\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u192b\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u192c\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u192d\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u192e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u192f\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\1\u1930\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u192f"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1931"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1932"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1933"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1934"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1935"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1936"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1937"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0cf8"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u050e"+
+ "\11\140\1\u1938\1\u07c9\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0325\2\140\1\u0527\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u050e\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u07c9\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1939\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0f99\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u193a\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u193b\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u193c\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u193d\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u193e\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u193f\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1940\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1941"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u115c\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u085a\16\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u07c1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1942\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1943\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1944"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u109d"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1945"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1946"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1947"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1948"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1949"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u09f9"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u194a\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u194b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u194c\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u194b\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u194d\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u194e\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0c84\6\140\1\131"+
+ "\2\0\1\140\2\0\1\u0555\16\140\1\0\4\140\1\u194f"+
+ "\3\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u0d7e\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u130a\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\u0cc0\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u0a4e\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1950\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u01b7\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1951\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1952\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1953\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u17bd\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1954\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0dca\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0e15\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1955\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u06d2\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1956\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1957\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1958\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1959\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1958\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u195a\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u195b\1\u195c\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\4\140\1\u195d\3\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u195e\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u195f\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u1960\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1961\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1962\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1963\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1964\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1965\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u1966\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\17\140\1\u1967\4\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1968\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1969\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\4\140\1\u196a"+
+ "\4\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u11c7\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u196b\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u196c\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u196d\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u0d89\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u196e\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u196f\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1970\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1971\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1972\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1973\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0345\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1974\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u05de\4\140\1\u03a2\1\u0857\1\u1609\2\140\1\u134b\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u13d6\2\140\1\u0d8c"+
+ "\2\140\1\u0532\4\140\1\u051e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1975\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1976\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1977\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1978\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u1975\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u1979\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u197a"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u197b\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u197c\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u197d\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0e38\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u197e\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u197f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u0ed7"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0473\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1980\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1981"+
+ "\1\u1982\1\140\1\u1983\1\u07fb\1\140\1\u1984\1\140\1\u1985"+
+ "\4\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1986\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1987\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1988\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1989\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u198a\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u198b\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u198c\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u198d\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u14a5\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u198e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u198f\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0695"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1990\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1991\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1992\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1993\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1413\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1994\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1995\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1658\3\140\1\u1996\1\140"+
+ "\1\u117b\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1997\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1998\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1998\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1999\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u199a\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u199b\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0991"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u199c"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d86"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u199d\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u199e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u199f\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u19a0\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u19a1\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u0793\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u19a2\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u19a3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19a4"+
+ "\6\140\1\u0b9a\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u19a5\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u19a6\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u19a7\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u0aae\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u0853\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0629"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1051"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19a8"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u19a9"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u19aa"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19ab\14\140"+
+ "\1\u19ac\3\140\1\u19ad\1\140\1\u1827\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u19ae\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u19af\1\u19b0\6\140\1\u19b1\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u0421\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u19b2\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u19b3\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u19b4\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u19b5\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u19b6\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u19b7\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u0af2\5\140\1\u19b8\1\140\1\u19b9\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\10\140"+
+ "\1\u19ba\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u1413\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u19bb\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u19bc\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u19bd\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u19be\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u19b5\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u09fc\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u19bf\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u127e\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19c0\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19c1\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u19c2\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u127e\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0a88\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u19c3\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u19c4\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u19c5\2\140\1\u0e2e\3\140"+
+ "\1\u19c6\4\140\1\u19c7\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u19c8\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u0b0e\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u19c9\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u19ca\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u19cb\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19cc"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19cd"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u19ce"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u19cf"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u119e"+
+ "\10\140\1\u10ab\3\140\1\u19d0\1\u19d1\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u19d2\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u050b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u19d3\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u19d4\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u19d5\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u19d6\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u19d7\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u19d8\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u19d9\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u19da\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u19db\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u19dc\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u19dd\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u19de\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u19df\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0667\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u19e0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u19e1\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u19e2\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u19e3\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u18a7\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u19e4\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19e5"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19e6"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u19e7"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19e8"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19e9"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u19ea"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u19eb"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1359"+
+ "\3\140\1\u0c77\2\140\1\u1359\4\140\1\u19ec\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u19ed\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u19ee\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u19ef\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u19f0\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u19f1\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u19f2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u0ecb\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u19f3\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u19f4\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u19f5\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u03a4\3\140\1\u19f6\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u19f7\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u19f8\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\u19f9\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u19fa\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u19fb\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u135b"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19fc\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19fd\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u19fe\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u19ff\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a00\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0cd6\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0ce5\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a01\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07c4\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u08ba\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1a02\2\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1228\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a03\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a04\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1a05\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a06\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1a07\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a08\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a09\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a0a\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a0b\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1a0c\5\140\1\u1a0d"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a0e"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1a0f"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1a10"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1a11"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1a12\12\140"+
+ "\1\131\2\0\1\140\2\0\1\u1a13\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1a14"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a15"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u11c2"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0faf"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1a16\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a17\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u042f\6\140"+
+ "\1\u1a18\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u1a19\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1a1a\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1a1b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0d8c\2\140\1\u18e3\4\140\1\u051e\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a1c\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a1d\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1a1e\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1a1f\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1a20\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u07b1\3\140\1\u0c6a\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u0e28\2\140\1\u0911\1\u03a4"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u0670"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u07d0"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1a21\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1a22\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1a23\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1a24\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u09f0\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1a25\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u085b\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1a26\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1a27\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u09e7\7\140\1\u142f\4\140\1\u11a4\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1a28\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1a29\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u1a2a\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1a2b\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1a2c\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1a2d\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1a2e\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1a2f\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1a30\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u193c\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1a31\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u1177\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1a32\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1a33\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1a34\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u18c9\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1a35\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1a36\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1a37\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u1a38\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1a39\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u0329\12\140\1\u0c1a\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1a3a\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1a3b\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u03eb\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u0325\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1a3c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1a3d\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1a3e\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1a3f\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u1a40\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1a41\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1a42\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1a43\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1a44\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u1a45\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u18e3\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1a46\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a47"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140"+
+ "\1\u0d9d\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u18e3\12\140\1\u11c0\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1055\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1a48\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\22\140\1\u1a49\1\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1a4a\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1a4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u1a4c\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u1a4d\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1a4e"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1a4f"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1a50"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u07e6"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1a51"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1a52\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\7\140\1\u1a53\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1a54\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1a55\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1a56\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u1a57\16\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1a58\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1a59\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1a5a\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1a5b\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1a5c\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1a5d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1a5e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1a5f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1a60\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1a61\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1a62\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1a63\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1a64\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\u1a65\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a66\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1178\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1a67\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0532\5\140"+
+ "\1\u0569\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1587\2\140\1\u0532\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1a68\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1a69\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1a6a\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1a6b\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1a6c\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0a09\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1a6d\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1a6e\4\140\1\u1a6c\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a6f\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1a70\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a71\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1a72\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1a73\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1a74\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u085e\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a75\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1a76\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u0345\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u09f9\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1a77\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1a78\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1a79\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1a7a\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a7b\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u1a7c\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1a7d\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u164b\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1a7e\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1a7f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u1a80\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u042f\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1a81\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u177f\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1a82\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1a83\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0a4e\4\140\1\u0d86\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1a84\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1787\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1a85\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1a86\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1a87\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a88"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1a89\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1a8a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1a8b\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u14e6\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1a8c"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1a8d"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1a8e\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1a8f\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1a90\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1a91\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u03eb\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1977\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a92\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u07f4\3\140\1\u0569\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1a93\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1391\10\140"+
+ "\1\u082d\1\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1419\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u0a4e\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1115\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1a94\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u03e5\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u1a95\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1a96\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1a97\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\16\140\1\u1a98\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1a99\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1a9a\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u0e4f\2\140\1\u15b9\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1a9b\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0256\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a9c\22\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u03df\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1a9d\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1a9e\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u050a\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u0224\3\140"+
+ "\1\u07c4\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1a9f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u17ce\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1aa0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1aa1\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1aa2"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1aa3"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0631"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1aa4"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1537\1\140"+
+ "\1\u1aa5\4\140\1\u084d\5\140\1\u1aa6\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1aa7\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1aa8\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1aa9\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1aaa\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0f19\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1aab\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1aac\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1aad\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\7\140\1\u1aae\1\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1aaf"+
+ "\3\140\1\u01d3\3\140\1\u08c7\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1ab0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1ab1\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\1\u06cd\7\140\1\131\10\0\6\140\1\0\10\140\1\u17e0"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u1ab2\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u100d\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1ab3\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1ab4\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1ab5\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0364\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ab6"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u1ab7"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1782"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ab8\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1ab9\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1aba\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u01c5\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1002\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1abb\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1abc\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u108d\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1abd\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0402\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1abe\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1abf\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1ac0\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1ac1\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1ac2\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1ac3\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u1ac4\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1ac5\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1802\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u18c0\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1743\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1ac6\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1ac7\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1ac8\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u10d7\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1ac9\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1aca\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1acb\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u0363\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1acc\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u10f8\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u0a03\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1acd\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u052c\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1ace\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u1acf\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u0f0e\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ad0"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1ad1"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0325"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1ad2"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1ad3"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1ad4"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u03eb\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1ad5\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\1\u0224\7\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1ad6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1244\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1ad7\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1ad8\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1ad9\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1ada\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u1adb\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1adc\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1add\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1ade"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1adf"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ae0"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ae1"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1ae2"+
+ "\11\140\1\u0788\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1ae3\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1ae4\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ae5"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u050e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1ae6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1ae7\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1ae8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1ae9"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u07a1\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1aea\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u18ae\10\140"+
+ "\1\u1ae6\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u1aeb\4\140\1\131\2\0\1\140\2\0\1\u0350\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1aec\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1aed\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u097e\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0d28\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1aee\2\140\1\u1aef\1\140\1\u03a2\1\u0350\3\140\1\u0569"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d8c"+
+ "\1\140\1\u1af0\1\u0d8e\1\u1af1\3\140\1\u051e\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1af2\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1af3\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u07c4\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1af4\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1af5\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1af6\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1af7\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0e74\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1af8\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1af9\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1afa\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1afb\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1afc\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0bdf\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1afd\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u0c0b\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1afe\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1aff\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b00"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u15a4\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b01\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b02"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b03"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1b04\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b05\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1b06\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u1b07"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1b08\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1b09\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1b0a\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1b0b\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1b0c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1866\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1b0d\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1b0e\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1b0f\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u1b10\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1b11\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1b12\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b13\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1b14\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b15"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\16\140\1\u1b16\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0375"+
+ "\3\140\1\u0661\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u0d89\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1b17\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1b18\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u0d33\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u1b19\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1b1a\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1b1b\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1b1c\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1b1d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u06a0\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1b1e\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1b1f\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b20\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u08ba"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b21"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u17af"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0d51"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b22"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1b23"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b24"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b25"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b26"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0159"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b27"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1b28"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b29"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\16\140\1\u0cc0\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1b2a\3\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b2b\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b2c\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b2d\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b2e\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b2f\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b30\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u10c9\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1b31\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1781\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u1b32\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u03a4\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u0bf5\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1acf\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u18aa\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1200\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1b33\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0a5a\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u056a\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u0b0e\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u1b34\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u127e\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u1b35\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1b36\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1b37\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1b38\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1b39\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1b3a\14\140\1\u086b\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1b3b\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1b3c\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u0224\2\140\1\u1b3d\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u085a\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\u1b3e\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1099\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u05e6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1b3f\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1b40\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1b41\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1b42\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b43\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u1b44\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u18c9\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1b45\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u18c9\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1b46\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1b47\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1b48"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0cc0"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0b80"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u05de"+
+ "\11\140\1\u0569\1\u0582\6\140\1\131\2\0\1\140\2\0"+
+ "\1\u0555\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u07c4\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u19ff\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1b49\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1b4a\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u18e3\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1b4c\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u1b4d\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1b4e\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b4f\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1b50\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1b51\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1642"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1b52\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1b53\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1b54"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b55"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u0810\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b56\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\7\140\1\u1b57\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u048a\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1b58\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u1a57\2\140\1\u0bc5"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b59"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1b5a"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1b5b\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b5c\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u13a3\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b5d\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b5e\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b5f\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b60\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1b61\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u176d\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1b62\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1b63\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1b64\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1b65\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1b66\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1b67\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1b68\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0f97\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u190d\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u1b69\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1b6a\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b6b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1b6c\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b6d"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u10f8\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b6e\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140\1\u035c"+
+ "\2\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1b6f"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1b70"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1b71\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b72\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u0e3e\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1b73\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1b74\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1b75\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u10c6\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u10c6\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1b76\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1b77\2\140\1\u17bc\7\140"+
+ "\1\u1b78\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u033a"+
+ "\5\140\1\u1b77\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1b79\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u0c84\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1228\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b7a"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1b7b\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1b7c\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1b7d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0326\1\u1b7e\1\u0cd7\2\140\1\u10e2\1\140\1\u0de4\3\140"+
+ "\1\u1b7f\5\140\1\u06dc\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1b80\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b81"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b82\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1b83\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0dac\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1010\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u07c4\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b84\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1b47\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0cc0\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1250\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0a09\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u03e5\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u083d\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1b85\3\140\1\u1b86"+
+ "\1\140\1\u1b87\4\140\1\u1b88\3\140\1\u1b89\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1b8a\5\140\1\u083a"+
+ "\6\140\1\u10cb\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b8b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1b8c\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1b8d\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u045e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1b8e\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1b8f\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u07a9"+
+ "\11\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1b90"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1b91"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1b92"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b93"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\4\140\1\u0224\3\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u079c\3\140"+
+ "\1\u1abf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1b94\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u17ce\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1b95\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\1\u1b96\16\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1b97\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b98"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1b99"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1b9a"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1b9b"+
+ "\2\140\1\u1aaf\7\140\1\u08c7\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1b9c\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u1b9d\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u0473\1\u1aaf\1\u0c77\3\140\1\u076f\3\140\1\u1b9e\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1a89\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u126d\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1b9f\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u0a64\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1ba0\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u1ba1\1\140\1\131"+
+ "\2\0\1\140\2\0";
+
+ private static final String ZZ_TRANS_PACKED_6 =
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ba2\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u07c4\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1ba3\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ba4\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1abc\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0a54\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u0e38\1\140\1\u06d9\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u03df\4\140\1\u1ba5\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1ba6\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1ba7\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u13fd\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u08ba\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1ba8\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u198b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1ba9\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1baa\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1bab\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1bac\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1bad\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1bae\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1baf\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1bb0\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0565\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1bb1\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1bb2"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u1bb3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1bb4\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1bb5\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1639\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1bb6\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1bb7\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u0532\7\140\1\u0da4\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u10f8\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1bb8\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1bb9\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u100e\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u1bba\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1adb\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1bbb\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1bbc"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1bbd\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1bbe\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1bbf\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0471\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1bc0\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1aeb\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1bc1\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1bc2\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1bc3\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1bc4\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1bc5\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0cba\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1bc6\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1bc7\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u09fe\10\140\1\u01aa\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u0dcf\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1bc8\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1bc9\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u1358\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1bca\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u05f2\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1bcb\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1bcc\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1bcd\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1bce\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u1bcf\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1228\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1bd0\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u134b\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1bd1\2\140\1\u1bd2\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1bd3\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u100c\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1bd4\7\140\1\u1bd5"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u1bd6\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u100c\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1bd5\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1bd7\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1bd8\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1bd9\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1bda\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u0569\5\140\1\u0553\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1bdb\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u0560\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1bdc\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1bdd\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1bde\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1bdf\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1be0\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1be1\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\15\140\1\u1be2\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1200\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1be3\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1be4\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1be5\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1be6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1be7\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1be8\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1be9\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1bea\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1beb\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1bec\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\23\140\1\u1bed\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1bee\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u037c\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1bef\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1bf0\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1bf1\13\140\1\u1bf2\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1bf3\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u1bf4\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1bf5\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1bf6\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1bf7\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1bf8\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u03de\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1bf9\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1bfa\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1b47\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u075a\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0a05\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\u0a9a\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1bfb"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1bfc\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u0b96\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1bfd\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0871\7\140"+
+ "\1\u0873\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1358"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1bfe"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1bff"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c00"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c01"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0752"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c02"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c03"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c04"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1baa"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\u061e\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u0379\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1c05\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1c06\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1c07\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\1\u0b53\16\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1c08\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1c09\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1c0a\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0cc0\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1c0b\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1c0c\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1c0d\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1c0e\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1529\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1c0f\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\u1c10\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c11"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1c12\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c13\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c14"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c15\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c16\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c17\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c18\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\14\140\1\u1c19\2\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1c1a\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u154f\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\2\140\1\u0597\5\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u07be\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c1c\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1002\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1c1d\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1e\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c1f\2\140"+
+ "\1\u1c20\2\140\1\u1c21\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u0dda\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u180c\1\140\1\u1c22\1\u1c23\1\140\1\u10b1"+
+ "\1\140\1\u1c24\4\140\1\u1c25\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1c26\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1c27\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c28"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1c29\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0999\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c2a"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c2b"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c2c"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1c2d"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c2e"+
+ "\2\140\1\u1c2f\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u01cb\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u08d8\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1c30\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1c31\1\140\1\u1b3f\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\5\140\1\u0928\1\140\1\u1c32\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1c33\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1c34\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1c35\16\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u19b6\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1c36\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1c37\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1c38\4\140\1\u117b\12\140\1\u1c39"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c3a\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1c3b\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1c3c\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0cd6\6\140\1\u1c3d\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1818\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u0baf\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c3e\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u12b2\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u159f\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1c3f\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1c40\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u051e\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1c41\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1c42\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u037c"+
+ "\3\140\1\u1c43\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1c44\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c45"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u17b4\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u1c46\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140"+
+ "\1\u1c47\2\140\1\u15b9\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1c48\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\1\u1c49\7\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u17ce\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u195b\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1c4a\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1c4b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1c4c\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u1c4d\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c4e"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1c4f\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1b99\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c50\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c51\3\140"+
+ "\1\u01d3\5\140\1\u11d6\3\140\1\u13c6\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u1c52\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1c53\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u0b84\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1c54\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1c55\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u07c4\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1c56\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0224\4\140\1\u1ab9\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1c57\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u084d\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1c58\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u08f6\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1c59\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u18c0\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1c5a\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u05de\2\140\1\u1c5b\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u0a62\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1c5c\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1c5d\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\2\140\1\u099b\5\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u19d1\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1c5e\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\17\140\1\u1c5f\4\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u0568\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1c60\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1c61\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u1adb\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\1\140\1\u0393\6\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1c62\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1c63\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\23\140\1\u1c64\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c65\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u1c66"+
+ "\16\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1c67"+
+ "\22\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u19af\1\u1c68"+
+ "\6\140\1\u19b1\2\140\1\u0352\1\140\1\u01cb\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1c69\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1c6a\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1c6b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1c6c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1b59\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u0b52\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u01a0\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1073\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1c6d\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1c6e\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1c6f\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1c70\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u16e2\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1c71\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1c72\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u19c5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1c73\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1c74\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1c75\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1c76"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c77"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c78"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1c79"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c7a"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c7b"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u19dd"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c7c"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1c7d"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1c7e"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1c7f"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c80"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1c81"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c82"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1c83"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u0749\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1c84\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c85\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1c86\2\140"+
+ "\1\u1c87\6\140\1\u1c88\1\u1c89\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1c8a\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1c8b\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1177\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1c8c\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1c8d\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u12c3\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1c8e\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1c8f\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1c90\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1c91\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\u1c92\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1c93"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1c94"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1c95"+
+ "\6\140\1\u0748\1\u075b\12\140\1\131\2\0\1\u1c96\2\0"+
+ "\1\u08b9\16\140\1\0\4\140\1\u0a20\3\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1c97\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\22\140\1\u1c98\1\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1c99\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1c9a\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u0565\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1c9b\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1c9c\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u17c4\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1c9d\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1c9e\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1c9f\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1a4e\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1ca0\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1ca1\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1ca2\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\u1ca3\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u09f7\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1ca4\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1ca5\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1ca6\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1ca7\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1ca8\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1ca9\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1caa\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u172d\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1cab\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1cac\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1cad\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1cae\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1caf\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1cb0\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1cb1\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u1cb2\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1782\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\4\140\1\u0224\4\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1cb3\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1cb4\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1cb5\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1002\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1cb6\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1cb7\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u0cf6\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1cb8\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1cb9\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1cba\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1cbb\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1cbc\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\10\140\1\u1cbd\13\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1cbe\6\140\1\u1cbf\4\140"+
+ "\1\u0c7a\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1cc0"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1cc1\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1cc2\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1cc3\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\21\140"+
+ "\1\u1cc4\2\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1cc5\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1178\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\u1cc6\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1cc7\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u1cc8\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1328\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1cc9\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1cca\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u035d\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1ccb\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1ccc\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1ccd\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u05f2\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1cce\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1ccf\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u1384\3\140\1\u03a2\11\140\1\u1258\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\5\140\1\u1384\3\140\1\u03a2\4\140"+
+ "\1\u07a8\4\140\1\u1258\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\u1cd0\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0bf5"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u0355"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1240"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u0d31"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1cd1"+
+ "\4\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1cd2"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1cd3"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1256"+
+ "\4\140\1\u10c0\1\u0d7e\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1cd4\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1cd5\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1cd6"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\17\140\1\u1cd7\4\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\1\u1cd8\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1cd9\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1cda\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\22\140\1\u1cdb\1\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1c51\11\140\1\u11d6\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1cdc\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1440\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1cdd\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1cde\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1cdf\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1ce0\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1ce1\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u0cef\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u1ce2\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1ce3\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1ce4\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1ce5\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1bae\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1ce6\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1ce7\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1ce8\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1ce9\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u055a\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1cea\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0af2\3\140\1\u0375\11\140\1\u1ceb\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1cec\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u19ab\5\140\1\u1ced\1\140"+
+ "\1\u1cee\7\140\1\u1cef\1\u19ad\1\140\1\u1827\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1cf0\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1cf1\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1cf2\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1cf3\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u084a\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1b85\1\u1cf4\1\u0375\1\140\1\u0e52"+
+ "\1\140\1\u0661\4\140\1\u1cf5\1\u1cf6\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1cf7\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1cf8\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0df5\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u0af2\1\u1cf9\1\140\1\u1cfa\4\140"+
+ "\1\u1cfb\1\u083a\12\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1cfc\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u1cfd\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u1a70\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1cfe\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1cff"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u0770"+
+ "\4\140\1\u046d\7\140\1\u1d00\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1d01\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1d02\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d03\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1d04\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\13\140\1\u1d05\10\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1d06\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d07\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d08"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1d09\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1d0a\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1d0b\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1d0c"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1d0d"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d0e"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1d0f"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d10"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1d11"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u1d12"+
+ "\5\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0e28"+
+ "\2\140\1\u1b18\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0ce9\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1d13\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u1d14\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d15"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1d16\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u17c4\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1d17\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1d18\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1d19\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0b0a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140"+
+ "\1\u16fa\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1d1a\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u01b7"+
+ "\15\140\1\u1d1b\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\11\140\1\u056e\11\140\1\u056e\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1d1c\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1bf7\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1c98\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1d1d\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d1e\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d1f\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1d20\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1ab8\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u040a\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d21\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1d22\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1d23\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1177\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1d24\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u1d25\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1d26\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u0224\2\140\1\u077b\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1d27\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1d28\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1d29\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u0e18\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u11ca\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1d2a\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d2b\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d2c"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1d2d\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1d2e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u12ab\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1d2f\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u0d47\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1d30"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\1\u1d31\16\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\140\1\u1a6a\16\140"+
+ "\1\u0df3\3\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0cf6\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1d32\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1d33\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u05e6\10\140\1\u1d34\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0670\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1d35\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d36\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d37\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1d38\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d39\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d3a"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1d3b\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1d3c"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1d3d"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u10ac"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1d3e"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u0eb2"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\1\u1d3f\7\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u10c6\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1d40\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u042f\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u1d41\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1d42\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\1\u0320\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u0d45\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1180\15\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u17ba\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1d43\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1d44\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1d45\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1d46\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1d47\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1d48\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1d49\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1d4a\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1d4b\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1d4c\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u0ea9\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d4d\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u08f6\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u13fd\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u1d4e\22\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1d4f\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1d50\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1d51\2\140\1\u046d\6\140\1\u10d9\6\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1d52\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1d53\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1d54\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u10f8\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u0843\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1d55\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1d56\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1d57\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1d58\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u19fb\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1d59\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1d5a\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1d5b\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d5c\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1d5d\1\u085b\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1d5e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\14\140\1\u1d5f\7\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1d60\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1d61\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u108d\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1d62\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1d63\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1d64\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1d65\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u1c73\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1d66\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1d67\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1d68\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1d69\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1d6a\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1d6b\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1d6c\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u0a64\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1d6d\5\140\1\u1d6e\5\140\1\u1d6f"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1d70\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1d71\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1d72\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1d73\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1d74\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1d75\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1ba8\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\1\u187e\7\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1d76\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1d77\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1d78\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1d79\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1d7a\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1d7b\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1d7c\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u1d7d\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1d7e\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\1\140"+
+ "\1\u1d7f\6\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0670\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u14b5\3\140\1\u1d80\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1d81\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1d82\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u0d7a\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1d83\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u1d84\1\140\1\u1bb7\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1d85\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u0484\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1d86\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1ca3\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1d87\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1d88\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1d89\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1d8a"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1d8b"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d8c"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u076c\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1d8d\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u0d86\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u0fcc\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d8e\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1d8f\1\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\23\140\1\u1d90\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1112\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1d91\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1d92\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1d93\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u175c\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u1a6a\6\140\1\u0cc2"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u0beb"+
+ "\3\140\1\u1d94\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d95\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1d96\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u127e\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u0a09\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1d97"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1d98\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1d99\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u19ff\5\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1d9a\14\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1d9b\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u03eb\15\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1d9c\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u0d27\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0f19\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1d9d\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\11\140\1\u1d9e\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1d9f\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u1da0\2\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\140\1\u0a9a\22\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1ce4\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1da1\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u076b\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1da2\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\u03b0\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1da3\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1da4\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1da5\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\140\1\u1da6\22\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1da7\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\16\140\1\u1da8\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1da9\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1daa"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u0cba\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1dab\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1dac\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u043e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1dad\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u07c4\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1dae\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u0839\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1daf\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1db0\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1db1"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140\1\u1db2"+
+ "\14\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1db3"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1db4\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1272\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1db5\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1db6\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1db7\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1db8\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1db9\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u1dba\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1dbb\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u1dbc\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1dbd\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1dbe\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1dbf\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1dc0\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1dc1\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1dc2"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1dc3\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u07c4\3\140\1\u0db5\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u07ab\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1dc4\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1dc5\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1dc6\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1dc7\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u0921\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\1\u06d9\16\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1dc8\3\140\1\u0d3a\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1dc9\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u1dca\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u07a8\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u1baa\3\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1dcb\6\140\1\u1dcc\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1dcd\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1caa\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\23\140\1\u1dce\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\23\140\1\u0eaf\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1dcf\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1dd0\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1caf\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u0aed\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1dd1\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u07c9\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1dd2\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1dd3\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u0f96\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u0cc0\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1dd4"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1dd5\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1dd6\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u1dd7\7\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\17\140"+
+ "\1\u1dd8\4\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1dd9\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u0f19\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1dda"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1ddb\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ddc\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1ddd\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1dde\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1ddf\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0569\1\140\1\u1de0\1\140\1\u0df3\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1de1\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\12\140\1\u1de2\11\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\21\140\1\u1de3\2\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1de4\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u1de5\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1de6\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1de7\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\6\140\1\u1de8\1\140\1\u1cee\13\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1de9\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1dea\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1deb\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1cfa\5\140\1\u083a\12\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1dec\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1ded\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1dee\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1def\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1df0\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\16\140\1\u1c38\5\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1df1\1\u1df2\1\u1df3\1\u1df4\4\140"+
+ "\1\u1df2\1\140\1\u1df5\11\140\1\131\2\0\1\u1df6\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1df7\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1df8\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1df9\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1dfa\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1dfb\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1dfc\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1dfd\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1dfe\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1dff\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1e00\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1e01\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1e02\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\16\140"+
+ "\1\u1e03\5\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e04"+
+ "\3\140\1\u1016\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1e05\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1abf\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1e06\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1e07\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1e08\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1e09\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1e0a\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u1e0b\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\6\140\1\u190d\15\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1e0c\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1e0d\23\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1e0e\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1e0f\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u0615\2\140\1\u1d94\5\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u16f3\1\140\1\u0c25\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u16f3\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\7\140\1\u1b84\14\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0329\12\140\1\u1e10\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e11\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u195e\1\140"+
+ "\1\u195b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u121d\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\23\140"+
+ "\1\u1e12\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e13\23\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e14\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1e15\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1e16\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1e17\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1e18\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1e19\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1073\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1e1a\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1e1b\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1e1c\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u10f8\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u0a5a\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u1e1d\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1e1e\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1d24\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1e1f\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1b84\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u0a09\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1e20\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1bd5\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u0694\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1e21\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1e22\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1e23\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1e24\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1e25\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1e26\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u07f7\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1e27\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u1e28\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1e29\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1e2a\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140"+
+ "\1\u1e2b\6\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1e2c\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\u1e2d"+
+ "\23\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1e2e"+
+ "\6\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1e2f"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1e30"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1e31"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1e32\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1e33\10\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1e34\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u052f\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1e35\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u0a75\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\15\140\1\u0a9a\6\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1e36\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1e37\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1e38\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1e39\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1e3a\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1e3b\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u082b\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\12\140\1\u14ad\11\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\7\140\1\u0f97\14\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\22\140\1\u0348\1\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1367\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1e3c\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1a18\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1e3d\20\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u10e2\16\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1e3e\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1e3f\11\140\1\u0596\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1e40\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\3\140\1\u1e41\20\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\140\1\u1e42\22\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1e43\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1e44\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1e45\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\11\140\1\u1e46\12\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\2\140\1\u1e47\21\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1e48\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1e49\16\140\1\u1e4a\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1e4b\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1e4c\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1e4d\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\20\140\1\u1e4e\3\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1b27\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1e4f\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1d0d\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1e50\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1e51\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1178\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1e52\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1e53\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1e54\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\16\140\1\u1e55\5\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1d15\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\140\1\u056a\13\140\1\u1e56\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1e57\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\16\140\1\u1e58\5\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\3\140\1\u1e59\3\140\1\u0449\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1a4c\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\u1e5a\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1e5b\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1e5c\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\u05ba\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1e5d\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\7\140"+
+ "\1\u1e5e\14\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1e5f\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140"+
+ "\1\u1e60\21\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1e61\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140"+
+ "\1\u0c3c\1\140\1\u1e62\1\u1e63\1\u1e64\3\140\1\131\2\0"+
+ "\1\140\2\0\1\u1e65\16\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\3\140\1\u1e66\20\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1e67\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1e68\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\10\140\1\u1e69\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\14\140\1\u1e6a\7\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\1\u1e6b\23\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1e6c\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\10\140\1\u1e6d\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1e6e\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1e6f\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\14\140\1\u1e27\7\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1e70\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1e71\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1e72\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\6\140\1\u1178\15\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1e73\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1e74\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1e75\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1aeb\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1e76\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\7\140\1\u1e77\14\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\4\140\1\u1e78\17\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1e09\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1e79\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\22\140\1\u1e7a\1\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1e7b"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\1\140"+
+ "\1\u1e7c\22\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\12\140"+
+ "\1\u1e7d\11\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1e7e\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1e7f\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u1e80"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e81"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1e82"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e83"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e84"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140\1\u06dc"+
+ "\15\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1e85"+
+ "\20\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1391"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1e86"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1e87"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\22\140\1\u1e88"+
+ "\1\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1e89"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1e8a\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u18be\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u1d0d\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\17\140\1\u1e8b\4\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u1e8c\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1e8d\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\13\140\1\u1e8e\10\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1e8f\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\15\140\1\u1e90\6\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\4\140\1\u1e91\17\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\140\1\u1e92\22\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\17\140\1\u1e93\4\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\6\140\1\u1e94\15\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\5\140\1\u0329\10\140\1\u0d86\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1e95\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\20\140\1\u1de6\3\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\16\140\1\u1e96\5\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\21\140\1\u19ad\1\140\1\u1827"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1926\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1e97\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1e98\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1e99\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\6\140\1\u1e9a\15\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1e9b\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\5\140\1\u1e9c\16\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1e9d\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\4\140\1\u1e47\17\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u1e9e"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\23\140\1\u1e9f\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1ea0\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1ea1\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1ea2\17\140\1\u1d7a\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1ea3\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1ea4\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u0cba\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1ea5\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ea6\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1112\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u17d4\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1ea7\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1ea8\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1926\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1ea9\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u1926\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\20\140\1\u14e3\3\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1eaa"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140"+
+ "\1\u1eab\10\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140"+
+ "\1\u1eac\17\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140"+
+ "\1\u1ead\13\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\6\140"+
+ "\1\u1eae\15\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\3\140"+
+ "\1\u1eaf\20\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\u1eb0"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u1eb1\7\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u1eb2\12\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\3\140\1\u1eb3\20\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1eb4\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\u0527"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\1\u1eb5\23\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\21\140\1\u1eb6\2\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\12\140\1\u1eb7\11\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\10\140\1\u1eb8\13\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1eb9\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\3\140\1\u1eba\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1ebb\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u1ebc\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ebd\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\15\140\1\u130b\6\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1ebe\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ebf\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u0615\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\1\u1ec0\2\140\1\u0f62\20\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1ec1\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\4\140\1\u1ec2\17\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\7\140\1\u1ec3\14\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\2\140\1\u1ec4\21\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\20\140\1\u1ec5\3\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\10\140"+
+ "\1\u1ec6\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\24\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\2\140\1\u1ec7\21\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\21\140\1\u1ec8\2\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\5\140\1\u1178\16\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\3\140\1\u1ec9\20\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\15\140\1\u1eca\6\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\14\140\1\u1ecb\7\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\12\140\1\u1ecc\11\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1ecd\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1ece\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\17\140\1\u1ecf\4\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ed0"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\11\140\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140"+
+ "\1\u1ed1\12\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ed2\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1ed3"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\13\140\1\u1ed4"+
+ "\10\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1ed5"+
+ "\21\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\10\140\1\u1ed6"+
+ "\13\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\20\140\1\u1ed7"+
+ "\3\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\10\140\1\u1ed8\1\0\1\140"+
+ "\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\10\140\1\u1ed9\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\7\140\1\u1eda\14\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\2\140\1\u1edb\21\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\12\140\1\u1edc\11\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1edd\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u14d7\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\10\140\1\u1ede\13\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\1\u1edf\23\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\2\140\1\u0f9b\21\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\10\140\1\u1176\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\24\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\10\140\1\u1ee0\13\140\1\131\2\0\1\140"+
+ "\2\0\17\140\1\0\10\140\1\131\10\0\6\140\1\0"+
+ "\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0"+
+ "\2\140\13\0\20\140\1\u12a0\3\140\1\131\2\0\1\140"+
+ "\2\0\1\u12a0\16\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\4\140\1\u1ee1\17\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\13\140\1\u1ee2\10\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\11\140\1\u1ee3\12\140\1\131\2\0"+
+ "\1\140\2\0\17\140\1\0\10\140\1\131\10\0\6\140"+
+ "\1\0\11\140\1\0\1\u1ee4\1\0\1\131\1\u0140\1\140"+
+ "\1\0\2\140\13\0\24\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\11\140\1\u1ee5\12\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\13\140\1\u1ee6\10\140\1\131\2\0\1\140\2\0"+
+ "\17\140\1\0\10\140\1\131\10\0\6\140\1\0\11\140"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\1\u1ee7\23\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\11\140\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\10\140\1\u1ee8\13\140\1\131\2\0\1\140\2\0\17\140"+
+ "\1\0\10\140\1\131\10\0\6\140\1\0\10\140\1\u1ee9"+
+ "\1\0\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140"+
+ "\13\0\24\140\1\131\2\0\1\140\2\0\17\140\1\0"+
+ "\10\140\1\131\10\0\6\140\1\0\10\140\1\u1eea\1\0"+
+ "\1\140\1\0\1\131\1\u0140\1\140\1\0\2\140\13\0"+
+ "\24\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\11\140\1\u0c6a"+
+ "\12\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u1eeb"+
+ "\17\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\14\140\1\u0e34"+
+ "\7\140\1\131\2\0\1\140\2\0\17\140\1\0\10\140"+
+ "\1\131\10\0\6\140\1\0\11\140\1\0\1\140\1\0"+
+ "\1\131\1\u0140\1\140\1\0\2\140\13\0\24\140\1\131"+
+ "\2\0\1\140\2\0\16\140\1\u0a9a\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\12\140\1\u1eec\11\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\u1cb2\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\16\140\1\u0d86\5\140"+
+ "\1\131\2\0\1\u03b0\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\5\140\1\u09e7\16\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\15\140\1\u1eed\6\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\4\140\1\u056a\17\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\2\140\1\u1eee\21\140"+
+ "\1\131\2\0\1\140\2\0\17\140\1\0\10\140\1\131"+
+ "\10\0\6\140\1\0\11\140\1\0\1\140\1\0\1\131"+
+ "\1\u0140\1\140\1\0\2\140\13\0\1\u1eef\23\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\13\140\1\u1ef0\10\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140\1\131\10\0"+
+ "\6\140\1\0\11\140\1\0\1\140\1\0\1\131\1\u0140"+
+ "\1\140\1\0\2\140\13\0\14\140\1\u1ef1\7\140\1\131"+
+ "\2\0\1\140\2\0\17\140\1\0\10\140";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[734730];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_2, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_3, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_4, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_5, offset, result);
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_6, 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 =
+ "\5\0\2\1\1\0\2\1\1\0\2\1\13\0\1\1"+
+ "\3\0\2\1\1\11\4\1\1\11\5\1\2\11\3\1"+
+ "\1\11\1\1\3\11\1\1\1\11\26\1\1\11\1\1"+
+ "\1\11\1\1\6\11\1\1\1\11\2\1\1\11\2\1"+
+ "\2\11\10\1\1\11\3\1\1\11\17\1\1\11\3\1"+
+ "\1\11\1\1\1\11\1\1\2\11\2\1\1\11\6\1"+
+ "\1\11\4\1\1\11\1\1\1\11\34\1\1\11\5\1"+
+ "\1\11\2\1\2\11\2\1\1\11\1\1\3\11\1\1"+
+ "\1\11\5\1\4\11\4\1\4\11\1\1\1\11\6\1"+
+ "\7\11\6\1\1\11\5\0\105\1\1\11\2\0\1\1"+
+ "\1\0\1\11\1\0\75\1\1\11\2\1\1\0\1\11"+
+ "\11\0\12\1\1\11\304\1\2\11\1\1\1\11\1\0"+
+ "\1\11\1\1\15\0\1\1\1\11\5\0\1\1\1\0"+
+ "\1\11\3\1\2\0\1\11\4\0\101\1\3\0\1\1"+
+ "\1\0\3\1\1\0\67\1\14\0\u0181\1\25\0\2\1"+
+ "\1\11\3\0\45\1\3\0\1\11\43\1\1\0\1\11"+
+ "\3\0\1\1\3\0\u01fa\1\20\0\1\11\3\0\2\1"+
+ "\1\11\2\0\25\1\1\11\1\0\1\11\25\1\6\0"+
+ "\u0277\1\16\0\14\1\1\0\14\1\2\0\u02b1\1\12\0"+
+ "\4\1\1\0\6\1\2\0\u02d4\1\6\0\1\1\1\0"+
+ "\2\1\2\0\u029f\1\1\11\4\0\1\1\1\11\1\1"+
+ "\2\11\u0265\1\3\0\u021a\1\3\0\1\11\u0837\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[7921];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to PHPTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ private static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to PHPTokenMaker; this signals that the user has
+ * ended a line with an unclosed HTML tag; thus a new line is beginning
+ * still inside of the tag.
+ */
+ private static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to PHPTokenMaker; this signals that the user has
+ * ended a line with an unclosed <code><script></code> tag.
+ */
+ private static final int INTERNAL_INTAG_SCRIPT = -4;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT = -5;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * script tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT = -6;
+
+ /**
+ * Token type specifying that the user has
+ * ended a line with an unclosed <code><style></code> tag.
+ */
+ private static final int INTERNAL_INTAG_STYLE = -7;
+
+ /**
+ * Token type specifying we're in a double-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_DOUBLE_QUOTE_STYLE = -8;
+
+ /**
+ * Token type specifying we're in a single-qouted attribute in a
+ * style tag.
+ */
+ private static final int INTERNAL_ATTR_SINGLE_QUOTE_STYLE = -9;
+
+ /**
+ * Token type specifying we're in JavaScript.
+ */
+ private static final int INTERNAL_IN_JS = -10;
+
+ /**
+ * Token type specifying we're in a JavaScript multiline comment.
+ */
+ private static final int INTERNAL_IN_JS_MLC = -11;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_INVALID = -12;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS string.
+ */
+ private static final int INTERNAL_IN_JS_STRING_VALID = -13;
+
+ /**
+ * Token type specifying we're in an invalid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_INVALID = -14;
+
+ /**
+ * Token type specifying we're in a valid multi-line JS single-quoted string.
+ */
+ private static final int INTERNAL_IN_JS_CHAR_VALID = -15;
+
+ /**
+ * Internal type denoting a line ending in CSS.
+ */
+ private static final int INTERNAL_CSS = -16;
+
+ /**
+ * Internal type denoting a line ending in a CSS property.
+ */
+ private static final int INTERNAL_CSS_PROPERTY = -17;
+
+ /**
+ * Internal type denoting a line ending in a CSS property value.
+ */
+ private static final int INTERNAL_CSS_VALUE = -18;
+
+ /**
+ * Internal type denoting line ending in a CSS double-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_STRING = -(1<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS single-quote string.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_CHAR = -(2<<11);
+
+ /**
+ * Internal type denoting line ending in a CSS multi-line comment.
+ * The state to return to is embedded in the actual end token type.
+ */
+ private static final int INTERNAL_CSS_MLC = -(3<<11);
+
+ /**
+ * Token type specifying we're in PHP. This particular field is public so
+ * that we can hack and key off of it for code completion.
+ */
+ public static final int INTERNAL_IN_PHP = -(4<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline comment.
+ */
+ private static final int INTERNAL_IN_PHP_MLC = -(5<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline string.
+ */
+ private static final int INTERNAL_IN_PHP_STRING = -(6<<11);
+
+ /**
+ * Token type specifying we're in a PHP multiline char.
+ */
+ private static final int INTERNAL_IN_PHP_CHAR = -(7<<11);
+
+ /**
+ * The state previous CSS-related state we were in before going into a CSS
+ * string, multi-line comment, etc.
+ */
+ private int cssPrevState;
+
+ /**
+ * Whether closing markup tags are automatically completed for PHP.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * The state PHP was started in (YYINITIAL, INTERNAL_IN_JS, etc.).
+ */
+ private int phpInState;
+
+ /**
+ * When in the JS_STRING state, whether the current string is valid.
+ */
+ private boolean validJSString;
+
+ /**
+ * Language state set on HTML tokens. Must be 0.
+ */
+ private static final int LANG_INDEX_DEFAULT = 0;
+
+ /**
+ * Language state set on JavaScript tokens.
+ */
+ private static final int LANG_INDEX_JS = 1;
+
+ /**
+ * Language state set on CSS tokens.
+ */
+ private static final int LANG_INDEX_CSS = 2;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PHPTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.FUNCTION || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ phpInState = YYINITIAL; // Shouldn't be necessary
+ cssPrevState = CSS; // Shouldn't be necessary
+ int languageIndex = LANG_INDEX_DEFAULT;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case Token.VARIABLE:
+ state = DTD;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case INTERNAL_INTAG_SCRIPT:
+ state = INTAG_SCRIPT;
+ break;
+ case INTERNAL_INTAG_STYLE:
+ state = INTAG_STYLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT:
+ state = INATTR_DOUBLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT:
+ state = INATTR_SINGLE_SCRIPT;
+ break;
+ case INTERNAL_ATTR_DOUBLE_QUOTE_STYLE:
+ state = INATTR_DOUBLE_STYLE;
+ break;
+ case INTERNAL_ATTR_SINGLE_QUOTE_STYLE:
+ state = INATTR_SINGLE_STYLE;
+ break;
+ case INTERNAL_IN_JS:
+ state = JAVASCRIPT;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_MLC:
+ state = JS_MLC;
+ languageIndex = LANG_INDEX_JS;
+ break;
+ case INTERNAL_IN_JS_STRING_INVALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_STRING_VALID:
+ state = JS_STRING;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_IN_JS_CHAR_INVALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = false;
+ break;
+ case INTERNAL_IN_JS_CHAR_VALID:
+ state = JS_CHAR;
+ languageIndex = LANG_INDEX_JS;
+ validJSString = true;
+ break;
+ case INTERNAL_CSS:
+ state = CSS;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_PROPERTY:
+ state = CSS_PROPERTY;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ case INTERNAL_CSS_VALUE:
+ state = CSS_VALUE;
+ languageIndex = LANG_INDEX_CSS;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_PHPxxx - phpInState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_PHP:
+ state = PHP;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_MLC:
+ state = PHP_MLC;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_STRING:
+ state = PHP_STRING;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_IN_PHP_CHAR:
+ state = PHP_CHAR;
+ phpInState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_STRING:
+ state = CSS_STRING;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_CHAR:
+ state = CSS_CHAR_LITERAL;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ case INTERNAL_CSS_MLC:
+ state = CSS_C_STYLE_COMMENT;
+ languageIndex = LANG_INDEX_CSS;
+ cssPrevState = -initialTokenType&0xff;
+ break;
+ }
+ }
+ else {
+ state = Token.NULL;
+ }
+ break;
+ }
+
+ setLanguageIndex(languageIndex);
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed. You might not want
+ * this to be the case, since some tags in standard HTML aren't usually
+ * closed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public PHPTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public PHPTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 206) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 97:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 120: break;
+ case 65:
+ { addToken(Token.OPERATOR); yybegin(CSS_VALUE);
+ }
+ case 121: break;
+ case 84:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 122: break;
+ case 73:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 123: break;
+ case 23:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_SCRIPT);
+ }
+ case 124: break;
+ case 9:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD);
+ }
+ case 125: break;
+ case 60:
+ { addToken(Token.SEPARATOR); yybegin(CSS_PROPERTY);
+ }
+ case 126: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 127: break;
+ case 112:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 128: break;
+ case 100:
+ { addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); yybegin(cssPrevState);
+ }
+ case 129: break;
+ case 98:
+ { start = zzMarkedPos-2; cssPrevState = zzLexicalState; yybegin(CSS_C_STYLE_COMMENT);
+ }
+ case 130: break;
+ case 36:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_CHAR);
+ addEndToken(INTERNAL_IN_JS_CHAR_INVALID);
+ }
+ return firstToken;
+ }
+ case 131: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 132: break;
+ case 45:
+ { addToken(Token.COMMENT_EOL); addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+ }
+ case 133: break;
+ case 114:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; yybegin(INTAG_SCRIPT);
+ }
+ case 134: break;
+ case 99:
+ { addToken(Token.REGEX);
+ }
+ case 135: break;
+ case 41:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 136: break;
+ case 118:
+ { int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL);
+ yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 137: break;
+ case 94:
+ { addToken(Token.FUNCTION);
+ }
+ case 138: break;
+ case 38:
+ { addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 139: break;
+ case 56:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_STRING);
+ }
+ case 140: break;
+ case 25:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_STYLE);
+ }
+ case 141: break;
+ case 87:
+ { /* Skip all escaped chars. */
+ }
+ case 142: break;
+ case 81:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(YYINITIAL);
+ }
+ case 143: break;
+ case 28:
+ { yybegin(INTAG_STYLE); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 144: break;
+ case 109:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.6")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 145: break;
+ case 104:
+ { if(JavaScriptTokenMaker.isJavaScriptCompatible("1.7")){ addToken(Token.RESERVED_WORD);} else {addToken(Token.IDENTIFIER);}
+ }
+ case 146: break;
+ case 44:
+ { start = zzMarkedPos-1; yybegin(PHP_STRING);
+ }
+ case 147: break;
+ case 66:
+ { /*System.out.println("css_value: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 148: break;
+ case 16:
+ { /* A non-recognized HTML tag name */ yypushback(yylength()); yybegin(INTAG);
+ }
+ case 149: break;
+ case 26:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(CSS, LANG_INDEX_CSS);
+ }
+ case 150: break;
+ case 74:
+ { addToken(start,zzStartRead, Token.LITERAL_CHAR); yybegin(cssPrevState);
+ }
+ case 151: break;
+ case 27:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE_STYLE);
+ }
+ case 152: break;
+ case 19:
+ { /* Allowing "<?" and "<?php" to start PHP */
+ }
+ case 153: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 154: break;
+ case 89:
+ { /* Invalid latin-1 character \xXX */ validJSString = false;
+ }
+ case 155: break;
+ case 39:
+ { int type = validJSString ? Token.LITERAL_STRING_DOUBLE_QUOTE : Token.ERROR_STRING_DOUBLE; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 156: break;
+ case 107:
+ { addToken(Token.COMMENT_MULTILINE);
+ }
+ case 157: break;
+ case 115:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-6,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 158: break;
+ case 78:
+ { addToken(Token.MARKUP_TAG_DELIMITER); phpInState = zzLexicalState; yybegin(PHP);
+ }
+ case 159: break;
+ case 61:
+ { /*System.out.println("css_property: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 160: break;
+ case 8:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 161: break;
+ case 76:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 162: break;
+ case 50:
+ { /* Skip escaped chars. */
+ }
+ case 163: break;
+ case 88:
+ { /* Invalid Unicode character \\uXXXX */ validJSString = false;
+ }
+ case 164: break;
+ case 113:
+ { addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-5,zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ start = zzMarkedPos; cssPrevState = zzLexicalState; yybegin(INTAG_STYLE);
+ }
+ case 165: break;
+ case 90:
+ { yybegin(JAVASCRIPT); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 166: break;
+ case 30:
+ { addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 167: break;
+ case 43:
+ { addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+ }
+ case 168: break;
+ case 35:
+ { addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 169: break;
+ case 14:
+ { addToken(Token.OPERATOR);
+ }
+ case 170: break;
+ case 68:
+ { addToken(Token.OPERATOR); yybegin(CSS_PROPERTY);
+ }
+ case 171: break;
+ case 105:
+ { start = zzMarkedPos-4; yybegin(COMMENT);
+ }
+ case 172: break;
+ case 102:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+2, Token.MARKUP_COMMENT);
+ }
+ case 173: break;
+ case 79:
+ { addToken(Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+ }
+ case 174: break;
+ case 92:
+ { addToken(Token.VARIABLE);
+ }
+ case 175: break;
+ case 54:
+ { /*System.out.println("CSS: " + yytext());*/ addToken(Token.IDENTIFIER);
+ }
+ case 176: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 177: break;
+ case 80:
+ { int temp=zzStartRead; if (zzStartRead>start) addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addToken(temp, zzMarkedPos-1, Token.SEPARATOR); phpInState = zzLexicalState; yybegin(PHP);
+ }
+ case 178: break;
+ case 110:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 179: break;
+ case 22:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(JAVASCRIPT, LANG_INDEX_JS);
+ }
+ case 180: break;
+ case 111:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 181: break;
+ case 91:
+ { start = zzMarkedPos-2; yybegin(PHP_MLC);
+ }
+ case 182: break;
+ case 52:
+ { /* Skip escaped single quotes only, but this should still work. */
+ }
+ case 183: break;
+ case 64:
+ { addToken(Token.SEPARATOR); yybegin(CSS);
+ }
+ case 184: break;
+ case 117:
+ { yybegin(YYINITIAL);
+ int temp = zzStartRead;
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE);
+ addToken(temp,temp+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 185: break;
+ case 31:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_STRING);
+ }
+ case 186: break;
+ case 47:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+ }
+ case 187: break;
+ case 72:
+ { addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(cssPrevState);
+ }
+ case 188: break;
+ case 62:
+ { addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 189: break;
+ case 37:
+ { int type = validJSString ? Token.LITERAL_CHAR : Token.ERROR_CHAR; addToken(start,zzStartRead, type); yybegin(JAVASCRIPT);
+ }
+ case 190: break;
+ case 95:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.FUNCTION);
+ zzMarkedPos -= (count-1); //yypushback(count-1);
+ }
+ case 191: break;
+ case 34:
+ { start = zzMarkedPos-1; validJSString = true; yybegin(JS_CHAR);
+ }
+ case 192: break;
+ case 24:
+ { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG_SCRIPT);
+ }
+ case 193: break;
+ case 83:
+ { start = zzMarkedPos-2; yybegin(JS_MLC);
+ }
+ case 194: break;
+ case 86:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 195: break;
+ case 70:
+ { int temp = zzMarkedPos - 2;
+ addToken(zzStartRead, temp, Token.FUNCTION);
+ addToken(zzMarkedPos-1, zzMarkedPos-1, Token.SEPARATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos;
+ }
+ case 196: break;
+ case 119:
+ { addToken(Token.ANNOTATION);
+ }
+ case 197: break;
+ case 96:
+ { yybegin(PHP); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 198: break;
+ case 49:
+ { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 199: break;
+ case 29:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 200: break;
+ case 67:
+ { addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 201: break;
+ case 106:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+ }
+ case 202: break;
+ case 6:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 203: break;
+ case 108:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 204: break;
+ case 17:
+ { /* Shouldn't happen */ yypushback(1); yybegin(INTAG);
+ }
+ case 205: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 206: break;
+ case 55:
+ { addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 207: break;
+ case 116:
+ { yybegin(YYINITIAL, LANG_INDEX_DEFAULT);
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-7,zzMarkedPos-2, Token.MARKUP_TAG_NAME);
+ addToken(zzMarkedPos-1,zzMarkedPos-1, Token.MARKUP_TAG_DELIMITER);
+ }
+ case 208: break;
+ case 59:
+ { start = zzMarkedPos-1; cssPrevState = zzLexicalState; yybegin(CSS_CHAR_LITERAL);
+ }
+ case 209: break;
+ case 63:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 210: break;
+ case 51:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+ }
+ case 211: break;
+ case 11:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+ }
+ case 212: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 213: break;
+ case 93:
+ { addToken(Token.MARKUP_TAG_DELIMITER); start = zzMarkedPos; yybegin(phpInState);
+ }
+ case 214: break;
+ case 57:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 215: break;
+ case 53:
+ { yybegin(PHP); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 216: break;
+ case 33:
+ { addToken(Token.SEPARATOR);
+ }
+ case 217: break;
+ case 101:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ zzMarkedPos -= (count-2); //yypushback(count-2);
+ yybegin(INTAG_CHECK_TAG_NAME);
+ }
+ case 218: break;
+ case 71:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 219: break;
+ case 69:
+ { /* End of a function */ addToken(Token.SEPARATOR);
+ }
+ case 220: break;
+ case 18:
+ { addToken(Token.MARKUP_TAG_NAME);
+ }
+ case 221: break;
+ case 10:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 222: break;
+ case 46:
+ { start = zzMarkedPos-1; yybegin(PHP_CHAR);
+ }
+ case 223: break;
+ case 48:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+ }
+ case 224: break;
+ case 82:
+ { start = zzMarkedPos-2; yybegin(JS_EOL_COMMENT);
+ }
+ case 225: break;
+ case 40:
+ { /* Line ending in '\' => continue to next line. */
+ if (validJSString) {
+ addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ addEndToken(INTERNAL_IN_JS_STRING_VALID);
+ }
+ else {
+ addToken(start,zzStartRead, Token.ERROR_STRING_DOUBLE);
+ addEndToken(INTERNAL_IN_JS_STRING_INVALID);
+ }
+ return firstToken;
+ }
+ case 226: break;
+ case 85:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 227: break;
+ case 15:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+ }
+ case 228: break;
+ case 103:
+ { boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (RSyntaxUtilities.regexCanFollowInJavaScript(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 229: break;
+ case 75:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 230: break;
+ case 12:
+ { addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 231: break;
+ case 32:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 232: break;
+ case 77:
+ { start = zzMarkedPos-2; yybegin(DTD);
+ }
+ case 233: break;
+ case 20:
+ { addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); yybegin(INTAG);
+ }
+ case 234: break;
+ case 21:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE_SCRIPT);
+ }
+ case 235: break;
+ case 42:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 236: break;
+ case 58:
+ { /* Unknown pseudo class */ addToken(Token.DATA_TYPE);
+ }
+ case 237: break;
+ case 1:
+ {
+ }
+ case 238: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case PHP: {
+ addEndToken(INTERNAL_IN_PHP - phpInState); return firstToken;
+ }
+ case 7922: break;
+ case INATTR_SINGLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 7923: break;
+ case JS_CHAR: {
+ addToken(start,zzStartRead-1, Token.ERROR_CHAR); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 7924: break;
+ case CSS_STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_CSS_STRING - cssPrevState); return firstToken;
+ }
+ case 7925: break;
+ case JS_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_JS_MLC); return firstToken;
+ }
+ case 7926: break;
+ case CSS_CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_CSS_CHAR - cssPrevState); return firstToken;
+ }
+ case 7927: break;
+ case INTAG_SCRIPT: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_SCRIPT); return firstToken;
+ }
+ case 7928: break;
+ case CSS_PROPERTY: {
+ addEndToken(INTERNAL_CSS_PROPERTY); return firstToken;
+ }
+ case 7929: break;
+ case CSS_C_STYLE_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_CSS_MLC - cssPrevState); return firstToken;
+ }
+ case 7930: break;
+ case PHP_MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addEndToken(INTERNAL_IN_PHP_MLC - phpInState); return firstToken;
+ }
+ case 7931: break;
+ case CSS: {
+ addEndToken(INTERNAL_CSS); return firstToken;
+ }
+ case 7932: break;
+ case CSS_VALUE: {
+ addEndToken(INTERNAL_CSS_VALUE); return firstToken;
+ }
+ case 7933: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); return firstToken;
+ }
+ case 7934: break;
+ case INATTR_DOUBLE_SCRIPT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_SCRIPT); return firstToken;
+ }
+ case 7935: break;
+ case PHP_STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_IN_PHP_STRING - phpInState); return firstToken;
+ }
+ case 7936: break;
+ case JAVASCRIPT: {
+ addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 7937: break;
+ case INTAG: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 7938: break;
+ case INTAG_CHECK_TAG_NAME: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG); return firstToken;
+ }
+ case 7939: break;
+ case INATTR_SINGLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE_QUOTE_STYLE); return firstToken;
+ }
+ case 7940: break;
+ case DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); return firstToken;
+ }
+ case 7941: break;
+ case PHP_CHAR: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); addEndToken(INTERNAL_IN_PHP_CHAR - phpInState); return firstToken;
+ }
+ case 7942: break;
+ case JS_EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 7943: break;
+ case INATTR_DOUBLE_STYLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE_QUOTE_STYLE); return firstToken;
+ }
+ case 7944: break;
+ case INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+ }
+ case 7945: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 7946: break;
+ case INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+ }
+ case 7947: break;
+ case JS_STRING: {
+ addToken(start,zzStartRead-1, Token.ERROR_STRING_DOUBLE); addEndToken(INTERNAL_IN_JS); return firstToken;
+ }
+ case 7948: break;
+ case INTAG_STYLE: {
+ addToken(zzMarkedPos,zzMarkedPos, INTERNAL_INTAG_STYLE); return firstToken;
+ }
+ case 7949: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex
new file mode 100644
index 0000000..c7117d4
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex
@@ -0,0 +1,810 @@
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated PerlTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PerlTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an single quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -3;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an single quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -4;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals we are in a POD
+ * block.
+ */
+ public static final int INTERNAL_POD = -5;
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PerlTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ start = text.offset;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_UNQUOTED:
+ state = HEREDOC_EOF_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+ state = HEREDOC_EOF_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_UNQUOTED:
+ state = HEREDOC_EOT_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+ state = HEREDOC_EOT_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_POD:
+ state = POD;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether a regular expression token can follow the specified
+ * token.
+ *
+ * @param t The token to check, which may be <code>null</code>.
+ * @return Whether a regular expression token may follow this one.
+ */
+ private static final boolean regexCanFollow(Token t) {
+ char ch;
+ // We basically try to mimic Eclipse's JS editor's behavior here.
+ return t==null ||
+ //t.isOperator() ||
+ (t.textCount==1 && (
+ (ch=t.text[t.textOffset])=='=' ||
+ ch=='(' ||
+ ch==',' ||
+ ch=='?' ||
+ ch==':' ||
+ ch=='[' ||
+ ch=='!' ||
+ ch=='&'
+ )) ||
+ /* Operators "==", "===", "!=", "!==", etc. */
+ (t.type==Token.OPERATOR &&
+ ((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+/*Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)))*/
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+IdentifierStart = ({Letter}|"_")
+IdentifierPart = ({IdentifierStart}|{Digit})
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+LineCommentBegin = "#"
+
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;:,.])
+
+VariableStart = ([\$\@\%)]"$"?)
+BracedVariable = ({VariableStart}\{{Identifier}\})
+UnbracedVariable = ({VariableStart}{Identifier})
+BracedShellVariable = ([\$]\{[\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)\}])
+UnbracedShellVariable = ([\$][\&\`\'\+\*\.\/\|\,\\\"\;\#\%\=\-\~\^\:\?\!\@\$\<\>\)\(\[\]\)])
+MatchVariable = ([\$]{Digit})
+Variable = ({BracedVariable}|{UnbracedVariable}|{BracedShellVariable}|{UnbracedShellVariable}|{MatchVariable})
+Regex = ("/"([^\*\\/]|\\.)([^/\\]|\\.)*"/"[msixpogcadlu]*)
+
+NonAssignmentOperator = ("+"|"-"|"<="|"^"|"++"|"<"|"*"|">="|"%"|"--"|">"|"/"|"!="|"?"|">>"|"!"|"&"|"=="|":"|">>"|"~"|"|"|"&&"|">>>"|"->")
+AssignmentOperator = ("="|"-="|"*="|"/="|"|="|"&="|"^="|"+="|"%="|"<<="|">>="|">>>=")
+BindingOperator = ("=~"|"!~")
+FunnyOperator = (([\*][\'\"])|([\&][\'\"]))
+Operator = ({NonAssignmentOperator}|{AssignmentOperator}|{BindingOperator}|{FunnyOperator})
+
+PodCommandsExceptCut = ("="("pod"|"head1"|"head2"|"head3"|"head4"|"over"|"item"|"back"|"begin"|"end"|"for"|"encoding"))
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+
+%state STRING
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state POD
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "and" |
+ "cmp" |
+ "continue" |
+ "do" |
+ "else" |
+ "elsif" |
+ "eq" |
+ "esac" |
+ "for" |
+ "foreach" |
+ "ge" |
+ "if" |
+ "last" |
+ "le" |
+ "ne" |
+ "next" |
+ "not" |
+ "or" |
+ "redo" |
+ "sub" |
+ "unless" |
+ "until" |
+ "while" |
+ "xor" { addToken(Token.RESERVED_WORD); }
+
+ /* Standard Functions */
+ "abs" |
+ "accept" |
+ "alarm" |
+ "atan2" |
+ "bind" |
+ "binmode" |
+ "bless" |
+ "caller" |
+ "chdir" |
+ "chmod" |
+ "chomp" |
+ "chop" |
+ "chown" |
+ "chr" |
+ "chroot" |
+ "close" |
+ "closedir" |
+ "connect" |
+ "cos" |
+ "crypt" |
+ "dbmclose" |
+ "dbmopen" |
+ "defined" |
+ "delete" |
+ "die" |
+ "dump" |
+ "each" |
+ "endgrent" |
+ "endhostent" |
+ "endnetent" |
+ "endprotoent" |
+ "endpwent" |
+ "endservent" |
+ "eof" |
+ "eval" |
+ "exec" |
+ "exists" |
+ "exit" |
+ "exp" |
+ "fcntl" |
+ "fileno" |
+ "flock" |
+ "fork" |
+ "formline" |
+ "getc" |
+ "getgrent" |
+ "getgrgid" |
+ "getgrnam" |
+ "gethostbyaddr" |
+ "gethostbyname" |
+ "gethostent" |
+ "getlogin" |
+ "getnetbyaddr" |
+ "getnetbyname" |
+ "getnetent" |
+ "getpeername" |
+ "getpgrp" |
+ "getppid" |
+ "getpriority" |
+ "getprotobyname" |
+ "getprotobynumber" |
+ "getprotoent" |
+ "getpwent" |
+ "getpwnam" |
+ "getpwuid" |
+ "getservbyname" |
+ "getservbyport" |
+ "getservent" |
+ "getsockname" |
+ "getsockopt" |
+ "glob" |
+ "gmtime" |
+ "goto" |
+ "grep" |
+ "hex" |
+ "index" |
+ "int" |
+ "ioctl" |
+ "join" |
+ "keys" |
+ "kill" |
+ "last" |
+ "lc" |
+ "lcfirst" |
+ "length" |
+ "link" |
+ "listen" |
+ "local" |
+ "localtime" |
+ "log" |
+ "lstat" |
+ "map" |
+ "mkdir" |
+ "msgctl" |
+ "msgget" |
+ "msgrcv" |
+ "msgsnd" |
+ "my" |
+ "next" |
+ "no" |
+ "oct" |
+ "open" |
+ "opendir" |
+ "ord" |
+ "our" |
+ "pack" |
+ "package" |
+ "pipe" |
+ "pop" |
+ "pos" |
+ "print" |
+ "printf" |
+ "prototype" |
+ "push" |
+ "quotemeta" |
+ "rand" |
+ "read" |
+ "readdir" |
+ "readline" |
+ "readlink" |
+ "readpipe" |
+ "recv" |
+ "redo" |
+ "ref" |
+ "rename" |
+ "require" |
+ "reset" |
+ "return" |
+ "reverse" |
+ "rewinddir" |
+ "rindex" |
+ "rmdir" |
+ "scalar" |
+ "seek" |
+ "seekdir" |
+ "select" |
+ "semctl" |
+ "semget" |
+ "semop" |
+ "send" |
+ "sethostent" |
+ "setgrent" |
+ "setnetent" |
+ "setpgrp" |
+ "setpriority" |
+ "setprotoent" |
+ "setpwent" |
+ "setservent" |
+ "setsockopt" |
+ "shift" |
+ "shmctl" |
+ "shmget" |
+ "shmread" |
+ "shmwrite" |
+ "shutdown" |
+ "sin" |
+ "sleep" |
+ "socket" |
+ "socketpair" |
+ "sort" |
+ "splice" |
+ "split" |
+ "sprintf" |
+ "sqrt" |
+ "srand" |
+ "stat" |
+ "study" |
+ "sub" |
+ "substr" |
+ "symlink" |
+ "syscall" |
+ "sysopen" |
+ "sysread" |
+ "sysseek" |
+ "system" |
+ "syswrite" |
+ "tell" |
+ "telldir" |
+ "tie" |
+ "tied" |
+ "time" |
+ "times" |
+ "truncate" |
+ "uc" |
+ "ucfirst" |
+ "umask" |
+ "undef" |
+ "unlink" |
+ "unpack" |
+ "unshift" |
+ "untie" |
+ "use" |
+ "utime" |
+ "values" |
+ "vec" |
+ "wait" |
+ "waitpid" |
+ "wantarray" |
+ "warn" |
+ "write" { addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+ {Variable} { addToken(Token.VARIABLE); }
+
+ /* String/Character literals. */
+ \" { start = zzMarkedPos-1; yybegin(STRING); }
+ \' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+ \` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+ /* Comment literals. */
+ {LineCommentBegin}"!".* { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Easily identifiable regexes of the form "/.../". This is not foolproof. */
+ {Regex} {
+ boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (regexCanFollow(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+
+ /* More regexes (m/.../, s!...!!, etc.). This is nowhere near */
+ /* exhaustive, but is rather just the common ones. */
+ m"/"[^/]*"/"[msixpodualgc]* { addToken(Token.REGEX); }
+ m"!"[^!]*"!"[msixpodualgc]* { addToken(Token.REGEX); }
+ m"|"[^\|]*"|"[msixpodualgc]* { addToken(Token.REGEX); }
+ m\\[^\\]*\\[msixpodualgc]* { addToken(Token.REGEX); }
+ s"/"[^/]*"/"[^/]*"/"[msixpodualgcer]* { addToken(Token.REGEX); }
+ s"!"[^!]*"!"[^!]*"!"[msixpodualgcer]* { addToken(Token.REGEX); }
+ s"|"[^\|]*"|"[^\|]*"|"[msixpodualgcer]* { addToken(Token.REGEX); }
+ (tr|y)"/"[^/]*"/"[^/]*"/"[cdsr]* { addToken(Token.REGEX); }
+ (tr|y)"!"[^!]*"!"[^!]*"!"[cdsr]* { addToken(Token.REGEX); }
+ (tr|y)"|"[^\|]*"|"[^\|]*"|"[cdsr]* { addToken(Token.REGEX); }
+ (tr|y)\\[^\\]*\\[^\\]*\\[cdsr]* { addToken(Token.REGEX); }
+ qr"/"[^/]*"/"[msixpodual]* { addToken(Token.REGEX); }
+ qr"!"[^/]*"!"[msixpodual]* { addToken(Token.REGEX); }
+ qr"|"[^/]*"|"[msixpodual]* { addToken(Token.REGEX); }
+ qr\\[^/]*\\[msixpodual]* { addToken(Token.REGEX); }
+
+ /* "Here-document" syntax. This is only implemented for the common */
+ /* cases. */
+ "<<EOF" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<" {WhiteSpace}* \""EOF"\" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<" {WhiteSpace}* \'"EOF"\' { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+ "<<" {WhiteSpace}* \`"EOF"\` { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<EOT" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+ "<<" {WhiteSpace}* \""EOT"\" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+ "<<" {WhiteSpace}* \'"EOT"\' { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+ "<<" {WhiteSpace}* \`"EOT"\` { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+ /* POD commands. */
+ {PodCommandsExceptCut} { addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD); }
+
+ /* Separators and operators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+
+<STRING> {
+ [^\n\\\$\@\%\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped single quotes only, but this should still work. */ }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+ \' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+ [^\n\\\$\@\%\`]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ \` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+ /* NOTE: The closing "EOF" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOF" will match any line containing */
+ /* EOF and any other chars. */
+ /* NOTE2: This case is used for unquoted <<EOF, double quoted */
+ /* <<"EOF" and backticks <<`EOF`, since they all follow the same */
+ /* syntactic rules. */
+ "EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\\$\@\%]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+ /* NOTE: The closing "EOF" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOF" will match any line containing */
+ /* EOF and any other chars. */
+ "EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+ /* NOTE: The closing "EOT" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOT" will match any line containing */
+ /* EOF and any other chars. */
+ /* NOTE2: This case is used for unquoted <<EOT, double quoted */
+ /* <<"EOT" and backticks <<`EOT`, since they all follow the same */
+ /* syntactic rules. */
+ "EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\\$\@\%]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ {Variable} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ {VariableStart} {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+ /* NOTE: The closing "EOT" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOT" will match any line containing */
+ /* EOT and any other chars. */
+ "EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<POD> {
+ [^\n\=]+ {}
+ "=cut" { if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); } }
+ {PodCommandsExceptCut} { if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; } }
+ = {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken; }
+}
+
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java
new file mode 100644
index 0000000..729c496
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PerlTokenMaker.java
@@ -0,0 +1,2106 @@
+/* The following code was generated by JFlex 1.4.1 on 3/11/12 12:58 AM */
+
+/*
+ * 01/26/2008
+ *
+ * PerlTokenMaker.java - Scanner for Perl
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Perl.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated PerlTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PerlTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int HEREDOC_EOF_SINGLE_QUOTED = 5;
+ public static final int HEREDOC_EOT_SINGLE_QUOTED = 7;
+ public static final int HEREDOC_EOT_UNQUOTED = 6;
+ public static final int STRING = 1;
+ public static final int BACKTICKS = 3;
+ public static final int YYINITIAL = 0;
+ public static final int HEREDOC_EOF_UNQUOTED = 4;
+ public static final int CHAR_LITERAL = 2;
+ public static final int POD = 8;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\12\1\11\1\0\1\12\1\6\22\0\1\12\1\46\1\102"+
+ "\1\7\1\26\1\24\1\50\1\53\1\21\1\25\1\33\1\41\1\22"+
+ "\1\17\1\20\1\32\1\3\1\61\1\62\1\61\1\61\3\5\2\2"+
+ "\1\22\1\22\1\42\1\43\1\45\1\47\1\23\3\4\1\15\1\16"+
+ "\1\104\5\1\1\14\2\1\1\103\4\1\1\105\3\1\1\13\2\1"+
+ "\1\21\1\10\1\21\1\44\1\1\1\31\1\60\1\70\1\35\1\40"+
+ "\1\57\1\74\1\72\1\56\1\65\1\101\1\71\1\37\1\67\1\73"+
+ "\1\55\1\54\1\76\1\64\1\34\1\66\1\75\1\63\1\77\1\36"+
+ "\1\100\1\1\1\27\1\52\1\30\1\51\uff81\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 =
+ "\11\0\1\1\1\2\2\3\1\1\1\4\1\5\1\6"+
+ "\1\7\1\2\1\10\1\2\1\1\1\7\1\10\1\1"+
+ "\1\11\2\7\5\2\10\7\1\12\24\2\1\13\1\14"+
+ "\1\15\1\16\3\14\1\17\1\14\1\20\1\21\1\22"+
+ "\1\14\1\23\3\14\1\24\1\14\1\25\5\14\1\26"+
+ "\1\14\1\27\1\14\1\30\2\14\1\31\1\14\1\32"+
+ "\1\3\1\33\1\32\1\33\1\32\1\34\1\32\1\4"+
+ "\1\35\1\36\1\1\1\0\1\36\1\0\3\36\3\0"+
+ "\1\7\1\0\2\2\2\0\22\2\1\37\1\2\1\40"+
+ "\2\2\1\40\4\2\10\0\1\7\7\2\1\40\31\2"+
+ "\1\1\1\0\1\2\2\0\1\2\1\37\6\2\1\40"+
+ "\2\2\1\37\1\40\14\2\1\1\3\0\1\2\1\15"+
+ "\1\41\1\14\1\0\2\41\1\0\1\20\1\42\1\14"+
+ "\1\0\2\42\1\0\1\14\1\43\1\14\1\0\2\43"+
+ "\1\0\3\14\10\0\1\33\1\0\2\34\1\0\1\44"+
+ "\1\0\1\2\2\0\14\2\1\40\6\2\1\37\15\2"+
+ "\15\0\33\2\1\37\1\2\1\0\2\45\7\2\1\40"+
+ "\10\2\1\1\3\0\5\2\1\0\1\1\5\0\1\46"+
+ "\1\0\1\46\11\0\1\45\10\2\1\37\26\2\4\0"+
+ "\1\47\5\0\1\37\11\2\1\37\5\2\1\37\17\2"+
+ "\1\0\4\45\2\2\1\37\1\2\1\0\2\45\1\50"+
+ "\1\51\5\0\16\2\1\37\2\2\1\52\1\53\6\0"+
+ "\2\2\1\37\25\2\1\45\2\2\3\0\1\37\7\2"+
+ "\7\0\14\2\1\0\4\2\1\54\1\55\1\0\10\2"+
+ "\1\0\1\2\1\0\4\2\1\0\12\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[601];
+ 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\106\0\214\0\322\0\u0118\0\u015e\0\u01a4\0\u01ea"+
+ "\0\u0230\0\u0276\0\u02bc\0\u0302\0\u0348\0\u038e\0\u03d4\0\u038e"+
+ "\0\u041a\0\u0460\0\u04a6\0\u038e\0\u038e\0\u04ec\0\u0532\0\u0578"+
+ "\0\u05be\0\u038e\0\u0604\0\u064a\0\u0690\0\u06d6\0\u071c\0\u0762"+
+ "\0\u07a8\0\u07ee\0\u0834\0\u087a\0\u08c0\0\u0906\0\u094c\0\u038e"+
+ "\0\u0992\0\u038e\0\u09d8\0\u0a1e\0\u0a64\0\u0aaa\0\u0af0\0\u0b36"+
+ "\0\u0b7c\0\u0bc2\0\u0c08\0\u0c4e\0\u0c94\0\u0cda\0\u0d20\0\u0d66"+
+ "\0\u0dac\0\u0df2\0\u0e38\0\u0e7e\0\u0ec4\0\u0f0a\0\u038e\0\u0f50"+
+ "\0\u0f96\0\u038e\0\u0fdc\0\u1022\0\u1068\0\u038e\0\u10ae\0\u10f4"+
+ "\0\u038e\0\u038e\0\u113a\0\u038e\0\u1180\0\u11c6\0\u120c\0\u038e"+
+ "\0\u1252\0\u038e\0\u1298\0\u12de\0\u1324\0\u136a\0\u13b0\0\u038e"+
+ "\0\u13f6\0\u038e\0\u143c\0\u038e\0\u1482\0\u14c8\0\u038e\0\u150e"+
+ "\0\u1554\0\u1554\0\u1554\0\u159a\0\u15e0\0\u1626\0\u166c\0\u16b2"+
+ "\0\u16f8\0\u173e\0\u1784\0\u17ca\0\u1810\0\u1856\0\u189c\0\u0276"+
+ "\0\u038e\0\u17ca\0\u18e2\0\u1928\0\u196e\0\u1928\0\u19b4\0\u19fa"+
+ "\0\u1a40\0\u1a86\0\u1acc\0\u1b12\0\u1b58\0\u1b9e\0\u1be4\0\u1c2a"+
+ "\0\u1c70\0\u1cb6\0\u1cfc\0\u1d42\0\u1d88\0\u1dce\0\u1e14\0\u1e5a"+
+ "\0\u1ea0\0\u1ee6\0\u1f2c\0\u1f72\0\u1fb8\0\u1ffe\0\u2044\0\u208a"+
+ "\0\u20d0\0\u2116\0\u02bc\0\u215c\0\u21a2\0\u21e8\0\u222e\0\u2274"+
+ "\0\u22ba\0\u2300\0\u2346\0\u238c\0\u23d2\0\u2418\0\u245e\0\u24a4"+
+ "\0\u24ea\0\u2530\0\u2576\0\u25bc\0\u2602\0\u2648\0\u268e\0\u26d4"+
+ "\0\u271a\0\u2760\0\u27a6\0\u27ec\0\u2832\0\u2878\0\u28be\0\u2904"+
+ "\0\u294a\0\u2990\0\u29d6\0\u2a1c\0\u2a62\0\u2aa8\0\u2aee\0\u2b34"+
+ "\0\u2b7a\0\u2bc0\0\u2c06\0\u2c4c\0\u2c92\0\u2cd8\0\u2d1e\0\u2d64"+
+ "\0\u2daa\0\u2df0\0\u2e36\0\u2e7c\0\u2ec2\0\u2f08\0\u2f4e\0\u02bc"+
+ "\0\u2f94\0\u2fda\0\u3020\0\u3066\0\u30ac\0\u30f2\0\u3138\0\u317e"+
+ "\0\u31c4\0\u320a\0\u3250\0\u3296\0\u32dc\0\u3322\0\u3368\0\u33ae"+
+ "\0\u33f4\0\u343a\0\u3480\0\u34c6\0\u350c\0\u3552\0\u3598\0\u35de"+
+ "\0\u3624\0\u366a\0\u36b0\0\u36f6\0\u038e\0\u373c\0\u3782\0\u37c8"+
+ "\0\u038e\0\u3782\0\u380e\0\u038e\0\u3854\0\u389a\0\u38e0\0\u038e"+
+ "\0\u389a\0\u3926\0\u396c\0\u39b2\0\u39f8\0\u3a3e\0\u038e\0\u39f8"+
+ "\0\u3a84\0\u3aca\0\u3b10\0\u3b56\0\u3b9c\0\u3be2\0\u3c28\0\u3c6e"+
+ "\0\u3cb4\0\u3cfa\0\u3d40\0\u3d86\0\u3dcc\0\u3e12\0\u1554\0\u3e58"+
+ "\0\u3e9e\0\u3ee4\0\u3f2a\0\u3f70\0\u3fb6\0\u3ffc\0\u4042\0\u4088"+
+ "\0\u40ce\0\u4114\0\u415a\0\u41a0\0\u41e6\0\u422c\0\u4272\0\u42b8"+
+ "\0\u26d4\0\u42fe\0\u4344\0\u438a\0\u43d0\0\u4416\0\u445c\0\u44a2"+
+ "\0\u44e8\0\u452e\0\u4574\0\u45ba\0\u4600\0\u4646\0\u468c\0\u46d2"+
+ "\0\u4718\0\u320a\0\u475e\0\u47a4\0\u47ea\0\u4830\0\u4876\0\u48bc"+
+ "\0\u4902\0\u4948\0\u498e\0\u49d4\0\u4a1a\0\u4a60\0\u4aa6\0\u4aec"+
+ "\0\u4b32\0\u4b78\0\u4bbe\0\u4c04\0\u4c4a\0\u4c90\0\u4cd6\0\u4d1c"+
+ "\0\u4d62\0\u4da8\0\u4dee\0\u4e34\0\u4e7a\0\u4ec0\0\u4f06\0\u4f4c"+
+ "\0\u4f92\0\u4fd8\0\u501e\0\u5064\0\u50aa\0\u50f0\0\u5136\0\u517c"+
+ "\0\u51c2\0\u5208\0\u524e\0\u5294\0\u52da\0\u5320\0\u5366\0\u26d4"+
+ "\0\u53ac\0\u53f2\0\u5438\0\u547e\0\u54c4\0\u550a\0\u5550\0\u5596"+
+ "\0\u55dc\0\u5622\0\u5668\0\u56ae\0\u56f4\0\u573a\0\u5780\0\u57c6"+
+ "\0\u580c\0\u5852\0\u5898\0\u58de\0\u5924\0\u596a\0\u59b0\0\u59f6"+
+ "\0\u5a3c\0\u5a82\0\u5ac8\0\u5b0e\0\u5b54\0\u5b9a\0\u5be0\0\u5c26"+
+ "\0\u5c6c\0\u5cb2\0\u5cf8\0\u5d3e\0\u1252\0\u5d84\0\u13b0\0\u5dca"+
+ "\0\u5e10\0\u5e56\0\u5e9c\0\u5ee2\0\u5f28\0\u5f6e\0\u5fb4\0\u5ffa"+
+ "\0\u6040\0\u6086\0\u60cc\0\u6112\0\u6158\0\u619e\0\u61e4\0\u622a"+
+ "\0\u6270\0\u2c4c\0\u62b6\0\u62fc\0\u6342\0\u6388\0\u63ce\0\u6414"+
+ "\0\u645a\0\u64a0\0\u64e6\0\u652c\0\u6572\0\u65b8\0\u65fe\0\u6644"+
+ "\0\u668a\0\u66d0\0\u6716\0\u675c\0\u67a2\0\u67e8\0\u682e\0\u6874"+
+ "\0\u68ba\0\u6900\0\u6946\0\u698c\0\u038e\0\u69d2\0\u6a18\0\u6a5e"+
+ "\0\u6aa4\0\u6aea\0\u6b30\0\u6b76\0\u6bbc\0\u6c02\0\u6c48\0\u6c8e"+
+ "\0\u6cd4\0\u6d1a\0\u6d60\0\u6da6\0\u6dec\0\u6e32\0\u6e78\0\u6ebe"+
+ "\0\u6f04\0\u6f4a\0\u2a62\0\u6f90\0\u6fd6\0\u701c\0\u7062\0\u70a8"+
+ "\0\u70ee\0\u7134\0\u717a\0\u71c0\0\u7206\0\u724c\0\u7292\0\u72d8"+
+ "\0\u731e\0\u7364\0\u73aa\0\u73f0\0\u7436\0\u747c\0\u74c2\0\u7508"+
+ "\0\u754e\0\u7594\0\u75da\0\u7620\0\u7666\0\u76ac\0\u038e\0\u038e"+
+ "\0\u76f2\0\u7738\0\u777e\0\u77c4\0\u780a\0\u7850\0\u7896\0\u78dc"+
+ "\0\u7922\0\u7968\0\u79ae\0\u79f4\0\u7a3a\0\u7a80\0\u7ac6\0\u7b0c"+
+ "\0\u7b52\0\u7b98\0\u7bde\0\u31c4\0\u7c24\0\u7c6a\0\u038e\0\u038e"+
+ "\0\u7cb0\0\u7cf6\0\u7d3c\0\u7d82\0\u7dc8\0\u7e0e\0\u7e54\0\u7e9a"+
+ "\0\u2878\0\u7ee0\0\u7f26\0\u7f6c\0\u7fb2\0\u7ff8\0\u803e\0\u8084"+
+ "\0\u80ca\0\u8110\0\u8156\0\u819c\0\u81e2\0\u8228\0\u826e\0\u82b4"+
+ "\0\u82fa\0\u8340\0\u8386\0\u83cc\0\u8412\0\u8458\0\u849e\0\u84e4"+
+ "\0\u852a\0\u8570\0\u85b6\0\u85fc\0\u8642\0\u8688\0\u86ce\0\u8714"+
+ "\0\u875a\0\u87a0\0\u87e6\0\u882c\0\u8872\0\u88b8\0\u88fe\0\u8944"+
+ "\0\u898a\0\u89d0\0\u8a16\0\u8a5c\0\u8aa2\0\u8ae8\0\u8b2e\0\u8b74"+
+ "\0\u8bba\0\u8c00\0\u8c46\0\u8c8c\0\u8cd2\0\u8d18\0\u8d5e\0\u8da4"+
+ "\0\u8dea\0\u8e30\0\u8e76\0\u8ebc\0\u038e\0\u038e\0\u8f02\0\u8f48"+
+ "\0\u8f8e\0\u8fd4\0\u901a\0\u9060\0\u90a6\0\u90ec\0\u9132\0\u9178"+
+ "\0\u91be\0\u9204\0\u924a\0\u9290\0\u92d6\0\u931c\0\u9362\0\u93a8"+
+ "\0\u93ee\0\u9434\0\u947a\0\u94c0\0\u9506\0\u954c\0\u9592\0\u95d8"+
+ "\0\u961e";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[601];
+ 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 =
+ "\1\12\1\13\1\14\1\15\1\13\1\14\1\16\1\17"+
+ "\1\12\1\20\1\21\4\13\1\22\1\23\1\24\1\25"+
+ "\1\26\1\27\1\30\1\31\2\24\1\32\1\33\1\34"+
+ "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+ "\1\45\1\46\1\47\1\50\1\51\1\50\1\45\1\52"+
+ "\1\53\1\54\1\55\1\56\1\57\2\14\1\60\1\61"+
+ "\1\62\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
+ "\1\72\1\73\1\74\1\75\1\76\1\77\3\13\10\100"+
+ "\1\101\1\102\11\100\2\103\1\104\1\105\53\100\1\106"+
+ "\3\100\10\107\1\110\1\111\41\107\1\112\32\107\10\113"+
+ "\1\101\1\114\11\113\2\115\1\116\1\117\2\113\1\120"+
+ "\54\113\10\121\1\101\1\122\4\121\1\123\4\121\2\124"+
+ "\1\125\1\126\57\121\10\127\1\101\1\130\4\127\1\131"+
+ "\67\127\10\121\1\101\1\132\4\121\1\133\4\121\2\124"+
+ "\1\125\1\126\57\121\10\127\1\101\1\134\4\127\1\135"+
+ "\67\127\11\136\1\137\31\136\1\140\42\136\6\12\1\0"+
+ "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+ "\5\12\13\0\26\12\1\0\4\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\26\13\1\0\3\13\2\141\2\14\1\141\1\14"+
+ "\1\0\2\141\2\0\1\141\1\142\1\143\1\144\1\0"+
+ "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\142"+
+ "\1\143\13\0\3\141\1\144\1\141\2\14\11\141\1\143"+
+ "\5\141\1\0\1\141\1\143\3\141\1\146\1\147\1\141"+
+ "\1\147\1\0\2\141\2\0\1\150\1\142\1\143\1\144"+
+ "\1\0\1\145\2\0\1\141\2\0\1\141\5\0\2\141"+
+ "\1\150\1\142\1\143\13\0\3\141\1\144\1\141\2\147"+
+ "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\106\0"+
+ "\11\151\1\0\34\151\1\152\37\151\12\0\1\21\112\0"+
+ "\1\50\23\0\1\50\1\0\1\50\42\0\2\145\1\0"+
+ "\1\145\53\0\2\145\23\0\1\12\1\153\2\12\1\153"+
+ "\1\12\1\0\2\12\2\0\4\153\4\0\1\12\2\0"+
+ "\1\154\1\155\4\0\5\153\13\0\5\153\2\12\17\153"+
+ "\1\0\3\153\1\0\1\156\2\0\1\156\6\0\4\156"+
+ "\7\0\1\157\1\155\4\0\5\156\2\0\1\50\10\0"+
+ "\5\156\2\0\17\156\1\0\3\156\1\0\1\156\2\0"+
+ "\1\156\6\0\4\156\7\0\1\157\1\155\4\0\5\156"+
+ "\13\0\5\156\2\0\17\156\1\0\3\156\1\12\1\153"+
+ "\2\160\1\153\1\160\1\0\2\160\2\0\4\153\4\161"+
+ "\1\160\2\161\1\162\1\163\1\0\3\161\5\153\13\161"+
+ "\5\153\2\160\17\153\1\161\3\153\10\164\1\165\21\164"+
+ "\2\0\7\164\1\166\42\164\43\0\1\50\7\0\1\50"+
+ "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\3\0\1\167\1\0"+
+ "\1\13\1\170\1\13\1\171\1\13\5\0\1\172\3\0"+
+ "\1\173\1\0\1\174\1\175\1\176\1\177\4\13\1\200"+
+ "\1\201\1\202\6\13\1\203\1\204\1\13\1\205\1\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\3\13\1\206\1\13"+
+ "\13\0\1\13\1\207\1\210\1\13\1\211\3\13\1\212"+
+ "\2\13\1\213\12\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\214\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\215\1\216\3\13\13\0\1\13\1\217"+
+ "\1\13\1\220\1\221\4\13\1\222\14\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\13\1\223\1\13"+
+ "\1\224\5\13\1\225\2\13\1\226\4\13\1\227\4\13"+
+ "\1\0\3\13\41\0\1\50\1\0\1\50\104\0\1\230"+
+ "\1\50\105\0\1\50\5\0\1\50\2\0\1\231\1\232"+
+ "\1\233\1\234\5\0\1\235\2\0\1\236\3\0\1\237"+
+ "\54\0\1\50\105\0\1\50\1\0\1\240\103\0\1\50"+
+ "\5\0\1\50\77\0\1\50\4\0\1\50\2\0\1\50"+
+ "\26\0\1\50\3\0\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\1\13\1\241\2\13\1\242\3\13\1\243\1\244\7\13"+
+ "\1\245\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\13"+
+ "\1\246\3\13\13\0\1\247\7\13\1\250\10\13\1\251"+
+ "\4\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\3\13\1\252\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\253\1\13\1\254\1\255\1\13\13\0\1\13\1\256"+
+ "\2\13\1\257\2\13\1\260\7\13\1\261\2\13\1\223"+
+ "\3\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\262"+
+ "\1\13\1\263\1\13\13\0\12\13\1\264\1\13\1\265"+
+ "\2\13\1\266\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\3\13\1\267\1\270\21\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\271\1\272"+
+ "\4\13\1\273\1\13\1\274\12\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\275\15\13\1\276"+
+ "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\277\4\13\1\300\1\301\14\13\1\0"+
+ "\3\13\1\12\5\13\1\0\1\12\1\302\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\3\0\1\303\1\0\1\304"+
+ "\4\13\5\0\1\305\3\0\1\306\1\0\4\13\1\307"+
+ "\10\13\1\274\6\13\1\310\1\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\3\13\1\311\1\13\13\0\11\13\1\312"+
+ "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\3\13\1\313\5\13\1\314\14\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\3\13\1\315\1\13\13\0\1\13\1\316"+
+ "\1\13\1\317\4\13\1\320\2\13\1\321\12\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\322"+
+ "\1\13\1\323\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\324\1\13\1\325\1\13\13\0\1\13\1\326"+
+ "\7\13\1\327\14\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\225\1\216\3\13\13\0\12\13\1\330\1\331\3\13"+
+ "\1\332\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\10\13\1\333\10\13\1\334\4\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\2\13\1\335\1\13"+
+ "\1\336\3\13\1\337\15\13\1\0\3\13\1\12\5\13"+
+ "\1\0\1\12\1\340\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\3\0\1\341\1\0\5\13\5\0\1\342\3\0"+
+ "\1\343\1\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\344\24\13\1\0\3\13\10\100"+
+ "\2\0\11\100\2\0\1\100\1\0\53\100\1\0\3\100"+
+ "\11\345\1\0\74\345\1\0\1\346\2\0\1\346\6\0"+
+ "\4\346\7\0\1\347\1\350\4\0\5\346\13\0\5\346"+
+ "\2\0\17\346\1\0\3\346\10\100\2\0\11\100\2\0"+
+ "\1\100\1\347\53\100\1\0\3\100\1\0\1\346\2\351"+
+ "\1\346\1\351\1\0\2\351\2\0\4\346\7\351\1\352"+
+ "\1\353\1\0\3\351\5\346\13\351\5\346\2\351\17\346"+
+ "\1\351\3\346\10\107\2\0\41\107\1\0\32\107\11\354"+
+ "\1\0\74\354\10\113\2\0\11\113\2\0\1\113\1\0"+
+ "\2\113\1\0\54\113\1\0\1\355\2\0\1\355\6\0"+
+ "\4\355\7\0\1\356\1\357\4\0\5\355\13\0\5\355"+
+ "\2\0\17\355\1\0\3\355\10\113\2\0\11\113\2\0"+
+ "\1\113\1\356\2\113\1\0\54\113\1\0\1\355\2\360"+
+ "\1\355\1\360\1\0\2\360\2\0\4\355\7\360\1\361"+
+ "\1\362\1\0\3\360\5\355\13\360\5\355\2\360\17\355"+
+ "\1\360\3\355\10\121\2\0\11\121\2\0\1\121\1\0"+
+ "\67\121\2\0\11\121\2\0\1\121\1\0\54\121\1\363"+
+ "\2\121\1\0\1\364\2\0\1\364\6\0\4\364\7\0"+
+ "\1\365\1\366\4\0\5\364\13\0\5\364\2\0\17\364"+
+ "\1\0\3\364\10\121\2\0\11\121\2\0\1\121\1\365"+
+ "\57\121\1\0\1\364\2\367\1\364\1\367\1\0\2\367"+
+ "\2\0\4\364\7\367\1\370\1\371\1\0\3\367\5\364"+
+ "\13\367\5\364\2\367\17\364\1\367\3\364\10\127\2\0"+
+ "\104\127\2\0\71\127\1\372\2\127\10\121\2\0\11\121"+
+ "\2\0\1\121\1\0\54\121\1\373\2\121\10\127\2\0"+
+ "\71\127\1\374\2\127\11\136\1\0\31\136\1\0\42\136"+
+ "\35\0\1\375\16\0\1\376\1\377\1\u0100\1\u0101\5\0"+
+ "\1\u0102\2\0\1\u0103\3\0\1\u0104\11\0\6\141\1\0"+
+ "\2\141\2\0\4\141\4\0\1\141\2\0\1\141\5\0"+
+ "\5\141\13\0\26\141\1\0\5\141\2\u0105\1\141\1\u0105"+
+ "\1\0\2\141\2\0\4\141\1\u0106\3\0\1\141\2\0"+
+ "\1\141\5\0\5\141\1\u0106\12\0\5\141\2\u0105\17\141"+
+ "\1\0\5\141\2\145\1\141\1\145\1\0\2\141\2\0"+
+ "\2\141\1\143\1\144\4\0\1\141\2\0\1\141\5\0"+
+ "\4\141\1\143\13\0\3\141\1\144\1\141\2\145\11\141"+
+ "\1\143\5\141\1\0\1\141\1\143\3\141\2\146\1\141"+
+ "\1\146\1\0\2\141\2\0\2\141\1\143\1\144\1\0"+
+ "\1\145\2\0\1\141\2\0\1\141\5\0\4\141\1\143"+
+ "\13\0\3\141\1\144\1\141\2\146\11\141\1\143\5\141"+
+ "\1\0\1\141\1\143\3\141\1\146\1\147\1\141\1\147"+
+ "\1\0\2\141\2\0\1\141\1\u0107\1\143\1\144\1\0"+
+ "\1\145\2\0\1\141\2\0\1\141\5\0\3\141\1\u0107"+
+ "\1\143\13\0\3\141\1\144\1\141\2\147\11\141\1\143"+
+ "\5\141\1\0\1\141\1\143\3\141\4\u0108\1\0\2\141"+
+ "\2\0\2\141\2\u0108\4\0\1\141\2\0\1\141\5\0"+
+ "\1\141\1\u0108\2\141\1\u0108\13\0\3\141\4\u0108\5\141"+
+ "\1\u0108\3\141\1\u0108\5\141\1\0\1\141\1\u0108\1\141"+
+ "\11\151\1\0\74\151\11\152\1\0\74\152\1\12\5\153"+
+ "\1\0\2\12\2\0\4\153\4\0\1\12\2\0\1\12"+
+ "\5\0\5\153\13\0\26\153\1\0\3\153\1\12\1\153"+
+ "\2\12\1\153\1\12\1\0\2\12\2\0\4\153\4\0"+
+ "\1\12\2\0\1\12\1\155\4\0\5\153\13\0\5\153"+
+ "\2\12\17\153\1\0\3\153\1\0\1\u0109\2\0\1\u0109"+
+ "\6\0\4\u0109\15\0\5\u0109\13\0\5\u0109\2\0\17\u0109"+
+ "\1\0\3\u0109\1\0\5\156\5\0\4\156\15\0\5\156"+
+ "\13\0\26\156\1\0\3\156\1\0\1\156\2\0\1\156"+
+ "\6\0\4\156\10\0\1\155\4\0\5\156\13\0\5\156"+
+ "\2\0\17\156\1\0\3\156\1\0\1\u0109\2\0\1\u0109"+
+ "\2\0\2\161\2\0\4\u0109\10\161\1\0\4\161\5\u0109"+
+ "\13\161\5\u0109\2\0\17\u0109\1\161\3\u0109\10\164\1\165"+
+ "\21\164\1\u010a\64\164\1\0\74\164\32\167\1\u010b\53\167"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\4\13\1\u010c\21\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+ "\1\320\22\13\1\0\3\13\46\172\1\u010d\37\172\52\173"+
+ "\1\u010e\33\173\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\3\13\1\u010f\1\13"+
+ "\13\0\10\13\1\u0110\15\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\13\1\u0111\3\13\13\0\10\13\1\246\15\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+ "\1\u0112\1\13\1\u0113\5\13\1\u0114\4\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\3\13\1\u0115\1\13\13\0\3\13"+
+ "\1\u0116\6\13\1\u0117\1\u0118\3\13\1\u0119\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\272"+
+ "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\17\13\1\310\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\4\13\1\246\14\13\1\u011a\4\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\u011b"+
+ "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\10\13\1\246\15\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\u011c\4\13\13\0\13\13\1\u011d\12\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\13\1\u011e\24\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\1\310\4\13\13\0"+
+ "\17\13\1\u011f\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\4\13\1\u0120\13\0\1\13\1\u0121\6\13\1\u0122\2\13"+
+ "\1\u0123\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+ "\1\u0124\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\24\13\1\u0125\1\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\223\25\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\223"+
+ "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\12\13\1\u0126\13\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\20\13\1\u0127\5\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\13\1\u0128\3\13\13\0\16\13\1\310"+
+ "\7\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\17\13\1\u0129\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\u012a\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\u012b\4\13\13\0\17\13\1\u012c\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\3\13\1\u012d\1\13\13\0"+
+ "\20\13\1\u012e\5\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\3\13\1\310\22\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\13\13\1\u012f\12\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\307"+
+ "\12\13\1\0\3\13\12\0\1\u0130\3\0\1\u0131\12\0"+
+ "\1\u0132\11\0\1\50\7\0\1\u0133\26\0\1\u0134\60\0"+
+ "\1\u0135\113\0\1\u0136\101\0\1\u0137\121\0\1\u0138\100\0"+
+ "\1\u0139\76\0\1\u013a\1\u013b\102\0\1\u013c\73\0\1\50"+
+ "\1\0\1\45\40\0\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+ "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\u013d\3\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\u013e\7\13\1\u013f"+
+ "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\1\225\25\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\u0140"+
+ "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\12\13\1\310\13\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\3\13\1\u0141\22\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\4\13\1\310\13\0\26\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+ "\1\310\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\2\13"+
+ "\1\310\2\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\4\13\1\u0142\21\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\310\2\13\1\267"+
+ "\5\13\1\u0143\14\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\u0144\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\20\13\1\310\5\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\1\13\1\u0140\3\13\13\0\26\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+ "\1\u0145\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+ "\1\u0146\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\u0147\3\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\4\13\1\u0148\21\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0149"+
+ "\21\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\310\4\13"+
+ "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+ "\1\223\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\310\3\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\3\13\1\u014a\1\13\13\0\26\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\1\u014b\1\u014c\2\13\1\u014d"+
+ "\13\0\4\13\1\u014e\2\13\1\u014f\2\13\1\u0150\4\13"+
+ "\1\u0151\1\310\1\13\1\u0152\1\u0153\2\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\17\13\1\u0119\6\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+ "\1\u0154\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+ "\1\u0120\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\u0155\3\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\4\13\1\55\13\0\12\13\1\310\13\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\3\13\1\u0156\1\13"+
+ "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\1\12"+
+ "\1\340\2\0\4\13\4\0\1\12\2\0\1\12\3\0"+
+ "\1\341\1\0\5\13\5\0\1\342\3\0\1\343\1\0"+
+ "\21\13\1\u0157\4\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\3\13\1\u0158\7\13\1\u0159\12\13\1\0"+
+ "\3\13\6\302\1\u015a\1\302\1\u015b\2\u015a\4\302\4\u015a"+
+ "\1\302\2\u015a\1\302\5\u015a\5\302\13\u015a\26\302\1\u015a"+
+ "\3\302\32\303\1\u015c\53\303\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\16\13\1\u015d\7\13\1\0\3\13\46\305\1\u015c"+
+ "\37\305\52\306\1\u015c\33\306\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\1\310\25\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\3\13\1\u015e\22\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\17\13\1\u015f\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\24\13\1\265"+
+ "\1\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u0145"+
+ "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\u0160\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\u0161\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u0162"+
+ "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\3\13\1\307\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\12\13\1\330\13\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\223\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\2\13\1\u012a\2\13\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\17\13\1\u0155\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\u0163\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\10\13\1\u0164\15\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\3\13\1\u0165\1\13\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\11\13\1\u0166\14\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\4\13\1\u0167\21\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\u0168\2\13\1\u0169\1\u016a\13\0\1\u016b"+
+ "\11\13\1\u016c\13\13\1\0\3\13\1\12\5\13\1\0"+
+ "\1\12\1\u016d\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\3\0\1\u016e\1\0\5\13\5\0\1\u016f\3\0\1\u0170"+
+ "\1\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\1\13\1\u0171\24\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\11\13\1\u0172\14\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\10\13\1\201\1\u0173"+
+ "\5\13\1\u0174\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\11\13\1\u0175\14\13\1\0\3\13\6\340"+
+ "\1\u0176\1\340\1\u0177\2\u0176\4\340\4\u0176\1\340\2\u0176"+
+ "\1\340\5\u0176\5\340\13\u0176\26\340\1\u0176\3\340\32\341"+
+ "\1\u0178\53\341\46\342\1\u0179\37\342\52\343\1\u017a\33\343"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\201\14\13"+
+ "\1\0\3\13\1\0\5\346\5\0\4\346\15\0\5\346"+
+ "\13\0\26\346\1\0\3\346\1\0\1\346\2\0\1\346"+
+ "\6\0\4\346\10\0\1\350\4\0\5\346\13\0\5\346"+
+ "\2\0\17\346\1\0\3\346\1\0\1\u017b\2\0\1\u017b"+
+ "\6\0\4\u017b\15\0\5\u017b\13\0\5\u017b\2\0\17\u017b"+
+ "\1\0\3\u017b\1\0\1\u017b\2\0\1\u017b\2\0\2\351"+
+ "\2\0\4\u017b\10\351\1\0\4\351\5\u017b\13\351\5\u017b"+
+ "\2\0\17\u017b\1\351\3\u017b\1\0\5\355\5\0\4\355"+
+ "\15\0\5\355\13\0\26\355\1\0\3\355\1\0\1\355"+
+ "\2\0\1\355\6\0\4\355\10\0\1\357\4\0\5\355"+
+ "\13\0\5\355\2\0\17\355\1\0\3\355\1\0\1\u017c"+
+ "\2\0\1\u017c\6\0\4\u017c\15\0\5\u017c\13\0\5\u017c"+
+ "\2\0\17\u017c\1\0\3\u017c\1\0\1\u017c\2\0\1\u017c"+
+ "\2\0\2\360\2\0\4\u017c\10\360\1\0\4\360\5\u017c"+
+ "\13\360\5\u017c\2\0\17\u017c\1\360\3\u017c\10\121\2\0"+
+ "\11\121\2\0\1\121\1\0\55\121\1\u017d\1\121\1\0"+
+ "\5\364\5\0\4\364\15\0\5\364\13\0\26\364\1\0"+
+ "\3\364\1\0\1\364\2\0\1\364\6\0\4\364\10\0"+
+ "\1\366\4\0\5\364\13\0\5\364\2\0\17\364\1\0"+
+ "\3\364\1\0\1\u017e\2\0\1\u017e\6\0\4\u017e\15\0"+
+ "\5\u017e\13\0\5\u017e\2\0\17\u017e\1\0\3\u017e\1\0"+
+ "\1\u017e\2\0\1\u017e\2\0\2\367\2\0\4\u017e\10\367"+
+ "\1\0\4\367\5\u017e\13\367\5\u017e\2\0\17\u017e\1\367"+
+ "\3\u017e\10\127\2\0\72\127\1\u017f\1\127\10\121\2\0"+
+ "\11\121\2\0\1\121\1\0\56\121\1\u017d\10\127\2\0"+
+ "\73\127\1\u017f\75\0\1\u0180\65\0\1\u0181\113\0\1\u0182"+
+ "\101\0\1\u0183\121\0\1\u0184\100\0\1\u0185\76\0\1\u0186"+
+ "\1\u0187\102\0\1\u0188\30\0\2\141\2\u0105\1\141\1\u0105"+
+ "\1\0\2\141\2\0\2\141\1\143\1\141\4\0\1\141"+
+ "\2\0\1\141\5\0\4\141\1\143\13\0\5\141\2\u0105"+
+ "\11\141\1\143\5\141\1\0\1\141\1\143\1\141\2\0"+
+ "\2\u0105\1\0\1\u0105\53\0\2\u0105\23\0\2\141\4\u0108"+
+ "\1\0\2\141\2\0\1\141\1\u0107\2\u0108\4\0\1\141"+
+ "\2\0\1\141\5\0\1\141\1\u0108\1\141\1\u0107\1\u0108"+
+ "\13\0\3\141\4\u0108\5\141\1\u0108\3\141\1\u0108\5\141"+
+ "\1\0\1\141\1\u0108\1\141\1\0\5\u0109\5\0\4\u0109"+
+ "\11\0\1\161\3\0\5\u0109\13\0\26\u0109\1\0\3\u0109"+
+ "\34\0\5\u010a\13\0\2\u010a\2\0\1\u010a\4\0\1\u010a"+
+ "\1\0\1\u010a\2\0\1\u010a\2\0\1\u010a\10\0\32\u010b"+
+ "\1\u0189\53\u010b\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\3\13\1\u018a\1\13"+
+ "\13\0\26\13\1\0\3\13\46\u010d\1\u0189\37\u010d\52\u010e"+
+ "\1\u0189\33\u010e\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+ "\1\u018b\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\11\13\1\u018c\14\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\15\13\1\u018d\10\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\20\13\1\246\5\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\1\13\1\u0155\3\13"+
+ "\13\0\10\13\1\u018e\5\13\1\u014b\4\13\1\u018f\2\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+ "\1\u0190\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u0191\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\15\13\1\u0192\10\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\1\u0193\4\13\13\0\1\u0194\1\13"+
+ "\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\13\1\u0155\3\13\13\0\1\13\1\307"+
+ "\14\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\4\13\1\u0198\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\u0199\4\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\u019a\1\u019b\3\13\13\0\1\13\1\u019c"+
+ "\6\13\1\u018e\1\13\1\u019d\10\13\1\u018f\2\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\3\13\1\u019e\1\13\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\u019f\4\13"+
+ "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\12\13\1\u01a0\4\13\1\u0115\6\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\251\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\310"+
+ "\12\13\1\307\7\13\1\201\2\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\u01a1\24\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u0119"+
+ "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\3\13\1\u01a2"+
+ "\1\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\246\25\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\4\13\1\246\21\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01a3\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+ "\1\u01a4\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\16\13\1\u01a5\7\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\12\13\1\u01a6\13\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\15\13\1\310\10\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+ "\1\u0175\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\11\13\1\u01a7\14\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\13\1\u01a8\3\13\13\0\1\13\1\u019c\24\13"+
+ "\1\0\3\13\12\0\1\u0130\16\0\1\u0132\21\0\1\u0133"+
+ "\26\0\1\u0134\106\0\1\u01a9\20\0\1\u01aa\105\0\1\u01ab"+
+ "\105\0\1\u01ac\127\0\1\u01ad\124\0\1\u013c\106\0\1\u01ae"+
+ "\62\0\1\u01af\2\0\1\u01ad\124\0\1\u01b0\120\0\1\u01b1"+
+ "\50\0\1\u01b2\134\0\1\u01ad\21\0\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\15\13\1\u01b3\10\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\u01b4\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u01b5"+
+ "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\2\13\1\310\23\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\17\13\1\u0192\6\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\13\1\223\3\13\13\0\26\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\1\u01b6\4\13\13\0\12\13"+
+ "\1\310\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\223\5\13\1\u01b7\14\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\3\13\1\310\1\13\13\0\26\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\1\u01b8\4\13\13\0"+
+ "\1\u01b9\1\13\1\u0195\13\13\1\u0196\1\u0197\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0125"+
+ "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\10\13\1\u01ba\15\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\17\13\1\u01bb\6\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\21\13\1\u01bc\4\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\246"+
+ "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\7\13\1\310\16\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\223\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\4\13\1\u01bd\13\0\26\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\u01be\22\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\21\13"+
+ "\1\u01bf\4\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\u0166\21\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\21\13\1\u01c0\4\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01c1\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\4\13\1\55\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\12\13\1\u0145\13\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\3\13\1\u0192\1\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\17\13\1\u01c2\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01c3"+
+ "\22\13\1\0\3\13\10\u015a\1\u015c\75\u015a\6\12\1\0"+
+ "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+ "\5\u015b\13\0\2\u015b\2\12\1\u015b\4\12\1\u015b\1\12"+
+ "\1\u015b\2\12\1\u015b\2\12\1\u015b\4\12\1\0\3\12"+
+ "\34\0\5\u015c\13\0\2\u015c\2\0\1\u015c\4\0\1\u015c"+
+ "\1\0\1\u015c\2\0\1\u015c\2\0\1\u015c\10\0\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\272\1\u0155\3\13\13\0\10\13\1\u01c4"+
+ "\5\13\1\u014b\7\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\265\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\4\13\1\310\13\0\13\13\1\u01c5\12\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\14\13\1\310"+
+ "\11\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\1\13\1\310\24\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\u01c6\1\310\1\13\1\u01c7\1\13\13\0\1\u01c8\1\13"+
+ "\1\u01c9\13\13\1\u01ca\1\u01cb\6\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\13\1\u012c\3\13\13\0\26\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01cc"+
+ "\7\13\1\u01cd\1\13\1\310\10\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\3\13\1\u01ce\22\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\13\13\1\225"+
+ "\12\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\u012c\4\13"+
+ "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\2\13\1\u01cf\23\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u01d0\5\13\1\u01d1\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+ "\1\256\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\u0163\21\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\11\13\1\u01d2\14\13\1\0\3\13"+
+ "\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d\4\u01d3\1\u016d"+
+ "\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\5\u016d\13\u01d3\26\u016d"+
+ "\1\u01d3\3\u016d\32\u016e\1\u01d5\53\u016e\32\u016f\1\0\13\u016f"+
+ "\1\u01d6\37\u016f\32\u0170\1\0\17\u0170\1\u01d7\33\u0170\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\u01d8\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\3\13\1\u01d9\1\13\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\12\13\1\u01da\13\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\12\13\1\u01db\13\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\225\13\13\1\0"+
+ "\3\13\10\u0176\1\u01dc\75\u0176\6\u0177\1\u01dc\1\u0177\1\u01dd"+
+ "\2\u01dc\4\u0177\4\u01dc\1\u0177\2\u01dc\1\u0177\5\u01dc\5\u0177"+
+ "\13\u01dc\26\u0177\1\u01dc\3\u0177\32\u0178\1\u01de\53\u0178\46\u0179"+
+ "\1\u01de\37\u0179\52\u017a\1\u01de\33\u017a\1\0\5\u017b\5\0"+
+ "\4\u017b\11\0\1\351\3\0\5\u017b\13\0\26\u017b\1\0"+
+ "\3\u017b\1\0\5\u017c\5\0\4\u017c\11\0\1\360\3\0"+
+ "\5\u017c\13\0\26\u017c\1\0\3\u017c\1\0\5\u017e\5\0"+
+ "\4\u017e\11\0\1\367\3\0\5\u017e\13\0\26\u017e\1\0"+
+ "\3\u017e\66\0\1\u01df\57\0\1\u01e0\124\0\1\u0188\106\0"+
+ "\1\u01e1\62\0\1\u01e2\2\0\1\u01e0\124\0\1\u01e3\120\0"+
+ "\1\u01e4\50\0\1\u01e5\134\0\1\u01e0\55\0\5\u0189\13\0"+
+ "\2\u0189\1\0\2\u0189\3\0\2\u0189\1\0\1\u0189\2\0"+
+ "\1\u0189\2\0\1\u0189\10\0\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\251\21\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\13\1\225\3\13\13\0\12\13\1\310\13\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+ "\1\u01e6\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u01e7\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u01e8\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\10\13\1\337\15\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\4\13\1\u01e9\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\246"+
+ "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\u01ea\1\13\1\u01eb\22\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ec"+
+ "\5\13\1\u01ed\4\13\1\u01ee\2\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\u01ef\24\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u01ee"+
+ "\15\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\3\13\1\u01f0\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\24\13\1\310\1\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\251\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u01f1"+
+ "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\4\13\1\314\21\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\u01a6\25\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u01ba\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\u01d1\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\3\13"+
+ "\1\u0192\22\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\11\13\1\u01f2\14\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\1\13\1\246\24\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\251\22\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+ "\1\u01f3\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+ "\1\u01f4\1\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\12\13\1\u0140\13\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\201\22\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+ "\1\u01f5\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\3\13"+
+ "\1\u01f6\1\13\13\0\26\13\1\0\3\13\104\0\1\u01f7"+
+ "\1\u01f8\103\0\1\u01f9\105\0\1\u01fa\105\0\1\u01fb\42\0"+
+ "\1\u01fc\122\0\1\u01fd\117\0\1\u01ad\103\0\1\u01fe\111\0"+
+ "\1\u01ad\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+ "\1\u01ff\21\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\1\13\1\u0200\24\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\12\13\1\u0201\13\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\12\13\1\265\13\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\20\13"+
+ "\1\223\5\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u01eb\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\10\13\1\u0202\12\13\1\u01ee\2\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\13\13"+
+ "\1\310\12\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\6\13\1\310\17\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\265\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\3\13\1\u0203\1\u0120\13\0\1\u0204"+
+ "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\10\13\1\u0205\15\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\10\13\1\201\15\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\11\13\1\u0206\14\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\17\13\1\u0207"+
+ "\6\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u0208"+
+ "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\13\1\u014c\3\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\u0209\24\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u020a"+
+ "\1\13\1\u020b\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\u020c\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\u020d\2\13\1\u020e\4\13"+
+ "\1\u020f\5\13\1\u01ed\4\13\1\u0210\2\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0211\24\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+ "\1\u0212\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u0213\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\4\13\1\u0214\21\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\3\13\1\u0215\1\13\13\0\26\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+ "\1\u0161\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\11\13\1\u0112\14\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\u0216\4\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\17\13\1\u012c\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\3\13\1\223\1\13\13\0"+
+ "\3\13\1\310\22\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3"+
+ "\1\0\53\u01d3\6\u016d\1\u01d3\1\u016d\1\u01d4\2\u01d3\4\u016d"+
+ "\4\u01d3\1\u016d\2\u01d3\1\u016d\3\u01d3\1\0\1\u01d3\1\u01d4"+
+ "\1\u016d\3\u01d4\13\u01d3\2\u01d4\2\u016d\1\u01d4\4\u016d\1\u01d4"+
+ "\1\u016d\1\u01d4\5\u016d\1\u01d4\4\u016d\1\u01d3\3\u016d\34\0"+
+ "\1\u01d5\1\0\3\u01d5\13\0\2\u01d5\2\0\1\u01d5\4\0"+
+ "\1\u01d5\1\0\1\u01d5\5\0\1\u01d5\10\0\32\u016f\1\0"+
+ "\1\u016f\1\u01d6\1\u016f\3\u01d6\5\u016f\1\u01d6\5\u016f\2\u01d6"+
+ "\2\u016f\1\u01d6\4\u016f\1\u01d6\1\u016f\1\u01d6\5\u016f\1\u01d6"+
+ "\10\u016f\32\u0170\1\0\1\u0170\1\u01d7\1\u0170\3\u01d7\11\u0170"+
+ "\1\u01d7\1\u0170\2\u01d7\2\u0170\1\u01d7\4\u0170\1\u01d7\1\u0170"+
+ "\1\u01d7\5\u0170\1\u01d7\10\u0170\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u0218\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\223\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\u020d\25\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\4\13\1\u0219"+
+ "\21\13\1\0\3\13\10\u01dc\1\u01de\75\u01dc\6\12\1\0"+
+ "\2\12\2\0\4\12\4\0\1\12\2\0\1\12\5\0"+
+ "\2\u01dd\2\12\1\u01dd\13\0\10\12\1\u01dd\15\12\1\0"+
+ "\3\12\34\0\2\u01de\2\0\1\u01de\23\0\1\u01de\61\0"+
+ "\1\u021a\122\0\1\u021b\117\0\1\u01e0\103\0\1\u021c\111\0"+
+ "\1\u01e0\14\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+ "\1\256\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\12\13\1\u021d\13\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\4\13\1\u0119\21\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\13\1\u021e\24\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\1\13\1\u021f\3\13"+
+ "\13\0\26\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\10\13\1\u0220\15\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\1\13\1\u0221\7\13\1\u0222\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\10\13"+
+ "\1\307\15\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\3\13\1\u0223\22\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\1\u01f0\4\13\13\0\26\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\12\13\1\u01ee\13\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u012c"+
+ "\22\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\17\13\1\u0224\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\1\246\4\13\13\0\26\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u0119\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\1\13\1\u0205\24\13"+
+ "\1\0\3\13\104\0\1\u0225\1\u0226\104\0\1\u0227\1\u0228"+
+ "\104\0\1\u0229\1\u022a\61\0\2\u01ad\63\0\1\u022b\140\0"+
+ "\1\u01ad\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\16\13"+
+ "\1\225\7\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\12\13\1\u022c\13\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\1\13\1\u0221\24\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\11\13\1\u022d\14\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\11\13"+
+ "\1\244\14\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\1\225"+
+ "\4\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\10\13\1\225\15\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\4\13\1\274\13\0\26\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\4\13\1\u0175\21\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\4\13\1\225\13\0"+
+ "\26\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\13\1\u022e"+
+ "\3\13\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\10\13\1\u022f\15\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\16\13\1\344\7\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0119"+
+ "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\3\13\1\u0230\22\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\u0231\7\13\1\u0222\14\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223"+
+ "\13\13\1\u0232\1\13\1\u020d\4\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\u0213\4\13\13\0\26\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\12\13"+
+ "\1\u020d\1\u0232\6\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\12\13\1\u0233\13\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\1\13\1\u0234\3\13\13\0\26\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0235"+
+ "\14\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\1\223\4\13"+
+ "\13\0\26\13\1\0\3\13\10\u01d3\1\u0217\21\u01d3\1\0"+
+ "\1\u01d3\1\u0217\1\u01d3\3\u0217\13\u01d3\2\u0217\2\u01d3\1\u0217"+
+ "\4\u01d3\1\u0217\1\u01d3\1\u0217\5\u01d3\1\u0217\10\u01d3\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\13\13\1\u0236\12\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\10\13\1\u0237"+
+ "\15\13\1\0\3\13\61\0\2\u01e0\63\0\1\u0238\140\0"+
+ "\1\u01e0\12\0\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\1\u0239"+
+ "\25\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\23\13\1\201\2\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\15\13\1\u023a\10\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\7\13\1\u01ee\16\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\12\13\1\u023b"+
+ "\13\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\1\13\1\u023c\24\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\17\13\1\246\6\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\21\13\1\u01d9\4\13\1\0"+
+ "\3\13\31\0\1\u01f7\105\0\1\u01f8\127\0\1\u023d\105\0"+
+ "\1\u023e\134\0\1\u01f7\105\0\1\u01f8\70\0\1\u023f\20\0"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\24\13\1\244\1\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\17\13"+
+ "\1\u0240\6\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\15\13\1\u0241\10\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\7\13\1\u0242\16\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0243\15\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+ "\1\u0244\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\u01ba\21\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u0223\10\13\1\u0245\11\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\2\13"+
+ "\1\223\23\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\17\13\1\225\6\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\3\13\1\u0246\22\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\10\13\1\u0247\15\13"+
+ "\1\0\3\13\65\0\1\u0248\20\0\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\4\13\1\u0120\21\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\13\1\u0125\24\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\1\13\1\u01ee"+
+ "\24\13\1\0\3\13\1\12\5\13\1\0\2\12\2\0"+
+ "\4\13\4\0\1\12\2\0\1\12\5\0\5\13\13\0"+
+ "\10\13\1\u0249\15\13\1\0\3\13\73\0\1\u024a\12\0"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\310\11\13"+
+ "\1\310\10\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\1\13\1\u0125\15\13\1\u0151\6\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+ "\1\u024b\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\17\13\1\u0151\6\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\1\13\1\u024c\24\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\24\13\1\u024d\1\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\12\13"+
+ "\1\u024e\13\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\u0198\21\13\1\0\3\13\73\0\1\u024f"+
+ "\12\0\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\5\13\13\0\11\13\1\u0250"+
+ "\14\13\1\0\3\13\72\0\1\u01ad\13\0\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\24\13\1\u0251\1\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\3\13\1\u0223\10\13"+
+ "\1\u0252\11\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\5\13"+
+ "\13\0\4\13\1\u0253\12\13\1\u0151\6\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\4\13\1\310\21\13"+
+ "\1\0\3\13\72\0\1\u01e0\13\0\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\12\13\1\u0198\13\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\1\u0254\16\13\1\u0151\6\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\24\13"+
+ "\1\u0255\1\13\1\0\3\13\1\12\5\13\1\0\2\12"+
+ "\2\0\4\13\4\0\1\12\2\0\1\12\5\0\4\13"+
+ "\1\u0256\13\0\26\13\1\0\3\13\1\12\5\13\1\0"+
+ "\2\12\2\0\4\13\4\0\1\12\2\0\1\12\5\0"+
+ "\5\13\13\0\1\13\1\204\24\13\1\0\3\13\1\12"+
+ "\5\13\1\0\2\12\2\0\4\13\4\0\1\12\2\0"+
+ "\1\12\5\0\5\13\13\0\17\13\1\u0257\6\13\1\0"+
+ "\3\13\1\12\5\13\1\0\2\12\2\0\4\13\4\0"+
+ "\1\12\2\0\1\12\5\0\4\13\1\251\13\0\26\13"+
+ "\1\0\3\13\1\12\5\13\1\0\2\12\2\0\4\13"+
+ "\4\0\1\12\2\0\1\12\5\0\5\13\13\0\4\13"+
+ "\1\u0166\14\13\1\u0258\4\13\1\0\3\13\1\12\5\13"+
+ "\1\0\2\12\2\0\4\13\4\0\1\12\2\0\1\12"+
+ "\5\0\5\13\13\0\13\13\1\u0259\12\13\1\0\3\13"+
+ "\1\12\5\13\1\0\2\12\2\0\4\13\4\0\1\12"+
+ "\2\0\1\12\5\0\5\13\13\0\14\13\1\u01a2\11\13"+
+ "\1\0\3\13";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[38500];
+ 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 =
+ "\11\0\4\1\1\11\1\1\1\11\3\1\2\11\4\1"+
+ "\1\11\15\1\1\11\1\1\1\11\24\1\1\11\2\1"+
+ "\1\11\3\1\1\11\2\1\2\11\1\1\1\11\3\1"+
+ "\1\11\1\1\1\11\5\1\1\11\1\1\1\11\1\1"+
+ "\1\11\2\1\1\11\15\1\1\0\1\1\1\0\1\1"+
+ "\1\11\1\1\3\0\1\1\1\0\2\1\2\0\34\1"+
+ "\10\0\43\1\1\0\1\1\2\0\32\1\3\0\1\1"+
+ "\1\11\2\1\1\0\1\11\1\1\1\0\1\11\2\1"+
+ "\1\0\1\11\1\1\1\0\3\1\1\0\1\11\1\1"+
+ "\1\0\3\1\10\0\1\1\1\0\2\1\1\0\1\1"+
+ "\1\0\1\1\2\0\41\1\15\0\35\1\1\0\23\1"+
+ "\3\0\5\1\1\0\1\1\5\0\1\1\1\0\1\1"+
+ "\11\0\40\1\4\0\1\11\5\0\40\1\1\0\10\1"+
+ "\1\0\2\1\2\11\5\0\21\1\2\11\6\0\33\1"+
+ "\3\0\10\1\7\0\14\1\1\0\4\1\2\11\1\0"+
+ "\10\1\1\0\1\1\1\0\4\1\1\0\12\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[601];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an single quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -3;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals that we are inside
+ * an single quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -4;
+
+ /**
+ * Token type specific to PerlTokenMaker; this signals we are in a POD
+ * block.
+ */
+ public static final int INTERNAL_POD = -5;
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PerlTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return super.getMarkOccurrencesOfTokenType(type) || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ start = text.offset;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_UNQUOTED:
+ state = HEREDOC_EOF_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+ state = HEREDOC_EOF_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_UNQUOTED:
+ state = HEREDOC_EOT_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+ state = HEREDOC_EOT_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_POD:
+ state = POD;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Returns whether a regular expression token can follow the specified
+ * token.
+ *
+ * @param t The token to check, which may be <code>null</code>.
+ * @return Whether a regular expression token may follow this one.
+ */
+ private static final boolean regexCanFollow(Token t) {
+ char ch;
+ // We basically try to mimic Eclipse's JS editor's behavior here.
+ return t==null ||
+ //t.isOperator() ||
+ (t.textCount==1 && (
+ (ch=t.text[t.textOffset])=='=' ||
+ ch=='(' ||
+ ch==',' ||
+ ch=='?' ||
+ ch==':' ||
+ ch=='[' ||
+ ch=='!' ||
+ ch=='&'
+ )) ||
+ /* Operators "==", "===", "!=", "!==", etc. */
+ (t.type==Token.OPERATOR &&
+ ((ch=t.text[t.textOffset+t.textCount-1])=='=' || ch=='~'));
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public PerlTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public PerlTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 174) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 46: break;
+ case 34:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 47: break;
+ case 40:
+ { if (start==zzStartRead) { addToken(Token.COMMENT_DOCUMENTATION); yybegin(YYINITIAL); }
+ }
+ case 48: break;
+ case 26:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 49: break;
+ case 11:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 50: break;
+ case 38:
+ { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+ }
+ case 51: break;
+ case 31:
+ { addToken(Token.FUNCTION);
+ }
+ case 52: break;
+ case 36:
+ { boolean highlightedAsRegex = false;
+ if (firstToken==null) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ else {
+ // If this is *likely* to be a regex, based on
+ // the previous token, highlight it as such.
+ Token t = firstToken.getLastNonCommentNonWhitespaceToken();
+ if (regexCanFollow(t)) {
+ addToken(Token.REGEX);
+ highlightedAsRegex = true;
+ }
+ }
+ // If it doesn't *appear* to be a regex, highlight it as
+ // individual tokens.
+ if (!highlightedAsRegex) {
+ int temp = zzStartRead + 1;
+ addToken(zzStartRead, zzStartRead, Token.OPERATOR);
+ zzStartRead = zzCurrentPos = zzMarkedPos = temp;
+ }
+ }
+ case 53: break;
+ case 30:
+ { addToken(Token.VARIABLE);
+ }
+ case 54: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 55: break;
+ case 24:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+ }
+ case 56: break;
+ case 4:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 57: break;
+ case 29:
+ { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken;
+ }
+ case 58: break;
+ case 41:
+ { if (start==zzStartRead) { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ }
+ case 59: break;
+ case 44:
+ { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+ }
+ case 60: break;
+ case 45:
+ { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+ }
+ case 61: break;
+ case 42:
+ { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+ }
+ case 62: break;
+ case 13:
+ { /* Skip escaped chars. */
+ }
+ case 63: break;
+ case 37:
+ { addToken(Token.REGEX);
+ }
+ case 64: break;
+ case 18:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 65: break;
+ case 28:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 66: break;
+ case 21:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+ }
+ case 67: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 68: break;
+ case 10:
+ { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+ }
+ case 69: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 70: break;
+ case 33:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 71: break;
+ case 20:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+ }
+ case 72: break;
+ case 15:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 73: break;
+ case 16:
+ { /* Skip escaped single quotes only, but this should still work. */
+ }
+ case 74: break;
+ case 23:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+ }
+ case 75: break;
+ case 35:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.PREPROCESSOR); addToken(temp,zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 76: break;
+ case 39:
+ { addToken(Token.COMMENT_EOL); start = zzMarkedPos; yybegin(POD);
+ }
+ case 77: break;
+ case 32:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 78: break;
+ case 19:
+ { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 79: break;
+ case 8:
+ { addToken(Token.SEPARATOR);
+ }
+ case 80: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 81: break;
+ case 7:
+ { addToken(Token.OPERATOR);
+ }
+ case 82: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 83: break;
+ case 25:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+ }
+ case 84: break;
+ case 27:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 85: break;
+ case 43:
+ { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+ }
+ case 86: break;
+ case 9:
+ { start = zzMarkedPos-1; yybegin(BACKTICKS);
+ }
+ case 87: break;
+ case 12:
+ {
+ }
+ case 88: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 89: break;
+ case 22:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+ }
+ case 90: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case HEREDOC_EOF_SINGLE_QUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+ }
+ case 602: break;
+ case HEREDOC_EOT_SINGLE_QUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+ }
+ case 603: break;
+ case HEREDOC_EOT_UNQUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+ }
+ case 604: break;
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 605: break;
+ case BACKTICKS: {
+ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 606: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 607: break;
+ case HEREDOC_EOF_UNQUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+ }
+ case 608: break;
+ case CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 609: break;
+ case POD: {
+ addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addEndToken(INTERNAL_POD); return firstToken;
+ }
+ case 610: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex
new file mode 100644
index 0000000..ae687ad
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex
@@ -0,0 +1,226 @@
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ * two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class PlainTextTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PlainTextTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @param link Whether this token is a hyperlink.
+ */
+ private void addToken(int tokenType, boolean link) {
+ int so = zzStartRead + offsetShift;
+ super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Always returns <code>Token.NULL</code>, as there are no multiline
+ * tokens in properties files.
+ *
+ * @param text The line of tokens to examine.
+ * @param initialTokenType The token type to start with (i.e., the value
+ * of <code>getLastTokenTypeOnLine</code> for the line before
+ * <code>text</code>).
+ * @return <code>Token.NULL</code>.
+ */
+ public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+ return Token.NULL;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return <code>null</code>, as there are no comments in plain text.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return null;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in plain text files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(YYINITIAL);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+LetterOrDigit = ([a-zA-Z0-9])
+Identifier = ({LetterOrDigit}+)
+Separator = ([^a-zA-Z0-9 \t\n])
+WhiteSpace = ([ \t]+)
+LineTerminator = ([\n])
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrDigit}|[_\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{LetterOrDigit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%%
+
+<YYINITIAL> {
+ {URL} { addToken(Token.IDENTIFIER, true); }
+ {Identifier} { addToken(Token.IDENTIFIER, false); }
+ {Separator} { addToken(Token.IDENTIFIER, false); }
+ {WhiteSpace} { addToken(Token.WHITESPACE, false); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ <<EOF>> { addNullToken(); return firstToken; }
+ . { /* Never happens */ addToken(Token.IDENTIFIER, false); }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java
new file mode 100644
index 0000000..f8884f5
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java
@@ -0,0 +1,643 @@
+/* The following code was generated by JFlex 1.4.1 on 12/9/11 6:40 PM */
+
+/*
+ * 11/07/2008
+ *
+ * PlainTextTokenMaker.flex - Scanner for plain text files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for plain text files.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>), so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>PlainTextTokenMaker.java</code> file will contain
+ * two definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class PlainTextTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\1\6\1\4"+
+ "\7\4\1\4\1\21\1\5\12\1\1\17\1\4\1\0\1\4\1\0"+
+ "\2\4\32\1\1\4\1\0\1\4\1\0\1\4\1\0\4\1\1\16"+
+ "\1\13\1\1\1\7\1\14\2\1\1\15\3\1\1\11\2\1\1\12"+
+ "\1\10\2\1\1\20\3\1\3\0\1\4\uff81\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 =
+ "\1\0\2\1\1\2\1\3\14\1\1\0\1\4\2\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[21];
+ 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\22\0\44\0\22\0\66\0\110\0\132\0\154"+
+ "\0\176\0\220\0\242\0\264\0\306\0\330\0\352\0\374"+
+ "\0\u010e\0\u0120\0\u0132\0\u0144\0\u0132";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[21];
+ 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 =
+ "\1\2\1\3\1\4\1\5\3\2\1\6\3\3\1\7"+
+ "\3\3\1\2\1\10\1\2\23\0\1\3\5\0\10\3"+
+ "\1\0\1\3\4\0\1\5\17\0\1\3\5\0\1\3"+
+ "\1\11\6\3\1\0\1\3\2\0\1\3\5\0\1\3"+
+ "\1\12\3\3\1\13\2\3\1\0\1\3\2\0\1\3"+
+ "\5\0\10\3\1\0\1\14\2\0\1\3\5\0\1\3"+
+ "\1\15\6\3\1\0\1\3\2\0\1\3\5\0\2\3"+
+ "\1\16\5\3\1\0\1\3\2\0\1\3\5\0\6\3"+
+ "\1\17\1\3\1\0\1\3\2\0\1\3\5\0\10\3"+
+ "\1\0\1\20\2\0\1\3\5\0\2\3\1\21\5\3"+
+ "\1\0\1\3\2\0\1\3\5\0\10\3\1\22\1\3"+
+ "\2\0\1\3\5\0\7\3\1\16\1\0\1\3\2\0"+
+ "\1\3\5\0\10\3\1\0\1\3\1\23\1\0\1\3"+
+ "\5\0\3\3\1\16\4\3\1\22\1\3\6\0\1\24"+
+ "\15\0\1\23\2\0\1\25\12\23\1\25\1\23\1\25"+
+ "\5\0\1\23\14\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[342];
+ 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 =
+ "\1\0\1\11\1\1\1\11\15\1\1\0\1\1\2\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[21];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PlainTextTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @param link Whether this token is a hyperlink.
+ */
+ private void addToken(int tokenType, boolean link) {
+ int so = zzStartRead + offsetShift;
+ super.addToken(zzBuffer, zzStartRead,zzMarkedPos-1, tokenType, so, link);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Always returns <code>Token.NULL</code>, as there are no multiline
+ * tokens in properties files.
+ *
+ * @param text The line of tokens to examine.
+ * @param initialTokenType The token type to start with (i.e., the value
+ * of <code>getLastTokenTypeOnLine</code> for the line before
+ * <code>text</code>).
+ * @return <code>Token.NULL</code>.
+ */
+ public int getLastTokenTypeOnLine(Segment text, int initialTokenType) {
+ return Token.NULL;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return <code>null</code>, as there are no comments in plain text.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return null;
+ }
+
+
+ /**
+ * Always returns <tt>false</tt>, as you never want "mark occurrences"
+ * working in plain text files.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return false;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(YYINITIAL);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public PlainTextTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public PlainTextTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 94) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 3:
+ { addToken(Token.WHITESPACE, false);
+ }
+ case 5: break;
+ case 2:
+ { addNullToken(); return firstToken;
+ }
+ case 6: break;
+ case 4:
+ { addToken(Token.IDENTIFIER, true);
+ }
+ case 7: break;
+ case 1:
+ { addToken(Token.IDENTIFIER, false);
+ }
+ case 8: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 22: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex
new file mode 100644
index 0000000..45edee6
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex
@@ -0,0 +1,235 @@
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ * contain two definitions of both <code>zzRefill</code> and
+ * <code>yyreset</code>. You should hand-delete the second of each
+ * definition (the ones generated by the lexer), as these generated
+ * methods modify the input buffer, which we'll never have to do.
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+%%
+
+%public
+%class PropertiesFileTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PropertiesFileTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = VALUE;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Equals = ([=\:])
+Name = ([^=\: \t\n#!]*)
+Whitespace = ([ \t]+)
+Comment = ([#!].*)
+SingleQuote = (')
+
+%state VALUE
+
+%%
+
+<YYINITIAL> {
+ {Name} { addToken(Token.RESERVED_WORD); }
+ {Equals} { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE); }
+ {Whitespace} { addToken(Token.WHITESPACE); }
+ {Comment} { addToken(Token.COMMENT_EOL); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<VALUE> {
+ {SingleQuote}[^']*{SingleQuote}? { addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos; }
+ [^'\{\\]+ {}
+ "{"[^\}]*"}"? { int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos; }
+ [\\]. {}
+ [\\] { addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java
new file mode 100644
index 0000000..ce2b859
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java
@@ -0,0 +1,661 @@
+/* The following code was generated by JFlex 1.4.1 on 1/28/11 4:16 PM */
+
+/*
+ * 03/21/2005
+ *
+ * PropertiesFileTokenMaker.java - Scanner for properties files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class splits up text into tokens representing a Java properties file.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>PropertiesFileTokenMaker.java</code> file will
+ * contain two definitions of both <code>zzRefill</code> and
+ * <code>yyreset</code>. You should hand-delete the second of each
+ * definition (the ones generated by the lexer), as these generated
+ * methods modify the input buffer, which we'll never have to do.
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.4
+ *
+ */
+
+public class PropertiesFileTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+ private static final int ZZ_BUFFERSIZE = 16384;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+ public static final int VALUE = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\3\1\2\25\0\1\3\1\4\1\0\1\4\3\0\1\5"+
+ "\22\0\1\1\2\0\1\1\36\0\1\6\36\0\1\7\1\0\1\10"+
+ "\uff82\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 =
+ "\1\1\1\0\1\1\1\2\1\3\1\4\1\5\1\6"+
+ "\1\7\1\10\1\6\1\5\1\10";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[13];
+ 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\11\0\22\0\33\0\44\0\55\0\66\0\77"+
+ "\0\110\0\121\0\33\0\33\0\33";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[13];
+ 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 =
+ "\1\3\1\4\1\0\1\5\1\6\4\3\5\7\1\10"+
+ "\1\11\1\12\1\7\1\3\4\0\4\3\14\0\1\5"+
+ "\5\0\2\6\1\0\6\6\5\7\3\0\1\7\5\10"+
+ "\1\13\3\10\2\14\1\0\6\14\10\12\1\15";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[90];
+ 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 =
+ "\1\1\1\0\1\1\1\11\6\1\3\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[13];
+ 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PropertiesFileTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = VALUE;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public PropertiesFileTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public PropertiesFileTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 42) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 7:
+ { addToken(start, zzEndRead, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 9: break;
+ case 2:
+ { start = zzMarkedPos; addToken(Token.OPERATOR); yybegin(VALUE);
+ }
+ case 10: break;
+ case 8:
+ { int temp=zzStartRead; addToken(start, zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addToken(temp, zzMarkedPos-1, Token.VARIABLE); start = zzMarkedPos;
+ }
+ case 11: break;
+ case 3:
+ { addToken(Token.WHITESPACE);
+ }
+ case 12: break;
+ case 6:
+ { addToken(start, zzMarkedPos-1, Token.LITERAL_STRING_DOUBLE_QUOTE); start = zzMarkedPos;
+ }
+ case 13: break;
+ case 1:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 14: break;
+ case 5:
+ {
+ }
+ case 15: break;
+ case 4:
+ { addToken(Token.COMMENT_EOL);
+ }
+ case 16: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 14: break;
+ case VALUE: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addNullToken(); return firstToken;
+ }
+ case 15: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex
new file mode 100644
index 0000000..d5c51df
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex
@@ -0,0 +1,441 @@
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMaker;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+%%
+
+%public
+%class PythonTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PythonTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = LONG_STRING_2;
+ break;
+ case Token.LITERAL_CHAR:
+ state = LONG_STRING_1;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+%}
+
+/* This part is taken from http://www.python.org/doc/2.2.3/ref/grammar.txt */
+identifier = (({letter}|"_")({letter}|{digit}|"_")*)
+letter = ({lowercase}|{uppercase})
+lowercase = ([a-z])
+uppercase = ([A-Z])
+digit = ([0-9])
+stringliteral = ({stringprefix}?{shortstring})
+stringprefix = ("r"|"u"[rR]?|"R"|"U"[rR]?)
+shortstring1 = ([\']{shortstring1item}*[\']?)
+shortstring2 = ([\"]{shortstring2item}*[\"]?)
+shortstring = ({shortstring1}|{shortstring2})
+shortstring1item = ({shortstring1char}|{escapeseq})
+shortstring2item = ({shortstring2char}|{escapeseq})
+shortstring1char = ([^\\\n\'])
+shortstring2char = ([^\\\n\"])
+escapeseq = ([\\].)
+longinteger = ({integer}[lL])
+integer = ({decimalinteger}|{octinteger}|{hexinteger})
+decimalinteger = ({nonzerodigit}{digit}*|"0")
+octinteger = ("0"{octdigit}+)
+hexinteger = ("0"[xX]{hexdigit}+)
+nonzerodigit = ([1-9])
+octdigit = ([0-7])
+hexdigit = ({digit}|[a-f]|[A-F])
+floatnumber = ({pointfloat}|{exponentfloat})
+pointfloat = ({intpart}?{fraction}|{intpart}".")
+exponentfloat = (({intpart}|{pointfloat}){exponent})
+intpart = ({digit}+)
+fraction = ("."{digit}+)
+exponent = ([eE][\+\-]?{digit}+)
+imagnumber = (({floatnumber}|{intpart})[jJ])
+
+ErrorNumberFormat = ({digit}{NonSeparator}+)
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#")
+
+LongStringStart1 = ({stringprefix}?\'\'\')
+LongStringStart2 = ({stringprefix}?\"\"\")
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+LineComment = ("#".*)
+
+
+%state LONG_STRING_1
+%state LONG_STRING_2
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "and" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "as" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "assert" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "class" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "def" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "del" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elif" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "except" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "finally" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "from" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "import" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "in" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "is" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lambda" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "not" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "or" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pass" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "print" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "try" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "yield" { addToken(Token.RESERVED_WORD); }
+
+/* Data types. */
+<YYINITIAL> "char" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "double" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "float" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "int" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "long" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "short" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "signed" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "unsigned" { addToken(Token.DATA_TYPE); }
+<YYINITIAL> "void" { addToken(Token.DATA_TYPE); }
+
+/* Standard functions */
+<YYINITIAL> "abs" { addToken(Token.FUNCTION); }
+<YYINITIAL> "apply" { addToken(Token.FUNCTION); }
+<YYINITIAL> "bool" { addToken(Token.FUNCTION); }
+<YYINITIAL> "buffer" { addToken(Token.FUNCTION); }
+<YYINITIAL> "callable" { addToken(Token.FUNCTION); }
+<YYINITIAL> "chr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "classmethod" { addToken(Token.FUNCTION); }
+<YYINITIAL> "cmp" { addToken(Token.FUNCTION); }
+<YYINITIAL> "coerce" { addToken(Token.FUNCTION); }
+<YYINITIAL> "compile" { addToken(Token.FUNCTION); }
+<YYINITIAL> "complex" { addToken(Token.FUNCTION); }
+<YYINITIAL> "delattr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "dict" { addToken(Token.FUNCTION); }
+<YYINITIAL> "dir" { addToken(Token.FUNCTION); }
+<YYINITIAL> "divmod" { addToken(Token.FUNCTION); }
+<YYINITIAL> "enumerate" { addToken(Token.FUNCTION); }
+<YYINITIAL> "eval" { addToken(Token.FUNCTION); }
+<YYINITIAL> "execfile" { addToken(Token.FUNCTION); }
+<YYINITIAL> "file" { addToken(Token.FUNCTION); }
+<YYINITIAL> "filter" { addToken(Token.FUNCTION); }
+<YYINITIAL> "float" { addToken(Token.FUNCTION); }
+<YYINITIAL> "getattr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "globals" { addToken(Token.FUNCTION); }
+<YYINITIAL> "hasattr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "hash" { addToken(Token.FUNCTION); }
+<YYINITIAL> "hex" { addToken(Token.FUNCTION); }
+<YYINITIAL> "id" { addToken(Token.FUNCTION); }
+<YYINITIAL> "input" { addToken(Token.FUNCTION); }
+<YYINITIAL> "int" { addToken(Token.FUNCTION); }
+<YYINITIAL> "intern" { addToken(Token.FUNCTION); }
+<YYINITIAL> "isinstance" { addToken(Token.FUNCTION); }
+<YYINITIAL> "issubclass" { addToken(Token.FUNCTION); }
+<YYINITIAL> "iter" { addToken(Token.FUNCTION); }
+<YYINITIAL> "len" { addToken(Token.FUNCTION); }
+<YYINITIAL> "list" { addToken(Token.FUNCTION); }
+<YYINITIAL> "locals" { addToken(Token.FUNCTION); }
+<YYINITIAL> "long" { addToken(Token.FUNCTION); }
+<YYINITIAL> "map" { addToken(Token.FUNCTION); }
+<YYINITIAL> "max" { addToken(Token.FUNCTION); }
+<YYINITIAL> "min" { addToken(Token.FUNCTION); }
+<YYINITIAL> "object" { addToken(Token.FUNCTION); }
+<YYINITIAL> "oct" { addToken(Token.FUNCTION); }
+<YYINITIAL> "open" { addToken(Token.FUNCTION); }
+<YYINITIAL> "ord" { addToken(Token.FUNCTION); }
+<YYINITIAL> "pow" { addToken(Token.FUNCTION); }
+<YYINITIAL> "property" { addToken(Token.FUNCTION); }
+<YYINITIAL> "range" { addToken(Token.FUNCTION); }
+<YYINITIAL> "raw_input" { addToken(Token.FUNCTION); }
+<YYINITIAL> "reduce" { addToken(Token.FUNCTION); }
+<YYINITIAL> "reload" { addToken(Token.FUNCTION); }
+<YYINITIAL> "repr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "round" { addToken(Token.FUNCTION); }
+<YYINITIAL> "setattr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "slice" { addToken(Token.FUNCTION); }
+<YYINITIAL> "staticmethod" { addToken(Token.FUNCTION); }
+<YYINITIAL> "str" { addToken(Token.FUNCTION); }
+<YYINITIAL> "sum" { addToken(Token.FUNCTION); }
+<YYINITIAL> "super" { addToken(Token.FUNCTION); }
+<YYINITIAL> "tuple" { addToken(Token.FUNCTION); }
+<YYINITIAL> "type" { addToken(Token.FUNCTION); }
+<YYINITIAL> "unichr" { addToken(Token.FUNCTION); }
+<YYINITIAL> "unicode" { addToken(Token.FUNCTION); }
+<YYINITIAL> "vars" { addToken(Token.FUNCTION); }
+<YYINITIAL> "xrange" { addToken(Token.FUNCTION); }
+<YYINITIAL> "zip" { addToken(Token.FUNCTION); }
+
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character Literals. */
+ {stringliteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {LongStringStart1} { yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR); }
+ {LongStringStart2} { yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+
+ /* Comment Literals. */
+ {LineComment} { addToken(Token.COMMENT_EOL); }
+
+ /* Separators. */
+ "(" { addToken(Token.SEPARATOR); }
+ ")" { addToken(Token.SEPARATOR); }
+ "[" { addToken(Token.SEPARATOR); }
+ "]" { addToken(Token.SEPARATOR); }
+ "{" { addToken(Token.SEPARATOR); }
+ "}" { addToken(Token.SEPARATOR); }
+
+ /* Operators. */
+ "=" { addToken(Token.OPERATOR); }
+ "+" { addToken(Token.OPERATOR); }
+ "-" { addToken(Token.OPERATOR); }
+ "*" { addToken(Token.OPERATOR); }
+ "/" { addToken(Token.OPERATOR); }
+ "%" { addToken(Token.OPERATOR); }
+ "**" { addToken(Token.OPERATOR); }
+ "~" { addToken(Token.OPERATOR); }
+ "<" { addToken(Token.OPERATOR); }
+ ">" { addToken(Token.OPERATOR); }
+ "<<" { addToken(Token.OPERATOR); }
+ ">>" { addToken(Token.OPERATOR); }
+ "==" { addToken(Token.OPERATOR); }
+ "+=" { addToken(Token.OPERATOR); }
+ "-=" { addToken(Token.OPERATOR); }
+ "*=" { addToken(Token.OPERATOR); }
+ "/=" { addToken(Token.OPERATOR); }
+ "%=" { addToken(Token.OPERATOR); }
+ ">>=" { addToken(Token.OPERATOR); }
+ "<<=" { addToken(Token.OPERATOR); }
+ "^" { addToken(Token.OPERATOR); }
+ "&" { addToken(Token.OPERATOR); }
+ "&&" { addToken(Token.OPERATOR); }
+ "|" { addToken(Token.OPERATOR); }
+ "||" { addToken(Token.OPERATOR); }
+ "?" { addToken(Token.OPERATOR); }
+ ":" { addToken(Token.OPERATOR); }
+ "," { addToken(Token.OPERATOR); }
+ "!" { addToken(Token.OPERATOR); }
+ "++" { addToken(Token.OPERATOR); }
+ "--" { addToken(Token.OPERATOR); }
+ "." { addToken(Token.OPERATOR); }
+ "," { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {longinteger}|{integer} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {floatnumber}|{imagnumber} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Other punctuation, we'll highlight it as "identifiers." */
+ "@" { addToken(Token.IDENTIFIER); }
+ ";" { addToken(Token.IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
+
+<LONG_STRING_1> {
+ [^\']+ { addToken(Token.LITERAL_CHAR); }
+ "'''" { yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR); }
+ "'" { addToken(Token.LITERAL_CHAR); }
+ <<EOF>> {
+ if (firstToken==null) {
+ addToken(Token.LITERAL_CHAR);
+ }
+ return firstToken;
+ }
+}
+
+<LONG_STRING_2> {
+ [^\"]+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \"\"\" { yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ \" { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> {
+ if (firstToken==null) {
+ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ return firstToken;
+ }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java
new file mode 100644
index 0000000..9ae5938
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/PythonTokenMaker.java
@@ -0,0 +1,1088 @@
+/* The following code was generated by JFlex 1.4.1 on 10/16/06 10:31 AM */
+
+/*
+ * 12/06/2005
+ *
+ * PythonTokenMaker.java - Token maker for the Python programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Scanner for the Python programming language.
+ *
+ * @author Robert Futrell
+ * @version 0.3
+ */
+
+public class PythonTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+ public static final int LONG_STRING_2 = 2;
+ public static final int LONG_STRING_1 = 1;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\34\1\12\1\0\1\34\1\32\22\0\1\34\1\64\1\11"+
+ "\1\33\1\0\1\63\1\67\1\10\1\57\1\57\1\62\1\61\1\64"+
+ "\1\27\1\24\1\63\1\16\7\21\2\3\1\64\1\72\1\65\1\60"+
+ "\1\66\1\64\1\71\4\23\1\26\1\23\3\2\1\31\1\2\1\15"+
+ "\5\2\1\6\2\2\1\7\2\2\1\20\2\2\1\57\1\13\1\57"+
+ "\1\64\1\1\1\0\1\35\1\42\1\44\1\37\1\25\1\22\1\52"+
+ "\1\54\1\46\1\30\1\43\1\14\1\51\1\36\1\45\1\47\1\2"+
+ "\1\4\1\40\1\41\1\5\1\55\1\53\1\17\1\50\1\56\1\57"+
+ "\1\70\1\57\1\64\uff81\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 =
+ "\3\0\1\1\1\2\1\3\4\2\2\4\1\5\1\2"+
+ "\1\3\2\2\1\6\1\2\1\6\1\7\1\10\21\2"+
+ "\1\11\10\6\1\2\2\12\2\4\1\13\1\3\1\14"+
+ "\1\13\1\14\4\2\2\4\1\0\2\4\1\0\4\2"+
+ "\1\13\1\3\1\13\12\2\1\15\27\2\1\15\3\2"+
+ "\2\15\1\16\1\15\15\2\3\0\2\14\1\0\12\2"+
+ "\1\4\1\17\1\20\3\2\1\3\15\2\1\15\22\2"+
+ "\1\21\14\2\1\22\1\23\1\14\6\2\1\21\3\2"+
+ "\1\15\36\2\1\15\17\2\1\15\6\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[265];
+ 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\73\0\166\0\261\0\354\0\u0127\0\u0162\0\u019d"+
+ "\0\u01d8\0\u0213\0\u024e\0\u0289\0\261\0\u02c4\0\u02ff\0\u033a"+
+ "\0\u0375\0\u03b0\0\u03eb\0\u0426\0\u0461\0\u049c\0\u04d7\0\u0512"+
+ "\0\u054d\0\u0588\0\u05c3\0\u05fe\0\u0639\0\u0674\0\u06af\0\u06ea"+
+ "\0\u0725\0\u0760\0\u079b\0\u07d6\0\u0811\0\u084c\0\u0887\0\261"+
+ "\0\u08c2\0\u08fd\0\u0938\0\261\0\u0973\0\u09ae\0\u09e9\0\u0a24"+
+ "\0\261\0\u0a5f\0\u0a9a\0\u0ad5\0\u0b10\0\u0b4b\0\u0b4b\0\u0b86"+
+ "\0\u0bc1\0\u0b4b\0\u0bfc\0\u0c37\0\u0c72\0\u0cad\0\u0ce8\0\u0d23"+
+ "\0\u0d5e\0\u0d99\0\u0dd4\0\u0e0f\0\u0e4a\0\u0e85\0\u0ec0\0\u0efb"+
+ "\0\u0f36\0\u0f71\0\u0fac\0\u0fe7\0\u1022\0\u105d\0\u1098\0\u10d3"+
+ "\0\u110e\0\u1149\0\u1184\0\u11bf\0\u11fa\0\u1235\0\u1270\0\u12ab"+
+ "\0\u12e6\0\u1321\0\u135c\0\u1397\0\u13d2\0\u140d\0\u1448\0\u1483"+
+ "\0\u14be\0\u14f9\0\u1534\0\u156f\0\u15aa\0\u15e5\0\u1620\0\u165b"+
+ "\0\u1696\0\u16d1\0\u170c\0\u1747\0\u1782\0\u17bd\0\u17f8\0\u1833"+
+ "\0\u186e\0\354\0\u18a9\0\354\0\u18e4\0\u191f\0\u195a\0\u1995"+
+ "\0\u19d0\0\u1a0b\0\u1a46\0\u1a81\0\u1abc\0\u1af7\0\u1b32\0\u1b6d"+
+ "\0\u1ba8\0\u1be3\0\u1c1e\0\u1c59\0\u1c94\0\261\0\u1ccf\0\u1d0a"+
+ "\0\u1d45\0\u1d80\0\u1dbb\0\u1df6\0\u1e31\0\u1e6c\0\u1ea7\0\u1ee2"+
+ "\0\u1f1d\0\u1f58\0\261\0\261\0\261\0\u1f93\0\u1fce\0\u2009"+
+ "\0\u2044\0\u207f\0\u20ba\0\u20f5\0\u2130\0\u216b\0\u21a6\0\u21e1"+
+ "\0\u221c\0\u2257\0\u2292\0\u22cd\0\u2308\0\u2343\0\u237e\0\u23b9"+
+ "\0\u23f4\0\u242f\0\u237e\0\u246a\0\u24a5\0\u24e0\0\u251b\0\u2556"+
+ "\0\u2591\0\u25cc\0\u2607\0\u2642\0\u267d\0\u26b8\0\u26f3\0\u272e"+
+ "\0\u2769\0\u27a4\0\u27df\0\u281a\0\u2855\0\u2890\0\u28cb\0\u2906"+
+ "\0\u2941\0\u297c\0\u29b7\0\u29f2\0\u2a2d\0\u2a68\0\261\0\261"+
+ "\0\u2aa3\0\u2ade\0\u2b19\0\u2b54\0\u17bd\0\u2b8f\0\u2bca\0\354"+
+ "\0\u2c05\0\u2c40\0\u2c7b\0\u2cb6\0\u2cf1\0\u2d2c\0\u2d67\0\u2da2"+
+ "\0\u2ddd\0\u2e18\0\u2e53\0\u2e8e\0\u2ec9\0\u2f04\0\u2f3f\0\u2f7a"+
+ "\0\u2fb5\0\u2ff0\0\u302b\0\u3066\0\u30a1\0\u30dc\0\u3117\0\u3152"+
+ "\0\u318d\0\u31c8\0\u3203\0\u323e\0\u3279\0\u32b4\0\u32ef\0\u332a"+
+ "\0\u3365\0\u33a0\0\u33db\0\u3416\0\u3451\0\u348c\0\u34c7\0\u3502"+
+ "\0\u353d\0\u3578\0\u35b3\0\u35ee\0\u33db\0\u3629\0\u3664\0\u369f"+
+ "\0\u36da\0\u3715\0\u1270\0\u3750\0\u378b\0\u37c6\0\u3801\0\u383c"+
+ "\0\u3877";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[265];
+ 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 =
+ "\1\4\2\5\1\6\1\7\1\10\1\11\1\12\1\13"+
+ "\1\14\1\15\1\4\1\16\1\5\1\17\1\20\1\5"+
+ "\1\6\1\21\1\5\1\22\1\23\1\5\1\24\2\5"+
+ "\1\4\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+
+ "\1\34\1\5\1\35\1\36\1\37\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\51\1\54\1\55\1\56\1\57\1\60\2\61"+
+ "\10\62\1\63\62\62\11\64\1\65\61\64\74\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+ "\14\0\3\66\1\6\4\66\3\0\1\66\2\67\1\6"+
+ "\2\66\1\6\2\66\1\70\2\71\1\0\2\72\1\0"+
+ "\1\66\1\0\22\66\12\0\1\66\2\0\7\5\1\13"+
+ "\1\14\2\0\10\5\1\0\1\73\1\5\1\0\2\5"+
+ "\3\0\1\74\7\5\1\75\11\5\15\0\3\5\1\11"+
+ "\1\5\1\11\1\5\1\13\1\14\2\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\1\5\1\76\20\5\15\0"+
+ "\7\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\3\5\1\11\1\5\1\11"+
+ "\1\5\1\13\1\14\2\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\14\0\10\77\1\100\1\77\1\0"+
+ "\1\101\57\77\11\102\1\103\1\0\1\104\57\102\1\0"+
+ "\7\5\4\0\10\5\1\0\1\105\1\5\1\0\2\5"+
+ "\3\0\1\106\7\5\1\107\1\110\10\5\14\0\3\66"+
+ "\1\111\4\66\3\0\1\66\2\67\1\112\2\113\1\112"+
+ "\2\66\1\70\2\71\1\0\2\72\1\0\1\66\1\0"+
+ "\22\66\12\0\1\66\2\0\3\5\1\114\3\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\3\5\1\115\3\5\4\0\1\116\7\5\1\0\2\5"+
+ "\1\0\2\5\3\0\10\5\1\117\1\120\10\5\17\0"+
+ "\1\70\12\0\1\70\2\0\1\70\52\0\7\5\4\0"+
+ "\1\121\2\5\1\122\4\5\1\0\2\5\1\0\2\5"+
+ "\3\0\1\5\1\123\16\5\1\124\1\5\43\0\1\54"+
+ "\30\0\1\54\12\0\12\25\1\0\60\25\34\0\1\26"+
+ "\37\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\1\5\1\125\1\5\1\126\1\5\1\127\4\5"+
+ "\1\130\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\10\5\1\131\11\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\132\1\5\1\0\2\5\3\0"+
+ "\10\5\1\133\1\134\10\5\15\0\4\5\1\135\2\5"+
+ "\4\0\1\136\7\5\1\0\1\137\1\5\1\0\2\5"+
+ "\3\0\4\5\1\140\4\5\1\141\5\5\1\142\2\5"+
+ "\15\0\3\5\1\143\1\144\2\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\13\5\1\145\6\5\15\0"+
+ "\3\5\1\146\1\147\2\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\10\5\1\150\11\5\15\0\7\5"+
+ "\4\0\1\151\7\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\152\7\5\1\153\3\5\1\154\2\5\1\155\2\5"+
+ "\15\0\3\5\1\156\3\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\5\5\1\157\1\5\1\160\2\5"+
+ "\1\161\7\5\15\0\7\5\4\0\6\5\1\162\1\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\5\1\163\1\164"+
+ "\1\165\1\166\7\5\1\167\5\5\15\0\3\5\1\170"+
+ "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\171\7\5\1\172\11\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\11\5\1\173\10\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\1\174\10\5\1\105\10\5\15\0\7\5\4\0"+
+ "\1\175\7\5\1\0\1\137\1\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\17\5\1\176\2\5\15\0\7\5\4\0"+
+ "\10\5\1\0\1\177\1\5\1\0\2\5\3\0\1\200"+
+ "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\201\7\5\1\202\11\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\11\5"+
+ "\1\154\10\5\74\0\1\54\72\0\2\54\71\0\1\54"+
+ "\1\0\1\54\75\0\1\51\73\0\1\51\73\0\1\54"+
+ "\73\0\1\54\2\0\10\62\1\0\62\62\10\0\1\203"+
+ "\62\0\11\64\1\0\61\64\11\0\1\204\61\0\10\66"+
+ "\3\0\11\66\1\0\2\66\1\0\2\66\1\0\1\66"+
+ "\1\0\22\66\12\0\1\66\4\0\1\70\12\0\1\70"+
+ "\2\0\1\70\3\0\2\205\1\0\2\206\41\0\3\66"+
+ "\1\207\4\66\3\0\3\66\1\207\2\66\1\207\2\66"+
+ "\1\0\2\66\1\210\2\66\1\0\1\66\1\0\22\66"+
+ "\2\0\1\210\7\0\1\66\2\0\7\5\4\0\1\211"+
+ "\7\5\1\0\2\5\1\0\2\5\3\0\2\5\1\212"+
+ "\1\5\1\213\5\5\1\214\7\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\1\5\1\215"+
+ "\7\5\1\216\4\5\1\217\3\5\15\0\4\5\1\220"+
+ "\2\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\3\5\1\221\5\5\1\222\10\5\14\0"+
+ "\10\77\1\223\1\77\1\0\1\101\57\77\10\0\1\224"+
+ "\62\0\12\77\1\0\60\77\11\102\1\223\1\0\1\104"+
+ "\57\102\11\0\1\225\61\0\12\102\1\0\60\102\1\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\5\1\164\20\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\14\5\1\226\5\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\5\1\227\5\5\1\230\12\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\160"+
+ "\16\5\14\0\3\66\1\111\4\66\3\0\3\66\1\111"+
+ "\2\66\1\111\2\66\1\70\2\71\1\0\2\72\1\0"+
+ "\1\66\1\0\22\66\12\0\1\66\1\0\3\66\1\111"+
+ "\4\66\3\0\1\66\2\67\1\112\2\66\1\112\2\66"+
+ "\1\70\2\71\1\0\2\72\1\0\1\66\1\0\22\66"+
+ "\12\0\1\66\1\0\3\66\1\231\4\66\3\0\3\66"+
+ "\1\231\2\66\3\231\1\0\2\231\1\0\2\66\1\0"+
+ "\1\66\1\0\1\231\1\66\1\231\2\66\1\231\1\66"+
+ "\1\231\12\66\12\0\1\66\2\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\232\21\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\10\5\1\233\11\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\10\5\1\234\11\5\15\0"+
+ "\3\5\1\162\3\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\7\5\4\0\1\235\7\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\5\1\236\20\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\3\5\1\237\5\5\1\240\10\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\241\1\5\1\0\2\5\3\0"+
+ "\7\5\1\242\12\5\15\0\4\5\1\243\2\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\244\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\2\5\1\162\17\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+ "\1\245\16\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\3\5\1\164\16\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+ "\1\246\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\4\5\1\162\15\5\15\0\7\5"+
+ "\4\0\1\247\5\5\1\162\1\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\4\5\1\250\2\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\3\5\1\164\3\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\7\5\1\160\10\5\1\251\1\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\12\5\1\166\1\5\1\164\5\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\252"+
+ "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\4\5\1\253\15\5\15\0\3\5\1\164"+
+ "\3\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\254\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\15\5\1\255\4\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+ "\1\256\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\13\5\1\162\6\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+ "\1\257\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\12\5\1\260\7\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\261\1\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\6\5\1\262\1\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\10\5\1\244"+
+ "\11\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\263\21\5\15\0\7\5\4\0\1\264"+
+ "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\7\5\4\0\10\5\1\0\1\265\1\5\1\0\2\5"+
+ "\3\0\1\5\1\266\12\5\1\267\5\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+ "\1\164\7\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\270\21\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\2\5\1\164\17\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\1\271\1\5\3\0\22\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+ "\1\164\15\5\15\0\7\5\4\0\10\5\1\0\1\105"+
+ "\1\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\272"+
+ "\5\5\1\273\7\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\3\5\1\274\5\5\1\275"+
+ "\10\5\15\0\7\5\4\0\10\5\1\0\1\214\1\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\12\5\1\276\7\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\10\5\1\277\1\300\10\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\301"+
+ "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\16\5\1\164\3\5\15\0\7\5\4\0"+
+ "\10\5\1\0\1\302\1\5\1\0\2\5\3\0\22\5"+
+ "\15\0\7\5\4\0\3\5\1\164\4\5\1\0\2\5"+
+ "\1\0\2\5\3\0\12\5\1\164\7\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+ "\1\303\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\11\5\1\304\10\5\15\0\7\5"+
+ "\4\0\3\5\1\164\4\5\1\0\2\5\1\0\2\5"+
+ "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\3\5\1\305\16\5\15\0\3\5"+
+ "\1\127\3\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\11\5\1\306\10\5\24\0\1\307"+
+ "\73\0\1\310\64\0\1\311\12\0\1\311\2\0\1\311"+
+ "\5\0\1\210\31\0\1\210\11\0\3\66\1\207\4\66"+
+ "\3\0\3\66\1\207\2\66\1\207\2\66\1\0\2\66"+
+ "\1\0\2\72\1\0\1\66\1\0\22\66\12\0\1\66"+
+ "\4\0\1\311\12\0\1\311\2\0\1\311\52\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+ "\1\312\11\5\15\0\4\5\1\252\2\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+ "\1\313\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\22\5\15\0\3\5\1\164\3\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\15\5"+
+ "\1\260\4\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\3\5\1\237\16\5\15\0\1\314"+
+ "\6\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\5\1\315\20\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\141"+
+ "\10\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\7\5\1\316\12\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\317"+
+ "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\15\5\1\320\4\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\1\321\21\5"+
+ "\14\0\3\66\1\231\4\66\3\0\1\66\2\67\1\231"+
+ "\2\66\3\231\1\0\2\231\1\0\2\66\1\0\1\66"+
+ "\1\0\1\231\1\66\1\231\2\66\1\231\1\66\1\231"+
+ "\12\66\12\0\1\66\2\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\1\5\1\215\20\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\14\5\1\162\5\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\1\322\21\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\164\1\5\1\0\2\5\3\0"+
+ "\4\5\1\166\15\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\1\323\21\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\162\1\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\6\5\1\162\1\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\324"+
+ "\12\5\15\0\7\5\4\0\10\5\1\0\1\325\1\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\14\5\1\326\5\5"+
+ "\15\0\7\5\4\0\1\164\7\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+ "\1\327\1\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+ "\4\0\1\330\7\5\1\0\2\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\331\21\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\5\5\1\332\14\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\14\5\1\333\5\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\7\5\1\260\12\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\4\5\1\334\15\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\5\1\335\20\5"+
+ "\15\0\3\5\1\322\3\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\260"+
+ "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\7\5\4\0\10\5\1\0\1\164\1\5\1\0\2\5"+
+ "\3\0\22\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\1\336\21\5\15\0\7\5\4\0"+
+ "\6\5\1\166\1\5\1\0\2\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\3\5\1\337\16\5\15\0\7\5\4\0"+
+ "\1\340\7\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+ "\15\0\3\5\1\252\3\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\4\5\1\341\15\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\12\5\1\342\7\5\15\0\3\5\1\320\3\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+ "\15\0\7\5\4\0\10\5\1\0\1\343\1\5\1\0"+
+ "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+ "\1\344\1\5\1\0\2\5\3\0\22\5\15\0\4\5"+
+ "\1\160\2\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\22\5\15\0\4\5\1\345\2\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\5"+
+ "\1\346\20\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\10\5\1\327\11\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+ "\1\347\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\1\5\1\131\20\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\3\5"+
+ "\1\162\16\5\15\0\7\5\4\0\1\125\7\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\350"+
+ "\14\5\15\0\7\5\4\0\1\237\7\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\1\331\16\5\1\164"+
+ "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\2\5\1\320\17\5\17\0\1\311\12\0"+
+ "\1\311\2\0\1\311\6\0\2\206\42\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\1\315\21\5"+
+ "\15\0\3\5\1\351\3\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\11\5\1\352\10\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\10\5\1\353\6\5\1\214\2\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\2\5"+
+ "\1\354\17\5\15\0\7\5\4\0\1\127\7\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\320"+
+ "\15\5\15\0\7\5\4\0\1\355\7\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\6\5"+
+ "\1\356\1\5\1\0\2\5\1\0\2\5\3\0\22\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\12\5\1\131\7\5\15\0\7\5\4\0\10\5"+
+ "\1\0\1\357\1\5\1\0\2\5\3\0\22\5\15\0"+
+ "\3\5\1\131\3\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\13\5\1\164\6\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\4\5\1\360\15\5\15\0\7\5\4\0\1\361\7\5"+
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\10\5"+
+ "\1\315\11\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\11\5\1\362\10\5\15\0\7\5"+
+ "\4\0\10\5\1\0\1\306\1\5\1\0\2\5\3\0"+
+ "\22\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\6\5\1\162\13\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\3\5\1\363"+
+ "\16\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\364\21\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\11\5\1\365\10\5"+
+ "\15\0\7\5\4\0\1\366\7\5\1\0\2\5\1\0"+
+ "\2\5\3\0\11\5\1\257\10\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\7\5\1\160"+
+ "\12\5\15\0\3\5\1\105\3\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\5\5\1\367"+
+ "\14\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\3\5\1\370\16\5\15\0\7\5\4\0"+
+ "\10\5\1\0\1\371\1\5\1\0\2\5\3\0\22\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\1\372\21\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\1\5\1\162\20\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\5\1\373\20\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\2\5\1\260\17\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\162\21\5\15\0\7\5\4\0\1\143\7\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\11\5\1\257"+
+ "\10\5\15\0\3\5\1\374\3\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\22\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\4\5\1\214"+
+ "\15\5\15\0\7\5\4\0\10\5\1\0\1\320\1\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\7\5\1\375\12\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\14\5\1\376\5\5\15\0\7\5\4\0\10\5"+
+ "\1\0\2\5\1\0\2\5\3\0\5\5\1\257\14\5"+
+ "\15\0\7\5\4\0\10\5\1\0\2\5\1\0\2\5"+
+ "\3\0\1\5\1\377\20\5\15\0\7\5\4\0\10\5"+
+ "\1\0\1\177\1\5\1\0\2\5\3\0\22\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\7\5\1\u0100\12\5\15\0\7\5\4\0\10\5\1\0"+
+ "\2\5\1\0\2\5\3\0\4\5\1\u0101\15\5\15\0"+
+ "\3\5\1\u0102\3\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\22\5\15\0\7\5\4\0\1\u0103\7\5"+
+ "\1\0\2\5\1\0\2\5\3\0\22\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\12\5"+
+ "\1\273\7\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\1\u0104\21\5\15\0\7\5\4\0"+
+ "\10\5\1\0\1\u0105\1\5\1\0\2\5\3\0\22\5"+
+ "\15\0\4\5\1\237\2\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\22\5\15\0\7\5\4\0\1\u0106"+
+ "\7\5\1\0\2\5\1\0\2\5\3\0\22\5\15\0"+
+ "\7\5\4\0\10\5\1\0\2\5\1\0\2\5\3\0"+
+ "\1\u0107\21\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\4\5\1\330\15\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\4\5"+
+ "\1\260\15\5\15\0\7\5\4\0\10\5\1\0\2\5"+
+ "\1\0\2\5\3\0\4\5\1\u0108\15\5\15\0\7\5"+
+ "\4\0\10\5\1\0\2\5\1\0\2\5\3\0\1\u0109"+
+ "\21\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\1\5\1\252\20\5\15\0\7\5\4\0"+
+ "\10\5\1\0\2\5\1\0\2\5\3\0\17\5\1\333"+
+ "\2\5\15\0\7\5\4\0\10\5\1\0\2\5\1\0"+
+ "\2\5\3\0\3\5\1\127\16\5\14\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[14514];
+ 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 =
+ "\3\0\1\11\10\1\1\11\32\1\1\11\3\1\1\11"+
+ "\4\1\1\11\17\1\1\0\2\1\1\0\76\1\3\0"+
+ "\1\11\1\1\1\0\12\1\3\11\61\1\2\11\101\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[265];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public PythonTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = LONG_STRING_2;
+ break;
+ case Token.LITERAL_CHAR:
+ state = LONG_STRING_1;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public PythonTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public PythonTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 168) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 5:
+ { addNullToken(); return firstToken;
+ }
+ case 20: break;
+ case 10:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 21: break;
+ case 8:
+ { addToken(Token.WHITESPACE);
+ }
+ case 22: break;
+ case 12:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 23: break;
+ case 13:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 24: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 25: break;
+ case 15:
+ { yybegin(LONG_STRING_1); addToken(Token.LITERAL_CHAR);
+ }
+ case 26: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 27: break;
+ case 14:
+ { addToken(Token.FUNCTION);
+ }
+ case 28: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 29: break;
+ case 17:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 30: break;
+ case 4:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 31: break;
+ case 7:
+ { addToken(Token.COMMENT_EOL);
+ }
+ case 32: break;
+ case 11:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 33: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 34: break;
+ case 6:
+ { addToken(Token.OPERATOR);
+ }
+ case 35: break;
+ case 19:
+ { yybegin(YYINITIAL); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 36: break;
+ case 16:
+ { yybegin(LONG_STRING_2); addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 37: break;
+ case 18:
+ { yybegin(YYINITIAL); addToken(Token.LITERAL_CHAR);
+ }
+ case 38: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 266: break;
+ case LONG_STRING_2: {
+ if (firstToken==null) {
+ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ return firstToken;
+ }
+ case 267: break;
+ case LONG_STRING_1: {
+ if (firstToken==null) {
+ addToken(Token.LITERAL_CHAR);
+ }
+ return firstToken;
+ }
+ case 268: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex
new file mode 100644
index 0000000..119f82f
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex
@@ -0,0 +1,763 @@
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated RubyTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class RubyTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an single quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an double quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED = -3;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -4;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an single quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -5;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an double quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED = -6;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q!...! style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_BANG = -7;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q{...} style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_CURLY_BRACE = -8;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q<...> style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_LT = -9;
+
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q(...) style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_PAREN = -10;
+
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q/.../ style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_SLASH = -11;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q[...] style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_SQUARE_BRACKET = -12;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public RubyTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ start = text.offset;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_UNQUOTED:
+ state = HEREDOC_EOF_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+ state = HEREDOC_EOF_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+ state = HEREDOC_EOF_DOUBLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_UNQUOTED:
+ state = HEREDOC_EOT_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+ state = HEREDOC_EOT_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+ state = HEREDOC_EOT_DOUBLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_BANG:
+ state = STRING_Q_BANG;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_CURLY_BRACE:
+ state = STRING_Q_CURLY_BRACE;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_LT:
+ state = STRING_Q_LT;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_PAREN:
+ state = STRING_Q_PAREN;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_SLASH:
+ state = STRING_Q_SLASH;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_SQUARE_BRACKET:
+ state = STRING_Q_SQUARE_BRACKET;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+BinaryDigit = ([01])
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\'\`]|"#"|"\\")
+
+IdentifierStart = ({Letter}|"_")
+IdentifierPart = ({IdentifierStart}|{Digit})
+BooleanLiteral = ("true"|"false")
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+LineCommentBegin = "#"
+DocCommentBegin = "=begin"
+DocCommentEnd = "=end"
+
+DigitOrUnderscore = ({Digit}|[_])
+BinaryIntLiteral = ("0b"{BinaryDigit}([01_]*{BinaryDigit})?)
+OctalLiteral = ("0"([0-7_]*{OctalDigit})?)
+DecimalLiteral1 = ("0d"{Digit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral2 = ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?)
+DecimalLiteral = ({BinaryIntLiteral}|{OctalLiteral}|{DecimalLiteral1}|{DecimalLiteral2})
+HexLiteral = ("0x"{HexDigit}([0-9a-zA-Z_]*{HexDigit})?)
+FloatLiteral = ({NonzeroDigit}({DigitOrUnderscore}*{Digit})?[Ee]({Digit}({DigitOrUnderscore}*{Digit})?)?)
+
+Separator = ([\(\)\{\}])
+Operator1 = ("::"|"."|"["|"]"|"-"|"+"|"!"|"~"|"*"|"/"|"%"|"<<"|">>"|"&"|"|"|"^")
+Operator2 = (">"|">="|"<"|"<="|"<=>"|"=="|"==="|"!="|"=~"|"!~"|"&&"|"||")
+Operator3 = (".."|"..."|"="|"+="|"-="|"*="|"/="|"%=")
+Operator = ({Operator1}|{Operator2}|{Operator3})
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+Symbol = ([:]{Identifier})
+ErrorIdentifier = ({NonSeparator}+)
+
+PreDefinedVariable = ("$"([!@&`\'+0-9~=/\,;.<>_*$?:\"]|"DEBUG"|"FILENAME"|"LOAD_PATH"|"stderr"|"stdin"|"stdout"|"VERBOSE"|([\-][0adFiIlpwv])))
+Variable = ({PreDefinedVariable}|([@][@]?|[$]){Identifier})
+
+%state STRING
+%state STRING_Q_BANG
+%state STRING_Q_CURLY_BRACE
+%state STRING_Q_PAREN
+%state STRING_Q_SLASH
+%state STRING_Q_SQUARE_BRACKET
+%state STRING_Q_LT
+%state CHAR_LITERAL
+%state BACKTICKS
+%state HEREDOC_EOF_UNQUOTED
+%state HEREDOC_EOF_SINGLE_QUOTED
+%state HEREDOC_EOF_DOUBLE_QUOTED
+%state HEREDOC_EOT_UNQUOTED
+%state HEREDOC_EOT_SINGLE_QUOTED
+%state HEREDOC_EOT_DOUBLE_QUOTED
+%state DOCCOMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "alias" |
+ "BEGIN" |
+ "begin" |
+ "break" |
+ "case" |
+ "class" |
+ "def" |
+ "defined" |
+ "do" |
+ "else" |
+ "elsif" |
+ "END" |
+ "end" |
+ "ensure" |
+ "for" |
+ "if" |
+ "in" |
+ "module" |
+ "next" |
+ "nil" |
+ "redo" |
+ "rescue" |
+ "retry" |
+ "return" |
+ "self" |
+ "super" |
+ "then" |
+ "undef" |
+ "unless" |
+ "until" |
+ "when" |
+ "while" |
+ "yield" { addToken(Token.RESERVED_WORD); }
+
+ "Array" |
+ "Float" |
+ "Integer" |
+ "String" |
+ "at_exit" |
+ "autoload" |
+ "binding" |
+ "caller" |
+ "catch" |
+ "chop" |
+ "chop!" |
+ "chomp" |
+ "chomp!" |
+ "eval" |
+ "exec" |
+ "exit" |
+ "exit!" |
+ "fail" |
+ "fork" |
+ "format" |
+ "gets" |
+ "global_variables" |
+ "gsub" |
+ "gsub!" |
+ "iterator?" |
+ "lambda" |
+ "load" |
+ "local_variables" |
+ "loop" |
+ "open" |
+ "p" |
+ "print" |
+ "printf" |
+ "proc" |
+ "putc" |
+ "puts" |
+ "raise" |
+ "rand" |
+ "readline" |
+ "readlines" |
+ "require" |
+ "select" |
+ "sleep" |
+ "split" |
+ "sprintf" |
+ "srand" |
+ "sub" |
+ "sub!" |
+ "syscall" |
+ "system" |
+ "test" |
+ "trace_var" |
+ "trap" |
+ "untrace_var" { addToken(Token.FUNCTION); }
+
+ "and" |
+ "or" |
+ "not" { addToken(Token.OPERATOR); }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {Variable} { addToken(Token.VARIABLE); }
+ {Symbol} { addToken(Token.PREPROCESSOR); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ \" { start = zzMarkedPos-1; yybegin(STRING); }
+ \' { start = zzMarkedPos-1; yybegin(CHAR_LITERAL); }
+ [\%][QqWwx]?[\(] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN); }
+ [\%][QqWwx]?[\{] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE); }
+ [\%][QqWwx]?[\[] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET); }
+ [\%][QqWwx]?[\<] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT); }
+ [\%][QqWwx]?[\!] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG); }
+ [\%][QqWwx]?[\/] { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH); }
+ \` { start = zzMarkedPos-1; yybegin(BACKTICKS); }
+
+ /* Comment literals. */
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ {DocCommentBegin} { start = zzMarkedPos-6; yybegin(DOCCOMMENT); }
+
+ /* "Here-document" syntax. This is only implemented for the common */
+ /* cases. */
+ "<<EOF" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<" {WhiteSpace}* \""EOF"\" { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<" {WhiteSpace}* \'"EOF"\' { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED); }
+ "<<" {WhiteSpace}* \`"EOF"\` { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED); }
+ "<<EOT" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+ "<<" {WhiteSpace}* \""EOT"\" { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+ "<<" {WhiteSpace}* \'"EOT"\' { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED); }
+ "<<" {WhiteSpace}* \`"EOT"\` { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED); }
+
+ /* Separators and operators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {DecimalLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<STRING> {
+ [^\n\\\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+
+<STRING_Q_BANG> {
+ [^\n\\\!]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \! { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken; }
+}
+
+
+<STRING_Q_CURLY_BRACE> {
+ [^\n\\\}]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken; }
+}
+
+
+<STRING_Q_LT> {
+ [^\n\\\>]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \> { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken; }
+}
+
+
+<STRING_Q_PAREN> {
+ [^\n\\\)]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken; }
+}
+
+
+<STRING_Q_SLASH> {
+ [^\n\\\/]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \/ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken; }
+}
+
+
+<STRING_Q_SQUARE_BRACKET> {
+ [^\n\\\]]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \] { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken; }
+}
+
+
+<CHAR_LITERAL> {
+ [^\n\\\']+ {}
+ \\.? { /* Skip escaped single quotes only, but this should still work. */ }
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+ \' { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+}
+
+
+<BACKTICKS> {
+ [^\n\\\`]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ \` { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken; }
+}
+
+
+<HEREDOC_EOF_UNQUOTED> {
+ /* NOTE: The closing "EOF" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOF" will match any line containing */
+ /* EOF and any other chars. */
+ /* NOTE2: This case is used for unquoted <<EOF, double quoted */
+ /* <<"EOF" and backticks <<`EOF`, since they all follow the same */
+ /* syntactic rules. */
+ "EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_SINGLE_QUOTED> {
+ /* NOTE: The closing "EOF" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOF" will match any line containing */
+ /* EOF and any other chars. */
+ "EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOF_DOUBLE_QUOTED> {
+ /* NOTE: The closing "EOF" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOF"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOF" will match any line containing */
+ /* EOF and any other chars. */
+ "EOF" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_UNQUOTED> {
+ /* NOTE: The closing "EOT" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOT" will match any line containing */
+ /* EOF and any other chars. */
+ /* NOTE2: This case is used for unquoted <<EOT, double quoted */
+ /* <<"EOT" and backticks <<`EOT`, since they all follow the same */
+ /* syntactic rules. */
+ "EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_SINGLE_QUOTED> {
+ /* NOTE: The closing "EOT" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOT" will match any line containing */
+ /* EOT and any other chars. */
+ "EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<HEREDOC_EOT_DOUBLE_QUOTED> {
+ /* NOTE: The closing "EOT" is supposed to be on a line by itself - */
+ /* no surrounding whitespace or other chars. However, the way */
+ /* we're hacking the JFLex scanning, something like ^"EOT"$ doesn't */
+ /* work. Fortunately we don't need the start- and end-line anchors */
+ /* since the production after "EOT" will match any line containing */
+ /* EOT and any other chars. */
+ "EOT" { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; } }
+ [^\n\\]+ {}
+ \n { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+ \\.? { /* Skip escaped chars. */ }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken; }
+}
+
+
+<DOCCOMMENT> {
+
+ [^\n\=]+ {}
+ {DocCommentEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION); }
+ = {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken; }
+ <<EOF>> { yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java
new file mode 100644
index 0000000..80f3714
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/RubyTokenMaker.java
@@ -0,0 +1,1666 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 09/11/2008
+ *
+ * RubyTokenMaker.java - Scanner for Ruby
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Ruby.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated RubyTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class RubyTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int HEREDOC_EOF_SINGLE_QUOTED = 11;
+ public static final int DOCCOMMENT = 14;
+ public static final int HEREDOC_EOT_SINGLE_QUOTED = 13;
+ public static final int HEREDOC_EOT_UNQUOTED = 12;
+ public static final int STRING_Q_SLASH = 5;
+ public static final int STRING_Q_BANG = 2;
+ public static final int STRING_Q_LT = 7;
+ public static final int STRING = 1;
+ public static final int BACKTICKS = 9;
+ public static final int YYINITIAL = 0;
+ public static final int HEREDOC_EOF_UNQUOTED = 10;
+ public static final int STRING_Q_CURLY_BRACE = 3;
+ public static final int STRING_Q_PAREN = 4;
+ public static final int HEREDOC_EOF_DOUBLE_QUOTED = 11;
+ public static final int CHAR_LITERAL = 8;
+ public static final int HEREDOC_EOT_DOUBLE_QUOTED = 13;
+ public static final int STRING_Q_SQUARE_BRACKET = 6;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\24\1\23\1\0\1\24\1\7\22\0\1\24\1\44\1\105"+
+ "\1\10\1\55\1\47\1\52\1\106\1\110\1\35\1\43\1\43\1\57"+
+ "\1\42\1\37\1\46\1\3\1\4\6\6\2\2\1\36\1\57\1\50"+
+ "\1\25\1\51\1\103\1\56\1\66\1\61\1\5\1\60\1\34\1\63"+
+ "\1\62\1\1\1\64\2\1\1\1\1\1\1\65\1\67\1\1\1\107"+
+ "\1\1\1\72\1\70\1\1\1\1\1\107\3\1\1\40\1\11\1\41"+
+ "\1\54\1\12\1\112\1\20\1\26\1\75\1\32\1\16\1\17\1\27"+
+ "\1\101\1\30\1\1\1\74\1\21\1\76\1\31\1\71\1\100\1\104"+
+ "\1\14\1\22\1\13\1\15\1\73\1\102\1\33\1\77\1\1\1\111"+
+ "\1\53\1\113\1\45\uff81\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 =
+ "\17\0\1\1\1\2\2\3\1\2\1\4\10\2\1\5"+
+ "\1\6\1\7\6\2\1\10\1\2\11\7\2\1\11\2"+
+ "\1\11\1\2\1\12\1\13\1\14\1\15\1\16\1\17"+
+ "\1\20\1\15\1\21\1\15\1\22\1\15\1\23\1\15"+
+ "\1\24\1\15\1\25\1\15\1\26\1\15\1\27\1\30"+
+ "\1\31\1\15\1\32\1\33\1\15\1\34\1\15\1\35"+
+ "\1\36\1\15\1\37\1\15\1\40\1\15\1\1\1\41"+
+ "\1\3\4\1\30\2\1\0\7\2\1\42\5\2\1\43"+
+ "\1\7\1\0\1\44\1\45\1\46\1\47\1\50\1\51"+
+ "\2\7\3\52\1\0\1\1\4\2\1\7\12\2\1\16"+
+ "\1\27\2\15\1\0\1\41\2\3\1\53\24\2\1\42"+
+ "\7\2\1\11\6\2\1\0\10\2\1\42\5\0\20\2"+
+ "\1\54\1\0\4\1\1\55\1\2\1\11\16\2\1\11"+
+ "\5\2\1\0\3\2\4\0\11\2\1\56\12\2\1\0"+
+ "\2\2\1\57\1\60\3\0\2\2\1\11\5\2\1\61"+
+ "\1\2\6\0\4\2\1\62\1\63\1\11\7\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[344];
+ 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\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+
+ "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u0474"+
+ "\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c\0\u0688\0\u06d4"+
+ "\0\u0720\0\u076c\0\u07b8\0\u0804\0\u0850\0\u05a4\0\u089c\0\u08e8"+
+ "\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64\0\u0ab0\0\u05a4\0\u0afc"+
+ "\0\u0b48\0\u05a4\0\u0b94\0\u0be0\0\u0c2c\0\u0c78\0\u0cc4\0\u0d10"+
+ "\0\u0d5c\0\u0da8\0\u0df4\0\u0e40\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70"+
+ "\0\u0fbc\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u05a4\0\u05a4"+
+ "\0\u05a4\0\u1184\0\u11d0\0\u05a4\0\u05a4\0\u121c\0\u05a4\0\u1268"+
+ "\0\u05a4\0\u12b4\0\u05a4\0\u1300\0\u05a4\0\u134c\0\u05a4\0\u1398"+
+ "\0\u05a4\0\u13e4\0\u1430\0\u05a4\0\u05a4\0\u147c\0\u05a4\0\u05a4"+
+ "\0\u14c8\0\u05a4\0\u1514\0\u05a4\0\u05a4\0\u1560\0\u05a4\0\u15ac"+
+ "\0\u05a4\0\u15f8\0\u1644\0\u1690\0\u16dc\0\u16dc\0\u1728\0\u1774"+
+ "\0\u17c0\0\u180c\0\u1858\0\u18a4\0\u18f0\0\u193c\0\u1988\0\u19d4"+
+ "\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u1be8\0\u1c34"+
+ "\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48\0\u1e94"+
+ "\0\u1ee0\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+
+ "\0\u2140\0\u04c0\0\u218c\0\u21d8\0\u2224\0\u2270\0\u22bc\0\u2308"+
+ "\0\u2354\0\u23a0\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4\0\u05a4"+
+ "\0\u23ec\0\u2438\0\u2484\0\u0474\0\u05a4\0\u24d0\0\u251c\0\u2568"+
+ "\0\u25b4\0\u2600\0\u264c\0\u04c0\0\u2698\0\u26e4\0\u2730\0\u277c"+
+ "\0\u27c8\0\u2814\0\u2860\0\u28ac\0\u28f8\0\u2944\0\u05a4\0\u05a4"+
+ "\0\u2990\0\u29dc\0\u2a28\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4"+
+ "\0\u2bf0\0\u2c3c\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04"+
+ "\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34\0\u2f80\0\u2fcc\0\u3018\0\u3064"+
+ "\0\u30b0\0\u30fc\0\u3148\0\u3194\0\u31e0\0\u322c\0\u3278\0\u32c4"+
+ "\0\u3310\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u3524"+
+ "\0\u3570\0\u35bc\0\u3608\0\u3654\0\u36a0\0\u36ec\0\u3738\0\u3784"+
+ "\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u3900\0\u394c\0\u3998\0\u39e4"+
+ "\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44"+
+ "\0\u3c90\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4"+
+ "\0\u3ef0\0\u14c8\0\u3f3c\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u04c0"+
+ "\0\u3f88\0\u04c0\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150"+
+ "\0\u419c\0\u41e8\0\u4234\0\u4280\0\u42cc\0\u4318\0\u4364\0\u43b0"+
+ "\0\u05a4\0\u43fc\0\u4448\0\u4494\0\u44e0\0\u452c\0\u4578\0\u45c4"+
+ "\0\u4610\0\u465c\0\u46a8\0\u46f4\0\u4740\0\u478c\0\u47d8\0\u4824"+
+ "\0\u4870\0\u48bc\0\u4908\0\u4954\0\u49a0\0\u49ec\0\u4a38\0\u05a4"+
+ "\0\u4a84\0\u4ad0\0\u4b1c\0\u4b68\0\u4bb4\0\u4c00\0\u4c4c\0\u4c98"+
+ "\0\u4ce4\0\u4d30\0\u4d7c\0\u4dc8\0\u4e14\0\u05a4\0\u05a4\0\u4e60"+
+ "\0\u4eac\0\u4ef8\0\u4f44\0\u4f90\0\u4fdc\0\u5028\0\u5074\0\u50c0"+
+ "\0\u510c\0\u4fdc\0\u05a4\0\u5158\0\u51a4\0\u51f0\0\u523c\0\u5288"+
+ "\0\u52d4\0\u5320\0\u536c\0\u53b8\0\u5404\0\u5450\0\u05a4\0\u05a4"+
+ "\0\u3738\0\u549c\0\u54e8\0\u5534\0\u5580\0\u55cc\0\u5618\0\u5664";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[344];
+ 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 =
+ "\1\20\1\21\1\22\1\23\1\22\1\21\1\22\1\24"+
+ "\1\25\1\20\1\21\1\26\1\27\1\30\1\31\1\32"+
+ "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+ "\1\43\1\44\1\45\1\21\1\46\1\47\1\50\1\51"+
+ "\2\52\2\53\1\54\1\52\1\53\1\55\1\56\1\57"+
+ "\1\60\1\61\1\52\1\62\1\63\1\24\1\21\1\64"+
+ "\1\21\1\65\1\66\1\21\1\67\2\21\1\70\1\71"+
+ "\2\21\1\72\1\73\1\74\1\75\1\21\1\76\1\24"+
+ "\1\21\1\77\1\100\1\21\2\47\1\101\1\47\11\102"+
+ "\1\103\11\102\1\104\61\102\1\105\6\102\11\106\1\103"+
+ "\11\106\1\107\20\106\1\105\47\106\11\110\1\103\11\110"+
+ "\1\111\67\110\1\105\11\112\1\103\11\112\1\113\11\112"+
+ "\1\105\56\112\11\114\1\103\11\114\1\115\22\114\1\105"+
+ "\45\114\11\116\1\103\11\116\1\117\15\116\1\105\52\116"+
+ "\11\120\1\103\11\120\1\121\25\120\1\105\42\120\11\122"+
+ "\1\123\11\122\1\124\62\122\1\125\5\122\11\126\1\103"+
+ "\11\126\1\127\66\126\1\130\1\126\11\131\1\103\11\131"+
+ "\1\132\10\131\1\133\70\131\1\103\11\131\1\134\10\131"+
+ "\1\133\70\131\1\103\11\131\1\135\10\131\1\136\70\131"+
+ "\1\103\11\131\1\137\10\131\1\136\57\131\23\140\1\141"+
+ "\1\140\1\142\66\140\7\20\1\0\13\20\3\0\7\20"+
+ "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\2\20\3\22\1\20\1\22\1\0\2\20\1\143"+
+ "\3\20\1\144\4\20\3\0\6\20\1\144\20\0\2\20"+
+ "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+ "\2\145\1\20\1\145\1\0\2\20\1\146\10\20\3\0"+
+ "\1\147\3\20\1\150\1\151\1\20\20\0\2\20\1\0"+
+ "\23\20\1\0\1\20\2\0\1\20\120\0\23\25\1\0"+
+ "\70\25\1\20\6\21\1\0\2\20\2\21\1\152\1\21"+
+ "\1\153\4\21\3\0\7\21\20\0\2\20\1\0\21\21"+
+ "\1\154\1\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\4\21\1\155\1\21\1\156\2\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+ "\3\0\3\21\1\157\3\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\7\21\1\160\1\21\3\0\3\21\1\161\1\21"+
+ "\1\162\1\21\20\0\2\20\1\0\13\21\1\163\7\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\6\21\1\164\2\21\3\0\7\21\20\0\2\20"+
+ "\1\0\11\21\1\165\11\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\1\21\1\166\1\21"+
+ "\1\167\3\21\1\170\1\21\3\0\3\21\1\171\3\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\6\21\1\172\2\21"+
+ "\3\0\7\21\20\0\2\20\1\0\11\21\1\173\11\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\2\21\1\174\1\175\1\176\2\21\1\177\1\21"+
+ "\3\0\7\21\20\0\2\20\1\0\17\21\1\200\1\201"+
+ "\2\21\1\0\1\21\2\0\1\21\30\0\1\37\114\0"+
+ "\1\53\1\202\16\0\1\52\46\0\1\20\6\21\1\0"+
+ "\2\20\2\21\1\203\1\21\1\204\4\21\3\0\2\21"+
+ "\1\205\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+ "\1\206\2\21\1\207\1\210\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\1\21\1\211\3\21\1\212\3\21"+
+ "\3\0\3\21\1\212\3\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\4\21\1\213\4\21\3\0\2\21\1\214\4\21"+
+ "\20\0\2\20\1\0\11\21\1\215\11\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+ "\1\216\4\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+ "\1\212\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+ "\1\0\5\21\1\217\15\21\1\0\1\21\2\0\1\21"+
+ "\5\0\1\220\3\0\1\220\4\0\11\220\3\0\7\220"+
+ "\1\0\1\52\21\0\23\220\1\0\1\220\2\0\1\220"+
+ "\43\0\1\221\101\0\1\52\113\0\1\52\17\0\1\52"+
+ "\73\0\1\52\5\0\1\222\4\0\1\223\3\0\1\224"+
+ "\1\0\1\225\1\0\1\226\31\0\1\222\1\0\1\222"+
+ "\2\0\1\222\1\227\1\230\27\0\1\231\22\0\1\232"+
+ "\70\0\1\52\23\0\1\52\114\0\1\52\114\0\1\52"+
+ "\40\0\1\20\1\233\3\234\1\233\1\234\1\0\2\20"+
+ "\11\233\2\0\1\235\7\233\1\0\2\235\2\0\1\236"+
+ "\4\235\1\0\3\235\2\0\2\234\1\235\23\233\1\235"+
+ "\1\233\2\235\1\233\2\0\1\235\1\0\1\20\1\233"+
+ "\3\20\1\233\1\20\1\0\2\20\11\233\3\0\7\233"+
+ "\20\0\1\20\1\237\1\0\23\233\1\0\1\233\2\0"+
+ "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\6\21\1\240\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+ "\1\241\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\3\21\1\242\3\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\2\21\1\243\6\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\2\21\1\244\6\21"+
+ "\3\0\7\21\20\0\2\20\1\0\20\21\1\245\2\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\1\21\1\246\7\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\6\21\1\247\1\250\1\21\3\0"+
+ "\7\21\20\0\2\20\1\0\21\21\1\251\1\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\252"+
+ "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\2\21\1\253\4\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\2\21\1\254\1\255\5\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+ "\3\0\7\21\20\0\2\20\1\0\21\21\1\256\1\21"+
+ "\1\0\1\21\2\0\1\21\4\0\11\102\1\0\11\102"+
+ "\1\0\61\102\1\0\6\102\23\257\1\0\70\257\11\106"+
+ "\1\0\11\106\1\0\20\106\1\0\47\106\11\110\1\0"+
+ "\11\110\1\0\67\110\1\0\11\112\1\0\11\112\1\0"+
+ "\11\112\1\0\56\112\11\114\1\0\11\114\1\0\22\114"+
+ "\1\0\45\114\11\116\1\0\11\116\1\0\15\116\1\0"+
+ "\52\116\11\120\1\0\11\120\1\0\25\120\1\0\42\120"+
+ "\11\122\1\0\11\122\1\0\62\122\1\0\5\122\23\260"+
+ "\1\0\70\260\11\126\1\0\11\126\1\0\66\126\1\0"+
+ "\1\126\11\131\1\0\11\131\1\0\101\131\1\0\11\131"+
+ "\1\0\43\131\1\261\35\131\1\0\11\131\1\0\43\131"+
+ "\1\262\24\131\23\140\1\0\1\140\1\0\66\140\16\0"+
+ "\1\263\75\0\2\20\3\22\1\20\1\22\1\0\2\20"+
+ "\1\143\10\20\3\0\7\20\20\0\2\20\1\0\23\20"+
+ "\1\0\1\20\2\0\1\20\4\0\2\20\3\264\1\20"+
+ "\1\264\1\0\13\20\3\0\7\20\20\0\2\20\1\0"+
+ "\23\20\1\0\1\20\2\0\1\20\4\0\3\20\2\145"+
+ "\1\20\1\145\1\0\2\20\1\146\10\20\3\0\7\20"+
+ "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+ "\4\0\3\20\2\265\2\20\1\0\13\20\3\0\7\20"+
+ "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+ "\4\0\2\20\3\266\1\20\1\266\1\0\13\20\3\0"+
+ "\7\20\20\0\2\20\1\0\23\20\1\0\1\20\2\0"+
+ "\1\20\4\0\2\20\5\267\1\0\6\20\3\267\2\20"+
+ "\3\0\1\267\3\20\1\267\1\20\1\267\20\0\2\20"+
+ "\1\0\2\267\1\20\1\267\2\20\1\267\6\20\1\267"+
+ "\5\20\1\0\1\20\2\0\1\20\4\0\1\20\6\21"+
+ "\1\0\2\20\3\21\1\270\2\21\1\271\2\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\10\21\1\272"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+ "\1\273\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\1\21\1\274\4\21\1\275\1\21\1\276\3\0"+
+ "\4\21\1\277\2\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\300\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\2\21\1\301\1\302\3\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\1\21\1\303\5\21\1\304\1\21"+
+ "\3\0\4\21\1\305\2\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\10\21\1\306\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\10\21\1\307\3\0\4\21\1\212\2\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\4\21\1\310\4\21"+
+ "\3\0\2\21\1\311\4\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\6\21\1\312\2\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\7\21\1\313\1\21\3\0\2\21"+
+ "\1\312\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+ "\1\314\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\1\315\10\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\316\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\317"+
+ "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\4\21\1\244\2\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\320"+
+ "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+ "\2\20\1\0\11\21\1\321\3\21\1\322\5\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\6\21\1\323\2\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\1\324\6\21\20\0\2\20"+
+ "\1\0\20\21\1\325\2\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\7\21\1\326\1\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+ "\1\327\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\10\21\1\330\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\2\21\1\331\4\21\1\332\1\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\22\0\1\333\75\0\1\20\6\21\1\0\2\20"+
+ "\4\21\1\334\4\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\1\21\1\335\5\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\3\21\1\336"+
+ "\3\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\337"+
+ "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\340"+
+ "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\3\21\1\341\5\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\4\21\1\342\4\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\5\21\1\343\1\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\7\21\1\212\1\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\244\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\5\21\1\344\3\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\1\212\22\21\1\0\1\21"+
+ "\2\0\1\21\5\0\6\220\3\0\11\220\3\0\7\220"+
+ "\23\0\23\220\1\0\1\220\2\0\1\220\43\0\1\52"+
+ "\114\0\1\223\3\0\1\224\1\0\1\225\1\0\1\226"+
+ "\37\0\1\227\1\230\53\0\1\52\66\0\1\345\7\0"+
+ "\1\346\50\0\1\347\1\350\3\0\1\351\1\0\1\20"+
+ "\6\233\1\0\2\20\11\233\3\0\7\233\20\0\2\20"+
+ "\1\0\23\233\1\0\1\233\2\0\1\233\7\0\1\235"+
+ "\14\0\2\235\6\0\1\235\1\0\1\235\30\0\2\235"+
+ "\6\0\1\235\4\0\1\235\1\0\1\235\11\0\1\20"+
+ "\1\233\3\20\1\233\1\20\1\0\2\20\11\233\3\0"+
+ "\7\233\20\0\2\20\1\0\23\233\1\0\1\233\2\0"+
+ "\1\233\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\2\21\1\352\20\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\353"+
+ "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\354\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\2\21\1\355\6\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\356"+
+ "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\2\21\1\357\6\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\360\5\21\1\361\1\362\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\6\21\1\363"+
+ "\2\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\11\21\1\364"+
+ "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\4\21\1\365\2\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\4\21\1\366\4\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\2\21\1\367\4\21\20\0\2\20\1\0\11\21\1\310"+
+ "\11\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\370\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\4\21\1\273\4\21\3\0"+
+ "\2\21\1\371\4\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\11\131\1\0\11\131\1\0"+
+ "\37\131\1\372\41\131\1\0\11\131\1\0\44\131\1\372"+
+ "\23\131\31\0\1\373\62\0\2\20\3\264\1\20\1\264"+
+ "\1\0\2\20\1\374\10\20\3\0\7\20\20\0\2\20"+
+ "\1\0\23\20\1\0\1\20\2\0\1\20\4\0\3\20"+
+ "\2\265\2\20\1\0\2\20\1\375\10\20\3\0\7\20"+
+ "\20\0\2\20\1\0\23\20\1\0\1\20\2\0\1\20"+
+ "\4\0\2\20\3\266\1\20\1\266\1\0\2\20\1\376"+
+ "\10\20\3\0\7\20\20\0\2\20\1\0\23\20\1\0"+
+ "\1\20\2\0\1\20\4\0\1\20\1\377\5\267\1\0"+
+ "\2\20\4\377\3\267\2\377\3\0\1\267\3\377\1\267"+
+ "\1\377\1\267\20\0\2\20\1\0\2\267\1\377\1\267"+
+ "\2\377\1\267\6\377\1\267\5\377\1\0\1\377\2\0"+
+ "\1\377\4\0\1\20\6\21\1\0\2\20\4\21\1\u0100"+
+ "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\u0101"+
+ "\2\21\1\u0102\2\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\1\21\1\u0102\7\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\3\21\1\212\3\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\2\21\1\u0103\1\u0104\5\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\4\21\1\u0105\2\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+ "\20\0\2\20\1\0\15\21\1\u0106\5\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+ "\3\0\7\21\20\0\2\20\1\0\11\21\1\212\11\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\3\21\1\u0107\5\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\10\21\1\u0108\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\4\21\1\u0102"+
+ "\2\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\u0109"+
+ "\6\21\3\0\2\21\1\214\4\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\4\21\1\363\4\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\4\21\1\u010a\4\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\212"+
+ "\4\21\3\0\2\21\1\u010a\4\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\3\21\1\u010b\5\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+ "\2\20\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\1\21\1\324"+
+ "\7\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\7\21\1\u0102\1\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\10\21\1\270\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+ "\1\0\14\21\1\u0102\1\21\1\353\4\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\4\21"+
+ "\1\u010c\4\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\11\21"+
+ "\1\u010d\11\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\6\21\1\u010e\2\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\1\u010f"+
+ "\6\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\20\21\1\u0102\2\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\6\21\1\u0110\2\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\3\21\1\302\3\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\7\0"+
+ "\1\u0111\10\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0112"+
+ "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\4\21\1\u0113\1\212\3\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\4\21\1\321\4\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\1\21\1\u0114\7\21"+
+ "\3\0\7\21\20\0\2\20\1\0\15\21\1\u0115\5\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\2\21\1\u0116\4\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\2\21\1\272\4\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\33\0\1\u0117\64\0\1\20\6\21\1\0\2\20\6\21"+
+ "\1\u0118\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\2\21\1\273\4\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\4\21\1\357\2\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\10\21\1\u0102\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\1\322\6\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+ "\3\0\1\324\6\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\2\21\1\u0119\6\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\212\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\2\21\1\u011a"+
+ "\4\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\30\0\1\345\60\0\1\347\1\350\3\0\1\351"+
+ "\70\0\1\u011b\60\0\1\u011c\113\0\1\u011d\113\0\1\u011e"+
+ "\57\0\1\20\6\21\1\0\2\20\11\21\3\0\7\21"+
+ "\20\0\2\20\1\0\4\21\1\u011f\16\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+ "\1\272\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\4\21\1\u0120\4\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\6\21\1\u0121\2\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\3\21"+
+ "\1\u0102\3\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\11\21"+
+ "\3\0\2\21\1\u0122\4\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+ "\1\u0123\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\7\21\1\u0124\1\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\4\21\1\212\4\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\10\21"+
+ "\1\u010e\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0125"+
+ "\1\21\1\324\2\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\3\21\1\371\5\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\7\21\1\u0126"+
+ "\1\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\3\21\1\u0127\3\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\10\21\1\u0102\3\0\7\21\20\0\2\20"+
+ "\1\0\15\21\1\u0102\5\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\7\21\1\362\1\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\36\0\1\u0128\61\0\1\20\6\21\1\0"+
+ "\2\20\4\21\1\u0129\4\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+ "\1\0\17\21\1\212\3\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\2\21\1\273\6\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+ "\1\u012a\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\3\21\1\362\5\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\2\21\1\u012b\4\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\4\21\1\u0102\4\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\6\21"+
+ "\1\u012c\2\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\5\21\1\212\3\21\3\0\7\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\2\21\1\362\6\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\5\21"+
+ "\1\332\1\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\7\21"+
+ "\1\u012d\1\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\10\21\1\212\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\4\21\1\u012e\2\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\7\21\1\u012f\1\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\2\21\1\212"+
+ "\6\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\15\21\1\272"+
+ "\5\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\4\21\1\u0130\4\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\6\21\1\u0131\2\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\3\21\1\u0132\3\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\34\0\1\u0133\63\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+ "\14\21\1\212\6\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\6\21\1\u0134\2\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\3\21\1\u0135\3\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\67\0\1\u0136\4\0\1\u0137\112\0"+
+ "\1\u0138\113\0\1\u0139\113\0\1\u013a\24\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+ "\5\21\1\212\15\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\1\21\1\u0124"+
+ "\5\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\17\21\1\u0102\3\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\3\21\1\u013b\3\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\7\21\20\0\2\20\1\0"+
+ "\21\21\1\u0102\1\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\4\21\1\u013c\4\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\20\21\1\324\2\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\4\21\1\212\2\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\1\21\1\u013d\7\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\1\u013e\10\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\11\21\3\0\2\21"+
+ "\1\u013f\4\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\2\21"+
+ "\1\u0108\6\21\3\0\7\21\20\0\2\20\1\0\23\21"+
+ "\1\0\1\21\2\0\1\21\4\0\1\20\6\21\1\0"+
+ "\2\20\11\21\3\0\7\21\20\0\2\20\1\0\15\21"+
+ "\1\u0101\5\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\11\21\3\0\7\21\20\0\2\20"+
+ "\1\0\11\21\1\u0140\11\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\6\21\1\u0102\2\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0\1\20\6\21\1\0\2\20\1\u0141"+
+ "\10\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\7\21\20\0\2\20\1\0\16\21\1\u0102"+
+ "\4\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\7\21\1\312\1\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\1\21\1\u0142\7\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\35\0\1\u0143\62\0\1\20\6\21\1\0\2\20"+
+ "\1\21\1\u0144\7\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\4\21\1\u0126\4\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\67\0"+
+ "\1\u0145\4\0\1\u0146\106\0\1\u0147\4\0\1\u0148\106\0"+
+ "\1\u0149\4\0\1\u014a\23\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\1\21\1\u0102\5\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\2\21\1\u0102\6\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\5\21\1\u0102\3\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\13\21\1\u014b\7\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\11\21\3\0\3\21\1\u014c\3\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\6\21\1\302\2\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\11\21\3\0\7\21\20\0"+
+ "\2\20\1\0\13\21\1\u014d\7\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\11\21\1\u014e\11\21\1\0"+
+ "\1\21\2\0\1\21\111\0\1\u0136\113\0\1\u0137\114\0"+
+ "\1\u014f\113\0\1\u0150\117\0\1\u0136\113\0\1\u0137\1\0"+
+ "\1\20\6\21\1\0\2\20\6\21\1\u013c\2\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\4\21\1\u0151"+
+ "\4\21\3\0\7\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\6\21\1\u0152\2\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\2\21\1\u0153\6\21\3\0\7\21\20\0"+
+ "\2\20\1\0\23\21\1\0\1\21\2\0\1\21\4\0"+
+ "\1\20\6\21\1\0\2\20\2\21\1\u0154\6\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\0\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\7\21\20\0\2\20\1\0\23\21\1\u0111\1\21\2\0"+
+ "\1\21\4\0\1\20\6\21\1\0\2\20\11\21\3\0"+
+ "\2\21\1\u0155\4\21\20\0\2\20\1\0\23\21\1\0"+
+ "\1\21\2\0\1\21\4\0\1\20\6\21\1\0\2\20"+
+ "\6\21\1\u0156\2\21\3\0\7\21\20\0\2\20\1\0"+
+ "\23\21\1\0\1\21\2\0\1\21\4\0\1\20\6\21"+
+ "\1\0\2\20\11\21\3\0\1\u0157\6\21\20\0\2\20"+
+ "\1\0\23\21\1\0\1\21\2\0\1\21\4\0\1\20"+
+ "\6\21\1\0\2\20\7\21\1\u0158\1\21\3\0\7\21"+
+ "\20\0\2\20\1\0\23\21\1\0\1\21\2\0\1\21"+
+ "\4\0\1\20\6\21\1\0\2\20\4\21\1\337\4\21"+
+ "\3\0\7\21\20\0\2\20\1\0\23\21\1\0\1\21"+
+ "\2\0\1\21\4\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[22192];
+ 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 =
+ "\17\0\4\1\1\11\11\1\1\11\10\1\1\11\2\1"+
+ "\1\11\24\1\3\11\2\1\2\11\1\1\1\11\1\1"+
+ "\1\11\1\1\1\11\1\1\1\11\1\1\1\11\1\1"+
+ "\1\11\2\1\2\11\1\1\2\11\1\1\1\11\1\1"+
+ "\2\11\1\1\1\11\1\1\1\11\40\1\1\0\17\1"+
+ "\1\0\6\11\4\1\1\11\1\0\20\1\2\11\2\1"+
+ "\1\0\47\1\1\0\11\1\5\0\21\1\1\0\25\1"+
+ "\1\11\5\1\1\0\3\1\4\0\11\1\1\11\12\1"+
+ "\1\0\2\1\2\11\3\0\10\1\1\11\1\1\6\0"+
+ "\4\1\2\11\10\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[344];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_UNQUOTED = -1;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an single quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_SINGLE_QUOTED = -2;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an double quoted EOF heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED = -3;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an unquoted/double quoted/backtick EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_UNQUOTED = -4;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an single quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_SINGLE_QUOTED = -5;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * an double quoted EOT heredoc.
+ */
+ public static final int INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED = -6;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q!...! style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_BANG = -7;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q{...} style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_CURLY_BRACE = -8;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q<...> style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_LT = -9;
+
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q(...) style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_PAREN = -10;
+
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q/.../ style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_SLASH = -11;
+
+ /**
+ * Token type specific to RubyTokenMaker; this signals that we are inside
+ * a %Q[...] style double quoted string.
+ */
+ public static final int INTERNAL_STRING_Q_SQUARE_BRACKET = -12;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public RubyTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.COMMENT_DOCUMENTATION:
+ state = DOCCOMMENT;
+ start = text.offset;
+ break;
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR_LITERAL;
+ start = text.offset;
+ break;
+ case Token.LITERAL_BACKQUOTE:
+ state = BACKTICKS;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_UNQUOTED:
+ state = HEREDOC_EOF_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_SINGLE_QUOTED:
+ state = HEREDOC_EOF_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOF_DOUBLE_QUOTED:
+ state = HEREDOC_EOF_DOUBLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_UNQUOTED:
+ state = HEREDOC_EOT_UNQUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_SINGLE_QUOTED:
+ state = HEREDOC_EOT_SINGLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_HEREDOC_EOT_DOUBLE_QUOTED:
+ state = HEREDOC_EOT_DOUBLE_QUOTED;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_BANG:
+ state = STRING_Q_BANG;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_CURLY_BRACE:
+ state = STRING_Q_CURLY_BRACE;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_LT:
+ state = STRING_Q_LT;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_PAREN:
+ state = STRING_Q_PAREN;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_SLASH:
+ state = STRING_Q_SLASH;
+ start = text.offset;
+ break;
+ case INTERNAL_STRING_Q_SQUARE_BRACKET:
+ state = STRING_Q_SQUARE_BRACKET;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public RubyTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public RubyTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 188) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 39:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_LT);
+ }
+ case 52: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 53: break;
+ case 45:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 54: break;
+ case 32:
+ { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 55: break;
+ case 19:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+ }
+ case 56: break;
+ case 18:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+ }
+ case 57: break;
+ case 20:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+ }
+ case 58: break;
+ case 46:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+3, Token.COMMENT_DOCUMENTATION);
+ }
+ case 59: break;
+ case 10:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 60: break;
+ case 44:
+ { if (start==zzStartRead) { addToken(Token.PREPROCESSOR); addNullToken(); return firstToken; }
+ }
+ case 61: break;
+ case 9:
+ { addToken(Token.FUNCTION);
+ }
+ case 62: break;
+ case 22:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+ }
+ case 63: break;
+ case 42:
+ { addToken(Token.VARIABLE);
+ }
+ case 64: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 65: break;
+ case 31:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+ }
+ case 66: break;
+ case 4:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 67: break;
+ case 41:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_CURLY_BRACE);
+ }
+ case 68: break;
+ case 50:
+ { start = zzStartRead; yybegin(HEREDOC_EOF_SINGLE_QUOTED);
+ }
+ case 69: break;
+ case 51:
+ { start = zzStartRead; yybegin(HEREDOC_EOT_SINGLE_QUOTED);
+ }
+ case 70: break;
+ case 47:
+ { start = zzStartRead; yybegin(HEREDOC_EOF_UNQUOTED);
+ }
+ case 71: break;
+ case 14:
+ { /* Skip escaped chars. */
+ }
+ case 72: break;
+ case 25:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 73: break;
+ case 43:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 74: break;
+ case 28:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+ }
+ case 75: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 76: break;
+ case 17:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+ }
+ case 77: break;
+ case 35:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 78: break;
+ case 11:
+ { start = zzMarkedPos-1; yybegin(CHAR_LITERAL);
+ }
+ case 79: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 80: break;
+ case 38:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SLASH);
+ }
+ case 81: break;
+ case 27:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_BACKQUOTE);
+ }
+ case 82: break;
+ case 16:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 83: break;
+ case 37:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_BANG);
+ }
+ case 84: break;
+ case 23:
+ { /* Skip escaped single quotes only, but this should still work. */
+ }
+ case 85: break;
+ case 30:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+ }
+ case 86: break;
+ case 49:
+ { start = zzMarkedPos-6; yybegin(DOCCOMMENT);
+ }
+ case 87: break;
+ case 34:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 88: break;
+ case 26:
+ { addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 89: break;
+ case 36:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_SQUARE_BRACKET);
+ }
+ case 90: break;
+ case 8:
+ { addToken(Token.SEPARATOR);
+ }
+ case 91: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 92: break;
+ case 21:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+ }
+ case 93: break;
+ case 40:
+ { start = zzMarkedPos-yylength(); yybegin(STRING_Q_PAREN);
+ }
+ case 94: break;
+ case 7:
+ { addToken(Token.OPERATOR);
+ }
+ case 95: break;
+ case 24:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 96: break;
+ case 33:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 97: break;
+ case 48:
+ { start = zzStartRead; yybegin(HEREDOC_EOT_UNQUOTED);
+ }
+ case 98: break;
+ case 12:
+ { start = zzMarkedPos-1; yybegin(BACKTICKS);
+ }
+ case 99: break;
+ case 13:
+ {
+ }
+ case 100: break;
+ case 15:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 101: break;
+ case 29:
+ { addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+ }
+ case 102: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case HEREDOC_EOF_SINGLE_QUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_SINGLE_QUOTED); return firstToken;
+ }
+ case 345: break;
+ case DOCCOMMENT: {
+ yybegin(YYINITIAL); addToken(start,zzEndRead, Token.COMMENT_DOCUMENTATION); return firstToken;
+ }
+ case 346: break;
+ case HEREDOC_EOT_SINGLE_QUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_SINGLE_QUOTED); return firstToken;
+ }
+ case 347: break;
+ case HEREDOC_EOT_UNQUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOT_UNQUOTED); return firstToken;
+ }
+ case 348: break;
+ case STRING_Q_SLASH: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SLASH); return firstToken;
+ }
+ case 349: break;
+ case STRING_Q_BANG: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_BANG); return firstToken;
+ }
+ case 350: break;
+ case STRING_Q_LT: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_LT); return firstToken;
+ }
+ case 351: break;
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 352: break;
+ case BACKTICKS: {
+ addToken(start,zzStartRead-1, Token.LITERAL_BACKQUOTE); return firstToken;
+ }
+ case 353: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 354: break;
+ case HEREDOC_EOF_UNQUOTED: {
+ addToken(start,zzStartRead-1, Token.PREPROCESSOR); addEndToken(INTERNAL_HEREDOC_EOF_UNQUOTED); return firstToken;
+ }
+ case 355: break;
+ case STRING_Q_CURLY_BRACE: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_CURLY_BRACE); return firstToken;
+ }
+ case 356: break;
+ case STRING_Q_PAREN: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_PAREN); return firstToken;
+ }
+ case 357: break;
+ case CHAR_LITERAL: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 358: break;
+ case STRING_Q_SQUARE_BRACKET: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); addEndToken(INTERNAL_STRING_Q_SQUARE_BRACKET); return firstToken;
+ }
+ case 359: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex
new file mode 100644
index 0000000..161c05a
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.flex
@@ -0,0 +1,675 @@
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated SASTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SASTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SASTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "*", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+LineTerminator = ([\n])
+Letter = ([A-Za-z_])
+Digit = ([0-9])
+Whitespace = ([ \t]+)
+Semicolon = ([;])
+
+Identifier = (({Letter}|{Digit})+)
+MacroVariable = (&{Identifier})
+
+Operators1 = ("+"|"-"|"*"|"/"|"^"|"|")
+Operators2 = (([\^\~]?=)|(">"[=]?)|("<"[=]?))
+Operators3 = ("eq"|"ne"|"gt"|"lt"|"ge"|"le"|"in")
+Operator = ({Operators1}|{Operators2}|{Operators3})
+Separator = ([\(\)])
+
+StringBoundary = (\")
+CharBoundary = (\')
+
+LineCommentBegin = ("*")
+MLCBegin = ("/*")
+MLCEnd = ("*/")
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "_all_" |
+ "_character_" |
+ "_data_" |
+ "_infile_" |
+ "_last_" |
+ "_null_" |
+ "_numeric_" |
+ "_page_" |
+ "_temporary_" |
+ "abend" |
+ "abort" |
+ "all" |
+ "alter" |
+ "and" |
+ "array" |
+ "as" |
+ "ascending" |
+ "attrib" |
+ "axis" |
+ "bell" |
+ "blank" |
+ "border" |
+ "bounds" |
+ "by" |
+ "call" |
+ "cancel" |
+ "cards" |
+ "cards4" |
+ "choro" |
+ "class" |
+ "classes" |
+ "clear" |
+ "close" |
+ "compute" |
+ "contrast" |
+ "coord" |
+ "coordinates" |
+ "cov" |
+ "create" |
+ "data" |
+ "datalines" |
+ "datalines4" |
+ "delete" |
+ "descending" |
+ "describe" |
+ "discrete" |
+ "disk" |
+ "display" |
+ "dm" |
+ "do" |
+ "drop" |
+ "dummy" |
+ "else" |
+ "end" |
+ "endrsubmit" |
+ "endsas" |
+ "error" |
+ "except" |
+ "expandtabs" |
+ "factors" |
+ "file" |
+ "filename" |
+ "flowover" |
+ "footnote" |
+ "frame" |
+ "freq" |
+ "from" |
+ "go" |
+ "goption" |
+ "goptions" |
+ "goto" |
+ "grid" |
+ "group" |
+ "groupby" |
+ "groupformat" |
+ "having" |
+ "haxis" |
+ "hbar" |
+ "heading" |
+ "high" |
+ "html" |
+ "id" |
+ "if" |
+ "infile" |
+ "informat" |
+ "inner" |
+ "input" |
+ "insert" |
+ "intersect" |
+ "keep" |
+ "keylabel" |
+ "label" |
+ "lable" |
+ "legend" |
+ "length" |
+ "libname" |
+ "lineqs" |
+ "link" |
+ "list" |
+ "listing" |
+ "log" |
+ "lostcard" |
+ "low" |
+ "mark" |
+ "matings" |
+ "mean" |
+ "merge" |
+ "missing" |
+ "missover" |
+ "mod" |
+ "model" |
+ "modify" |
+ "n" |
+ "nocell" |
+ "nocharacters" |
+ "nodupkey" |
+ "noexpandtabs" |
+ "noframe" |
+ "noheading" |
+ "noinput" |
+ "nolegend" |
+ "nopad" |
+ "noprint" |
+ "nosharebuffers" |
+ "not" |
+ "note" |
+ "notitle" |
+ "notitles" |
+ "notsorted" |
+ "ods" |
+ "old" |
+ "option" |
+ "or" |
+ "order" |
+ "orderby" |
+ "other" |
+ "otherwise" |
+ "outer" |
+ "output" |
+ "over" |
+ "overlay" |
+ "overprint" |
+ "pad" |
+ "pageby" |
+ "pagesize" |
+ "parmcards" |
+ "parmcards4" |
+ "parms" |
+ "pattern" |
+ "pct" |
+ "pctn" |
+ "pctsum" |
+ "picture" |
+ "pie" |
+ "pie3d" |
+ "plotter" |
+ "predict" |
+ "prefix" |
+ "printer" |
+ "proc" |
+ "ps" |
+ "put" |
+ "quit" |
+ "random" |
+ "range" |
+ "remove" |
+ "rename" |
+ "response" |
+ "replace" |
+ "reset" |
+ "retain" |
+ "return" |
+ "rsubmit" |
+ "run" |
+ "s2" |
+ "select" |
+ "set" |
+ "sharebuffers" |
+ "signoff" |
+ "signon" |
+ "sim" |
+ "skip" |
+ "source2" |
+ "startsas" |
+ "std" |
+ "stop" |
+ "stopover" |
+ "strata" |
+ "sum" |
+ "sumby" |
+ "supvar" |
+ "symbol" |
+ "table" |
+ "tables" |
+ "tape" |
+ "terminal" |
+ "test" |
+ "then" |
+ "time" |
+ "title" |
+ "to" |
+ "transform" |
+ "treatments" |
+ "truncover" |
+ "unbuf" |
+ "unbuffered" |
+ "union" |
+ "until" |
+ "update" |
+ "validate" |
+ "value" |
+ "var" |
+ "variables" |
+ "vaxis" |
+ "vbar" |
+ "weight" |
+ "when" |
+ "where" |
+ "while" |
+ "with" |
+ "window" |
+ "x" { addToken(Token.RESERVED_WORD); }
+
+ /* Base SAS procs. */
+ "append" |
+ "calendar" |
+ "catalog" |
+ "chart" |
+ "cimport" |
+ "compare" |
+ "contents" |
+ "copy" |
+ "cpm" |
+ "cport" |
+ "datasets" |
+ "display" |
+ "explode" |
+ "export" |
+ "fontreg" |
+ "format" |
+ "forms" |
+ "fslist" |
+ "import" |
+ "means" |
+ "migrate" |
+ "options" |
+ "optload" |
+ "optsave" |
+ "plot" |
+ "pmenu" |
+ "print" |
+ "printto" |
+ "proto" |
+ "prtdef" |
+ "prtexp" |
+ "pwencode" |
+ "rank" |
+ "registry" |
+ "report" |
+ "sort" |
+ "sql" |
+ "standard" |
+ "summary" |
+ "tabulate" |
+ "template" |
+ "timeplot" |
+ "transpose" { addToken(Token.DATA_TYPE); }
+
+ /* SAS/STAT procs. */
+ "corr" |
+ "freq" |
+ "univariate" { addToken(Token.DATA_TYPE); }
+
+ /* Macros. */
+ "%abort" |
+ "%bquote" |
+ "%by" |
+ "%cms" |
+ "%copy" |
+ "%display" |
+ "%do" |
+ "%else" |
+ "%end" |
+ "%eval" |
+ "%global" |
+ "%go" |
+ "%goto" |
+ "%if" |
+ "%inc" |
+ "%include" |
+ "%index" |
+ "%input" |
+ "%keydef" |
+ "%length" |
+ "%let" |
+ "%local" |
+ "%macro" |
+ "%mend" |
+ "%nrbquote" |
+ "%nrquote" |
+ "%nrstr" |
+ "%put" |
+ "%qscan" |
+ "%qsubstr" |
+ "%qsysfunc" |
+ "%quote" |
+ "%qupcase" |
+ "%scan" |
+ "%str" |
+ "%substr" |
+ "%superq" |
+ "%syscall" |
+ "%sysevalf" |
+ "%sysexec" |
+ "%sysfunc" |
+ "%sysget" |
+ "%sysprod" |
+ "%sysrput" |
+ "%then" |
+ "%to" |
+ "%tso" |
+ "%unquote" |
+ "%until" |
+ "%upcase" |
+ "%while" |
+ "%window" { addToken(Token.FUNCTION); }
+
+}
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ /* Comments. */
+ /* Do comments before operators as "*" can signify a line comment as */
+ /* well as an operator. */
+ ^[ \t]*{LineCommentBegin} {
+ // We must do this because of how we
+ // abuse JFlex; since we return an entire
+ // list of tokens at once instead of a
+ // single token at a time, the "^" regex
+ // character doesn't really work, so we must
+ // check that we're at the beginning of a
+ // line ourselves.
+ start = zzStartRead;
+ // Might not be any whitespace.
+ if (yylength()>1) {
+ addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+ zzStartRead = zzMarkedPos-1;
+ }
+ // Remember: zzStartRead may now be updated,
+ // so we must check against 'start'.
+ if (start==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+ }
+ }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+
+ /* Do operators before identifiers since some of them are words. */
+ {Operator} { addToken(Token.OPERATOR); }
+ {Separator} { addToken(Token.SEPARATOR); }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {MacroVariable} { addToken(Token.VARIABLE); }
+ {Semicolon} { addToken(Token.IDENTIFIER); }
+
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ {StringBoundary} { start = zzMarkedPos-1; yybegin(STRING); }
+ {CharBoundary} { start = zzMarkedPos-1; yybegin(CHAR); }
+
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as OK; */
+ /* This will include "." from statements like "from lib.dataset". */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+ [^\n\"]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+/* {StringBoundary}{StringBoundary} {} */
+ {StringBoundary} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+ [^\n\']+ {}
+ {LineTerminator} { yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+/* {CharBoundary}{CharBoundary} {} */
+ {CharBoundary} { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+ [^\n\*]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java
new file mode 100644
index 0000000..bf39a53
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SASTokenMaker.java
@@ -0,0 +1,1488 @@
+/* The following code was generated by JFlex 1.4.1 on 1/20/09 10:04 AM */
+
+/*
+ * 02/25/2005
+ *
+ * SASTokenMaker.java - Scanner for SAS files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SAS.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated SASTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SASTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int STRING = 2;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 6;
+ public static final int CHAR = 4;
+
+ /**
+ * 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, 1, 2, 2, 3, 3, 4, 4
+ };
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\3\1\1\25\0\1\3\1\0\1\23\2\0\1\53\1\4"+
+ "\1\24\2\22\1\6\1\5\1\0\1\5\1\0\1\7\2\2\1\52"+
+ "\1\51\1\45\5\2\1\0\1\0\1\10\1\12\1\10\2\0\1\26"+
+ "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+ "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+ "\1\46\1\47\1\43\1\41\1\50\3\0\1\10\1\25\1\0\1\26"+
+ "\1\42\1\27\1\32\1\13\1\33\1\16\1\30\1\21\1\2\1\44"+
+ "\1\20\1\36\1\15\1\40\1\37\1\14\1\31\1\34\1\17\1\35"+
+ "\1\46\1\47\1\43\1\41\1\50\1\0\1\5\1\0\1\11\uff81\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 =
+ "\5\0\1\1\1\2\1\1\1\3\1\1\3\4\3\1"+
+ "\1\5\4\1\1\6\1\7\1\10\15\1\1\5\4\1"+
+ "\1\3\1\11\1\12\1\13\1\14\1\12\1\15\1\16"+
+ "\1\12\1\17\1\12\1\20\1\21\1\4\7\1\1\5"+
+ "\5\1\1\4\3\1\1\4\15\1\1\5\66\1\1\5"+
+ "\14\1\21\0\1\22\1\5\5\1\1\5\66\1\1\23"+
+ "\50\1\1\5\15\1\1\5\1\1\1\5\4\1\1\5"+
+ "\20\1\1\5\3\1\7\0\1\24\2\0\1\24\24\0"+
+ "\21\1\1\5\6\1\1\5\44\1\1\5\1\1\1\5"+
+ "\11\1\1\5\7\1\1\5\4\1\1\23\22\1\1\5"+
+ "\5\1\12\0\1\24\16\0\10\1\1\5\3\1\1\5"+
+ "\13\1\1\5\2\1\1\5\3\1\1\5\23\1\1\5"+
+ "\10\1\1\23\2\5\6\1\16\0\42\1\13\0\17\1"+
+ "\2\0\12\1";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[639];
+ 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\54\0\130\0\204\0\260\0\334\0\334\0\u0108"+
+ "\0\u0134\0\u0160\0\334\0\u018c\0\u01b8\0\u01b8\0\u01e4\0\u0210"+
+ "\0\u023c\0\u0268\0\u0294\0\u02c0\0\u02ec\0\334\0\334\0\334"+
+ "\0\u0318\0\u0344\0\u0370\0\u039c\0\u03c8\0\u03f4\0\u0420\0\u044c"+
+ "\0\u0478\0\u04a4\0\u04d0\0\u04fc\0\u0528\0\u0108\0\u0554\0\u0580"+
+ "\0\u05ac\0\u05d8\0\u0604\0\334\0\u0630\0\334\0\334\0\u065c"+
+ "\0\334\0\334\0\u0688\0\334\0\u06b4\0\u0160\0\334\0\u0108"+
+ "\0\u06e0\0\u070c\0\u0738\0\u0764\0\u0790\0\u07bc\0\u07e8\0\u0814"+
+ "\0\u0840\0\u086c\0\u0898\0\u08c4\0\u08f0\0\u091c\0\u0948\0\u0974"+
+ "\0\u09a0\0\u09cc\0\u09f8\0\u0a24\0\u0a50\0\u0a7c\0\u0aa8\0\u0ad4"+
+ "\0\u0b00\0\u0b2c\0\u0b58\0\u0b84\0\u0bb0\0\u0bdc\0\u0c08\0\u0c34"+
+ "\0\u0c60\0\u0c8c\0\u0cb8\0\u0ce4\0\u0d10\0\u0d3c\0\u0d68\0\u0d94"+
+ "\0\u0dc0\0\u0dec\0\u0e18\0\u0e44\0\u0e70\0\u0e9c\0\u0ec8\0\u0ef4"+
+ "\0\u0f20\0\u0f4c\0\u0f78\0\u0fa4\0\u0fd0\0\u0ffc\0\u1028\0\u1054"+
+ "\0\u1080\0\u10ac\0\u10d8\0\u1104\0\u1130\0\u115c\0\u1188\0\u11b4"+
+ "\0\u11e0\0\u120c\0\u1238\0\u1264\0\u1290\0\u12bc\0\u12e8\0\u1314"+
+ "\0\u1340\0\u136c\0\u1398\0\u13c4\0\u13f0\0\u141c\0\u1448\0\u1474"+
+ "\0\u14a0\0\u14cc\0\u14f8\0\u1524\0\u1550\0\u157c\0\u15a8\0\u15d4"+
+ "\0\u1600\0\u162c\0\u1658\0\u1684\0\u16b0\0\u16dc\0\u1708\0\u1734"+
+ "\0\u1760\0\u178c\0\u17b8\0\u17e4\0\u1810\0\u183c\0\u1868\0\u1894"+
+ "\0\u18c0\0\u18ec\0\u1918\0\u1944\0\u1970\0\u199c\0\u19c8\0\u19f4"+
+ "\0\u1a20\0\u1a4c\0\u1a78\0\u1aa4\0\334\0\u1ad0\0\u1afc\0\u1b28"+
+ "\0\u1b54\0\u1b80\0\u1bac\0\u1bd8\0\u1c04\0\u1c30\0\u1c5c\0\u1c88"+
+ "\0\u1cb4\0\u1ce0\0\u1d0c\0\u1d38\0\u1d64\0\u1d90\0\u1dbc\0\u1de8"+
+ "\0\u1e14\0\u1e40\0\u1e6c\0\u1e98\0\u1ec4\0\u1ef0\0\u1f1c\0\u1f48"+
+ "\0\u1f74\0\u1fa0\0\u1fcc\0\u1ff8\0\u2024\0\u2050\0\u207c\0\u20a8"+
+ "\0\u20d4\0\u2100\0\u212c\0\u2158\0\u2184\0\u21b0\0\u21dc\0\u2208"+
+ "\0\u2234\0\u2260\0\u228c\0\u22b8\0\u22e4\0\u2310\0\u233c\0\u2368"+
+ "\0\u2394\0\u23c0\0\u23ec\0\u2418\0\u2444\0\u2470\0\u249c\0\u24c8"+
+ "\0\u24f4\0\u2520\0\u0108\0\u254c\0\u2578\0\u25a4\0\u25d0\0\u25fc"+
+ "\0\u2628\0\u2654\0\u2680\0\u26ac\0\u26d8\0\u2704\0\u2730\0\u275c"+
+ "\0\u2788\0\u27b4\0\u27e0\0\u280c\0\u2838\0\u2864\0\u2890\0\u28bc"+
+ "\0\u28e8\0\u2914\0\u2940\0\u296c\0\u2998\0\u29c4\0\u29f0\0\u2a1c"+
+ "\0\u2a48\0\u2a74\0\u2aa0\0\u2acc\0\u2af8\0\u2b24\0\u2b50\0\u2b7c"+
+ "\0\u2ba8\0\u2bd4\0\u2c00\0\u2c2c\0\u2c58\0\u2c84\0\u2cb0\0\u2cdc"+
+ "\0\u2d08\0\u2d34\0\u2d60\0\u2d8c\0\u2db8\0\u2de4\0\u2e10\0\u2e3c"+
+ "\0\u2e68\0\u2e94\0\u2ec0\0\u2eec\0\u2f18\0\u2f44\0\u2f70\0\u2f9c"+
+ "\0\u2fc8\0\u2ff4\0\u3020\0\u304c\0\u3078\0\u30a4\0\u30d0\0\u30fc"+
+ "\0\u3128\0\u3154\0\u3180\0\u31ac\0\u31d8\0\u3204\0\u3230\0\u325c"+
+ "\0\u3288\0\u32b4\0\u32e0\0\u330c\0\u3338\0\u3364\0\u3390\0\u33bc"+
+ "\0\u33e8\0\u3414\0\u3440\0\u346c\0\u3498\0\u34c4\0\u34f0\0\334"+
+ "\0\u351c\0\u3548\0\u3574\0\u35a0\0\u35cc\0\u35f8\0\u3624\0\u3650"+
+ "\0\u367c\0\u36a8\0\u36d4\0\u3700\0\u372c\0\u3758\0\u3784\0\u37b0"+
+ "\0\u37dc\0\u3808\0\u3834\0\u3860\0\u388c\0\u38b8\0\u38e4\0\u3910"+
+ "\0\u393c\0\u3968\0\u3994\0\u39c0\0\u39ec\0\u3a18\0\u3a44\0\u3a70"+
+ "\0\u3a9c\0\u3ac8\0\u3af4\0\u3b20\0\u3b4c\0\u3b78\0\u3ba4\0\u3bd0"+
+ "\0\u3bfc\0\u3c28\0\u3c54\0\u3c80\0\u26ac\0\u3cac\0\u3cd8\0\u3d04"+
+ "\0\u3d30\0\u3d5c\0\u3d88\0\u3db4\0\u3de0\0\u3e0c\0\u3e38\0\u3e64"+
+ "\0\u3e90\0\u3ebc\0\u3ee8\0\u3f14\0\u3f40\0\u3f6c\0\u3f98\0\u3fc4"+
+ "\0\u3ff0\0\u401c\0\u4048\0\u4074\0\u40a0\0\u40cc\0\u40f8\0\u4124"+
+ "\0\u4150\0\u417c\0\u41a8\0\u41d4\0\u4200\0\u422c\0\u4258\0\u4284"+
+ "\0\u42b0\0\u42dc\0\u4308\0\u1ff8\0\u4334\0\u4360\0\u438c\0\u43b8"+
+ "\0\u43e4\0\u4410\0\u443c\0\u4468\0\u4494\0\u4308\0\u44c0\0\u44ec"+
+ "\0\u4518\0\u4544\0\u4570\0\u459c\0\u45c8\0\u45f4\0\u4620\0\u464c"+
+ "\0\u4678\0\u46a4\0\u46d0\0\u46fc\0\u4728\0\u4754\0\u4780\0\u47ac"+
+ "\0\u47d8\0\u4804\0\u4830\0\u485c\0\u4888\0\u48b4\0\u48e0\0\u490c"+
+ "\0\u4938\0\u4964\0\u4990\0\u49bc\0\u49e8\0\u4a14\0\u4a40\0\u4a6c"+
+ "\0\u4a98\0\u4ac4\0\u4af0\0\u4b1c\0\u4b48\0\u4b74\0\u4ba0\0\u4bcc"+
+ "\0\u4bf8\0\u4c24\0\u4c50\0\u4c7c\0\u4ca8\0\u4cd4\0\u4d00\0\u4d2c"+
+ "\0\u4d58\0\u4d84\0\u4db0\0\u4ddc\0\u4e08\0\u4e34\0\u4e60\0\u4e8c"+
+ "\0\u4eb8\0\u4ee4\0\u4f10\0\u4f3c\0\u4f68\0\u4f94\0\u4fc0\0\u4fec"+
+ "\0\u5018\0\u5044\0\u5070\0\u509c\0\u50c8\0\u50f4\0\u5120\0\u514c"+
+ "\0\u15d4\0\u5178\0\u51a4\0\u51d0\0\u51fc\0\u5228\0\u5254\0\u5280"+
+ "\0\u52ac\0\u52d8\0\u5304\0\u5330\0\u535c\0\u5388\0\u53b4\0\u53e0"+
+ "\0\u540c\0\u5438\0\u5464\0\u5490\0\u54bc\0\u54e8\0\u5514\0\u5540"+
+ "\0\u556c\0\u5598\0\u55c4\0\u55f0\0\u561c\0\u5648\0\u5674\0\u56a0"+
+ "\0\u56cc\0\u56f8\0\u5724\0\u5750\0\u577c\0\u57a8\0\u57d4\0\u5800"+
+ "\0\u582c\0\u5858\0\u5884\0\u58b0\0\u58dc\0\u5908\0\u5934\0\u5960"+
+ "\0\u598c\0\u59b8\0\u59e4\0\u5a10\0\u5a3c\0\u5a68\0\u5a94\0\u5ac0"+
+ "\0\u5aec\0\u5b18\0\u5b44\0\u5b70\0\u5b9c\0\u5bc8\0\u5bf4\0\u5c20"+
+ "\0\u5c4c\0\u5c78\0\u5ca4\0\u5cd0\0\u5cfc\0\u5d28\0\u5d54\0\u5d80"+
+ "\0\u5dac\0\u5dd8\0\u5e04\0\u5e30\0\u5e5c\0\u5e88\0\u5eb4\0\u5ee0"+
+ "\0\u5f0c\0\u5f38\0\u5f64\0\u5f90\0\u5fbc\0\u5fe8\0\u6014\0\u6040"+
+ "\0\u606c\0\u6098\0\u60c4\0\u60f0\0\u611c\0\u6148\0\u6174\0\u61a0"+
+ "\0\u61cc\0\u61f8\0\u6224\0\u6250\0\u627c\0\u62a8\0\u62d4\0\u6300"+
+ "\0\u632c\0\u6358\0\u6384\0\u63b0\0\u63dc\0\u6408\0\u6434\0\u6460"+
+ "\0\u648c\0\u64b8\0\u64e4\0\u6510\0\u653c\0\u6568\0\u6594\0\u65c0"+
+ "\0\u65ec\0\u6618\0\u6644\0\u6670\0\u669c\0\u45f4\0\u66c8\0\u66f4"+
+ "\0\u6720\0\u674c\0\u535c\0\u6778\0\u67a4\0\u67d0\0\u67fc\0\u6828"+
+ "\0\u6854\0\u6880\0\u68ac\0\u68d8\0\u6904\0\u6930\0\u695c";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[639];
+ 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 =
+ "\1\6\1\7\1\10\1\11\1\12\2\13\1\14\1\15"+
+ "\1\16\1\13\1\17\1\20\1\21\1\22\1\23\1\24"+
+ "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
+ "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\44"+
+ "\1\10\1\45\1\46\1\47\1\10\1\50\1\51\3\10"+
+ "\1\52\1\6\1\7\1\10\1\53\1\12\1\13\1\54"+
+ "\1\14\1\15\1\16\1\13\1\17\1\20\1\21\1\22"+
+ "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+
+ "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
+ "\1\43\1\44\1\10\1\45\1\46\1\47\1\10\1\50"+
+ "\1\51\3\10\1\52\1\55\1\56\21\55\1\57\30\55"+
+ "\1\60\1\61\22\60\1\62\27\60\1\63\1\64\4\63"+
+ "\1\65\45\63\56\0\1\10\10\0\7\10\3\0\26\10"+
+ "\4\0\1\11\52\0\1\66\10\0\7\66\3\0\26\66"+
+ "\7\0\1\67\57\0\1\13\43\0\1\10\10\0\1\10"+
+ "\1\70\1\71\2\10\1\72\1\10\3\0\4\10\1\73"+
+ "\11\10\1\74\7\10\3\0\1\10\10\0\7\10\3\0"+
+ "\10\10\1\75\15\10\3\0\1\10\10\0\1\70\6\10"+
+ "\3\0\13\10\1\76\12\10\3\0\1\10\10\0\1\70"+
+ "\3\10\1\70\2\10\3\0\4\10\1\77\6\10\1\100"+
+ "\12\10\3\0\1\10\10\0\1\101\5\10\1\102\3\0"+
+ "\1\10\1\103\1\10\1\104\1\105\6\10\1\46\12\10"+
+ "\3\0\1\10\10\0\1\106\3\10\1\70\1\10\1\107"+
+ "\3\0\1\10\1\110\11\10\1\111\12\10\3\0\1\10"+
+ "\10\0\2\10\1\112\4\10\3\0\5\10\2\46\2\10"+
+ "\1\113\14\10\3\0\1\10\10\0\2\10\1\114\1\10"+
+ "\1\115\1\116\1\117\3\0\1\10\1\120\1\121\2\10"+
+ "\1\122\4\10\1\123\13\10\3\0\1\10\10\0\2\10"+
+ "\1\124\1\10\1\125\1\126\1\10\3\0\4\10\1\127"+
+ "\2\10\1\130\2\10\1\131\2\10\1\132\1\133\7\10"+
+ "\3\0\1\10\10\0\5\10\1\134\1\135\3\0\1\10"+
+ "\1\136\1\10\1\137\1\140\5\10\1\141\1\142\12\10"+
+ "\3\0\1\10\10\0\1\143\3\10\1\144\1\10\1\145"+
+ "\3\0\1\10\1\146\13\10\1\147\10\10\3\0\1\10"+
+ "\10\0\1\150\6\10\3\0\1\10\1\151\5\10\1\152"+
+ "\1\153\15\10\3\0\1\10\10\0\1\154\5\10\1\155"+
+ "\3\0\1\10\1\156\2\10\1\157\3\10\1\160\1\46"+
+ "\1\10\1\46\12\10\3\0\1\10\10\0\5\10\1\161"+
+ "\1\162\3\0\1\10\1\163\2\10\1\164\2\10\1\165"+
+ "\3\10\1\166\12\10\3\0\1\10\10\0\1\167\1\170"+
+ "\2\10\1\171\1\10\1\172\3\0\3\10\1\173\4\10"+
+ "\1\174\2\10\1\175\1\176\2\10\1\177\5\10\1\46"+
+ "\3\0\1\10\10\0\2\10\1\200\4\10\3\0\12\10"+
+ "\1\201\13\10\3\0\1\10\10\0\1\202\5\10\1\203"+
+ "\3\0\1\10\1\204\11\10\1\205\12\10\3\0\1\10"+
+ "\10\0\5\10\1\206\1\207\3\0\1\10\1\210\1\211"+
+ "\1\10\1\212\2\10\1\46\1\213\1\214\10\10\1\215"+
+ "\3\10\3\0\1\10\10\0\4\10\1\216\1\124\1\10"+
+ "\3\0\4\10\1\217\1\220\2\10\1\221\1\10\1\222"+
+ "\6\10\1\223\4\10\3\0\1\10\10\0\1\224\4\10"+
+ "\1\225\1\10\3\0\13\10\1\226\1\46\11\10\3\0"+
+ "\1\10\10\0\1\227\6\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\1\10\1\230\13\10\1\147\10\10"+
+ "\3\0\1\10\10\0\1\231\5\10\1\232\3\0\3\10"+
+ "\1\233\22\10\14\0\1\234\1\235\1\236\1\237\1\240"+
+ "\1\241\1\242\4\0\1\243\1\244\2\0\1\245\1\0"+
+ "\1\246\1\247\1\250\1\251\2\0\1\252\1\0\1\253"+
+ "\2\0\1\254\7\0\1\53\2\0\1\54\45\0\1\55"+
+ "\1\0\21\55\1\0\30\55\1\60\1\0\22\60\1\0"+
+ "\27\60\1\63\1\0\4\63\1\0\45\63\7\0\1\255"+
+ "\46\0\1\10\10\0\7\10\3\0\5\10\1\256\20\10"+
+ "\3\0\1\10\10\0\7\10\3\0\7\10\1\257\16\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\260\21\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\261\7\10"+
+ "\1\262\13\10\3\0\1\10\10\0\6\10\1\213\3\0"+
+ "\26\10\3\0\1\10\10\0\1\263\3\10\1\264\1\265"+
+ "\1\266\3\0\2\10\1\267\1\270\1\10\1\271\1\272"+
+ "\1\273\2\10\1\274\13\10\3\0\1\10\10\0\6\10"+
+ "\1\124\3\0\13\10\1\275\12\10\3\0\1\10\10\0"+
+ "\4\10\1\276\2\10\3\0\12\10\1\277\13\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\300\2\10\1\213"+
+ "\1\10\1\301\14\10\3\0\1\10\10\0\4\10\1\302"+
+ "\2\10\3\0\11\10\1\303\14\10\3\0\1\10\10\0"+
+ "\7\10\3\0\12\10\1\257\2\10\1\304\10\10\3\0"+
+ "\1\10\10\0\1\153\6\10\3\0\26\10\3\0\1\10"+
+ "\10\0\1\305\6\10\3\0\1\10\1\306\6\10\1\307"+
+ "\15\10\3\0\1\10\10\0\2\10\1\310\1\311\3\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\312\4\10"+
+ "\3\0\7\10\1\313\5\10\1\314\10\10\3\0\1\10"+
+ "\10\0\7\10\3\0\15\10\1\315\10\10\3\0\1\10"+
+ "\10\0\3\10\1\46\3\10\3\0\7\10\1\316\12\10"+
+ "\1\46\3\10\3\0\1\10\10\0\2\10\1\317\1\10"+
+ "\1\320\2\10\3\0\6\10\1\321\1\322\2\10\1\323"+
+ "\13\10\3\0\1\10\10\0\7\10\3\0\12\10\1\324"+
+ "\13\10\3\0\1\10\10\0\7\10\3\0\10\10\1\325"+
+ "\15\10\3\0\1\10\10\0\1\326\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\327\24\10"+
+ "\3\0\1\10\10\0\2\10\1\330\4\10\3\0\26\10"+
+ "\3\0\1\10\10\0\5\10\1\331\1\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\3\10\1\332\22\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\333\24\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\334\24\10"+
+ "\3\0\1\10\10\0\7\10\3\0\5\10\1\46\20\10"+
+ "\3\0\1\10\10\0\4\10\1\335\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\4\10\1\317\1\46\1\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\336"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\2\10\1\337"+
+ "\23\10\3\0\1\10\10\0\7\10\3\0\12\10\1\340"+
+ "\13\10\3\0\1\10\10\0\1\341\6\10\3\0\13\10"+
+ "\1\342\12\10\3\0\1\10\10\0\6\10\1\220\3\0"+
+ "\26\10\3\0\1\10\10\0\1\147\6\10\3\0\1\10"+
+ "\1\343\11\10\1\72\12\10\3\0\1\10\10\0\7\10"+
+ "\3\0\11\10\1\113\14\10\3\0\1\10\10\0\2\10"+
+ "\1\344\1\10\1\345\1\346\1\10\3\0\4\10\1\347"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\350"+
+ "\11\10\1\351\12\10\3\0\1\10\10\0\1\352\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+ "\1\353\1\10\1\350\12\10\3\0\1\10\10\0\2\10"+
+ "\1\354\4\10\3\0\4\10\1\355\4\10\1\356\1\357"+
+ "\1\360\5\10\1\46\4\10\3\0\1\10\10\0\7\10"+
+ "\3\0\1\10\1\361\24\10\3\0\1\10\10\0\7\10"+
+ "\3\0\11\10\1\362\14\10\3\0\1\10\10\0\3\10"+
+ "\1\363\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\16\10\1\133\2\10\1\364\4\10\3\0\1\10"+
+ "\10\0\7\10\3\0\1\10\1\365\24\10\3\0\1\10"+
+ "\10\0\2\10\1\366\1\367\1\370\2\10\3\0\7\10"+
+ "\1\371\1\10\1\372\1\373\13\10\3\0\1\10\10\0"+
+ "\2\10\1\374\4\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\10\10\1\375\15\10\3\0\1\10\10\0"+
+ "\2\10\1\46\4\10\3\0\26\10\3\0\1\10\10\0"+
+ "\5\10\1\376\1\10\3\0\7\10\1\377\16\10\3\0"+
+ "\1\10\10\0\7\10\3\0\7\10\1\u0100\16\10\3\0"+
+ "\1\10\10\0\4\10\1\u0101\2\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\13\10\1\u0102\12\10\3\0"+
+ "\1\10\10\0\7\10\3\0\11\10\1\u0103\14\10\3\0"+
+ "\1\10\10\0\7\10\3\0\13\10\1\u0104\12\10\3\0"+
+ "\1\10\10\0\5\10\1\u0105\1\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\2\10\1\u0106\23\10\3\0"+
+ "\1\10\10\0\1\u0107\6\10\3\0\1\10\1\u0108\11\10"+
+ "\1\u0109\12\10\3\0\1\10\10\0\5\10\1\u010a\1\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\u010b\4\10"+
+ "\3\0\4\10\1\u010c\6\10\1\u010d\12\10\3\0\1\10"+
+ "\10\0\4\10\1\46\1\u010e\1\10\3\0\26\10\3\0"+
+ "\1\10\10\0\5\10\1\353\1\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\1\10\1\u010f\2\10\1\u0110"+
+ "\1\46\5\10\1\u0111\12\10\3\0\1\10\10\0\3\10"+
+ "\1\u0112\3\10\3\0\11\10\1\46\14\10\3\0\1\10"+
+ "\10\0\7\10\3\0\1\10\1\u0113\24\10\3\0\1\10"+
+ "\10\0\7\10\3\0\11\10\1\u0114\1\u0115\13\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\u0116\3\10\1\u0117"+
+ "\15\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0118"+
+ "\14\10\3\0\1\10\10\0\6\10\1\u0102\3\0\26\10"+
+ "\3\0\1\10\10\0\4\10\1\u0119\1\10\1\u011a\3\0"+
+ "\15\10\1\u011b\10\10\3\0\1\10\10\0\7\10\3\0"+
+ "\5\10\1\352\20\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u011c\2\10\1\u011d\21\10\3\0\1\10\10\0"+
+ "\3\10\1\u011e\3\10\3\0\7\10\1\u011f\16\10\3\0"+
+ "\1\10\10\0\4\10\1\u0120\2\10\3\0\4\10\1\u0121"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0122"+
+ "\20\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0123"+
+ "\12\10\3\0\1\10\10\0\1\u0124\6\10\3\0\2\10"+
+ "\1\u0125\23\10\3\0\1\10\10\0\3\10\1\u0126\1\u0127"+
+ "\2\10\3\0\4\10\1\u0128\1\46\20\10\3\0\1\10"+
+ "\10\0\4\10\1\u0129\2\10\3\0\26\10\3\0\1\10"+
+ "\10\0\1\u012a\3\10\1\u012b\1\10\1\u012c\3\0\13\10"+
+ "\1\u012d\12\10\3\0\1\10\10\0\4\10\1\46\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u012e\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\1\u012f\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\3\10\1\u0130\22\10"+
+ "\3\0\1\10\10\0\7\10\3\0\5\10\1\u0131\20\10"+
+ "\3\0\1\10\10\0\7\10\3\0\7\10\1\46\16\10"+
+ "\3\0\1\10\10\0\4\10\1\u0132\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\4\10\1\u0133\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\1\u0134\6\10\3\0\26\10\3\0"+
+ "\1\10\10\0\5\10\1\362\1\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\1\10\1\u0135\24\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\u0136\3\10\1\u0137"+
+ "\15\10\3\0\1\10\10\0\1\u0102\6\10\3\0\14\10"+
+ "\1\u0138\11\10\3\0\1\10\10\0\5\10\1\u0139\1\10"+
+ "\3\0\4\10\1\u013a\11\10\1\133\7\10\3\0\1\10"+
+ "\10\0\6\10\1\u013b\3\0\26\10\3\0\1\10\10\0"+
+ "\2\10\1\u013c\1\10\1\363\2\10\3\0\26\10\3\0"+
+ "\1\10\10\0\1\u013d\5\10\1\302\3\0\26\10\16\0"+
+ "\1\u013e\2\0\1\u013f\25\0\1\u0140\41\0\1\u0141\1\u0142"+
+ "\47\0\1\u0143\42\0\1\u0144\17\0\1\u0145\43\0\1\u0146"+
+ "\3\0\1\u0147\3\0\1\u0148\26\0\1\u0149\24\0\1\u014a"+
+ "\30\0\1\u014b\15\0\1\u0148\62\0\1\u014c\47\0\1\u014d"+
+ "\1\0\1\u014e\34\0\1\u014f\16\0\1\u0148\32\0\1\u0150"+
+ "\7\0\1\u0151\5\0\1\u0152\3\0\1\u0153\27\0\1\u0154"+
+ "\21\0\1\u0155\27\0\1\u0156\12\0\1\u0157\62\0\1\u0158"+
+ "\32\0\1\u0159\24\0\1\u0148\25\0\1\u015a\61\0\1\u015b"+
+ "\6\0\1\u015c\25\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\u015d\2\10\1\u015e\16\10\3\0\1\10\10\0\1\46"+
+ "\6\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\13\10\1\365\12\10\3\0\1\10\10\0\1\u015f\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\5\10\1\u0160\1\10"+
+ "\3\0\1\10\1\u0161\11\10\1\350\12\10\3\0\1\10"+
+ "\10\0\7\10\3\0\16\10\1\u0162\7\10\3\0\1\10"+
+ "\10\0\1\46\5\10\1\u0163\3\0\7\10\1\u0164\16\10"+
+ "\3\0\1\10\10\0\1\u0165\6\10\3\0\26\10\3\0"+
+ "\1\10\10\0\2\10\1\u0166\4\10\3\0\26\10\3\0"+
+ "\1\10\10\0\1\224\6\10\3\0\3\10\1\u0167\22\10"+
+ "\3\0\1\10\10\0\1\143\6\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\10\10\1\u0168\15\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\366\21\10\3\0"+
+ "\1\10\10\0\7\10\3\0\3\10\1\173\22\10\3\0"+
+ "\1\10\10\0\7\10\3\0\1\10\1\124\2\10\1\u0169"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u016a"+
+ "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\46"+
+ "\12\10\3\0\1\10\10\0\4\10\1\u016b\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u016c"+
+ "\14\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u016d"+
+ "\13\10\3\0\1\10\10\0\5\10\1\257\1\10\3\0"+
+ "\26\10\3\0\1\10\10\0\1\u016e\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\5\10\1\u016f\1\10\3\0\10\10"+
+ "\1\u016d\15\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+ "\1\u0170\24\10\3\0\1\10\10\0\2\10\1\u0171\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\u0172\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\3\10\1\u0173\3\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\341\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\1\u0174\6\10\3\0\17\10"+
+ "\1\46\6\10\3\0\1\10\10\0\4\10\1\u0175\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\366\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\362\4\10\1\257"+
+ "\1\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0176"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\1\365\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u0177\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\6\10\1\302\3\0\13\10"+
+ "\1\u0178\12\10\3\0\1\10\10\0\1\342\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\213"+
+ "\15\10\3\0\1\10\10\0\7\10\3\0\13\10\1\350"+
+ "\12\10\3\0\1\10\10\0\5\10\1\331\1\10\3\0"+
+ "\11\10\1\u0179\14\10\3\0\1\10\10\0\7\10\3\0"+
+ "\11\10\1\u017a\14\10\3\0\1\10\10\0\7\10\3\0"+
+ "\7\10\1\u017b\16\10\3\0\1\10\10\0\7\10\3\0"+
+ "\6\10\1\u017c\17\10\3\0\1\10\10\0\5\10\1\u017d"+
+ "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u017e\24\10\3\0\1\10\10\0\4\10\1\u017f"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\3\10\1\u0180"+
+ "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\4\10\1\u0181\21\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0182\24\10\3\0\1\10\10\0\1\u0183\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u0184\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\2\10\1\124\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\213"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0185"+
+ "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0186"+
+ "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0187"+
+ "\24\10\3\0\1\10\10\0\1\u0188\4\10\1\46\1\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+ "\1\u0189\20\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\u0116\21\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\276\21\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+ "\1\u018a\24\10\3\0\1\10\10\0\4\10\1\u018b\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\353\21\10\3\0\1\10\10\0\7\10\3\0\12\10"+
+ "\1\u018c\13\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+ "\1\353\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\u018d\21\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+ "\1\364\20\10\3\0\1\10\10\0\5\10\1\46\1\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\3\10"+
+ "\1\46\22\10\3\0\1\10\10\0\6\10\1\u018e\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\46"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0108"+
+ "\24\10\3\0\1\10\10\0\6\10\1\u018f\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0190\6\10"+
+ "\1\u0191\15\10\3\0\1\10\10\0\1\213\6\10\3\0"+
+ "\12\10\1\u0192\13\10\3\0\1\10\10\0\7\10\3\0"+
+ "\13\10\1\u0193\12\10\3\0\1\10\10\0\5\10\1\u0194"+
+ "\1\10\3\0\13\10\1\350\12\10\3\0\1\10\10\0"+
+ "\3\10\1\257\3\10\3\0\5\10\1\u0195\11\10\1\353"+
+ "\6\10\3\0\1\10\10\0\7\10\3\0\15\10\1\u0196"+
+ "\10\10\3\0\1\10\10\0\1\u018a\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0197\23\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0198\7\10"+
+ "\1\u0199\4\10\1\46\6\10\3\0\1\10\10\0\7\10"+
+ "\3\0\1\10\1\u019a\24\10\3\0\1\10\10\0\7\10"+
+ "\3\0\12\10\1\46\13\10\3\0\1\10\10\0\7\10"+
+ "\3\0\11\10\1\u0182\14\10\3\0\1\10\10\0\7\10"+
+ "\3\0\22\10\1\u019b\3\10\3\0\1\10\10\0\1\u019c"+
+ "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u019d"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\1\10\1\46"+
+ "\5\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\11\10\1\257\14\10\3\0\1\10\10\0\7\10\3\0"+
+ "\11\10\1\46\14\10\3\0\1\10\10\0\6\10\1\u019e"+
+ "\3\0\26\10\3\0\1\10\10\0\4\10\1\u019f\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\11\10"+
+ "\1\u01a0\14\10\3\0\1\10\10\0\4\10\1\u01a1\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u01a2\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\2\10\1\u01a3\4\10\3\0"+
+ "\4\10\1\u01a4\21\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u01a5\24\10\3\0\1\10\10\0\7\10\3\0"+
+ "\12\10\1\u01a6\13\10\3\0\1\10\10\0\2\10\1\u01a7"+
+ "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\4\10\1\u01a8\21\10\3\0\1\10\10\0\7\10\3\0"+
+ "\11\10\1\u01a9\3\10\1\u0182\10\10\3\0\1\10\10\0"+
+ "\7\10\3\0\21\10\1\147\4\10\3\0\1\10\10\0"+
+ "\4\10\1\353\2\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\4\10\1\u01aa\21\10\3\0\1\10\10\0"+
+ "\7\10\3\0\15\10\1\u01ab\10\10\3\0\1\10\10\0"+
+ "\6\10\1\362\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\13\10\1\153\5\10\1\u01ac\4\10\3\0\1\10"+
+ "\10\0\7\10\3\0\10\10\1\u01ad\15\10\3\0\1\10"+
+ "\10\0\2\10\1\u01ae\4\10\3\0\26\10\3\0\1\10"+
+ "\10\0\3\10\1\257\3\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\4\10\1\u01af\21\10\3\0\1\10"+
+ "\10\0\7\10\3\0\7\10\1\u01b0\16\10\3\0\1\10"+
+ "\10\0\6\10\1\u01b1\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\17\10\1\46\6\10\3\0\1\10\10\0"+
+ "\1\362\5\10\1\u01b2\3\0\26\10\3\0\1\10\10\0"+
+ "\4\10\1\u01b3\2\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\24\10\1\124\1\10\3\0\1\10\10\0"+
+ "\4\10\1\u01b4\2\10\3\0\26\10\3\0\1\10\10\0"+
+ "\1\u01b5\6\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+ "\1\u01b6\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\11\10\1\u01b7\14\10\3\0\1\10\10\0\2\10"+
+ "\1\46\4\10\3\0\7\10\1\u01b8\16\10\3\0\1\10"+
+ "\10\0\7\10\3\0\5\10\1\u01b9\1\u01ba\17\10\3\0"+
+ "\1\10\10\0\1\u01bb\6\10\3\0\5\10\1\u01bc\20\10"+
+ "\3\0\1\10\10\0\2\10\1\u01bd\4\10\3\0\26\10"+
+ "\3\0\1\10\10\0\4\10\1\u01be\2\10\3\0\2\10"+
+ "\1\46\23\10\3\0\1\10\10\0\2\10\1\u01bf\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01c0\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u01c1\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\1\u01c2\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\1\365\6\10\3\0\12\10\1\323"+
+ "\13\10\3\0\1\10\10\0\5\10\1\u01c3\1\u01c4\3\0"+
+ "\7\10\1\u01c5\16\10\3\0\1\10\10\0\7\10\3\0"+
+ "\4\10\1\u01c6\21\10\3\0\1\10\10\0\2\10\1\u0121"+
+ "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\5\10\1\317\20\10\3\0\1\10\10\0\2\10\1\u01c7"+
+ "\4\10\3\0\26\10\3\0\1\10\10\0\5\10\1\u01c8"+
+ "\1\10\3\0\26\10\3\0\1\10\10\0\6\10\1\201"+
+ "\3\0\10\10\1\257\15\10\3\0\1\10\10\0\6\10"+
+ "\1\u01c9\3\0\26\10\3\0\1\10\10\0\3\10\1\u01ca"+
+ "\3\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\5\10\1\u01cb\20\10\3\0\1\10\10\0\2\10\1\46"+
+ "\4\10\3\0\4\10\1\257\21\10\33\0\1\u0148\55\0"+
+ "\1\u01cc\45\0\1\u01cd\54\0\1\u0151\5\0\1\u01ce\3\0"+
+ "\1\u01cf\51\0\1\u0155\1\u01d0\27\0\1\u0159\17\0\1\u01d1"+
+ "\5\0\1\u01d2\51\0\1\u01d3\32\0\1\u0147\47\0\1\u01d4"+
+ "\100\0\1\u0148\30\0\1\u01d5\1\0\1\u0148\63\0\1\u0140"+
+ "\53\0\1\u01d6\2\0\1\u01d7\4\0\1\251\54\0\1\u01d8"+
+ "\47\0\1\u0148\56\0\1\u01d9\50\0\1\u01da\50\0\1\u0148"+
+ "\50\0\1\u01d4\64\0\1\u01db\2\0\1\u01dc\45\0\1\u01dd"+
+ "\33\0\1\u0159\2\0\1\u01de\63\0\1\u01df\41\0\1\u013e"+
+ "\65\0\1\u01e0\43\0\1\u0148\71\0\1\u01e1\57\0\1\u01e2"+
+ "\27\0\1\u01e3\57\0\1\u01e4\34\0\1\10\10\0\7\10"+
+ "\3\0\7\10\1\152\16\10\3\0\1\10\10\0\7\10"+
+ "\3\0\1\10\1\220\24\10\3\0\1\10\10\0\7\10"+
+ "\3\0\12\10\1\213\13\10\3\0\1\10\10\0\7\10"+
+ "\3\0\13\10\1\u01e5\12\10\3\0\1\10\10\0\2\10"+
+ "\1\u01e6\4\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\12\10\1\u01e7\13\10\3\0\1\10\10\0\4\10"+
+ "\1\u01e8\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\13\10\1\u01e9\12\10\3\0\1\10\10\0\3\10"+
+ "\1\311\3\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\12\10\1\323\13\10\3\0\1\10\10\0\7\10"+
+ "\3\0\1\10\1\u01ea\24\10\3\0\1\10\10\0\7\10"+
+ "\3\0\12\10\1\u01eb\13\10\3\0\1\10\10\0\6\10"+
+ "\1\u01ec\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\12\10\1\u01ed\13\10\3\0\1\10\10\0\6\10\1\u01ee"+
+ "\3\0\26\10\3\0\1\10\10\0\6\10\1\u01ef\3\0"+
+ "\26\10\3\0\1\10\10\0\5\10\1\u01af\1\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\12\10\1\u01f0"+
+ "\13\10\3\0\1\10\10\0\1\u01f1\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\4\10\1\u01f2\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\7\10\1\u01f3\16\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u019b\23\10"+
+ "\3\0\1\10\10\0\4\10\1\363\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\1\10\1\220\5\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u01f4\23\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f5\21\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01f6\21\10"+
+ "\3\0\1\10\10\0\1\u01f7\6\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\12\10\1\u01f8\13\10\3\0"+
+ "\1\10\10\0\4\10\1\u017d\2\10\3\0\26\10\3\0"+
+ "\1\10\10\0\6\10\1\u01f9\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\1\46\25\10\3\0\1\10\10\0"+
+ "\7\10\3\0\4\10\1\u01fa\21\10\3\0\1\10\10\0"+
+ "\7\10\3\0\1\10\1\u017d\24\10\3\0\1\10\10\0"+
+ "\1\u017d\6\10\3\0\26\10\3\0\1\10\10\0\6\10"+
+ "\1\u01fb\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\14\10\1\46\11\10\3\0\1\10\10\0\2\10\1\361"+
+ "\4\10\3\0\26\10\3\0\1\10\10\0\2\10\1\u01fc"+
+ "\4\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\7\10\1\u01fd\16\10\3\0\1\10\10\0\1\362\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\5\10\1\u01fe\1\10"+
+ "\3\0\26\10\3\0\1\10\10\0\2\10\1\u01ff\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\7\10"+
+ "\1\u0200\16\10\3\0\1\10\10\0\4\10\1\257\2\10"+
+ "\3\0\26\10\3\0\1\10\10\0\1\u0201\6\10\3\0"+
+ "\4\10\1\u0202\21\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0203\6\10\1\u018a\15\10\3\0\1\10\10\0"+
+ "\7\10\3\0\5\10\1\u0204\20\10\3\0\1\10\10\0"+
+ "\2\10\1\u0205\4\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\7\10\1\u0206\16\10\3\0\1\10\10\0"+
+ "\6\10\1\153\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\4\10\1\153\21\10\3\0\1\10\10\0\7\10"+
+ "\3\0\13\10\1\u0207\12\10\3\0\1\10\10\0\7\10"+
+ "\3\0\21\10\1\257\4\10\3\0\1\10\10\0\7\10"+
+ "\3\0\1\10\1\u0208\24\10\3\0\1\10\10\0\7\10"+
+ "\3\0\13\10\1\u0109\12\10\3\0\1\10\10\0\7\10"+
+ "\3\0\11\10\1\75\14\10\3\0\1\10\10\0\1\u0183"+
+ "\6\10\3\0\4\10\1\u0209\21\10\3\0\1\10\10\0"+
+ "\7\10\3\0\4\10\1\376\21\10\3\0\1\10\10\0"+
+ "\5\10\1\336\1\10\3\0\26\10\3\0\1\10\10\0"+
+ "\5\10\1\u020a\1\10\3\0\7\10\1\u020b\16\10\3\0"+
+ "\1\10\10\0\7\10\3\0\13\10\1\u020c\12\10\3\0"+
+ "\1\10\10\0\7\10\3\0\13\10\1\u020d\12\10\3\0"+
+ "\1\10\10\0\7\10\3\0\7\10\1\u0116\16\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\u020e\21\10\3\0"+
+ "\1\10\10\0\7\10\3\0\1\10\1\u0116\5\10\1\353"+
+ "\16\10\3\0\1\10\10\0\2\10\1\u020f\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\213"+
+ "\23\10\3\0\1\10\10\0\7\10\3\0\5\10\1\u0210"+
+ "\20\10\3\0\1\10\10\0\4\10\1\u0211\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\4\10\1\u0212\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0213"+
+ "\12\10\3\0\1\10\10\0\1\u0214\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0215\24\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u0216\23\10"+
+ "\3\0\1\10\10\0\7\10\3\0\13\10\1\362\12\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0217\24\10"+
+ "\3\0\1\10\10\0\7\10\3\0\6\10\1\u0218\17\10"+
+ "\3\0\1\10\10\0\7\10\3\0\7\10\1\353\16\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\u0219\24\10"+
+ "\3\0\1\10\10\0\6\10\1\u018e\3\0\13\10\1\u020c"+
+ "\12\10\3\0\1\10\10\0\2\10\1\u021a\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0182"+
+ "\17\10\3\0\1\10\10\0\4\10\1\317\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\10\10\1\u021b"+
+ "\15\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u021c"+
+ "\5\10\1\u0182\10\10\3\0\1\10\10\0\1\u0191\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\2\10"+
+ "\1\u021d\4\10\1\46\16\10\3\0\1\10\10\0\7\10"+
+ "\3\0\10\10\1\u0109\15\10\3\0\1\10\10\0\6\10"+
+ "\1\u01a2\3\0\26\10\3\0\1\10\10\0\6\10\1\u021e"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\16\10"+
+ "\1\u021f\7\10\3\0\1\10\10\0\1\u0220\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\4\10\1\u0221\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\353"+
+ "\12\10\3\0\1\10\10\0\7\10\3\0\10\10\1\353"+
+ "\15\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0160"+
+ "\23\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0222"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0223"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0224"+
+ "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u011c"+
+ "\12\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0225"+
+ "\24\10\3\0\1\10\10\0\5\10\1\336\1\10\3\0"+
+ "\12\10\1\u0226\13\10\3\0\1\10\10\0\7\10\3\0"+
+ "\5\10\1\220\20\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0227\24\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0228\24\10\3\0\1\10\10\0\7\10\3\0"+
+ "\3\10\1\213\22\10\3\0\1\10\10\0\7\10\3\0"+
+ "\13\10\1\u0229\12\10\14\0\1\u0148\60\0\1\u0148\75\0"+
+ "\1\u01dc\45\0\1\u022a\36\0\1\u01cc\53\0\1\u0150\50\0"+
+ "\1\u0159\101\0\1\u0140\26\0\1\u0148\54\0\1\u022b\55\0"+
+ "\1\u022c\46\0\1\u022d\71\0\1\u0158\63\0\1\u0148\51\0"+
+ "\1\u022e\27\0\1\u022f\74\0\1\u01d1\32\0\1\u0230\2\0"+
+ "\1\u0231\10\0\1\u0232\1\0\1\u0233\1\0\1\u0234\3\0"+
+ "\1\u0235\35\0\1\u01cd\60\0\1\u013f\56\0\1\u0147\62\0"+
+ "\1\u01d0\45\0\1\u0236\53\0\1\u0237\41\0\1\u01cc\35\0"+
+ "\1\10\10\0\7\10\3\0\5\10\1\u0238\20\10\3\0"+
+ "\1\10\10\0\7\10\3\0\5\10\1\u0239\20\10\3\0"+
+ "\1\10\10\0\7\10\3\0\1\10\1\u0161\24\10\3\0"+
+ "\1\10\10\0\5\10\1\u016f\1\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\u023a\21\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\u023b\21\10\3\0"+
+ "\1\10\10\0\7\10\3\0\17\10\1\u023c\6\10\3\0"+
+ "\1\10\10\0\2\10\1\213\4\10\3\0\26\10\3\0"+
+ "\1\10\10\0\7\10\3\0\6\10\1\u023d\6\10\1\u0182"+
+ "\10\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u023e"+
+ "\12\10\3\0\1\10\10\0\2\10\1\u023f\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\5\10\1\u0240\1\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\11\10\1\u0241"+
+ "\14\10\3\0\1\10\10\0\7\10\3\0\6\10\1\u0242"+
+ "\3\10\1\u0243\13\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0244\24\10\3\0\1\10\10\0\7\10\3\0"+
+ "\7\10\1\u010e\16\10\3\0\1\10\10\0\7\10\3\0"+
+ "\11\10\1\u0245\14\10\3\0\1\10\10\0\7\10\3\0"+
+ "\4\10\1\u0246\21\10\3\0\1\10\10\0\7\10\3\0"+
+ "\13\10\1\u0247\12\10\3\0\1\10\10\0\5\10\1\u0180"+
+ "\1\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0248\24\10\3\0\1\10\10\0\7\10\3\0"+
+ "\15\10\1\46\10\10\3\0\1\10\10\0\7\10\3\0"+
+ "\5\10\1\353\20\10\3\0\1\10\10\0\1\220\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+ "\1\u0249\12\10\3\0\1\10\10\0\7\10\3\0\5\10"+
+ "\1\u024a\20\10\3\0\1\10\10\0\7\10\3\0\20\10"+
+ "\1\46\5\10\3\0\1\10\10\0\2\10\1\u024b\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+ "\1\u024c\24\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\u0238\21\10\3\0\1\10\10\0\6\10\1\u024d\3\0"+
+ "\26\10\3\0\1\10\10\0\3\10\1\46\3\10\3\0"+
+ "\26\10\3\0\1\10\10\0\4\10\1\u0215\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\2\10\1\72\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\257"+
+ "\23\10\3\0\1\10\10\0\6\10\1\u024e\3\0\26\10"+
+ "\3\0\1\10\10\0\6\10\1\u024f\3\0\26\10\3\0"+
+ "\1\10\10\0\1\u024b\6\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\21\10\1\317\4\10\3\0\1\10"+
+ "\10\0\7\10\3\0\4\10\1\220\21\10\3\0\1\10"+
+ "\10\0\1\u0249\6\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\13\10\1\u018a\12\10\3\0\1\10\10\0"+
+ "\7\10\3\0\1\10\1\u0250\24\10\3\0\1\10\10\0"+
+ "\7\10\3\0\7\10\1\u015e\16\10\3\0\1\10\10\0"+
+ "\7\10\3\0\1\10\1\46\24\10\3\0\1\10\10\0"+
+ "\2\10\1\46\4\10\3\0\6\10\1\u0251\17\10\3\0"+
+ "\1\10\10\0\7\10\3\0\15\10\1\u0252\10\10\3\0"+
+ "\1\10\10\0\7\10\3\0\4\10\1\357\21\10\3\0"+
+ "\1\10\10\0\1\u0253\6\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\4\10\1\u0254\21\10\3\0\1\10"+
+ "\10\0\7\10\3\0\6\10\1\u0255\17\10\3\0\1\10"+
+ "\10\0\4\10\1\u0238\2\10\3\0\26\10\3\0\1\10"+
+ "\10\0\3\10\1\220\3\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\4\10\1\257\21\10\3\0\1\10"+
+ "\10\0\6\10\1\u0256\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\1\10\1\u0257\24\10\3\0\1\10\10\0"+
+ "\7\10\3\0\16\10\1\46\7\10\3\0\1\10\10\0"+
+ "\7\10\3\0\12\10\1\353\13\10\3\0\1\10\10\0"+
+ "\7\10\3\0\6\10\1\353\17\10\3\0\1\10\10\0"+
+ "\1\365\3\10\1\u01be\2\10\3\0\26\10\3\0\1\10"+
+ "\10\0\7\10\3\0\22\10\1\u0258\3\10\3\0\1\10"+
+ "\10\0\7\10\3\0\15\10\1\u0182\10\10\3\0\1\10"+
+ "\10\0\7\10\3\0\1\10\1\u01fc\24\10\3\0\1\10"+
+ "\10\0\7\10\3\0\21\10\1\u0238\4\10\3\0\1\10"+
+ "\10\0\7\10\3\0\4\10\1\u0169\21\10\3\0\1\10"+
+ "\10\0\7\10\3\0\15\10\1\u0186\10\10\3\0\1\10"+
+ "\10\0\7\10\3\0\15\10\1\u0259\10\10\3\0\1\10"+
+ "\10\0\7\10\3\0\22\10\1\46\3\10\34\0\1\u0234"+
+ "\37\0\1\u025a\71\0\1\u025b\61\0\1\u0148\30\0\1\u025c"+
+ "\64\0\1\u025d\65\0\1\u025e\2\0\1\u025f\20\0\1\u0158"+
+ "\66\0\1\u0260\64\0\1\251\51\0\1\u0261\47\0\1\u0262"+
+ "\35\0\1\u0263\100\0\1\u0264\15\0\1\10\10\0\1\353"+
+ "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0265"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0266"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\1\10\1\u0267\24\10\3\0\1\10\10\0\1\u0182\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+ "\1\u0178\12\10\3\0\1\10\10\0\2\10\1\u01f1\4\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\1\10"+
+ "\1\362\24\10\3\0\1\10\10\0\7\10\3\0\13\10"+
+ "\1\u0116\12\10\3\0\1\10\10\0\1\u0268\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u0269"+
+ "\12\10\3\0\1\10\10\0\7\10\3\0\13\10\1\u026a"+
+ "\12\10\3\0\1\10\10\0\7\10\3\0\4\10\1\124"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\1\10\1\213"+
+ "\24\10\3\0\1\10\10\0\6\10\1\u026b\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\u026c\21\10"+
+ "\3\0\1\10\10\0\7\10\3\0\2\10\1\u026d\23\10"+
+ "\3\0\1\10\10\0\3\10\1\353\3\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\1\10\1\355\24\10"+
+ "\3\0\1\10\10\0\4\10\1\u026e\2\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\7\10\1\213\16\10"+
+ "\3\0\1\10\10\0\2\10\1\u026f\4\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\15\10\1\257\10\10"+
+ "\3\0\1\10\10\0\2\10\1\u0270\4\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\u01fc\21\10"+
+ "\3\0\1\10\10\0\7\10\3\0\6\10\1\46\17\10"+
+ "\3\0\1\10\10\0\7\10\3\0\10\10\1\u0271\15\10"+
+ "\3\0\1\10\10\0\7\10\3\0\25\10\1\46\3\0"+
+ "\1\10\10\0\6\10\1\u01af\3\0\26\10\3\0\1\10"+
+ "\10\0\1\u0272\6\10\3\0\26\10\3\0\1\10\10\0"+
+ "\7\10\3\0\23\10\1\257\2\10\3\0\1\10\10\0"+
+ "\7\10\3\0\4\10\1\347\21\10\3\0\1\10\10\0"+
+ "\6\10\1\72\3\0\26\10\3\0\1\10\10\0\5\10"+
+ "\1\u0273\1\10\3\0\26\10\31\0\1\u0148\55\0\1\u01cc"+
+ "\47\0\1\u01d9\41\0\1\u0148\52\0\1\u0274\66\0\1\u0275"+
+ "\45\0\1\u01cd\50\0\1\u0274\76\0\1\u013e\46\0\1\u0148"+
+ "\67\0\1\u0148\6\0\1\10\10\0\7\10\3\0\1\10"+
+ "\1\u0276\24\10\3\0\1\10\10\0\1\124\6\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u0277"+
+ "\23\10\3\0\1\10\10\0\2\10\1\u0278\4\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\4\10\1\u0109"+
+ "\21\10\3\0\1\10\10\0\7\10\3\0\7\10\1\u0238"+
+ "\16\10\3\0\1\10\10\0\7\10\3\0\2\10\1\u017d"+
+ "\23\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u0279"+
+ "\24\10\3\0\1\10\10\0\4\10\1\u027a\2\10\3\0"+
+ "\26\10\3\0\1\10\10\0\7\10\3\0\1\10\1\u027b"+
+ "\24\10\3\0\1\10\10\0\1\u0189\6\10\3\0\26\10"+
+ "\3\0\1\10\10\0\7\10\3\0\6\10\1\u027c\17\10"+
+ "\3\0\1\10\10\0\7\10\3\0\4\10\1\u0266\21\10"+
+ "\30\0\1\u0148\44\0\1\u0263\35\0\1\10\10\0\7\10"+
+ "\3\0\15\10\1\220\10\10\3\0\1\10\10\0\4\10"+
+ "\1\u027d\2\10\3\0\26\10\3\0\1\10\10\0\4\10"+
+ "\1\220\2\10\3\0\26\10\3\0\1\10\10\0\7\10"+
+ "\3\0\4\10\1\u027e\21\10\3\0\1\10\10\0\1\u027f"+
+ "\6\10\3\0\26\10\3\0\1\10\10\0\4\10\1\u0273"+
+ "\2\10\3\0\26\10\3\0\1\10\10\0\7\10\3\0"+
+ "\6\10\1\u027d\17\10\3\0\1\10\10\0\1\u020d\6\10"+
+ "\3\0\26\10\3\0\1\10\10\0\7\10\3\0\14\10"+
+ "\1\u017d\11\10\3\0\1\10\10\0\7\10\3\0\4\10"+
+ "\1\u017d\21\10\1\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[27016];
+ 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 =
+ "\5\0\2\11\3\1\1\11\12\1\3\11\23\1\1\11"+
+ "\1\1\2\11\1\1\2\11\1\1\1\11\2\1\1\11"+
+ "\144\1\21\0\1\11\220\1\7\0\1\1\2\0\1\11"+
+ "\24\0\157\1\12\0\1\1\16\0\105\1\16\0\42\1"+
+ "\13\0\17\1\2\0\12\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[639];
+ 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[];
+
+ /** 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;
+
+ /**
+ * 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;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SASTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "*", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public SASTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public SASTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 180) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ if (zzMarkedPosL > zzStartRead) {
+ switch (zzBufferL[zzMarkedPosL-1]) {
+ case '\n':
+ case '\u000B':
+ case '\u000C':
+ case '\u0085':
+ case '\u2028':
+ case '\u2029':
+ zzAtBOL = true;
+ break;
+ case '\r':
+ if (zzMarkedPosL < zzEndReadL)
+ zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+ else if (zzAtEOF)
+ zzAtBOL = false;
+ else {
+ boolean eof = zzRefill();
+ zzMarkedPosL = zzMarkedPos;
+ zzEndReadL = zzEndRead;
+ zzBufferL = zzBuffer;
+ if (eof)
+ zzAtBOL = false;
+ else
+ zzAtBOL = zzBufferL[zzMarkedPosL] != '\n';
+ }
+ break;
+ default:
+ zzAtBOL = false;
+ }
+ }
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ if (zzAtBOL)
+ zzState = ZZ_LEXSTATE[zzLexicalState+1];
+ else
+ zzState = ZZ_LEXSTATE[zzLexicalState];
+
+
+ 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;
+
+ int 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 13:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 21: break;
+ case 2:
+ { addNullToken(); return firstToken;
+ }
+ case 22: break;
+ case 18:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 23: break;
+ case 17:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 24: break;
+ case 3:
+ { addToken(Token.WHITESPACE);
+ }
+ case 25: break;
+ case 8:
+ { start = zzMarkedPos-1; yybegin(CHAR);
+ }
+ case 26: break;
+ case 5:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 27: break;
+ case 6:
+ { addToken(Token.SEPARATOR);
+ }
+ case 28: break;
+ case 16:
+ { addToken(Token.VARIABLE);
+ }
+ case 29: break;
+ case 14:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 30: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 31: break;
+ case 20:
+ { addToken(Token.FUNCTION);
+ }
+ case 32: break;
+ case 19:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 33: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 34: break;
+ case 9:
+ { // We must do this because of how we
+ // abuse JFlex; since we return an entire
+ // list of tokens at once instead of a
+ // single token at a time, the "^" regex
+ // character doesn't really work, so we must
+ // check that we're at the beginning of a
+ // line ourselves.
+ start = zzStartRead;
+ // Might not be any whitespace.
+ if (yylength()>1) {
+ addToken(zzStartRead,zzMarkedPos-2, Token.WHITESPACE);
+ zzStartRead = zzMarkedPos-1;
+ }
+ // Remember: zzStartRead may now be updated,
+ // so we must check against 'start'.
+ if (start==s.offset) {
+ addToken(zzStartRead,zzEndRead, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ else {
+ addToken(zzStartRead,zzStartRead, Token.OPERATOR);
+ }
+ }
+ case 35: break;
+ case 7:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 36: break;
+ case 4:
+ { addToken(Token.OPERATOR);
+ }
+ case 37: break;
+ case 12:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 38: break;
+ case 10:
+ {
+ }
+ case 39: break;
+ case 15:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 40: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 640: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 641: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 642: break;
+ case CHAR: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 643: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex
new file mode 100644
index 0000000..19bed03
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex
@@ -0,0 +1,463 @@
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated SQLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class SQLTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SQLTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "--", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+LineTerminator = ([\n])
+Letter = ([A-Za-z])
+Digit = ([0-9])
+Whitespace = ([ \t]+)
+
+IdentifierStart = ({Letter})
+IdentifierPart = ({IdentifierStart}|{Digit}|[_])
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+
+Operator = (">="|"<="|"<>"|">"|"<"|"="|"+"|"-"|"*"|"/")
+Separator = ([\(\)])
+
+Parameter = ([:]{Identifier})
+
+Integer = ({Digit}+)
+Float = (({Digit}+[.]{Digit}*)|([.]{Digit}*))
+ApproxNum = (({Digit}+[eE][+-]?{Digit}+)|({Digit}+[.]{Digit}*[eE][+-]?[0-9]+)|([.][0-9]*[eE][+-]?[0-9]+))
+
+CommentBegin = ("--")
+Comment = ({CommentBegin}.*)
+MLCBegin = "/*"
+MLCEnd = "*/"
+
+%state STRING
+%state CHAR
+%state MLC
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "ADD" |
+ "ALL" |
+ "ALTER" |
+ "AND" |
+ "ANY" |
+ "AS" |
+ "ASC" |
+ "AUTOINCREMENT" |
+ "AVA" |
+ "BETWEEN" |
+ "BINARY" |
+ "BIT" |
+ "BOOLEAN" |
+ "BY" |
+ "BYTE" |
+ "CHAR" |
+ "CHARACTER" |
+ "COLUMN" |
+ "CONSTRAINT" |
+ "COUNT" |
+ "COUNTER" |
+ "CREATE" |
+ "CURRENCY" |
+ "DATABASE" |
+ "DATE" |
+ "DATETIME" |
+ "DELETE" |
+ "DESC" |
+ "DISALLOW" |
+ "DISTINCT" |
+ "DISTINCTROW" |
+ "DOUBLE" |
+ "DROP" |
+ "EXISTS" |
+ "FLOAT" |
+ "FLOAT4" |
+ "FLOAT8" |
+ "FOREIGN" |
+ "FROM" |
+ "GENERAL" |
+ "GROUP" |
+ "GUID" |
+ "HAVING" |
+ "INNER" |
+ "INSERT" |
+ "IGNORE" |
+ "IMP" |
+ "IN" |
+ "INDEX" |
+ "INT" |
+ "INTEGER" |
+ "INTEGER1" |
+ "INTEGER2" |
+ "INTEGER4" |
+ "INTO" |
+ "IS" |
+ "JOIN" |
+ "KEY" |
+ "LEFT" |
+ "LEVEL" |
+ "LIKE" |
+ "LOGICAL" |
+ "LONG" |
+ "LONGBINARY" |
+ "LONGTEXT" |
+ "MAX" |
+ "MEMO" |
+ "MIN" |
+ "MOD" |
+ "MONEY" |
+ "NOT" |
+ "NULL" |
+ "NUMBER" |
+ "NUMERIC" |
+ "OLEOBJECT" |
+ "ON" |
+ "OPTION" |
+ "OR" |
+ "ORDER" |
+ "OUTER" |
+ "OWNERACCESS" |
+ "PARAMETERS" |
+ "PASSWORD" |
+ "PERCENT" |
+ "PIVOT" |
+ "PRIMARY" |
+ "REAL" |
+ "REFERENCES" |
+ "RIGHT" |
+ "SELECT" |
+ "SET" |
+ "SHORT" |
+ "SINGLE" |
+ "SMALLINT" |
+ "SOME" |
+ "STDEV" |
+ "STDEVP" |
+ "STRING" |
+ "SUM" |
+ "TABLE" |
+ "TABLEID" |
+ "TEXT" |
+ "TIME" |
+ "TIMESTAMP" |
+ "TOP" |
+ "TRANSFORM" |
+ "TYPE" |
+ "UNION" |
+ "UNIQUE" |
+ "UPDATE" |
+ "USER" |
+ "VALUE" |
+ "VALUES" |
+ "VAR" |
+ "VARBINARY" |
+ "VARCHAR" |
+ "VARP" |
+ "WHERE" |
+ "WITH" |
+ "YESNO" { addToken(Token.RESERVED_WORD); }
+
+ /* SQL99 aggregate functions */
+ "AVG" |
+ "COUNT" |
+ "MIN" |
+ "MAX" |
+ "SUM" { addToken(Token.FUNCTION); }
+
+ /* SQL99 built-in scalar functions */
+ "CURRENT_DATE" |
+ "CURRENT_TIME" |
+ "CURRENT_TIMESTAMP" |
+ "CURRENT_USER" |
+ "SESSION_USER" |
+ "SYSTEM_USER" { addToken(Token.FUNCTION); }
+
+ /* SQL99 numeric scalar functions */
+ "BIT_LENGTH" |
+ "CHAR_LENGTH" |
+ "EXTRACT" |
+ "OCTET_LENGTH" |
+ "POSITION" { addToken(Token.FUNCTION); }
+
+ /* SQL99 string functions */
+ "CONCATENATE" |
+ "CONVERT" |
+ "LOWER" |
+ "SUBSTRING" |
+ "TRANSLATE" |
+ "TRIM" |
+ "UPPER" { addToken(Token.FUNCTION); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ ";" { addToken(Token.IDENTIFIER); }
+
+ {Parameter} { addToken(Token.IDENTIFIER); }
+
+ {Comment} { addToken(Token.COMMENT_EOL); }
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ {Operator} { addToken(Token.OPERATOR); }
+ {Separator} { addToken(Token.SEPARATOR); }
+
+ {Integer} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {Float} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ApproxNum} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+ "\"" { start = zzMarkedPos-1; yybegin(STRING); }
+ "\'" { start = zzMarkedPos-1; yybegin(CHAR); }
+
+ "["[^\]]*"]" { addToken(Token.PREPROCESSOR); }
+ "["[^\]]* { addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken; }
+
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as OK; */
+ /* I don't know enough about SQL to know what's really invalid. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+<STRING> {
+
+ [^\n\"]+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+ "\"\"" {}
+ "\"" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+
+}
+
+<CHAR> {
+
+ [^\n\']+ {}
+ \n { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+ "\'\'" {}
+ "\'" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken; }
+
+}
+
+<MLC> {
+
+ [^\n\*]+ {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java
new file mode 100644
index 0000000..bf2dd23
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/SQLTokenMaker.java
@@ -0,0 +1,1126 @@
+/* The following code was generated by JFlex 1.4.1 on 2/7/09 11:02 AM */
+
+/*
+ * 02/15/2005
+ *
+ * SQLTokenMaker.java - Scanner for SQL.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * This class generates tokens representing a text stream as SQL.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated SQLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class SQLTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int STRING = 1;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 3;
+ public static final int CHAR = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\4\1\1\25\0\1\4\1\0\1\54\4\0\1\55\2\15"+
+ "\1\13\1\11\1\0\1\12\1\17\1\14\1\3\1\50\1\50\1\3"+
+ "\1\45\3\3\1\46\1\3\1\16\1\0\1\10\1\7\1\6\2\0"+
+ "\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41\1\34\1\51"+
+ "\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25\1\30\1\24"+
+ "\1\32\1\36\1\40\1\43\1\27\1\2\1\56\1\0\1\57\1\0"+
+ "\1\5\1\0\1\21\1\37\1\31\1\22\1\20\1\44\1\47\1\41"+
+ "\1\34\1\51\1\52\1\23\1\35\1\26\1\33\1\42\1\53\1\25"+
+ "\1\30\1\24\1\32\1\36\1\40\1\43\1\27\1\2\uff85\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 =
+ "\4\0\1\1\1\2\1\1\1\3\1\4\5\5\1\6"+
+ "\1\1\1\7\27\1\1\10\1\11\1\12\1\13\1\14"+
+ "\1\15\1\13\1\16\1\17\1\13\1\20\1\13\1\0"+
+ "\1\21\1\22\4\1\1\23\45\1\2\23\4\1\1\23"+
+ "\7\1\1\23\22\1\1\24\1\13\1\25\1\7\1\0"+
+ "\3\1\1\26\51\1\1\23\4\1\1\23\2\1\1\23"+
+ "\22\1\1\23\4\1\1\23\4\1\1\23\17\1\1\23"+
+ "\35\1\1\23\5\1\1\23\10\1\1\23\5\1\1\23"+
+ "\11\1\1\23\42\1\1\23\4\1\1\23\16\1\1\26"+
+ "\4\1";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[354];
+ 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\60\0\140\0\220\0\300\0\300\0\360\0\u0120"+
+ "\0\u0150\0\u0180\0\300\0\u01b0\0\u01e0\0\u0210\0\300\0\u0240"+
+ "\0\u0270\0\u02a0\0\u02d0\0\u0300\0\u0330\0\u0360\0\u0390\0\u03c0"+
+ "\0\u03f0\0\u0420\0\u0450\0\u0480\0\u04b0\0\u04e0\0\u0510\0\u0540"+
+ "\0\u0570\0\u05a0\0\u05d0\0\u0600\0\u0630\0\u0660\0\u0690\0\u06c0"+
+ "\0\300\0\300\0\u06f0\0\u0720\0\300\0\u0750\0\u0780\0\300"+
+ "\0\u07b0\0\u07e0\0\300\0\u0810\0\u0840\0\u0870\0\300\0\u08a0"+
+ "\0\u08d0\0\u0900\0\u0930\0\u0960\0\u0990\0\u09c0\0\u09f0\0\u0a20"+
+ "\0\u0a50\0\u0a80\0\u0ab0\0\u0ae0\0\u0b10\0\u0b40\0\u0b70\0\u0ba0"+
+ "\0\u0bd0\0\u0c00\0\u0c30\0\u0c60\0\u0c90\0\u0cc0\0\u0cf0\0\u0d20"+
+ "\0\u0d50\0\u0d80\0\u0db0\0\u0de0\0\u0e10\0\u0e40\0\u0e70\0\u0ea0"+
+ "\0\u0ed0\0\u0f00\0\u0f30\0\u0f60\0\u0f90\0\u0fc0\0\u0ff0\0\u1020"+
+ "\0\u1050\0\u1080\0\360\0\u10b0\0\u10e0\0\u1110\0\u1140\0\u1170"+
+ "\0\u11a0\0\u11d0\0\u1200\0\u1230\0\u1260\0\u1290\0\u12c0\0\u12f0"+
+ "\0\u1320\0\u1350\0\u1380\0\u13b0\0\u13e0\0\u1410\0\u1440\0\u1470"+
+ "\0\u14a0\0\u14d0\0\u1500\0\u1530\0\u1560\0\u1590\0\u15c0\0\u15f0"+
+ "\0\u1620\0\u1650\0\300\0\300\0\300\0\u1680\0\u1680\0\u16b0"+
+ "\0\u16e0\0\u1710\0\360\0\u1740\0\u0960\0\u1770\0\u17a0\0\u17d0"+
+ "\0\u1800\0\u1830\0\u1860\0\u1890\0\u18c0\0\u18f0\0\u1920\0\u1950"+
+ "\0\u1980\0\u19b0\0\u19e0\0\u1a10\0\u1a40\0\u1a70\0\u1aa0\0\u1ad0"+
+ "\0\u1b00\0\u1b30\0\u1b60\0\u1b90\0\u1bc0\0\u1bf0\0\u1c20\0\u1c50"+
+ "\0\u1c80\0\u1cb0\0\u1ce0\0\u1d10\0\u1d40\0\u1d70\0\u1da0\0\u1dd0"+
+ "\0\u1e00\0\u1e30\0\u1e60\0\u1e90\0\u1ec0\0\u1ef0\0\u1f20\0\u1f50"+
+ "\0\u1f80\0\u1fb0\0\u1fe0\0\u2010\0\u2040\0\u2070\0\u20a0\0\u20d0"+
+ "\0\u2100\0\u2130\0\u2160\0\u2190\0\u21c0\0\u21f0\0\u2220\0\u2250"+
+ "\0\u2280\0\u22b0\0\u22e0\0\u2310\0\u2340\0\u2370\0\u12f0\0\u23a0"+
+ "\0\u23d0\0\u2400\0\u2430\0\u2460\0\u2490\0\u24c0\0\u24f0\0\u2520"+
+ "\0\u2550\0\u2580\0\u25b0\0\u25e0\0\u2610\0\u2640\0\u2670\0\u26a0"+
+ "\0\u26d0\0\u2700\0\u2730\0\u2760\0\u2790\0\u27c0\0\u27f0\0\u2820"+
+ "\0\u2850\0\u2880\0\u28b0\0\u28e0\0\u2910\0\u2940\0\u2970\0\u29a0"+
+ "\0\u29d0\0\u2a00\0\u2a30\0\u2a60\0\u2a90\0\u2ac0\0\u2af0\0\u2b20"+
+ "\0\u2b50\0\u2b80\0\u2bb0\0\u2be0\0\u2c10\0\u2c40\0\u2c70\0\u2ca0"+
+ "\0\u2cd0\0\u2d00\0\u2d30\0\u2d60\0\u2d90\0\u2dc0\0\u2df0\0\u15f0"+
+ "\0\u2e20\0\u2e50\0\u2e80\0\u2eb0\0\u2ee0\0\u0c30\0\u2f10\0\u2f40"+
+ "\0\u2f70\0\u2fa0\0\u2fd0\0\u3000\0\u3030\0\u3060\0\u0ff0\0\u3090"+
+ "\0\u30c0\0\u2040\0\u30f0\0\u3120\0\u2ca0\0\u3150\0\u3180\0\u31b0"+
+ "\0\u31e0\0\u3210\0\u3240\0\u3270\0\u32a0\0\u32d0\0\u3300\0\u3330"+
+ "\0\u3360\0\u3390\0\u33c0\0\u33f0\0\u3420\0\u3450\0\u3480\0\u34b0"+
+ "\0\u34e0\0\u3510\0\u3540\0\u3570\0\u35a0\0\u35d0\0\u3600\0\u3630"+
+ "\0\u3660\0\u3690\0\u36c0\0\u36f0\0\u3720\0\u3750\0\u3780\0\u37b0"+
+ "\0\u37e0\0\u3810\0\u3840\0\u3870\0\u38a0\0\u38d0\0\u3900\0\u3930"+
+ "\0\u3960\0\u3990\0\u39c0\0\u39f0\0\u3a20\0\u3a50\0\u3a80\0\u3ab0"+
+ "\0\u3ae0\0\u3b10\0\u3b40\0\u3b70\0\u3ba0\0\u3bd0\0\u3c00\0\u3c30"+
+ "\0\u3c60\0\u3c90\0\u3cc0\0\u3cf0\0\u3d20\0\u3d50\0\u3d80\0\u3db0"+
+ "\0\u3de0\0\u3e10";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[354];
+ 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 =
+ "\1\5\1\6\1\7\1\10\1\11\1\5\1\12\1\13"+
+ "\1\14\1\13\1\15\1\13\1\16\1\17\1\20\1\21"+
+ "\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31"+
+ "\1\32\1\33\1\34\1\35\1\36\1\37\1\40\1\41"+
+ "\1\42\1\43\1\44\1\7\1\45\2\10\1\46\1\10"+
+ "\1\47\1\50\1\7\1\51\1\52\1\53\1\5\1\54"+
+ "\1\55\52\54\1\56\3\54\1\57\1\60\53\57\1\61"+
+ "\2\57\1\62\1\63\11\62\1\64\44\62\62\0\2\7"+
+ "\1\0\1\7\12\0\34\7\7\0\1\10\13\0\1\21"+
+ "\1\65\24\0\2\10\1\0\1\10\13\0\1\11\62\0"+
+ "\1\13\56\0\2\13\62\0\1\66\60\0\1\67\46\0"+
+ "\1\7\15\0\25\7\2\0\1\7\1\0\3\7\7\0"+
+ "\1\21\14\0\1\65\24\0\2\21\1\0\1\21\11\0"+
+ "\2\7\1\0\1\7\12\0\23\7\1\70\10\7\6\0"+
+ "\2\7\1\0\1\7\12\0\2\7\1\71\1\72\2\7"+
+ "\1\73\1\7\1\74\1\7\1\75\3\7\1\76\15\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\77\1\100\3\7"+
+ "\1\101\5\7\1\102\1\103\17\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\104\12\7\1\105\1\106\17\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\107\1\110\3\7\1\111"+
+ "\1\7\1\112\3\7\1\113\1\114\17\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\115\13\7\1\116\17\7\6\0"+
+ "\2\7\1\0\1\7\12\0\12\7\1\117\1\120\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\121\33\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\122\3\7\1\123\2\7"+
+ "\1\124\2\7\1\125\1\126\1\127\1\130\3\7\1\131"+
+ "\12\7\6\0\2\7\1\0\1\7\12\0\5\7\1\132"+
+ "\4\7\1\133\1\134\5\7\1\135\12\7\6\0\2\7"+
+ "\1\0\1\7\12\0\6\7\1\136\1\7\1\137\11\7"+
+ "\1\140\11\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+ "\1\141\1\7\1\142\1\143\2\7\1\144\1\145\5\7"+
+ "\1\146\1\7\1\147\11\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\150\1\7\1\143\4\7\1\113\11\7"+
+ "\1\151\4\7\6\0\2\7\1\0\1\7\12\0\1\152"+
+ "\1\153\11\7\1\154\1\155\17\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\7\1\156\32\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\157\6\7\1\160\3\7\1\161\1\162"+
+ "\17\7\6\0\2\7\1\0\1\7\12\0\14\7\1\163"+
+ "\4\7\1\164\12\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\7\1\165\32\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\166\1\167\3\7\1\170\5\7\1\171\1\172\17\7"+
+ "\6\0\2\7\1\0\1\7\12\0\3\7\1\173\1\7"+
+ "\1\174\5\7\1\175\20\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\176\4\7\1\177\4\7\1\200\21\7\6\0"+
+ "\2\7\1\0\1\7\12\0\13\7\1\201\20\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\202\33\7\4\0\57\53"+
+ "\1\203\1\54\1\0\52\54\1\0\3\54\54\0\1\204"+
+ "\3\0\1\57\1\0\53\57\1\0\2\57\55\0\1\204"+
+ "\2\0\1\62\1\0\11\62\1\0\44\62\14\0\1\205"+
+ "\46\0\1\206\5\0\2\207\32\0\2\206\1\0\1\206"+
+ "\7\0\1\66\1\0\56\66\2\0\2\7\1\0\1\7"+
+ "\12\0\4\7\1\210\7\7\1\211\17\7\6\0\2\7"+
+ "\1\0\1\7\12\0\2\7\1\143\31\7\6\0\2\7"+
+ "\1\0\1\7\12\0\3\7\1\143\1\137\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\2\7\1\143\4\7\1\143"+
+ "\24\7\6\0\2\7\1\0\1\7\12\0\11\7\1\143"+
+ "\22\7\6\0\2\7\1\0\1\7\12\0\4\7\1\212"+
+ "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\143"+
+ "\25\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+ "\3\7\1\214\4\7\1\215\23\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\216\27\7\6\0\2\7\1\0"+
+ "\1\7\12\0\13\7\1\113\20\7\6\0\2\7\1\0"+
+ "\1\7\12\0\12\7\1\217\21\7\6\0\2\7\1\0"+
+ "\1\7\12\0\10\7\1\220\23\7\6\0\2\7\1\0"+
+ "\1\7\12\0\16\7\1\221\5\7\1\120\7\7\6\0"+
+ "\2\7\1\0\1\7\12\0\6\7\1\222\11\7\1\223"+
+ "\6\7\1\224\4\7\6\0\2\7\1\0\1\7\12\0"+
+ "\32\7\1\225\1\7\6\0\2\7\1\0\1\7\12\0"+
+ "\23\7\1\120\10\7\6\0\2\7\1\0\1\7\12\0"+
+ "\17\7\1\226\14\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\7\1\227\12\7\1\230\17\7\6\0\2\7\1\0"+
+ "\1\7\12\0\22\7\1\225\11\7\6\0\2\7\1\0"+
+ "\1\7\12\0\22\7\1\143\11\7\6\0\2\7\1\0"+
+ "\1\7\12\0\15\7\1\231\16\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\7\1\232\22\7\1\233\7\7\6\0"+
+ "\2\7\1\0\1\7\12\0\27\7\1\234\4\7\6\0"+
+ "\2\7\1\0\1\7\12\0\3\7\1\232\11\7\1\235"+
+ "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\143"+
+ "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\236"+
+ "\23\7\6\0\2\7\1\0\1\7\12\0\3\7\1\237"+
+ "\1\143\3\7\1\240\23\7\6\0\2\7\1\0\1\7"+
+ "\12\0\2\7\1\241\2\7\1\242\26\7\6\0\2\7"+
+ "\1\0\1\7\12\0\10\7\1\243\23\7\6\0\2\7"+
+ "\1\0\1\7\12\0\15\7\1\143\1\7\1\244\14\7"+
+ "\6\0\2\7\1\0\1\7\12\0\15\7\1\225\16\7"+
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\245\25\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\246\32\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\247\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\250\33\7\6\0"+
+ "\2\7\1\0\1\7\12\0\5\7\1\251\26\7\6\0"+
+ "\2\7\1\0\1\7\12\0\3\7\1\252\2\7\1\253"+
+ "\3\7\1\254\21\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\7\1\255\32\7\6\0\2\7\1\0\1\7\12\0"+
+ "\14\7\1\256\17\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\257\33\7\6\0\2\7\1\0\1\7\12\0\2\7"+
+ "\1\250\17\7\1\223\11\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\260\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\2\7\1\137\31\7\6\0\2\7\1\0\1\7\12\0"+
+ "\4\7\1\261\27\7\6\0\2\7\1\0\1\7\12\0"+
+ "\4\7\1\137\27\7\6\0\2\7\1\0\1\7\12\0"+
+ "\6\7\1\262\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\4\7\1\263\27\7\6\0\2\7\1\0\1\7\12\0"+
+ "\2\7\1\264\1\7\1\265\1\7\1\137\1\7\1\266"+
+ "\23\7\6\0\2\7\1\0\1\7\12\0\6\7\1\267"+
+ "\25\7\6\0\2\7\1\0\1\7\12\0\15\7\1\270"+
+ "\16\7\6\0\2\7\1\0\1\7\12\0\23\7\1\143"+
+ "\10\7\6\0\2\7\1\0\1\7\12\0\2\7\1\143"+
+ "\3\7\1\50\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\6\7\1\143\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\3\7\1\271\1\7\1\272\26\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\273\27\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\225\27\7\6\0\2\7\1\0"+
+ "\1\7\12\0\13\7\1\274\20\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\275\1\7\1\276\25\7\6\0"+
+ "\2\7\1\0\1\7\12\0\4\7\1\277\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\300\33\7\6\0\2\7"+
+ "\1\0\1\7\12\0\16\7\1\242\15\7\6\0\2\7"+
+ "\1\0\1\7\12\0\5\7\1\301\26\7\6\0\2\7"+
+ "\1\0\1\7\12\0\5\7\1\302\2\7\1\303\23\7"+
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\304\17\7"+
+ "\6\0\2\7\1\0\1\7\12\0\10\7\1\305\23\7"+
+ "\6\0\2\7\1\0\1\7\12\0\16\7\1\306\15\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\307\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\310\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\5\7\1\311\26\7"+
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\312\25\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\313\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\71\17\7"+
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\155\17\7"+
+ "\6\0\2\7\1\0\1\7\12\0\7\7\1\143\24\7"+
+ "\7\0\1\206\41\0\2\206\1\0\1\206\11\0\2\7"+
+ "\1\0\1\7\12\0\5\7\1\314\26\7\6\0\2\7"+
+ "\1\0\1\7\12\0\10\7\1\315\23\7\6\0\2\7"+
+ "\1\0\1\7\12\0\13\7\1\316\20\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\317\33\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\320\1\321\32\7\6\0\2\7\1\0"+
+ "\1\7\12\0\17\7\1\322\14\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\7\1\323\2\7\1\324\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\232\33\7\6\0\2\7"+
+ "\1\0\1\7\12\0\27\7\1\325\4\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\326\33\7\6\0\2\7\1\0"+
+ "\1\7\12\0\14\7\1\327\17\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\143\33\7\6\0\2\7\1\0\1\7"+
+ "\12\0\3\7\1\330\30\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\331\25\7\6\0\2\7\1\0\1\7"+
+ "\12\0\15\7\1\213\16\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\332\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\3\7\1\143\30\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\333\33\7\6\0\2\7\1\0\1\7\12\0\21\7"+
+ "\1\120\12\7\6\0\2\7\1\0\1\7\12\0\1\334"+
+ "\16\7\1\137\14\7\6\0\2\7\1\0\1\7\12\0"+
+ "\6\7\1\270\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\335\33\7\6\0\2\7\1\0\1\7\12\0\10\7"+
+ "\1\336\23\7\6\0\2\7\1\0\1\7\12\0\1\337"+
+ "\33\7\6\0\2\7\1\0\1\7\12\0\14\7\1\340"+
+ "\17\7\6\0\2\7\1\0\1\7\12\0\4\7\1\341"+
+ "\27\7\6\0\2\7\1\0\1\7\12\0\10\7\1\342"+
+ "\23\7\6\0\2\7\1\0\1\7\12\0\27\7\1\322"+
+ "\4\7\6\0\2\7\1\0\1\7\12\0\3\7\1\343"+
+ "\30\7\6\0\2\7\1\0\1\7\12\0\5\7\1\120"+
+ "\26\7\6\0\2\7\1\0\1\7\12\0\1\7\1\317"+
+ "\32\7\6\0\2\7\1\0\1\7\12\0\5\7\1\344"+
+ "\26\7\6\0\2\7\1\0\1\7\12\0\12\7\1\345"+
+ "\21\7\6\0\2\7\1\0\1\7\12\0\10\7\1\346"+
+ "\1\347\4\7\1\350\15\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\351\25\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\352\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\13\7\1\155\17\7\1\353\6\0\2\7\1\0"+
+ "\1\7\12\0\5\7\1\143\26\7\6\0\2\7\1\0"+
+ "\1\7\12\0\13\7\1\354\20\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\355\33\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\356\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\14\7\1\357\17\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\153\33\7\6\0\2\7\1\0\1\7\12\0\1\360"+
+ "\12\7\1\143\20\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\247\33\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+ "\1\300\20\7\6\0\2\7\1\0\1\7\12\0\13\7"+
+ "\1\143\20\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+ "\1\361\21\7\6\0\2\7\1\0\1\7\12\0\11\7"+
+ "\1\362\5\7\1\363\2\7\1\143\11\7\6\0\2\7"+
+ "\1\0\1\7\12\0\20\7\1\364\13\7\6\0\2\7"+
+ "\1\0\1\7\12\0\3\7\1\365\30\7\6\0\2\7"+
+ "\1\0\1\366\12\0\34\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\7\1\367\32\7\6\0\2\7\1\0\1\7"+
+ "\12\0\21\7\1\143\12\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\225\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\11\7\1\370\22\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\7\1\371\32\7\6\0\2\7\1\0\1\7"+
+ "\12\0\10\7\1\372\23\7\6\0\2\7\1\0\1\7"+
+ "\12\0\15\7\1\276\16\7\6\0\2\7\1\0\1\7"+
+ "\12\0\14\7\1\373\17\7\6\0\2\7\1\0\1\7"+
+ "\12\0\13\7\1\120\20\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\7\1\374\32\7\6\0\2\7\1\0\1\7"+
+ "\12\0\15\7\1\143\16\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\375\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\376\33\7\6\0\2\7\1\0\1\7\12\0\12\7"+
+ "\1\113\21\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+ "\1\377\32\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+ "\1\u0100\27\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+ "\1\u0101\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+ "\1\u0102\27\7\6\0\2\7\1\0\1\7\12\0\17\7"+
+ "\1\u0103\14\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+ "\1\225\30\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+ "\1\u0104\30\7\6\0\2\7\1\0\1\7\12\0\14\7"+
+ "\1\u0105\17\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+ "\1\u0106\12\7\1\363\14\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\213\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\11\7\1\u0107\22\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\u0108\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\10\7\1\u0109\23\7\6\0\2\7\1\0\1\7\12\0"+
+ "\10\7\1\u010a\23\7\6\0\2\7\1\0\1\7\12\0"+
+ "\5\7\1\u010b\26\7\6\0\2\7\1\0\1\7\12\0"+
+ "\5\7\1\u010c\26\7\6\0\2\7\1\0\1\7\12\0"+
+ "\11\7\1\120\22\7\6\0\2\7\1\0\1\7\12\0"+
+ "\14\7\1\u010d\17\7\6\0\2\7\1\0\1\7\12\0"+
+ "\16\7\1\u010e\15\7\6\0\2\7\1\0\1\7\12\0"+
+ "\6\7\1\u010f\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\u0110\33\7\6\0\2\7\1\0\1\7\12\0\4\7"+
+ "\1\u0111\27\7\6\0\2\7\1\0\1\7\12\0\3\7"+
+ "\1\u0112\30\7\6\0\2\7\1\0\1\7\12\0\1\u0113"+
+ "\33\7\6\0\2\7\1\0\1\7\12\0\15\7\1\155"+
+ "\16\7\6\0\2\7\1\0\1\7\12\0\4\7\1\u0114"+
+ "\27\7\6\0\2\7\1\0\1\7\12\0\1\7\1\u0115"+
+ "\32\7\6\0\2\7\1\0\1\7\12\0\1\u0116\33\7"+
+ "\6\0\2\7\1\0\1\7\12\0\4\7\1\u0117\27\7"+
+ "\6\0\2\7\1\0\1\366\12\0\1\7\1\u0118\32\7"+
+ "\6\0\2\7\1\0\1\7\12\0\12\7\1\225\21\7"+
+ "\6\0\2\7\1\0\1\7\12\0\17\7\1\u0119\14\7"+
+ "\6\0\2\7\1\0\1\7\12\0\4\7\1\u011a\27\7"+
+ "\6\0\2\7\1\0\1\7\12\0\5\7\1\u011b\26\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\155\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\27\7\1\u011c\4\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\u011d\33\7\6\0"+
+ "\2\7\1\0\1\7\12\0\21\7\1\u011e\12\7\6\0"+
+ "\2\7\1\0\1\7\12\0\14\7\1\u011f\17\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\u0120\33\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\u0121\33\7\6\0\2\7\1\0"+
+ "\1\7\12\0\3\7\1\u0122\30\7\6\0\2\7\1\0"+
+ "\1\7\12\0\5\7\1\202\26\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\u0123\33\7\6\0\2\7\1\0\1\7"+
+ "\12\0\15\7\1\u0124\16\7\6\0\2\7\1\0\1\7"+
+ "\12\0\20\7\1\u0125\13\7\6\0\2\7\1\0\1\7"+
+ "\12\0\4\7\1\u0126\27\7\6\0\2\7\1\0\1\7"+
+ "\12\0\4\7\1\u0127\27\7\6\0\2\7\1\0\1\7"+
+ "\12\0\14\7\1\u0128\17\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\u0107\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\11\7\1\u0129\22\7\6\0\2\7\1\0\1\7"+
+ "\12\0\10\7\1\143\23\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\u012a\25\7\6\0\2\7\1\0\1\7"+
+ "\12\0\14\7\1\126\17\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\7\1\u012b\32\7\6\0\2\7\1\0\1\7"+
+ "\12\0\3\7\1\u012c\30\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\u012d\25\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\107\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\7\1\232\32\7\6\0\2\7\1\0\1\7\12\0"+
+ "\3\7\1\u012e\20\7\1\u012f\7\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\u0130\27\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\u0131\33\7\6\0\2\7\1\0\1\7"+
+ "\12\0\14\7\1\215\17\7\6\0\2\7\1\0\1\7"+
+ "\12\0\13\7\1\u0132\20\7\6\0\2\7\1\0\1\7"+
+ "\12\0\27\7\1\143\4\7\6\0\2\7\1\0\1\7"+
+ "\12\0\15\7\1\u0133\16\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\u0134\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\14\7\1\u0123\17\7\6\0\2\7\1\0\1\7"+
+ "\12\0\6\7\1\u0135\25\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\u0136\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\4\7\1\u0137\27\7\6\0\2\7\1\0\1\7"+
+ "\12\0\5\7\1\u0129\26\7\6\0\2\7\1\0\1\7"+
+ "\12\0\11\7\1\145\22\7\6\0\2\7\1\0\1\7"+
+ "\12\0\31\7\1\237\2\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\7\1\u0138\32\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\u0139\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\7\1\257\32\7\6\0\2\7\1\0\1\7\12\0"+
+ "\6\7\1\276\25\7\6\0\2\7\1\0\1\7\12\0"+
+ "\1\155\33\7\6\0\2\7\1\0\1\7\12\0\1\7"+
+ "\1\155\32\7\6\0\2\7\1\0\1\7\12\0\1\u013a"+
+ "\33\7\6\0\2\7\1\0\1\7\12\0\6\7\1\120"+
+ "\25\7\6\0\2\7\1\0\1\7\12\0\1\u013b\33\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013c\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\14\7\1\u013d\17\7"+
+ "\6\0\2\7\1\0\1\7\12\0\25\7\2\143\5\7"+
+ "\6\0\2\7\1\0\1\7\12\0\27\7\1\155\4\7"+
+ "\6\0\2\7\1\0\1\7\12\0\4\7\1\213\27\7"+
+ "\6\0\2\7\1\0\1\7\12\0\11\7\1\u013e\22\7"+
+ "\6\0\2\7\1\0\1\7\12\0\10\7\1\225\23\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\u013f\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\11\7\1\u0140\22\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0141\32\7"+
+ "\6\0\2\7\1\0\1\7\12\0\13\7\1\u0142\20\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0143\32\7"+
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0144\25\7"+
+ "\6\0\2\7\1\0\1\7\12\0\6\7\1\u0133\25\7"+
+ "\6\0\2\7\1\0\1\u0145\12\0\34\7\6\0\2\7"+
+ "\1\0\1\7\12\0\14\7\1\u0146\17\7\6\0\2\7"+
+ "\1\0\1\7\12\0\4\7\1\u0147\4\7\1\202\22\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\7\1\u0112\32\7"+
+ "\6\0\2\7\1\0\1\7\12\0\1\u0148\33\7\6\0"+
+ "\2\7\1\0\1\7\12\0\11\7\1\u0149\22\7\6\0"+
+ "\2\7\1\0\1\7\12\0\5\7\1\u014a\26\7\6\0"+
+ "\2\7\1\0\1\7\12\0\6\7\1\u014b\25\7\6\0"+
+ "\2\7\1\0\1\7\12\0\4\7\1\u014c\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\5\7\1\71\26\7\6\0"+
+ "\2\7\1\0\1\7\12\0\13\7\1\u014d\20\7\6\0"+
+ "\2\7\1\0\1\7\12\0\5\7\1\u014e\26\7\6\0"+
+ "\2\7\1\0\1\7\12\0\20\7\1\143\13\7\6\0"+
+ "\2\7\1\0\1\7\12\0\4\7\1\u014f\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\4\7\1\u0150\27\7\6\0"+
+ "\2\7\1\0\1\7\12\0\5\7\1\310\26\7\6\0"+
+ "\2\7\1\0\1\7\12\0\15\7\1\113\16\7\6\0"+
+ "\2\7\1\0\1\7\12\0\11\7\1\u0151\22\7\6\0"+
+ "\2\7\1\0\1\7\12\0\12\7\1\u0152\21\7\6\0"+
+ "\2\7\1\0\1\7\12\0\6\7\1\u0153\25\7\6\0"+
+ "\2\7\1\0\1\u0154\12\0\34\7\6\0\2\7\1\0"+
+ "\1\7\12\0\6\7\1\u012e\25\7\6\0\2\7\1\0"+
+ "\1\7\12\0\11\7\1\u0155\22\7\6\0\2\7\1\0"+
+ "\1\7\12\0\25\7\1\143\2\7\1\143\3\7\6\0"+
+ "\2\7\1\0\1\7\12\0\27\7\1\u0156\4\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\u0157\33\7\6\0\2\7"+
+ "\1\0\1\7\12\0\6\7\1\213\25\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\u0158\33\7\6\0\2\7\1\0"+
+ "\1\7\12\0\5\7\1\u012c\26\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\213\33\7\6\0\2\7\1\0\1\7"+
+ "\12\0\1\u0100\33\7\6\0\2\7\1\0\1\7\12\0"+
+ "\10\7\1\223\23\7\6\0\2\7\1\0\1\7\12\0"+
+ "\27\7\1\213\4\7\6\0\2\7\1\0\1\7\12\0"+
+ "\2\7\1\u012e\1\7\1\u0159\5\7\1\u0152\21\7\6\0"+
+ "\2\7\1\0\1\7\12\0\1\u015a\33\7\6\0\2\7"+
+ "\1\0\1\7\12\0\4\7\1\u015b\27\7\6\0\2\7"+
+ "\1\0\1\7\12\0\5\7\1\u0100\26\7\6\0\2\7"+
+ "\1\0\1\7\12\0\15\7\1\370\16\7\6\0\2\7"+
+ "\1\0\1\7\12\0\14\7\1\u015c\17\7\6\0\2\7"+
+ "\1\0\1\7\12\0\10\7\1\u0100\23\7\6\0\2\7"+
+ "\1\0\1\7\12\0\21\7\1\213\12\7\6\0\2\7"+
+ "\1\0\1\7\12\0\15\7\1\u015d\16\7\6\0\2\7"+
+ "\1\0\1\7\12\0\1\u015e\33\7\6\0\2\7\1\0"+
+ "\1\7\12\0\10\7\1\u015f\23\7\6\0\2\7\1\0"+
+ "\1\7\12\0\4\7\1\u0160\27\7\6\0\2\7\1\0"+
+ "\1\7\12\0\1\7\1\u0161\32\7\6\0\2\7\1\0"+
+ "\1\7\12\0\15\7\1\u0162\16\7\6\0\2\7\1\0"+
+ "\1\7\12\0\22\7\1\213\11\7\4\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[15936];
+ 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 =
+ "\4\0\2\11\4\1\1\11\3\1\1\11\31\1\2\11"+
+ "\2\1\1\11\2\1\1\11\2\1\1\11\1\1\1\0"+
+ "\1\1\1\11\113\1\3\11\1\1\1\0\333\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[354];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SQLTokenMaker() {
+ super();
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "--", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = STRING;
+ start = text.offset;
+ break;
+ case Token.LITERAL_CHAR:
+ state = CHAR;
+ start = text.offset;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ start = text.offset;
+ break;
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public SQLTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public SQLTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 178) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 20:
+ { addToken(Token.PREPROCESSOR);
+ }
+ case 23: break;
+ case 2:
+ { addNullToken(); return firstToken;
+ }
+ case 24: break;
+ case 21:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 25: break;
+ case 18:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 26: break;
+ case 4:
+ { addToken(Token.WHITESPACE);
+ }
+ case 27: break;
+ case 14:
+ { addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 28: break;
+ case 9:
+ { start = zzMarkedPos-1; yybegin(CHAR);
+ }
+ case 29: break;
+ case 7:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 30: break;
+ case 19:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 31: break;
+ case 6:
+ { addToken(Token.SEPARATOR);
+ }
+ case 32: break;
+ case 15:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_CHAR);
+ }
+ case 33: break;
+ case 1:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 34: break;
+ case 22:
+ { addToken(Token.FUNCTION);
+ }
+ case 35: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 36: break;
+ case 17:
+ { addToken(Token.COMMENT_EOL);
+ }
+ case 37: break;
+ case 8:
+ { start = zzMarkedPos-1; yybegin(STRING);
+ }
+ case 38: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 39: break;
+ case 5:
+ { addToken(Token.OPERATOR);
+ }
+ case 40: break;
+ case 13:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 41: break;
+ case 10:
+ { addToken(Token.ERROR_IDENTIFIER); addNullToken(); return firstToken;
+ }
+ case 42: break;
+ case 11:
+ {
+ }
+ case 43: break;
+ case 16:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 44: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case STRING: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 355: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 356: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 357: break;
+ case CHAR: {
+ addToken(start,zzStartRead-1, Token.LITERAL_CHAR); return firstToken;
+ }
+ case 358: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex
new file mode 100644
index 0000000..eaddc41
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex
@@ -0,0 +1,386 @@
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ScalaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class ScalaTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ScalaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = MULTILINE_STRING_DOUBLE;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ break;
+ default:
+ state = YYINITIAL;
+ }
+
+ s = text;
+ start = text.offset;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+
+/***** BEGIN SCALA-SPECIFIC CHANGES *********/
+Upper = ([A-Z\$\_]) /* Plus Unicode category Lu */
+Lower = ([a-z]) /* Plus Unicode category Ll */
+Letter = ({Upper}|{Lower}) /*Plus Unicode categories Lo, Lt, Nl */
+Digit = ([0-9])
+OpChar = ([^A-Z\$\_a-z0-9\(\[\]\)\. \t\f])
+Op = ({OpChar}+)
+IdRest = (({Letter}|{Digit})*([\_]{Op})?)
+VarId = ({Lower}{IdRest})
+PlainId = ({Upper}{IdRest}|{VarId}) /*|{Op})*/
+Id = ({PlainId}) /*({PlainId}|[\']{StringLit}[\'])*/
+
+IntegerLiteral = ({Digit}+[Ll]?)
+HexDigit = ({Digit}|[A-Fa-f])
+HexLiteral = ("0x"{HexDigit}+)
+
+ExponentPart = ([Ee][+\-]?{Digit}+)
+FloatType = ([FfDd])
+FloatingPointLiteral = ({Digit}+[\.]{Digit}*{ExponentPart}?{FloatType}? |
+ [\.]{Digit}+{ExponentPart}?{FloatType}? |
+ {Digit}+{ExponentPart}{FloatType}? |
+ {Digit}+{ExponentPart}?{FloatType})
+
+UnclosedCharLiteral = ([\']([\\].|[^\\\'])*[^\']?)
+CharLiteral = ({UnclosedCharLiteral}[\'])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+UnclosedBacktickLiteral = ([\`][^\`]+)
+BacktickLiteral = ({UnclosedBacktickLiteral}[\`])
+/* TODO: Multiline strings */
+
+MLCBegin = ("/*")
+MLCEnd = ("*/")
+LineCommentBegin = ("//")
+
+/***** END SCALA-SPECIFIC CHANGES *********/
+
+Whitespace = ([ \t\f]+)
+LineTerminator = ([\n])
+Separator = ([\(\)\{\}\[\]])
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({Letter}|[\_]|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+%state MULTILINE_STRING_DOUBLE
+%state MLC
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "abstract" |
+ "case" |
+ "catch" |
+ "class" |
+ "def" |
+ "do" |
+ "else" |
+ "extends" |
+ "false" |
+ "final" |
+ "finally" |
+ "for" |
+ "forSome" |
+ "if" |
+ "implicit" |
+ "import" |
+ "lazy" |
+ "match" |
+ "new" |
+ "null" |
+ "object" |
+ "override" |
+ "package" |
+ "private" |
+ "protected" |
+ "requires" |
+ "return" |
+ "sealed" |
+ "super" |
+ "this" |
+ "throw" |
+ "trait" |
+ "try" |
+ "true" |
+ "type" |
+ "val" |
+ "var" |
+ "while" |
+ "with" |
+ "yield" { addToken(Token.RESERVED_WORD); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Id} { addToken(Token.IDENTIFIER); }
+
+ {Whitespace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ \"\"\" { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE); }
+ {UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedBacktickLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+ {BacktickLiteral} { addToken(Token.LITERAL_BACKQUOTE); }
+
+ /* Comment literals. */
+ {MLCBegin} { start = zzMarkedPos-2; yybegin(MLC); }
+ {LineCommentBegin} { start = zzMarkedPos-2; yybegin(EOL_COMMENT); }
+
+ {Separator} { addToken(Token.SEPARATOR); }
+
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatingPointLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+<MULTILINE_STRING_DOUBLE> {
+ [^\"\\\n]* {}
+ \\.? { /* Skip escaped chars, handles case: '\"""'. */ }
+ \"\"\" { addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL); }
+ \" {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
+}
+
+<MLC> {
+ [^hwf\n\*]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; }
+ [hwf] {}
+ {MLCEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
+ \* {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
+}
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java
new file mode 100644
index 0000000..ac8e986
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java
@@ -0,0 +1,995 @@
+/* The following code was generated by JFlex 1.4.1 on 11/10/12 10:31 PM */
+
+/*
+ * 8/19/2009
+ *
+ * ScalaTokenMaker.java - Scanner for the Scala programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Scala programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated ScalaTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class ScalaTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 3;
+ public static final int MULTILINE_STRING_DOUBLE = 1;
+ public static final int YYINITIAL = 0;
+ public static final int MLC = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\31\1\24\1\0\1\31\23\0\1\31\1\33\1\25\1\33"+
+ "\1\1\1\33\1\33\1\22\2\4\1\30\1\16\1\33\1\16\1\21"+
+ "\1\27\1\12\11\3\1\42\1\33\1\0\1\33\1\0\2\33\3\10"+
+ "\1\17\1\14\1\17\5\1\1\6\6\1\1\52\7\1\1\4\1\23"+
+ "\1\4\1\0\1\5\1\26\1\44\1\45\1\11\1\20\1\15\1\40"+
+ "\1\61\1\34\1\41\1\56\1\60\1\7\1\53\1\50\1\47\1\36"+
+ "\1\2\1\46\1\37\1\35\1\55\1\57\1\43\1\13\1\51\1\54"+
+ "\1\32\1\0\1\32\1\33\uff81\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 =
+ "\1\0\1\1\2\0\2\2\1\3\1\4\2\2\1\3"+
+ "\3\2\1\5\1\6\1\7\2\2\1\10\15\2\1\1"+
+ "\1\11\1\12\2\1\1\13\5\1\1\14\3\1\1\2"+
+ "\1\3\1\0\2\15\3\2\1\0\3\2\1\16\1\17"+
+ "\1\5\2\7\1\20\1\7\1\21\1\22\26\2\1\11"+
+ "\1\0\1\23\10\0\1\2\1\15\1\0\4\2\1\24"+
+ "\1\2\1\20\1\25\1\26\11\2\1\16\12\2\1\27"+
+ "\10\0\21\2\2\0\1\30\2\0\1\31\4\2\1\16"+
+ "\6\2\4\0\3\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[184];
+ 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\62\0\144\0\226\0\310\0\372\0\u012c\0\310"+
+ "\0\u015e\0\u0190\0\u01c2\0\u01f4\0\u0226\0\u0258\0\u028a\0\310"+
+ "\0\u02bc\0\u02ee\0\u0320\0\u0352\0\u0384\0\u03b6\0\u03e8\0\u041a"+
+ "\0\u044c\0\u047e\0\u04b0\0\u04e2\0\u0514\0\u0546\0\u0578\0\u05aa"+
+ "\0\u05dc\0\u060e\0\u0640\0\310\0\u0672\0\u06a4\0\310\0\u06d6"+
+ "\0\u0708\0\u073a\0\u076c\0\u079e\0\310\0\u07d0\0\u0802\0\u0834"+
+ "\0\u0866\0\310\0\u0898\0\310\0\u08ca\0\u08fc\0\u092e\0\u0960"+
+ "\0\u0992\0\u09c4\0\u09f6\0\u0a28\0\372\0\310\0\u0a5a\0\u0a8c"+
+ "\0\u0abe\0\u0af0\0\u0b22\0\310\0\310\0\u0b54\0\u0b86\0\u0bb8"+
+ "\0\u0bea\0\u0c1c\0\u0c4e\0\u0c80\0\u0cb2\0\u0ce4\0\u0d16\0\u0d48"+
+ "\0\u0d7a\0\u0dac\0\u0dde\0\u0e10\0\u0e42\0\u0e74\0\u0ea6\0\u0ed8"+
+ "\0\u0f0a\0\u0f3c\0\u0f6e\0\310\0\u0fa0\0\310\0\u0fd2\0\u1004"+
+ "\0\u1036\0\u1068\0\u109a\0\u10cc\0\u10fe\0\u1130\0\u1162\0\u1194"+
+ "\0\u11c6\0\u11f8\0\u122a\0\u125c\0\u128e\0\u0992\0\u12c0\0\310"+
+ "\0\310\0\310\0\u12f2\0\u1324\0\u1356\0\u1388\0\u13ba\0\u13ec"+
+ "\0\u141e\0\u1450\0\u1482\0\u14b4\0\u14e6\0\u1518\0\u154a\0\u157c"+
+ "\0\u15ae\0\u15e0\0\u1612\0\u1644\0\u1676\0\u16a8\0\310\0\u16da"+
+ "\0\u170c\0\u173e\0\u1770\0\u17a2\0\u17d4\0\u1806\0\u1838\0\u186a"+
+ "\0\u189c\0\u18ce\0\u1900\0\u1932\0\u1964\0\u1996\0\u19c8\0\u19fa"+
+ "\0\u1a2c\0\u1a5e\0\u1a90\0\u1ac2\0\u1af4\0\u1b26\0\u1b58\0\u1b8a"+
+ "\0\u1bbc\0\u1bee\0\u1c20\0\u1c52\0\u1c84\0\u1cb6\0\u1ce8\0\u1d1a"+
+ "\0\u1d4c\0\u1d7e\0\u1db0\0\u1de2\0\u1e14\0\u1e46\0\u1e78\0\u1eaa"+
+ "\0\u1edc\0\u1f0e\0\u1c20\0\u1f40\0\u1cb6\0\u1f72\0\u1fa4\0\u1fd6";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[184];
+ 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 =
+ "\1\5\2\6\1\7\1\10\2\6\1\11\1\6\1\12"+
+ "\1\13\2\6\1\14\1\5\1\6\1\15\1\16\1\17"+
+ "\1\5\1\20\1\21\1\22\1\23\1\5\1\24\1\10"+
+ "\1\5\1\6\1\25\1\26\1\27\1\30\1\31\1\5"+
+ "\1\32\1\33\1\6\1\34\1\35\1\36\1\37\1\6"+
+ "\1\40\3\6\1\41\2\6\23\42\1\43\1\44\1\45"+
+ "\34\42\24\46\1\47\3\46\1\50\3\46\1\51\3\46"+
+ "\1\52\2\46\1\53\16\46\24\54\1\55\7\54\1\56"+
+ "\3\54\1\57\2\54\1\60\16\54\63\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\17\6"+
+ "\3\0\1\7\2\0\2\62\2\0\1\7\1\0\2\63"+
+ "\1\0\2\64\1\65\16\0\1\64\22\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"+
+ "\1\66\15\6\1\0\3\6\1\0\1\61\1\6\1\67"+
+ "\6\6\1\0\2\6\13\0\6\6\1\0\1\6\1\70"+
+ "\15\6\3\0\1\7\2\0\2\62\2\0\1\7\1\71"+
+ "\2\63\1\0\2\64\1\65\16\0\1\64\22\0\3\6"+
+ "\1\0\1\61\1\6\1\72\3\6\1\73\2\6\1\0"+
+ "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\7\6\1\74\1\0\2\6\13\0\6\6\1\0"+
+ "\4\6\1\75\12\6\3\0\1\65\6\0\1\65\47\0"+
+ "\22\17\1\76\1\77\36\17\23\100\1\101\1\100\1\102"+
+ "\34\100\26\103\1\0\33\103\27\0\1\104\1\105\62\0"+
+ "\1\24\31\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\1\106\5\6\1\0\3\6\1\107\2\6\1\110"+
+ "\10\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\6\6\1\0\1\6\1\111\1\6\1\112\13\6"+
+ "\1\0\3\6\1\0\1\61\7\6\1\113\1\0\2\6"+
+ "\13\0\6\6\1\0\12\6\1\114\4\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\115"+
+ "\1\0\1\6\1\116\2\6\1\117\12\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\4\6\1\75"+
+ "\1\6\1\0\10\6\1\120\6\6\1\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\1\121\4\6\1\122"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\2\6\1\123\14\6\1\0"+
+ "\3\6\1\0\1\61\7\6\1\124\1\0\2\6\13\0"+
+ "\6\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+ "\1\0\2\6\13\0\6\6\1\0\2\6\1\125\11\6"+
+ "\1\126\2\6\1\0\3\6\1\0\1\61\7\6\1\127"+
+ "\1\0\2\6\13\0\6\6\1\0\12\6\1\130\4\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\5\6\1\131\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\6\6\1\0\1\6\1\132"+
+ "\15\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\6\6\1\0\1\6\1\133\15\6\23\42\3\0"+
+ "\34\42\24\134\1\0\35\134\25\0\1\135\34\0\24\46"+
+ "\1\0\3\46\1\0\3\46\1\0\3\46\1\0\2\46"+
+ "\1\0\16\46\27\0\1\136\67\0\1\137\61\0\1\140"+
+ "\3\0\1\141\63\0\1\142\16\0\24\54\1\0\7\54"+
+ "\1\0\3\54\1\0\2\54\1\0\16\54\35\0\1\143"+
+ "\61\0\1\144\3\0\1\145\63\0\1\146\16\0\1\147"+
+ "\3\6\1\0\1\61\10\6\1\147\2\6\1\0\7\147"+
+ "\1\0\2\147\6\6\1\147\17\6\3\0\1\150\6\0"+
+ "\1\150\3\0\1\151\46\0\1\65\6\0\1\65\1\0"+
+ "\2\63\1\0\2\64\17\0\1\64\22\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\11\6"+
+ "\1\152\5\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\1\6\1\153\15\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6"+
+ "\1\154\1\6\1\155\2\6\1\0\17\6\3\0\1\156"+
+ "\4\0\3\156\1\0\2\156\1\0\2\156\17\0\1\156"+
+ "\3\0\2\156\15\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\3\6\1\155\2\6\1\0\17\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\1\6"+
+ "\1\157\4\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\4\6\1\75\1\6\1\0"+
+ "\17\6\24\17\1\0\35\17\23\100\1\101\1\100\1\160"+
+ "\60\100\1\0\35\100\25\0\1\161\34\0\26\103\1\162"+
+ "\33\103\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\5\6\1\163\1\0\3\6\1\164\13\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+ "\1\0\1\6\1\165\4\6\1\75\3\6\1\155\4\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\2\6\1\155\3\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\3\6\1\166\4\6\1\0\2\6\13\0\6\6"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\5\6\1\167\1\0\4\6\1\170\12\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\6\6\1\0\1\6\1\171\15\6\1\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\2\6\1\172\3\6"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\5\6\1\173\11\6\1\0"+
+ "\3\6\1\0\1\61\1\6\1\72\6\6\1\0\2\6"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\6\6\1\0\3\6\1\174"+
+ "\13\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\2\6\1\175\3\6\1\0\17\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\176"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\1\6\1\177\4\6\1\0\17\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\3\6"+
+ "\1\200\2\6\1\0\17\6\1\0\1\6\1\201\1\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\1\6\1\202"+
+ "\4\6\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+ "\1\0\2\6\13\0\6\6\1\0\13\6\1\203\3\6"+
+ "\1\0\3\6\1\0\1\61\7\6\1\204\1\0\2\6"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\6\6\1\0\1\75\16\6"+
+ "\1\0\3\6\1\0\1\61\1\6\1\205\6\6\1\0"+
+ "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\7\6\1\206\1\0\2\6\13\0\6\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\1\6\1\154\4\6\1\0\17\6\1\0\3\6"+
+ "\1\0\1\61\1\6\1\75\6\6\1\0\2\6\13\0"+
+ "\6\6\1\0\3\6\1\75\13\6\25\0\1\207\71\0"+
+ "\1\210\62\0\1\211\32\0\1\212\115\0\1\213\53\0"+
+ "\1\214\62\0\1\215\32\0\1\216\115\0\1\217\16\0"+
+ "\1\147\15\0\1\147\3\0\7\147\1\0\2\147\6\0"+
+ "\1\147\22\0\1\150\6\0\1\150\4\0\2\64\17\0"+
+ "\1\64\24\0\1\150\6\0\1\150\50\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\6\6"+
+ "\1\75\10\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\3\6\1\163\2\6\1\0\17\6\1\0"+
+ "\3\6\1\0\1\61\3\6\1\177\4\6\1\0\2\6"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\7\6\1\75\1\0\2\6\13\0\6\6\1\0\17\6"+
+ "\1\0\3\6\1\0\1\61\7\6\1\220\1\0\2\6"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\3\6\1\75\2\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\6\6\1\0\4\6\1\127\12\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\5\6\1\221"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\15\6\1\222\1\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+ "\1\0\14\6\1\223\2\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\1\6\1\224\4\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\1\6\1\225\6\6"+
+ "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6"+
+ "\1\0\1\61\7\6\1\226\1\0\2\6\13\0\6\6"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\1\6\1\227\15\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+ "\1\0\7\6\1\230\7\6\1\0\3\6\1\0\1\61"+
+ "\1\6\1\231\6\6\1\0\2\6\13\0\6\6\1\0"+
+ "\4\6\1\232\12\6\1\0\3\6\1\0\1\61\1\6"+
+ "\1\155\6\6\1\0\2\6\13\0\6\6\1\0\17\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\1\75\5\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\1\6\1\233\4\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\6\6\1\0\12\6\1\234\4\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+ "\12\6\1\235\4\6\1\0\3\6\1\0\1\61\7\6"+
+ "\1\236\1\0\2\6\13\0\6\6\1\0\17\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+ "\1\0\3\6\1\237\13\6\1\0\3\6\1\0\1\61"+
+ "\1\6\1\75\6\6\1\0\2\6\13\0\6\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\1\6\1\240\6\6"+
+ "\1\0\2\6\13\0\6\6\1\0\17\6\36\0\1\241"+
+ "\65\0\1\242\34\0\1\211\65\0\1\243\76\0\1\244"+
+ "\65\0\1\245\34\0\1\215\65\0\1\246\41\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+ "\5\6\1\247\11\6\1\0\3\6\1\0\1\61\10\6"+
+ "\1\0\2\6\13\0\1\6\1\75\4\6\1\0\17\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\6\6\1\0\1\6\1\250\15\6\1\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\1\6"+
+ "\1\251\15\6\1\0\3\6\1\0\1\61\7\6\1\252"+
+ "\1\0\2\6\13\0\6\6\1\0\17\6\1\0\3\6"+
+ "\1\0\1\61\7\6\1\240\1\0\2\6\13\0\6\6"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\3\6\1\75\13\6\1\0"+
+ "\3\6\1\0\1\61\1\6\1\253\6\6\1\0\2\6"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\6\6\1\0\4\6\1\254"+
+ "\12\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\5\6\1\255\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6"+
+ "\1\221\13\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\2\6\13\0\6\6\1\0\3\6\1\256\13\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\5\6"+
+ "\1\257\1\0\17\6\1\0\3\6\1\0\1\61\10\6"+
+ "\1\0\2\6\13\0\6\6\1\0\3\6\1\260\13\6"+
+ "\1\0\3\6\1\0\1\61\3\6\1\221\4\6\1\0"+
+ "\2\6\13\0\6\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\10\6\1\0\2\6\13\0\6\6\1\0\3\6"+
+ "\1\261\13\6\1\0\3\6\1\0\1\61\10\6\1\0"+
+ "\1\6\1\75\13\0\6\6\1\0\17\6\37\0\1\211"+
+ "\2\0\1\242\46\0\1\262\33\0\3\243\1\263\11\243"+
+ "\1\263\2\243\2\263\4\0\1\243\1\263\2\0\1\263"+
+ "\6\243\1\263\17\243\37\0\1\215\2\0\1\245\46\0"+
+ "\1\264\33\0\3\246\1\265\11\246\1\265\2\246\2\265"+
+ "\4\0\1\246\1\265\2\0\1\265\6\246\1\265\17\246"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\1\6\1\163"+
+ "\13\0\6\6\1\0\17\6\1\0\3\6\1\0\1\61"+
+ "\10\6\1\0\2\6\13\0\6\6\1\0\16\6\1\155"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\1\6\1\155\4\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\3\6\1\266\4\6\1\0\2\6\13\0\6\6"+
+ "\1\0\17\6\1\0\3\6\1\0\1\61\1\6\1\152"+
+ "\6\6\1\0\2\6\13\0\6\6\1\0\17\6\1\0"+
+ "\3\6\1\0\1\61\10\6\1\0\2\6\13\0\6\6"+
+ "\1\0\10\6\1\155\6\6\1\0\3\6\1\0\1\61"+
+ "\3\6\1\165\4\6\1\0\2\6\13\0\6\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\2\6"+
+ "\13\0\6\6\1\0\1\6\1\236\15\6\1\0\3\6"+
+ "\1\0\1\61\10\6\1\0\2\6\13\0\6\6\1\0"+
+ "\3\6\1\267\13\6\1\0\3\6\1\0\1\61\10\6"+
+ "\1\0\2\6\13\0\6\6\1\0\5\6\1\75\11\6"+
+ "\1\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\5\6\1\270\1\0\17\6\27\0\1\243\61\0\1\246"+
+ "\33\0\3\6\1\0\1\61\10\6\1\0\2\6\13\0"+
+ "\1\6\1\225\4\6\1\0\17\6\1\0\3\6\1\0"+
+ "\1\61\7\6\1\163\1\0\2\6\13\0\6\6\1\0"+
+ "\17\6\1\0\3\6\1\0\1\61\10\6\1\0\1\6"+
+ "\1\155\13\0\6\6\1\0\17\6";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[8200];
+ 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 =
+ "\1\0\1\1\2\0\1\11\2\1\1\11\7\1\1\11"+
+ "\23\1\1\11\2\1\1\11\5\1\1\11\4\1\1\11"+
+ "\1\0\1\11\4\1\1\0\4\1\1\11\5\1\2\11"+
+ "\26\1\1\11\1\0\1\11\10\0\2\1\1\0\6\1"+
+ "\3\11\24\1\1\11\10\0\21\1\2\0\1\1\2\0"+
+ "\14\1\4\0\3\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[184];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public ScalaTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ state = MULTILINE_STRING_DOUBLE;
+ break;
+ case Token.COMMENT_MULTILINE:
+ state = MLC;
+ break;
+ default:
+ state = YYINITIAL;
+ }
+
+ s = text;
+ start = text.offset;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public ScalaTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public ScalaTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 150) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 6:
+ { addNullToken(); return firstToken;
+ }
+ case 26: break;
+ case 15:
+ { addToken(Token.LITERAL_CHAR);
+ }
+ case 27: break;
+ case 21:
+ { start = zzMarkedPos-3; yybegin(MULTILINE_STRING_DOUBLE);
+ }
+ case 28: break;
+ case 19:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE);
+ }
+ case 29: break;
+ case 18:
+ { start = zzMarkedPos-2; yybegin(MLC);
+ }
+ case 30: break;
+ case 8:
+ { addToken(Token.WHITESPACE);
+ }
+ case 31: break;
+ case 20:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 32: break;
+ case 13:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 33: break;
+ case 14:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 34: break;
+ case 4:
+ { addToken(Token.SEPARATOR);
+ }
+ case 35: break;
+ case 22:
+ { addToken(Token.LITERAL_BACKQUOTE);
+ }
+ case 36: break;
+ case 9:
+ { /* Skip escaped chars, handles case: '\"""'. */
+ }
+ case 37: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 38: break;
+ case 12:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 39: break;
+ case 17:
+ { start = zzMarkedPos-2; yybegin(EOL_COMMENT);
+ }
+ case 40: break;
+ case 23:
+ { addToken(start,zzStartRead+2, Token.LITERAL_STRING_DOUBLE_QUOTE); yybegin(YYINITIAL);
+ }
+ case 41: break;
+ case 5:
+ { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken;
+ }
+ case 42: break;
+ case 7:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 43: break;
+ case 16:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 44: break;
+ case 10:
+ { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 45: break;
+ case 25:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 46: break;
+ case 24:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos;
+ }
+ case 47: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 48: break;
+ case 1:
+ {
+ }
+ case 49: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 50: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 185: break;
+ case MULTILINE_STRING_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken;
+ }
+ case 186: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 187: break;
+ case MLC: {
+ addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken;
+ }
+ case 188: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex
new file mode 100644
index 0000000..811a857
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.flex
@@ -0,0 +1,404 @@
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated TclTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class TclTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public TclTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({Letter}|"_"|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+
+LineCommentBegin = "#"
+
+IntegerHelper1 = (({NonzeroDigit}{Digit}*)|"0")
+IntegerHelper2 = ("0"(([xX]{HexDigit}+)|({OctalDigit}*)))
+IntegerLiteral = ({IntegerHelper1}[lL]?)
+HexLiteral = ({IntegerHelper2}[lL]?)
+FloatHelper1 = ([fFdD]?)
+FloatHelper2 = ([eE][+-]?{Digit}+{FloatHelper1})
+FloatLiteral1 = ({Digit}+"."({FloatHelper1}|{FloatHelper2}|{Digit}+({FloatHelper1}|{FloatHelper2})))
+FloatLiteral2 = ("."{Digit}+({FloatHelper1}|{FloatHelper2}))
+FloatLiteral3 = ({Digit}+{FloatHelper2})
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3}|({Digit}+[fFdD]))
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+Operator = ("="|"!"|"+"|"-"|"*"|"/"|">"=?|"<"=?|"%"|"&"|"|"|"^"|"~")
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+
+%%
+
+/* Keywords */
+<YYINITIAL> "append" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "array" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "auto_mkindex" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "concat" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "console" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eval" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "expr" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "format" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "global" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "set" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "trace" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unset" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "upvar" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "join" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lappend" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lindex" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "linsert" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "list" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "llength" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lrange" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lreplace" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsearch" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lsort" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "split" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scan" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "string" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regexp" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "regsub" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "elseif" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "switch" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "foreach" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "continue" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "proc" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "source" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "unkown" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "uplevel" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cd" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "close" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "eof" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "file" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "flush" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "gets" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "glob" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "open" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "read" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "puts" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pwd" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "seek" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tell" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "catch" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "error" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exec" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pid" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "after" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "time" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "exit" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "history" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "rename" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "info" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "ceil" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "floor" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "round" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "incr" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "abs" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "acos" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cos" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "cosh" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "asin" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sin" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sinh" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "atan2" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tan" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tanh" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "log10" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "fmod" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pow" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "hypot" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "sqrt" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "double" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "int" { addToken(Token.RESERVED_WORD); }
+
+<YYINITIAL> "bind" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "button" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "canvas" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "checkbutton" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "destroy" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "entry" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "focus" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "frame" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "grab" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "image" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "label" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "listbox" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "lower" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menu" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "menubutton" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "message" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "option" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "pack" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "placer" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "radiobutton" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "raise" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scale" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "scrollbar" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "selection" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "send" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "text" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tk" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkerror" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "tkwait" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "toplevel" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "update" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "winfo" { addToken(Token.RESERVED_WORD); }
+<YYINITIAL> "wm" { addToken(Token.RESERVED_WORD); }
+
+
+<YYINITIAL> {
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+ /* Comment literals. */
+ {LineCommentBegin}.* { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
+
+ /* Separators. */
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+ {Operator} { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters and flag them as bad. */
+ . { addToken(Token.ERROR_IDENTIFIER); }
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java
new file mode 100644
index 0000000..7053bc2
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/TclTokenMaker.java
@@ -0,0 +1,1075 @@
+/* The following code was generated by JFlex 1.4.1 on 10/10/10 10:56 PM */
+
+/*
+ * 10/03/2007
+ *
+ * TclTokenMaker.java - Scanner for the Tcl programming language.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for the Tcl programming language.<p>
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated TclTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class TclTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\14\1\13\1\0\1\14\1\7\22\0\1\14\1\27\1\15"+
+ "\1\10\1\1\1\27\1\27\1\7\2\24\1\27\1\22\1\25\1\22"+
+ "\1\23\1\27\1\3\1\61\1\60\5\5\2\2\1\7\1\25\1\30"+
+ "\1\26\1\30\1\7\1\0\3\4\1\20\1\21\1\20\5\1\1\17"+
+ "\13\1\1\16\2\1\1\24\1\11\1\24\1\27\1\12\1\0\1\31"+
+ "\1\54\1\46\1\35\1\33\1\52\1\53\1\56\1\44\1\55\1\43"+
+ "\1\50\1\42\1\34\1\41\1\32\1\62\1\36\1\47\1\40\1\6"+
+ "\1\51\1\57\1\45\1\37\1\1\1\24\1\27\1\24\1\27\uff81\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 =
+ "\1\0\1\1\1\2\2\3\1\2\1\1\1\4\1\5"+
+ "\1\6\1\7\1\10\1\2\1\11\1\2\1\10\22\2"+
+ "\1\1\1\12\1\3\1\13\1\12\1\13\1\12\1\14"+
+ "\1\12\2\2\1\7\1\15\35\2\1\16\5\2\1\16"+
+ "\40\2\1\1\1\13\1\0\2\14\5\2\1\15\25\2"+
+ "\1\16\30\2\1\16\4\2\1\16\11\2\1\1\5\2"+
+ "\2\16\6\2\1\16\15\2\1\16\3\2\1\16\1\2"+
+ "\1\1\14\2\1\1\6\2";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[241];
+ 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\63\0\146\0\231\0\314\0\377\0\u0132\0\u0165"+
+ "\0\u0132\0\u0198\0\u01cb\0\u0132\0\u01fe\0\u0132\0\u0132\0\u0231"+
+ "\0\u0264\0\u0297\0\u02ca\0\u02fd\0\u0330\0\u0363\0\u0396\0\u03c9"+
+ "\0\u03fc\0\u042f\0\u0462\0\u0495\0\u04c8\0\u04fb\0\u052e\0\u0561"+
+ "\0\u0594\0\u05c7\0\u05fa\0\u062d\0\u062d\0\u062d\0\u0660\0\u0693"+
+ "\0\u06c6\0\u06f9\0\u072c\0\u075f\0\u0792\0\u07c5\0\u0132\0\u07f8"+
+ "\0\u082b\0\u085e\0\u0891\0\u08c4\0\u08f7\0\u092a\0\u095d\0\u0990"+
+ "\0\u09c3\0\u09f6\0\u0a29\0\u0a5c\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28"+
+ "\0\u0b5b\0\u0b8e\0\u0bc1\0\u0bf4\0\u0c27\0\u0c5a\0\u0c8d\0\u0cc0"+
+ "\0\u0cf3\0\u0d26\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+
+ "\0\u0e8b\0\u0ebe\0\146\0\u0ef1\0\u0f24\0\u0f57\0\u0f8a\0\u0fbd"+
+ "\0\u0ff0\0\u1023\0\u1056\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155"+
+ "\0\u1188\0\u11bb\0\u11ee\0\u1221\0\u1254\0\u1287\0\u12ba\0\u12ed"+
+ "\0\u1320\0\u1353\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u1452\0\u1485"+
+ "\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u1584\0\u15b7\0\u062d\0\u15ea"+
+ "\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9\0\u01cb\0\u171c\0\u174f"+
+ "\0\u1782\0\u17b5\0\u17e8\0\u181b\0\u184e\0\u1881\0\u18b4\0\u18e7"+
+ "\0\u191a\0\u194d\0\u1980\0\u19b3\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f"+
+ "\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17"+
+ "\0\u1c4a\0\u1c7d\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf"+
+ "\0\u1de2\0\u1e15\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1\0\u1f14\0\u1f47"+
+ "\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079\0\u20ac\0\u20df"+
+ "\0\u2112\0\u2145\0\u2178\0\u21ab\0\u21de\0\u2211\0\u2244\0\u2277"+
+ "\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376\0\u23a9\0\u23dc\0\u240f"+
+ "\0\u2442\0\u2475\0\u24a8\0\u24db\0\u250e\0\u2541\0\u2574\0\u25a7"+
+ "\0\u25da\0\u260d\0\u2640\0\u1b4b\0\u2673\0\u26a6\0\u26d9\0\u270c"+
+ "\0\u273f\0\u2772\0\u27a5\0\u27d8\0\u280b\0\u283e\0\u2871\0\u28a4"+
+ "\0\u28d7\0\u290a\0\u293d\0\u0bc1\0\u2970\0\u29a3\0\u29d6\0\u2a09"+
+ "\0\u260d\0\u2a3c\0\u2a6f\0\u2aa2\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e"+
+ "\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a\0\u2c6d\0\u2ca0\0\u2cd3\0\u2d06"+
+ "\0\u2d39";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[241];
+ 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 =
+ "\1\2\1\3\1\4\1\5\1\3\1\4\1\6\1\7"+
+ "\1\10\1\2\1\3\1\11\1\12\1\13\4\3\1\14"+
+ "\1\15\1\16\1\17\2\14\1\20\1\21\1\22\1\23"+
+ "\1\3\1\24\1\25\1\3\1\26\1\27\1\30\1\3"+
+ "\1\31\1\3\1\32\1\33\1\34\1\3\1\35\1\36"+
+ "\1\37\1\40\1\41\1\42\2\4\1\3\7\2\1\0"+
+ "\3\2\3\0\4\2\7\0\33\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\32\3\2\44\2\4"+
+ "\1\44\1\4\1\44\1\0\3\44\3\0\1\44\1\45"+
+ "\1\46\1\47\1\0\1\50\5\0\2\44\1\47\1\44"+
+ "\1\46\12\44\1\45\1\44\1\46\5\44\2\4\3\44"+
+ "\1\51\1\52\1\44\1\52\1\44\1\0\3\44\3\0"+
+ "\1\53\1\45\1\46\1\47\1\0\1\50\5\0\2\44"+
+ "\1\47\1\44\1\46\7\44\1\53\2\44\1\45\1\44"+
+ "\1\46\5\44\2\52\1\44\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\3\1\54\1\3"+
+ "\1\55\26\3\63\0\13\10\1\0\47\10\14\0\1\12"+
+ "\46\0\11\13\1\56\3\13\1\57\45\13\2\0\2\50"+
+ "\1\0\1\50\52\0\2\50\27\0\1\14\34\0\1\2"+
+ "\5\3\1\60\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\1\3\1\61\3\3\1\62\1\3\1\63\5\3"+
+ "\1\64\1\65\2\3\1\66\1\3\1\67\6\3\1\2"+
+ "\5\3\1\70\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\1\71\4\3\1\72\2\3\1\73\2\3\1\74"+
+ "\3\3\1\75\6\3\1\74\3\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\76"+
+ "\1\3\1\77\2\3\1\100\3\3\1\101\2\3\1\102"+
+ "\1\103\11\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\2\3\1\104\5\3\1\105\21\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\1\106\1\3\1\107\5\3\1\110\21\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\1\111\1\3\1\112\2\3\1\113\2\3\1\114\1\3"+
+ "\1\115\1\116\16\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\3\1\117\30\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\2\3\1\120\27\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\3\3\1\121\5\3\1\122"+
+ "\7\3\1\123\10\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\124\1\3\1\125\1\3"+
+ "\1\123\3\3\1\126\6\3\1\127\5\3\1\130\4\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\1\3\1\131\1\132\4\3\1\133\1\134\2\3"+
+ "\1\111\1\3\1\135\10\3\1\136\2\3\1\137\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\1\140\4\3\1\141\2\3\1\142\2\3\1\143\2\3"+
+ "\1\144\1\145\12\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\5\3\1\146\2\3\1\147"+
+ "\1\150\1\3\1\151\3\3\1\152\12\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+ "\1\70\2\3\1\153\11\3\1\154\12\3\1\2\5\3"+
+ "\1\155\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\156\5\3\1\157\16\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\65"+
+ "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\6\3\1\160\4\3\1\161\16\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\11\3\1\123\1\3\1\162\11\3\1\163\4\3\6\2"+
+ "\1\164\1\0\3\2\3\0\4\2\7\0\32\2\7\44"+
+ "\1\0\3\44\3\0\4\44\7\0\34\44\2\165\1\44"+
+ "\1\165\1\44\1\0\3\44\3\0\4\44\1\166\6\0"+
+ "\27\44\2\165\3\44\2\50\1\44\1\50\1\44\1\0"+
+ "\3\44\3\0\2\44\1\46\1\47\7\0\2\44\1\47"+
+ "\1\44\1\46\14\44\1\46\5\44\2\50\3\44\2\51"+
+ "\1\44\1\51\1\44\1\0\3\44\3\0\2\44\1\46"+
+ "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+ "\14\44\1\46\5\44\2\51\3\44\1\51\1\52\1\44"+
+ "\1\52\1\44\1\0\3\44\3\0\1\44\1\167\1\46"+
+ "\1\47\1\0\1\50\5\0\2\44\1\47\1\44\1\46"+
+ "\12\44\1\167\1\44\1\46\5\44\2\52\3\44\4\170"+
+ "\1\44\1\0\3\44\3\0\2\44\2\170\7\0\1\170"+
+ "\1\44\1\170\1\44\1\170\10\44\1\170\3\44\1\170"+
+ "\1\44\1\170\3\44\2\170\1\44\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\4\3\1\171"+
+ "\12\3\1\172\1\173\11\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\12\3\1\174\3\3"+
+ "\1\175\13\3\13\13\1\0\1\13\1\176\45\13\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\7\3\1\177\22\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\3\1\200\30\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\201\24\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\202\31\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+ "\1\67\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\13\3\1\203\16\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+ "\1\204\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\16\3\1\123\13\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\7\3"+
+ "\1\67\22\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\15\3\1\205\14\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+ "\1\206\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\26\3\1\123\3\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+ "\1\123\25\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\1\207\31\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\210"+
+ "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\5\3\1\211\24\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\21\3\1\123"+
+ "\10\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\1\3\1\212\1\206\10\3\1\213\16\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\16\3\1\214\13\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\215\31\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\16\3\1\216\13\3\1\2\5\3\1\217\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\4\3"+
+ "\1\220\6\3\1\221\16\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\74\2\3\1\146"+
+ "\3\3\1\222\12\3\1\223\7\3\1\2\5\3\1\157"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\3\3\1\224\26\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\14\3\1\213\2\3"+
+ "\1\215\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\1\225\31\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\226"+
+ "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\2\3\1\227\23\3\1\230\3\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\11\3\1\231\20\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\2\3\1\203\4\3\1\232"+
+ "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\3\3\1\233\12\3\1\234\13\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\7\3\1\123\5\3\1\212\3\3\1\235\10\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\1\236\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\3\3\1\237\3\3\1\240\22\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\13\3\1\215\16\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\3\3\1\241\12\3"+
+ "\1\224\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\10\3\1\221\21\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+ "\1\242\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\17\3\1\243\12\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+ "\1\205\1\74\3\3\1\123\7\3\1\244\12\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\245\24\3\1\2\5\3\1\246\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\32\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\247"+
+ "\4\3\1\250\24\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\13\3\1\251\16\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\213\24\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\3\1\61\21\3\1\252"+
+ "\6\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\1\253\1\3\1\254\27\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\22\3"+
+ "\1\255\3\3\1\204\3\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\3\3\1\256\12\3"+
+ "\1\257\13\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\2\3\1\260\5\3\1\137\21\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\2\3\1\261\27\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\116\31\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\262\7\3\1\263\14\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\74"+
+ "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\17\3\1\231\12\3\1\2\5\3\1\264"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+ "\1\211\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\1\265\31\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\266"+
+ "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\7\3\1\267\22\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\270"+
+ "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\3\3\1\74\26\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\1\3\1\271"+
+ "\30\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\16\3\1\272\13\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\273"+
+ "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\13\3\1\151\16\3\2\2\4\274\1\2"+
+ "\1\0\3\2\3\0\2\2\2\274\7\0\1\274\1\2"+
+ "\1\274\1\2\1\274\10\2\1\274\3\2\1\274\1\2"+
+ "\1\274\3\2\2\274\1\2\2\44\2\165\1\44\1\165"+
+ "\1\44\1\0\3\44\3\0\2\44\1\46\1\44\7\0"+
+ "\4\44\1\46\14\44\1\46\5\44\2\165\1\44\2\0"+
+ "\2\165\1\0\1\165\52\0\2\165\1\0\2\44\4\170"+
+ "\1\44\1\0\3\44\3\0\1\44\1\167\2\170\7\0"+
+ "\1\170\1\44\1\170\1\44\1\170\10\44\1\170\1\44"+
+ "\1\167\1\44\1\170\1\44\1\170\3\44\2\170\1\44"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\1\275\31\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\2\3\1\276\27\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\1\212\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\10\3\1\277\21\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+ "\1\213\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\10\3\1\300\21\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\2\3"+
+ "\1\157\27\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\1\301\31\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\302"+
+ "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\3\3\1\123\26\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\212"+
+ "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\12\3\1\123\17\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\15\3\1\123"+
+ "\14\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\15\3\1\204\14\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\301"+
+ "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\10\3\1\212\21\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\5\3\1\123"+
+ "\24\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\7\3\1\123\22\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\2\3\1\303"+
+ "\27\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\17\3\1\123\12\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\304"+
+ "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\23\3\1\151\6\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\305"+
+ "\16\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\16\3\1\231\13\3\1\2\5\3\1\306"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\32\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\2\3\1\307\13\3\1\310\13\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\25\3"+
+ "\1\123\4\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\15\3\1\231\14\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\17\3"+
+ "\1\172\12\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\5\3\1\77\24\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\1\243"+
+ "\31\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\2\3\1\123\27\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\13\3\1\311"+
+ "\16\3\1\2\5\3\1\312\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\16\3\1\122\13\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\10\3\1\123\21\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\22\3\1\231\7\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\20\3\1\313\11\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\15\3\1\314\14\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\7\3\1\315\5\3\1\316\1\317\13\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\15\3\1\320\14\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\13\3\1\213\16\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\2\3\1\321\27\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\13\3\1\322\16\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\225\24\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\3\3\1\123\13\3\1\231"+
+ "\12\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\10\3\1\323\21\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\7\3\1\240"+
+ "\22\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\2\3\1\215\27\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\3\3\1\236"+
+ "\26\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\1\3\1\324\30\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\30\3\1\325"+
+ "\1\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\4\3\1\326\11\3\1\327\13\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\7\3\1\330\22\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\331\31\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\3\3"+
+ "\1\332\26\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\2\3\1\333\6\3\1\316\20\3"+
+ "\1\2\5\3\1\67\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\16\3\1\314\13\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\23\3\1\123\6\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\23\3\1\334\6\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\7\3\1\311\22\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\1\205\31\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+ "\1\213\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\7\3\1\335\22\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\21\3"+
+ "\1\235\10\3\2\2\4\336\1\2\1\0\3\2\3\0"+
+ "\2\2\2\336\7\0\1\336\1\2\1\336\1\2\1\336"+
+ "\10\2\1\336\3\2\1\336\1\2\1\336\3\2\2\336"+
+ "\2\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\7\3\1\231\22\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\20\3\1\252\11\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\26\3\1\203\3\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\337\3\0\4\3\7\0\32\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\6\3"+
+ "\1\123\23\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\27\3\1\123\2\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\13\3"+
+ "\1\100\16\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\5\3\1\340\24\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\10\3"+
+ "\1\341\21\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\5\3\1\203\24\3\1\2\6\3"+
+ "\1\0\1\2\1\43\1\3\3\0\4\3\7\0\14\3"+
+ "\1\342\15\3\1\2\5\3\1\265\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\32\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\10\3\1\203"+
+ "\21\3\1\2\6\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\23\3\1\343\6\3\1\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\1\67\31\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\13\3\1\344\16\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\213\31\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\10\3\1\151\21\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\12\3\1\341\17\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\15\3\1\345\14\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\3\3\1\346\26\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\17\3\1\347\12\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\17\3\1\113\12\3\1\2"+
+ "\2\3\1\123\3\3\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\2\3\1\350\27\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\2\3\1\137\27\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\23\3\1\351\6\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\5\3\1\240\24\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\22\3\1\352\7\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\1\240\31\3\1\2\6\3\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\10\3\1\210\21\3\2\2\4\353"+
+ "\1\2\1\0\3\2\3\0\2\2\2\353\7\0\1\353"+
+ "\1\2\1\353\1\2\1\353\10\2\1\353\3\2\1\353"+
+ "\1\2\1\353\3\2\2\353\2\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\11\3\1\354\20\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\10\3\1\301\21\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\1\3\1\123\30\3"+
+ "\1\2\5\3\1\155\1\0\1\2\1\43\1\3\3\0"+
+ "\4\3\7\0\32\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\3\3\1\355\26\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\7\3\1\232\22\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\22\3\1\123\7\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\17\3\1\356\12\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\14\3\1\123\15\3\1\2"+
+ "\6\3\1\0\1\2\1\43\1\3\3\0\4\3\7\0"+
+ "\10\3\1\350\21\3\1\2\6\3\1\0\1\2\1\43"+
+ "\1\3\3\0\4\3\7\0\7\3\1\314\22\3\2\2"+
+ "\4\3\1\2\1\0\3\2\3\0\2\2\2\3\7\0"+
+ "\1\3\1\2\1\3\1\2\1\3\10\2\1\3\3\2"+
+ "\1\3\1\2\1\3\3\2\2\3\2\2\6\3\1\0"+
+ "\1\2\1\43\1\3\3\0\4\3\7\0\12\3\1\357"+
+ "\17\3\1\2\5\3\1\231\1\0\1\2\1\43\1\3"+
+ "\3\0\4\3\7\0\32\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\23\3\1\173\6\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\13\3\1\360\16\3\1\2\6\3\1\0\1\2"+
+ "\1\43\1\3\3\0\4\3\7\0\3\3\1\361\26\3"+
+ "\1\2\6\3\1\0\1\2\1\43\1\3\3\0\4\3"+
+ "\7\0\4\3\1\326\25\3";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[11628];
+ 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 =
+ "\1\0\5\1\1\11\1\1\1\11\2\1\1\11\1\1"+
+ "\2\11\37\1\1\11\106\1\1\0\173\1";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[241];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public TclTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "//", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ * @exception IOException if any I/O-Error occurs.
+ */
+ private boolean zzRefill() throws java.io.IOException {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) throws java.io.IOException {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public TclTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public TclTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 160) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 15: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 16: break;
+ case 13:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 17: break;
+ case 11:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 18: break;
+ case 4:
+ { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 19: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 20: break;
+ case 10:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 21: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 22: break;
+ case 12:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 23: break;
+ case 8:
+ { addToken(Token.OPERATOR);
+ }
+ case 24: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 25: break;
+ case 7:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 26: break;
+ case 5:
+ { addNullToken(); return firstToken;
+ }
+ case 27: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 28: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 242: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java
new file mode 100644
index 0000000..f226530
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java
@@ -0,0 +1,1113 @@
+/*
+ * 03/16/2004
+ *
+ * UnixShellTokenMaker.java - Scanner for UNIX shell scripts.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of <code>Token</code>s
+ * for syntax highlighting UNIX shell scripts.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class UnixShellTokenMaker extends AbstractTokenMaker {
+
+ protected final String operators = "=|><&";
+ protected final String separators = "()[]";
+ protected final String separators2 = ".,;"; // Characters you don't want syntax highlighted but separate identifiers.
+ protected final String shellVariables = "#-?$!*@_"; // Characters that are part of "$<char>" shell variables; e.g., "$_".
+
+
+ private int currentTokenStart;
+ private int currentTokenType;
+
+
+ /**
+ * Constructor.
+ */
+ public UnixShellTokenMaker() {
+ super(); // Initializes tokensToHighlight.
+ }
+
+
+ /**
+ * Checks the token to give it the exact ID it deserves before
+ * being passed up to the super method.
+ *
+ * @param segment <code>Segment</code> to get text from.
+ * @param start Start offset in <code>segment</code> of token.
+ * @param end End offset in <code>segment</code> of token.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which the token occurs.
+ */
+ public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+ switch (tokenType) {
+ // Since reserved words, functions, and data types are all passed into here
+ // as "identifiers," we have to see what the token really is...
+ case Token.IDENTIFIER:
+ int value = wordsToHighlight.get(segment, start,end);
+ if (value!=-1)
+ tokenType = value;
+ break;
+ case Token.WHITESPACE:
+ case Token.SEPARATOR:
+ case Token.OPERATOR:
+ case Token.LITERAL_NUMBER_DECIMAL_INT:
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ case Token.LITERAL_CHAR:
+ case Token.LITERAL_BACKQUOTE:
+ case Token.COMMENT_EOL:
+ case Token.PREPROCESSOR:
+ case Token.VARIABLE:
+ break;
+
+ default:
+ new Exception("Unknown tokenType: '" + tokenType + "'").
+ printStackTrace();
+ tokenType = Token.IDENTIFIER;
+ break;
+
+ }
+
+ super.addToken(segment, start, end, tokenType, startOffset);
+
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the words to highlight for UNIX shell scripts.
+ *
+ * @return A <code>TokenMap</code> containing the words to highlight for
+ * UNIX shell scripts.
+ * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+ */
+ public TokenMap getWordsToHighlight() {
+
+ TokenMap tokenMap = new TokenMap();
+
+ int reservedWord = Token.RESERVED_WORD;
+ tokenMap.put("case", reservedWord);
+ tokenMap.put("do", reservedWord);
+ tokenMap.put("done", reservedWord);
+ tokenMap.put("elif", reservedWord);
+ tokenMap.put("else", reservedWord);
+ tokenMap.put("esac", reservedWord);
+ tokenMap.put("fi", reservedWord);
+ tokenMap.put("for", reservedWord);
+ tokenMap.put("if", reservedWord);
+ tokenMap.put("in", reservedWord);
+ tokenMap.put("select", reservedWord);
+ tokenMap.put("then", reservedWord);
+ tokenMap.put("until", reservedWord);
+ tokenMap.put("while", reservedWord);
+
+ int function = Token.FUNCTION;
+ tokenMap.put("addbib", function);
+ tokenMap.put("admin", function);
+ tokenMap.put("alias", function);
+ tokenMap.put("apropos", function);
+ tokenMap.put("ar", function);
+ tokenMap.put("at", function);
+ tokenMap.put("awk", function);
+ tokenMap.put("banner", function);
+ tokenMap.put("basename", function);
+ tokenMap.put("batch", function);
+ tokenMap.put("bg", function);
+ tokenMap.put("biff", function);
+ tokenMap.put("bin-mail", function);
+ tokenMap.put("binmail", function);
+ tokenMap.put("break", function);
+ tokenMap.put("cal", function);
+ tokenMap.put("calendar", function);
+ tokenMap.put("cancel", function);
+ tokenMap.put("cat", function);
+ tokenMap.put("cb", function);
+ tokenMap.put("cc", function);
+ tokenMap.put("cd", function);
+ tokenMap.put("cdc", function);
+ tokenMap.put("chdir", function);
+ tokenMap.put("checkeq", function);
+ tokenMap.put("checknr", function);
+ tokenMap.put("chfn", function);
+ tokenMap.put("chgrp", function);
+ tokenMap.put("chmod", function);
+ tokenMap.put("chown", function);
+ tokenMap.put("chsh", function);
+ tokenMap.put("clear", function);
+ tokenMap.put("cmp", function);
+ tokenMap.put("colcrt", function);
+ tokenMap.put("comb", function);
+ tokenMap.put("comm", function);
+ tokenMap.put("command", function);
+ tokenMap.put("compress", function);
+ tokenMap.put("continue", function);
+ tokenMap.put("cp", function);
+ tokenMap.put("cpio", function);
+ tokenMap.put("cpp", function);
+ tokenMap.put("crontab", function);
+ tokenMap.put("csh", function);
+ tokenMap.put("ctags", function);
+ tokenMap.put("cut", function);
+ tokenMap.put("cvs", function);
+ tokenMap.put("date", function);
+ tokenMap.put("dbx", function);
+ tokenMap.put("delta", function);
+ tokenMap.put("deroff", function);
+ tokenMap.put("df", function);
+ tokenMap.put("diff", function);
+ tokenMap.put("dtree", function);
+ tokenMap.put("du", function);
+ tokenMap.put("e", function);
+ tokenMap.put("echo", function);
+ tokenMap.put("ed", function);
+ tokenMap.put("edit", function);
+ tokenMap.put("enscript", function);
+ tokenMap.put("eqn", function);
+ tokenMap.put("error", function);
+ tokenMap.put("eval", function);
+ tokenMap.put("ex", function);
+ tokenMap.put("exec", function);
+ tokenMap.put("exit", function);
+ tokenMap.put("expand", function);
+ tokenMap.put("export", function);
+ tokenMap.put("expr", function);
+ tokenMap.put("false", function);
+ tokenMap.put("fc", function);
+ tokenMap.put("fg", function);
+ tokenMap.put("file", function);
+ tokenMap.put("find", function);
+ tokenMap.put("finger", function);
+ tokenMap.put("fmt", function);
+ tokenMap.put("fmt_mail", function);
+ tokenMap.put("fold", function);
+ tokenMap.put("ftp", function);
+ tokenMap.put("function", function);
+ tokenMap.put("gcore", function);
+ tokenMap.put("get", function);
+ tokenMap.put("getopts", function);
+ tokenMap.put("gprof", function);
+ tokenMap.put("grep", function);
+ tokenMap.put("groups", function);
+ tokenMap.put("gunzip", function);
+ tokenMap.put("gzip", function);
+ tokenMap.put("hashcheck", function);
+ tokenMap.put("hashmake", function);
+ tokenMap.put("head", function);
+ tokenMap.put("help", function);
+ tokenMap.put("history", function);
+ tokenMap.put("imake", function);
+ tokenMap.put("indent", function);
+ tokenMap.put("install", function);
+ tokenMap.put("jobs", function);
+ tokenMap.put("join", function);
+ tokenMap.put("kill", function);
+ tokenMap.put("last", function);
+ tokenMap.put("ld", function);
+ tokenMap.put("leave", function);
+ tokenMap.put("less", function);
+ tokenMap.put("let", function);
+ tokenMap.put("lex", function);
+ tokenMap.put("lint", function);
+ tokenMap.put("ln", function);
+ tokenMap.put("login", function);
+ tokenMap.put("look", function);
+ tokenMap.put("lookbib", function);
+ tokenMap.put("lorder", function);
+ tokenMap.put("lp", function);
+ tokenMap.put("lpq", function);
+ tokenMap.put("lpr", function);
+ tokenMap.put("lprm", function);
+ tokenMap.put("ls", function);
+ tokenMap.put("mail", function);
+ tokenMap.put("Mail", function);
+ tokenMap.put("make", function);
+ tokenMap.put("man", function);
+ tokenMap.put("md", function);
+ tokenMap.put("mesg", function);
+ tokenMap.put("mkdir", function);
+ tokenMap.put("mkstr", function);
+ tokenMap.put("more", function);
+ tokenMap.put("mount", function);
+ tokenMap.put("mv", function);
+ tokenMap.put("nawk", function);
+ tokenMap.put("neqn", function);
+ tokenMap.put("nice", function);
+ tokenMap.put("nm", function);
+ tokenMap.put("nroff", function);
+ tokenMap.put("od", function);
+ tokenMap.put("page", function);
+ tokenMap.put("passwd", function);
+ tokenMap.put("paste", function);
+ tokenMap.put("pr", function);
+ tokenMap.put("print", function);
+ tokenMap.put("printf", function);
+ tokenMap.put("printenv", function);
+ tokenMap.put("prof", function);
+ tokenMap.put("prs", function);
+ tokenMap.put("prt", function);
+ tokenMap.put("ps", function);
+ tokenMap.put("ptx", function);
+ tokenMap.put("pwd", function);
+ tokenMap.put("quota", function);
+ tokenMap.put("ranlib", function);
+ tokenMap.put("rcp", function);
+ tokenMap.put("rcs", function);
+ tokenMap.put("rcsdiff", function);
+ tokenMap.put("read", function);
+ tokenMap.put("readonly", function);
+ tokenMap.put("red", function);
+ tokenMap.put("return", function);
+ tokenMap.put("rev", function);
+ tokenMap.put("rlogin", function);
+ tokenMap.put("rm", function);
+ tokenMap.put("rmdel", function);
+ tokenMap.put("rmdir", function);
+ tokenMap.put("roffbib", function);
+ tokenMap.put("rsh", function);
+ tokenMap.put("rup", function);
+ tokenMap.put("ruptime", function);
+ tokenMap.put("rusers", function);
+ tokenMap.put("rwall", function);
+ tokenMap.put("rwho", function);
+ tokenMap.put("sact", function);
+ tokenMap.put("sccs", function);
+ tokenMap.put("sccsdiff", function);
+ tokenMap.put("script", function);
+ tokenMap.put("sed", function);
+ tokenMap.put("set", function);
+ tokenMap.put("setgroups", function);
+ tokenMap.put("setsenv", function);
+ tokenMap.put("sh", function);
+ tokenMap.put("shift", function);
+ tokenMap.put("size", function);
+ tokenMap.put("sleep", function);
+ tokenMap.put("sort", function);
+ tokenMap.put("sortbib", function);
+ tokenMap.put("spell", function);
+ tokenMap.put("split", function);
+ tokenMap.put("ssh", function);
+ tokenMap.put("strings", function);
+ tokenMap.put("strip", function);
+ tokenMap.put("stty", function);
+ tokenMap.put("su", function);
+ tokenMap.put("sudo", function);
+ tokenMap.put("symorder", function);
+ tokenMap.put("tabs", function);
+ tokenMap.put("tail", function);
+ tokenMap.put("talk", function);
+ tokenMap.put("tar", function);
+ tokenMap.put("tbl", function);
+ tokenMap.put("tee", function);
+ tokenMap.put("telnet", function);
+ tokenMap.put("test", function);
+ tokenMap.put("tftp", function);
+ tokenMap.put("time", function);
+ tokenMap.put("times", function);
+ tokenMap.put("touch", function);
+ tokenMap.put("trap", function);
+ tokenMap.put("troff", function);
+ tokenMap.put("true", function);
+ tokenMap.put("tsort", function);
+ tokenMap.put("tty", function);
+ tokenMap.put("type", function);
+ tokenMap.put("typeset", function);
+ tokenMap.put("ue", function);
+ tokenMap.put("ul", function);
+ tokenMap.put("ulimit", function);
+ tokenMap.put("umask", function);
+ tokenMap.put("unalias", function);
+ tokenMap.put("uncompress", function);
+ tokenMap.put("unexpand", function);
+ tokenMap.put("unget", function);
+ tokenMap.put("unifdef", function);
+ tokenMap.put("uniq", function);
+ tokenMap.put("units", function);
+ tokenMap.put("unset", function);
+ tokenMap.put("uptime", function);
+ tokenMap.put("users", function);
+ tokenMap.put("uucp", function);
+ tokenMap.put("uudecode", function);
+ tokenMap.put("uuencode", function);
+ tokenMap.put("uulog", function);
+ tokenMap.put("uuname", function);
+ tokenMap.put("uusend", function);
+ tokenMap.put("uux", function);
+ tokenMap.put("vacation", function);
+ tokenMap.put("val", function);
+ tokenMap.put("vedit", function);
+ tokenMap.put("vgrind", function);
+ tokenMap.put("vi", function);
+ tokenMap.put("view", function);
+ tokenMap.put("vtroff", function);
+ tokenMap.put("w", function);
+ tokenMap.put("wait", function);
+ tokenMap.put("wall", function);
+ tokenMap.put("wc", function);
+ tokenMap.put("wait", function);
+ tokenMap.put("what", function);
+ tokenMap.put("whatis", function);
+ tokenMap.put("whence", function);
+ tokenMap.put("whereis", function);
+ tokenMap.put("which", function);
+ tokenMap.put("who", function);
+ tokenMap.put("whoami", function);
+ tokenMap.put("write", function);
+ tokenMap.put("xargs", function);
+ tokenMap.put("xstr", function);
+ tokenMap.put("yacc", function);
+ tokenMap.put("yes", function);
+ tokenMap.put("zcat", function);
+
+ return tokenMap;
+
+ }
+
+
+ /**
+ * Returns a list of tokens representing the given text.
+ *
+ * @param text The text to break into tokens.
+ * @param startTokenType The token with which to start tokenizing.
+ * @param startOffset The offset at which the line of tokens begins.
+ * @return A linked list of tokens representing <code>text</code>.
+ */
+ public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+ resetTokenList();
+
+ char[] array = text.array;
+ int offset = text.offset;
+ int count = text.count;
+ int end = offset + count;
+
+ // See, when we find a token, its starting position is always of the form:
+ // 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+ // offset are constant, tokens' starting positions become:
+ // 'newStartOffset+currentTokenStart' for one less subraction operation.
+ int newStartOffset = startOffset - offset;
+
+ currentTokenStart = offset;
+ currentTokenType = startTokenType;
+ boolean backslash = false;
+
+//beginning:
+ for (int i=offset; i<end; i++) {
+
+ char c = array[i];
+
+ switch (currentTokenType) {
+
+ case Token.NULL:
+
+ currentTokenStart = i; // Starting a new token here.
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ currentTokenType = Token.WHITESPACE;
+ break;
+
+ case '`':
+ if (backslash) { // Escaped back quote => call '`' an identifier..
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ backslash = false;
+ }
+ else {
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ }
+ break;
+
+ case '"':
+ if (backslash) { // Escaped double quote => call '"' an identifier..
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ backslash = false;
+ }
+ else {
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ }
+ break;
+
+ case '\'':
+ if (backslash) { // Escaped single quote => call '\'' an identifier.
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ backslash = false;
+ }
+ else {
+ currentTokenType = Token.LITERAL_CHAR;
+ }
+ break;
+
+ case '\\':
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ backslash = !backslash;
+ break;
+
+ case '$':
+ if (backslash) { // Escaped dollar sign => call '$' an identifier..
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ backslash = false;
+ }
+ else {
+ currentTokenType = Token.VARIABLE;
+ }
+ break;
+
+ case '#':
+ backslash = false;
+ currentTokenType = Token.COMMENT_EOL;
+ break;
+
+ default:
+ if (RSyntaxUtilities.isDigit(c)) {
+ currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+ break;
+ }
+ else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+ int indexOf = operators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators2.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.WHITESPACE:
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ break; // Still whitespace.
+
+ case '\\':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ backslash = true; // Previous char whitespace => this must be first backslash.
+ break;
+
+ case '`': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ backslash = false;
+ break;
+
+ case '"': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ backslash = false;
+ break;
+
+ case '\'': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_CHAR;
+ backslash = false;
+ break;
+
+ case '$': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.VARIABLE;
+ backslash = false;
+ break;
+
+ case '#':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.COMMENT_EOL;
+ break;
+
+ default: // Add the whitespace token and start anew.
+
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+
+ if (RSyntaxUtilities.isDigit(c)) {
+ currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
+ break;
+ }
+ else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+ int indexOf = operators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators2.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenType = Token.IDENTIFIER;
+ }
+
+ } // End of switch (c).
+
+ break;
+
+ default: // Should never happen
+ case Token.IDENTIFIER:
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.WHITESPACE;
+ break;
+
+ case '/': // Special-case to colorize commands like "echo" in "/bin/echo"
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i+1;
+ currentTokenType = Token.NULL;
+ break;
+
+ case '`': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ backslash = false;
+ break;
+
+ case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ backslash = false;
+ break;
+
+ case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_CHAR;
+ backslash = false;
+ break;
+
+ case '\\':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ backslash = true;
+ break;
+
+ case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.VARIABLE;
+ backslash = false;
+ break;
+
+ case '=': // Special case here; when you have "identifier=<value>" in shell, "identifier" is a variable.
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+
+ default:
+ if (RSyntaxUtilities.isLetterOrDigit(c) || c=='/' || c=='_') {
+ break; // Still an identifier of some type.
+ }
+ int indexOf = operators.indexOf(c);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators2.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ // Otherwise, we're still an identifier (?).
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.LITERAL_NUMBER_DECIMAL_INT:
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.WHITESPACE;
+ break;
+
+ case '`': // Don't need to worry about backslashes as previous char is space.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ backslash = false;
+ break;
+
+ case '"': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ backslash = false;
+ break;
+
+ case '\'': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_CHAR;
+ backslash = false;
+ break;
+
+ case '$': // Don't need to worry about backslashes as previous char is non-backslash.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.VARIABLE;
+ backslash = false;
+ break;
+
+ case '\\':
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ backslash = true;
+ break;
+
+ default:
+
+ if (RSyntaxUtilities.isDigit(c)) {
+ break; // Still a literal number.
+ }
+ int indexOf = operators.indexOf(c);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators.indexOf(c);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ indexOf = separators2.indexOf(c);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+
+ // Otherwise, remember this was a number and start over.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);
+ i--;
+ currentTokenType = Token.NULL;
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.VARIABLE:
+
+ // Note that we first arrive here AFTER the '$' character.
+ // First check if the variable name is enclosed in '{' and '}' characters.
+ if (c=='{') {
+ while (++i<end) {
+ if (array[i]=='}') {
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ } // End of while (++i<end).
+ if (i==end) { // Happens when '}' wasn't found...
+ addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ }
+ break;
+ } // End of if (i<end-1 && array[i+1]=='{').
+
+ // If we didn't find the '{' character, find the end of the variable...
+ while (i<end) {
+ c = array[i]; // Not needed the first iteration, but can't think of a better way to do it...
+ if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ i--;
+ currentTokenType = Token.NULL;
+ break;
+ }
+ i++;
+ }
+
+ // This only happens if we never found the end of the variable in the loop above.
+ if (i==end) {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ }
+
+ break;
+
+ case Token.COMMENT_EOL:
+ // If we got here, then the line != "#" only, so check for "#!".
+ if (c=='!')
+ currentTokenType = Token.PREPROCESSOR;
+ i = end - 1;
+ addToken(text, currentTokenStart,i, currentTokenType, newStartOffset+currentTokenStart);
+ // We need to set token type to null so at the bottom we don't add one more token.
+ currentTokenType = Token.NULL;
+
+ break;
+
+ case Token.LITERAL_CHAR:
+
+ if (c=='\\') {
+ backslash = !backslash; // Okay because if we got in here, backslash was initially false.
+ }
+ else {
+ if (c=='\'' && !backslash) {
+ addToken(text, currentTokenStart,i, Token.LITERAL_CHAR, newStartOffset+currentTokenStart);
+ currentTokenStart = i + 1;
+ currentTokenType = Token.NULL;
+ // backslash is definitely false when we leave.
+ }
+
+ backslash = false; // Need to set backslash to false here as a character was typed.
+
+ }
+ // Otherwise, we're still an unclosed char literal...
+
+ break;
+
+ case Token.LITERAL_BACKQUOTE:
+
+ switch (c) {
+
+ case '\\':
+ backslash = !backslash;
+ break;
+
+ case '`':
+ if (!backslash) {
+ addToken(text, currentTokenStart,i, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ // backslash is definitely false when we leave.
+ break;
+ }
+ backslash = false;
+ break;
+
+ // Variable in the backquote string...
+ case '$':
+
+ if (backslash==true) {
+ backslash = false;
+ break;
+ }
+
+ // Add the string up-to the variable.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_BACKQUOTE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.VARIABLE;
+ currentTokenStart = i;
+
+ // First check if the variable name is enclosed in '{' and '}' characters.
+ if (i<end-1 && array[i+1]=='{') {
+ i++; // Now we're on the '{' char.
+ while (++i<end) {
+ if (array[i]=='}') {
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ i++;
+ if (i<end) {
+ c = array[i];
+ if (c=='`') { // The only rub - back quote right after variable.
+ addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else { // Continue on with the string.
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ i--;
+ break;
+ }
+ }
+ else { // i==end = "trick" this method so that the string is continued to the next line.
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ break; // So we don't hit the condition below.
+ }
+ } // End of if (array[i]=='}').
+ } // End of while (++i<end).
+ if (i==end) { // Happens when '}' wasn't found...
+ addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenStart = end; // ???
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ break;
+ }
+ } // End of if (i<end-1 && array[i+1]=='{').
+
+ // If we reached the end of the variable, get out.
+ if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_BACKQUOTE)
+ break;
+
+ // If we didn't find the '{' character, find the end of the variable...
+ // Increment first to skip the '$'.
+ while (++i<end) {
+ c = array[i];
+ if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ if (c=='`') { // The only rub.
+ addToken(text, i,i, Token.LITERAL_BACKQUOTE, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ i--;
+ break;
+ }
+ }
+ }
+
+ // This only happens if we never found the end of the variable in the loop above.
+ // We "trick" this method so that the backquote string token is at the end.
+ if (i==end) {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_BACKQUOTE;
+ }
+
+ break;
+
+ // Otherwise, we're still in an unclosed string...
+ default:
+ backslash = false; // Need to set backslash to false here as a character was typed.
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+
+ switch (c) {
+
+ case '\\':
+ backslash = !backslash;
+ break;
+
+ case '"':
+ if (!backslash) {
+ addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ // backslash is definitely false when we leave.
+ break;
+ }
+ backslash = false;
+ break;
+
+ // Variable in the double-quoted string...
+ case '$':
+
+ if (backslash==true) {
+ backslash = false;
+ break;
+ }
+
+ // Add the string up-to the variable.
+ addToken(text, currentTokenStart,i-1, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.VARIABLE;
+ currentTokenStart = i;
+
+ // First check if the variable name is enclosed in '{' and '}' characters.
+ if (i<end-1 && array[i+1]=='{') {
+ i++; // Now we're on the '{' char.
+ while (++i<end) {
+ if (array[i]=='}') {
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ i++;
+ if (i<end) {
+ c = array[i];
+ if (c=='"') { // The only rub - double-quote right after variable.
+ addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else { // Continue on with the string.
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ i--;
+ break;
+ }
+ }
+ else { // i==end = "trick" this method so that the string is continued to the next line.
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ break; // So we don't hit the condition below.
+ }
+ } // End of if (array[i]=='}').
+ } // End of while (++i<end).
+ if (i==end) { // Happens when '}' wasn't found...
+ addToken(text, currentTokenStart,end-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenStart = end; // ???
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ break;
+ }
+ } // End of if (i<end-1 && array[i+1]=='{').
+
+ // If we reached the end of the variable, get out.
+ if (currentTokenType==Token.NULL || currentTokenType==Token.LITERAL_STRING_DOUBLE_QUOTE)
+ break;
+
+ // If we didn't find the '{' character, find the end of the variable...
+ // Increment first to skip the '$'.
+ while (++i<end) {
+ c = array[i];
+ if (!RSyntaxUtilities.isLetterOrDigit(c) && shellVariables.indexOf(c)==-1 && c!='_') {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ if (c=='"') { // The only rub.
+ addToken(text, i,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ i--;
+ break;
+ }
+ }
+ }
+
+ // This only happens if we never found the end of the variable in the loop above.
+ // We "trick" this method so that the double-quote string token is at the end.
+ if (i==end) {
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
+ }
+
+ break;
+
+ // Otherwise, we're still in an unclosed string...
+ default:
+ backslash = false; // Need to set backslash to false here as a character was typed.
+
+ } // End of switch (c).
+
+ break;
+
+ } // End of switch (currentTokenType).
+
+ } // End of for (int i=offset; i<end; i++).
+
+ switch (currentTokenType) {
+
+ // Remember what token type to begin the next line with.
+ case Token.LITERAL_BACKQUOTE:
+ case Token.LITERAL_STRING_DOUBLE_QUOTE:
+ case Token.LITERAL_CHAR:
+ addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+ break;
+
+ // Do nothing if everything was okay.
+ case Token.NULL:
+ addNullToken();
+ break;
+
+ // All other token types don't continue to the next line...
+ default:
+ addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+ addNullToken();
+
+ }
+
+ // Return the first token in our linked list.
+ return firstToken;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex
new file mode 100644
index 0000000..77bcb60
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex
@@ -0,0 +1,462 @@
+/*
+ * 03/24/2013
+ *
+ * VisualBasicTokenMaker.java - Scanner for Visual Basic
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Visual Basic.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated VisualBasicTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+%%
+
+%public
+%class VisualBasicTokenMaker
+%extends AbstractJFlexTokenMaker
+%unicode
+%ignorecase
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public VisualBasicTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "'", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit})
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f])
+
+UnclosedStringLiteral = ([\"][^\"]*)
+StringLiteral = ({UnclosedStringLiteral}[\"])
+
+LineCommentBegin = "'"
+
+NumTypeSuffix = (([DRI\&SF]|"UI"|"UL"|"US")?)
+IntegerLiteral = ({Digit}+{NumTypeSuffix})
+HexLiteral = ("&h"{HexDigit}+{NumTypeSuffix})
+FloatHelper = ([eE][+-]?{Digit}+{NumTypeSuffix})
+FloatLiteral1 = ({Digit}+"."({NumTypeSuffix}|{FloatHelper}|{Digit}+({NumTypeSuffix}|{FloatHelper})))
+FloatLiteral2 = ("."{Digit}+({NumTypeSuffix}|{FloatHelper}))
+FloatLiteral3 = ({Digit}+({NumTypeSuffix}|{FloatHelper}))
+FloatLiteral = ({FloatLiteral1}|{FloatLiteral2}|{FloatLiteral3})
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)])
+Separator2 = ([\;,.])
+
+Operator = ("&"|"&="|"*"|"*="|"+"|"+="|"="|"-"|"-="|"<<"|"<<="|">>"|">>="|"/"|"/="|"\\"|"\\="|"^"|"^=")
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+ErrorIdentifier = ({NonSeparator}+)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state EOL_COMMENT
+
+%%
+
+<YYINITIAL> {
+
+ /* Keywords */
+ "AddHandler" |
+ "AddressOf" |
+ "Alias" |
+ "And" |
+ "AndAlso" |
+ "As" |
+ "ByRef" |
+ "ByVal" |
+ "Call" |
+ "Case" |
+ "Catch" |
+ "CBool" |
+ "CByte" |
+ "CChar" |
+ "CDate" |
+ "CDbl" |
+ "CDec" |
+ "CInt" |
+ "Class" |
+ "CLng" |
+ "CObj" |
+ "Const" |
+ "Continue" |
+ "CSByte" |
+ "CShort" |
+ "CSng" |
+ "CStr" |
+ "CType" |
+ "CUInt" |
+ "CULng" |
+ "CUShort" |
+ "Declare" |
+ "Default" |
+ "Delegate" |
+ "Dim" |
+ "DirectCast" |
+ "Do" |
+ "Each" |
+ "Else" |
+ "ElseIf" |
+ "End" |
+ "EndIf" |
+ "Enum" |
+ "Erase" |
+ "Error" |
+ "Event" |
+ "Exit" |
+ "Finally" |
+ "For" |
+ "Friend" |
+ "Function" |
+ "Get" |
+ "GetType" |
+ "GetXMLNamespace" |
+ "Global" |
+ "GoSub" |
+ "GoTo" |
+ "Handles" |
+ "If" |
+ "If" |
+ "Implements" |
+ "Imports" |
+ "In" |
+ "Inherits" |
+ "Interface" |
+ "Is" |
+ "IsNot" |
+ "Let" |
+ "Lib" |
+ "Like" |
+ "Loop" |
+ "Me" |
+ "Mod" |
+ "Module" |
+ "Module Statement" |
+ "MustInherit" |
+ "MustOverride" |
+ "MyBase" |
+ "MyClass" |
+ "Namespace" |
+ "Narrowing" |
+ "New" |
+ "New" |
+ "Next" |
+ "Not" |
+ "Nothing" |
+ "NotInheritable" |
+ "NotOverridable" |
+ "Of" |
+ "On" |
+ "Operator" |
+ "Option" |
+ "Optional" |
+ "Or" |
+ "OrElse" |
+ "Out" |
+ "Overloads" |
+ "Overridable" |
+ "Overrides" |
+ "ParamArray" |
+ "Partial" |
+ "Private" |
+ "Property" |
+ "Protected" |
+ "Public" |
+ "RaiseEvent" |
+ "ReadOnly" |
+ "ReDim" |
+ "REM" |
+ "RemoveHandler" |
+ "Resume" |
+ "Select" |
+ "Set" |
+ "Shadows" |
+ "Shared" |
+ "Static" |
+ "Step" |
+ "Stop" |
+ "Structure" |
+ "Sub" |
+ "SyncLock" |
+ "Then" |
+ "Throw" |
+ "To" |
+ "Try" |
+ "TryCast" |
+ "TypeOf" |
+ "Using" |
+ "Variant" |
+ "Wend" |
+ "When" |
+ "While" |
+ "Widening" |
+ "With" |
+ "WithEvents" |
+ "WriteOnly" |
+ "Xor" { addToken(Token.RESERVED_WORD); }
+ "Return" { addToken(Token.RESERVED_WORD_2); }
+
+ /* Data types. */
+ "Boolean" |
+ "Byte" |
+ "Char" |
+ "Date" |
+ "Decimal" |
+ "Double" |
+ "Integer" |
+ "Long" |
+ "Object" |
+ "SByte" |
+ "Short" |
+ "Single" |
+ "String" |
+ "UInteger" |
+ "ULong" |
+ "UShort" { addToken(Token.DATA_TYPE); }
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace}+ { addToken(Token.WHITESPACE); }
+
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+ {UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+
+ {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+ {Separator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+ {Operator} { addToken(Token.OPERATOR); }
+
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ {ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
+
+ /* Ended with a line not in a string or comment. */
+ <<EOF>> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+<EOL_COMMENT> {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java
new file mode 100644
index 0000000..ab78314
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java
@@ -0,0 +1,1619 @@
+/* The following code was generated by JFlex 1.4.1 on 3/24/13 12:59 AM */
+
+/*
+ * 03/24/2013
+ *
+ * VisualBasicTokenMaker.java - Scanner for Visual Basic
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for Visual Basic.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated VisualBasicTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+
+public class VisualBasicTokenMaker extends AbstractJFlexTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\11\1\10\1\0\1\11\1\5\22\0\1\64\1\37\1\12"+
+ "\1\6\1\1\1\37\1\16\1\13\2\36\1\41\1\27\1\37\1\27"+
+ "\1\30\1\44\1\3\11\3\1\47\1\37\1\42\1\40\1\43\1\37"+
+ "\1\6\1\35\1\54\1\4\1\15\1\26\1\34\1\57\1\25\1\21"+
+ "\1\60\1\63\1\22\1\61\1\52\1\53\1\46\1\1\1\14\1\24"+
+ "\1\31\1\17\1\56\1\50\1\62\1\55\1\1\1\37\1\7\1\37"+
+ "\1\45\1\2\1\0\1\35\1\54\1\4\1\51\1\26\1\33\1\57"+
+ "\1\65\1\20\1\60\1\63\1\22\1\61\1\52\1\53\1\46\1\1"+
+ "\1\32\1\23\1\31\1\17\1\56\1\66\1\62\1\55\1\1\3\5"+
+ "\1\37\uff81\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 =
+ "\2\0\1\1\1\2\1\3\2\2\1\4\1\5\1\6"+
+ "\1\7\1\10\2\2\1\4\6\2\1\4\4\2\1\11"+
+ "\1\4\13\2\1\12\1\13\6\12\1\14\1\3\2\14"+
+ "\1\15\13\2\1\16\5\2\1\17\1\0\3\2\3\17"+
+ "\47\2\1\17\14\2\1\12\2\0\3\12\2\0\1\15"+
+ "\1\0\1\15\1\14\24\2\1\17\7\2\1\20\24\2"+
+ "\1\17\2\2\1\17\11\2\1\17\13\2\1\17\12\2"+
+ "\1\17\3\2\1\17\2\2\1\12\2\0\3\12\2\0"+
+ "\2\2\1\21\14\2\1\20\1\14\16\2\1\22\17\2"+
+ "\1\17\17\2\1\12\1\0\2\12\1\23\1\0\52\2"+
+ "\1\0\1\12\1\0\1\2\1\24\21\2\1\17\6\2"+
+ "\1\17\14\2\1\0\10\2\1\0\3\2\1\0\2\2"+
+ "\6\0\1\17";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[417];
+ 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\67\0\156\0\245\0\334\0\u0113\0\u014a\0\u0181"+
+ "\0\u014a\0\u01b8\0\u01ef\0\u014a\0\u0226\0\u025d\0\u0294\0\u02cb"+
+ "\0\u0302\0\u0339\0\u0370\0\u03a7\0\u03de\0\u0415\0\u044c\0\u0483"+
+ "\0\u04ba\0\u04f1\0\u014a\0\u014a\0\u0528\0\u055f\0\u0596\0\u05cd"+
+ "\0\u0604\0\u063b\0\u0672\0\u06a9\0\u06e0\0\u0717\0\u074e\0\u0785"+
+ "\0\u014a\0\u07bc\0\u07f3\0\u082a\0\u0861\0\u0898\0\u08cf\0\u0906"+
+ "\0\u0906\0\u093d\0\u0974\0\u09ab\0\u09e2\0\u0a19\0\u0a50\0\u0a87"+
+ "\0\u0abe\0\u0af5\0\u0b2c\0\u0b63\0\u0b9a\0\u0bd1\0\u0c08\0\u014a"+
+ "\0\u0c3f\0\u0c76\0\u0cad\0\u0ce4\0\u0d1b\0\u0d52\0\u0d89\0\u0dc0"+
+ "\0\u0df7\0\u0e2e\0\u0e65\0\245\0\u0e9c\0\u0ed3\0\u0f0a\0\u0f41"+
+ "\0\u0f78\0\u0faf\0\u0fe6\0\u101d\0\u1054\0\u108b\0\u10c2\0\u10f9"+
+ "\0\u1130\0\u1167\0\u119e\0\u11d5\0\u120c\0\u1243\0\u127a\0\u12b1"+
+ "\0\u12e8\0\u131f\0\u1356\0\u138d\0\u13c4\0\u13fb\0\u1432\0\u1469"+
+ "\0\u14a0\0\u14d7\0\u150e\0\u1545\0\u157c\0\u15b3\0\u15ea\0\u1621"+
+ "\0\u1658\0\u168f\0\u16c6\0\u16fd\0\u1734\0\u176b\0\u17a2\0\u17d9"+
+ "\0\u1810\0\u1847\0\u187e\0\u18b5\0\u18ec\0\u1923\0\u195a\0\u1991"+
+ "\0\u19c8\0\u19ff\0\u1a36\0\u1a6d\0\u1aa4\0\u1adb\0\u1b12\0\u1b49"+
+ "\0\u1b80\0\u1bb7\0\u1bee\0\u0906\0\u1c25\0\u1c5c\0\u1c93\0\u1cca"+
+ "\0\u1d01\0\u1d38\0\u1d6f\0\u1da6\0\u1ddd\0\u1e14\0\u1e4b\0\u1e82"+
+ "\0\u1eb9\0\u1ef0\0\u1f27\0\u1f5e\0\u1f95\0\u1fcc\0\u2003\0\u203a"+
+ "\0\u2071\0\u20a8\0\u20df\0\u2116\0\u214d\0\u2184\0\u21bb\0\u21f2"+
+ "\0\u2229\0\u2260\0\u2297\0\u22ce\0\u2305\0\u233c\0\u2373\0\u23aa"+
+ "\0\u23e1\0\u2418\0\u244f\0\u2486\0\u24bd\0\u24f4\0\u252b\0\u2562"+
+ "\0\u2599\0\u25d0\0\u2607\0\u263e\0\u2675\0\u26ac\0\u26e3\0\u271a"+
+ "\0\u2751\0\u2788\0\u27bf\0\u27f6\0\u282d\0\u2864\0\u289b\0\u28d2"+
+ "\0\u2909\0\u2940\0\u2977\0\u29ae\0\u29e5\0\u2a1c\0\u2a53\0\u2a8a"+
+ "\0\u2ac1\0\u2af8\0\u2b2f\0\u2b66\0\u2b9d\0\u2bd4\0\u2c0b\0\u2c42"+
+ "\0\u2c79\0\u2cb0\0\u2ce7\0\u2d1e\0\u2d55\0\u2d8c\0\u2dc3\0\u2dfa"+
+ "\0\u2e31\0\u2e68\0\u2e9f\0\u2ed6\0\u2f0d\0\u2f44\0\u2f7b\0\u2fb2"+
+ "\0\u2fe9\0\u3020\0\u3057\0\u308e\0\u30c5\0\u30fc\0\u3133\0\u316a"+
+ "\0\u31a1\0\u31d8\0\u320f\0\245\0\u3246\0\u327d\0\u32b4\0\u32eb"+
+ "\0\u3322\0\u3359\0\u3390\0\u33c7\0\u33fe\0\u3435\0\u346c\0\u34a3"+
+ "\0\u0906\0\u34da\0\u3511\0\u3548\0\u357f\0\u35b6\0\u35ed\0\u3624"+
+ "\0\u365b\0\u3692\0\u36c9\0\u3700\0\u3737\0\u376e\0\u37a5\0\u37dc"+
+ "\0\245\0\u3813\0\u384a\0\u3881\0\u38b8\0\u38ef\0\u3926\0\u395d"+
+ "\0\u3994\0\u39cb\0\u3a02\0\u3a39\0\u3a70\0\u3aa7\0\u3ade\0\u3b15"+
+ "\0\u3b4c\0\u3b83\0\u3bba\0\u3bf1\0\u3c28\0\u3c5f\0\u3c96\0\u3ccd"+
+ "\0\u3d04\0\u3d3b\0\u3d72\0\u3da9\0\u3de0\0\u3e17\0\u3e4e\0\u3e85"+
+ "\0\u3ebc\0\u3ef3\0\u3f2a\0\u3f61\0\u3f98\0\u3fcf\0\u4006\0\u403d"+
+ "\0\u4074\0\u40ab\0\u40e2\0\u4119\0\u4150\0\u4187\0\u41be\0\u41f5"+
+ "\0\u422c\0\u4263\0\u429a\0\u42d1\0\u4308\0\u433f\0\u4376\0\u43ad"+
+ "\0\u43e4\0\u441b\0\u4452\0\u4489\0\u44c0\0\u44f7\0\u452e\0\u4565"+
+ "\0\u459c\0\u45d3\0\u460a\0\u4641\0\u4678\0\u46af\0\u46e6\0\u471d"+
+ "\0\u4754\0\u478b\0\u47c2\0\u47f9\0\u4830\0\u4867\0\u489e\0\u48d5"+
+ "\0\u490c\0\u4943\0\u3f98\0\u497a\0\245\0\u49b1\0\u49e8\0\u2788"+
+ "\0\u4a1f\0\u4a56\0\u4a8d\0\u4ac4\0\u4afb\0\u4b32\0\u4b69\0\u4ba0"+
+ "\0\u4bd7\0\u4c0e\0\u4c45\0\u4c7c\0\u4cb3\0\u4cea\0\u2dfa\0\u4d21"+
+ "\0\u4d58\0\u4d8f\0\u4dc6\0\u4dfd\0\u4e34\0\u4e6b\0\u4ea2\0\u4ed9"+
+ "\0\u4f10\0\u4f47\0\u4f7e\0\u4fb5\0\u4fec\0\u5023\0\u505a\0\u5091"+
+ "\0\u50c8\0\u50ff\0\u5136\0\u516d\0\u51a4\0\u51db\0\u5212\0\u5249"+
+ "\0\u5280\0\u52b7\0\u52ee\0\u5325\0\u535c\0\u5393\0\u53ca\0\u5401"+
+ "\0\u5438\0\u546f\0\u54a6\0\u54dd\0\u5514\0\u554b\0\u5582\0\u55b9"+
+ "\0\u014a";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[417];
+ 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 =
+ "\1\3\2\4\1\5\1\6\1\7\1\3\1\10\1\11"+
+ "\1\12\1\13\1\14\1\15\1\16\1\17\1\20\2\21"+
+ "\1\22\2\23\1\24\1\25\1\26\1\27\1\30\1\15"+
+ "\2\31\1\32\1\33\1\7\1\34\1\26\1\35\1\36"+
+ "\2\26\1\37\1\7\1\40\1\16\1\41\1\42\1\43"+
+ "\1\4\1\44\1\45\1\4\1\46\1\47\1\4\1\12"+
+ "\1\24\1\40\10\50\1\51\14\50\1\52\5\50\1\53"+
+ "\1\54\13\50\1\55\14\50\1\56\1\57\5\3\1\0"+
+ "\2\3\4\0\2\3\1\0\10\3\2\0\5\3\10\0"+
+ "\1\3\1\0\14\3\1\0\3\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\3\60\1\5\1\60\1\0"+
+ "\2\60\4\0\3\61\1\62\1\60\1\61\2\60\1\61"+
+ "\1\60\1\63\1\0\1\64\3\60\1\61\1\60\10\0"+
+ "\1\60\1\0\14\60\1\0\2\60\1\3\3\4\1\65"+
+ "\1\0\2\3\4\0\1\4\1\66\1\0\1\67\2\70"+
+ "\1\71\2\72\1\73\1\4\2\0\1\74\3\4\1\75"+
+ "\10\0\1\4\1\0\1\4\1\66\1\4\1\76\1\77"+
+ "\7\4\1\0\1\73\1\4\67\0\5\3\1\0\2\3"+
+ "\4\0\2\3\1\0\10\3\2\0\5\3\2\0\1\34"+
+ "\5\0\1\3\1\0\14\3\1\0\2\3\11\0\1\12"+
+ "\52\0\1\12\2\0\12\13\1\100\54\13\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\101\2\0"+
+ "\4\4\1\102\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\4"+
+ "\2\103\4\4\1\104\2\0\4\4\1\105\10\0\1\4"+
+ "\1\0\3\4\1\106\10\4\1\0\2\4\25\0\1\107"+
+ "\12\0\1\34\24\0\1\107\1\0\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\4\2\110\1\111\2\112"+
+ "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\4\4\2\113\2\4\2\0\2\4\2\114\1\4\10\0"+
+ "\1\4\1\0\2\4\1\115\6\4\1\116\2\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\1\4\2\117\4\4\1\120\2\0\5\4\10\0\1\4"+
+ "\1\0\3\4\1\121\10\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\122\2\123\3\4"+
+ "\1\124\1\125\2\0\1\126\4\4\10\0\1\4\1\0"+
+ "\4\4\1\127\1\130\6\4\1\0\1\124\1\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\131\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\1\132\1\4\1\0"+
+ "\3\4\1\133\4\4\2\0\1\4\1\132\2\4\1\134"+
+ "\10\0\1\4\1\0\2\4\1\135\3\4\1\136\3\4"+
+ "\1\137\1\4\1\0\2\4\40\0\1\34\31\0\1\64"+
+ "\63\0\1\3\4\4\1\0\2\3\4\0\1\140\1\4"+
+ "\1\0\6\4\1\141\1\4\2\0\1\4\1\140\3\4"+
+ "\10\0\1\4\1\0\3\4\1\114\1\4\1\142\6\4"+
+ "\1\0\1\141\1\4\1\3\4\4\1\0\2\3\4\0"+
+ "\1\143\1\4\1\0\1\144\2\145\5\4\2\0\1\4"+
+ "\1\143\2\4\1\146\10\0\1\4\1\0\3\4\1\147"+
+ "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\1\4\1\150\1\0\3\4\1\151\2\114\2\4\2\0"+
+ "\5\4\10\0\1\4\1\0\1\4\1\150\1\152\11\4"+
+ "\1\0\2\4\42\0\1\26\67\0\1\26\23\0\1\3"+
+ "\4\4\1\0\2\3\4\0\1\153\1\4\1\0\1\154"+
+ "\7\4\2\0\1\4\1\153\2\4\1\155\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\156\1\4\1\0\1\4\2\157\3\4\1\160"+
+ "\1\161\2\0\1\4\1\156\3\4\10\0\1\4\1\0"+
+ "\14\4\1\0\1\160\1\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\7\4\1\162\2\0\4\4\1\163"+
+ "\10\0\1\4\1\0\3\4\1\164\10\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\1\165\1\4\1\0"+
+ "\1\120\7\4\2\0\1\4\1\165\2\114\1\4\10\0"+
+ "\1\166\1\0\2\4\1\114\1\4\1\167\1\4\1\170"+
+ "\5\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\3\4\1\171\1\4\1\172\6\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\173\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\174\3\4\1\175\2\0\5\4\10\0\1\4\1\0"+
+ "\3\4\1\176\10\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\177\6\4\1\114\2\0"+
+ "\5\4\10\0\1\4\1\0\3\4\1\200\1\4\1\201"+
+ "\6\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\3\4\1\147\10\4\1\0\2\4\10\50\1\0\22\50"+
+ "\1\0\31\50\2\0\10\50\1\0\20\50\1\202\1\50"+
+ "\1\0\31\50\22\0\2\203\7\0\1\204\35\0\10\50"+
+ "\1\0\7\50\2\205\7\50\1\206\1\50\1\0\31\50"+
+ "\2\0\10\50\1\0\22\50\1\0\14\50\1\207\14\50"+
+ "\1\0\1\210\31\0\1\211\105\0\1\210\15\0\1\210"+
+ "\5\60\1\0\2\60\4\0\2\60\1\0\10\60\2\0"+
+ "\5\60\10\0\1\60\1\0\14\60\1\0\7\60\1\0"+
+ "\2\60\4\0\2\60\1\0\1\60\5\61\2\60\2\0"+
+ "\5\60\10\0\1\60\1\0\14\60\1\0\5\60\1\212"+
+ "\1\60\1\0\2\60\4\0\2\60\1\0\10\60\1\213"+
+ "\1\0\5\60\10\0\1\60\1\0\14\60\1\0\5\60"+
+ "\1\64\1\60\1\0\2\60\4\0\3\214\1\215\1\60"+
+ "\1\214\2\60\1\214\1\60\1\63\2\0\3\60\1\214"+
+ "\1\60\10\0\1\60\1\0\14\60\1\0\2\60\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\216"+
+ "\1\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\1\216\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\217\2\0\4\4\1\220\10\0\1\4"+
+ "\1\0\4\4\1\221\7\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\70\1\222"+
+ "\2\223\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+ "\1\120\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\4\4\1\224\10\0"+
+ "\1\4\1\0\2\4\1\225\11\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\226"+
+ "\1\4\2\0\1\147\4\4\10\0\1\4\1\0\2\4"+
+ "\1\225\1\4\1\227\7\4\1\0\1\226\1\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\230\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\5\4\1\231\6\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\221\2\232\2\4\2\0\1\134\4\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\2\4\1\233\1\4\1\234\7\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+ "\1\235\1\4\1\220\6\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\4\1\236\1\0\4\4\2\237"+
+ "\2\4\2\0\1\240\3\4\1\241\10\0\1\4\1\0"+
+ "\1\4\1\236\7\4\1\242\2\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\243"+
+ "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\1\244\1\4"+
+ "\1\0\10\4\2\0\1\4\1\244\3\4\10\0\1\4"+
+ "\1\0\11\4\1\114\2\4\1\0\2\4\1\3\3\4"+
+ "\1\245\1\0\2\3\4\0\2\4\1\0\3\4\1\246"+
+ "\4\4\2\0\2\4\2\247\1\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\250\4\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\251\7\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\3\0\2\252\10\0"+
+ "\1\252\10\0\1\252\4\0\3\252\13\0\1\252\2\0"+
+ "\1\252\12\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+ "\1\253\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\3\4\1\254\10\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\222\3\4"+
+ "\1\255\1\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\1\255\1\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\2\4\1\256\11\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\6\4\1\257\1\4\2\0"+
+ "\1\260\4\4\10\0\1\4\1\0\14\4\1\0\1\257"+
+ "\1\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\261\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\114"+
+ "\6\4\1\232\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\1\114\4\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\2\4\1\262\1\263\10\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\4\4\1\114\7\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+ "\1\264\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\4\4\1\265\10\0"+
+ "\1\4\1\0\3\4\1\266\10\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\3\4\1\267"+
+ "\4\4\2\0\1\114\4\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\270"+
+ "\1\4\1\0\7\4\1\263\2\0\1\4\1\270\2\4"+
+ "\1\271\10\0\1\4\1\0\3\4\1\263\10\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\5\4\1\105"+
+ "\6\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\2\4\1\272\11\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\2\4\1\273\11\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\47\1\4\1\0\10\4"+
+ "\2\0\1\4\1\47\2\4\1\274\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\4\4\2\275\2\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\276"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\4\1\277\1\0\1\300\7\4"+
+ "\2\0\5\4\10\0\1\4\1\0\1\4\1\277\12\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\70\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\120\5\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\301\7\4\2\0\5\4"+
+ "\10\0\1\4\1\0\5\4\1\302\6\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\1\303\1\4\1\0"+
+ "\7\4\1\304\2\0\1\4\1\303\3\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\305"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\4\2\306\5\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\2\4\1\307\11\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\2\4\1\310\11\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\311\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\114\1\4\1\0\10\4\2\0\1\4\1\114"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\4\1\312\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\1\4\1\312\12\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\1\4\2\313\5\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\4\1\314\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\1\4\1\314\12\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\315"+
+ "\5\4\2\0\5\4\10\0\1\4\1\0\3\4\1\316"+
+ "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\4\4\1\317\7\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\320\1\4\1\0\10\4\2\0\1\4"+
+ "\1\320\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\4"+
+ "\2\321\5\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\4"+
+ "\1\322\1\0\10\4\2\0\1\323\4\4\10\0\1\4"+
+ "\1\0\1\4\1\322\12\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\324\4\4"+
+ "\1\304\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\325"+
+ "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\1\114\11\4\1\120\1\4\1\0\1\4\1\114\1\3"+
+ "\4\4\1\0\2\3\4\0\1\326\1\4\1\0\10\4"+
+ "\2\0\1\4\1\326\3\4\10\0\1\4\1\0\11\4"+
+ "\1\327\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\1\330\4\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\7\4\1\331\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\332\2\0"+
+ "\1\333\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\10\4\1\334\3\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\335\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\3\4\1\336\10\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\337\1\4\1\0\10\4\2\0\1\250"+
+ "\1\337\3\4\10\0\1\4\1\0\6\4\1\340\5\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\341"+
+ "\1\4\1\0\10\4\2\0\1\4\1\341\3\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\3\4\1\342\10\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\1\343\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+ "\2\344\2\4\2\0\1\345\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\4\4\2\346\2\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\4\1\347\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\1\4\1\347\12\4\1\0\2\4"+
+ "\1\3\3\4\1\350\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\351"+
+ "\7\4\1\0\2\4\10\50\1\0\20\50\1\352\1\50"+
+ "\1\0\31\50\24\0\1\353\112\0\1\354\20\0\10\50"+
+ "\1\0\11\50\1\355\10\50\1\0\31\50\2\0\10\50"+
+ "\1\0\22\50\1\0\12\50\1\356\16\50\2\0\10\50"+
+ "\1\0\22\50\1\0\14\50\1\357\14\50\1\0\1\360"+
+ "\50\0\1\360\15\0\1\360\31\0\1\361\35\0\3\60"+
+ "\1\212\1\60\1\0\2\60\4\0\3\214\1\215\1\60"+
+ "\1\214\2\60\1\214\2\60\2\0\3\60\1\214\1\60"+
+ "\10\0\1\60\1\0\14\60\1\0\2\60\3\0\1\212"+
+ "\63\0\5\60\1\0\2\60\4\0\2\60\1\0\1\60"+
+ "\5\214\2\60\2\0\5\60\10\0\1\60\1\0\14\60"+
+ "\1\0\2\60\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\4\4\1\147\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\3\4\1\114\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\1\232\4\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\3\4\1\114\4\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\2\4\1\225\11\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\6\4\1\226\1\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\1\226\1\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\4\4\2\362\2\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\7\4\1\114\4\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\3\4\1\363\10\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\5\4"+
+ "\1\220\6\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\364\1\4\1\0\10\4\2\0\1\4\1\364"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\232\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\114"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+ "\2\120\2\4\2\0\1\365\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\10\4\1\114\3\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\3\4\1\221\10\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\300"+
+ "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\1\366\7\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\1\367\7\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\1\4\1\370\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\1\4\1\370\12\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\3\4\1\371\10\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+ "\2\372\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\373\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\374\1\375\4\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\376\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\377\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\364\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\4\4\1\u0100"+
+ "\7\4\1\0\2\4\3\60\2\252\1\0\2\60\4\0"+
+ "\1\u0101\1\252\1\u0101\1\u0102\1\60\1\u0101\2\60\1\u0101"+
+ "\1\60\1\252\2\0\2\60\3\252\10\0\1\60\1\0"+
+ "\1\60\1\252\2\60\1\252\7\60\1\0\2\60\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\1\u0103\4\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\2\4\1\262\11\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+ "\1\266\10\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\3\4\1\120\10\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0104\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\u0105"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\u0106\4\4\2\0\5\4\10\0\1\4\1\0\3\4"+
+ "\1\u0107\10\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\7\4\1\364\4\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\114\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\7\4\1\u0100\4\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\1\u0108\1\u0109\1\0"+
+ "\10\4\2\0\1\4\1\u0108\3\4\10\0\1\4\1\0"+
+ "\1\4\1\u0109\12\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\u010a\1\4\1\0\10\4\2\0\1\4"+
+ "\1\u010a\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u010b\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\1\u010c\2\254\5\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\u010d\4\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\3\4\1\u010e\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\4\1\u010f\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\1\4\1\u010f\12\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+ "\2\232\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\277\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\6\4\1\114\1\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\1\114\1\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\u0110\5\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\11\4\1\114\2\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\u0111\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\3\4\1\u0112\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\3\4\1\u0113\10\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\2\4\1\114\11\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u0114\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\7\4\1\161\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\3\4\1\u0115\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\4\4\1\u0116\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\4\4\2\301\2\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\u0117\1\4\1\0\6\4\1\u0118"+
+ "\1\4\2\0\1\4\1\u0117\3\4\10\0\1\4\1\0"+
+ "\14\4\1\0\1\u0118\1\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\4\4\1\362\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\4\4\1\u0119"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\6\4\1\u011a\5\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\1\u011b\4\4\10\0\1\u011c\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\3\4\1\u010d\4\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\u011d\3\4\1\u011e\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\1\u011f\4\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0120\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\6\4\1\u0121"+
+ "\1\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\1\u0121\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\232\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\4\1\114\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\1\4\1\114\12\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\u0122\1\4\1\0\10\4"+
+ "\2\0\1\4\1\u0122\3\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\u0123\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\u0124\3\4\1\u0125\1\4\2\0"+
+ "\5\4\10\0\1\4\1\0\3\4\1\u0126\10\4\1\0"+
+ "\1\u0125\1\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\274\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\u0127\1\4\1\0\10\4\2\0\1\4\1\u0127"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\1\4\2\u0128"+
+ "\5\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\7\4\1\u0129\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\u012a"+
+ "\1\4\1\0\10\4\2\0\1\4\1\u012a\3\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\3\4\1\u012b\4\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\u0110"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\4\4\1\221\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\1\4\2\u012c\5\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\4\4\1\340\7\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\1\74\4\4"+
+ "\10\0\1\4\1\0\12\4\1\u012d\1\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\1\122"+
+ "\7\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\114"+
+ "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\u012e\4\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\u012f\7\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\3\4\1\u0130\4\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\274\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\10\50\1\0\22\50\1\0\12\50\1\u0131\16\50\30\0"+
+ "\1\354\107\0\1\u0132\17\0\10\50\1\0\15\50\1\356"+
+ "\4\50\1\0\31\50\2\0\10\50\1\0\22\50\1\0"+
+ "\13\50\1\u0133\15\50\2\0\10\50\1\0\17\50\1\u0134"+
+ "\2\50\1\0\31\50\32\0\1\u0135\104\0\1\u0136\20\0"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\4\4"+
+ "\2\114\2\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\120"+
+ "\1\4\1\0\10\4\2\0\1\4\1\120\3\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\4\2\u0137\5\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\11\4\1\232\2\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\1\u0138\1\4"+
+ "\1\0\10\4\2\0\1\4\1\u0138\3\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\3\4\1\u0139\10\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\6\4\1\u013a\5\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u013b\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\3\4\1\u013c\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+ "\1\u013d\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\4\4\1\u013e\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\7\4\1\u011a\4\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\1\u013f\7\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\250\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\5\60\1\0\2\60\4\0\2\60\1\0"+
+ "\1\60\5\u0101\2\60\2\0\5\60\10\0\1\60\1\0"+
+ "\14\60\1\0\2\60\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\7\4\1\u0140\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\u0141\1\4\1\0\10\4\2\0\1\4\1\u0141"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\u0142\1\4\1\0\10\4"+
+ "\2\0\1\4\1\u0142\3\4\10\0\1\4\1\0\7\4"+
+ "\1\u0143\4\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\7\4\1\u0144\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\1\u0145\1\4\1\0\10\4\2\0\1\4"+
+ "\1\u0145\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\325\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\u0146"+
+ "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\364\4\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\3\4\1\120\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\u0147"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\217\5\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\u0148\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\u0149\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\2\4\2\114\1\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\4\4"+
+ "\1\u014a\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\1\114\13\4\1\0\1\4"+
+ "\1\114\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\3\4\1\u0110"+
+ "\10\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\1\u014b\4\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\3\4\1\u014c\4\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\u014d\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\u014e\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\u014f\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\4\4\1\220\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\7\4\1\u0150\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\7\4\1\u0151\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\4\2\340\5\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\11\4\1\u0152\2\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\7\4\1\370\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+ "\1\u0125\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\7\4\1\u0153\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\3\4\1\u0154\10\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\4\4\2\u0155"+
+ "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\u0156"+
+ "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\222\5\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\5\4\10\0"+
+ "\1\4\1\0\6\4\1\u0157\5\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\4\4\1\u0158\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\3\4\1\u0159\10\4"+
+ "\1\0\2\4\1\3\3\4\1\u010a\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\1\u015a\1\4\1\0\3\4\1\u015b\4\4\2\0\1\4"+
+ "\1\u015a\3\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u015c\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\4\4\1\70\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+ "\1\u015d\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\4\2\u015e\5\4\2\0\5\4"+
+ "\10\0\1\4\1\0\3\4\1\u015f\10\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\3\4"+
+ "\1\u0160\4\4\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\4\4\1\224\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\10\50\1\0\12\50\2\356\6\50"+
+ "\1\0\13\50\1\u0133\15\50\46\0\1\u0161\22\0\10\50"+
+ "\1\0\22\50\1\0\10\50\1\u0162\20\50\2\0\1\50"+
+ "\4\u0134\1\50\1\u0134\1\50\1\0\2\50\20\u0134\1\u0135"+
+ "\6\u0134\2\50\1\u0134\1\50\16\u0134\1\50\2\u0135\1\0"+
+ "\1\u0135\1\u0163\2\u0135\1\0\1\u0163\4\0\1\u0163\2\u0135"+
+ "\1\u0163\10\u0135\2\u0163\5\u0135\4\u0163\2\0\1\u0135\1\0"+
+ "\1\u0135\1\u0163\14\u0135\1\0\2\u0135\23\0\2\354\22\0"+
+ "\1\u0132\17\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\2\4"+
+ "\1\u0164\11\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\2\4\1\u0165\11\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\2\4\1\u014c\11\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u0166\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\7\4\1\u0167\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\1\u0168\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\4\4\1\u0169\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\232\1\4\1\0\10\4\2\0\1\4\1\232"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\3\4\1\120"+
+ "\4\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\7\4\1\u0143"+
+ "\4\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\u0145\5\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\2\4\2\u016a"+
+ "\1\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\7\4\1\230"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\11\4\1\u016b\2\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\1\362\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\1\362\13\4\1\0\1\4\1\362\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\1\u016c\4\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\3\4\1\u016d\10\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\362\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\4\4\2\120\2\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\1\4\2\u016e\5\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\3\4\1\u016f\4\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\4\4\2\u0170"+
+ "\2\4\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\2\4\1\u0171"+
+ "\11\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\4\4\2\345\2\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\3\4\1\u0172"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\u0173\1\4\1\0\10\4\2\0"+
+ "\1\4\1\u0173\3\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\4\4\1\u0174\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\6\4"+
+ "\1\u016b\5\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\1\u0125\13\4\1\0\1\4\1\u0125\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\u016a\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\6\4\1\u0175\1\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\1\u0175"+
+ "\1\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\7\4\1\u0176\2\0\5\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\1\47\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\2\4\1\u0177\11\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\1\4\2\u0178\5\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\3\4\1\u0179\10\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\4\4\1\u017a\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\u017b\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\5\4\10\0\1\4"+
+ "\1\0\2\4\1\u017c\11\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\6\4\1\u017d\5\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\7\4"+
+ "\1\u017e\2\0\5\4\10\0\1\4\1\0\14\4\1\0"+
+ "\2\4\44\0\1\u0135\22\0\10\50\1\0\22\50\1\0"+
+ "\10\50\1\u0134\20\50\2\0\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\232\7\4\2\0\5\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\6\4\1\u0118\1\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\1\u0118\1\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\6\4\1\136\5\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\364\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\10\4\2\0\4\4\1\u017f\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\7\4\1\u0180\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\u013e\7\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\3\4\1\u0181\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\3\4\1\304\10\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\5\4"+
+ "\1\114\6\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\4\4\2\u0114\2\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\4\1\u0182\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\1\4\1\u0182\12\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\1\u0108\4\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\1\u016f\4\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\1\u0183\1\4\1\0\10\4\2\0\1\4\1\u0183\3\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\7\4\1\u0184\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\u0185\1\4\1\0\10\4"+
+ "\2\0\1\4\1\u0185\3\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\4"+
+ "\1\u0186\1\0\10\4\2\0\5\4\10\0\1\4\1\0"+
+ "\1\4\1\u0186\12\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\4\4\1\u0187"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\2\4\1\364\11\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\2\4\1\u0188\11\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\6\4\1\u0189\1\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\1\u0189\1\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\7\4\1\u018a\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\u018b\2\4\1\3\3\4"+
+ "\1\232\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\2\4\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\2\4\1\u0145\11\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\10\4\2\0\5\4\10\0\1\4\1\0\13\4\1\114"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\3\4\1\u018c\4\4\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\u018d\1\4\1\0\10\4\2\0\1\4\1\u018d"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\u018e\1\4\1\0\10\4"+
+ "\2\0\1\4\1\u018e\3\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\1\u018f"+
+ "\1\4\1\0\10\4\2\0\1\4\1\u018f\3\4\10\0"+
+ "\1\4\1\0\14\4\1\0\2\4\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\7\4\1\362\2\0\4\4"+
+ "\1\u0190\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\4\1\362\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\1\4\1\362\12\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\4\4\1\u0191\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\7\4\1\u0192\2\0\5\4\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\u0193\1\4\1\0\10\4\2\0\1\4\1\u0193"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\23\0"+
+ "\2\u0194\42\0\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\7\4\1\147\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\1\3\4\4\1\0\2\3\4\0"+
+ "\2\4\1\0\10\4\2\0\4\4\1\u016f\10\0\1\4"+
+ "\1\0\14\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\2\4\1\0\1\4\2\u0195\5\4\2\0\5\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\1\4\2\u0196\5\4"+
+ "\2\0\5\4\10\0\1\4\1\0\14\4\1\0\2\4"+
+ "\1\3\4\4\1\0\2\3\4\0\2\4\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\4\4\1\324\7\4"+
+ "\1\0\2\4\1\3\4\4\1\0\2\3\4\0\2\4"+
+ "\1\0\10\4\2\0\5\4\10\0\1\4\1\0\11\4"+
+ "\1\327\2\4\1\0\2\4\1\3\4\4\1\0\2\3"+
+ "\4\0\1\137\1\4\1\0\10\4\2\0\1\4\1\137"+
+ "\3\4\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\u0197\1\4\1\0\10\4"+
+ "\2\0\1\4\1\u0197\3\4\10\0\1\4\1\0\14\4"+
+ "\1\0\2\4\31\0\1\u0198\35\0\1\3\4\4\1\0"+
+ "\2\3\4\0\2\4\1\0\10\4\2\0\1\u0199\4\4"+
+ "\10\0\1\4\1\0\14\4\1\0\2\4\1\3\4\4"+
+ "\1\0\2\3\4\0\1\4\1\u0199\1\0\10\4\2\0"+
+ "\5\4\10\0\1\4\1\0\1\4\1\u0199\12\4\1\0"+
+ "\2\4\1\3\4\4\1\0\2\3\4\0\2\4\1\0"+
+ "\1\4\2\u019a\5\4\2\0\5\4\10\0\1\4\1\0"+
+ "\14\4\1\0\2\4\35\0\1\u019b\31\0\1\3\4\4"+
+ "\1\0\2\3\4\0\2\4\1\0\10\4\2\0\4\4"+
+ "\1\u0190\10\0\1\4\1\0\14\4\1\0\2\4\1\3"+
+ "\4\4\1\0\2\3\4\0\1\4\1\232\1\0\10\4"+
+ "\2\0\5\4\10\0\1\4\1\0\1\4\1\232\12\4"+
+ "\1\0\2\4\31\0\1\u019c\63\0\1\u019d\121\0\1\u019e"+
+ "\33\0\1\u019f\112\0\1\u01a0\45\0\1\u01a1\35\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[22000];
+ 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 =
+ "\2\0\4\1\1\11\1\1\1\11\2\1\1\11\16\1"+
+ "\2\11\14\1\1\11\26\1\1\11\6\1\1\0\73\1"+
+ "\2\0\3\1\2\0\1\1\1\0\137\1\2\0\3\1"+
+ "\2\0\100\1\1\0\3\1\1\0\52\1\1\0\1\1"+
+ "\1\0\47\1\1\0\10\1\1\0\3\1\1\0\2\1"+
+ "\6\0\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[417];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public VisualBasicTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "'", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public VisualBasicTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public VisualBasicTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 184) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 5:
+ { addNullToken(); return firstToken;
+ }
+ case 21: break;
+ case 6:
+ { addToken(Token.WHITESPACE);
+ }
+ case 22: break;
+ case 16:
+ { addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 23: break;
+ case 13:
+ { addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 24: break;
+ case 15:
+ { addToken(Token.RESERVED_WORD);
+ }
+ case 25: break;
+ case 9:
+ { addToken(Token.SEPARATOR);
+ }
+ case 26: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 27: break;
+ case 11:
+ { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 28: break;
+ case 7:
+ { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken;
+ }
+ case 29: break;
+ case 1:
+ { addToken(Token.ERROR_IDENTIFIER);
+ }
+ case 30: break;
+ case 17:
+ { addToken(Token.DATA_TYPE);
+ }
+ case 31: break;
+ case 18:
+ { addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 32: break;
+ case 14:
+ { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 33: break;
+ case 19:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos;
+ }
+ case 34: break;
+ case 20:
+ { addToken(Token.RESERVED_WORD_2);
+ }
+ case 35: break;
+ case 12:
+ { addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 36: break;
+ case 8:
+ { start = zzMarkedPos-1; yybegin(EOL_COMMENT);
+ }
+ case 37: break;
+ case 3:
+ { addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 38: break;
+ case 4:
+ { addToken(Token.OPERATOR);
+ }
+ case 39: break;
+ case 10:
+ {
+ }
+ case 40: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken;
+ }
+ case 418: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 419: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java
new file mode 100644
index 0000000..302aa57
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java
@@ -0,0 +1,603 @@
+/*
+ * 03/07/2004
+ *
+ * WindowsBatchTokenMaker.java - Scanner for Windows batch files.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * A token maker that turns text into a linked list of
+ * <code>Token</code>s for syntax highlighting Microsoft
+ * Windows batch files.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class WindowsBatchTokenMaker extends AbstractTokenMaker {
+
+ protected final String operators = "@:*<>=?";
+
+ private int currentTokenStart;
+ private int currentTokenType;
+
+ private boolean bracketVariable; // Whether a variable is of the format %{...}
+
+
+ /**
+ * Constructor.
+ */
+ public WindowsBatchTokenMaker() {
+ super(); // Initializes tokensToHighlight.
+ }
+
+
+ /**
+ * Checks the token to give it the exact ID it deserves before
+ * being passed up to the super method.
+ *
+ * @param segment <code>Segment</code> to get text from.
+ * @param start Start offset in <code>segment</code> of token.
+ * @param end End offset in <code>segment</code> of token.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which the token occurs.
+ */
+ public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
+
+ switch (tokenType) {
+ // Since reserved words, functions, and data types are all passed
+ // into here as "identifiers," we have to see what the token
+ // really is...
+ case Token.IDENTIFIER:
+ int value = wordsToHighlight.get(segment, start,end);
+ if (value!=-1)
+ tokenType = value;
+ break;
+ }
+
+ super.addToken(segment, start, end, tokenType, startOffset);
+
+ }
+
+
+ /**
+ * Returns the text to place at the beginning and end of a
+ * line to "comment" it in a this programming language.
+ *
+ * @return The start and end strings to add to a line to "comment"
+ * it out.
+ */
+ public String[] getLineCommentStartAndEnd() {
+ return new String[] { "rem ", null };
+ }
+
+
+ /**
+ * Returns whether tokens of the specified type should have "mark
+ * occurrences" enabled for the current programming language.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.IDENTIFIER || type==Token.VARIABLE;
+ }
+
+
+ /**
+ * Returns the words to highlight for Windows batch files.
+ *
+ * @return A <code>TokenMap</code> containing the words to highlight for
+ * Windows batch files.
+ * @see org.fife.ui.rsyntaxtextarea.AbstractTokenMaker#getWordsToHighlight
+ */
+ public TokenMap getWordsToHighlight() {
+
+ TokenMap tokenMap = new TokenMap(true); // Ignore case.
+
+ int reservedWord = Token.RESERVED_WORD;
+ tokenMap.put("call", reservedWord);
+ tokenMap.put("choice", reservedWord);
+ tokenMap.put("cls", reservedWord);
+ tokenMap.put("echo", reservedWord);
+ tokenMap.put("exit", reservedWord);
+ tokenMap.put("goto", reservedWord);
+ tokenMap.put("if", reservedWord);
+ tokenMap.put("pause", reservedWord);
+ tokenMap.put("shift", reservedWord);
+ tokenMap.put("start", reservedWord);
+
+ tokenMap.put("ansi.sys", reservedWord);
+ tokenMap.put("append", reservedWord);
+ tokenMap.put("arp", reservedWord);
+ tokenMap.put("assign", reservedWord);
+ tokenMap.put("assoc", reservedWord);
+ tokenMap.put("at", reservedWord);
+ tokenMap.put("attrib", reservedWord);
+ tokenMap.put("break", reservedWord);
+ tokenMap.put("cacls", reservedWord);
+ tokenMap.put("call", reservedWord);
+ tokenMap.put("cd", reservedWord);
+ tokenMap.put("chcp", reservedWord);
+ tokenMap.put("chdir", reservedWord);
+ tokenMap.put("chkdsk", reservedWord);
+ tokenMap.put("chknfts", reservedWord);
+ tokenMap.put("choice", reservedWord);
+ tokenMap.put("cls", reservedWord);
+ tokenMap.put("cmd", reservedWord);
+ tokenMap.put("color", reservedWord);
+ tokenMap.put("comp", reservedWord);
+ tokenMap.put("compact", reservedWord);
+ tokenMap.put("control", reservedWord);
+ tokenMap.put("convert", reservedWord);
+ tokenMap.put("copy", reservedWord);
+ tokenMap.put("ctty", reservedWord);
+ tokenMap.put("date", reservedWord);
+ tokenMap.put("debug", reservedWord);
+ tokenMap.put("defrag", reservedWord);
+ tokenMap.put("del", reservedWord);
+ tokenMap.put("deltree", reservedWord);
+ tokenMap.put("dir", reservedWord);
+ tokenMap.put("diskcomp", reservedWord);
+ tokenMap.put("diskcopy", reservedWord);
+ tokenMap.put("do", reservedWord);
+ tokenMap.put("doskey", reservedWord);
+ tokenMap.put("dosshell", reservedWord);
+ tokenMap.put("drivparm", reservedWord);
+ tokenMap.put("echo", reservedWord);
+ tokenMap.put("edit", reservedWord);
+ tokenMap.put("edlin", reservedWord);
+ tokenMap.put("emm386", reservedWord);
+ tokenMap.put("erase", reservedWord);
+ tokenMap.put("exist", reservedWord);
+ tokenMap.put("exit", reservedWord);
+ tokenMap.put("expand", reservedWord);
+ tokenMap.put("extract", reservedWord);
+ tokenMap.put("fasthelp", reservedWord);
+ tokenMap.put("fc", reservedWord);
+ tokenMap.put("fdisk", reservedWord);
+ tokenMap.put("find", reservedWord);
+ tokenMap.put("for", reservedWord);
+ tokenMap.put("format", reservedWord);
+ tokenMap.put("ftp", reservedWord);
+ tokenMap.put("graftabl", reservedWord);
+ tokenMap.put("help", reservedWord);
+ tokenMap.put("ifshlp.sys", reservedWord);
+ tokenMap.put("in", reservedWord);
+ tokenMap.put("ipconfig", reservedWord);
+ tokenMap.put("keyb", reservedWord);
+ tokenMap.put("label", reservedWord);
+ tokenMap.put("lh", reservedWord);
+ tokenMap.put("loadfix", reservedWord);
+ tokenMap.put("loadhigh", reservedWord);
+ tokenMap.put("lock", reservedWord);
+ tokenMap.put("md", reservedWord);
+ tokenMap.put("mem", reservedWord);
+ tokenMap.put("mkdir", reservedWord);
+ tokenMap.put("mode", reservedWord);
+ tokenMap.put("more", reservedWord);
+ tokenMap.put("move", reservedWord);
+ tokenMap.put("msav", reservedWord);
+ tokenMap.put("msd", reservedWord);
+ tokenMap.put("mscdex", reservedWord);
+ tokenMap.put("nbtstat", reservedWord);
+ tokenMap.put("net", reservedWord);
+ tokenMap.put("netstat", reservedWord);
+ tokenMap.put("nlsfunc", reservedWord);
+ tokenMap.put("not", reservedWord);
+ tokenMap.put("nslookup", reservedWord);
+ tokenMap.put("path", reservedWord);
+ tokenMap.put("pathping", reservedWord);
+ tokenMap.put("pause", reservedWord);
+ tokenMap.put("ping", reservedWord);
+ tokenMap.put("power", reservedWord);
+ tokenMap.put("print", reservedWord);
+ tokenMap.put("prompt", reservedWord);
+ tokenMap.put("qbasic", reservedWord);
+ tokenMap.put("rd", reservedWord);
+ tokenMap.put("ren", reservedWord);
+ tokenMap.put("rename", reservedWord);
+ tokenMap.put("rmdir", reservedWord);
+ tokenMap.put("route", reservedWord);
+ tokenMap.put("sc", reservedWord);
+ tokenMap.put("scandisk", reservedWord);
+ tokenMap.put("scandreg", reservedWord);
+ tokenMap.put("set", reservedWord);
+ tokenMap.put("setx", reservedWord);
+ tokenMap.put("setver", reservedWord);
+ tokenMap.put("share", reservedWord);
+ tokenMap.put("shutdown", reservedWord);
+ tokenMap.put("smartdrv", reservedWord);
+ tokenMap.put("sort", reservedWord);
+ tokenMap.put("subset", reservedWord);
+ tokenMap.put("switches", reservedWord);
+ tokenMap.put("sys", reservedWord);
+ tokenMap.put("time", reservedWord);
+ tokenMap.put("tracert", reservedWord);
+ tokenMap.put("tree", reservedWord);
+ tokenMap.put("type", reservedWord);
+ tokenMap.put("undelete", reservedWord);
+ tokenMap.put("unformat", reservedWord);
+ tokenMap.put("unlock", reservedWord);
+ tokenMap.put("ver", reservedWord);
+ tokenMap.put("verify", reservedWord);
+ tokenMap.put("vol", reservedWord);
+ tokenMap.put("xcopy", reservedWord);
+
+ return tokenMap;
+
+ }
+
+
+ /**
+ * Returns a list of tokens representing the given text.
+ *
+ * @param text The text to break into tokens.
+ * @param startTokenType The token with which to start tokenizing.
+ * @param startOffset The offset at which the line of tokens begins.
+ * @return A linked list of tokens representing <code>text</code>.
+ */
+ public Token getTokenList(Segment text, int startTokenType, final int startOffset) {
+
+ resetTokenList();
+
+ char[] array = text.array;
+ int offset = text.offset;
+ int count = text.count;
+ int end = offset + count;
+
+ // See, when we find a token, its starting position is always of the form:
+ // 'startOffset + (currentTokenStart-offset)'; but since startOffset and
+ // offset are constant, tokens' starting positions become:
+ // 'newStartOffset+currentTokenStart' for one less subtraction operation.
+ int newStartOffset = startOffset - offset;
+
+ currentTokenStart = offset;
+ currentTokenType = startTokenType;
+
+//beginning:
+ for (int i=offset; i<end; i++) {
+
+ char c = array[i];
+
+ switch (currentTokenType) {
+
+ case Token.NULL:
+
+ currentTokenStart = i; // Starting a new token here.
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ currentTokenType = Token.WHITESPACE;
+ break;
+
+ case '"':
+ currentTokenType = Token.ERROR_STRING_DOUBLE;
+ break;
+
+ case '%':
+ currentTokenType = Token.VARIABLE;
+ break;
+
+ // The "separators".
+ case '(':
+ case ')':
+ addToken(text, currentTokenStart,i, Token.SEPARATOR, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+
+ // The "separators2".
+ case ',':
+ case ';':
+ addToken(text, currentTokenStart,i, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+
+ // Newer version of EOL comments, or a label
+ case ':':
+ // If this will be the first token added, it is
+ // a new-style comment or a label
+ if (firstToken==null) {
+ if (i<end-1 && array[i+1]==':') { // new-style comment
+ currentTokenType = Token.COMMENT_EOL;
+ }
+ else { // Label
+ currentTokenType = Token.PREPROCESSOR;
+ }
+ }
+ else { // Just a colon
+ currentTokenType = Token.IDENTIFIER;
+ }
+ break;
+
+ default:
+
+ // Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+ if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+
+ int indexOf = operators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.WHITESPACE:
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ break; // Still whitespace.
+
+ case '"':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.ERROR_STRING_DOUBLE;
+ break;
+
+ case '%':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.VARIABLE;
+ break;
+
+ // The "separators".
+ case '(':
+ case ')':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+
+ // The "separators2".
+ case ',':
+ case ';':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+
+ // Newer version of EOL comments, or a label
+ case ':':
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ // If the previous (whitespace) token was the first token
+ // added, this is a new-style comment or a label
+ if (firstToken.getNextToken()==null) {
+ if (i<end-1 && array[i+1]==':') { // new-style comment
+ currentTokenType = Token.COMMENT_EOL;
+ }
+ else { // Label
+ currentTokenType = Token.PREPROCESSOR;
+ }
+ }
+ else { // Just a colon
+ currentTokenType = Token.IDENTIFIER;
+ }
+ break;
+
+ default: // Add the whitespace token and start anew.
+
+ addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+
+ // Just to speed things up a tad, as this will usually be the case (if spaces above failed).
+ if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+ currentTokenType = Token.IDENTIFIER;
+ break;
+ }
+
+ int indexOf = operators.indexOf(c,0);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i, Token.OPERATOR, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else {
+ currentTokenType = Token.IDENTIFIER;
+ }
+
+ } // End of switch (c).
+
+ break;
+
+ default: // Should never happen
+ case Token.IDENTIFIER:
+
+ switch (c) {
+
+ case ' ':
+ case '\t':
+ // Check for REM comments.
+ if (i-currentTokenStart==3 &&
+ (array[i-3]=='r' || array[i-3]=='R') &&
+ (array[i-2]=='e' || array[i-2]=='E') &&
+ (array[i-1]=='m' || array[i-1]=='M')) {
+ currentTokenType = Token.COMMENT_EOL;
+ break;
+ }
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.WHITESPACE;
+ break;
+
+ case '"':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.ERROR_STRING_DOUBLE;
+ break;
+
+ case '%':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ currentTokenStart = i;
+ currentTokenType = Token.VARIABLE;
+ break;
+
+ // Should be part of identifiers, but not at end of "REM".
+ case '\\':
+ // Check for REM comments.
+ if (i-currentTokenStart==3 &&
+ (array[i-3]=='r' || array[i-3]=='R') &&
+ (array[i-2]=='e' || array[i-2]=='E') &&
+ (array[i-1]=='m' || array[i-1]=='M')) {
+ currentTokenType = Token.COMMENT_EOL;
+ }
+ break;
+
+ case '.':
+ case '_':
+ break; // Characters good for identifiers.
+
+ // The "separators".
+ case '(':
+ case ')':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.SEPARATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+
+ // The "separators2".
+ case ',':
+ case ';':
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.IDENTIFIER, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+
+ default:
+
+ // Just to speed things up a tad, as this will usually be the case.
+ if (RSyntaxUtilities.isLetterOrDigit(c) || c=='\\') {
+ break;
+ }
+
+ int indexOf = operators.indexOf(c);
+ if (indexOf>-1) {
+ addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);
+ addToken(text, i,i, Token.OPERATOR, newStartOffset+i);
+ currentTokenType = Token.NULL;
+ break;
+ }
+
+ // Otherwise, fall through and assume we're still okay as an IDENTIFIER...
+
+ } // End of switch (c).
+
+ break;
+
+ case Token.COMMENT_EOL:
+ i = end - 1;
+ addToken(text, currentTokenStart,i, Token.COMMENT_EOL, newStartOffset+currentTokenStart);
+ // We need to set token type to null so at the bottom we don't add one more token.
+ currentTokenType = Token.NULL;
+ break;
+
+ case Token.PREPROCESSOR: // Used for labels
+ i = end - 1;
+ addToken(text, currentTokenStart,i, Token.PREPROCESSOR, newStartOffset+currentTokenStart);
+ // We need to set token type to null so at the bottom we don't add one more token.
+ currentTokenType = Token.NULL;
+ break;
+
+ case Token.ERROR_STRING_DOUBLE:
+
+ if (c=='"') {
+ addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);
+ currentTokenStart = i + 1;
+ currentTokenType = Token.NULL;
+ }
+ // Otherwise, we're still an unclosed string...
+
+ break;
+
+ case Token.VARIABLE:
+
+ if (i==currentTokenStart+1) { // first character after '%'.
+ bracketVariable = false;
+ switch (c) {
+ case '{':
+ bracketVariable = true;
+ break;
+ default:
+ if (RSyntaxUtilities.isLetter(c) || c==' ') { // No tab, just space; spaces are okay in variable names.
+ break;
+ }
+ else if (RSyntaxUtilities.isDigit(c)) { // Single-digit command-line argument ("%1").
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ break;
+ }
+ else { // Anything else, ???.
+ addToken(text, currentTokenStart,i-1, Token.VARIABLE, newStartOffset+currentTokenStart); // ???
+ i--;
+ currentTokenType = Token.NULL;
+ break;
+ }
+ } // End of switch (c).
+ }
+ else { // Character other than first after the '%'.
+ if (bracketVariable==true) {
+ if (c=='}') {
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ }
+ }
+ else {
+ if (c=='%') {
+ addToken(text, currentTokenStart,i, Token.VARIABLE, newStartOffset+currentTokenStart);
+ currentTokenType = Token.NULL;
+ }
+ }
+ break;
+ }
+ break;
+
+ } // End of switch (currentTokenType).
+
+ } // End of for (int i=offset; i<end; i++).
+
+ // Deal with the (possibly there) last token.
+ if (currentTokenType != Token.NULL) {
+
+ // Check for REM comments.
+ if (end-currentTokenStart==3 &&
+ (array[end-3]=='r' || array[end-3]=='R') &&
+ (array[end-2]=='e' || array[end-2]=='E') &&
+ (array[end-1]=='m' || array[end-1]=='M')) {
+ currentTokenType = Token.COMMENT_EOL;
+ }
+
+ addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);
+ }
+
+ addNullToken();
+
+ // Return the first token in our linked list.
+ return firstToken;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex
new file mode 100644
index 0000000..470eb9c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex
@@ -0,0 +1,485 @@
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+%%
+
+%public
+%class XMLTokenMaker
+%extends AbstractMarkupTokenMaker
+%unicode
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed XML tag; thus a new line is beginning still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed DOCTYPE element.
+ */
+ public static final int INTERNAL_DTD = -4;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed, locally-defined DTD in a DOCTYPE element.
+ */
+ public static final int INTERNAL_DTD_INTERNAL = -5;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed comment. The state to return to when this comment ends is
+ * embedded in the token type as well.
+ */
+ public static final int INTERNAL_IN_XML_COMMENT = -(1<<11);
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * Whether the DTD we're currently in is a locally-defined one. This
+ * field is only valid when in a DOCTYPE element (the <DTD> state).
+ */
+ private boolean inInternalDtd;
+
+ /**
+ * The state we were in prior to the current one. This is used to know
+ * what state to resume after an MLC ends.
+ */
+ private int prevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public XMLTokenMaker() {
+ }
+
+
+ static {
+ completeCloseTags = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected OccurrenceMarker createOccurrenceMarker() {
+ return new XmlOccurrenceMarker();
+ }
+
+
+ /**
+ * Returns whether markup close tags should be completed. For XML, the
+ * default value is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Static version of {@link #getCompleteCloseTags()}. This hack is
+ * unfortunately needed for applications to be able to query this value
+ * without instantiating this class.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public static boolean getCompleteCloseMarkupTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns <code>Token.MARKUP_TAG_NAME</code>.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.MARKUP_TAG_NAME;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ prevState = YYINITIAL;
+ inInternalDtd = false;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case INTERNAL_DTD:
+ state = DTD;
+ break;
+ case INTERNAL_DTD_INTERNAL:
+ state = DTD;
+ inInternalDtd = true;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case Token.MARKUP_PROCESSING_INSTRUCTION:
+ state = PI;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case Token.MARKUP_CDATA:
+ state = CDATA;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_XML_COMMENT:
+ state = COMMENT;
+ break;
+ }
+ prevState = -initialTokenType&0xff;
+ }
+ else { // Shouldn't happen
+ state = Token.NULL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+NameStartChar = ([\:A-Z_a-z])
+NameChar = ({NameStartChar}|[\-\.0-9])
+TagName = ({NameStartChar}{NameChar}*)
+Whitespace = ([ \t\f])
+LineTerminator = ([\n])
+Identifier = ([^ \t\n<&]+)
+EntityReference = ([&][^; \t]*[;]?)
+InTagIdentifier = ([^ \t\n\"\'=\/>]+)
+CDataBegin = ("<![CDATA[")
+CDataEnd = ("]]>")
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ([A-Za-z_0-9\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$A-Za-z0-9])
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+%state COMMENT
+%state PI
+%state DTD
+%state INTAG
+%state INATTR_DOUBLE
+%state INATTR_SINGLE
+%state CDATA
+
+%%
+
+<YYINITIAL> {
+ "<!--" { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT); }
+ {CDataBegin} { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA); }
+ "<!" { start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD); }
+ "<?" { start = zzMarkedPos-2; yybegin(PI); }
+ "<"{TagName} {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ "</"{TagName} {
+ int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ "<" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ "</" { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG); }
+ {LineTerminator} { addNullToken(); return firstToken; }
+ {Identifier} { addToken(Token.IDENTIFIER); }
+ {EntityReference} { addToken(Token.MARKUP_ENTITY_REFERENCE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ <<EOF>> { addNullToken(); return firstToken; }
+}
+
+<COMMENT> {
+ [^hwf\n\-]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos; }
+ [hwf] {}
+ "-->" { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(prevState); }
+ "-" {}
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken; }
+}
+
+<PI> {
+ [^\n\?]+ {}
+ {LineTerminator} { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+ "?>" { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION); }
+ "?" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken; }
+}
+
+<DTD> {
+ [^\n\[\]<>]+ {}
+ "<!--" { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; prevState = zzLexicalState; yybegin(COMMENT); }
+ "<" {}
+ "[" { inInternalDtd = true; }
+ "]" { inInternalDtd = false; }
+ ">" { if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); } }
+ {LineTerminator} |
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken; }
+}
+
+<INTAG> {
+ {InTagIdentifier} { addToken(Token.MARKUP_TAG_ATTRIBUTE); }
+ {Whitespace}+ { addToken(Token.WHITESPACE); }
+ "=" { addToken(Token.OPERATOR); }
+ "/" { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */ }
+ "/>" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ ">" { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER); }
+ [\"] { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE); }
+ [\'] { start = zzMarkedPos-1; yybegin(INATTR_SINGLE); }
+ <<EOF>> { addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken; }
+}
+
+<INATTR_DOUBLE> {
+ [^\"]* {}
+ [\"] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken; }
+}
+
+<INATTR_SINGLE> {
+ [^\']* {}
+ [\'] { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE); }
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken; }
+}
+
+<CDATA> {
+ [^\]]+ {}
+ {CDataEnd} { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER); }
+ "]" {}
+ <<EOF>> { addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken; }
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java
new file mode 100644
index 0000000..edea09e
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/XMLTokenMaker.java
@@ -0,0 +1,992 @@
+/* The following code was generated by JFlex 1.4.1 on 3/22/13 6:51 PM */
+
+/*
+ * 01/24/2005
+ *
+ * XMLTokenMaker.java - Generates tokens for XML syntax highlighting.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.modes;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * Scanner for XML.
+ *
+ * This implementation was created using
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1; however, the generated file
+ * was modified for performance. Memory allocation needs to be almost
+ * completely removed to be competitive with the handwritten lexers (subclasses
+ * of <code>AbstractTokenMaker</code>, so this class has been modified so that
+ * Strings are never allocated (via yytext()), and the scanner never has to
+ * worry about refilling its buffer (needlessly copying chars around).
+ * We can achieve this because RText always scans exactly 1 line of tokens at a
+ * time, and hands the scanner this line as an array of characters (a Segment
+ * really). Since tokens contain pointers to char arrays instead of Strings
+ * holding their contents, there is no need for allocating new memory for
+ * Strings.<p>
+ *
+ * The actual algorithm generated for scanning has, of course, not been
+ * modified.<p>
+ *
+ * If you wish to regenerate this file yourself, keep in mind the following:
+ * <ul>
+ * <li>The generated <code>XMLTokenMaker.java</code> file will contain two
+ * definitions of both <code>zzRefill</code> and <code>yyreset</code>.
+ * You should hand-delete the second of each definition (the ones
+ * generated by the lexer), as these generated methods modify the input
+ * buffer, which we'll never have to do.</li>
+ * <li>You should also change the declaration/definition of zzBuffer to NOT
+ * be initialized. This is a needless memory allocation for us since we
+ * will be pointing the array somewhere else anyway.</li>
+ * <li>You should NOT call <code>yylex()</code> on the generated scanner
+ * directly; rather, you should use <code>getTokenList</code> as you would
+ * with any other <code>TokenMaker</code> instance.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ *
+ */
+
+public class XMLTokenMaker extends AbstractMarkupTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** lexical states */
+ public static final int INTAG = 4;
+ public static final int DTD = 3;
+ public static final int INATTR_DOUBLE = 5;
+ public static final int YYINITIAL = 0;
+ public static final int COMMENT = 1;
+ public static final int CDATA = 7;
+ public static final int INATTR_SINGLE = 6;
+ public static final int PI = 2;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\6\1\4\1\0\1\3\23\0\1\6\1\12\1\11\1\22"+
+ "\1\30\1\22\1\7\1\25\5\22\1\2\1\42\1\24\12\27\1\23"+
+ "\1\10\1\5\1\44\1\21\1\43\1\22\1\16\1\26\1\14\1\15"+
+ "\17\26\1\17\6\26\1\13\1\0\1\20\1\0\1\1\1\0\4\26"+
+ "\1\40\1\35\1\26\1\31\1\36\2\26\1\37\3\26\1\33\2\26"+
+ "\1\34\1\32\2\26\1\41\3\26\3\0\1\22\uff81\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 =
+ "\5\0\2\1\1\0\2\2\1\3\1\4\1\5\1\6"+
+ "\2\1\1\7\4\1\1\10\2\1\1\11\1\1\1\12"+
+ "\1\13\1\14\2\15\1\16\1\17\1\20\1\21\1\22"+
+ "\1\1\1\23\3\1\1\24\1\25\1\4\1\26\1\6"+
+ "\5\0\1\27\4\0\1\30\1\31\5\0\1\32\1\33"+
+ "\3\0\1\34\1\35\6\0\1\36";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[77];
+ 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\45\0\112\0\157\0\224\0\271\0\336\0\u0103"+
+ "\0\u0128\0\u014d\0\u0172\0\u0197\0\u01bc\0\u01e1\0\u0206\0\u022b"+
+ "\0\u0172\0\u0250\0\u0275\0\u029a\0\u02bf\0\u0172\0\u02e4\0\u0309"+
+ "\0\u0172\0\u032e\0\u0172\0\u0172\0\u0172\0\u0353\0\u0378\0\u0172"+
+ "\0\u0172\0\u039d\0\u0172\0\u0172\0\u03c2\0\u0172\0\u03e7\0\u040c"+
+ "\0\u0431\0\u0456\0\u047b\0\u04a0\0\u0172\0\u0172\0\u04c5\0\u04ea"+
+ "\0\u050f\0\u0534\0\u0559\0\u0172\0\u057e\0\u05a3\0\u05c8\0\u05ed"+
+ "\0\u0612\0\u0172\0\u0637\0\u065c\0\u0681\0\u06a6\0\u06cb\0\u0172"+
+ "\0\u0172\0\u06f0\0\u0715\0\u073a\0\u075f\0\u0172\0\u0784\0\u07a9"+
+ "\0\u075f\0\u07ce\0\u07f3\0\u0818\0\u0172";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[77];
+ 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\11\1\12\1\13\1\14\1\15\1\16\35\11\2\17"+
+ "\1\20\1\17\1\21\24\17\1\22\3\17\1\23\3\17"+
+ "\1\24\3\17\4\25\1\26\36\25\1\27\1\25\4\30"+
+ "\1\31\1\32\5\30\1\33\4\30\1\34\1\35\23\30"+
+ "\3\36\1\37\1\0\1\36\1\15\2\36\1\40\7\36"+
+ "\1\41\2\36\1\42\1\43\16\36\1\44\11\45\1\46"+
+ "\33\45\25\47\1\46\17\47\20\50\1\51\24\50\4\11"+
+ "\4\0\40\11\1\12\2\0\1\15\1\0\35\11\46\0"+
+ "\1\52\10\0\1\53\1\0\4\52\3\0\1\52\1\54"+
+ "\1\0\1\52\2\0\11\52\1\0\1\55\4\0\1\15"+
+ "\2\0\1\15\36\0\6\16\1\0\1\16\1\56\34\16"+
+ "\2\17\1\0\1\17\1\0\24\17\1\0\3\17\1\0"+
+ "\3\17\1\0\3\17\2\0\1\57\74\0\1\60\44\0"+
+ "\1\61\3\0\1\62\47\0\1\63\3\0\4\25\1\0"+
+ "\36\25\1\0\1\25\21\0\1\64\23\0\4\30\2\0"+
+ "\5\30\1\0\4\30\2\0\23\30\12\0\1\65\32\0"+
+ "\4\36\1\0\1\36\1\0\2\36\1\0\7\36\1\0"+
+ "\2\36\2\0\16\36\1\0\3\36\1\37\1\0\1\36"+
+ "\1\15\2\36\1\0\7\36\1\0\2\36\2\0\16\36"+
+ "\22\0\1\41\23\0\11\45\1\0\33\45\25\47\1\0"+
+ "\17\47\20\50\1\0\24\50\20\0\1\66\25\0\2\52"+
+ "\11\0\4\52\3\0\1\52\2\0\2\52\1\0\12\52"+
+ "\4\0\1\67\10\0\1\70\32\0\1\71\12\0\4\71"+
+ "\3\0\1\71\2\0\1\71\2\0\11\71\24\0\1\72"+
+ "\55\0\1\73\45\0\1\74\50\0\1\75\46\0\1\76"+
+ "\5\0\1\77\63\0\1\100\25\0\1\101\56\0\1\102"+
+ "\31\0\2\71\11\0\4\71\3\0\1\71\2\0\2\71"+
+ "\1\0\12\71\35\0\1\103\34\0\1\104\61\0\1\74"+
+ "\46\0\1\105\4\0\1\106\57\0\1\107\52\0\1\104"+
+ "\10\0\1\74\34\0\1\110\21\0\2\111\4\0\2\111"+
+ "\1\0\2\111\4\105\1\111\1\0\2\111\1\105\1\111"+
+ "\14\105\3\111\16\0\1\112\52\0\1\105\37\0\1\113"+
+ "\43\0\1\114\41\0\1\115\31\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[2109];
+ 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 =
+ "\5\0\2\1\1\0\2\1\1\11\5\1\1\11\4\1"+
+ "\1\11\2\1\1\11\1\1\3\11\2\1\2\11\1\1"+
+ "\2\11\1\1\1\11\6\1\2\11\5\0\1\11\4\0"+
+ "\1\1\1\11\5\0\2\11\3\0\1\1\1\11\6\0"+
+ "\1\11";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[77];
+ 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[];
+
+ /** 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;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * double-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_DOUBLE = -1;
+
+
+ /**
+ * Type specific to XMLTokenMaker denoting a line ending with an unclosed
+ * single-quote attribute.
+ */
+ public static final int INTERNAL_ATTR_SINGLE = -2;
+
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed XML tag; thus a new line is beginning still inside of the tag.
+ */
+ public static final int INTERNAL_INTAG = -3;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed DOCTYPE element.
+ */
+ public static final int INTERNAL_DTD = -4;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed, locally-defined DTD in a DOCTYPE element.
+ */
+ public static final int INTERNAL_DTD_INTERNAL = -5;
+
+ /**
+ * Token type specific to XMLTokenMaker denoting a line ending with an
+ * unclosed comment. The state to return to when this comment ends is
+ * embedded in the token type as well.
+ */
+ public static final int INTERNAL_IN_XML_COMMENT = -(1<<11);
+
+ /**
+ * Whether closing markup tags are automatically completed for HTML.
+ */
+ private static boolean completeCloseTags;
+
+ /**
+ * Whether the DTD we're currently in is a locally-defined one. This
+ * field is only valid when in a DOCTYPE element (the <DTD> state).
+ */
+ private boolean inInternalDtd;
+
+ /**
+ * The state we were in prior to the current one. This is used to know
+ * what state to resume after an MLC ends.
+ */
+ private int prevState;
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public XMLTokenMaker() {
+ }
+
+
+ static {
+ completeCloseTags = true;
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens as an
+ * "end token;" that is, at <code>zzMarkedPos</code>.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addEndToken(int tokenType) {
+ addToken(zzMarkedPos,zzMarkedPos, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType, int startOffset) {
+ super.addToken(array, start,end, tokenType, startOffset);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected OccurrenceMarker createOccurrenceMarker() {
+ return new XmlOccurrenceMarker();
+ }
+
+
+ /**
+ * Returns whether markup close tags should be completed. For XML, the
+ * default value is <code>true</code>.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public boolean getCompleteCloseTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Static version of {@link #getCompleteCloseTags()}. This hack is
+ * unfortunately needed for applications to be able to query this value
+ * without instantiating this class.
+ *
+ * @return Whether closing markup tags are completed.
+ * @see #setCompleteCloseTags(boolean)
+ */
+ public static boolean getCompleteCloseMarkupTags() {
+ return completeCloseTags;
+ }
+
+
+ /**
+ * Returns <code>Token.MARKUP_TAG_NAME</code>.
+ *
+ * @param type The token type.
+ * @return Whether tokens of this type should have "mark occurrences"
+ * enabled.
+ */
+ public boolean getMarkOccurrencesOfTokenType(int type) {
+ return type==Token.MARKUP_TAG_NAME;
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from <code>text</code>. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * <code>text</code> starts.
+ * @return The first <code>Token</code> in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+ prevState = YYINITIAL;
+ inInternalDtd = false;
+
+ // Start off in the proper state.
+ int state = YYINITIAL;
+ switch (initialTokenType) {
+ case Token.MARKUP_COMMENT:
+ state = COMMENT;
+ break;
+ case INTERNAL_DTD:
+ state = DTD;
+ break;
+ case INTERNAL_DTD_INTERNAL:
+ state = DTD;
+ inInternalDtd = true;
+ break;
+ case INTERNAL_ATTR_DOUBLE:
+ state = INATTR_DOUBLE;
+ break;
+ case INTERNAL_ATTR_SINGLE:
+ state = INATTR_SINGLE;
+ break;
+ case Token.MARKUP_PROCESSING_INSTRUCTION:
+ state = PI;
+ break;
+ case INTERNAL_INTAG:
+ state = INTAG;
+ break;
+ case Token.MARKUP_CDATA:
+ state = CDATA;
+ break;
+ default:
+ if (initialTokenType<-1024) { // INTERNAL_IN_XML_COMMENT - prevState
+ int main = -(-initialTokenType & 0xffffff00);
+ switch (main) {
+ default: // Should never happen
+ case INTERNAL_IN_XML_COMMENT:
+ state = COMMENT;
+ break;
+ }
+ prevState = -initialTokenType&0xff;
+ }
+ else { // Shouldn't happen
+ state = Token.NULL;
+ }
+ }
+
+ start = text.offset;
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new Token();
+ }
+
+ }
+
+
+ /**
+ * Sets whether markup close tags should be completed.
+ *
+ * @param complete Whether closing markup tags are completed.
+ * @see #getCompleteCloseTags()
+ */
+ public static void setCompleteCloseTags(boolean complete) {
+ completeCloseTags = complete;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>true</code> if EOF was reached, otherwise
+ * <code>false</code>.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * 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>YY_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtEOF = false;
+ }
+
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public XMLTokenMaker(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public XMLTokenMaker(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * 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 < 116) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public 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
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public 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()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * 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
+ */
+ public org.fife.ui.rsyntaxtextarea.Token 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;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ 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;
+
+ int 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 25:
+ { int temp = zzMarkedPos; addToken(start,zzStartRead+2, Token.MARKUP_COMMENT); start = temp; yybegin(prevState);
+ }
+ case 31: break;
+ case 19:
+ { yybegin(INTAG); addToken(start,zzStartRead, Token.MARKUP_TAG_ATTRIBUTE_VALUE);
+ }
+ case 32: break;
+ case 3:
+ { addNullToken(); return firstToken;
+ }
+ case 33: break;
+ case 29:
+ { int temp = zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_DTD); start = temp; prevState = zzLexicalState; yybegin(COMMENT);
+ }
+ case 34: break;
+ case 11:
+ { inInternalDtd = false;
+ }
+ case 35: break;
+ case 4:
+ { addToken(Token.MARKUP_TAG_DELIMITER); yybegin(INTAG);
+ }
+ case 36: break;
+ case 24:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead+1, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-2), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ case 37: break;
+ case 9:
+ { addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+ }
+ case 38: break;
+ case 16:
+ { addToken(Token.MARKUP_TAG_DELIMITER); /* Not valid but we'll still accept it */
+ }
+ case 39: break;
+ case 7:
+ { addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+ }
+ case 40: break;
+ case 5:
+ { addToken(Token.WHITESPACE);
+ }
+ case 41: break;
+ case 27:
+ { start = zzStartRead; prevState = zzLexicalState; yybegin(COMMENT);
+ }
+ case 42: break;
+ case 26:
+ { int temp=zzStartRead; yybegin(YYINITIAL); addToken(start,zzStartRead-1, Token.MARKUP_CDATA); addToken(temp,zzMarkedPos-1, Token.MARKUP_CDATA_DELIMITER);
+ }
+ case 43: break;
+ case 6:
+ { addToken(Token.MARKUP_ENTITY_REFERENCE);
+ }
+ case 44: break;
+ case 12:
+ { if (!inInternalDtd) { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.MARKUP_DTD); }
+ }
+ case 45: break;
+ case 2:
+ { addToken(Token.IDENTIFIER);
+ }
+ case 46: break;
+ case 10:
+ { inInternalDtd = true;
+ }
+ case 47: break;
+ case 23:
+ { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.MARKUP_PROCESSING_INSTRUCTION);
+ }
+ case 48: break;
+ case 21:
+ { start = zzMarkedPos-2; inInternalDtd = false; yybegin(DTD);
+ }
+ case 49: break;
+ case 20:
+ { int count = yylength();
+ addToken(zzStartRead,zzStartRead, Token.MARKUP_TAG_DELIMITER);
+ addToken(zzMarkedPos-(count-1), zzMarkedPos-1, Token.MARKUP_TAG_NAME);
+ yybegin(INTAG);
+ }
+ case 50: break;
+ case 22:
+ { start = zzMarkedPos-2; yybegin(PI);
+ }
+ case 51: break;
+ case 8:
+ { addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 52: break;
+ case 14:
+ { start = zzMarkedPos-1; yybegin(INATTR_DOUBLE);
+ }
+ case 53: break;
+ case 28:
+ { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addHyperlinkToken(temp,zzMarkedPos-1, Token.MARKUP_COMMENT); start = zzMarkedPos;
+ }
+ case 54: break;
+ case 15:
+ { yybegin(YYINITIAL); addToken(Token.MARKUP_TAG_DELIMITER);
+ }
+ case 55: break;
+ case 17:
+ { start = zzMarkedPos-1; yybegin(INATTR_SINGLE);
+ }
+ case 56: break;
+ case 18:
+ { addToken(Token.OPERATOR);
+ }
+ case 57: break;
+ case 30:
+ { addToken(Token.MARKUP_CDATA_DELIMITER); start = zzMarkedPos; yybegin(CDATA);
+ }
+ case 58: break;
+ case 13:
+ { addToken(Token.MARKUP_TAG_ATTRIBUTE);
+ }
+ case 59: break;
+ case 1:
+ {
+ }
+ case 60: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case INTAG: {
+ addToken(start,zzStartRead-1, INTERNAL_INTAG); return firstToken;
+ }
+ case 78: break;
+ case DTD: {
+ addToken(start,zzStartRead-1, Token.MARKUP_DTD); addEndToken(inInternalDtd ? INTERNAL_DTD_INTERNAL : INTERNAL_DTD); return firstToken;
+ }
+ case 79: break;
+ case INATTR_DOUBLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_DOUBLE); return firstToken;
+ }
+ case 80: break;
+ case YYINITIAL: {
+ addNullToken(); return firstToken;
+ }
+ case 81: break;
+ case COMMENT: {
+ addToken(start,zzStartRead-1, Token.MARKUP_COMMENT); addEndToken(INTERNAL_IN_XML_COMMENT - prevState); return firstToken;
+ }
+ case 82: break;
+ case CDATA: {
+ addToken(start,zzStartRead-1, Token.MARKUP_CDATA); return firstToken;
+ }
+ case 83: break;
+ case INATTR_SINGLE: {
+ addToken(start,zzStartRead-1, Token.MARKUP_TAG_ATTRIBUTE_VALUE); addEndToken(INTERNAL_ATTR_SINGLE); return firstToken;
+ }
+ case 84: break;
+ case PI: {
+ addToken(start,zzStartRead-1, Token.MARKUP_PROCESSING_INSTRUCTION); return firstToken;
+ }
+ case 85: break;
+ default:
+ return null;
+ }
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/org/fife/ui/rsyntaxtextarea/modes/package.html b/src/org/fife/ui/rsyntaxtextarea/modes/package.html
new file mode 100644
index 0000000..5e78c96
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/modes/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ Scanners that tokenize source in <code>RSyntaxTextArea</code>.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/package.html b/src/org/fife/ui/rsyntaxtextarea/package.html
new file mode 100644
index 0000000..206c591
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ A syntax-highlighting text editor.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java
new file mode 100644
index 0000000..6449aa3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/AbstractParser.java
@@ -0,0 +1,95 @@
+/*
+ * 07/31/2009
+ *
+ * AbstractParser.java - A base implementation for parsers.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * A base class for {@link Parser} implementations. Most <code>Parser</code>s
+ * should be able to extend this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractParser implements Parser {
+
+ /**
+ * Whether this parser is enabled. If this is <code>false</code>, then
+ * this parser will not be run.
+ */
+ private boolean enabled;
+
+ /**
+ * Listens for events from {@link FocusableTip}s generated from this
+ * parser's notices.
+ */
+ private ExtendedHyperlinkListener linkListener;
+
+
+ /**
+ * Constructor.
+ */
+ protected AbstractParser() {
+ setEnabled(true);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public ExtendedHyperlinkListener getHyperlinkListener() {
+ return linkListener;
+ }
+
+
+ /**
+ * Returns <code>null</code>. Parsers that wish to show images in their
+ * tool tips should override this method to return the image base URL.
+ *
+ * @return <code>null</code> always.
+ */
+ public URL getImageBase() {
+ return null;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+
+ /**
+ * Toggles whether this parser is enabled.
+ *
+ * @param enabled Whether this parser is enabled.
+ * @see #isEnabled()
+ */
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+
+ /**
+ * Returns the listener for this parser.
+ *
+ * @param listener The new listener.
+ * @see #getHyperlinkListener()
+ */
+ public void setHyperlinkListener(ExtendedHyperlinkListener listener) {
+ linkListener = listener;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java
new file mode 100644
index 0000000..78beac7
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParseResult.java
@@ -0,0 +1,145 @@
+/*
+ * 07/27/2009
+ *
+ * DefaultParseResult.java - A basic implementation of a ParseResult.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * A basic implementation of {@link ParseResult}. Most, if not all,
+ * <code>Parser</code>s can return instances of this class.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ */
+public class DefaultParseResult implements ParseResult {
+
+ private Parser parser;
+ private int firstLineParsed;
+ private int lastLineParsed;
+ private List notices;
+ private long parseTime;
+ private Exception error;
+
+
+ public DefaultParseResult(Parser parser) {
+ this.parser = parser;
+ notices = new ArrayList();
+ }
+
+
+ /**
+ * Adds a parser notice.
+ *
+ * @param notice The new notice.
+ * @see #clearNotices()
+ */
+ public void addNotice(ParserNotice notice) {
+ notices.add(notice);
+ }
+
+
+ /**
+ * Clears any parser notices in this result.
+ *
+ * @see #addNotice(ParserNotice)
+ */
+ public void clearNotices() {
+ notices.clear();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Exception getError() {
+ return error;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getFirstLineParsed() {
+ return firstLineParsed;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLastLineParsed() {
+ return lastLineParsed;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public List getNotices() {
+ return notices;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getParseTime() {
+ return parseTime;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Parser getParser() {
+ return parser;
+ }
+
+
+ /**
+ * Sets the error that occurred when last parsing the document, if
+ * any.
+ *
+ * @param e The error that occurred, or <code>null</code> if no error
+ * occurred.
+ */
+ public void setError(Exception e) {
+ this.error = e;
+ }
+
+
+ /**
+ * Sets the amount of time it took for this parser to parse the document.
+ *
+ * @param time The amount of time, in milliseconds.
+ * @see #getParseTime()
+ */
+ public void setParseTime(long time) {
+ parseTime = time;
+ }
+
+
+ /**
+ * Sets the line range parsed.
+ *
+ * @param first The first line parsed, inclusive.
+ * @param last The last line parsed, inclusive.
+ * @see #getFirstLineParsed()
+ * @see #getLastLineParsed()
+ */
+ public void setParsedLines(int first, int last) {
+ firstLineParsed = first;
+ lastLineParsed = last;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java
new file mode 100644
index 0000000..ac5a4a8
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/DefaultParserNotice.java
@@ -0,0 +1,268 @@
+/*
+ * 08/11/2009
+ *
+ * DefaultParserNotice.java - Base implementation of a parser notice.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * Base implementation of a parser notice. Most <code>Parser</code>
+ * implementations can return instances of this in their parse result.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Parser
+ * @see ParseResult
+ */
+public class DefaultParserNotice implements ParserNotice {
+
+ private Parser parser;
+ private int level;
+ private int line;
+ private int offset;
+ private int length;
+ private boolean showInEditor;
+ private Color color;
+ private String message;
+ private String toolTipText;
+
+ private static final Color[] DEFAULT_COLORS = {
+ new Color(255, 0, 128), // Error
+ new Color(244, 200, 45), // Warning
+ Color.gray, // Info
+ };
+
+
+ /**
+ * Constructor.
+ *
+ * @param parser The parser that created this notice.
+ * @param msg The text of the message.
+ * @param line The line number for the message.
+ */
+ public DefaultParserNotice(Parser parser, String msg, int line) {
+ this(parser, msg, line, -1, -1);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param parser The parser that created this notice.
+ * @param message The message.
+ * @param line The line number corresponding to the message.
+ * @param offset The offset in the input stream of the code the
+ * message is concerned with, or <code>-1</code> if unknown.
+ * @param length The length of the code the message is concerned with,
+ * or <code>-1</code> if unknown.
+ */
+ public DefaultParserNotice(Parser parser, String message, int line,
+ int offset, int length) {
+ this.parser = parser;
+ this.message = message;
+ this.line = line;
+ this.offset = offset;
+ this.length = length;
+ setLevel(ERROR);
+ setShowInEditor(true);
+ }
+
+
+ /**
+ * Compares this parser notice to another.
+ *
+ * @param obj Another parser notice.
+ * @return How the two parser notices should be sorted relative to one
+ * another.
+ */
+ public int compareTo(Object obj) {
+ int diff = -1;
+ if (obj instanceof ParserNotice) {
+ ParserNotice p2 = (ParserNotice)obj;
+ diff = level - p2.getLevel();
+ if (diff==0) {
+ diff = line - p2.getLine();
+ if (diff==0) {
+ diff = message.compareTo(p2.getMessage());
+ }
+ }
+ }
+ return diff;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean containsPosition(int pos) {
+ return offset<=pos && pos<(offset+length);
+ }
+
+
+ /**
+ * Returns whether this parser notice is equal to another one.
+ *
+ * @param obj Another parser notice.
+ * @return Whether the two notices are equal.
+ */
+ public boolean equals(Object obj) {
+ return compareTo(obj)==0;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Color getColor() {
+ Color c = color; // User-defined
+ if (c==null) {
+ c = DEFAULT_COLORS[getLevel()];
+ }
+ return c;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLength() {
+ return length;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLevel() {
+ return level;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLine() {
+ return line;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getMessage() {
+ return message;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getOffset() {
+ return offset;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Parser getParser() {
+ return parser;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean getShowInEditor() {
+ return showInEditor;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getToolTipText() {
+ return toolTipText!=null ? toolTipText : getMessage();
+ }
+
+
+ /**
+ * Returns the hash code for this notice.
+ *
+ * @return The hash code.
+ */
+ public int hashCode() {
+ return (line<<16) | offset;
+ }
+
+
+ /**
+ * Sets the color to use when painting this notice.
+ *
+ * @param color The color to use.
+ * @see #getColor()
+ */
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+
+ /**
+ * Sets the level of this notice.
+ *
+ * @param level The new level.
+ * @see #getLevel()
+ */
+ public void setLevel(int level) {
+ if (level>INFO) {
+ level = INFO;
+ }
+ else if (level<ERROR) {
+ level = ERROR;
+ }
+ this.level = level;
+ }
+
+
+ /**
+ * Sets whether a squiggle underline should be drawn in the editor for
+ * this notice.
+ *
+ * @param show Whether to draw a squiggle underline.
+ * @see #getShowInEditor()
+ */
+ public void setShowInEditor(boolean show) {
+ showInEditor = show;
+ }
+
+
+ /**
+ * Sets the tooltip text to display for this notice.
+ *
+ * @param text The new tooltip text. This can be HTML. If this is
+ * <code>null</code>, then tooltips will return the same text as
+ * {@link #getMessage()}.
+ * @see #getToolTipText()
+ */
+ public void setToolTipText(String text) {
+ this.toolTipText = text;
+ }
+
+
+ /**
+ * Returns a string representation of this parser notice.
+ *
+ * @return This parser notice as a string.
+ */
+ public String toString() {
+ return "Line " + getLine() + ": " + getMessage();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java b/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java
new file mode 100644
index 0000000..5d62282
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java
@@ -0,0 +1,38 @@
+/*
+ * 07/31/2009
+ *
+ * ExtendedHyeprlinkListener.java - A hyperlink event from a FocusableTip.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.EventListener;
+import javax.swing.event.HyperlinkEvent;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Listens for hyperlink events from {@link FocusableTip}s. In addition to
+ * the link event, the text area that the tip is for is also received, which
+ * allows the listener to modify the displayed content, if desired.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ExtendedHyperlinkListener extends EventListener {
+
+
+ /**
+ * Called when a link in a {@link FocusableTip} is clicked.
+ *
+ * @param textArea The text area displaying the tip.
+ * @param e The event.
+ */
+ public void linkClicked(RSyntaxTextArea textArea, HyperlinkEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java b/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java
new file mode 100644
index 0000000..87fd22c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ParseResult.java
@@ -0,0 +1,84 @@
+/*
+ * 07/27/2009
+ *
+ * ParseResult.java - The result of a Parser parsing some section of an
+ * RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.util.List;
+
+
+/**
+ * The result from a {@link Parser}. This contains the section of lines
+ * parsed and any notices for that section.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParseResult
+ * @see ParserNotice
+ */
+public interface ParseResult {
+
+
+ /**
+ * Returns an error that occurred while parsing the document, if any.
+ *
+ * @return The error, or <code>null</code> if the document was
+ * successfully parsed.
+ */
+ public Exception getError();
+
+
+ /**
+ * Returns the first line parsed. All parser implementations should
+ * currently set this to <code>0</code> and parse the entire document.
+ *
+ * @return The first line parsed.
+ * @see #getLastLineParsed()
+ */
+ public int getFirstLineParsed();
+
+
+ /**
+ * Returns the first line parsed. All parser implementations should
+ * currently set this to the document's line count and parse the entire
+ * document.
+ *
+ * @return The last line parsed.
+ * @see #getFirstLineParsed()
+ */
+ public int getLastLineParsed();
+
+
+ /**
+ * Returns the notices for the parsed section.
+ *
+ * @return A list of {@link ParserNotice}s.
+ */
+ public List getNotices();
+
+
+ /**
+ * Returns the parser that generated these notices.
+ *
+ * @return The parser.
+ */
+ public Parser getParser();
+
+
+ /**
+ * Returns the amount of time this parser took to parse the specified
+ * range of text. This is an optional operation; parsers are permitted
+ * to return <code>0</code> for this value.
+ *
+ * @return The parse time, in milliseconds, or <code>0</code> if the
+ * parse time was not recorded.
+ */
+ public long getParseTime();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java b/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java
new file mode 100644
index 0000000..ee6d9e1
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/Parser.java
@@ -0,0 +1,76 @@
+/*
+ * 09/23/2005
+ *
+ * Parser.java - An interface for a parser for RSyntaxTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * An interface for a parser for content in an {@link RSyntaxTextArea}.
+ * A <code>Parser</code> returns a list of issues it finds in the text area's
+ * content, which the text area can flag (e.g. squiggle underline). It can
+ * also return descriptions of the issues, to be used in tool tips.<p>
+ *
+ * To install a <code>Parser</code>, simply call
+ * {@link RSyntaxTextArea#addParser(Parser)}.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ * @see AbstractParser
+ */
+public interface Parser {
+
+
+ /**
+ * Returns the listener for hyperlink events from {@link FocusableTip}s,
+ * or <code>null</code> if none.
+ *
+ * @return The listener.
+ */
+ public ExtendedHyperlinkListener getHyperlinkListener();
+
+
+ /**
+ * Returns the base URL for any images displayed in returned
+ * {@link ParserNotice} HTML text. Note that if a parser notice's text
+ * is not HTML, this URL is not used.
+ *
+ * @return The URL. This may be <code>null</code>.
+ */
+ public URL getImageBase();
+
+
+ /**
+ * Returns whether this parser is enabled. If this returns
+ * <code>false</code>, it will not be run.
+ *
+ * @return Whether this parser is enabled.
+ */
+ public boolean isEnabled();
+
+
+ /**
+ * Parses input from the specified document.
+ *
+ * @param doc The document to parse. This document is in a read lock,
+ * so it cannot be modified while parsing is occurring.
+ * @param style The language being rendered, such as
+ * {@link SyntaxConstants#SYNTAX_STYLE_JAVA}.
+ * @return An object describing the section of the document parsed and the
+ * results. This is guaranteed to be non-<code>null</code>.
+ */
+ public ParseResult parse(RSyntaxDocument doc, String style);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java b/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java
new file mode 100644
index 0000000..06da722
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ParserNotice.java
@@ -0,0 +1,130 @@
+/*
+ * 09/23/2005
+ *
+ * ParserNotice.java - A notice (i.e, and error or warning) from a parser.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+
+
+/**
+ * A notice (e.g., a warning or error) from a parser.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see DefaultParserNotice
+ */
+public interface ParserNotice extends Comparable {
+
+ /**
+ * Indicates an info notice.
+ */
+ public static final int INFO = 2;
+
+ /**
+ * Indicates a warning notice.
+ */
+ public static final int WARNING = 1;
+
+ /**
+ * Indicates an error notice.
+ */
+ public static final int ERROR = 0;
+
+
+ /**
+ * Returns whether this parser notice contains the specified location
+ * in the document.
+ *
+ * @param pos The position in the document.
+ * @return Whether the position is contained. This will always return
+ * <code>false</code> if {@link #getOffset()} returns
+ * <code>-1</code>.
+ */
+ public boolean containsPosition(int pos);
+
+
+ /**
+ * Returns the color to use when painting this notice.
+ *
+ * @return The color.
+ */
+ public Color getColor();
+
+
+ /**
+ * Returns the length of the code the message is concerned with.
+ *
+ * @return The length of the code the message is concerned with, or
+ * <code>-1</code> if unknown.
+ * @see #getOffset()
+ * @see #getLine()
+ */
+ public int getLength();
+
+
+ /**
+ * Returns the level of this notice.
+ *
+ * @return One of {@link #INFO}, {@link #WARNING} OR {@link #ERROR}.
+ */
+ public int getLevel();
+
+
+ /**
+ * Returns the line number the notice is about.
+ *
+ * @return The line number.
+ */
+ public int getLine();
+
+
+ /**
+ * Returns the message from the parser.
+ *
+ * @return The message from the parser.
+ */
+ public String getMessage();
+
+
+ /**
+ * Returns the offset of the code the message is concerned with.
+ *
+ * @return The offset, or <code>-1</code> if unknown.
+ * @see #getLength()
+ * @see #getLine()
+ */
+ public int getOffset();
+
+
+ /**
+ * Returns the parser that created this message.
+ *
+ * @return The parser.
+ */
+ public Parser getParser();
+
+
+ /**
+ * Whether a squiggle underline should be drawn in the editor for this
+ * notice.
+ *
+ * @return Whether a squiggle underline should be drawn.
+ */
+ public boolean getShowInEditor();
+
+
+ /**
+ * Returns the tooltip text to display for this notice.
+ *
+ * @return The tool tip text. If none has been explicitly set, this
+ * method returns the same text as {@link #getMessage()}.
+ */
+ public String getToolTipText();
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java
new file mode 100644
index 0000000..bdad145
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/TaskTagParser.java
@@ -0,0 +1,158 @@
+/*
+ * 08/11/2009
+ *
+ * TaskTagParser.java - Parser that scans code comments for task tags.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.awt.Color;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.ErrorStrip;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
+import org.fife.ui.rsyntaxtextarea.Token;
+
+
+/**
+ * Parser that identifies "task tags," such as "<code>TODO</code>",
+ * "<code>FIXME</code>", etc. in source code comments.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class TaskTagParser extends AbstractParser {
+
+ private DefaultParseResult result;
+ private String DEFAULT_TASK_PATTERN = "TODO|FIXME|HACK";
+ private Pattern taskPattern;
+
+ private static final Color COLOR = new Color(48, 150, 252);
+
+
+ /**
+ * Creates a new task parser. The default parser treats the following
+ * identifiers in comments as task definitions: "<code>TODO</code>",
+ * "<code>FIXME</code>", and "<code>HACK</code>".
+ */
+ public TaskTagParser() {
+ result = new DefaultParseResult(this);
+ setTaskPattern(DEFAULT_TASK_PATTERN);
+ }
+
+
+ /**
+ * Returns the regular expression used to search for tasks.
+ *
+ * @return The regular expression. This may be <code>null</code> if no
+ * regular expression was specified (or an empty string was
+ * specified).
+ * @see #setTaskPattern(String)
+ */
+ public String getTaskPattern() {
+ return taskPattern==null ? null : taskPattern.pattern();
+ }
+
+
+ public ParseResult parse(RSyntaxDocument doc, String style) {
+
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+
+ if (taskPattern==null ||
+ style==null || SyntaxConstants.SYNTAX_STYLE_NONE.equals(style)){
+ result.clearNotices();
+ result.setParsedLines(0, lineCount-1);
+ return result;
+ }
+
+ // TODO: Pass in parsed line range and just do that
+ result.clearNotices();
+ result.setParsedLines(0, lineCount-1);
+
+ for (int line=0; line<lineCount; line++) {
+
+ Token t = doc.getTokenListForLine(line);
+ int offs = -1;
+ int start = -1;
+ String text = null;
+
+ while (t!=null && t.isPaintable()) {
+ if (t.isComment()) {
+
+ offs = t.offset;
+ text = t.getLexeme();
+
+ Matcher m = taskPattern.matcher(text);
+ if (m.find()) {
+ start = m.start();
+ offs += start;
+ break;
+ }
+
+ }
+ t = t.getNextToken();
+ }
+
+ if (start>-1) {
+ text = text.substring(start);
+ // TODO: Strip off end of MLC's if they're there.
+ int len = text.length();
+ TaskNotice pn = new TaskNotice(this, text, line, offs, len);
+ pn.setLevel(ParserNotice.INFO);
+ pn.setShowInEditor(false);
+ pn.setColor(COLOR);
+ result.addNotice(pn);
+ }
+
+ }
+
+ return result;
+
+ }
+
+
+ /**
+ * Sets the pattern of task identifiers. You will usually want this to be
+ * a list of words "or'ed" together, such as
+ * "<code>TODO|FIXME|HACK|REMIND</code>".
+ *
+ * @param pattern The pattern. A value of <code>null</code> or an
+ * empty string effectively disables task parsing.
+ * @throws PatternSyntaxException If <code>pattern</code> is an invalid
+ * regular expression.
+ * @see #getTaskPattern()
+ */
+ public void setTaskPattern(String pattern) throws PatternSyntaxException {
+ if (pattern==null || pattern.length()==0) {
+ taskPattern = null;
+ }
+ else {
+ taskPattern = Pattern.compile(pattern);
+ }
+ }
+
+
+ /**
+ * A parser notice that signifies a task. This class is here so we can
+ * treat tasks specially and show them in the {@link ErrorStrip} even
+ * though they are <code>INFO</code>-level and marked as "don't show in
+ * editor."
+ */
+ public static class TaskNotice extends DefaultParserNotice {
+
+ public TaskNotice(Parser parser, String message, int line, int offs,
+ int length) {
+ super(parser, message, line, offs, length);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java b/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java
new file mode 100644
index 0000000..7aca2f3
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/ToolTipInfo.java
@@ -0,0 +1,95 @@
+/*
+ * 07/29/2009
+ *
+ * ToolTipInfo.java - A tool tip's text and hyperlink listener.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.net.URL;
+import javax.swing.event.HyperlinkListener;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip;
+
+
+/**
+ * Wrapper for a tool tip and a listener for hyperlink events in the tool
+ * tip (assuming the tip is HTML). If the {@link RSyntaxTextArea} instance
+ * has {@link FocusableTip}s enabled, and the user clicks on a hyperlink in
+ * the tool tip, the specified {@link HyperlinkListener} will be called.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class ToolTipInfo {
+
+ private String text;
+ private HyperlinkListener listener;
+ private URL imageBase;
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The tool tip text, or <code>null</code> for none.
+ * @param listener The hyperlink listener, or <code>null</code> for none.
+ */
+ public ToolTipInfo(String text, HyperlinkListener listener) {
+ this(text, listener, null);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The tool tip text, or <code>null</code> for none.
+ * @param l The hyperlink listener, or <code>null</code> for none.
+ * @param imageBase The base URL for images in the HTML <code>text</code>,
+ * or <code>null</code> for the default.
+ */
+ public ToolTipInfo(String text, HyperlinkListener l, URL imageBase) {
+ this.text = text;
+ this.listener = l;
+ this.imageBase = imageBase;
+ }
+
+
+ /**
+ * Returns the listener to call when hyperlinks are clicked in the tool
+ * tip.
+ *
+ * @return The listener, or <code>null</code> for none.
+ */
+ public HyperlinkListener getHyperlinkListener() {
+ return listener;
+ }
+
+
+ /**
+ * Returns the base URL that any images in the HTML tool tip live in.
+ * This allows you to reference images in a jar file in your
+ * {@link FocusableTip}s.
+ * Note that if what {@link #getToolTipText()} returns isn't HTML, this
+ * value is effectively ignored.
+ *
+ * @return The image base, or <code>null</code> for the default.
+ */
+ public URL getImageBase() {
+ return imageBase;
+ }
+
+
+ /**
+ * Returns the tool tip text to display.
+ *
+ * @return The tool tip text, or <code>null</code> for none.
+ */
+ public String getToolTipText() {
+ return text;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java b/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java
new file mode 100644
index 0000000..7ac405b
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/XmlParser.java
@@ -0,0 +1,229 @@
+/*
+ * 08/16/2008
+ *
+ * XMLParser.java - Simple XML parser.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.parser;
+
+import java.io.IOException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+import org.fife.io.DocumentReader;
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+
+
+/**
+ * A parser for XML documents. Adds squiggle underlines for any XML errors
+ * found (though most XML parsers don't really have error recovery and so only
+ * can find one error at a time).<p>
+ *
+ * This class isn't actually used by RSyntaxTextArea anywhere, but you can
+ * install and use it yourself. Doing so is as simple as:
+ *
+ * <pre>
+ * XmlParser xmlParser = new XmlParser();
+ * textArea.addParser(xmlParser);
+ * </pre>
+ *
+ * To support DTD validation, specify an entity resolver when creating the
+ * parser, and enable validation like so:
+ *
+ * <pre>
+ * XmlParser xmlParser = new XmlParser(new MyEntityResolver());
+ * xmlParser.setValidating(true);
+ * textArea.addParser(xmlParser);
+ * </pre>
+ *
+ * Also note that a single instance of this class can be installed on
+ * multiple instances of <code>RSyntaxTextArea</code>.<p>
+ *
+ * For a more complete XML parsing solution, see the
+ * <a href="http://svn.fifesoft.com/viewvc-1.0.5/bin/cgi/viewvc.cgi/RSTALanguageSupport/trunk/?root=RSyntaxTextArea">RSTALanguageSupport
+ * project</a>'s <code>XmlLanguageSupport</code> class.
+ *
+ * @author Robert Futrell
+ * @version 1.1
+ */
+public class XmlParser extends AbstractParser {
+
+ private SAXParserFactory spf;
+ private DefaultParseResult result;
+ private EntityResolver entityResolver;
+
+
+ public XmlParser() {
+ this(null);
+ }
+
+
+ /**
+ * Constructor allowing DTD validation of documents.
+ *
+ * @param resolver An entity resolver to use if validation is enabled.
+ * @see #setValidating(boolean)
+ */
+ public XmlParser(EntityResolver resolver) {
+ this.entityResolver = resolver;
+ result = new DefaultParseResult(this);
+ try {
+ spf = SAXParserFactory.newInstance();
+ } catch (FactoryConfigurationError fce) {
+ fce.printStackTrace();
+ }
+ }
+
+
+ /**
+ * Returns whether this parser does DTD validation.
+ *
+ * @return Whether this parser does DTD validation.
+ * @see #setValidating(boolean)
+ */
+ public boolean isValidating() {
+ return spf.isValidating();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public ParseResult parse(RSyntaxDocument doc, String style) {
+
+ result.clearNotices();
+ Element root = doc.getDefaultRootElement();
+ result.setParsedLines(0, root.getElementCount()-1);
+
+ if (spf==null || doc.getLength()==0) {
+ return result;
+ }
+
+ try {
+ SAXParser sp = spf.newSAXParser();
+ Handler handler = new Handler(doc);
+ DocumentReader r = new DocumentReader(doc);
+ InputSource input = new InputSource(r);
+ sp.parse(input, handler);
+ r.close();
+ } catch (SAXParseException spe) {
+ // A fatal parse error - ignore; a ParserNotice was already created.
+ } catch (Exception e) {
+ //e.printStackTrace(); // Will print if DTD specified and can't be found
+ result.addNotice(new DefaultParserNotice(this,
+ "Error parsing XML: " + e.getMessage(), 0, -1, -1));
+ }
+
+ return result;
+
+ }
+
+
+ /**
+ * Sets whether this parser will use DTD validation if required.
+ *
+ * @param validating Whether DTD validation should be enabled. If this is
+ * <code>true</code>, documents must specify a DOCTYPE, and you
+ * should have used the constructor specifying an entity resolver.
+ * @see #isValidating()
+ */
+ public void setValidating(boolean validating) {
+ spf.setValidating(validating);
+ }
+
+/*
+ public static void main(String[] args) {
+ javax.swing.JFrame frame = new javax.swing.JFrame();
+ org.fife.ui.rsyntaxtextarea.RSyntaxTextArea textArea = new
+ org.fife.ui.rsyntaxtextarea.RSyntaxTextArea(25, 40);
+ textArea.setSyntaxEditingStyle("text/xml");
+ XmlParser parser = new XmlParser(new EntityResolver() {
+ public InputSource resolveEntity(String publicId, String systemId)
+ throws SAXException, IOException {
+ if ("http://fifesoft.com/rsyntaxtextarea/theme.dtd".equals(systemId)) {
+ return new org.xml.sax.InputSource(getClass().getResourceAsStream("/theme.dtd"));
+ }
+ return null;
+ }
+ });
+ parser.setValidating(true);
+ textArea.addParser(parser);
+ try {
+ textArea.read(new java.io.BufferedReader(new java.io.FileReader("C:/temp/test.xml")), null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ frame.setContentPane(new org.fife.ui.rtextarea.RTextScrollPane(textArea));
+ frame.pack();
+ frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
+ frame.setVisible(true);
+ }
+*/
+
+ /**
+ * Callback notified when errors are found in the XML document. Adds a
+ * notice to be squiggle-underlined.
+ */
+ private class Handler extends DefaultHandler {
+
+ private Document doc;
+
+ private Handler(Document doc) {
+ this.doc = doc;
+ }
+
+ private void doError(SAXParseException e, int level) {
+ int line = e.getLineNumber() - 1;
+ Element root = doc.getDefaultRootElement();
+ Element elem = root.getElement(line);
+ int offs = elem.getStartOffset();
+ int len = elem.getEndOffset() - offs;
+ if (line==root.getElementCount()-1) {
+ len++;
+ }
+ DefaultParserNotice pn = new DefaultParserNotice(XmlParser.this,
+ e.getMessage(), line, offs, len);
+ pn.setLevel(level);
+ result.addNotice(pn);
+ }
+
+ public void error(SAXParseException e) {
+ doError(e, ParserNotice.ERROR);
+ }
+
+ public void fatalError(SAXParseException e) {
+ doError(e, ParserNotice.ERROR);
+ }
+
+ // NOTE: If you compile with Java 5+, you must add IOException to the
+ // throws clause of this method. The "official" release is built with
+ // Java 1.4.
+ public InputSource resolveEntity(String publicId, String systemId)
+ throws SAXException {
+ if (entityResolver!=null) {
+ try {
+ return entityResolver.resolveEntity(publicId, systemId);
+ } catch (IOException ioe) {
+ // TODO: Remove when removing 1.4.2-compatibility, as
+ // IOExceptions are thrown then
+ ioe.printStackTrace();
+ }
+ }
+ return super.resolveEntity(publicId, systemId);
+ }
+
+ public void warning(SAXParseException e) {
+ doError(e, ParserNotice.WARNING);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/parser/package.html b/src/org/fife/ui/rsyntaxtextarea/parser/package.html
new file mode 100644
index 0000000..9cc6c02
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/parser/package.html
@@ -0,0 +1,9 @@
+<html>
+ <body>
+ Interfaces for parsing text in RSyntaxTextAreas and identifying errors,
+ warnings, etc. Implementations of the <code>Parser</code> interface
+ are notified when the document has been modified, so they can add
+ squiggle-underline markers to instances of RSTA to signify code errors and
+ other important snippets.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java
new file mode 100644
index 0000000..48080cb
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java
@@ -0,0 +1,132 @@
+/*
+ * 12/01/2008
+ *
+ * AbstractCodeTemplate.java - Base class for code templates.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+
+/**
+ * A base class to build code templates on top of.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public abstract class AbstractCodeTemplate implements CodeTemplate {
+
+ /**
+ * The ID of this template.
+ */
+ private String id;
+
+
+ /**
+ * This no-arg constructor is required for serialization purposes.
+ */
+ public AbstractCodeTemplate() {
+ }
+
+
+ /**
+ * Creates a new template.
+ *
+ * @param id The ID for this template.
+ * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+ */
+ public AbstractCodeTemplate(String id) {
+ setID(id);
+ }
+
+
+ /**
+ * Creates a deep copy of this template.
+ *
+ * @return A deep copy of this template.
+ */
+ public Object clone() {
+ // This method can't be abstract as compilers don't like concrete
+ // subclassses calling super.clone() on an abstract super.
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new InternalError(
+ "CodeTemplate implementation not Cloneable: " +
+ getClass().getName());
+ }
+ }
+
+
+
+ /**
+ * Compares the <code>StaticCodeTemplate</code> to another.
+ *
+ * @param o Another <code>StaticCodeTemplate</code> object.
+ * @return A negative integer, zero, or a positive integer as this
+ * object is less than, equal-to, or greater than the passed-in
+ * object.
+ * @throws ClassCastException If <code>o</code> is
+ * not an instance of <code>CodeTemplate</code>.
+ */
+ public int compareTo(Object o) {
+ if (!(o instanceof CodeTemplate)) {
+ return -1;
+ }
+ CodeTemplate t2 = (CodeTemplate)o;
+ return getID().compareTo(t2.getID());
+ }
+
+
+ /**
+ * Overridden to return "<code>true</code>" iff {@link #compareTo(Object)}
+ * returns <code>0</code>.
+ *
+ * @return Whether this code template is equal to another.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof CodeTemplate) {
+ return compareTo(obj)==0;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the ID of this code template.
+ *
+ * @return The template's ID.
+ * @see #setID(String)
+ */
+ public String getID() {
+ return id;
+ }
+
+
+ /**
+ * Returns the hash code for this template.
+ *
+ * @return The hash code for this template.
+ */
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+
+ /**
+ * Sets the ID for this template.
+ *
+ * @param id The ID for this template.
+ * @throws IllegalArgumentException If <code>id</code> is <code>null</code>.
+ * @see #getID()
+ */
+ public void setID(String id) {
+ if (id==null) {
+ throw new IllegalArgumentException("id cannot be null");
+ }
+ this.id = id;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java
new file mode 100644
index 0000000..7295e04
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/CodeTemplate.java
@@ -0,0 +1,73 @@
+/*
+ * 11/29/2008
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.Serializable;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+
+
+/**
+ * A "code template" is a kind of macro for commonly-typed code. It
+ * associates a short identifier with a longer code snippet, then when the
+ * code template is enabled and the short identifier is typed, it is
+ * replaced with the longer code snippet.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ * for (<caret>) {
+ *
+ * }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>. Further,
+ * the caret is placed at the position denoted by <code><caret></code>.<p>
+ *
+ * Static text replacements are done with {@link StaticCodeTemplate}. Dynamic
+ * templates can also be created and used.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see StaticCodeTemplate
+ */
+public interface CodeTemplate extends Cloneable, Comparable, Serializable {
+
+
+ /**
+ * Creates a deep copy of this template.
+ *
+ * @return A deep copy of this template.
+ */
+ public Object clone();
+
+
+ /**
+ * Returns the ID of this code template.
+ *
+ * @return The template's ID.
+ */
+ public String getID();
+
+
+ /**
+ * Invokes this code template. The changes are made to the given text
+ * area.
+ *
+ * @param textArea The text area to operate on.
+ * @throws BadLocationException If something bad happens.
+ */
+ public void invoke(RSyntaxTextArea textArea) throws BadLocationException;
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java b/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java
new file mode 100644
index 0000000..c3b21d9
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java
@@ -0,0 +1,262 @@
+/*
+ * 02/21/2005
+ *
+ * CodeTemplate.java - A "template" (macro) for commonly-typed code.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rsyntaxtextarea.templates;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Element;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * A code template that inserts static text before and after the caret.<p>
+ *
+ * For example, you can associate the identifier <code>forb</code>
+ * (short for "for-block") with the following code:<p>
+ *
+ * <pre>
+ * for (<caret>) {
+ *
+ * }
+ * </pre>
+ *
+ * Then, whenever you type <code>forb</code> followed by a trigger
+ * (e.g., a space) into a text area with this <code>CodeTemplate</code>,
+ * the code snippet is added in place of <code>forb</code>. Further,
+ * the caret is placed at the position denoted by <code><caret></code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see CodeTemplate
+ */
+public class StaticCodeTemplate extends AbstractCodeTemplate {
+
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The code inserted before the caret position.
+ */
+ private String beforeCaret;
+
+ /**
+ * The code inserted after the caret position.
+ */
+ private String afterCaret;
+
+ /**
+ * Cached value representing whether <code>beforeCaret</code> contains
+ * one or more newlines.
+ */
+ private transient int firstBeforeNewline;
+
+ /**
+ * Cached value representing whether <code>afterCaret</code> contains
+ * one or more newlines.
+ */
+ private transient int firstAfterNewline;
+
+ private static final String EMPTY_STRING = "";
+
+
+ /**
+ * Constructor. This constructor only exists to support persistance
+ * through serialization.
+ */
+ public StaticCodeTemplate() {
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param id The ID of this code template.
+ * @param beforeCaret The text to place before the caret.
+ * @param afterCaret The text to place after the caret.
+ */
+ public StaticCodeTemplate(String id, String beforeCaret, String afterCaret){
+ super(id);
+ setBeforeCaretText(beforeCaret);
+ setAfterCaretText(afterCaret);
+ }
+
+
+ /**
+ * Returns the text that will be placed after the caret.
+ *
+ * @return The text.
+ * @see #setAfterCaretText
+ */
+ public String getAfterCaretText() {
+ return afterCaret;
+ }
+
+
+ /**
+ * Returns the text that will be placed before the caret.
+ *
+ * @return The text.
+ * @see #setBeforeCaretText
+ */
+ public String getBeforeCaretText() {
+ return beforeCaret;
+ }
+
+
+ /**
+ * Returns the "after caret" text, with each new line indented by
+ * the specified amount.
+ *
+ * @param indent The amount to indent.
+ * @return The "after caret" text.
+ */
+ private String getAfterTextIndented(String indent) {
+ return getTextIndented(getAfterCaretText(), firstAfterNewline, indent);
+ }
+
+
+ /**
+ * Returns the "before caret" text, with each new line indented by
+ * the specified amount.
+ *
+ * @param indent The amount to indent.
+ * @return The "before caret" text.
+ */
+ private String getBeforeTextIndented(String indent) {
+ return getTextIndented(getBeforeCaretText(),firstBeforeNewline,indent);
+ }
+
+
+ /**
+ * Returns text with newlines indented by the specifed amount.
+ *
+ * @param text The original text.
+ * @param firstNewline The index of the first '\n' character.
+ * @param indent The amount to indent.
+ * @return The indented text.
+ */
+ private String getTextIndented(String text,int firstNewline,String indent) {
+ if (firstNewline==-1) {
+ return text;
+ }
+ int pos = 0;
+ int old = firstNewline+1;
+ StringBuffer sb = new StringBuffer(text.substring(0, old));
+ sb.append(indent);
+ while ((pos=text.indexOf('\n', old))>-1) {
+ sb.append(text.substring(old, pos+1));
+ sb.append(indent);
+ old = pos+1;
+ }
+ if (old<text.length()) {
+ sb.append(text.substring(old));
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Invokes this code template. The changes are made to the given text
+ * area.
+ *
+ * @param textArea The text area to operate on.
+ * @throws BadLocationException If something bad happens.
+ */
+ public void invoke(RSyntaxTextArea textArea) throws BadLocationException {
+
+ Caret c = textArea.getCaret();
+ int dot = c.getDot();
+ int mark = c.getMark();
+ int p0 = Math.min(dot, mark);
+ int p1 = Math.max(dot, mark);
+ RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument();
+ Element map = doc.getDefaultRootElement();
+
+ int lineNum = map.getElementIndex(dot);
+ Element line = map.getElement(lineNum);
+ int start = line.getStartOffset();
+ int end = line.getEndOffset()-1; // Why always "-1"?
+ String s = textArea.getText(start,end-start);
+ int len = s.length();
+
+ // endWS is the end of the leading whitespace
+ // of the current line.
+ int endWS = 0;
+ while (endWS<len && RSyntaxUtilities.isWhitespace(s.charAt(endWS))) {
+ endWS++;
+ }
+ s = s.substring(0, endWS);
+ p0 -= getID().length();
+ String beforeText = getBeforeTextIndented(s);
+ String afterText = getAfterTextIndented(s);
+ doc.replace(p0,p1-p0, beforeText+afterText, null);
+ textArea.setCaretPosition(p0+beforeText.length());
+
+ }
+
+
+ /**
+ * Called when reading a serialized version of this document. This is
+ * overridden to initialize the transient members of this class.
+ *
+ * @param in The input stream to read from.
+ * @throws ClassNotFoundException Never.
+ * @throws IOException If an IO error occurs.
+ */
+ private void readObject(ObjectInputStream in) throws ClassNotFoundException,
+ IOException {
+ in.defaultReadObject();
+ // "Resetting" before and after text to the same values will replace
+ // nulls with empty srings, and set transient "first*Newline" values.
+ setBeforeCaretText(this.beforeCaret);
+ setAfterCaretText(this.afterCaret);
+ }
+
+
+ /**
+ * Sets the text to place after the caret.
+ *
+ * @param afterCaret The text.
+ * @see #getAfterCaretText()
+ */
+ public void setAfterCaretText(String afterCaret) {
+ this.afterCaret = afterCaret==null ? EMPTY_STRING : afterCaret;
+ firstAfterNewline = this.afterCaret.indexOf('\n');
+ }
+
+
+ /**
+ * Sets the text to place before the caret.
+ *
+ * @param beforeCaret The text.
+ * @see #getBeforeCaretText()
+ */
+ public void setBeforeCaretText(String beforeCaret) {
+ this.beforeCaret = beforeCaret==null ? EMPTY_STRING : beforeCaret;
+ firstBeforeNewline = this.beforeCaret.indexOf('\n');
+ }
+
+
+ /**
+ * Returns a string representation of this template for debugging
+ * purposes.
+ *
+ * @return A string representation of this template.
+ */
+ public String toString() {
+ return "[StaticCodeTemplate: id=" + getID() +
+ ", text=" + getBeforeCaretText() + "|" + getAfterCaretText() + "]";
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rsyntaxtextarea/templates/package.html b/src/org/fife/ui/rsyntaxtextarea/templates/package.html
new file mode 100644
index 0000000..afa3a6c
--- /dev/null
+++ b/src/org/fife/ui/rsyntaxtextarea/templates/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ Facilitates adding code templates to an <code>RSyntaxTextArea</code>.
+ </body>
+</html>
diff --git a/src/org/fife/ui/rtextarea/AbstractGutterComponent.java b/src/org/fife/ui/rtextarea/AbstractGutterComponent.java
new file mode 100644
index 0000000..33283b0
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/AbstractGutterComponent.java
@@ -0,0 +1,114 @@
+/*
+ * 02/17/2009
+ *
+ * AbstractGutterComponent.java - A component that can be displayed in a Gutter.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Container;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import javax.swing.JPanel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.View;
+
+
+/**
+ * A component that can be displayed in a {@link Gutter}.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class AbstractGutterComponent extends JPanel {
+
+ /**
+ * The text area whose lines we are marking with icons.
+ */
+ protected RTextArea textArea;
+
+ /**
+ * The number of lines in the text area.
+ */
+ protected int currentLineCount;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The text area.
+ */
+ public AbstractGutterComponent(RTextArea textArea) {
+ setTextArea(textArea);
+ }
+
+
+ /**
+ * Returns the bounds of a child view as a rectangle, since
+ * <code>View</code>s tend to use <code>Shape</code>.
+ *
+ * @param parent The parent view of the child whose bounds we're getting.
+ * @param line The index of the child view.
+ * @param editorRect Returned from the text area's
+ * <code>getVisibleEditorRect</code> method.
+ * @return The child view's bounds.
+ */
+ protected static final Rectangle getChildViewBounds(View parent, int line,
+ Rectangle editorRect) {
+ Shape alloc = parent.getChildAllocation(line, editorRect);
+ if (alloc==null) {
+ // WrappedSyntaxView can have this when made so small it's
+ // no longer visible
+ return new Rectangle();
+ }
+ return alloc instanceof Rectangle ? (Rectangle)alloc :
+ alloc.getBounds();
+ }
+
+
+ /**
+ * Returns the parent <code>Gutter</code> component.
+ *
+ * @return The parent <code>Gutter</code>.
+ */
+ protected Gutter getGutter() {
+ Container parent = getParent();
+ return (parent instanceof Gutter) ? (Gutter)parent : null;
+ }
+
+
+ /**
+ * Called when text is inserted to or removed from the text area.
+ * Implementations can take this opportunity to repaint, revalidate, etc.
+ *
+ * @param e The document event.
+ */
+ abstract void handleDocumentEvent(DocumentEvent e);
+
+
+ /**
+ * Called when the line heights of the text area change. This is usually
+ * the result of one or more of the fonts in the editor changing.
+ */
+ abstract void lineHeightsChanged();
+
+
+ /**
+ * Sets the text area being displayed. Subclasses can override, but
+ * should call the super implementation.
+ *
+ * @param textArea The text area.
+ */
+ public void setTextArea(RTextArea textArea) {
+ this.textArea = textArea;
+ int lineCount = textArea==null ? 0 : textArea.getLineCount();
+ if (currentLineCount!=lineCount) {
+ currentLineCount = lineCount;
+ repaint();
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java
new file mode 100644
index 0000000..bdca27f
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/BackgroundPainterStrategy.java
@@ -0,0 +1,44 @@
+/*
+ * 01/22/2005
+ *
+ * BackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * using some strategy.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * Interface for classes that paint the background of an
+ * <code>RTextAreaBase</code>. The Strategy pattern is used for this
+ * object because the background can be painted as a solid color, as
+ * an image, and possibly other ways (gradients, animated images, etc.).
+ * When a method to change the background of an <code>RTextAreaBase</code>
+ * instance is called (such as <code>setBackground</code>,
+ * <code>setBackgroundImage</code> or <code>setBackgoundObject</code>),
+ * the correct strategy is then created and used to paint its background.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.ColorBackgroundPainterStrategy
+ */
+public interface BackgroundPainterStrategy {
+
+
+ /**
+ * Paints the background.
+ *
+ * @param g The graphics context.
+ * @param bounds The bounds of the object whose backgrouns we're
+ * painting.
+ */
+ public void paint(Graphics g, Rectangle bounds);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..e34cb84
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java
@@ -0,0 +1,98 @@
+/*
+ * 01/22/2005
+ *
+ * BufferedImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using a BufferedImage.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image. The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.BufferedImage</code> is used for rendering;
+ * theoretically, for performance you should use
+ * <code>java.awt.image.VolatileImage</code>; see
+ * <code>org.fife.ui.RTextArea.VolatileImageBackgroundPainterStrategy</code>
+ * for this.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public class BufferedImageBackgroundPainterStrategy
+ extends ImageBackgroundPainterStrategy {
+
+ private Image bgImage;
+
+
+ /**
+ * Constructor.
+ *
+ * @param ta The text area whose background we'll be painting.
+ */
+ public BufferedImageBackgroundPainterStrategy(RTextAreaBase ta) {
+ super(ta);
+ }
+
+
+ /**
+ * Paints the image at the specified location. This method assumes
+ * scaling has already been done, and simply paints the background
+ * image "as-is."
+ *
+ * @param g The graphics context.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ */
+ protected void paintImage(Graphics g, int x, int y) {
+ if (bgImage != null)
+ g.drawImage(bgImage, x,y, null);
+ }
+
+
+ /**
+ * Rescales the displayed image to be the specified size.
+ *
+ * @param width The new width of the image.
+ * @param height The new height of the image.
+ * @param hint The scaling hint to use.
+ */
+ protected void rescaleImage(int width, int height, int hint) {
+ Image master = getMasterImage();
+ if (master!=null) {
+ bgImage = master.getScaledInstance(width,height, hint);
+ tracker.addImage(bgImage, 1);
+ try {
+ tracker.waitForID(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ bgImage = null;
+ return;
+ } finally {
+ tracker.removeImage(bgImage, 1);
+ }
+ }
+ else {
+ bgImage = null;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java b/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java
new file mode 100644
index 0000000..b7d394f
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ChangeableHighlightPainter.java
@@ -0,0 +1,440 @@
+/*
+ * 11/10/2004
+ *
+ * ChangableHighlightPainter.java - A highlight painter whose color you can
+ * change.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.SystemColor;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.LayeredHighlighter;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+
+/**
+ * An extension of <code>LayerPainter</code> that allows the user to
+ * change several of its properties:
+ *
+ * <ul>
+ * <li>Its color/fill style (can use a <code>GradientPaint</code>, for
+ * example).</li>
+ * <li>Whether the edges of a painted highlight are rounded.</li>
+ * <li>Whether painted highlights have translucency.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ChangeableHighlightPainter
+ extends LayeredHighlighter.LayerPainter implements Serializable {
+
+
+ /**
+ * The <code>Paint</code>/<code>Color</code> of this highlight.
+ */
+ private Paint paint;
+
+ /**
+ * Whether selections have rounded edges.
+ */
+ private boolean roundedEdges;
+
+ /**
+ * The alpha composite used to render with translucency.
+ */
+ private transient AlphaComposite alphaComposite;
+
+ /**
+ * The alpha value used in computing translucency. This should stay in the
+ * range <code>0.0f</code> (completely invisible) to <code>1.0f</code>
+ * (completely opaque).
+ */
+ private float alpha;
+
+
+ private static final int ARCWIDTH = 8;
+ private static final int ARCHEIGHT = 8;
+
+
+ /**
+ * Creates a new <code>ChangableHighlightPainter</code> that paints
+ * highlights with the text area's selection color (i.e., behaves exactly
+ * like
+ * <code>javax.swing.text.DefaultHighlighter.DefaultHighlightPainter
+ * </code>).
+ */
+ public ChangeableHighlightPainter() {
+ this(null);
+ }
+
+
+ /**
+ * Creates a new highlight painter using the specified <code>Paint</code>
+ * without rounded edges.
+ *
+ * @param paint The <code>Paint</code> (usually a
+ * <code>java.awt.Color</code>) with which to paint the
+ * highlights.
+ */
+ public ChangeableHighlightPainter(Paint paint) {
+ this(paint, false);
+ }
+
+
+ /**
+ * Creates a new highlight painter.
+ *
+ * @param paint The <code>Paint</code> (usually a
+ * <code>java.awt.Color</code>) with which to paint the
+ * highlights.
+ * @param rounded Whether to use rounded edges on the highlights.
+ */
+ public ChangeableHighlightPainter(Paint paint, boolean rounded) {
+ this(paint, rounded, 1.0f);
+ }
+
+
+ /**
+ * Creates a new highlight painter.
+ *
+ * @param paint The <code>Paint</code> (usually a
+ * <code>java.awt.Color</code>) with which to paint the
+ * highlights.
+ * @param rounded Whether to use rounded edges on the highlights.
+ * @param alpha The alpha value to use when painting highlights. This
+ * value should be in the range <code>0.0f</code> (completely
+ * transparent) through <code>1.0f</code> (opaque).
+ */
+ public ChangeableHighlightPainter(Paint paint, boolean rounded,
+ float alpha) {
+ setPaint(paint);
+ setRoundedEdges(rounded);
+ setAlpha(alpha);
+ }
+
+
+ /**
+ * Returns the alpha value used in computing the translucency of these
+ * highlights. A value of <code>1.0f</code> (the default) means that no
+ * translucency is used; there is no performance hit for this value. For
+ * all other values (<code>[0.0f..1.0f)</code>), there will be a
+ * performance hit.
+ *
+ * @return The alpha value.
+ * @see #setAlpha
+ */
+ public float getAlpha() {
+ return alpha;
+ }
+
+
+ /**
+ * Returns the alpha composite to use when rendering highlights with this
+ * painter.
+ *
+ * @return The alpha composite.
+ */
+ private AlphaComposite getAlphaComposite() {
+ if (alphaComposite==null)
+ alphaComposite = AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, alpha);
+ return alphaComposite;
+ }
+
+
+ /**
+ * Returns the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+ * being used to paint highlights.
+ *
+ * @return The <code>Paint</code>.
+ * @see #setPaint
+ */
+ public Paint getPaint() {
+ return paint;
+ }
+
+
+ /**
+ * Returns whether rounded edges are used when painting selections with
+ * this highlight painter.
+ *
+ * @return Whether rounded edges are used.
+ * @see #setRoundedEdges
+ */
+ public boolean getRoundedEdges() {
+ return roundedEdges;
+ }
+
+
+ /**
+ * Paints a highlight.
+ *
+ * @param g the graphics context
+ * @param offs0 the starting model offset >= 0
+ * @param offs1 the ending model offset >= offs1
+ * @param bounds the bounding box for the highlight
+ * @param c the editor
+ */
+ public void paint(Graphics g, int offs0, int offs1, Shape bounds,
+ JTextComponent c) {
+
+ Rectangle alloc = bounds.getBounds();
+
+ // Set up translucency if necessary.
+ Graphics2D g2d = (Graphics2D)g;
+ Composite originalComposite = null;
+ if (getAlpha()<1.0f) {
+ originalComposite = g2d.getComposite();
+ g2d.setComposite(getAlphaComposite());
+ }
+
+ try {
+
+ // Determine locations.
+ TextUI mapper = c.getUI();
+ Rectangle p0 = mapper.modelToView(c, offs0);
+ Rectangle p1 = mapper.modelToView(c, offs1);
+ Paint paint = getPaint();
+ if (paint==null)
+ g2d.setColor(c.getSelectionColor());
+ else
+ g2d.setPaint(paint);
+
+ // Entire highlight is on one line.
+ if (p0.y == p1.y) {
+ Rectangle r = p0.union(p1);
+ g2d.fillRect(r.x, r.y, r.width, r.height);
+ }
+
+ // Highlight spans lines.
+ else {
+ int p0ToMarginWidth = alloc.x + alloc.width - p0.x;
+ g2d.fillRect(p0.x, p0.y, p0ToMarginWidth, p0.height);
+ if ((p0.y + p0.height) != p1.y) {
+ g2d.fillRect(alloc.x, p0.y + p0.height, alloc.width,
+ p1.y - (p0.y + p0.height));
+ }
+ g2d.fillRect(alloc.x, p1.y, (p1.x - alloc.x), p1.height);
+ }
+
+ } catch (BadLocationException e) {
+ // Never happens.
+ e.printStackTrace();
+ } finally {
+ // Restore state from before translucency if necessary.
+ if (getAlpha()<1.0f)
+ g2d.setComposite(originalComposite);
+ }
+
+ }
+
+
+ /**
+ * Paints a portion of a highlight.
+ *
+ * @param g the graphics context
+ * @param offs0 the starting model offset >= 0
+ * @param offs1 the ending model offset >= offs1
+ * @param bounds the bounding box of the view, which is not
+ * necessarily the region to paint.
+ * @param c the editor
+ * @param view View painting for
+ * @return region drawing occurred in
+ */
+ public Shape paintLayer(Graphics g, int offs0, int offs1,
+ Shape bounds, JTextComponent c, View view) {
+
+
+ // Set up translucency if necessary.
+ Graphics2D g2d = (Graphics2D)g;
+ Composite originalComposite = null;
+ if (getAlpha()<1.0f) {
+ originalComposite = g2d.getComposite();
+ g2d.setComposite(getAlphaComposite());
+ }
+
+ // Set the color (our own if defined, otherwise text area's).
+ Paint paint = getPaint();
+ if (paint==null)
+ g2d.setColor(c.getSelectionColor());
+ else
+ g2d.setPaint(paint);
+
+ // This special case isn't needed for most standard Swing Views (which
+ // always return a width of 1 for modelToView() calls), but it is
+ // needed for RSTA views, which actually return the width of chars for
+ // modelToView calls. But this should be faster anyway, as we
+ // short-circuit and do only one modelToView() for one offset.
+ if (offs0==offs1) {
+ try {
+ Shape s = view.modelToView(offs0, bounds,
+ Position.Bias.Forward);
+ Rectangle r = s.getBounds();
+ g.drawLine(r.x, r.y, r.x, r.y+r.height);
+ return r;
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ return null;
+ }
+ }
+
+ // Contained in view, can just use bounds.
+ if (offs0==view.getStartOffset() && offs1==view.getEndOffset()) {
+
+ Rectangle alloc;
+ if (bounds instanceof Rectangle)
+ alloc = (Rectangle)bounds;
+ else
+ alloc = bounds.getBounds();
+
+ g2d.fillRect(alloc.x, alloc.y, alloc.width, alloc.height);
+
+ // Restore state from before translucency if necessary.
+ if (getAlpha()<1.0f)
+ g2d.setComposite(originalComposite);
+
+ return alloc;
+
+ }
+
+ // Should only render part of View.
+ else {
+
+ try {
+
+ Shape shape = view.modelToView(offs0, Position.Bias.Forward,
+ offs1,Position.Bias.Backward,
+ bounds);
+ Rectangle r = (shape instanceof Rectangle) ?
+ (Rectangle)shape : shape.getBounds();
+ if (roundedEdges) {
+ g2d.fillRoundRect(r.x,r.y, r.width,r.height, ARCWIDTH,
+ ARCHEIGHT);
+ }
+ else {
+ g2d.fillRect(r.x, r.y, r.width, r.height);
+ }
+
+ // Restore state from before translucency if necessary.
+ if (getAlpha()<1.0f)
+ g2d.setComposite(originalComposite);
+
+ return r;
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ } finally {
+ // Restore state from before translucency if necessary.
+ if (getAlpha()<1.0f)
+ g2d.setComposite(originalComposite);
+ }
+
+ }
+
+ // Only if exception
+ return null;
+
+ }
+
+
+ /**
+ * Deserializes a painter.
+ *
+ * @param s The stream to read from.
+ * @throws ClassNotFoundException
+ * @throws IOException
+ */
+ private void readObject(ObjectInputStream s)
+ throws ClassNotFoundException, IOException {
+ s.defaultReadObject();
+ // We cheat and always serialize the Paint as a Color. "-1" means
+ // no Paint (i.e. use system selection color when painting).
+ int rgb = s.readInt();
+ paint = rgb==-1 ? null : new Color(rgb);
+ alphaComposite = null; // Keep FindBugs happy. This will get set later
+ }
+
+
+ /**
+ * Sets the alpha value used in rendering highlights. If this value is
+ * <code>1.0f</code> (the default), the highlights are rendered completely
+ * opaque. This behavior matches that of
+ * <code>DefaultHighlightPainter</code> and imposes no performance hit. If
+ * this value is below <code>1.0f</code>, it represents how opaque the
+ * highlight will be. There will be a small performance hit for values
+ * less than <code>1.0f</code>.
+ *
+ * @param alpha The new alpha value to use for transparency.
+ * @see #getAlpha
+ */
+ public void setAlpha(float alpha) {
+ this.alpha = alpha;
+ this.alpha = Math.max(alpha, 0.0f);
+ this.alpha = Math.min(1.0f, alpha);
+ alphaComposite = null; // So it is recreated with new alpha.
+ }
+
+
+ /**
+ * Sets the <code>Paint</code> (usually a <code>java.awt.Color</code>)
+ * used to paint this highlight.
+ *
+ * @param paint The new <code>Paint</code>.
+ * @see #getPaint
+ */
+ public void setPaint(Paint paint) {
+ this.paint = paint;
+ }
+
+
+ /**
+ * Sets whether rounded edges are used when painting this highlight.
+ *
+ * @param rounded Whether rounded edges should be used.
+ * @see #getRoundedEdges
+ */
+ public void setRoundedEdges(boolean rounded) {
+ roundedEdges = rounded;
+ }
+
+
+ /**
+ * Serializes this painter.
+ *
+ * @param s The stream to write to.
+ * @throws IOException If an IO error occurs.
+ */
+ private void writeObject(ObjectOutputStream s) throws IOException {
+ s.defaultWriteObject();
+ int rgb = -1; // No Paint -> Use JTextComponent's selection color
+ if (paint!=null) {
+ // NOTE: We cheat and always serialize the Paint as a Color.
+ // This is (practically) always the case anyway.
+ Color c = (paint instanceof Color) ? ((Color)paint) :
+ SystemColor.textHighlight;
+ rgb = c.getRGB();
+ }
+ s.writeInt(rgb);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java
new file mode 100644
index 0000000..c25d0dc
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ColorBackgroundPainterStrategy.java
@@ -0,0 +1,108 @@
+/*
+ * 01/22/2005
+ *
+ * ColorBackgroundPainterStrategy.java - Renders an RTextAreaBase's background
+ * as a single color.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as a solid color. The default background for <code>RTextAreaBase</code>s
+ * is this strategy using the color white.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ */
+public class ColorBackgroundPainterStrategy
+ implements BackgroundPainterStrategy {
+
+ private Color color;
+
+
+ /**
+ * Constructor.
+ *
+ * @param color The color to use when painting the background.
+ */
+ public ColorBackgroundPainterStrategy(Color color) {
+ setColor(color);
+ }
+
+
+ /**
+ * Returns whether or not the specified object is equivalent to
+ * this one.
+ *
+ * @param o2 The object to which to compare.
+ * @return Whether <code>o2</code> is another
+ * <code>ColorBackgroundPainterStrategy</code> representing
+ * the same color as this one.
+ */
+ public boolean equals(Object o2) {
+ return o2!=null &&
+ (o2 instanceof ColorBackgroundPainterStrategy) &&
+ this.color.equals(
+ ((ColorBackgroundPainterStrategy)o2).getColor());
+ }
+
+
+ /**
+ * Returns the color used to paint the background.
+ *
+ * @return The color.
+ * @see #setColor
+ */
+ public Color getColor() {
+ return color;
+ }
+
+
+ /**
+ * Returns the hash code to use when placing an object of this type into
+ * hash maps. This method is implemented since we overrode
+ * {@link #equals(Object)}, to keep FindBugs happy.
+ *
+ * @return The hash code.
+ */
+ public int hashCode() {
+ return color.hashCode();
+ }
+
+
+ /**
+ * Paints the background.
+ *
+ * @param g The graphics context.
+ * @param bounds The bounds of the object whose backgrouns we're
+ * painting.
+ */
+ public void paint(Graphics g, Rectangle bounds) {
+ Color temp = g.getColor();
+ g.setColor(color);
+ g.fillRect(bounds.x,bounds.y, bounds.width,bounds.height);
+ g.setColor(temp);
+ }
+
+
+ /**
+ * Sets the color used to paint the background.
+ *
+ * @param color The color to use.
+ * @see #getColor
+ */
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ConfigurableCaret.java b/src/org/fife/ui/rtextarea/ConfigurableCaret.java
new file mode 100644
index 0000000..603e998
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ConfigurableCaret.java
@@ -0,0 +1,722 @@
+/*
+ * 12/21/2004
+ *
+ * ConfigurableCaret.java - The caret used by RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.datatransfer.*;
+import java.awt.event.ActionEvent;
+import java.io.*;
+import javax.swing.*;
+import javax.swing.plaf.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The caret used by {@link RTextArea}. This caret has all of the properties
+ * that <code>javax.swing.text.DefaultCaret</code> does, as well as adding the
+ * following niceties:
+ *
+ * <ul>
+ * <li>This caret can paint itself several different ways:
+ * <ol>
+ * <li>As a vertical line (like <code>DefaultCaret</code>)</li>
+ * <li>As a slightly thicker vertical line (like Eclipse)</li>
+ * <li>As an underline</li>
+ * <li>As a "block caret"</li>
+ * <li>As a rectangle around the current character</li>
+ * </ol></li>
+ * <li>On Microsoft Windows and other operating systems that do not
+ * support system selection (i.e., selecting text, then pasting
+ * via the middle mouse button), clicking the middle mouse button
+ * will cause a regular paste operation to occur. On systems
+ * that support system selection (i.e., all UNIX variants),
+ * the middle mouse button will behave normally.</li>
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 0.6
+ */
+public class ConfigurableCaret extends DefaultCaret {
+
+ /**
+ * The minimum value of a caret style.
+ */
+ public static final int MIN_STYLE = 0;
+
+ /**
+ * The vertical line style.
+ */
+ public static final int VERTICAL_LINE_STYLE = 0;
+
+ /**
+ * The horizontal line style.
+ */
+ public static final int UNDERLINE_STYLE = 1;
+
+ /**
+ * The block style.
+ */
+ public static final int BLOCK_STYLE = 2;
+
+ /**
+ * The block border style.
+ */
+ public static final int BLOCK_BORDER_STYLE = 3;
+
+ /**
+ * A thicker vertical line (2 pixels instead of 1).
+ */
+ public static final int THICK_VERTICAL_LINE_STYLE = 4;
+
+ /**
+ * The maximum value of a caret style.
+ */
+ public static final int MAX_STYLE = THICK_VERTICAL_LINE_STYLE;
+
+ /**
+ * Action used to select a word on a double click.
+ */
+ static private transient Action selectWord = null;
+
+ /**
+ * Action used to select a line on a triple click.
+ */
+ static private transient Action selectLine = null;
+
+ /**
+ * holds last MouseEvent which caused the word selection
+ */
+ private transient MouseEvent selectedWordEvent = null;
+
+ /**
+ * Used for fastest-possible retrieval of the character at the
+ * caret's position in the document.
+ */
+ private transient Segment seg;
+
+ /**
+ * Whether the caret is a vertical line, a horizontal line, or a block.
+ */
+ private int style;
+
+ /**
+ * The selection painter. By default this paints selections with the
+ * text area's selection color.
+ */
+ private ChangeableHighlightPainter selectionPainter;
+
+ /**
+ * Whether this is Java 1.4.
+ */
+ /* TODO: Remove me when 1.4 support is removed. */
+ private static final boolean IS_JAVA_1_4 =
+ "1.4".equals(System.getProperty("java.specification.version"));
+
+
+ /**
+ * Creates the caret using {@link #VERTICAL_LINE_STYLE}.
+ */
+ public ConfigurableCaret() {
+ this(VERTICAL_LINE_STYLE);
+ }
+
+
+ /**
+ * Constructs a new <code>ConfigurableCaret</code>.
+ *
+ * @param style The style to use when painting the caret. If this is
+ * invalid, then {@link #VERTICAL_LINE_STYLE} is used.
+ */
+ public ConfigurableCaret(int style) {
+ seg = new Segment();
+ setStyle(style);
+ selectionPainter = new ChangeableHighlightPainter();
+ }
+
+
+ /**
+ * Adjusts the caret location based on the MouseEvent.
+ */
+ private void adjustCaret(MouseEvent e) {
+ if ((e.getModifiers()&ActionEvent.SHIFT_MASK)!=0 && getDot()!=-1)
+ moveCaret(e);
+ else
+ positionCaret(e);
+ }
+
+
+ /**
+ * Adjusts the focus, if necessary.
+ *
+ * @param inWindow if true indicates requestFocusInWindow should be used
+ */
+ private void adjustFocus(boolean inWindow) {
+ RTextArea textArea = getTextArea();
+ if ((textArea != null) && textArea.isEnabled() &&
+ textArea.isRequestFocusEnabled()) {
+ if (inWindow)
+ textArea.requestFocusInWindow();
+ else
+ textArea.requestFocus();
+ }
+ }
+
+
+ /**
+ * Overridden to damage the correct width of the caret, since this caret
+ * can be different sizes.
+ *
+ * @param r The current location of the caret.
+ */
+ protected synchronized void damage(Rectangle r) {
+ if (r != null) {
+ validateWidth(r); // Check for "0" or "1" caret width
+ x = r.x - 1;
+ y = r.y;
+ width = r.width + 4;
+ height = r.height;
+ repaint();
+ }
+ }
+
+
+ /**
+ * Called when the UI is being removed from the
+ * interface of a JTextComponent. This is used to
+ * unregister any listeners that were attached.
+ *
+ * @param c The text component. If this is not an
+ * <code>RTextArea</code>, an <code>Exception</code>
+ * will be thrown.
+ * @see Caret#deinstall
+ */
+ public void deinstall(JTextComponent c) {
+ if (!(c instanceof RTextArea))
+ throw new IllegalArgumentException(
+ "c must be instance of RTextArea");
+ super.deinstall(c);
+ c.setNavigationFilter(null);
+ }
+
+
+ /**
+ * Gets the text editor component that this caret is bound to.
+ *
+ * @return The <code>RTextArea</code>.
+ */
+ protected RTextArea getTextArea() {
+ return (RTextArea)getComponent();
+ }
+
+
+ /**
+ * Returns whether this caret's selection uses rounded edges.
+ *
+ * @return Whether this caret's edges are rounded.
+ * @see #setRoundedSelectionEdges
+ */
+ public boolean getRoundedSelectionEdges() {
+ return ((ChangeableHighlightPainter)getSelectionPainter()).
+ getRoundedEdges();
+ }
+
+
+ /**
+ * Gets the painter for the Highlighter. This is overridden to return
+ * our custom selection painter.
+ *
+ * @return The painter.
+ */
+ protected Highlighter.HighlightPainter getSelectionPainter() {
+ return selectionPainter;
+ }
+
+
+ /**
+ * Gets the current style of this caret.
+ *
+ * @return The caret's style.
+ * @see #setStyle(int)
+ */
+ public int getStyle() {
+ return style;
+ }
+
+
+ /**
+ * Installs this caret on a text component.
+ *
+ * @param c The text component. If this is not an {@link RTextArea},
+ * an <code>Exception</code> will be thrown.
+ * @see Caret#install
+ */
+ public void install(JTextComponent c) {
+ if (!(c instanceof RTextArea))
+ throw new IllegalArgumentException(
+ "c must be instance of RTextArea");
+ super.install(c);
+ c.setNavigationFilter(new FoldAwareNavigationFilter());
+ }
+ /**
+ * Called when the mouse is clicked. If the click was generated from
+ * button1, a double click selects a word, and a triple click the
+ * current line.
+ *
+ * @param e the mouse event
+ * @see MouseListener#mouseClicked
+ */
+ public void mouseClicked(MouseEvent e) {
+
+ if (! e.isConsumed()) {
+
+ RTextArea textArea = getTextArea();
+ int nclicks = e.getClickCount();
+
+ if (SwingUtilities.isLeftMouseButton(e)) {
+ if (nclicks<=2) {
+ // Only handle these clicks for 1.4. In 1.5 the word
+ // selection is (also?) handled in mousePressed, and if we
+ // handle it here, our word selection gets doubled-up.
+ if (IS_JAVA_1_4) {
+ if (nclicks==1) {
+ selectedWordEvent = null;
+ }
+ else { // 2
+ selectWord(e);
+ selectedWordEvent = null;
+ }
+ }
+ }
+ else {
+ nclicks %= 2; // Alternate selecting word/line.
+ switch (nclicks) {
+ case 0:
+ selectWord(e);
+ selectedWordEvent = null;
+ break;
+ case 1:
+ Action a = null;
+ ActionMap map = textArea.getActionMap();
+ if (map != null)
+ a = map.get(RTextAreaEditorKit.selectLineAction);
+ if (a == null) {
+ if (selectLine == null) {
+ selectLine = new RTextAreaEditorKit.SelectLineAction();
+ }
+ a = selectLine;
+ }
+ a.actionPerformed(new ActionEvent(textArea,
+ ActionEvent.ACTION_PERFORMED,
+ null, e.getWhen(), e.getModifiers()));
+ }
+ }
+ }
+
+ else if (SwingUtilities.isMiddleMouseButton(e)) {
+ if (nclicks == 1 && textArea.isEditable() && textArea.isEnabled()) {
+ // Paste the system selection, if it exists (e.g., on UNIX
+ // platforms, the user can select text, the middle-mouse click
+ // to paste it; this doesn't work on Windows). If the system
+ // doesn't support system selection, just do a normal paste.
+ JTextComponent c = (JTextComponent) e.getSource();
+ if (c != null) {
+ try {
+ Toolkit tk = c.getToolkit();
+ Clipboard buffer = tk.getSystemSelection();
+ // If the system supports system selections, (e.g. UNIX),
+ // try to do it.
+ if (buffer != null) {
+ adjustCaret(e);
+ TransferHandler th = c.getTransferHandler();
+ if (th != null) {
+ Transferable trans = buffer.getContents(null);
+ if (trans != null)
+ th.importData(c, trans);
+ }
+ adjustFocus(true);
+ }
+ // If the system doesn't support system selections
+ // (e.g. Windows), just do a normal paste.
+ else {
+ textArea.paste();
+ }
+ } catch (HeadlessException he) {
+ // do nothing... there is no system clipboard
+ }
+ } // if (c!=null)
+ } // if (nclicks == 1 && component.isEditable() && component.isEnabled())
+ } // else if (SwingUtilities.isMiddleMouseButton(e))
+
+ } // if (!c.isConsumed())
+
+ }
+
+
+ /**
+ * Overridden to also focus the text component on right mouse clicks.
+ *
+ * @param e The mouse event.
+ */
+ public void mousePressed(MouseEvent e) {
+ super.mousePressed(e);
+ if (!e.isConsumed() && SwingUtilities.isRightMouseButton(e)) {
+ JTextComponent c = getComponent();
+ if (c!=null && c.isEnabled() && c.isRequestFocusEnabled()) {
+ c.requestFocusInWindow();
+ }
+ }
+ }
+
+
+ /**
+ * Paints the cursor.
+ *
+ * @param g The graphics context in which to paint.
+ */
+ public void paint(Graphics g) {
+
+ // If the cursor is currently visible...
+ if (isVisible()) {
+
+ try {
+
+ RTextArea textArea = getTextArea();
+ g.setColor(textArea.getCaretColor());
+ TextUI mapper = textArea.getUI();
+ Rectangle r = mapper.modelToView(textArea, getDot());
+
+ // "Correct" the value of rect.width (takes into
+ // account caret being at EOL (and thus rect.width==1),
+ // etc.
+ // We do this even for LINE_STYLE because
+ // if they change from that caret to block/underline,
+ // the first time they do so width==1, so it will take
+ // one caret flash to paint correctly (wider). If we
+ // do this every time, then it's painted correctly the
+ // first blink.
+ validateWidth(r);
+
+ // This condition is most commonly hit when code folding is
+ // enabled and the user collapses a fold above the caret
+ // position. If our cached x/y/w/h aren't updated, this caret
+ // appears to stop blinking because the wrong line range gets
+ // damaged. This check keeps us in sync.
+ if (width>0 && height>0 &&
+ !contains(r.x, r.y, r.width, r.height)) {
+ Rectangle clip = g.getClipBounds();
+ if (clip != null && !clip.contains(this)) {
+ // Clip doesn't contain the old location, force it
+ // to be repainted lest we leave a caret around.
+ repaint();
+ }
+ // This will potentially cause a repaint of something
+ // we're already repainting, but without changing the
+ // semantics of damage we can't really get around this.
+ damage(r);
+ }
+
+ // Need to subtract 2 from height, otherwise
+ // the caret will expand too far vertically.
+ r.height -= 2;
+
+ switch (style) {
+
+ // Draw a big rectangle, and xor the foreground color.
+ case BLOCK_STYLE:
+ Color textAreaBg = textArea.getBackground();
+ if (textAreaBg==null) {
+ textAreaBg = Color.white;
+ }
+ g.setXORMode(textAreaBg);
+ // fills x==r.x to x==(r.x+(r.width)-1), inclusive.
+ g.fillRect(r.x,r.y, r.width,r.height);
+ break;
+
+ // Draw a rectangular border.
+ case BLOCK_BORDER_STYLE:
+ // fills x==r.x to x==(r.x+(r.width-1)), inclusive.
+ g.drawRect(r.x,r.y, r.width-1,r.height);
+ break;
+
+ // Draw an "underline" below the current position.
+ case UNDERLINE_STYLE:
+ textAreaBg = textArea.getBackground();
+ if (textAreaBg==null) {
+ textAreaBg = Color.white;
+ }
+ g.setXORMode(textAreaBg);
+ int y = r.y + r.height;
+ g.drawLine(r.x,y, r.x+r.width-1,y);
+ break;
+
+ // Draw a vertical line.
+ default:
+ case VERTICAL_LINE_STYLE:
+ g.drawLine(r.x,r.y, r.x,r.y+r.height);
+ break;
+
+ // A thicker vertical line.
+ case THICK_VERTICAL_LINE_STYLE:
+ g.drawLine(r.x,r.y, r.x,r.y+r.height);
+ r.x++;
+ g.drawLine(r.x,r.y, r.x,r.y+r.height);
+ break;
+
+ } // End of switch (style).
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ }
+
+ } // End of if (isVisible()).
+
+ }
+
+
+ /**
+ * Deserializes a caret. This is overridden to read the caret's style.
+ *
+ * @param s The stream to read from.
+ * @throws ClassNotFoundException
+ * @throws IOException
+ */
+ private void readObject(ObjectInputStream s)
+ throws ClassNotFoundException, IOException {
+ s.defaultReadObject();
+ setStyle(s.readInt());
+ seg = new Segment();
+ }
+
+
+ /**
+ * Selects word based on the MouseEvent
+ */
+ private void selectWord(MouseEvent e) {
+ if (selectedWordEvent != null
+ && selectedWordEvent.getX() == e.getX()
+ && selectedWordEvent.getY() == e.getY()) {
+ // We've already the done selection for this.
+ return;
+ }
+ Action a = null;
+ RTextArea textArea = getTextArea();
+ ActionMap map = textArea.getActionMap();
+ if (map != null) {
+ a = map.get(RTextAreaEditorKit.selectWordAction);
+ }
+ if (a == null) {
+ if (selectWord == null) {
+ selectWord = new RTextAreaEditorKit.SelectWordAction();
+ }
+ a = selectWord;
+ }
+ a.actionPerformed(new ActionEvent(textArea,
+ ActionEvent.ACTION_PERFORMED,
+ null, e.getWhen(), e.getModifiers()));
+ selectedWordEvent = e;
+ }
+
+
+ /**
+ * Sets whether this caret's selection should have rounded edges.
+ *
+ * @param rounded Whether it should have rounded edges.
+ * @see #getRoundedSelectionEdges()
+ */
+ public void setRoundedSelectionEdges(boolean rounded) {
+ ((ChangeableHighlightPainter)getSelectionPainter()).
+ setRoundedEdges(rounded);
+ }
+
+
+ /**
+ * Overridden to always render the selection, even when the text component
+ * loses focus.
+ *
+ * @param visible Whether the selection should be visible. This parameter
+ * is ignored.
+ */
+ public void setSelectionVisible(boolean visible) {
+ super.setSelectionVisible(true);
+ }
+
+
+ /**
+ * Sets the style used when painting the caret.
+ *
+ * @param style The style to use. If this isn't one of
+ * <code>VERTICAL_LINE_STYLE</code>, <code>UNDERLINE_STYLE</code>,
+ * or <code>BLOCK_STYLE</code>, then
+ * <code>VERTICAL_LINE_STYLE</code> is used.
+ * @see #getStyle()
+ */
+ public void setStyle(int style) {
+ if (style<MIN_STYLE || style>MAX_STYLE)
+ style = VERTICAL_LINE_STYLE;
+ this.style = style;
+ repaint();
+ }
+
+
+ /**
+ * Helper function used by the block and underline carets to ensure the
+ * width of the painted caret is valid. This is done for the following
+ * reasons:
+ *
+ * <ul>
+ * <li>The <code>View</code> classes in the javax.swing.text package
+ * always return a width of "1" when <code>modelToView</code> is
+ * called. We'll be needing the actual width.</li>
+ * <li>Even in smart views, such as <code>RSyntaxTextArea</code>'s
+ * <code>SyntaxView</code> and <code>WrappedSyntaxView</code> that
+ * return the width of the current character, if the caret is at the
+ * end of a line for example, the width returned from
+ * <code>modelToView</code> will be 0 (as the width of unprintable
+ * characters such as '\n' is calculated as 0). In this case, we'll
+ * use a default width value.</li>
+ * </ul>
+ *
+ * @param rect The rectangle returned by the current
+ * <code>View</code>'s <code>modelToView</code>
+ * method for the caret position.
+ */
+ private void validateWidth(Rectangle rect) {
+
+ // If the width value > 1, we assume the View is
+ // a "smart" view that returned the proper width.
+ // So only worry about this stuff if width <= 1.
+ if (rect!=null && rect.width<=1) {
+
+ // The width is either 1 (most likely, we're using a "dumb" view
+ // like those in javax.swing.text) or 0 (most likely, we're using
+ // a "smart" view like org.fife.ui.rsyntaxtextarea.SyntaxView,
+ // we're at the end of a line, and the width of '\n' is being
+ // computed as 0).
+
+ try {
+
+ // Try to get a width for the character at the caret
+ // position. We use the text area's font instead of g's
+ // because g's may vary in an RSyntaxTextArea.
+ RTextArea textArea = getTextArea();
+ textArea.getDocument().getText(getDot(),1, seg);
+ Font font = textArea.getFont();
+ FontMetrics fm = textArea.getFontMetrics(font);
+ rect.width = fm.charWidth(seg.array[seg.offset]);
+
+ // This width being returned 0 likely means that it is an
+ // unprintable character (which is almost 100% to be a
+ // newline char, i.e., we're at the end of a line). So,
+ // just use the width of a space.
+ if (rect.width==0) {
+ rect.width = fm.charWidth(' ');
+ }
+
+ } catch (BadLocationException ble) {
+ // This shouldn't ever happen.
+ ble.printStackTrace();
+ rect.width = 8;
+ }
+
+ } // End of if (rect!=null && rect.width<=1).
+
+ }
+
+
+ /**
+ * Serializes this caret. This is overridden to write the style of the
+ * caret.
+ *
+ * @param s The stream to write to.
+ * @throws IOException If an IO error occurs.
+ */
+ private void writeObject(ObjectOutputStream s) throws IOException {
+ s.defaultWriteObject();
+ s.writeInt(getStyle());
+ }
+
+
+ /**
+ * Keeps the caret out of folded regions in edge cases where it doesn't
+ * happen automatically, for example, when the caret moves automatically in
+ * response to Document.insert() and Document.remove() calls. Most keyboard
+ * shortcuts already take folding into account, as do viewToModel() and
+ * modelToView(), so this filter usually does not do anything.<p>
+ *
+ * Common cases: backspacing to visible line of collapsed region.
+ */
+ private class FoldAwareNavigationFilter extends NavigationFilter {
+
+ public void setDot(FilterBypass fb, int dot, Position.Bias bias) {
+
+ RTextArea textArea = getTextArea();
+ if (textArea instanceof RSyntaxTextArea) {
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)getTextArea();
+ if (rsta.isCodeFoldingEnabled()) {
+
+ int lastDot = getDot();
+ FoldManager fm = rsta.getFoldManager();
+ int line = 0;
+ try {
+ line = textArea.getLineOfOffset(dot);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ if (fm.isLineHidden(line)) {
+
+ //System.out.println("filterBypass: avoiding hidden line");
+ try {
+ if (dot>lastDot) { // Moving to further line
+ int lineCount = textArea.getLineCount();
+ while (++line<lineCount &&
+ fm.isLineHidden(line));
+ if (line<lineCount) {
+ dot = textArea.getLineStartOffset(line);
+ }
+ else { // No lower lines visible
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ return;
+ }
+ }
+ else if (dot<lastDot) { // Moving to earlier line
+ while (--line>=0 && fm.isLineHidden(line));
+ if (line>=0) {
+ dot = textArea.getLineEndOffset(line) - 1;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+
+ }
+
+ }
+
+ }
+
+ super.setDot(fb, dot, bias);
+
+ }
+
+ public void moveDot(FilterBypass fb, int dot, Position.Bias bias) {
+ super.moveDot(fb, dot, bias);
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/FoldIndicator.java b/src/org/fife/ui/rtextarea/FoldIndicator.java
new file mode 100644
index 0000000..d859e47
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/FoldIndicator.java
@@ -0,0 +1,685 @@
+/*
+ * 10/08/2011
+ *
+ * FoldIndicator.java - Gutter component allowing the user to expand and
+ * collapse folds.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JToolTip;
+import javax.swing.ToolTipManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputAdapter;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.focusabletip.TipUtil;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Component in the gutter that displays +/- icons to expand and collapse
+ * fold regions in the editor.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class FoldIndicator extends AbstractGutterComponent {
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ private Insets textAreaInsets;
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ private Rectangle visibleRect;
+
+ /**
+ * The fold to show the outline line for.
+ */
+ private Fold foldWithOutlineShowing;
+
+ /**
+ * The color to use for fold icon backgrounds, if the default icons
+ * are used.
+ */
+ private Color foldIconBackground;
+
+ /**
+ * The icon used for collapsed folds.
+ */
+ private Icon collapsedFoldIcon;
+
+ /**
+ * The icon used for expanded folds.
+ */
+ private Icon expandedFoldIcon;
+
+ /**
+ * Whether tool tips are displayed showing the contents of collapsed
+ * fold regions.
+ */
+ private boolean showFoldRegionTips;
+
+ /**
+ * The color used to paint fold outlines.
+ */
+ static final Color DEFAULT_FOREGROUND = Color.gray;
+
+ /**
+ * The default color used to paint the "inside" of fold icons.
+ */
+ static final Color DEFAULT_FOLD_BACKGROUND = Color.white;
+
+ /**
+ * Listens for events in this component.
+ */
+ private Listener listener;
+
+ /**
+ * Width of this component.
+ */
+ private static final int WIDTH = 12;
+
+
+ public FoldIndicator(RTextArea textArea) {
+ super(textArea);
+ setForeground(DEFAULT_FOREGROUND);
+ setFoldIconBackground(DEFAULT_FOLD_BACKGROUND);
+ collapsedFoldIcon = new FoldIcon(true);
+ expandedFoldIcon = new FoldIcon(false);
+ listener = new Listener(this);
+ visibleRect = new Rectangle();
+ setShowCollapsedRegionToolTips(true);
+ }
+
+
+ /**
+ * Overridden to use the editor's background if it's detected that the
+ * user isn't using white as the editor bg, but the system's tool tip
+ * background is yellow-ish.
+ *
+ * @return The tool tip.
+ */
+ public JToolTip createToolTip() {
+ JToolTip tip = super.createToolTip();
+ Color textAreaBG = textArea.getBackground();
+ if (textAreaBG!=null && !Color.white.equals(textAreaBG)) {
+ Color bg = TipUtil.getToolTipBackground();
+ // If current L&F's tool tip color is close enough to "yellow",
+ // and we're not using the default text background of white, use
+ // the editor background as the tool tip background.
+ if (bg.getRed()>=240 && bg.getGreen()>=240 && bg.getBlue()>=200) {
+ tip.setBackground(textAreaBG);
+ }
+ }
+ return tip;
+ }
+
+
+ private Fold findOpenFoldClosestTo(Point p) {
+
+ Fold fold = null;
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) { // Should always be true
+ int offs = rsta.viewToModel(p); // TODO: Optimize me
+ if (offs>-1) {
+ try {
+ int line = rsta.getLineOfOffset(offs);
+ FoldManager fm = rsta.getFoldManager();
+ fold = fm.getFoldForLine(line);
+ if (fold==null) {
+ fold = fm.getDeepestOpenFoldContaining(offs);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ }
+
+ return fold;
+
+ }
+
+
+ /**
+ * Returns the color to use for the "background" of fold icons. This
+ * is be ignored if custom icons are used.
+ *
+ * @return The background color.
+ * @see #setFoldIconBackground(Color)
+ */
+ public Color getFoldIconBackground() {
+ return foldIconBackground;
+ }
+
+
+ public Dimension getPreferredSize() {
+ int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+ return new Dimension(WIDTH, h);
+ }
+
+
+ /**
+ * Returns whether tool tips are displayed showing the contents of
+ * collapsed fold regions when the mouse hovers over a +/- icon.
+ *
+ * @return Whether these tool tips are displayed.
+ * @see #setShowCollapsedRegionToolTips(boolean)
+ */
+ public boolean getShowCollapsedRegionToolTips() {
+ return showFoldRegionTips;
+ }
+
+
+ /**
+ * Positions tool tips to be aligned in the text component, so that the
+ * displayed content is shown (almost) exactly where it would be in the
+ * editor.
+ *
+ * @param e The mouse location.
+ */
+ public Point getToolTipLocation(MouseEvent e) {
+
+ // ToolTipManager requires both location and text to be null to hide
+ // a currently-visible tool tip window. If text is null but location
+ // has some value, it will show a tool tip with empty content, the size
+ // of its border (!).
+ String text = getToolTipText(e);
+ if (text==null) {
+ return null;
+ }
+
+ // Try to overlap the tip's text directly over the code
+ Point p = e.getPoint();
+ p.y = (p.y/textArea.getLineHeight()) * textArea.getLineHeight();
+ p.x = getWidth() + textArea.getMargin().left;
+ Gutter gutter = getGutter();
+ int gutterMargin = gutter.getInsets().right;
+ p.x += gutterMargin;
+ JToolTip tempTip = createToolTip();
+ p.x -= tempTip.getInsets().left;
+ p.y += 16;
+ return p;
+ }
+
+
+ /**
+ * Overridden to show the content of a collapsed fold on mouse-overs.
+ *
+ * @param e The mouse location.
+ */
+ public String getToolTipText(MouseEvent e) {
+
+ String text = null;
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ FoldManager fm = rsta.getFoldManager();
+ int pos = rsta.viewToModel(new Point(0, e.getY()));
+ if (pos>=0) { // Not -1
+ int line = 0;
+ try {
+ line = rsta.getLineOfOffset(pos);
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ return null;
+ }
+ Fold fold = fm.getFoldForLine(line);
+ if (fold!=null && fold.isCollapsed()) {
+
+ int endLine = fold.getEndLine();
+ if (fold.getLineCount()>25) { // Not too big
+ endLine = fold.getStartLine() + 25;
+ }
+
+ StringBuffer sb = new StringBuffer("<html><nobr>");
+ while (line<=endLine && line<rsta.getLineCount()) { // Sanity
+ Token t = rsta.getTokenListForLine(line);
+ while (t!=null && t.isPaintable()) {
+ t.appendHTMLRepresentation(sb, rsta, true, true);
+ t = t.getNextToken();
+ }
+ sb.append("<br>");
+ line++;
+ }
+
+ text = sb.toString();
+
+ }
+ }
+ }
+
+ return text;
+
+ }
+
+
+ void handleDocumentEvent(DocumentEvent e) {
+ int newLineCount = textArea.getLineCount();
+ if (newLineCount!=currentLineCount) {
+ currentLineCount = newLineCount;
+ repaint();
+ }
+ }
+
+
+ void lineHeightsChanged() {
+ // TODO Auto-generated method stub
+ }
+
+
+ protected void paintComponent(Graphics g) {
+
+ if (textArea==null) {
+ return;
+ }
+
+ visibleRect = g.getClipBounds(visibleRect);
+ if (visibleRect==null) { // ???
+ visibleRect = getVisibleRect();
+ }
+ //System.out.println("IconRowHeader repainting: " + visibleRect);
+ if (visibleRect==null) {
+ return;
+ }
+
+ Color bg = getBackground();
+ if (getGutter()!=null) { // Should always be true
+ bg = getGutter().getBackground();
+ }
+ g.setColor(bg);
+ g.fillRect(0,visibleRect.y, getWidth(),visibleRect.height);
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (!rsta.isCodeFoldingEnabled()) {
+ return; // We should be hidden in this case, but still...
+ }
+
+ if (textArea.getLineWrap()) {
+ paintComponentWrapped(g);
+ return;
+ }
+
+ // Get where to start painting (top of the row).
+ // We need to be "scrolled up" up just enough for the missing part of
+ // the first line.
+ int cellHeight = textArea.getLineHeight();
+ int topLine = visibleRect.y/cellHeight;
+ int y = topLine*cellHeight +
+ (cellHeight-collapsedFoldIcon.getIconHeight())/2;
+ textAreaInsets = textArea.getInsets(textAreaInsets);
+ if (textAreaInsets!=null) {
+ y += textAreaInsets.top;
+ }
+
+ // Get the first and last lines to paint.
+ FoldManager fm = rsta.getFoldManager();
+ topLine += fm.getHiddenLineCountAbove(topLine, true);
+
+ int width = getWidth();
+ int x = width - 10;
+ int line = topLine;
+ boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+ foldWithOutlineShowing.containsLine(line);
+
+ while (y<visibleRect.y+visibleRect.height) {
+ if (paintingOutlineLine) {
+ g.setColor(getForeground());
+ int w2 = width/2;
+ if (line==foldWithOutlineShowing.getEndLine()) {
+ int y2 = y+cellHeight/2;
+ g.drawLine(w2,y, w2,y2);
+ g.drawLine(w2,y2, width-2,y2);
+ paintingOutlineLine = false;
+ }
+ else {
+ g.drawLine(w2,y, w2,y+cellHeight);
+ }
+ }
+ Fold fold = fm.getFoldForLine(line);
+ if (fold!=null) {
+ if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+ g.setColor(getForeground());
+ int w2 = width/2;
+ g.drawLine(w2,y+cellHeight/2, w2,y+cellHeight);
+ paintingOutlineLine = true;
+ }
+ if (fold.isCollapsed()) {
+ collapsedFoldIcon.paintIcon(this, g, x, y);
+ // Skip to next line to paint, taking extra care for lines with
+ // block ends and begins together, e.g. "} else {"
+ do {
+ int hiddenLineCount = fold.getLineCount();
+ if (hiddenLineCount==0) {
+ // Fold parser identified a zero-line fold region.
+ // This is really a bug, but we'll be graceful here
+ // and avoid an infinite loop.
+ break;
+ }
+ line += hiddenLineCount;
+ fold = fm.getFoldForLine(line);
+ } while (fold!=null && fold.isCollapsed());
+ }
+ else {
+ expandedFoldIcon.paintIcon(this, g, x, y);
+ }
+ }
+ line++;
+ y += cellHeight;
+ }
+
+ }
+
+
+ /**
+ * Paints folding icons when line wrapping is enabled.
+ *
+ * @param g The graphics context.
+ */
+ private void paintComponentWrapped(Graphics g) {
+
+ // The variables we use are as follows:
+ // - visibleRect is the "visible" area of the text area; e.g.
+ // [0,100, 300,100+(lineCount*cellHeight)-1].
+ // actualTop.y is the topmost-pixel in the first logical line we
+ // paint. Note that we may well not paint this part of the logical
+ // line, as it may be broken into many physical lines, with the first
+ // few physical lines scrolled past. Note also that this is NOT the
+ // visible rect of this line number list; this line number list has
+ // visible rect == [0,0, insets.left-1,visibleRect.height-1].
+ // - offset (<=0) is the y-coordinate at which we begin painting when
+ // we begin painting with the first logical line. This can be
+ // negative, signifying that we've scrolled past the actual topmost
+ // part of this line.
+
+ // The algorithm is as follows:
+ // - Get the starting y-coordinate at which to paint. This may be
+ // above the first visible y-coordinate as we're in line-wrapping
+ // mode, but we always paint entire logical lines.
+ // - Paint that line's indicator, if appropriate. Increment y to be
+ // just below the are we just painted (i.e., the beginning of the
+ // next logical line's view area).
+ // - Get the ending visual position for that line. We can now loop
+ // back, paint this line, and continue until our y-coordinate is
+ // past the last visible y-value.
+
+ // We avoid using modelToView/viewToModel where possible, as these
+ // methods trigger a parsing of the line into syntax tokens, which is
+ // costly. It's cheaper to just grab the child views' bounds.
+
+ // Some variables we'll be using.
+ int width = getWidth();
+
+ RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+ View v = ui.getRootView(textArea).getView(0);
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int topPosition = textArea.viewToModel(
+ new Point(visibleRect.x,visibleRect.y));
+ int topLine = root.getElementIndex(topPosition);
+ int cellHeight = textArea.getLineHeight();
+ FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+ // Compute the y at which to begin painting text, taking into account
+ // that 1 logical line => at least 1 physical line, so it may be that
+ // y<0. The computed y-value is the y-value of the top of the first
+ // (possibly) partially-visible view.
+ Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+ Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+ visibleEditorRect);
+ int y = r.y;
+ y += (cellHeight-collapsedFoldIcon.getIconHeight())/2;
+
+ int visibleBottom = visibleRect.y + visibleRect.height;
+ int x = width - 10;
+ int line = topLine;
+ boolean paintingOutlineLine = foldWithOutlineShowing!=null &&
+ foldWithOutlineShowing.containsLine(line);
+ int lineCount = root.getElementCount();
+
+ while (y<visibleBottom && line<lineCount) {
+
+ int curLineH = LineNumberList.getChildViewBounds(v, line,
+ visibleEditorRect).height;
+
+ if (paintingOutlineLine) {
+ g.setColor(getForeground());
+ int w2 = width/2;
+ if (line==foldWithOutlineShowing.getEndLine()) {
+ int y2 = y + curLineH - cellHeight/2;
+ g.drawLine(w2,y, w2,y2);
+ g.drawLine(w2,y2, width-2,y2);
+ paintingOutlineLine = false;
+ }
+ else {
+ g.drawLine(w2,y, w2,y+curLineH);
+ }
+ }
+ Fold fold = fm.getFoldForLine(line);
+ if (fold!=null) {
+ if (fold==foldWithOutlineShowing && !fold.isCollapsed()) {
+ g.setColor(getForeground());
+ int w2 = width/2;
+ g.drawLine(w2,y+cellHeight/2, w2,y+curLineH);
+ paintingOutlineLine = true;
+ }
+ if (fold.isCollapsed()) {
+ collapsedFoldIcon.paintIcon(this, g, x, y);
+ y += LineNumberList.getChildViewBounds(v, line,
+ visibleEditorRect).height;
+ line += fold.getLineCount() + 1;
+ }
+ else {
+ expandedFoldIcon.paintIcon(this, g, x, y);
+ y += curLineH;
+ line++;
+ }
+ }
+ else {
+ y += curLineH;
+ line++;
+ }
+ }
+
+ }
+
+
+ private int rowAtPoint(Point p) {
+
+ int line = 0;
+
+ try {
+ int offs = textArea.viewToModel(p);
+ if (offs>-1) {
+ line = textArea.getLineOfOffset(offs);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+
+ return line;
+
+ }
+
+
+ /**
+ * Sets the color to use for the "background" of fold icons. This will
+ * be ignored if custom icons are used.
+ *
+ * @param bg The new background color.
+ * @see #getFoldIconBackground()
+ */
+ public void setFoldIconBackground(Color bg) {
+ foldIconBackground = bg;
+ }
+
+
+ /**
+ * Sets the icons to use to represent collapsed and expanded folds.
+ *
+ * @param collapsedIcon The collapsed fold icon. This cannot be
+ * <code>null</code>.
+ * @param expandedIcon The expanded fold icon. This cannot be
+ * <code>null</code>.
+ */
+ public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+ this.collapsedFoldIcon = collapsedIcon;
+ this.expandedFoldIcon = expandedIcon;
+ revalidate(); // Icons may be different sizes.
+ repaint();
+ }
+
+
+ /**
+ * Toggles whether tool tips should be displayed showing the contents of
+ * collapsed fold regions when the mouse hovers over a +/- icon.
+ *
+ * @param show Whether to show these tool tips.
+ * @see #getShowCollapsedRegionToolTips()
+ */
+ public void setShowCollapsedRegionToolTips(boolean show) {
+ if (show!=showFoldRegionTips) {
+ if (show) {
+ ToolTipManager.sharedInstance().registerComponent(this);
+ }
+ else {
+ ToolTipManager.sharedInstance().unregisterComponent(this);
+ }
+ showFoldRegionTips = show;
+ }
+ }
+
+
+ /**
+ * Overridden so we can track when code folding is enabled/disabled.
+ */
+ public void setTextArea(RTextArea textArea) {
+ if (this.textArea!=null) {
+ this.textArea.removePropertyChangeListener(
+ RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+ }
+ super.setTextArea(textArea);
+ if (this.textArea!=null) {
+ this.textArea.addPropertyChangeListener(
+ RSyntaxTextArea.CODE_FOLDING_PROPERTY, listener);
+ }
+ }
+
+
+ /**
+ * The default +/- icon for expanding and collapsing folds.
+ */
+ private class FoldIcon implements Icon {
+
+ private boolean collapsed;
+
+ public FoldIcon(boolean collapsed) {
+ this.collapsed = collapsed;
+ }
+
+ public int getIconHeight() {
+ return 8;
+ }
+
+ public int getIconWidth() {
+ return 8;
+ }
+
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ g.setColor(foldIconBackground);
+ g.fillRect(x,y, 8,8);
+ g.setColor(getForeground());
+ g.drawRect(x,y, 8,8);
+ g.drawLine(x+2,y+4, x+2+4,y+4);
+ if (collapsed) {
+ g.drawLine(x+4,y+2, x+4,y+6);
+ }
+ }
+
+ }
+
+
+ /**
+ * Listens for events in this component.
+ */
+ private class Listener extends MouseInputAdapter
+ implements PropertyChangeListener {
+
+ public Listener(FoldIndicator fgc) {
+ fgc.addMouseListener(this);
+ fgc.addMouseMotionListener(this);
+ }
+
+ public void mouseClicked(MouseEvent e) {
+
+// // TODO: Implement code folding with word wrap enabled
+// if (textArea.getLineWrap()) {
+// UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+// return;
+// }
+
+ Point p = e.getPoint();
+ int line = rowAtPoint(p);
+
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ FoldManager fm = rsta.getFoldManager();
+
+ Fold fold = fm.getFoldForLine(line);
+ if (fold!=null) {
+ fold.toggleCollapsedState();
+ getGutter().repaint();
+ textArea.repaint();
+ }
+
+ }
+
+ public void mouseExited(MouseEvent e) {
+ if (foldWithOutlineShowing!=null) {
+ foldWithOutlineShowing = null;
+ repaint();
+ }
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ Fold newSelectedFold = findOpenFoldClosestTo(e.getPoint());
+ if (newSelectedFold!=foldWithOutlineShowing &&
+ newSelectedFold!=null && !newSelectedFold.isOnSingleLine()) {
+ foldWithOutlineShowing = newSelectedFold;
+ repaint();
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+ // Whether folding is enabled in the editor has changed.
+ repaint();
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/Gutter.java b/src/org/fife/ui/rtextarea/Gutter.java
new file mode 100644
index 0000000..d521e05
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/Gutter.java
@@ -0,0 +1,965 @@
+/*
+ * 02/17/2009
+ *
+ * Gutter.java - Manages line numbers, icons, etc. on the left-hand side of
+ * an RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ComponentAdapter;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeEvent;
+import org.fife.ui.rsyntaxtextarea.ActiveLineRangeListener;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * The gutter is the component on the left-hand side of the text area that
+ * displays optional information such as line numbers, fold regions, and icons
+ * (for bookmarks, debugging breakpoints, error markers, etc.).<p>
+ *
+ * Icons can be added on a per-line basis to visually mark syntax errors, lines
+ * with breakpoints set on them, etc. To add icons to the gutter, you must
+ * first call {@link RTextScrollPane#setIconRowHeaderEnabled(boolean)} on the
+ * parent scroll pane, to make the icon area visible. Then, you can add icons
+ * that track either lines in the document, or offsets, via
+ * {@link #addLineTrackingIcon(int, Icon)} and
+ * {@link #addOffsetTrackingIcon(int, Icon)}, respectively. To remove an
+ * icon you've added, use {@link #removeTrackingIcon(GutterIconInfo)}.<p>
+ *
+ * In addition to support for arbitrary per-line icons, this component also
+ * has built-in support for displaying icons representing "bookmarks;" that is,
+ * lines a user can cycle through via F2 and Shift+F2. Bookmarked lines are
+ * toggled via Ctrl+F2. In order to enable bookmarking, you must first assign
+ * an icon to represent a bookmarked line, then actually enable the feature:
+ *
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see GutterIconInfo
+ */
+public class Gutter extends JPanel {
+
+ /**
+ * The color used to highlight active line ranges if none is specified.
+ */
+ public static final Color DEFAULT_ACTIVE_LINE_RANGE_COLOR =
+ new Color(51, 153, 255);
+
+ /**
+ * The text area.
+ */
+ private RTextArea textArea;
+
+ /**
+ * Renders line numbers.
+ */
+ private LineNumberList lineNumberList;
+
+ /**
+ * The color used to render line numbers.
+ */
+ private Color lineNumberColor;
+
+ /**
+ * The starting index for line numbers in the gutter.
+ */
+ private int lineNumberingStartIndex;
+
+ /**
+ * The font used to render line numbers.
+ */
+ private Font lineNumberFont;
+
+ /**
+ * Renders bookmark icons, breakpoints, error icons, etc.
+ */
+ private IconRowHeader iconArea;
+
+ /**
+ * Shows lines that are code-foldable.
+ */
+ private FoldIndicator foldIndicator;
+
+ /**
+ * Listens for events in our text area.
+ */
+ private TextAreaListener listener;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The parent text area.
+ */
+ public Gutter(RTextArea textArea) {
+
+ listener = new TextAreaListener();
+ lineNumberColor = Color.gray;
+ lineNumberFont = RTextArea.getDefaultFont();
+ lineNumberingStartIndex = 1;
+
+ setTextArea(textArea);
+ setLayout(new BorderLayout());
+ if (this.textArea!=null) {
+ // Enable line numbers our first time through if they give us
+ // a text area.
+ setLineNumbersEnabled(true);
+ if (this.textArea instanceof RSyntaxTextArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)this.textArea;
+ setFoldIndicatorEnabled(rsta.isCodeFoldingEnabled());
+ }
+ }
+
+ setBorder(new GutterBorder(0, 0, 0, 1)); // Assume ltr
+
+ Color bg = null;
+ if (textArea!=null) {
+ bg = textArea.getBackground(); // May return null if image bg
+ }
+ setBackground(bg!=null ? bg : Color.WHITE);
+
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param line The line to track (zero-based).
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @return A tag for this icon. This can later be used in a call to
+ * {@link #removeTrackingIcon(GutterIconInfo)} to remove this
+ * icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #addLineTrackingIcon(int, Icon, String)
+ * @see #addOffsetTrackingIcon(int, Icon)
+ * @see #removeTrackingIcon(GutterIconInfo)
+ */
+ public GutterIconInfo addLineTrackingIcon(int line, Icon icon)
+ throws BadLocationException {
+ return addLineTrackingIcon(line, icon, null);
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param line The line to track (zero-based).
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @param tip An optional tool tip for the icon.
+ * @return A tag for this icon. This can later be used in a call to
+ * {@link #removeTrackingIcon(GutterIconInfo)} to remove this
+ * icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #addLineTrackingIcon(int, Icon)
+ * @see #addOffsetTrackingIcon(int, Icon)
+ * @see #removeTrackingIcon(GutterIconInfo)
+ */
+ public GutterIconInfo addLineTrackingIcon(int line, Icon icon, String tip)
+ throws BadLocationException {
+ int offs = textArea.getLineStartOffset(line);
+ return addOffsetTrackingIcon(offs, icon, tip);
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param offs The offset to track.
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @return A tag for this icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #addOffsetTrackingIcon(int, Icon, String)
+ * @see #addLineTrackingIcon(int, Icon)
+ * @see #removeTrackingIcon(GutterIconInfo)
+ */
+ public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+ throws BadLocationException {
+ return addOffsetTrackingIcon(offs, icon, null);
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param offs The offset to track.
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @param tip An optional tool tip for the icon.
+ * @return A tag for this icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #addOffsetTrackingIcon(int, Icon)
+ * @see #addLineTrackingIcon(int, Icon)
+ * @see #removeTrackingIcon(GutterIconInfo)
+ */
+ public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon, String tip)
+ throws BadLocationException {
+ return iconArea.addOffsetTrackingIcon(offs, icon, tip);
+ }
+
+
+ /**
+ * Clears the active line range.
+ *
+ * @see #setActiveLineRange(int, int)
+ */
+ private void clearActiveLineRange() {
+ iconArea.clearActiveLineRange();
+ }
+
+
+ /**
+ * Returns the color used to paint the active line range, if any.
+ *
+ * @return The color.
+ * @see #setActiveLineRangeColor(Color)
+ */
+ public Color getActiveLineRangeColor() {
+ return iconArea.getActiveLineRangeColor();
+ }
+
+
+ /**
+ * Returns the icon to use for bookmarks.
+ *
+ * @return The icon to use for bookmarks. If this is <code>null</code>,
+ * bookmarking is effectively disabled.
+ * @see #setBookmarkIcon(Icon)
+ * @see #isBookmarkingEnabled()
+ */
+ public Icon getBookmarkIcon() {
+ return iconArea.getBookmarkIcon();
+ }
+
+
+ /**
+ * Returns the bookmarks known to this gutter.
+ *
+ * @return The bookmarks. If there are no bookmarks, an empty array is
+ * returned.
+ */
+ public GutterIconInfo[] getBookmarks() {
+ return iconArea.getBookmarks();
+ }
+
+
+ /**
+ * Returns the color of the "border" line.
+ *
+ * @return The color.
+ * @see #setBorderColor(Color)
+ */
+ public Color getBorderColor() {
+ return ((GutterBorder)getBorder()).getColor();
+ }
+
+
+ /**
+ * Returns the background color used by the (default) fold icons.
+ *
+ * @return The background color.
+ * @see #setFoldBackground(Color)
+ */
+ public Color getFoldBackground() {
+ return foldIndicator.getFoldIconBackground();
+ }
+
+
+ /**
+ * Returns the foreground color of the fold indicator.
+ *
+ * @return The foreground color of the fold indicator.
+ * @see #setFoldIndicatorForeground(Color)
+ */
+ public Color getFoldIndicatorForeground() {
+ return foldIndicator.getForeground();
+ }
+
+
+ /**
+ * Returns the color to use to paint line numbers.
+ *
+ * @return The color used when painting line numbers.
+ * @see #setLineNumberColor(Color)
+ */
+ public Color getLineNumberColor() {
+ return lineNumberColor;
+ }
+
+
+ /**
+ * Returns the font used for line numbers.
+ *
+ * @return The font used for line numbers.
+ * @see #setLineNumberFont(Font)
+ */
+ public Font getLineNumberFont() {
+ return lineNumberFont;
+ }
+
+
+ /**
+ * Returns the starting line's line number. The default value is
+ * <code>1</code>.
+ *
+ * @return The index
+ * @see #setLineNumberingStartIndex(int)
+ */
+ public int getLineNumberingStartIndex() {
+ return lineNumberingStartIndex;
+ }
+
+
+ /**
+ * Returns <code>true</code> if the line numbers are enabled and visible.
+ *
+ * @return Whether or not line numbers are visible.
+ */
+ public boolean getLineNumbersEnabled() {
+ for (int i=0; i<getComponentCount(); i++) {
+ if (getComponent(i)==lineNumberList) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether tool tips are displayed showing the contents of
+ * collapsed fold regions when the mouse hovers over a +/- icon.
+ *
+ * @return Whether these tool tips are displayed.
+ * @see #setShowCollapsedRegionToolTips(boolean)
+ */
+ public boolean getShowCollapsedRegionToolTips() {
+ return foldIndicator.getShowCollapsedRegionToolTips();
+ }
+
+
+ /**
+ * Returns the tracking icons at the specified view position.
+ *
+ * @param p The view position.
+ * @return The tracking icons at that position. If there are no tracking
+ * icons there, this will be an empty array.
+ * @throws BadLocationException If <code>p</code> is invalid.
+ */
+ public GutterIconInfo[] getTrackingIcons(Point p)
+ throws BadLocationException {
+ int offs = textArea.viewToModel(new Point(0, p.y));
+ int line = textArea.getLineOfOffset(offs);
+ return iconArea.getTrackingIcons(line);
+ }
+
+
+ /**
+ * Returns whether the fold indicator is enabled.
+ *
+ * @return Whether the fold indicator is enabled.
+ * @see #setFoldIndicatorEnabled(boolean)
+ */
+ public boolean isFoldIndicatorEnabled() {
+ for (int i=0; i<getComponentCount(); i++) {
+ if (getComponent(i)==foldIndicator) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns whether bookmarking is enabled.
+ *
+ * @return Whether bookmarking is enabled.
+ * @see #setBookmarkingEnabled(boolean)
+ */
+ public boolean isBookmarkingEnabled() {
+ return iconArea.isBookmarkingEnabled();
+ }
+
+
+ /**
+ * Returns whether the icon row header is enabled.
+ *
+ * @return Whether the icon row header is enabled.
+ */
+ public boolean isIconRowHeaderEnabled() {
+ for (int i=0; i<getComponentCount(); i++) {
+ if (getComponent(i)==iconArea) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Removes the specified tracking icon.
+ *
+ * @param tag A tag for an icon in the gutter, as returned from either
+ * {@link #addLineTrackingIcon(int, Icon)} or
+ * {@link #addOffsetTrackingIcon(int, Icon)}.
+ * @see #removeAllTrackingIcons()
+ * @see #addLineTrackingIcon(int, Icon)
+ * @see #addOffsetTrackingIcon(int, Icon)
+ */
+ public void removeTrackingIcon(GutterIconInfo tag) {
+ iconArea.removeTrackingIcon(tag);
+ }
+
+
+ /**
+ * Removes all tracking icons.
+ *
+ * @see #removeTrackingIcon(GutterIconInfo)
+ * @see #addOffsetTrackingIcon(int, Icon)
+ */
+ public void removeAllTrackingIcons() {
+ iconArea.removeAllTrackingIcons();
+ }
+
+
+ /**
+ * Sets the color to use to render active line ranges.
+ *
+ * @param color The color to use. If this is null, then the default
+ * color is used.
+ * @see #getActiveLineRangeColor()
+ * @see #DEFAULT_ACTIVE_LINE_RANGE_COLOR
+ */
+ public void setActiveLineRangeColor(Color color) {
+ iconArea.setActiveLineRangeColor(color);
+ }
+
+
+ /**
+ * Highlights a range of lines in the icon area. This, of course, will
+ * only be visible if the icon area is visible.
+ *
+ * @param startLine The start of the line range.
+ * @param endLine The end of the line range.
+ * @see #clearActiveLineRange()
+ */
+ private void setActiveLineRange(int startLine, int endLine) {
+ iconArea.setActiveLineRange(startLine, endLine);
+ }
+
+
+ /**
+ * Sets the icon to use for bookmarks.
+ *
+ * @param icon The new bookmark icon. If this is <code>null</code>,
+ * bookmarking is effectively disabled.
+ * @see #getBookmarkIcon()
+ * @see #isBookmarkingEnabled()
+ */
+ public void setBookmarkIcon(Icon icon) {
+ iconArea.setBookmarkIcon(icon);
+ }
+
+
+ /**
+ * Sets whether bookmarking is enabled. Note that a bookmarking icon
+ * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+ * truly enabled.
+ *
+ * @param enabled Whether bookmarking is enabled.
+ * @see #isBookmarkingEnabled()
+ * @see #setBookmarkIcon(Icon)
+ */
+ public void setBookmarkingEnabled(boolean enabled) {
+ iconArea.setBookmarkingEnabled(enabled);
+ if (enabled && !isIconRowHeaderEnabled()) {
+ setIconRowHeaderEnabled(true);
+ }
+ }
+
+
+ /**
+ * Sets the color for the "border" line.
+ *
+ * @param color The new color.
+ * @see #getBorderColor()
+ */
+ public void setBorderColor(Color color) {
+ ((GutterBorder)getBorder()).setColor(color);
+ repaint();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setComponentOrientation(ComponentOrientation o) {
+ // Reuse the border to preserve its color.
+ if (o.isLeftToRight()) {
+ ((GutterBorder)getBorder()).setEdges(0, 0, 0, 1);
+ }
+ else {
+ ((GutterBorder)getBorder()).setEdges(0, 1, 0, 0);
+ }
+ super.setComponentOrientation(o);
+ }
+
+
+ /**
+ * Sets the icons to use to represent collapsed and expanded folds.
+ *
+ * @param collapsedIcon The collapsed fold icon. This cannot be
+ * <code>null</code>.
+ * @param expandedIcon The expanded fold icon. This cannot be
+ * <code>null</code>.
+ */
+ public void setFoldIcons(Icon collapsedIcon, Icon expandedIcon) {
+ if (foldIndicator!=null) {
+ foldIndicator.setFoldIcons(collapsedIcon, expandedIcon);
+ }
+ }
+
+
+ /**
+ * Toggles whether the fold indicator is enabled.
+ *
+ * @param enabled Whether the fold indicator should be enabled.
+ * @see #isFoldIndicatorEnabled()
+ */
+ public void setFoldIndicatorEnabled(boolean enabled) {
+ if (foldIndicator!=null) {
+ if (enabled) {
+ add(foldIndicator, BorderLayout.LINE_END);
+ }
+ else {
+ remove(foldIndicator);
+ }
+ revalidate();
+ }
+ }
+
+
+ /**
+ * Sets the background color used by the (default) fold icons.
+ *
+ * @param bg The new background color.
+ * @see #getFoldBackground()
+ */
+ public void setFoldBackground(Color bg) {
+ if (bg==null) {
+ bg = FoldIndicator.DEFAULT_FOLD_BACKGROUND;
+ }
+ foldIndicator.setFoldIconBackground(bg);
+ }
+
+
+ /**
+ * Sets the foreground color used by the fold indicator.
+ *
+ * @param fg The new fold indicator foreground.
+ * @see #getFoldIndicatorForeground()
+ */
+ public void setFoldIndicatorForeground(Color fg) {
+ if (fg==null) {
+ fg = FoldIndicator.DEFAULT_FOREGROUND;
+ }
+ foldIndicator.setForeground(fg);
+ }
+
+
+ /**
+ * Toggles whether the icon row header (used for breakpoints, bookmarks,
+ * etc.) is enabled.
+ *
+ * @param enabled Whether the icon row header is enabled.
+ * @see #isIconRowHeaderEnabled()
+ */
+ void setIconRowHeaderEnabled(boolean enabled) {
+ if (iconArea!=null) {
+ if (enabled) {
+ add(iconArea, BorderLayout.LINE_START);
+ }
+ else {
+ remove(iconArea);
+ }
+ revalidate();
+ }
+ }
+
+
+ /**
+ * Sets the color to use to paint line numbers.
+ *
+ * @param color The color to use when painting line numbers.
+ * @see #getLineNumberColor()
+ */
+ public void setLineNumberColor(Color color) {
+ if (color!=null && !color.equals(lineNumberColor)) {
+ lineNumberColor = color;
+ if (lineNumberList!=null) {
+ lineNumberList.setForeground(color);
+ }
+ }
+ }
+
+
+ /**
+ * Sets the font used for line numbers.
+ *
+ * @param font The font to use. This cannot be <code>null</code>.
+ * @see #getLineNumberFont()
+ */
+ public void setLineNumberFont(Font font) {
+ if (font==null) {
+ throw new IllegalArgumentException("font cannot be null");
+ }
+ if (!font.equals(lineNumberFont)) {
+ lineNumberFont = font;
+ if (lineNumberList!=null) {
+ lineNumberList.setFont(font);
+ }
+ }
+ }
+
+
+ /**
+ * Sets the starting line's line number. The default value is
+ * <code>1</code>. Applications can call this method to change this value
+ * if they are displaying a subset of lines in a file, for example.
+ *
+ * @param index The new index.
+ * @see #getLineNumberingStartIndex()
+ */
+ public void setLineNumberingStartIndex(int index) {
+ if (index!=lineNumberingStartIndex) {
+ lineNumberingStartIndex = index;
+ lineNumberList.setLineNumberingStartIndex(index);
+ }
+ }
+
+
+ /**
+ * Toggles whether or not line numbers are visible.
+ *
+ * @param enabled Whether or not line numbers should be visible.
+ * @see #getLineNumbersEnabled()
+ */
+ void setLineNumbersEnabled(boolean enabled) {
+ if (lineNumberList!=null) {
+ if (enabled) {
+ add(lineNumberList);
+ }
+ else {
+ remove(lineNumberList);
+ }
+ revalidate();
+ }
+ }
+
+
+ /**
+ * Toggles whether tool tips should be displayed showing the contents of
+ * collapsed fold regions when the mouse hovers over a +/- icon.
+ *
+ * @param show Whether to show these tool tips.
+ * @see #getShowCollapsedRegionToolTips()
+ */
+ public void setShowCollapsedRegionToolTips(boolean show) {
+ if (foldIndicator!=null) {
+ foldIndicator.setShowCollapsedRegionToolTips(show);
+ }
+ }
+
+
+ /**
+ * Sets the text area being displayed. This will clear any tracking
+ * icons currently displayed.
+ *
+ * @param textArea The text area.
+ */
+ void setTextArea(RTextArea textArea) {
+
+ if (this.textArea!=null) {
+ listener.uninstall();
+ }
+
+ if (textArea!=null) {
+
+ RTextAreaEditorKit kit = (RTextAreaEditorKit)textArea.getUI().
+ getEditorKit(textArea);
+
+ if (lineNumberList==null) {
+ lineNumberList = kit.createLineNumberList(textArea);
+ lineNumberList.setFont(getLineNumberFont());
+ lineNumberList.setForeground(getLineNumberColor());
+ lineNumberList.setLineNumberingStartIndex(
+ getLineNumberingStartIndex());
+ }
+ else {
+ lineNumberList.setTextArea(textArea);
+ }
+ if (iconArea==null) {
+ iconArea = kit.createIconRowHeader(textArea);
+ }
+ else {
+ iconArea.setTextArea(textArea);
+ }
+ if (foldIndicator==null) {
+ foldIndicator = new FoldIndicator(textArea);
+ }
+ else {
+ foldIndicator.setTextArea(textArea);
+ }
+
+ listener.install(textArea);
+
+ }
+
+ this.textArea = textArea;
+
+ }
+
+
+ /**
+ * Programatically toggles whether there is a bookmark for the specified
+ * line. If bookmarking is not enabled, this method does nothing.
+ *
+ * @param line The line.
+ * @return Whether a bookmark is now at the specified line.
+ * @throws BadLocationException If <code>line</code> is an invalid line
+ * number in the text area.
+ */
+ public boolean toggleBookmark(int line) throws BadLocationException {
+ return iconArea.toggleBookmark(line);
+ }
+
+
+// public void setUI(ComponentUI ui) {
+//
+// Border gutterBorder = getBorder();
+//
+// super.setUI(ui);
+//
+// // Some LaFs, such as WebLookAndFeel, override borders even when
+// // they aren't UIResources.
+// Border border = getBorder();
+// if (border != gutterBorder) {
+// setBorder(gutterBorder);
+// }
+//
+// }
+//
+//
+public void setBorder(Border border) {
+ if (border instanceof GutterBorder) {
+ super.setBorder(border);
+ }
+}
+ /**
+ * The border used by the gutter.
+ */
+ private static class GutterBorder extends EmptyBorder {
+
+ private Color color;
+ private Rectangle visibleRect;
+
+ public GutterBorder(int top, int left, int bottom, int right) {
+ super(top, left, bottom, right);
+ color = new Color(221, 221, 221);
+ visibleRect = new Rectangle();
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void paintBorder(Component c, Graphics g, int x, int y,
+ int width, int height) {
+
+ visibleRect = g.getClipBounds(visibleRect);
+ if (visibleRect==null) { // ???
+ visibleRect = ((JComponent)c).getVisibleRect();
+ }
+
+ g.setColor(color);
+ if (left==1) {
+ g.drawLine(0,visibleRect.y,
+ 0,visibleRect.y+visibleRect.height);
+ }
+ else {
+ g.drawLine(width-1,visibleRect.y,
+ width-1,visibleRect.y+visibleRect.height);
+ }
+
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ public void setEdges(int top, int left, int bottom, int right) {
+ this.top = top;
+ this.left = left;
+ this.bottom = bottom;
+ this.right = right;
+ }
+
+ }
+
+
+ /**
+ * Listens for the text area resizing.
+ */
+ /*
+ * This is necessary to keep child components the same height as the text
+ * area. The worse case is when the user toggles word-wrap and it changes
+ * the height of the text area. In that case, if we listen for the
+ * "lineWrap" property change, we get notified BEFORE the text area
+ * decides on its new size, thus we cannot resize properly. We listen
+ * instead for ComponentEvents so we change size after the text area has
+ * resized.
+ */
+ private class TextAreaListener extends ComponentAdapter
+ implements DocumentListener, PropertyChangeListener,
+ ActiveLineRangeListener {
+
+ private boolean installed;
+
+ /**
+ * Modifies the "active line range" that is painted in this component.
+ *
+ * @param e Information about the new "active line range."
+ */
+ public void activeLineRangeChanged(ActiveLineRangeEvent e) {
+ if (e.getMin()==-1) {
+ clearActiveLineRange();
+ }
+ else {
+ setActiveLineRange(e.getMin(), e.getMax());
+ }
+ }
+
+ public void changedUpdate(DocumentEvent e) {}
+
+ public void componentResized(java.awt.event.ComponentEvent e) {
+ revalidate();
+ }
+
+ protected void handleDocumentEvent(DocumentEvent e) {
+ for (int i=0; i<getComponentCount(); i++) {
+ AbstractGutterComponent agc =
+ (AbstractGutterComponent)getComponent(i);
+ agc.handleDocumentEvent(e);
+ }
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ handleDocumentEvent(e);
+ }
+
+ public void install(RTextArea textArea) {
+ if (installed) {
+ uninstall();
+ }
+ textArea.addComponentListener(this);
+ textArea.getDocument().addDocumentListener(this);
+ textArea.addPropertyChangeListener(this);
+ if (textArea instanceof RSyntaxTextArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ rsta.addActiveLineRangeListener(this);
+ rsta.getFoldManager().addPropertyChangeListener(this);
+ }
+ installed = true;
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+
+ String name = e.getPropertyName();
+
+ // If they change the text area's font, we need to update cell
+ // heights to match the font's height.
+ if ("font".equals(name) ||
+ RSyntaxTextArea.SYNTAX_SCHEME_PROPERTY.equals(name)) {
+ for (int i=0; i<getComponentCount(); i++) {
+ AbstractGutterComponent agc =
+ (AbstractGutterComponent)getComponent(i);
+ agc.lineHeightsChanged();
+ }
+ }
+
+ // If they toggle whether code folding is enabled...
+ else if (RSyntaxTextArea.CODE_FOLDING_PROPERTY.equals(name)) {
+ boolean foldingEnabled = ((Boolean)e.getNewValue()).
+ booleanValue();
+ if (lineNumberList!=null) { // Its size depends on folding
+ //lineNumberList.revalidate();
+ lineNumberList.updateCellWidths();
+ }
+ setFoldIndicatorEnabled(foldingEnabled);
+ }
+
+ // If code folds are updated...
+ else if (FoldManager.PROPERTY_FOLDS_UPDATED.equals(name)) {
+ repaint();
+ }
+
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ handleDocumentEvent(e);
+ }
+
+ public void uninstall() {
+ if (installed) {
+ textArea.removeComponentListener(this);
+ textArea.getDocument().removeDocumentListener(this);
+ if (textArea instanceof RSyntaxTextArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ rsta.removeActiveLineRangeListener(this);
+ rsta.getFoldManager().removePropertyChangeListener(this);
+ }
+ installed = false;
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/GutterIconInfo.java b/src/org/fife/ui/rtextarea/GutterIconInfo.java
new file mode 100644
index 0000000..e0c23fc
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/GutterIconInfo.java
@@ -0,0 +1,53 @@
+/*
+ * 02/19/2009
+ *
+ * GutterIconInfo.java - Information about an Icon in a Gutter.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.Icon;
+
+
+/**
+ * Information about an icon displayed in a {@link Gutter}. Instances of this
+ * class are returned by {@link Gutter#addLineTrackingIcon(int, Icon)} and
+ * {@link Gutter#addOffsetTrackingIcon(int, Icon)}. They can later be used
+ * in calls to {@link Gutter#removeTrackingIcon(GutterIconInfo)} to be
+ * individually removed.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see Gutter
+ */
+public interface GutterIconInfo {
+
+
+ /**
+ * Returns the icon being rendered.
+ *
+ * @return The icon being rendered.
+ */
+ public Icon getIcon();
+
+
+ /**
+ * Returns the offset that is being tracked. The line of this offset is
+ * where the icon is rendered. This offset may change as the user types
+ * to track the new location of the marked offset.
+ *
+ * @return The offset being tracked.
+ */
+ public int getMarkedOffset();
+
+
+ /**
+ * Returns the tool tip to display when the mouse hovers over this icon.
+ *
+ * @return The tool tip to display.
+ */
+ public String getToolTip();
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/IconGroup.java b/src/org/fife/ui/rtextarea/IconGroup.java
new file mode 100644
index 0000000..0e73f33
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/IconGroup.java
@@ -0,0 +1,245 @@
+/*
+ * 09/05/2004
+ *
+ * IconGroup.java - Class encapsulating images used for RTextArea actions.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.security.AccessControlException;
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+
+/**
+ * This class encapsulates the location, properties, etc. of an icon set used
+ * for an instance of <code>RTextArea</code>. If the location of the icon
+ * group is invalid in any way, any attempt to retrieve icons from an icon
+ * group will return <code>null</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class IconGroup {
+
+ private String path;
+ private boolean separateLargeIcons;
+ private String largeIconSubDir;
+ private String extension;
+ private String name;
+ private String jarFile;
+
+ private static final String DEFAULT_EXTENSION = "gif";
+
+
+ /**
+ * Creates an icon set without "large versions" of the icons.
+ *
+ * @param name The name of the icon group.
+ * @param path The directory containing the icon group.
+ */
+ public IconGroup(String name, String path) {
+ this(name, path, null);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the icon group.
+ * @param path The directory containing the icon group.
+ * @param largeIconSubDir The subdirectory containing "large versions" of
+ * the icons. If no subdirectory exists, pass in <code>null</code>.
+ */
+ public IconGroup(String name, String path, String largeIconSubDir) {
+ this(name, path, largeIconSubDir, DEFAULT_EXTENSION);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the icon group.
+ * @param path The directory containing the icon group.
+ * @param largeIconSubDir The subdirectory containing "large versions" of
+ * the icons. If no subdirectory exists, pass in <code>null</code>.
+ * @param extension The extension of the icons (one of <code>gif</code>,
+ * <code>jpg</code>, or <code>png</code>).
+ */
+ public IconGroup(String name, String path, String largeIconSubDir,
+ String extension) {
+ this(name, path, largeIconSubDir, extension, null);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the icon group.
+ * @param path The directory containing the icon group.
+ * @param largeIconSubDir The subdirectory containing "large versions" of
+ * the icons. If no subdirectory exists, pass in <code>null</code>.
+ * @param extension The extension of the icons (one of <code>gif</code>,
+ * <code>jpg</code>, or <code>png</code>).
+ * @param jar The Jar file containing the icons, or <code>null</code> if
+ * the icons are on the local file system. If a Jar is specified,
+ * the value of <code>path</code> must be a path in the Jar file.
+ * If this is not a valid Jar file, then no Jar file will be used,
+ * meaning all icons returned from this icon group will be
+ * <code>null</code>.
+ */
+ public IconGroup(String name, String path, String largeIconSubDir,
+ String extension, String jar) {
+ this.name = name;
+ this.path = path;
+ if (path!=null && path.length()>0 && !path.endsWith("/")) {
+ this.path += "/";
+ }
+ this.separateLargeIcons = (largeIconSubDir!=null);
+ this.largeIconSubDir = largeIconSubDir;
+ this.extension = extension!=null ? extension : DEFAULT_EXTENSION;
+ this.jarFile = jar;
+ }
+
+
+ /**
+ * Returns whether two icon groups are equal.
+ *
+ * @param o2 The object to check against.
+ * @return Whether <code>o2</code> represents the same icons as this icon
+ * group.
+ */
+ public boolean equals(Object o2) {
+ if (o2!=null && o2 instanceof IconGroup) {
+ IconGroup ig2 = (IconGroup)o2;
+ if (ig2.getName().equals(getName()) &&
+ separateLargeIcons==ig2.hasSeparateLargeIcons()) {
+ if (separateLargeIcons) {
+ if (!largeIconSubDir.equals(ig2.largeIconSubDir))
+ return false;
+ }
+ return path.equals(ig2.path);
+ }
+ // If we got here, separateLargeIcons values weren't equal.
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns the icon from this icon group with the specified name.
+ *
+ * @param name The name of the icon. For example, if you want the icon
+ * specified in <code>new.gif</code>, this value should be
+ * <code>new</code>.
+ * @return The icon, or <code>null</code> if it could not be found or
+ * loaded.
+ * @see #getLargeIcon
+ */
+ public Icon getIcon(String name) {
+ Icon icon = getIconImpl(path + name + "." + extension);
+ // JDK 6.0 b74 returns icons with width/height==-1 in certain error
+ // cases (new ImageIcon(url) where url is not resolved?). We'll
+ // just return null in this case as Swing AbstractButtons throw
+ // exceptions when expected to paint an icon with width or height
+ // is less than 1.
+ if (icon!=null && (icon.getIconWidth()<1 || icon.getIconHeight()<1)) {
+ icon = null;
+ }
+ return icon;
+ }
+
+
+ /**
+ * Does the dirty work of loading an image.
+ *
+ * @param iconFullPath The full path to the icon, either on the local
+ * file system or in the Jar file, if this icon group represents
+ * icons in a Jar file.
+ * @return The icon.
+ */
+ private Icon getIconImpl(String iconFullPath) {
+ try {
+ if (jarFile==null) {
+ // First see if it's on our classpath (e.g. an icon in
+ // RText.jar, so we'd need to use the class loader).
+ URL url = getClass().getClassLoader().
+ getResource(iconFullPath);
+ if (url!=null)
+ return new ImageIcon(url);
+ // If not, see if it's a plain file on disk.
+ BufferedImage image = ImageIO.read(new File(iconFullPath));
+ return image!=null ? new ImageIcon(image) : null;
+ }
+ else { // If it's in a Jar, create a URL and grab it.
+ URL url = new URL("jar:file:///" +
+ jarFile + "!/" + iconFullPath);
+ //System.err.println("***** " + url.toString());
+ return new ImageIcon(url);
+ }
+ } catch (AccessControlException ace) {
+ return null; // Likely in an applet or WebStart
+ } catch (IOException ioe) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Returns the large icon from this icon group with the specified name.
+ * If this icon group does not have large icons, <code>null</code> is
+ * returned.
+ *
+ * @param name The name of the icon. For example, if you want the icon
+ * specified in <code>new.gif</code>, this value should be
+ * <code>new</code>.
+ * @return The icon, or <code>null</code> if it could not be found or
+ * loaded.
+ * @see #getLargeIcon
+ */
+ public Icon getLargeIcon(String name) {
+ return getIconImpl(path + largeIconSubDir + "/" +
+ name + "." + extension);
+ }
+
+
+ /**
+ * Returns the name of this icon group.
+ *
+ * @return This icon group's name.
+ */
+ public String getName() {
+ return name;
+ }
+
+
+ /**
+ * Returns whether a separate directory for the large icons exists.
+ *
+ * @return Whether a directory containing "large versions" ov the icons
+ * exists.
+ * @see #getLargeIcon(String)
+ */
+ public boolean hasSeparateLargeIcons() {
+ return separateLargeIcons;
+ }
+
+
+ /**
+ * Overridden since we also override {@link #equals(Object)}, to honor
+ * the invariant that equal objects must have equal hashcodes. This also
+ * keeps FindBugs happy.
+ */
+ public int hashCode() {
+ return getName().hashCode();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/IconRowHeader.java b/src/org/fife/ui/rtextarea/IconRowHeader.java
new file mode 100644
index 0000000..16a2642
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/IconRowHeader.java
@@ -0,0 +1,864 @@
+/*
+ * 02/17/2009
+ *
+ * IconRowHeader.java - Renders icons in the gutter.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.Icon;
+import javax.swing.JPanel;
+import javax.swing.ToolTipManager;
+import javax.swing.UIManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.FoldingAwareIconRowHeader;
+
+
+/**
+ * Renders icons in the {@link Gutter}. This can be used to visually mark
+ * lines containing syntax errors, lines with breakpoints set on them, etc.<p>
+ *
+ * This component has built-in support for displaying icons representing
+ * "bookmarks;" that is, lines a user can cycle through via F2 and Shift+F2.
+ * Bookmarked lines are toggled via Ctrl+F2, or by clicking in the icon area
+ * at the line to bookmark. In order to enable bookmarking, you must first
+ * assign an icon to represent a bookmarked line, then actually enable the
+ * feature. This is actually done on the parent {@link Gutter} component:<p>
+ *
+ * <pre>
+ * Gutter gutter = scrollPane.getGutter();
+ * gutter.setBookmarkIcon(new ImageIcon("bookmark.png"));
+ * gutter.setBookmarkingEnabled(true);
+ * </pre>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see FoldingAwareIconRowHeader
+ */
+public class IconRowHeader extends AbstractGutterComponent implements MouseListener {
+
+ /**
+ * The icons to render.
+ */
+ protected List trackingIcons;
+
+ /**
+ * The width of this component.
+ */
+ protected int width;
+
+ /**
+ * Whether this component listens for mouse clicks and toggles "bookmark"
+ * icons on them.
+ */
+ private boolean bookmarkingEnabled;
+
+ /**
+ * The icon to use for bookmarks.
+ */
+ private Icon bookmarkIcon;
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ protected Rectangle visibleRect;
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ protected Insets textAreaInsets;
+
+ /**
+ * The first line in the active line range.
+ */
+ protected int activeLineRangeStart;
+
+ /**
+ * The end line in the active line range.
+ */
+ protected int activeLineRangeEnd;
+
+ /**
+ * The color used to highlight the active code block.
+ */
+ private Color activeLineRangeColor;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The parent text area.
+ */
+ public IconRowHeader(RTextArea textArea) {
+
+ super(textArea);
+ visibleRect = new Rectangle();
+ width = 16;
+ addMouseListener(this);
+ activeLineRangeStart = activeLineRangeEnd = -1;
+ setActiveLineRangeColor(null);
+
+ // Must explicitly set our background color, otherwise we inherit that
+ // of the parent Gutter.
+ updateBackground();
+
+ ToolTipManager.sharedInstance().registerComponent(this);
+
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param offs The offset to track.
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @return A tag for this icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #removeTrackingIcon(Object)
+ */
+ public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon)
+ throws BadLocationException {
+ return addOffsetTrackingIcon(offs, icon, null);
+ }
+
+
+ /**
+ * Adds an icon that tracks an offset in the document, and is displayed
+ * adjacent to the line numbers. This is useful for marking things such
+ * as source code errors.
+ *
+ * @param offs The offset to track.
+ * @param icon The icon to display. This should be small (say 16x16).
+ * @param tip A tool tip for the icon.
+ * @return A tag for this icon.
+ * @throws BadLocationException If <code>offs</code> is an invalid offset
+ * into the text area.
+ * @see #removeTrackingIcon(Object)
+ */
+ public GutterIconInfo addOffsetTrackingIcon(int offs, Icon icon, String tip)
+ throws BadLocationException {
+ Position pos = textArea.getDocument().createPosition(offs);
+ GutterIconImpl ti = new GutterIconImpl(icon, pos, tip);
+ if (trackingIcons==null) {
+ trackingIcons = new ArrayList(1); // Usually small
+ }
+ int index = Collections.binarySearch(trackingIcons, ti);
+ if (index<0) {
+ index = -(index+1);
+ }
+ trackingIcons.add(index, ti);
+ repaint();
+ return ti;
+ }
+
+
+ /**
+ * Clears the active line range.
+ *
+ * @see #setActiveLineRange(int, int)
+ */
+ public void clearActiveLineRange() {
+ if (activeLineRangeStart!=-1 || activeLineRangeEnd!=-1) {
+ activeLineRangeStart = activeLineRangeEnd = -1;
+ repaint();
+ }
+ }
+
+
+ /**
+ * Returns the color used to paint the active line range, if any.
+ *
+ * @return The color.
+ * @see #setActiveLineRangeColor(Color)
+ */
+ public Color getActiveLineRangeColor() {
+ return activeLineRangeColor;
+ }
+
+
+ /**
+ * Returns the icon to use for bookmarks.
+ *
+ * @return The icon to use for bookmarks. If this is <code>null</code>,
+ * bookmarking is effectively disabled.
+ * @see #setBookmarkIcon(Icon)
+ * @see #isBookmarkingEnabled()
+ */
+ public Icon getBookmarkIcon() {
+ return bookmarkIcon;
+ }
+
+
+ /**
+ * Returns the bookmarks known to this gutter.
+ *
+ * @return The bookmarks. If there are no bookmarks, an empty array is
+ * returned.
+ */
+ public GutterIconInfo[] getBookmarks() {
+
+ List retVal = new ArrayList(1);
+
+ if (trackingIcons!=null) {
+ for (int i=0; i<trackingIcons.size(); i++) {
+ GutterIconImpl ti = getTrackingIcon(i);
+ if (ti.getIcon()==bookmarkIcon) {
+ retVal.add(ti);
+ }
+ }
+ }
+
+ GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+ return (GutterIconInfo[])retVal.toArray(array);
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ void handleDocumentEvent(DocumentEvent e) {
+ int newLineCount = textArea.getLineCount();
+ if (newLineCount!=currentLineCount) {
+ currentLineCount = newLineCount;
+ repaint();
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Dimension getPreferredSize() {
+ int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+ return new Dimension(width, h);
+ }
+
+
+ /**
+ * Overridden to display the tool tip of any icons on this line.
+ *
+ * @param e The location the mouse is hovering over.
+ */
+ public String getToolTipText(MouseEvent e) {
+ try {
+ int line = viewToModelLine(e.getPoint());
+ if (line>-1) {
+ GutterIconInfo[] infos = getTrackingIcons(line);
+ if (infos.length>0) {
+ // TODO: Display all messages?
+ return infos[infos.length-1].getToolTip();
+ }
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ return null;
+ }
+
+
+ protected GutterIconImpl getTrackingIcon(int index) {
+ return (GutterIconImpl)trackingIcons.get(index);
+ }
+
+
+ /**
+ * Returns the tracking icons at the specified line.
+ *
+ * @param line The line.
+ * @return The tracking icons at that line. If there are no tracking
+ * icons there, this will be an empty array.
+ * @throws BadLocationException If <code>line</code> is invalid.
+ */
+ public GutterIconInfo[] getTrackingIcons(int line)
+ throws BadLocationException {
+
+ List retVal = new ArrayList(1);
+
+ if (trackingIcons!=null) {
+ int start = textArea.getLineStartOffset(line);
+ int end = textArea.getLineEndOffset(line);
+ if (line==textArea.getLineCount()-1) {
+ end++; // Hack
+ }
+ for (int i=0; i<trackingIcons.size(); i++) {
+ GutterIconImpl ti = getTrackingIcon(i);
+ int offs = ti.getMarkedOffset();
+ if (offs>=start && offs<end) {
+ retVal.add(ti);
+ }
+ else if (offs>=end) {
+ break; // Quit early
+ }
+ }
+ }
+
+ GutterIconInfo[] array = new GutterIconInfo[retVal.size()];
+ return (GutterIconInfo[])retVal.toArray(array);
+
+ }
+
+
+ /**
+ * Returns whether bookmarking is enabled.
+ *
+ * @return Whether bookmarking is enabled.
+ * @see #setBookmarkingEnabled(boolean)
+ */
+ public boolean isBookmarkingEnabled() {
+ return bookmarkingEnabled;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ void lineHeightsChanged() {
+ repaint();
+ }
+
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+
+ public void mousePressed(MouseEvent e) {
+ if (bookmarkingEnabled && bookmarkIcon!=null) {
+ try {
+ int line = viewToModelLine(e.getPoint());
+ if (line>-1) {
+ toggleBookmark(line);
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ }
+
+
+ public void mouseReleased(MouseEvent e) {
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void paintComponent(Graphics g) {
+
+ if (textArea==null) {
+ return;
+ }
+
+ visibleRect = g.getClipBounds(visibleRect);
+ if (visibleRect==null) { // ???
+ visibleRect = getVisibleRect();
+ }
+ //System.out.println("IconRowHeader repainting: " + visibleRect);
+ if (visibleRect==null) {
+ return;
+ }
+
+ g.setColor(getBackground());
+ g.fillRect(0,visibleRect.y, width,visibleRect.height);
+
+ if (textArea.getLineWrap()) {
+ paintComponentWrapped(g);
+ return;
+ }
+
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ textAreaInsets = textArea.getInsets(textAreaInsets);
+
+ // Get the first and last lines to paint.
+ int cellHeight = textArea.getLineHeight();
+ int topLine = (visibleRect.y-textAreaInsets.top)/cellHeight;
+ int bottomLine = Math.min(topLine+visibleRect.height/cellHeight+1,
+ root.getElementCount());
+
+ // Get where to start painting (top of the row).
+ // We need to be "scrolled up" up just enough for the missing part of
+ // the first line.
+ int y = topLine*cellHeight + textAreaInsets.top;
+
+ if ((activeLineRangeStart>=topLine&&activeLineRangeStart<=bottomLine) ||
+ (activeLineRangeEnd>=topLine && activeLineRangeEnd<=bottomLine) ||
+ (activeLineRangeStart<=topLine && activeLineRangeEnd>=bottomLine)) {
+
+ g.setColor(activeLineRangeColor);
+ int firstLine = Math.max(activeLineRangeStart, topLine);
+ int y1 = firstLine * cellHeight + textAreaInsets.top;
+ int lastLine = Math.min(activeLineRangeEnd, bottomLine);
+ int y2 = (lastLine+1) * cellHeight + textAreaInsets.top - 1;
+
+ int j = y1;
+ while (j<=y2) {
+ int yEnd = Math.min(y2, j+getWidth());
+ int xEnd = yEnd-j;
+ g.drawLine(0,j, xEnd,yEnd);
+ j += 2;
+ }
+
+ int i = 2;
+ while (i<getWidth()) {
+ int yEnd = y1 + getWidth() - i;
+ g.drawLine(i,y1, getWidth(),yEnd);
+ i += 2;
+ }
+
+ if (firstLine==activeLineRangeStart) {
+ g.drawLine(0,y1, getWidth(),y1);
+ }
+ if (lastLine==activeLineRangeEnd) {
+ g.drawLine(0,y2, getWidth(),y2);
+ }
+
+ }
+
+ if (trackingIcons!=null) {
+ int lastLine = bottomLine;
+ for (int i=trackingIcons.size()-1; i>=0; i--) { // Last to first
+ GutterIconInfo ti = getTrackingIcon(i);
+ int offs = ti.getMarkedOffset();
+ if (offs>=0 && offs<=doc.getLength()) {
+ int line = root.getElementIndex(offs);
+ if (line<=lastLine && line>=topLine) {
+ Icon icon = ti.getIcon();
+ if (icon!=null) {
+ int y2 = y + (line-topLine)*cellHeight;
+ y2 += (cellHeight-icon.getIconHeight())/2;
+ ti.getIcon().paintIcon(this, g, 0, y2);
+ lastLine = line-1; // Paint only 1 icon per line
+ }
+ }
+ else if (line<topLine) {
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+
+ /**
+ * Paints icons when line wrapping is enabled.
+ *
+ * @param g The graphics context.
+ */
+ private void paintComponentWrapped(Graphics g) {
+
+ // The variables we use are as follows:
+ // - visibleRect is the "visible" area of the text area; e.g.
+ // [0,100, 300,100+(lineCount*cellHeight)-1].
+ // actualTop.y is the topmost-pixel in the first logical line we
+ // paint. Note that we may well not paint this part of the logical
+ // line, as it may be broken into many physical lines, with the first
+ // few physical lines scrolled past. Note also that this is NOT the
+ // visible rect of this line number list; this line number list has
+ // visible rect == [0,0, insets.left-1,visibleRect.height-1].
+ // - offset (<=0) is the y-coordinate at which we begin painting when
+ // we begin painting with the first logical line. This can be
+ // negative, signifying that we've scrolled past the actual topmost
+ // part of this line.
+
+ // The algorithm is as follows:
+ // - Get the starting y-coordinate at which to paint. This may be
+ // above the first visible y-coordinate as we're in line-wrapping
+ // mode, but we always paint entire logical lines.
+ // - Paint that line's line number and highlight, if appropriate.
+ // Increment y to be just below the are we just painted (i.e., the
+ // beginning of the next logical line's view area).
+ // - Get the ending visual position for that line. We can now loop
+ // back, paint this line, and continue until our y-coordinate is
+ // past the last visible y-value.
+
+ // We avoid using modelToView/viewToModel where possible, as these
+ // methods trigger a parsing of the line into syntax tokens, which is
+ // costly. It's cheaper to just grab the child views' bounds.
+
+ RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+ View v = ui.getRootView(textArea).getView(0);
+// boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+ int topPosition = textArea.viewToModel(
+ new Point(visibleRect.x,visibleRect.y));
+ int topLine = root.getElementIndex(topPosition);
+
+ // Compute the y at which to begin painting text, taking into account
+ // that 1 logical line => at least 1 physical line, so it may be that
+ // y<0. The computed y-value is the y-value of the top of the first
+ // (possibly) partially-visible view.
+ Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+ Rectangle r = IconRowHeader.getChildViewBounds(v, topLine,
+ visibleEditorRect);
+ int y = r.y;
+
+ int visibleBottom = visibleRect.y + visibleRect.height;
+
+ // Get the first possibly visible icon index.
+ int currentIcon = -1;
+ if (trackingIcons!=null) {
+ for (int i=0; i<trackingIcons.size(); i++) {
+ GutterIconImpl icon = getTrackingIcon(i);
+ int offs = icon.getMarkedOffset();
+ if (offs>=0 && offs<=doc.getLength()) {
+ int line = root.getElementIndex(offs);
+ if (line>=topLine) {
+ currentIcon = i;
+ break;
+ }
+ }
+ }
+ }
+
+ // Keep painting lines until our y-coordinate is past the visible
+ // end of the text area.
+ g.setColor(getForeground());
+ int cellHeight = textArea.getLineHeight();
+ while (y < visibleBottom) {
+
+ r = getChildViewBounds(v, topLine, visibleEditorRect);
+// int lineEndY = r.y+r.height;
+
+ /*
+ // Highlight the current line's line number, if desired.
+ if (currentLineHighlighted && topLine==currentLine) {
+ g.setColor(textArea.getCurrentLineHighlightColor());
+ g.fillRect(0,y, width,lineEndY-y);
+ g.setColor(getForeground());
+ }
+ */
+
+ // Possibly paint an icon.
+ if (currentIcon>-1) {
+ // We want to paint the last icon added for this line.
+ GutterIconImpl toPaint = null;
+ while (currentIcon<trackingIcons.size()) {
+ GutterIconImpl ti = getTrackingIcon(currentIcon);
+ int offs = ti.getMarkedOffset();
+ if (offs>=0 && offs<=doc.getLength()) {
+ int line = root.getElementIndex(offs);
+ if (line==topLine) {
+ toPaint = ti;
+ }
+ else if (line>topLine) {
+ break;
+ }
+ }
+ currentIcon++;
+ }
+ if (toPaint!=null) {
+ Icon icon = toPaint.getIcon();
+ if (icon!=null) {
+ int y2 = y + (cellHeight-icon.getIconHeight())/2;
+ icon.paintIcon(this, g, 0, y2);
+ }
+ }
+ }
+
+ // The next possible y-coordinate is just after the last line
+ // painted.
+ y += r.height;
+
+ // Update topLine (we're actually using it for our "current line"
+ // variable now).
+ topLine++;
+ if (topLine>=lineCount)
+ break;
+
+ }
+
+ }
+
+
+ /**
+ * Removes the specified tracking icon.
+ *
+ * @param tag A tag for a tracking icon.
+ * @see #removeAllTrackingIcons()
+ * @see #addOffsetTrackingIcon(int, Icon)
+ */
+ public void removeTrackingIcon(Object tag) {
+ if (trackingIcons!=null && trackingIcons.remove(tag)) {
+ repaint();
+ }
+ }
+
+
+ /**
+ * Removes all tracking icons.
+ *
+ * @see #removeTrackingIcon(Object)
+ * @see #addOffsetTrackingIcon(int, Icon)
+ */
+ public void removeAllTrackingIcons() {
+ if (trackingIcons!=null && trackingIcons.size()>0) {
+ trackingIcons.clear();
+ repaint();
+ }
+ }
+
+
+ /**
+ * Removes all bookmark tracking icons.
+ */
+ private void removeBookmarkTrackingIcons() {
+ if (trackingIcons!=null) {
+ for (Iterator i=trackingIcons.iterator(); i.hasNext(); ) {
+ GutterIconImpl ti = (GutterIconImpl)i.next();
+ if (ti.getIcon()==bookmarkIcon) {
+ i.remove();
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Highlights a range of lines in the icon area.
+ *
+ * @param startLine The start of the line range.
+ * @param endLine The end of the line range.
+ * @see #clearActiveLineRange()
+ */
+ public void setActiveLineRange(int startLine, int endLine) {
+ if (startLine!=activeLineRangeStart ||
+ endLine!=activeLineRangeEnd) {
+ activeLineRangeStart = startLine;
+ activeLineRangeEnd = endLine;
+ repaint();
+ }
+ }
+
+
+ /**
+ * Sets the color to use to render active line ranges.
+ *
+ * @param color The color to use. If this is null, then the default
+ * color is used.
+ * @see #getActiveLineRangeColor()
+ * @see Gutter#DEFAULT_ACTIVE_LINE_RANGE_COLOR
+ */
+ public void setActiveLineRangeColor(Color color) {
+ if (color==null) {
+ color = Gutter.DEFAULT_ACTIVE_LINE_RANGE_COLOR;
+ }
+ if (!color.equals(activeLineRangeColor)) {
+ activeLineRangeColor = color;
+ repaint();
+ }
+ }
+
+
+ /**
+ * Sets the icon to use for bookmarks. Any previous bookmark icons
+ * are removed.
+ *
+ * @param icon The new bookmark icon. If this is <code>null</code>,
+ * bookmarking is effectively disabled.
+ * @see #getBookmarkIcon()
+ * @see #isBookmarkingEnabled()
+ */
+ public void setBookmarkIcon(Icon icon) {
+ removeBookmarkTrackingIcons();
+ bookmarkIcon = icon;
+ repaint();
+ }
+
+
+ /**
+ * Sets whether bookmarking is enabled. Note that a bookmarking icon
+ * must be set via {@link #setBookmarkIcon(Icon)} before bookmarks are
+ * truly enabled.
+ *
+ * @param enabled Whether bookmarking is enabled. If this is
+ * <code>false</code>, any bookmark icons are removed.
+ * @see #isBookmarkingEnabled()
+ * @see #setBookmarkIcon(Icon)
+ */
+ public void setBookmarkingEnabled(boolean enabled) {
+ if (enabled!=bookmarkingEnabled) {
+ bookmarkingEnabled = enabled;
+ if (!enabled) {
+ removeBookmarkTrackingIcons();
+ }
+ repaint();
+ }
+ }
+
+
+ /**
+ * Sets the text area being displayed. This will clear any tracking
+ * icons currently displayed.
+ *
+ * @param textArea The text area.
+ */
+ public void setTextArea(RTextArea textArea) {
+ removeAllTrackingIcons();
+ super.setTextArea(textArea);
+ }
+
+
+ /**
+ * Programatically toggles whether there is a bookmark for the specified
+ * line. If bookmarking is not enabled, this method does nothing.
+ *
+ * @param line The line.
+ * @return Whether a bookmark is now at the specified line.
+ * @throws BadLocationException If <code>line</code> is an invalid line
+ * number in the text area.
+ */
+ public boolean toggleBookmark(int line) throws BadLocationException {
+
+ if (!isBookmarkingEnabled() || getBookmarkIcon()==null) {
+ return false;
+ }
+
+ GutterIconInfo[] icons = getTrackingIcons(line);
+ if (icons.length==0) {
+ int offs = textArea.getLineStartOffset(line);
+ addOffsetTrackingIcon(offs, bookmarkIcon);
+ return true;
+ }
+
+ boolean found = false;
+ for (int i=0; i<icons.length; i++) {
+ if (icons[i].getIcon()==bookmarkIcon) {
+ removeTrackingIcon(icons[i]);
+ found = true;
+ // Don't quit, in case they manipulate the document so > 1
+ // bookmark is on a single line (kind of flaky, but it
+ // works...). If they delete all chars in the document,
+ // AbstractDocument gets a little flaky with the returned line
+ // number for viewToModel(), so this is just us trying to save
+ // face a little.
+ }
+ }
+ if (!found) {
+ int offs = textArea.getLineStartOffset(line);
+ addOffsetTrackingIcon(offs, bookmarkIcon);
+ }
+
+ return !found;
+
+ }
+
+
+ /**
+ * Sets our background color to that of standard "panels" in this
+ * LookAndFeel. This is necessary because, otherwise, we'd inherit the
+ * background color of our parent component (the Gutter).
+ */
+ private void updateBackground() {
+ Color bg = UIManager.getColor("Panel.background");
+ if (bg==null) { // UIManager properties aren't guaranteed to exist
+ bg = new JPanel().getBackground();
+ }
+ setBackground(bg);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void updateUI() {
+ super.updateUI(); // Does nothing
+ updateBackground();
+ }
+
+
+ /**
+ * Returns the line rendered at the specified location.
+ *
+ * @param p The location in this row header.
+ * @return The corresponding line in the editor.
+ * @throws BadLocationException ble If an error occurs.
+ */
+ private int viewToModelLine(Point p) throws BadLocationException {
+ int offs = textArea.viewToModel(p);
+ return offs>-1 ? textArea.getLineOfOffset(offs) : -1;
+ }
+
+
+ /**
+ * Implementation of the icons rendered.
+ */
+ private static class GutterIconImpl implements GutterIconInfo, Comparable {
+
+ private Icon icon;
+ private Position pos;
+ private String toolTip;
+
+ public GutterIconImpl(Icon icon, Position pos, String toolTip) {
+ this.icon = icon;
+ this.pos = pos;
+ this.toolTip = toolTip;
+ }
+
+ public int compareTo(Object o) {
+ if (o instanceof GutterIconInfo) {
+ return pos.getOffset() - ((GutterIconInfo)o).getMarkedOffset();
+ }
+ return -1;
+ }
+
+ public boolean equals(Object o) {
+ return o==this;
+ }
+
+ public Icon getIcon() {
+ return icon;
+ }
+
+ public int getMarkedOffset() {
+ return pos.getOffset();
+ }
+
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ public int hashCode() {
+ return icon.hashCode(); // FindBugs
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..44eacc7
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ImageBackgroundPainterStrategy.java
@@ -0,0 +1,171 @@
+/*
+ * 01/22/2005
+ *
+ * ImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.MediaTracker;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import javax.imageio.ImageIO;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image. The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.VolatileImageBackgroundPainterStrategy
+ */
+public abstract class ImageBackgroundPainterStrategy
+ implements BackgroundPainterStrategy {
+
+ protected MediaTracker tracker;
+
+ private RTextAreaBase textArea;
+ private Image master;
+ private int oldWidth, oldHeight;
+ private int scalingHint;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The text area using this image as its background.
+ */
+ public ImageBackgroundPainterStrategy(RTextAreaBase textArea) {
+ this.textArea = textArea;
+ tracker = new MediaTracker(textArea);
+ scalingHint = Image.SCALE_FAST;
+ }
+
+
+ /**
+ * Returns the text area using this strategy.
+ *
+ * @return The text area.
+ */
+ public RTextAreaBase getRTextAreaBase() {
+ return textArea;
+ }
+
+
+ /**
+ * Returns the "master" image; that is, the original, unscaled image.
+ * When the image needs to be rescaled, scaling should be done from
+ * this image, to prevent repeated scaling from distorting the image.
+ *
+ * @return The master image.
+ */
+ public Image getMasterImage() {
+ return master;
+ }
+
+
+ /**
+ * Returns the scaling hint being used.
+ *
+ * @return The scaling hint to use when scaling an image.
+ * @see #setScalingHint
+ */
+ public int getScalingHint() {
+ return scalingHint;
+ }
+
+
+ /**
+ * Paints the image at the specified location and at the specified size.
+ *
+ * @param g The graphics context.
+ * @param bounds The bounds in which to paint the image. The image
+ * will be scaled to fit exactly in these bounds if necessary.
+ */
+ public final void paint(Graphics g, Rectangle bounds) {
+ if (bounds.width!=oldWidth || bounds.height!=oldHeight) {
+ rescaleImage(bounds.width, bounds.height, getScalingHint());
+ oldWidth = bounds.width;
+ oldHeight = bounds.height;
+ }
+ paintImage(g, bounds.x,bounds.y);
+ }
+
+
+ /**
+ * Paints the image at the specified location. This method assumes
+ * scaling has already been done, and simply paints the background
+ * image "as-is."
+ *
+ * @param g The graphics context.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ */
+ protected abstract void paintImage(Graphics g, int x, int y);
+
+
+ /**
+ * Rescales the displayed image to be the specified size.
+ *
+ * @param width The new width of the image.
+ * @param height The new height of the image.
+ * @param hint The scaling hint to use.
+ */
+ protected abstract void rescaleImage(int width, int height,
+ int hint);
+
+
+ /**
+ * Sets the image this background painter displays.
+ *
+ * @param imageURL URL of a file containing the image to display.
+ */
+ public void setImage(URL imageURL) {
+ BufferedImage image = null;
+ try {
+ image = ImageIO.read(imageURL);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ setImage(image);
+ }
+
+ /**
+ * Sets the image this background painter displays.
+ *
+ * @param image The new image to use for the background.
+ */
+ public void setImage(Image image) {
+ master = image;
+ oldWidth = -1; // To trick us into fixing bgImage.
+ }
+
+
+ /**
+ * Sets the scaling hint to use when scaling the image.
+ *
+ * @param hint The hint to apply; e.g. <code>Image.SCALE_DEFAULT</code>.
+ * @see #getScalingHint
+ */
+ public void setScalingHint(int hint) {
+ this.scalingHint = hint;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/LineHighlightManager.java b/src/org/fife/ui/rtextarea/LineHighlightManager.java
new file mode 100644
index 0000000..79e65ba
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/LineHighlightManager.java
@@ -0,0 +1,207 @@
+/*
+ * 02/10/2009
+ *
+ * LineHighlightManager - Manages line highlights.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Position;
+
+
+/**
+ * Manages line highlights in an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class LineHighlightManager {
+
+ private RTextArea textArea;
+ private List lineHighlights;
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The parent text area.
+ */
+ public LineHighlightManager(RTextArea textArea) {
+ this.textArea = textArea;
+ }
+
+
+ /**
+ * Highlights the specified line.
+ *
+ * @param line The line to highlight.
+ * @param color The color to highlight with.
+ * @return A tag for the highlight.
+ * @throws BadLocationException If <code>line</code> is not a valid line
+ * number.
+ * @see #removeLineHighlight(Object)
+ */
+ public Object addLineHighlight(int line, Color color)
+ throws BadLocationException {
+ int offs = textArea.getLineStartOffset(line);
+ LineHighlightInfo lhi = new LineHighlightInfo(
+ textArea.getDocument().createPosition(offs), color);
+ if (lineHighlights==null) {
+ lineHighlights = new ArrayList(1);
+ }
+ int index = Collections.binarySearch(lineHighlights, lhi);
+ if (index<0) { // Common case
+ index = -(index+1);
+ }
+ lineHighlights.add(index, lhi);
+ repaintLine(lhi);
+ return lhi;
+ }
+
+
+ /**
+ * Paints any highlighted lines in the specified line range.
+ *
+ * @param g The graphics context.
+ */
+ public void paintLineHighlights(Graphics g) {
+
+ int count = lineHighlights==null ? 0 : lineHighlights.size();
+ if (count>0) {
+
+ int docLen = textArea.getDocument().getLength();
+ Rectangle vr = textArea.getVisibleRect();
+ int lineHeight = textArea.getLineHeight();
+
+ try {
+
+ for (int i=0; i<count; i++) {
+ LineHighlightInfo lhi =(LineHighlightInfo)
+ lineHighlights.get(i);
+ int offs = lhi.getOffset();
+ if (offs>=0 && offs<=docLen) {
+ int y = textArea.yForLineContaining(offs);
+ if (y>vr.y-lineHeight) {
+ if (y<vr.y+vr.height) {
+ g.setColor(lhi.getColor());
+ g.fillRect(0,y, textArea.getWidth(),lineHeight);
+ }
+ else {
+ break; // Out of visible rect
+ }
+ }
+ }
+ }
+
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+ }
+
+ }
+
+
+ /**
+ * Removes all line highlights.
+ *
+ * @see #removeLineHighlight(Object)
+ */
+ public void removeAllLineHighlights() {
+ if (lineHighlights!=null) {
+ lineHighlights.clear();
+ textArea.repaint();
+ }
+ }
+
+
+ /**
+ * Removes a line highlight.
+ *
+ * @param tag The tag of the line highlight to remove.
+ * @see #addLineHighlight(int, Color)
+ */
+ public void removeLineHighlight(Object tag) {
+ if (tag instanceof LineHighlightInfo) {
+ lineHighlights.remove(tag);
+ repaintLine((LineHighlightInfo)tag);
+ }
+ }
+
+
+ /**
+ * Repaints the line pointed to by the specified highlight information.
+ *
+ * @param lhi The highlight information.
+ */
+ private void repaintLine(LineHighlightInfo lhi) {
+ int offs = lhi.getOffset();
+ // May be > length if they deleted text including the highlight
+ if (offs>=0 && offs<=textArea.getDocument().getLength()) {
+ try {
+ int y = textArea.yForLineContaining(offs);
+ if (y>-1) {
+ textArea.repaint(0, y,
+ textArea.getWidth(), textArea.getLineHeight());
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+ }
+ }
+
+
+ /**
+ * Information about a line highlight.
+ */
+ private static class LineHighlightInfo implements Comparable {
+
+ private Position offs;
+ private Color color;
+
+ public LineHighlightInfo(Position offs, Color c) {
+ this.offs = offs;
+ this.color = c;
+ }
+
+ public int compareTo(Object o) {
+ if (o instanceof LineHighlightInfo) {
+ return offs.getOffset() - ((LineHighlightInfo)o).getOffset();
+ }
+ return -1;
+ }
+
+ public boolean equals(Object o) {
+ if (o==this) {
+ return true;
+ }
+ if (o instanceof LineHighlightInfo) {
+ return offs.getOffset()==((LineHighlightInfo)o).getOffset();
+ }
+ return false;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public int getOffset() {
+ return offs.getOffset();
+ }
+
+ public int hashCode() {
+ return getOffset();
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/LineNumberList.java b/src/org/fife/ui/rtextarea/LineNumberList.java
new file mode 100644
index 0000000..b59f953
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/LineNumberList.java
@@ -0,0 +1,710 @@
+/*
+ * 02/11/2009
+ *
+ * LineNumberList.java - Renders line numbers in an RTextScrollPane.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Map;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.MouseInputListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.View;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+import org.fife.ui.rsyntaxtextarea.folding.Fold;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * Renders line numbers in the gutter.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class LineNumberList extends AbstractGutterComponent
+ implements MouseInputListener {
+
+ private int currentLine; // The last line the caret was on.
+ private int lastY = -1; // Used to check if caret changes lines when line wrap is enabled.
+ private int lastVisibleLine;// Last line index painted.
+
+ private int cellHeight; // Height of a line number "cell" when word wrap is off.
+ private int cellWidth; // The width used for all line number cells.
+ private int ascent; // The ascent to use when painting line numbers.
+
+ private Map aaHints;
+
+ private int mouseDragStartOffset;
+
+ /**
+ * Listens for events from the current text area.
+ */
+ private Listener l;
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ private Insets textAreaInsets;
+
+ /**
+ * Used in {@link #paintComponent(Graphics)} to prevent reallocation on
+ * each paint.
+ */
+ private Rectangle visibleRect;
+
+ /**
+ * The index at which line numbering should start. The default value is
+ * <code>1</code>, but applications can change this if, for example, they
+ * are displaying a subset of lines in a file.
+ */
+ private int lineNumberingStartIndex;
+
+
+ /**
+ * Constructs a new <code>LineNumberList</code> using default values for
+ * line number color (gray) and highlighting the current line.
+ *
+ * @param textArea The text component for which line numbers will be
+ * displayed.
+ */
+ public LineNumberList(RTextArea textArea) {
+ this(textArea, null);
+ }
+
+
+ /**
+ * Constructs a new <code>LineNumberList</code>.
+ *
+ * @param textArea The text component for which line numbers will be
+ * displayed.
+ * @param numberColor The color to use for the line numbers. If this is
+ * <code>null</code>, gray will be used.
+ */
+ public LineNumberList(RTextArea textArea, Color numberColor) {
+
+ super(textArea);
+
+ if (numberColor!=null) {
+ setForeground(numberColor);
+ }
+ else {
+ setForeground(Color.GRAY);
+ }
+
+ // Initialize currentLine; otherwise, the current line won't start
+ // off as highlighted.
+ currentLine = 0;
+ setLineNumberingStartIndex(1);
+
+ visibleRect = new Rectangle(); // Must be initialized
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+
+ aaHints = RSyntaxUtilities.getDesktopAntiAliasHints();
+
+ }
+
+
+ /**
+ * Overridden to set width of this component correctly when we are first
+ * displayed (as keying off of the RTextArea gives us (0,0) when it isn't
+ * yet displayed.
+ */
+ public void addNotify() {
+ super.addNotify();
+ if (textArea!=null) {
+ l.install(textArea); // Won't double-install
+ }
+ updateCellWidths();
+ updateCellHeights();
+ }
+
+
+ /**
+ * Calculates the last line number index painted in this component.
+ *
+ * @return The last line number index painted in this component.
+ */
+ private int calculateLastVisibleLineNumber() {
+ int lastLine = 0;
+ if (textArea!=null) {
+ lastLine = textArea.getLineCount()+getLineNumberingStartIndex()-1;
+ }
+ return lastLine;
+ }
+
+
+ /**
+ * Returns the starting line's line number. The default value is
+ * <code>1</code>.
+ *
+ * @return The index
+ * @see #setLineNumberingStartIndex(int)
+ */
+ public int getLineNumberingStartIndex() {
+ return lineNumberingStartIndex;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Dimension getPreferredSize() {
+ int h = textArea!=null ? textArea.getHeight() : 100; // Arbitrary
+ return new Dimension(cellWidth, h);
+ }
+
+
+ /**
+ * Returns the width of the empty border on this component's right-hand
+ * side (or left-hand side, if the orientation is RTL).
+ *
+ * @return The border width.
+ */
+ private int getRhsBorderWidth() {
+ int w = 4;
+ if (textArea instanceof RSyntaxTextArea) {
+ if (((RSyntaxTextArea)textArea).isCodeFoldingEnabled()) {
+ w = 0;
+ }
+ }
+ return w;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ void handleDocumentEvent(DocumentEvent e) {
+ int newLastLine = calculateLastVisibleLineNumber();
+ if (newLastLine!=lastVisibleLine) {
+ // Adjust the amount of space the line numbers take up,
+ // if necessary.
+ if (newLastLine/10 != lastVisibleLine/10) {
+ updateCellWidths();
+ }
+ lastVisibleLine = newLastLine;
+ repaint();
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ void lineHeightsChanged() {
+ updateCellHeights();
+ }
+
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+
+ public void mouseDragged(MouseEvent e) {
+ if (mouseDragStartOffset>-1) {
+ int pos = textArea.viewToModel(new Point(0, e.getY()));
+ if (pos>=0) { // Not -1
+ textArea.setCaretPosition(mouseDragStartOffset);
+ textArea.moveCaretPosition(pos);
+ }
+ }
+ }
+
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+
+ public void mouseMoved(MouseEvent e) {
+ }
+
+
+ public void mousePressed(MouseEvent e) {
+ if (textArea==null) {
+ return;
+ }
+ if (e.getButton()==MouseEvent.BUTTON1) {
+ int pos = textArea.viewToModel(new Point(0, e.getY()));
+ if (pos>=0) { // Not -1
+ textArea.setCaretPosition(pos);
+ }
+ mouseDragStartOffset = pos;
+ }
+ else {
+ mouseDragStartOffset = -1;
+ }
+ }
+
+
+ public void mouseReleased(MouseEvent e) {
+ }
+
+
+ /**
+ * Paints this component.
+ *
+ * @param g The graphics context.
+ */
+ protected void paintComponent(Graphics g) {
+
+ if (textArea==null) {
+ return;
+ }
+
+ visibleRect = g.getClipBounds(visibleRect);
+ if (visibleRect==null) { // ???
+ visibleRect = getVisibleRect();
+ }
+ //System.out.println("LineNumberList repainting: " + visibleRect);
+ if (visibleRect==null) {
+ return;
+ }
+
+ Color bg = getBackground();
+ if (getGutter()!=null) { // Should always be true
+ bg = getGutter().getBackground();
+ }
+ g.setColor(bg);
+ g.fillRect(0,visibleRect.y, cellWidth,visibleRect.height);
+ g.setFont(getFont());
+ if (aaHints!=null) {
+ ((Graphics2D)g).addRenderingHints(aaHints);
+ }
+
+ if (textArea.getLineWrap()) {
+ paintWrappedLineNumbers(g, visibleRect);
+ return;
+ }
+
+ // Get where to start painting (top of the row), and where to paint
+ // the line number (drawString expects y==baseline).
+ // We need to be "scrolled up" just enough for the missing part of
+ // the first line.
+ int topLine = visibleRect.y/cellHeight;
+ int actualTopY = topLine*cellHeight;
+ textAreaInsets = textArea.getInsets(textAreaInsets);
+ actualTopY += textAreaInsets.top;
+ int y = actualTopY + ascent;
+
+ // Get the actual first line to paint, taking into account folding.
+ FoldManager fm = null;
+ if (textArea instanceof RSyntaxTextArea) {
+ fm = ((RSyntaxTextArea)textArea).getFoldManager();
+ topLine += fm.getHiddenLineCountAbove(topLine, true);
+ }
+ final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+
+/*
+ // Highlight the current line's line number, if desired.
+ if (textArea.getHighlightCurrentLine() && currentLine>=topLine &&
+ currentLine<=bottomLine) {
+ g.setColor(textArea.getCurrentLineHighlightColor());
+ g.fillRect(0,actualTopY+(currentLine-topLine)*cellHeight,
+ cellWidth,cellHeight);
+ }
+*/
+
+ // Paint line numbers
+ g.setColor(getForeground());
+ boolean ltr = getComponentOrientation().isLeftToRight();
+ if (ltr) {
+ FontMetrics metrics = g.getFontMetrics();
+ int rhs = getWidth() - RHS_BORDER_WIDTH;
+ int line = topLine + 1;
+ while (y<visibleRect.y+visibleRect.height+ascent && line<=textArea.getLineCount()) {
+ String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+ int width = metrics.stringWidth(number);
+ g.drawString(number, rhs-width,y);
+ y += cellHeight;
+ Fold fold = fm.getFoldForLine(line-1);
+ // Skip to next line to paint, taking extra care for lines with
+ // block ends and begins together, e.g. "} else {"
+ while (fold!=null && fold.isCollapsed()) {
+ int hiddenLineCount = fold.getLineCount();
+ if (hiddenLineCount==0) {
+ // Fold parser identified a 0-line fold region... This
+ // is really a bug, but we'll handle it gracefully.
+ break;
+ }
+ line += hiddenLineCount;
+ fold = fm.getFoldForLine(line-1);
+ }
+ line++;
+ }
+ }
+ else { // rtl
+ int line = topLine + 1;
+ while (y<visibleRect.y+visibleRect.height && line<textArea.getLineCount()) {
+ String number = Integer.toString(line + getLineNumberingStartIndex() - 1);
+ g.drawString(number, RHS_BORDER_WIDTH, y);
+ y += cellHeight;
+ Fold fold = fm.getFoldForLine(line-1);
+ // Skip to next line to paint, taking extra care for lines with
+ // block ends and begins together, e.g. "} else {"
+ while (fold!=null && fold.isCollapsed()) {
+ line += fold.getLineCount();
+ fold = fm.getFoldForLine(line);
+ }
+ line++;
+ }
+ }
+
+ }
+
+
+ /**
+ * Paints line numbers for text areas with line wrap enabled.
+ *
+ * @param g The graphics context.
+ * @param visibleRect The visible rectangle of these line numbers.
+ */
+ private void paintWrappedLineNumbers(Graphics g, Rectangle visibleRect) {
+
+ // The variables we use are as follows:
+ // - visibleRect is the "visible" area of the text area; e.g.
+ // [0,100, 300,100+(lineCount*cellHeight)-1].
+ // actualTop.y is the topmost-pixel in the first logical line we
+ // paint. Note that we may well not paint this part of the logical
+ // line, as it may be broken into many physical lines, with the first
+ // few physical lines scrolled past. Note also that this is NOT the
+ // visible rect of this line number list; this line number list has
+ // visible rect == [0,0, insets.left-1,visibleRect.height-1].
+ // - offset (<=0) is the y-coordinate at which we begin painting when
+ // we begin painting with the first logical line. This can be
+ // negative, signifying that we've scrolled past the actual topmost
+ // part of this line.
+
+ // The algorithm is as follows:
+ // - Get the starting y-coordinate at which to paint. This may be
+ // above the first visible y-coordinate as we're in line-wrapping
+ // mode, but we always paint entire logical lines.
+ // - Paint that line's line number and highlight, if appropriate.
+ // Increment y to be just below the are we just painted (i.e., the
+ // beginning of the next logical line's view area).
+ // - Get the ending visual position for that line. We can now loop
+ // back, paint this line, and continue until our y-coordinate is
+ // past the last visible y-value.
+
+ // We avoid using modelToView/viewToModel where possible, as these
+ // methods trigger a parsing of the line into syntax tokens, which is
+ // costly. It's cheaper to just grab the child views' bounds.
+
+ // Some variables we'll be using.
+ int width = getWidth();
+
+ RTextAreaUI ui = (RTextAreaUI)textArea.getUI();
+ View v = ui.getRootView(textArea).getView(0);
+ //boolean currentLineHighlighted = textArea.getHighlightCurrentLine();
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+ int topPosition = textArea.viewToModel(
+ new Point(visibleRect.x,visibleRect.y));
+ int topLine = root.getElementIndex(topPosition);
+ FoldManager fm = ((RSyntaxTextArea)textArea).getFoldManager();
+
+ // Compute the y at which to begin painting text, taking into account
+ // that 1 logical line => at least 1 physical line, so it may be that
+ // y<0. The computed y-value is the y-value of the top of the first
+ // (possibly) partially-visible view.
+ Rectangle visibleEditorRect = ui.getVisibleEditorRect();
+ Rectangle r = LineNumberList.getChildViewBounds(v, topLine,
+ visibleEditorRect);
+ int y = r.y;
+ final int RHS_BORDER_WIDTH = getRhsBorderWidth();
+ int rhs;
+ boolean ltr = getComponentOrientation().isLeftToRight();
+ if (ltr) {
+ rhs = width - RHS_BORDER_WIDTH;
+ }
+ else { // rtl
+ rhs = RHS_BORDER_WIDTH;
+ }
+ int visibleBottom = visibleRect.y + visibleRect.height;
+ FontMetrics metrics = g.getFontMetrics();
+
+ // Keep painting lines until our y-coordinate is past the visible
+ // end of the text area.
+ g.setColor(getForeground());
+
+ while (y < visibleBottom) {
+
+ r = LineNumberList.getChildViewBounds(v, topLine, visibleEditorRect);
+
+ /*
+ // Highlight the current line's line number, if desired.
+ if (currentLineHighlighted && topLine==currentLine) {
+ g.setColor(textArea.getCurrentLineHighlightColor());
+ g.fillRect(0,y, width,(r.y+r.height)-y);
+ g.setColor(getForeground());
+ }
+ */
+
+ // Paint the line number.
+ int index = (topLine+1) + getLineNumberingStartIndex() - 1;
+ String number = Integer.toString(index);
+ if (ltr) {
+ int strWidth = metrics.stringWidth(number);
+ g.drawString(number, rhs-strWidth,y+ascent);
+ }
+ else {
+ int x = RHS_BORDER_WIDTH;
+ g.drawString(number, x, y+ascent);
+ }
+
+ // The next possible y-coordinate is just after the last line
+ // painted.
+ y += r.height;
+
+ // Update topLine (we're actually using it for our "current line"
+ // variable now).
+ Fold fold = fm.getFoldForLine(topLine);
+ if (fold!=null && fold.isCollapsed()) {
+ topLine += fold.getCollapsedLineCount();
+ }
+ topLine++;
+ if (topLine>=lineCount)
+ break;
+
+ }
+
+ }
+
+
+ /**
+ * Called when this component is removed from the view hierarchy.
+ */
+ public void removeNotify() {
+ super.removeNotify();
+ if (textArea!=null) {
+ l.uninstall(textArea);
+ }
+ }
+
+
+ /**
+ * Repaints a single line in this list.
+ *
+ * @param line The line to repaint.
+ */
+ private void repaintLine(int line) {
+ int y = textArea.getInsets().top;
+ y += line*cellHeight;
+ repaint(0,y, cellWidth,cellHeight);
+ }
+
+
+ /**
+ * Overridden to ensure line number cell sizes are updated with the
+ * font size change.
+ *
+ * @param font The new font to use for line numbers.
+ */
+ public void setFont(Font font) {
+ super.setFont(font);
+ updateCellWidths();
+ updateCellHeights();
+ }
+
+
+ /**
+ * Sets the starting line's line number. The default value is
+ * <code>1</code>. Applications can call this method to change this value
+ * if they are displaying a subset of lines in a file, for example.
+ *
+ * @param index The new index.
+ * @see #getLineNumberingStartIndex()
+ */
+ public void setLineNumberingStartIndex(int index) {
+ if (index!=lineNumberingStartIndex) {
+ lineNumberingStartIndex = index;
+ updateCellWidths();
+ repaint();
+ }
+ }
+
+
+ /**
+ * Sets the text area being displayed.
+ *
+ * @param textArea The text area.
+ */
+ public void setTextArea(RTextArea textArea) {
+
+ if (l==null) {
+ l = new Listener();
+ }
+
+ if (this.textArea!=null) {
+ l.uninstall(textArea);
+ }
+
+ super.setTextArea(textArea);
+ lastVisibleLine = calculateLastVisibleLineNumber();
+
+ if (textArea!=null) {
+ l.install(textArea); // Won't double-install
+ updateCellHeights();
+ updateCellWidths();
+ }
+
+ }
+
+
+ /**
+ * Changes the height of the cells in the JList so that they are as tall as
+ * font. This function should be called whenever the user changes the Font
+ * of <code>textArea</code>.
+ */
+ private void updateCellHeights() {
+ if (textArea!=null) {
+ cellHeight = textArea.getLineHeight();
+ ascent = textArea.getMaxAscent();
+ }
+ else {
+ cellHeight = 20; // Arbitrary number.
+ ascent = 5; // Also arbitrary
+ }
+ repaint();
+ }
+
+
+ /**
+ * Changes the width of the cells in the JList so you can see every digit
+ * of each.
+ */
+ void updateCellWidths() {
+
+ int oldCellWidth = cellWidth;
+ cellWidth = getRhsBorderWidth();
+
+ // Adjust the amount of space the line numbers take up, if necessary.
+ if (textArea!=null) {
+ Font font = getFont();
+ if (font!=null) {
+ FontMetrics fontMetrics = getFontMetrics(font);
+ int count = 0;
+ int lineCount = textArea.getLineCount() +
+ getLineNumberingStartIndex() - 1;
+ do {
+ lineCount = lineCount/10;
+ count++;
+ } while (lineCount >= 10);
+ cellWidth += fontMetrics.charWidth('9')*(count+1) + 3;
+ }
+ }
+
+ if (cellWidth!=oldCellWidth) { // Always true
+ revalidate();
+ }
+
+ }
+
+
+ /**
+ * Listens for events in the text area we're interested in.
+ */
+ private class Listener implements CaretListener, PropertyChangeListener {
+
+ private boolean installed;
+
+ public void caretUpdate(CaretEvent e) {
+
+ int dot = textArea.getCaretPosition();
+
+ // We separate the line wrap/no line wrap cases because word wrap
+ // can make a single line from the model (document) be on multiple
+ // lines on the screen (in the view); thus, we have to enhance the
+ // logic for that case a bit - we check the actual y-coordinate of
+ // the caret when line wrap is enabled. For the no-line-wrap case,
+ // getting the line number of the caret suffices. This increases
+ // efficiency in the no-line-wrap case.
+
+ if (textArea.getLineWrap()==false) {
+ int line = textArea.getDocument().getDefaultRootElement().
+ getElementIndex(dot);
+ if (currentLine!=line) {
+ repaintLine(line);
+ repaintLine(currentLine);
+ currentLine = line;
+ }
+ }
+ else { // lineWrap enabled; must check actual y position of caret
+ try {
+ int y = textArea.yForLineContaining(dot);
+ if (y!=lastY) {
+ lastY = y;
+ currentLine = textArea.getDocument().
+ getDefaultRootElement().getElementIndex(dot);
+ repaint(); // *Could* be optimized...
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ }
+ }
+
+ }
+
+ public void install(RTextArea textArea) {
+ if (!installed) {
+ //System.out.println("Installing");
+ textArea.addCaretListener(this);
+ textArea.addPropertyChangeListener(this);
+ caretUpdate(null); // Force current line highlight repaint
+ installed = true;
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+
+ String name = e.getPropertyName();
+
+ // If they change the current line highlight in any way...
+ if (RTextArea.HIGHLIGHT_CURRENT_LINE_PROPERTY.equals(name) ||
+ RTextArea.CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY.equals(name)) {
+ repaintLine(currentLine);
+ }
+
+ }
+
+ public void uninstall(RTextArea textArea) {
+ if (installed) {
+ //System.out.println("Uninstalling");
+ textArea.removeCaretListener(this);
+ textArea.removePropertyChangeListener(this);
+ installed = false;
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/Macro.java b/src/org/fife/ui/rtextarea/Macro.java
new file mode 100644
index 0000000..e4ebbee
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/Macro.java
@@ -0,0 +1,392 @@
+/*
+ * 09/16/2004
+ *
+ * Macro.java - A macro as recorded/played back by an RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.*;
+import javax.xml.transform.stream.*;
+import org.w3c.dom.*;
+import org.xml.sax.InputSource;
+
+import org.fife.io.UnicodeReader;
+
+
+/**
+ * A macro as recorded/played back by an <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class Macro {
+
+ private String name;
+ private ArrayList macroRecords;
+
+ private static final String ROOT_ELEMENT = "macro";
+ private static final String MACRO_NAME = "macroName";
+ private static final String ACTION = "action";
+ private static final String ID = "id";
+
+ private static final String UNTITLED_MACRO_NAME = "<Untitled>";
+
+ private static final String FILE_ENCODING = "UTF-8";
+
+
+ /**
+ * Constructor.
+ */
+ public Macro() {
+ this(UNTITLED_MACRO_NAME);
+ }
+
+
+ /**
+ * Loads a macro from a file on disk.
+ *
+ * @param file The file from which to load the macro.
+ * @throws java.io.EOFException If an EOF is reached unexpectedly (i.e.,
+ * the file is corrupt).
+ * @throws FileNotFoundException If the specified file does not exist, is
+ * a directory instead of a regular file, or otherwise cannot be
+ * opened.
+ * @throws IOException If an I/O exception occurs while reading the file.
+ * @see #saveToFile
+ */
+ public Macro(File file) throws EOFException, FileNotFoundException,
+ IOException {
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = null;
+ Document doc = null;
+ try {
+ db = dbf.newDocumentBuilder();
+ //InputSource is = new InputSource(new FileReader(file));
+ InputSource is = new InputSource(new UnicodeReader(
+ new FileInputStream(file), FILE_ENCODING));
+ is.setEncoding(FILE_ENCODING);
+ doc = db.parse(is);//db.parse(file);
+ } catch (Exception e) {
+ e.printStackTrace();
+ String desc = e.getMessage();
+ if (desc==null) {
+ desc = e.toString();
+ }
+ throw new IOException("Error parsing XML: " + desc);
+ }
+
+ macroRecords = new ArrayList();
+
+ // Traverse the XML tree.
+ boolean parsedOK = initializeFromXMLFile(doc.getDocumentElement());
+ if (parsedOK==false) {
+ name = null;
+ macroRecords.clear();
+ macroRecords = null;
+ throw new IOException("Error parsing XML!");
+ }
+
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the macro.
+ */
+ public Macro(String name) {
+ this(name, null);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the macro.
+ * @param records The initial records of the macro.
+ */
+ public Macro(String name, List records) {
+
+ this.name = name;
+
+ if (records!=null) {
+ macroRecords = new ArrayList(records.size());
+ Iterator i = records.iterator();
+ while (i.hasNext()) {
+ MacroRecord record = (MacroRecord)i.next();
+ macroRecords.add(record);
+ }
+ }
+ else {
+ macroRecords = new ArrayList(10);
+ }
+
+ }
+
+
+ /**
+ * Adds a macro record to this macro.
+ *
+ * @param record The record to add. If <code>null</code>, nothing happens.
+ * @see #getMacroRecords
+ */
+ public void addMacroRecord(MacroRecord record) {
+ if (record!=null)
+ macroRecords.add(record);
+ }
+
+
+ /**
+ * Returns the macro records that make up this macro.
+ *
+ * @return The macro records.
+ * @see #addMacroRecord
+ */
+ public List getMacroRecords() {
+ return macroRecords;
+ }
+
+
+ /**
+ * Returns the name of this macro.
+ *
+ * @return The macro's name.
+ * @see #setName
+ */
+ public String getName() {
+ return name;
+ }
+
+
+ /**
+ * Used in parsing an XML document containing a macro. This method
+ * initializes this macro with the data contained in the passed-in node.
+ *
+ * @param node The root node of the parsed XML document.
+ * @return <code>true</code> if the macro initialization went okay;
+ * <code>false</code> if an error occurred.
+ */
+ private boolean initializeFromXMLFile(Element root) {
+
+ /*
+ * This method expects the XML document to be in the following format:
+ *
+ * <?xml version="1.0" encoding="UTF-8" ?>
+ * <macro>
+ * <macroName>test</macroName>
+ * <action id="default-typed">abcdefg</action>
+ * [<action id=...>...</action>]
+ * ...
+ * </macro>
+ *
+ */
+
+ NodeList childNodes = root.getChildNodes();
+ int count = childNodes.getLength();
+
+ for (int i=0; i<count; i++) {
+
+ Node node = childNodes.item(i);
+ int type = node.getNodeType();
+ switch (type) {
+
+ // Handle element nodes.
+ case Node.ELEMENT_NODE:
+
+ String nodeName = node.getNodeName();
+
+ if (nodeName.equals(MACRO_NAME)) {
+ NodeList childNodes2 = node.getChildNodes();
+ name = UNTITLED_MACRO_NAME;
+ if (childNodes2.getLength()>0) {
+ node = childNodes2.item(0);
+ int type2 = node.getNodeType();
+ if (type2!=Node.CDATA_SECTION_NODE &&
+ type2!=Node.TEXT_NODE) {
+ return false;
+ }
+ name = node.getNodeValue().trim();
+ }
+ //System.err.println("Macro name==" + name);
+ }
+
+ else if (nodeName.equals(ACTION)) {
+ NamedNodeMap attributes = node.getAttributes();
+ if (attributes==null || attributes.getLength()!=1)
+ return false;
+ Node node2 = attributes.item(0);
+ MacroRecord macroRecord = new MacroRecord();
+ if (!node2.getNodeName().equals(ID)) {
+ return false;
+ }
+ macroRecord.id = node2.getNodeValue();
+ NodeList childNodes2 = node.getChildNodes();
+ int length = childNodes2.getLength();
+ if (length==0) { // Could be empty "" command.
+ //System.err.println("... empty actionCommand");
+ macroRecord.actionCommand = "";
+ //System.err.println("... adding action: " + macroRecord);
+ macroRecords.add(macroRecord);
+ break;
+ }
+ else {
+ node = childNodes2.item(0);
+ int type2 = node.getNodeType();
+ if (type2!=Node.CDATA_SECTION_NODE &&
+ type2!=Node.TEXT_NODE) {
+ return false;
+ }
+ macroRecord.actionCommand = node.getNodeValue();
+ macroRecords.add(macroRecord);
+ }
+
+ }
+ break;
+
+ default:
+ break; // Skip whitespace nodes, etc.
+
+ }
+
+ }
+
+ // Everything went okay.
+ return true;
+
+ }
+
+
+ /**
+ * Saves this macro to a text file. This file can later be read in by
+ * the constructor taking a <code>File</code> parameter; this is the
+ * mechanism for saving macros.
+ *
+ * @param fileName The name of the file in which to save the macro.
+ * @throws IOException If an error occurs while generating the XML for
+ * the output file.
+ */
+ public void saveToFile(String fileName) throws IOException {
+
+ /*
+ * This method writes the XML document in the following format:
+ *
+ * <?xml version="1.0" encoding="UTF-8" ?>
+ * <macro>
+ * <macroName>test</macroName>
+ * <action id="default-typed">abcdefg</action>
+ * [<action id=...>...</action>]
+ * ...
+ * </macro>
+ *
+ */
+
+ try {
+
+ DocumentBuilder db = DocumentBuilderFactory.newInstance().
+ newDocumentBuilder();
+ DOMImplementation impl = db.getDOMImplementation();
+
+ Document doc = impl.createDocument(null, ROOT_ELEMENT, null);
+ Element rootElement = doc.getDocumentElement();
+
+ // Write the name of the macro.
+ Element nameElement = doc.createElement(MACRO_NAME);
+ rootElement.appendChild(nameElement);
+
+ // Write all actions (the meat) in the macro.
+ int numActions = macroRecords.size();
+ for (int i=0; i<numActions; i++) {
+ MacroRecord record = (MacroRecord)macroRecords.get(i);
+ Element actionElement = doc.createElement(ACTION);
+ actionElement.setAttribute(ID, record.id);
+ if (record.actionCommand!=null &&
+ record.actionCommand.length()>0) {
+ // Remove illegal characters. I'm no XML expert, but
+ // I'm not sure what I'm doing wrong. If we don't
+ // strip out chars with Unicode value < 32, our
+ // generator will insert '&#<value>', which will cause
+ // our parser to barf when reading the macro back in
+ // (it says "Invalid XML character"). But why doesn't
+ // our generator tell us the character is invalid too?
+ String command = record.actionCommand;
+ for (int j=0; j<command.length(); j++) {
+ if (command.charAt(j)<32) {
+ command = command.substring(0,j);
+ if (j<command.length()-1)
+ command += command.substring(j+1);
+ }
+ }
+ Node n = doc.createCDATASection(command);
+ actionElement.appendChild(n);
+ }
+ rootElement.appendChild(actionElement);
+ }
+
+ // Dump the XML out to the file.
+ StreamResult result = new StreamResult(new File(fileName));
+ DOMSource source = new DOMSource(doc);
+ TransformerFactory transFac = TransformerFactory.newInstance();
+ Transformer transformer = transFac.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.ENCODING, FILE_ENCODING);
+ transformer.transform(source, result);
+
+ } catch (RuntimeException re) {
+ throw re; // Keep FindBugs happy.
+ } catch (Exception e) {
+ throw new IOException("Error generating XML!");
+ }
+
+ }
+
+
+ /**
+ * Sets the name of this macro.
+ *
+ * @param name The new name for the macro.
+ * @see #getName
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ /**
+ * A "record" of a macro is a single action in the macro (corresponding to
+ * a key type and some action in the editor, such as a letter inserted into
+ * the document, scrolling one page down, selecting the current line,
+ * etc.).
+ */
+ static class MacroRecord {
+
+ public String id;
+ public String actionCommand;
+
+ public MacroRecord() {
+ this(null, null);
+ }
+
+ public MacroRecord(String id, String actionCommand) {
+ this.id = id;
+ this.actionCommand = actionCommand;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RDocument.java b/src/org/fife/ui/rtextarea/RDocument.java
new file mode 100644
index 0000000..3b61b00
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RDocument.java
@@ -0,0 +1,65 @@
+/*
+ * 06/30/2012
+ *
+ * RDocument.java - Document class used by RTextAreas.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.GapContent;
+import javax.swing.text.PlainDocument;
+
+
+/**
+ * The document implementation used by instances of <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RDocument extends PlainDocument {
+
+
+ /**
+ * Constructor.
+ */
+ public RDocument() {
+ super(new RGapContent());
+ }
+
+
+ /**
+ * Returns the character in the document at the specified offset.
+ *
+ * @param offset The offset of the character.
+ * @return The character.
+ * @throws BadLocationException If the offset is invalid.
+ */
+ public char charAt(int offset) throws BadLocationException {
+ return ((RGapContent)getContent()).charAt(offset);
+ }
+
+
+ /**
+ * Document content that provides fast access to individual characters.
+ */
+ private static class RGapContent extends GapContent {
+
+ public char charAt(int offset) throws BadLocationException {
+ if (offset<0 || offset>=length()) {
+ throw new BadLocationException("Invalid offset", offset);
+ }
+ int g0 = getGapStart();
+ char[] array = (char[]) getArray();
+ if (offset<g0) { // below gap
+ return array[offset];
+ }
+ return array[getGapEnd() + offset - g0]; // above gap
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RDocumentCharSequence.java b/src/org/fife/ui/rtextarea/RDocumentCharSequence.java
new file mode 100644
index 0000000..5cd912e
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RDocumentCharSequence.java
@@ -0,0 +1,118 @@
+/*
+ * 06/30/2012
+ *
+ * RDocumentCharSequence.java - Iterator over a portion of an RTextArea's
+ * document.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import javax.swing.text.BadLocationException;
+
+
+/**
+ * Allows iterating over a portion of an <code>RDocument</code>. This is of
+ * course not thread-safe, so should only be used on the EDT or with external
+ * synchronization.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RDocumentCharSequence implements CharSequence {
+
+ private RDocument doc;
+ private int start;
+ private int end;
+
+
+ /**
+ * Creates a <code>CharSequence</code> representing the text in a document
+ * from the specified offset to the end of that document.
+ *
+ * @param doc The document.
+ * @param start The starting offset in the document, inclusive.
+ */
+ public RDocumentCharSequence(RDocument doc, int start) {
+ this(doc, start, doc.getLength());
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document.
+ * @param start The starting offset in the document, inclusive.
+ * @param end the ending offset in the document, exclusive.
+ */
+ public RDocumentCharSequence(RDocument doc, int start, int end) {
+ this.doc = doc;
+ this.start = start;
+ this.end = end;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public char charAt(int index) {
+ if (index<0 || index>=length()) {
+ throw new IndexOutOfBoundsException("Index " + index +
+ " is not in range [0-" + length() + ")");
+ }
+ try {
+ return doc.charAt(start+index);
+ } catch (BadLocationException ble) {
+ throw new IndexOutOfBoundsException(ble.toString());
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public int length() {
+ return end - start;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public CharSequence subSequence(int start, int end) {
+ if (start<0) {
+ throw new IndexOutOfBoundsException("start must be >= 0 (" +
+ start + ")");
+ }
+ else if (end<0) {
+ throw new IndexOutOfBoundsException("end must be >= 0 (" +
+ end + ")");
+ }
+ else if (end>length()) {
+ throw new IndexOutOfBoundsException("end must be <= " +
+ length() + " (" + end + ")");
+ }
+ else if (start>end) {
+ throw new IndexOutOfBoundsException("start (" + start +
+ ") cannot be > end (" + end + ")");
+ }
+ int newStart = this.start + start;
+ int newEnd = this.start + end;
+ return new RDocumentCharSequence(doc, newStart, newEnd);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String toString() {
+ try {
+ return doc.getText(start, length());
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ return "";
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTADefaultInputMap.java b/src/org/fife/ui/rtextarea/RTADefaultInputMap.java
new file mode 100644
index 0000000..f85c40a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTADefaultInputMap.java
@@ -0,0 +1,151 @@
+/*
+ * 08/19/2004
+ *
+ * RTADefaultInputMap.java - The default input map for RTextAreas.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.InputMap;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+
+
+/**
+ * The default input map for an <code>RTextArea</code>. For the most part it is
+ * exactly that the one for a <code>JTextArea</code>, but it adds a few things.
+ * Currently, the new key bindings include:
+ * <ul>
+ * <li>HOME key toggles between first character on line and first non-
+ * whitespace character on line.
+ * <li>INSERT key toggles between insert and overwrite modes.
+ * <li>Ctrl+DELETE key deletes all text between the caret and the end of the
+ * current line.
+ * <li>Ctrl+Shift+Up and Ctrl+Shift+Down move the current line up and
+ * down, respectively.
+ * <li>Ctrl+J joins lines.
+ * <li>Ctrl+Z is undo and Ctrl+Y is redo.
+ * <li>Ctrl+Up and Ctrl+Down shift the visible area of the text area up and
+ * down one line, respectively.
+ * <li>F2 and Shift+F2 moves to the next and previous bookmarks,
+ * respectively.
+ * <li>Ctrl+F2 toggles whether a bookmark is on the current line.
+ * <li>etc.
+ * </ul>
+ */
+public class RTADefaultInputMap extends InputMap {
+
+
+ /**
+ * Constructs the default input map for an <code>RTextArea</code>.
+ */
+ public RTADefaultInputMap() {
+
+ super();
+
+ int defaultModifier = getDefaultModifier();
+ //int ctrl = InputEvent.CTRL_MASK;
+ int alt = InputEvent.ALT_MASK;
+ int shift = InputEvent.SHIFT_MASK;
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), DefaultEditorKit.beginLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, shift), DefaultEditorKit.selectionBeginLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultModifier), DefaultEditorKit.beginAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultModifier|shift), DefaultEditorKit.selectionBeginAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), DefaultEditorKit.endLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_END, shift), DefaultEditorKit.selectionEndLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultModifier), DefaultEditorKit.endAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultModifier|shift), DefaultEditorKit.selectionEndAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), DefaultEditorKit.backwardAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, shift), DefaultEditorKit.selectionBackwardAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultModifier), DefaultEditorKit.previousWordAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultModifier|shift), DefaultEditorKit.selectionPreviousWordAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), DefaultEditorKit.downAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, shift), DefaultEditorKit.selectionDownAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultModifier), RTextAreaEditorKit.rtaScrollDownAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, alt), RTextAreaEditorKit.rtaLineDownAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), DefaultEditorKit.forwardAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, shift), DefaultEditorKit.selectionForwardAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultModifier), DefaultEditorKit.nextWordAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultModifier|shift), DefaultEditorKit.selectionNextWordAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), DefaultEditorKit.upAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, shift), DefaultEditorKit.selectionUpAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultModifier), RTextAreaEditorKit.rtaScrollUpAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, alt), RTextAreaEditorKit.rtaLineUpAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0), DefaultEditorKit.pageUpAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,shift), RTextAreaEditorKit.rtaSelectionPageUpAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,defaultModifier|shift), RTextAreaEditorKit.rtaSelectionPageLeftAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0), DefaultEditorKit.pageDownAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,shift), RTextAreaEditorKit.rtaSelectionPageDownAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,defaultModifier|shift), RTextAreaEditorKit.rtaSelectionPageRightAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_CUT, 0), DefaultEditorKit.cutAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_COPY, 0), DefaultEditorKit.copyAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_PASTE, 0), DefaultEditorKit.pasteAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_X, defaultModifier), DefaultEditorKit.cutAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_C, defaultModifier), DefaultEditorKit.copyAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_V, defaultModifier), DefaultEditorKit.pasteAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), DefaultEditorKit.deleteNextCharAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, shift), DefaultEditorKit.cutAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, defaultModifier), RTextAreaEditorKit.rtaDeleteRestOfLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), RTextAreaEditorKit.rtaToggleTextModeAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, shift), DefaultEditorKit.pasteAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, defaultModifier), DefaultEditorKit.copyAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_A, defaultModifier), DefaultEditorKit.selectAllAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_D, defaultModifier), RTextAreaEditorKit.rtaDeleteLineAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_J, defaultModifier), RTextAreaEditorKit.rtaJoinLinesAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, shift), DefaultEditorKit.deletePrevCharAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultModifier), RTextAreaEditorKit.rtaDeletePrevWordAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), DefaultEditorKit.insertTabAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), DefaultEditorKit.insertBreakAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, shift), DefaultEditorKit.insertBreakAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, defaultModifier), RTextAreaEditorKit.rtaDumbCompleteWordAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, defaultModifier), RTextAreaEditorKit.rtaUndoAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_Y, defaultModifier), RTextAreaEditorKit.rtaRedoAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), RTextAreaEditorKit.rtaNextBookmarkAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, shift), RTextAreaEditorKit.rtaPrevBookmarkAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, defaultModifier), RTextAreaEditorKit.rtaToggleBookmarkAction);
+
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultModifier|shift), RTextAreaEditorKit.rtaPrevOccurrenceAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultModifier), RTextAreaEditorKit.rtaNextOccurrenceAction);
+
+ /* NOTE: Currently, macros aren't part of the default input map for */
+ /* RTextArea, as they display their own popup windows, etc. which */
+ /* may or may not clash with the application in which the RTextArea */
+ /* resides. You can add the macro actions yourself into an */
+ /* application if you want. They may become standard in the future */
+ /* if I can find a way to implement them that I like. */
+ /*
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_R, defaultModifier|shift), RTextAreaEditorKit.rtaBeginRecordingMacroAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_S, defaultModifier|shift), RTextAreaEditorKit.rtaEndRecordingMacroAction);
+ put(KeyStroke.getKeyStroke(KeyEvent.VK_M, defaultModifier|shift), RTextAreaEditorKit.rtaPlaybackLastMacroAction);
+ */
+
+ }
+
+
+ /**
+ * Returns the default modifier key for a system. For example, on Windows
+ * this would be the CTRL key (<code>InputEvent.CTRL_MASK</code>).
+ *
+ * @return The default modifier key.
+ */
+ protected static final int getDefaultModifier() {
+ return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTATextTransferHandler.java b/src/org/fife/ui/rtextarea/RTATextTransferHandler.java
new file mode 100644
index 0000000..24f5a4a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTATextTransferHandler.java
@@ -0,0 +1,480 @@
+/*
+ * 07/29/2004
+ *
+ * RTATextTransferHandler.java - Handles the transfer of data to/from an
+ * RTextArea via drag-and-drop.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.datatransfer.*;
+import java.awt.im.InputContext;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import javax.swing.*;
+import javax.swing.text.*;
+
+
+/**
+ * Handles the transfer of data to/from an <code>RTextArea</code> via
+ * drag-and-drop. This class is pretty much ripped off from a subclass of
+ * <code>BasicTextUI</code>. In the future, it will include the ability to
+ * drag-and-drop files into <code>RTextArea</code>s (i.e., the text will be
+ * inserted into the text area).<p>
+ *
+ * The main reason this class is kept around is so we can subclass it.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+public class RTATextTransferHandler extends TransferHandler {
+
+ private JTextComponent exportComp;
+ private boolean shouldRemove;
+ private int p0;
+ private int p1;
+ private boolean withinSameComponent;
+
+
+ /**
+ * Try to find a flavor that can be used to import a Transferable to a
+ * specified text component.
+ * The set of usable flavors are tried in the following order:
+ * <ol>
+ * <li>First, an attempt is made to find a flavor matching the content
+ * tyep of the EditorKit for the component.
+ * <li>Second, an attempt to find a text/plain flavor is made.
+ * <li>Third, an attempt to find a flavor representing a String
+ * reference in the same VM is made.
+ * <li>Lastly, DataFlavor.stringFlavor is searched for.
+ * </ol>
+ *
+ * @param flavors The flavors to check if c will accept them.
+ * @param c The text component to see whether it will accept any of the
+ * specified data flavors as input.
+ */
+ protected DataFlavor getImportFlavor(DataFlavor[] flavors,
+ JTextComponent c) {
+
+ DataFlavor refFlavor = null;
+ DataFlavor stringFlavor = null;
+
+ for (int i = 0; i < flavors.length; i++) {
+
+ String mime = flavors[i].getMimeType();
+ if (mime.startsWith("text/plain")) {
+ return flavors[i];
+ }
+ else if (refFlavor == null
+ && mime.startsWith("application/x-java-jvm-local-objectref")
+ && flavors[i].getRepresentationClass() == String.class)
+ {
+ refFlavor = flavors[i];
+ }
+ else if (stringFlavor==null &&
+ flavors[i].equals(DataFlavor.stringFlavor))
+ {
+ stringFlavor = flavors[i];
+ }
+
+ }
+
+ if (refFlavor != null)
+ return refFlavor;
+ else if (stringFlavor != null)
+ return stringFlavor;
+
+ return null;
+
+ }
+
+
+ /**
+ * Import the given stream data into the text component.
+ */
+ protected void handleReaderImport(Reader in, JTextComponent c)
+ throws BadLocationException, IOException {
+
+ char[] buff = new char[1024];
+ int nch;
+ boolean lastWasCR = false;
+ int last;
+ StringBuffer sbuff = null;
+
+ // Read in a block at a time, mapping \r\n to \n, as well as single
+ // \r to \n.
+ while ((nch = in.read(buff, 0, buff.length)) != -1) {
+
+ if (sbuff == null) {
+ sbuff = new StringBuffer(nch);
+ }
+ last = 0;
+
+ for (int counter = 0; counter < nch; counter++) {
+
+ switch (buff[counter]) {
+ case '\r':
+ if (lastWasCR) {
+ if (counter == 0)
+ sbuff.append('\n');
+ else
+ buff[counter - 1] = '\n';
+ }
+ else
+ lastWasCR = true;
+ break;
+ case '\n':
+ if (lastWasCR) {
+ if (counter > (last + 1))
+ sbuff.append(buff, last, counter - last - 1);
+ // else nothing to do, can skip \r, next write will
+ // write \n
+ lastWasCR = false;
+ last = counter;
+ }
+ break;
+ default:
+ if (lastWasCR) {
+ if (counter == 0)
+ sbuff.append('\n');
+ else
+ buff[counter - 1] = '\n';
+ lastWasCR = false;
+ }
+ break;
+
+ } // End fo switch (buff[counter]).
+
+ } // End of for (int counter = 0; counter < nch; counter++).
+
+ if (last < nch) {
+ if (lastWasCR) {
+ if (last < (nch - 1))
+ sbuff.append(buff, last, nch - last - 1);
+ }
+ else
+ sbuff.append(buff, last, nch - last);
+ }
+
+ } // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+ if (withinSameComponent) {
+ ((RTextArea)c).beginAtomicEdit();
+ }
+
+ if (lastWasCR)
+ sbuff.append('\n');
+ c.replaceSelection(sbuff != null ? sbuff.toString() : "");
+
+ }
+
+
+ /**
+ * This is the type of transfer actions supported by the source. Some
+ * models are not mutable, so a transfer operation of COPY only should
+ * be advertised in that case.
+ *
+ * @param c The component holding the data to be transfered. This
+ * argument is provided to enable sharing of TransferHandlers by
+ * multiple components.
+ * @return If the text component is editable, COPY_OR_MOVE is returned,
+ * otherwise just COPY is allowed.
+ */
+ public int getSourceActions(JComponent c) {
+ if (((JTextComponent)c).isEditable())
+ return COPY_OR_MOVE;
+ else
+ return COPY;
+ }
+
+
+ /**
+ * Create a Transferable to use as the source for a data transfer.
+ *
+ * @param comp The component holding the data to be transfered. This
+ * argument is provided to enable sharing of TransferHandlers by
+ * multiple components.
+ * @return The representation of the data to be transfered.
+ *
+ */
+ protected Transferable createTransferable(JComponent comp) {
+ exportComp = (JTextComponent)comp;
+ shouldRemove = true;
+ p0 = exportComp.getSelectionStart();
+ p1 = exportComp.getSelectionEnd();
+ return (p0 != p1) ? (new TextTransferable(exportComp, p0, p1)) : null;
+ }
+
+
+ /**
+ * This method is called after data has been exported. This method should
+ * remove the data that was transfered if the action was MOVE.
+ *
+ * @param source The component that was the source of the data.
+ * @param data The data that was transferred or possibly null
+ * if the action is <code>NONE</code>.
+ * @param action The actual action that was performed.
+ */
+ protected void exportDone(JComponent source, Transferable data, int action) {
+ // only remove the text if shouldRemove has not been set to
+ // false by importData and only if the action is a move
+ if (shouldRemove && action == MOVE) {
+ TextTransferable t = (TextTransferable)data;
+ t.removeText();
+ if (withinSameComponent) {
+ ((RTextArea)source).endAtomicEdit();
+ withinSameComponent = false;
+ }
+ }
+ exportComp = null;
+ }
+
+
+ /**
+ * This method causes a transfer to a component from a clipboard or a
+ * DND drop operation. The Transferable represents the data to be
+ * imported into the component.
+ *
+ * @param comp The component to receive the transfer. This
+ * argument is provided to enable sharing of TransferHandlers by
+ * multiple components.
+ * @param t The data to import
+ * @return <code>true</code> iff the data was inserted into the component.
+ */
+ public boolean importData(JComponent comp, Transferable t) {
+
+ JTextComponent c = (JTextComponent)comp;
+ withinSameComponent = c==exportComp;
+
+ // if we are importing to the same component that we exported from
+ // then don't actually do anything if the drop location is inside
+ // the drag location and set shouldRemove to false so that exportDone
+ // knows not to remove any data
+ if (withinSameComponent && c.getCaretPosition()>=p0 && c.getCaretPosition()<=p1) {
+ shouldRemove = false;
+ return true;
+ }
+
+ boolean imported = false;
+ DataFlavor importFlavor = getImportFlavor(t.getTransferDataFlavors(), c);
+ if (importFlavor != null) {
+ try {
+ InputContext ic = c.getInputContext();
+ if (ic != null)
+ ic.endComposition();
+ Reader r = importFlavor.getReaderForText(t);
+ handleReaderImport(r, c);
+ imported = true;
+ } catch (UnsupportedFlavorException ufe) {
+ ufe.printStackTrace();
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+
+ return imported;
+
+ }
+
+ /**
+ * This method indicates if a component would accept an import of the
+ * given set of data flavors prior to actually attempting to import it.
+ *
+ * @param comp The component to receive the transfer. This argument is
+ * provided to enable sharing of TransferHandlers by multiple
+ * components.
+ * @param flavors The data formats available.
+ * @return <code>true</code> iff the data can be inserted.
+ */
+ public boolean canImport(JComponent comp, DataFlavor[] flavors) {
+ JTextComponent c = (JTextComponent)comp;
+ if (!(c.isEditable() && c.isEnabled()))
+ return false;
+ return (getImportFlavor(flavors, c) != null);
+ }
+
+
+ /**
+ * A possible implementation of the Transferable interface for RTextAreas.
+ */
+ static class TextTransferable implements Transferable {
+
+ Position p0;
+ Position p1;
+ JTextComponent c;
+
+ protected String plainData;
+
+ private static DataFlavor[] stringFlavors;
+ private static DataFlavor[] plainFlavors;
+
+ TextTransferable(JTextComponent c, int start, int end) {
+ this.c = c;
+ Document doc = c.getDocument();
+ try {
+ p0 = doc.createPosition(start);
+ p1 = doc.createPosition(end);
+ plainData = c.getSelectedText();
+ } catch (BadLocationException ble) {
+ }
+ }
+
+ /**
+ * Fetch the data in a text/plain format.
+ */
+ protected String getPlainData() {
+ return plainData;
+ }
+
+ /**
+ * Returns an object which represents the data to be transferred. The class
+ * of the object returned is defined by the representation class of the flavor.
+ *
+ * @param flavor the requested flavor for the data
+ * @see DataFlavor#getRepresentationClass
+ * @exception IOException if the data is no longer available
+ * in the requested flavor.
+ * @exception UnsupportedFlavorException if the requested data flavor is
+ * not supported.
+ */
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+ if (isPlainFlavor(flavor)) {
+ String data = getPlainData();
+ data = (data == null) ? "" : data;
+ if (String.class.equals(flavor.getRepresentationClass())) {
+ return data;
+ } else if (Reader.class.equals(flavor.getRepresentationClass())) {
+ return new StringReader(data);
+ } else if (InputStream.class.equals(flavor.getRepresentationClass())) {
+ return new StringBufferInputStream(data);
+ }
+ // fall through to unsupported
+ } else if (isStringFlavor(flavor)) {
+ String data = getPlainData();
+ data = (data == null) ? "" : data;
+ return data;
+ }
+ throw new UnsupportedFlavorException(flavor);
+ }
+
+ /**
+ * Returns an array of DataFlavor objects indicating the flavors the data
+ * can be provided in. The array should be ordered according to preference
+ * for providing the data (from most richly descriptive to least descriptive).
+ *
+ * @return an array of data flavors in which this data can be transferred
+ */
+ public DataFlavor[] getTransferDataFlavors() {
+
+ int plainCount = (isPlainSupported()) ? plainFlavors.length: 0;
+ int stringCount = (isPlainSupported()) ? stringFlavors.length : 0;
+ int totalCount = plainCount + stringCount;
+ DataFlavor[] flavors = new DataFlavor[totalCount];
+
+ // fill in the array
+ int pos = 0;
+ if (plainCount > 0) {
+ System.arraycopy(plainFlavors, 0, flavors, pos, plainCount);
+ pos += plainCount;
+ }
+ if (stringCount > 0) {
+ System.arraycopy(stringFlavors, 0, flavors, pos, stringCount);
+ //pos += stringCount;
+ }
+
+ return flavors;
+
+ }
+
+ /**
+ * Returns whether or not the specified data flavor is supported for
+ * this object.
+ * @param flavor the requested flavor for the data
+ * @return boolean indicating whether or not the data flavor is supported
+ */
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ DataFlavor[] flavors = getTransferDataFlavors();
+ for (int i = 0; i < flavors.length; i++) {
+ if (flavors[i].equals(flavor))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether or not the specified data flavor is an plain flavor that
+ * is supported.
+ * @param flavor the requested flavor for the data
+ * @return boolean indicating whether or not the data flavor is supported
+ */
+ protected boolean isPlainFlavor(DataFlavor flavor) {
+ DataFlavor[] flavors = plainFlavors;
+ for (int i = 0; i < flavors.length; i++) {
+ if (flavors[i].equals(flavor))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Should the plain text flavors be offered? If so, the method
+ * getPlainData should be implemented to provide something reasonable.
+ */
+ protected boolean isPlainSupported() {
+ return plainData != null;
+ }
+
+ /**
+ * Returns whether or not the specified data flavor is a String flavor that
+ * is supported.
+ * @param flavor the requested flavor for the data
+ * @return boolean indicating whether or not the data flavor is supported
+ */
+ protected boolean isStringFlavor(DataFlavor flavor) {
+ DataFlavor[] flavors = stringFlavors;
+ for (int i = 0; i < flavors.length; i++) {
+ if (flavors[i].equals(flavor))
+ return true;
+ }
+ return false;
+ }
+
+ void removeText() {
+ if ((p0 != null) && (p1 != null) && (p0.getOffset() != p1.getOffset())) {
+ try {
+ Document doc = c.getDocument();
+ doc.remove(p0.getOffset(), p1.getOffset() - p0.getOffset());
+ } catch (BadLocationException e) {
+ }
+ }
+ }
+
+ // Initialization of supported flavors.
+ static {
+ try {
+
+ plainFlavors = new DataFlavor[3];
+ plainFlavors[0] = new DataFlavor("text/plain;class=java.lang.String");
+ plainFlavors[1] = new DataFlavor("text/plain;class=java.io.Reader");
+ plainFlavors[2] = new DataFlavor("text/plain;charset=unicode;class=java.io.InputStream");
+
+ stringFlavors = new DataFlavor[2];
+ stringFlavors[0] = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType+";class=java.lang.String");
+ stringFlavors[1] = DataFlavor.stringFlavor;
+
+ } catch (ClassNotFoundException cle) {
+ System.err.println("Error initializing org.fife.ui.RTATextTransferHandler");
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextArea.java b/src/org/fife/ui/rtextarea/RTextArea.java
new file mode 100644
index 0000000..a22cf6a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextArea.java
@@ -0,0 +1,1707 @@
+/*
+ * 11/14/2003
+ *
+ * RTextArea.java - An extension of JTextArea that adds many features.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Graphics;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Highlighter;
+import javax.swing.text.Segment;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.fife.print.RPrintUtilities;
+import org.fife.ui.rtextarea.Macro.MacroRecord;
+
+
+/**
+ * An extension of <code>JTextArea</code> that adds the following features:
+ * <ul>
+ * <li>Insert/Overwrite modes (can be toggled via the Insert key)
+ * <li>A right-click popup menu with standard editing options
+ * <li>Macro support
+ * <li>"Mark all" functionality.
+ * <li>A way to change the background to an image (gif/png/jpg)
+ * <li>Highlight the current line (can be toggled)
+ * <li>An easy way to print its text (implements Printable)
+ * <li>Hard/soft (emulated with spaces) tabs
+ * <li>Fixes a bug with setTabSize
+ * <li>Other handy new methods
+ * </ul>
+ * NOTE: If the background for an <code>RTextArea</code> is set to a color,
+ * its opaque property is set to <code>true</code> for performance reasons. If
+ * the background is set to an image, then the opaque property is set to
+ * <code>false</code>. This slows things down a little, but if it didn't happen
+ * then we would see garbage on-screen when the user scrolled through a document
+ * using the arrow keys (not the page-up/down keys though). You should never
+ * have to set the opaque property yourself; it is always done for you.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RTextArea extends RTextAreaBase
+ implements Printable, Serializable {
+
+ /**
+ * Constant representing insert mode.
+ *
+ * @see #setCaretStyle(int, int)
+ */
+ public static final int INSERT_MODE = 0;
+
+ /**
+ * Constant representing overwrite mode.
+ *
+ * @see #setCaretStyle(int, int)
+ */
+ public static final int OVERWRITE_MODE = 1;
+
+ /**
+ * The property fired when the "mark all" color changes.
+ */
+ public static final String MARK_ALL_COLOR_PROPERTY = "RTA.markAllColor";
+
+ /*
+ * Constants for all actions.
+ */
+ private static final int MIN_ACTION_CONSTANT = 0;
+ public static final int COPY_ACTION = 0;
+ public static final int CUT_ACTION = 1;
+ public static final int DELETE_ACTION = 2;
+ public static final int PASTE_ACTION = 3;
+ public static final int REDO_ACTION = 4;
+ public static final int SELECT_ALL_ACTION = 5;
+ public static final int UNDO_ACTION = 6;
+ private static final int MAX_ACTION_CONSTANT = 6;
+
+ private static final Color DEFAULT_MARK_ALL_COLOR = Color.ORANGE;
+
+ /**
+ * The current text mode ({@link #INSERT_MODE} or {@link #OVERWRITE_MODE}).
+ */
+ private int textMode;
+
+ // All macros are shared across all RTextAreas.
+ private static boolean recordingMacro; // Whether we're recording a macro.
+ private static Macro currentMacro;
+
+ /**
+ * This text area's popup menu.
+ */
+ private JPopupMenu popupMenu;
+
+ private JMenuItem undoMenuItem;
+ private JMenuItem redoMenuItem;
+ private JMenuItem cutMenuItem;
+ private JMenuItem pasteMenuItem;
+ private JMenuItem deleteMenuItem;
+
+ /**
+ * Whether the popup menu has been created.
+ */
+ private boolean popupMenuCreated;
+
+ /**
+ * The text last searched for via Ctrl+K or Ctrl+Shift+K.
+ */
+ private static String selectedOccurrenceText;
+
+ /**
+ * Can return tool tips for this text area. Subclasses can install a
+ * supplier as a means of adding custom tool tips without subclassing
+ * <tt>RTextArea</tt>. {@link #getToolTipText()} checks this supplier
+ * before calling the super class's version.
+ */
+ private ToolTipSupplier toolTipSupplier;
+
+ private static RecordableTextAction cutAction;
+ private static RecordableTextAction copyAction;
+ private static RecordableTextAction pasteAction;
+ private static RecordableTextAction deleteAction;
+ private static RecordableTextAction undoAction;
+ private static RecordableTextAction redoAction;
+ private static RecordableTextAction selectAllAction;
+
+ private static IconGroup iconGroup; // Info on icons for actions.
+
+ private transient RUndoManager undoManager;
+
+ private transient LineHighlightManager lineHighlightManager;
+
+ private ArrayList markAllHighlights; // Highlights from "mark all".
+ private String markedWord; // Expression marked in "mark all."
+ private ChangeableHighlightPainter markAllHighlightPainter;
+
+ private int[] carets; // Index 0=>insert caret, 1=>overwrite.
+
+ private static final String MSG = "org.fife.ui.rtextarea.RTextArea";
+
+
+ /**
+ * Constructor.
+ */
+ public RTextArea() {
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ */
+ public RTextArea(AbstractDocument doc) {
+ super(doc);
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ */
+ public RTextArea(String text) {
+ super(text);
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextArea(int rows, int cols) {
+ super(rows, cols);
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextArea(String text, int rows, int cols) {
+ super(text, rows, cols);
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextArea(AbstractDocument doc, String text, int rows, int cols) {
+ super(doc, text, rows, cols);
+ init(INSERT_MODE);
+ }
+
+
+ /**
+ * Creates a new <code>RTextArea</code>.
+ *
+ * @param textMode Either <code>INSERT_MODE</code> or
+ * <code>OVERWRITE_MODE</code>.
+ */
+ public RTextArea(int textMode) {
+ init(textMode);
+ }
+
+
+ /**
+ * Adds an action event to the current macro. This shouldn't be called
+ * directly, as it is called by the actions themselves.
+ *
+ * @param id The ID of the recordable text action.
+ * @param actionCommand The "command" of the action event passed to it.
+ */
+ static synchronized void addToCurrentMacro(String id,
+ String actionCommand) {
+ currentMacro.addMacroRecord(new Macro.MacroRecord(id, actionCommand));
+ }
+
+
+ /**
+ * Adds a line highlight.
+ *
+ * @param line The line to highlight. This is zero-based.
+ * @param color The color to highlight the line with.
+ * @throws BadLocationException If <code>line</code> is an invalid line
+ * number.
+ * @see #removeLineHighlight(Object)
+ * @see #removeAllLineHighlights()
+ */
+ public Object addLineHighlight(int line, Color color)
+ throws BadLocationException {
+ if (lineHighlightManager==null) {
+ lineHighlightManager = new LineHighlightManager(this);
+ }
+ return lineHighlightManager.addLineHighlight(line, color);
+ }
+
+
+ /**
+ * Begins an "atomic edit." All text editing operations between this call
+ * and the next call to <tt>endAtomicEdit()</tt> will be treated as a
+ * single operation by the undo manager.<p>
+ *
+ * Using this method should be done with great care. You should probably
+ * wrap the call to <tt>endAtomicEdit()</tt> in a <tt>finally</tt> block:
+ *
+ * <pre>
+ * textArea.beginAtomicEdit();
+ * try {
+ * // Do editing
+ * } finally {
+ * textArea.endAtomicEdit();
+ * }
+ * </pre>
+ *
+ * @see #endAtomicEdit()
+ */
+ public void beginAtomicEdit() {
+ undoManager.beginInternalAtomicEdit();
+ }
+
+
+ /**
+ * Begins recording a macro. After this method is called, all input/caret
+ * events, etc. are recorded until <code>endMacroRecording</code> is
+ * called. If this method is called but the text component is already
+ * recording a macro, nothing happens (but the macro keeps recording).
+ *
+ * @see #isRecordingMacro()
+ * @see #endRecordingMacro()
+ */
+ public static synchronized void beginRecordingMacro() {
+ if (isRecordingMacro()) {
+ //System.err.println("Macro already being recorded!");
+ return;
+ }
+ //JOptionPane.showMessageDialog(this, "Now recording a macro");
+ if (currentMacro!=null)
+ currentMacro = null; // May help gc?
+ currentMacro = new Macro();
+ recordingMacro = true;
+ }
+
+
+ /**
+ * Tells whether an undo is possible
+ *
+ * @see #canRedo()
+ * @see #undoLastAction()
+ */
+ public boolean canUndo() {
+ return undoManager.canUndo();
+ }
+
+
+ /**
+ * Tells whether a redo is possible
+ *
+ * @see #canUndo()
+ * @see #redoLastAction()
+ */
+ public boolean canRedo() {
+ return undoManager.canRedo();
+ }
+
+
+ /**
+ * Clears any "mark all" highlights, if any.
+ *
+ * @see #markAll
+ * @see #getMarkAllHighlightColor
+ * @see #setMarkAllHighlightColor
+ */
+ public void clearMarkAllHighlights() {
+ Highlighter h = getHighlighter();
+ if (h!=null && markAllHighlights!=null) {
+ int count = markAllHighlights.size();
+ for (int i=0; i<count; i++)
+ h.removeHighlight(markAllHighlights.get(i));
+ markAllHighlights.clear();
+ }
+ markedWord = null;
+ repaint();
+ }
+
+
+ /**
+ * Configures the popup menu for this text area. This method is called
+ * right before it is displayed, so a hosting application can do any
+ * custom configuration (configuring actions, adding/removing items, etc.).
+ * <p>
+ *
+ * The default implementation does nothing.<p>
+ *
+ * If you set the popup menu via {@link #setPopupMenu(JPopupMenu)}, you
+ * will want to override this method, especially if you removed any of the
+ * menu items in the default popup menu.
+ *
+ * @param popupMenu The popup menu. This will never be <code>null</code>.
+ * @see #createPopupMenu()
+ * @see #setPopupMenu(JPopupMenu)
+ */
+ protected void configurePopupMenu(JPopupMenu popupMenu) {
+
+ boolean canType = isEditable() && isEnabled();
+
+ // Since the user can customize the popup menu, these actions may not
+ // have been created.
+ if (undoMenuItem!=null) {
+ undoMenuItem.setEnabled(undoAction.isEnabled() && canType);
+ redoMenuItem.setEnabled(redoAction.isEnabled() && canType);
+ cutMenuItem.setEnabled(cutAction.isEnabled() && canType);
+ pasteMenuItem.setEnabled(pasteAction.isEnabled() && canType);
+ deleteMenuItem.setEnabled(deleteAction.isEnabled() && canType);
+ }
+
+ }
+
+
+ /**
+ * Creates the default implementation of the model to be used at
+ * construction if one isn't explicitly given. A new instance of RDocument
+ * is returned.
+ *
+ * @return The default document.
+ */
+ protected Document createDefaultModel() {
+ return new RDocument();
+ }
+
+ /**
+ * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+ *
+ * @return The caret event/mouse listener.
+ */
+ protected RTAMouseListener createMouseListener() {
+ return new RTextAreaMutableCaretEvent(this);
+ }
+
+
+ /**
+ * Creates the right-click popup menu. Subclasses can override this method
+ * to replace or augment the popup menu returned.
+ *
+ * @return The popup menu.
+ * @see #setPopupMenu(JPopupMenu)
+ * @see #configurePopupMenu(JPopupMenu)
+ * @see #createPopupMenuItem(Action)
+ */
+ protected JPopupMenu createPopupMenu() {
+ JPopupMenu menu = new JPopupMenu();
+ menu.add(undoMenuItem = createPopupMenuItem(undoAction));
+ menu.add(redoMenuItem = createPopupMenuItem(redoAction));
+ menu.addSeparator();
+ menu.add(cutMenuItem = createPopupMenuItem(cutAction));
+ menu.add(createPopupMenuItem(copyAction));
+ menu.add(pasteMenuItem = createPopupMenuItem(pasteAction));
+ menu.add(deleteMenuItem = createPopupMenuItem(deleteAction));
+ menu.addSeparator();
+ menu.add(createPopupMenuItem(selectAllAction));
+ return menu;
+ }
+
+
+ /**
+ * Creates the actions used in the popup menu and retrievable by
+ * {@link #getAction(int)}.
+ * TODO: Remove these horrible hacks and move localizing of actions into
+ * the editor kits, where it should be! The context menu should contain
+ * actions from the editor kits.
+ */
+ private static void createPopupMenuActions() {
+
+ // Create actions for right-click popup menu.
+ // 1.5.2004/pwy: Replaced the CTRL_MASK with the cross-platform version...
+ int mod = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+ ResourceBundle msg = ResourceBundle.getBundle(MSG);
+
+ cutAction = new RTextAreaEditorKit.CutAction();
+ cutAction.setProperties(msg, "Action.Cut");
+ cutAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, mod));
+ copyAction = new RTextAreaEditorKit.CopyAction();
+ copyAction.setProperties(msg, "Action.Copy");
+ copyAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, mod));
+ pasteAction = new RTextAreaEditorKit.PasteAction();
+ pasteAction.setProperties(msg, "Action.Paste");
+ pasteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, mod));
+ deleteAction = new RTextAreaEditorKit.DeleteNextCharAction();
+ deleteAction.setProperties(msg, "Action.Delete");
+ deleteAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
+ undoAction = new RTextAreaEditorKit.UndoAction();
+ undoAction.setProperties(msg, "Action.Undo");
+ undoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, mod));
+ redoAction = new RTextAreaEditorKit.RedoAction();
+ redoAction.setProperties(msg, "Action.Redo");
+ redoAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, mod));
+ selectAllAction = new RTextAreaEditorKit.SelectAllAction();
+ selectAllAction.setProperties(msg, "Action.SelectAll");
+ selectAllAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, mod));
+
+ }
+
+
+ /**
+ * Creates and configures a menu item for used in the popup menu.
+ *
+ * @param a The action for the menu item.
+ * @return The menu item.
+ * @see #createPopupMenu()
+ */
+ protected JMenuItem createPopupMenuItem(Action a) {
+ JMenuItem item = new JMenuItem(a) {
+ public void setToolTipText(String text) {
+ // Ignore! Actions (e.g. undo/redo) set this when changing
+ // their text due to changing enabled state.
+ }
+ };
+ item.setAccelerator(null);
+ return item;
+ }
+
+
+ /**
+ * Returns the a real UI to install on this text area.
+ *
+ * @return The UI.
+ */
+ protected RTextAreaUI createRTextAreaUI() {
+ return new RTextAreaUI(this);
+ }
+
+
+ /**
+ * Creates a string of space characters of the specified size.
+ *
+ * @param size The number of spaces.
+ * @return The string of spaces.
+ */
+ private final String createSpacer(int size) {
+ StringBuffer sb = new StringBuffer();
+ for (int i=0; i<size; i++) {
+ sb.append(' ');
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Creates an undo manager for use in this text area.
+ *
+ * @return The undo manager.
+ */
+ protected RUndoManager createUndoManager() {
+ return new RUndoManager(this);
+ }
+
+
+ /**
+ * Removes all undoable edits from this document's undo manager. This
+ * method also makes the undo/redo actions disabled.
+ */
+ /*
+ * NOTE: For some reason, it appears I have to create an entirely new
+ * <code>undoManager</code> for undo/redo to continue functioning
+ * properly; if I don't, it only ever lets you do one undo. Not
+ * too sure why this is...
+ */
+ public void discardAllEdits() {
+ undoManager.discardAllEdits();
+ getDocument().removeUndoableEditListener(undoManager);
+ undoManager = createUndoManager();
+ getDocument().addUndoableEditListener(undoManager);
+ undoManager.updateActions();
+ }
+
+
+ /**
+ * Completes an "atomic" edit.
+ *
+ * @see #beginAtomicEdit()
+ */
+ public void endAtomicEdit() {
+ undoManager.endInternalAtomicEdit();
+ }
+
+
+ /**
+ * Ends recording a macro. If this method is called but the text component
+ * is not recording a macro, nothing happens.
+ *
+ * @see #isRecordingMacro()
+ * @see #beginRecordingMacro()
+ */
+ /*
+ * FIXME: This should throw an exception if we're not recording a macro.
+ */
+ public static synchronized void endRecordingMacro() {
+ if (!isRecordingMacro()) {
+ //System.err.println("Not recording a macro!");
+ return;
+ }
+ recordingMacro = false;
+ }
+
+
+ /**
+ * Notifies all listeners that a caret change has occurred.
+ *
+ * @param e The caret event.
+ */
+ protected void fireCaretUpdate(CaretEvent e) {
+
+ // Decide whether we need to repaint the current line background.
+ possiblyUpdateCurrentLineHighlightLocation();
+
+ // Now, if there is a highlighted region of text, allow them to cut
+ // and copy.
+ if (e!=null && e.getDot()!=e.getMark()) {// && !cutAction.isEnabled()) {
+ cutAction.setEnabled(true);
+ copyAction.setEnabled(true);
+ }
+
+ // Otherwise, if there is no highlighted region, don't let them cut
+ // or copy. The condition here should speed things up, because this
+ // way, we will only enable the actions the first time the selection
+ // becomes nothing.
+ else if (cutAction.isEnabled()) {
+ cutAction.setEnabled(false);
+ copyAction.setEnabled(false);
+ }
+
+ super.fireCaretUpdate(e);
+
+ }
+
+
+ /**
+ * Removes the "Ctrl+H <=> Backspace" behavior that Java shows, for some
+ * odd reason...
+ */
+ private void fixCtrlH() {
+ InputMap inputMap = getInputMap();
+ KeyStroke char010 = KeyStroke.getKeyStroke("typed \010");
+ InputMap parent = inputMap;
+ while (parent != null) {
+ parent.remove(char010);
+ parent = parent.getParent();
+ }
+ KeyStroke backspace = KeyStroke.getKeyStroke("BACK_SPACE");
+ inputMap.put(backspace, DefaultEditorKit.deletePrevCharAction);
+ }
+
+
+ /**
+ * Provides a way to gain access to the editor actions on the right-click
+ * popup menu. This way you can make toolbar/menu bar items use the actual
+ * actions used by all <code>RTextArea</code>s, so that icons stay
+ * synchronized and you don't have to worry about enabling/disabling them
+ * yourself.<p>
+ * Keep in mind that these actions are shared across all instances of
+ * <code>RTextArea</code>, so a change to any action returned by this
+ * method is global across all <code>RTextArea</code> editors in your
+ * application.
+ *
+ * @param action The action to retrieve, such as {@link #CUT_ACTION}.
+ * If the action name is invalid, <code>null</code> is returned.
+ * @return The action, or <code>null</code> if an invalid action is
+ * requested.
+ */
+ public static RecordableTextAction getAction(int action) {
+ if (action<MIN_ACTION_CONSTANT || action>MAX_ACTION_CONSTANT)
+ return null;
+ switch (action) {
+ case COPY_ACTION:
+ return copyAction;
+ case CUT_ACTION:
+ return cutAction;
+ case DELETE_ACTION:
+ return deleteAction;
+ case PASTE_ACTION:
+ return pasteAction;
+ case REDO_ACTION:
+ return redoAction;
+ case SELECT_ALL_ACTION:
+ return selectAllAction;
+ case UNDO_ACTION:
+ return undoAction;
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns the macro currently stored in this <code>RTextArea</code>.
+ * Since macros are shared, all <code>RTextArea</code>s in the currently-
+ * running application are using this macro.
+ *
+ * @return The current macro, or <code>null</code> if no macro has been
+ * recorded/loaded.
+ * @see #loadMacro(Macro)
+ */
+ public static synchronized Macro getCurrentMacro() {
+ return currentMacro;
+ }
+
+
+ /**
+ * Returns the default color used for "mark all."
+ *
+ * @return The color.
+ * @see #getMarkAllHighlightColor()
+ * @see #setMarkAllHighlightColor(Color)
+ */
+ public static final Color getDefaultMarkAllHighlightColor() {
+ return DEFAULT_MARK_ALL_COLOR;
+ }
+
+
+ /**
+ * Returns the icon group being used for the actions of this text area.
+ *
+ * @return The icon group.
+ * @see #setIconGroup(IconGroup)
+ */
+ public static IconGroup getIconGroup() {
+ return iconGroup;
+ }
+
+
+ /**
+ * Returns the line highlight manager.
+ *
+ * @return The line highlight manager. This may be <code>null</code>.
+ */
+ LineHighlightManager getLineHighlightManager() {
+ return lineHighlightManager;
+ }
+
+
+ /**
+ * Returns the color used in "mark all."
+ *
+ * @return The color.
+ * @see #setMarkAllHighlightColor(Color)
+ */
+ public Color getMarkAllHighlightColor() {
+ return (Color)markAllHighlightPainter.getPaint();
+ }
+
+
+ /**
+ * Returns the maximum ascent of all fonts used in this text area. In
+ * the case of a standard <code>RTextArea</code>, this is simply the
+ * ascent of the current font.<p>
+ *
+ * This value could be useful, for example, to implement a line-numbering
+ * scheme.
+ *
+ * @return The ascent of the current font.
+ */
+ public int getMaxAscent() {
+ return getFontMetrics(getFont()).getAscent();
+ }
+
+
+ /**
+ * Returns the popup menu for this component, lazily creating it if
+ * necessary.
+ *
+ * @return The popup menu.
+ * @see #createPopupMenu()
+ * @see #setPopupMenu(JPopupMenu)
+ */
+ public JPopupMenu getPopupMenu() {
+ if (!popupMenuCreated) {
+ popupMenu = createPopupMenu();
+ if (popupMenu!=null) {
+ ComponentOrientation orientation = ComponentOrientation.
+ getOrientation(Locale.getDefault());
+ popupMenu.applyComponentOrientation(orientation);
+ }
+ popupMenuCreated = true;
+ }
+ return popupMenu;
+ }
+
+
+ /**
+ * Returns the text last selected and used in a Ctrl+K operation.
+ *
+ * @return The text, or <code>null</code> if none.
+ * @see #setSelectedOccurrenceText(String)
+ */
+ public static String getSelectedOccurrenceText() {
+ return selectedOccurrenceText;
+ }
+
+
+ /**
+ * Returns the text mode this editor pane is currently in.
+ *
+ * @return Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+ * @see #setTextMode(int)
+ */
+ public final int getTextMode() {
+ return textMode;
+ }
+
+
+ /**
+ * Returns the tool tip supplier.
+ *
+ * @return The tool tip supplier, or <code>null</code> if one isn't
+ * installed.
+ * @see #setToolTipSupplier(ToolTipSupplier)
+ */
+ public ToolTipSupplier getToolTipSupplier() {
+ return toolTipSupplier;
+ }
+
+
+ /**
+ * Returns the tooltip to display for a mouse event at the given
+ * location. This method is overridden to check for a
+ * {@link ToolTipSupplier}; if there is one installed, it is queried for
+ * tool tip text before using the super class's implementation of this
+ * method.
+ *
+ * @param e The mouse event.
+ * @return The tool tip text, or <code>null</code> if none.
+ * @see #getToolTipSupplier()
+ * @see #setToolTipSupplier(ToolTipSupplier)
+ */
+ public String getToolTipText(MouseEvent e) {
+ String tip = null;
+ if (getToolTipSupplier()!=null) {
+ tip = getToolTipSupplier().getToolTipText(this, e);
+ }
+ return tip!=null ? tip : super.getToolTipText();
+ }
+
+
+ /**
+ * Does the actual dirty-work of replacing the selected text in this
+ * text area (i.e., in its document). This method provides a hook for
+ * subclasses to handle this in a different way.
+ *
+ * @param content The content to add.
+ */
+ protected void handleReplaceSelection(String content) {
+ // Call into super to handle composed text (1.5+ only though).
+ super.replaceSelection(content);
+ }
+
+
+ /**
+ * Initializes this text area.
+ *
+ * @param textMode The text mode.
+ */
+ private void init(int textMode) {
+
+ // NOTE: Our actions are created here instead of in a static block
+ // so they are only created when the first RTextArea is instantiated,
+ // not before. There have been reports of users calling static getters
+ // (e.g. RSyntaxTextArea.getDefaultBracketMatchBGColor()) which would
+ // cause these actions to be created and (possibly) incorrectly
+ // localized, if they were in a static block.
+ if (cutAction==null) {
+ createPopupMenuActions();
+ }
+
+ // Install the undo manager.
+ undoManager = createUndoManager();
+ getDocument().addUndoableEditListener(undoManager);
+
+ // Set the defaults for various stuff.
+ Color markAllHighlightColor = getDefaultMarkAllHighlightColor();
+ markAllHighlightPainter = new ChangeableHighlightPainter(
+ markAllHighlightColor);
+ setMarkAllHighlightColor(markAllHighlightColor);
+ carets = new int[2];
+ setCaretStyle(INSERT_MODE, ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+ setCaretStyle(OVERWRITE_MODE, ConfigurableCaret.BLOCK_STYLE);
+ setDragEnabled(true); // Enable drag-and-drop.
+
+ // Set values for stuff the user passed in.
+ setTextMode(textMode); // carets array must be initialized first!
+
+ // Fix the odd "Ctrl+H <=> Backspace" Java behavior.
+ fixCtrlH();
+
+ }
+
+
+ /**
+ * Returns whether or not a macro is being recorded.
+ *
+ * @return Whether or not a macro is being recorded.
+ * @see #beginRecordingMacro()
+ * @see #endRecordingMacro()
+ */
+ public static synchronized boolean isRecordingMacro() {
+ return recordingMacro;
+ }
+
+
+ /**
+ * Loads a macro to be used by all <code>RTextArea</code>s in the current
+ * application.
+ *
+ * @param macro The macro to load.
+ * @see #getCurrentMacro()
+ */
+ public static synchronized void loadMacro(Macro macro) {
+ currentMacro = macro;
+ }
+
+
+ /**
+ * Marks all instances of the specified text in this text area.
+ *
+ * @param toMark The text to mark.
+ * @param matchCase Whether the match should be case-sensitive.
+ * @param wholeWord Whether the matches should be surrounded by spaces
+ * or tabs.
+ * @param regex Whether <code>toMark</code> is a Java regular expression.
+ * @return The number of matches marked.
+ * @see #clearMarkAllHighlights
+ * @see #getMarkAllHighlightColor
+ * @see #setMarkAllHighlightColor
+ */
+ public int markAll(String toMark, boolean matchCase, boolean wholeWord,
+ boolean regex) {
+ Highlighter h = getHighlighter();
+ int numMarked = 0;
+ if (toMark!=null && !toMark.equals(markedWord) && h!=null) {
+ if (markAllHighlights!=null)
+ clearMarkAllHighlights();
+ else
+ markAllHighlights = new ArrayList(10);
+ int caretPos = getCaretPosition();
+ markedWord = toMark;
+ setCaretPosition(0);
+ SearchContext context = new SearchContext();
+ context.setSearchFor(toMark);
+ context.setMatchCase(matchCase);
+ context.setRegularExpression(regex);
+ context.setSearchForward(true);
+ context.setWholeWord(wholeWord);
+ boolean found = SearchEngine.find(this, context);
+ while (found) {
+ int start = getSelectionStart();
+ int end = getSelectionEnd();
+ try {
+ markAllHighlights.add(h.addHighlight(start, end,
+ markAllHighlightPainter));
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ }
+ numMarked++;
+ found = SearchEngine.find(this, context);
+ }
+ setCaretPosition(caretPos);
+ repaint();
+ }
+ return numMarked;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void paste() {
+ // Treat paste operations as atomic, otherwise the removal and
+ // insertion are treated as two separate undo-able operations.
+ beginAtomicEdit();
+ try {
+ super.paste();
+ } finally {
+ endAtomicEdit();
+ }
+ }
+
+
+ /**
+ * "Plays back" the last recorded macro in this text area.
+ */
+ public synchronized void playbackLastMacro() {
+ if (currentMacro!=null) {
+ Action[] actions = getActions();
+ int numActions = actions.length;
+ List macroRecords = currentMacro.getMacroRecords();
+ int num = macroRecords.size();
+ if (num>0) {
+ undoManager.beginInternalAtomicEdit();
+ try {
+ for (int i=0; i<num; i++) {
+ MacroRecord record = (MacroRecord)macroRecords.get(i);
+ for (int j=0; j<numActions; j++) {
+ if ((actions[j] instanceof RecordableTextAction) &&
+ record.id.equals(
+ ((RecordableTextAction)actions[j]).getMacroID())) {
+ actions[j].actionPerformed(
+ new ActionEvent(this,
+ ActionEvent.ACTION_PERFORMED,
+ record.actionCommand));
+ break;
+ }
+ }
+ }
+ } finally {
+ undoManager.endInternalAtomicEdit();
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Method called when it's time to print this badboy (the old-school,
+ * AWT way).
+ *
+ * @param g The context into which the page is drawn.
+ * @param pageFormat The size and orientation of the page being drawn.
+ * @param pageIndex The zero based index of the page to be drawn.
+ */
+ public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
+ return RPrintUtilities.printDocumentWordWrap(g, this, getFont(), pageIndex, pageFormat, getTabSize());
+ }
+
+
+ /**
+ * We override this method because the super version gives us an entirely
+ * new <code>Document</code>, thus requiring us to re-attach our Undo
+ * manager. With this version we just replace the text.
+ */
+ public void read(Reader in, Object desc) throws IOException {
+
+ RTextAreaEditorKit kit = (RTextAreaEditorKit)getUI().getEditorKit(this);
+ setText(null);
+ Document doc = getDocument();
+ if (desc != null)
+ doc.putProperty(Document.StreamDescriptionProperty, desc);
+ try {
+ // NOTE: Resets the "line separator" property.
+ kit.read(in, doc, 0);
+ } catch (BadLocationException e) {
+ throw new IOException(e.getMessage());
+ }
+
+ }
+
+
+ /**
+ * De-serializes a text area.
+ *
+ * @param s The stream to read from.
+ * @throws ClassNotFoundException
+ * @throws IOException
+ */
+ private void readObject(ObjectInputStream s)
+ throws ClassNotFoundException, IOException {
+
+ s.defaultReadObject();
+
+ // UndoManagers cannot be serialized without Exceptions. See
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+ undoManager = createUndoManager();
+ getDocument().addUndoableEditListener(undoManager);
+
+ lineHighlightManager = null; // Keep FindBugs happy.
+
+ }
+
+
+ /**
+ * Attempt to redo the last action.
+ *
+ * @see #undoLastAction()
+ */
+ public void redoLastAction() {
+ // NOTE: The try/catch block shouldn't be necessary...
+ try {
+ if (undoManager.canRedo())
+ undoManager.redo();
+ } catch (CannotRedoException cre) {
+ cre.printStackTrace();
+ }
+ }
+
+
+ /**
+ * Removes all line highlights.
+ *
+ * @see #removeLineHighlight(Object)
+ */
+ public void removeAllLineHighlights() {
+ if (lineHighlightManager!=null) {
+ lineHighlightManager.removeAllLineHighlights();
+ }
+ }
+
+
+ /**
+ * Removes a line highlight.
+ *
+ * @param tag The tag of the line highlight to remove.
+ * @see #removeAllLineHighlights()
+ * @see #addLineHighlight(int, Color)
+ */
+ public void removeLineHighlight(Object tag) {
+ if (lineHighlightManager!=null) {
+ lineHighlightManager.removeLineHighlight(tag);
+ }
+ }
+
+
+ /**
+ * Replaces text from the indicated start to end position with the
+ * new text specified. Does nothing if the model is null. Simply
+ * does a delete if the new string is null or empty.
+ * <p>
+ * This method is thread safe, although most Swing methods
+ * are not.<p>
+ * This method is overridden so that our Undo manager remembers it as a
+ * single operation (it has trouble with this, especially for
+ * <code>RSyntaxTextArea</code> and the "auto-indent" feature).
+ *
+ * @param str the text to use as the replacement
+ * @param start the start position >= 0
+ * @param end the end position >= start
+ * @exception IllegalArgumentException if part of the range is an
+ * invalid position in the model
+ * @see #insert(String, int)
+ * @see #replaceRange(String, int, int)
+ */
+ public void replaceRange(String str, int start, int end) {
+ if (end < start)
+ throw new IllegalArgumentException("end before start");
+ Document doc = getDocument();
+ if (doc != null) {
+ try {
+ // Without this, in some cases we'll have to do two undos
+ // for one logical operation (for example, try editing a
+ // Java source file in an RSyntaxTextArea, and moving a line
+ // with text already on it down via Enter. Without this
+ // line, doing a single "undo" moves all later text up,
+ // but the first line moved down isn't there! Doing a
+ // second undo puts it back.
+ undoManager.beginInternalAtomicEdit();
+ ((AbstractDocument)doc).replace(start, end - start,
+ str, null);
+ } catch (BadLocationException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ } finally {
+ undoManager.endInternalAtomicEdit();
+ }
+ }
+ }
+
+
+ /**
+ * This method overrides <code>JTextComponent</code>'s
+ * <code>replaceSelection</code>, so that if <code>textMode</code> is
+ * {@link #OVERWRITE_MODE}, it actually overwrites.
+ *
+ * @param text The content to replace the selection with.
+ */
+ public void replaceSelection(String text) {
+
+ // It's legal for null to be used here...
+ if (text==null) {
+ handleReplaceSelection(text);
+ return;
+ }
+
+ if (getTabsEmulated()) {
+ int firstTab = text.indexOf('\t');
+ if (firstTab>-1) {
+ int docOffs = getSelectionStart();
+ try {
+ text = replaceTabsWithSpaces(text, docOffs, firstTab);
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+ }
+ }
+
+ // If the user wants to overwrite text...
+ if (textMode==OVERWRITE_MODE && !"\n".equals(text)) {
+
+ Caret caret = getCaret();
+ int caretPos = caret.getDot();
+ Document doc = getDocument();
+ Element map = doc.getDefaultRootElement();
+ int curLine = map.getElementIndex(caretPos);
+ int lastLine = map.getElementCount() - 1;
+
+ try {
+
+ // If we're not at the end of a line, select the characters
+ // that will be overwritten (otherwise JTextArea will simply
+ // insert in front of them).
+ int curLineEnd = getLineEndOffset(curLine);
+ if (caretPos==caret.getMark() && caretPos!=curLineEnd) {
+ if (curLine==lastLine)
+ caretPos = Math.min(caretPos+text.length(), curLineEnd);
+ else
+ caretPos = Math.min(caretPos+text.length(), curLineEnd-1);
+ caret.moveDot(caretPos);//moveCaretPosition(caretPos);
+ }
+
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().provideErrorFeedback(this);
+ ble.printStackTrace();
+ }
+
+ } // End of if (textMode==OVERWRITE_MODE).
+
+ // Now, actually do the inserting/replacing. Our undoManager will
+ // take care of remembering the remove/insert as atomic if we are in
+ // overwrite mode.
+ handleReplaceSelection(text);
+
+ }
+
+
+ private static StringBuffer repTabsSB;
+ private static Segment repTabsSeg = new Segment();
+ /**
+ * Replaces all instances of the tab character in <code>text</code> with
+ * the number of spaces equivalent to a tab in this text area.<p>
+ *
+ * This method should only be called from thread-safe methods, such as
+ * {@link #replaceSelection(String)}.
+ *
+ * @param text The <code>java.lang.String</code> in which to replace tabs
+ * with spaces. This has already been verified to have at least
+ * one tab character in it.
+ * @param docOffs The offset in the document at which the text is being
+ * inserted.
+ * @param firstTab The offset into <code>text</code> of the first tab. Assumed
+ * to be >= 0.
+ * @return A <code>String</code> just like <code>text</code>, but with
+ * spaces instead of tabs.
+ */
+ private final String replaceTabsWithSpaces(String text, int docOffs, int firstTab)
+ throws BadLocationException {
+
+ int tabSize = getTabSize();
+
+ // Get how many chars into the current line we are
+ Document doc = getDocument();
+ Element root = doc.getDefaultRootElement();
+ int lineIndex = root.getElementIndex(docOffs);
+ Element line = root.getElement(lineIndex);
+ int lineStart = line.getStartOffset();
+ int charCount = docOffs - lineStart;
+
+ // Figure out how many chars into the "current tab" we are
+ if (charCount>0) {
+ doc.getText(lineStart, charCount, repTabsSeg);
+ charCount = 0;
+ for (int i=0; i<repTabsSeg.count; i++) {
+ char ch = repTabsSeg.array[repTabsSeg.offset + i];
+ if (ch=='\t') {
+ charCount = 0;
+ }
+ else {
+ charCount = (charCount + 1) % tabSize;
+ }
+ }
+ }
+
+ // Common case: The user's entering a single tab (pressed the tab key).
+ if (text.length()==1) {
+ return createSpacer(tabSize - charCount);
+ }
+
+ // Otherwise, there may be more than one tab.
+
+ if (repTabsSB==null) {
+ repTabsSB = new StringBuffer();
+ }
+ repTabsSB.setLength(0);
+ char[] array = text.toCharArray();
+ int lastPos = 0;
+ int offsInLine = charCount; // Accurate enough for our start
+ for (int pos=firstTab; pos<array.length; pos++) {
+ char ch = array[pos];
+ switch (ch) {
+ case '\t':
+ if (pos>lastPos) {
+ repTabsSB.append(array, lastPos, pos-lastPos);
+ }
+ int thisTabSize = tabSize - (offsInLine%tabSize);
+ repTabsSB.append(createSpacer(thisTabSize));
+ lastPos = pos + 1;
+ offsInLine = 0;
+ break;
+ case '\n':
+ offsInLine = 0;
+ break;
+ default:
+ offsInLine++;
+ break;
+ }
+ }
+ if (lastPos<array.length) {
+ repTabsSB.append(array, lastPos, array.length-lastPos);
+ }
+
+ return repTabsSB.toString();
+
+ }
+
+
+
+ /**
+ * Sets the properties of one of the actions this text area owns.
+ *
+ * @param action The action to modify; for example, {@link #CUT_ACTION}.
+ * @param name The new name for the action.
+ * @param mnemonic The new mnemonic for the action.
+ * @param accelerator The new accelerator key for the action.
+ */
+ public static void setActionProperties(int action, String name,
+ char mnemonic, KeyStroke accelerator) {
+ setActionProperties(action, name, new Integer(mnemonic), accelerator);
+ }
+
+
+ /**
+ * Sets the properties of one of the actions this text area owns.
+ *
+ * @param action The action to modify; for example, {@link #CUT_ACTION}.
+ * @param name The new name for the action.
+ * @param mnemonic The new mnemonic for the action.
+ * @param accelerator The new accelerator key for the action.
+ */
+ public static void setActionProperties(int action, String name,
+ Integer mnemonic, KeyStroke accelerator) {
+
+ Action tempAction = null;
+
+ switch (action) {
+ case CUT_ACTION:
+ tempAction = cutAction;
+ break;
+ case COPY_ACTION:
+ tempAction = copyAction;
+ break;
+ case PASTE_ACTION:
+ tempAction = pasteAction;
+ break;
+ case DELETE_ACTION:
+ tempAction = deleteAction;
+ break;
+ case SELECT_ALL_ACTION:
+ tempAction = selectAllAction;
+ break;
+ case UNDO_ACTION:
+ case REDO_ACTION:
+ default:
+ return;
+ }
+
+ tempAction.putValue(Action.NAME, name);
+ tempAction.putValue(Action.SHORT_DESCRIPTION, name);
+ tempAction.putValue(Action.ACCELERATOR_KEY, accelerator);
+ tempAction.putValue(Action.MNEMONIC_KEY, mnemonic);
+
+ }
+
+
+ /**
+ * Sets the caret to use in this text area. It is strongly encouraged to
+ * use {@link ConfigurableCaret}s (which is used by default), or a
+ * subclass, since they know how to render themselves differently when the
+ * user toggles between insert and overwrite modes.
+ *
+ * @param caret The caret to use. If this is not an instance of
+ * <code>ConfigurableCaret</code>, an exception is thrown.
+ * @throws IllegalArgumentException If the specified caret is not an
+ * <code>ConfigurableCaret</code>.
+ * @see #setCaretStyle(int, int)
+ */
+ public void setCaret(Caret caret) {
+ super.setCaret(caret);
+ if (carets!=null && // Called by setUI() before carets is initialized
+ caret instanceof ConfigurableCaret) {
+ ((ConfigurableCaret)caret).setStyle(carets[getTextMode()]);
+ }
+ }
+
+
+ /**
+ * Sets the style of caret used when in insert or overwrite mode.
+ *
+ * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+ * @param style The style for the caret (such as
+ * {@link ConfigurableCaret#VERTICAL_LINE_STYLE}).
+ * @see org.fife.ui.rtextarea.ConfigurableCaret
+ */
+ public void setCaretStyle(int mode, int style) {
+ style = (style>=ConfigurableCaret.MIN_STYLE &&
+ style<=ConfigurableCaret.MAX_STYLE ?
+ style : ConfigurableCaret.THICK_VERTICAL_LINE_STYLE);
+ carets[mode] = style;
+ if (mode==getTextMode() && getCaret() instanceof ConfigurableCaret) {
+ // Will repaint the caret if necessary.
+ ((ConfigurableCaret)getCaret()).setStyle(style);
+ }
+ }
+
+
+ /**
+ * Sets the document used by this text area.
+ *
+ * @param document The new document to use.
+ * @throws IllegalArgumentException If the document is not an instance of
+ * {@link RDocument}.
+ */
+ public void setDocument(Document document) {
+ if (!(document instanceof RDocument)) {
+ throw new IllegalArgumentException("RTextArea requires " +
+ "instances of RDocument for its document");
+ }
+ if (undoManager!=null) { // First time through, undoManager==null
+ Document old = getDocument();
+ if (old!=null) {
+ old.removeUndoableEditListener(undoManager);
+ }
+ }
+ super.setDocument(document);
+ if (undoManager!=null) {
+ document.addUndoableEditListener(undoManager);
+ discardAllEdits();
+ }
+ }
+
+
+ /**
+ * Sets the path in which to find images to associate with the editor's
+ * actions. The path MUST contain the following images (with the
+ * appropriate extension as defined by the icon group):<br>
+ * <ul>
+ * <li>cut</li>
+ * <li>copy</li>
+ * <li>paste</li>
+ * <li>delete</li>
+ * <li>undo</li>
+ * <li>redo</li>
+ * <li>selectall</li>
+ * </ul>
+ * If any of the above images don't exist, the corresponding action will
+ * not have an icon.
+ *
+ * @param group The icon group to load.
+ * @see #getIconGroup()
+ */
+ public static synchronized void setIconGroup(IconGroup group) {
+ Icon icon = group.getIcon("cut");
+ cutAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("copy");
+ copyAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("paste");
+ pasteAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("delete");
+ deleteAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("undo");
+ undoAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("redo");
+ redoAction.putValue(Action.SMALL_ICON, icon);
+ icon = group.getIcon("selectall");
+ selectAllAction.putValue(Action.SMALL_ICON, icon);
+ iconGroup = group;
+ }
+
+
+ /**
+ * Sets the color used for "mark all." This fires a property change of
+ * type {@link #MARK_ALL_COLOR_PROPERTY}.
+ *
+ * @param color The color to use for "mark all."
+ * @see #getMarkAllHighlightColor()
+ */
+ public void setMarkAllHighlightColor(Color color) {
+ Color old = (Color)markAllHighlightPainter.getPaint();
+ if (old!=null && !old.equals(color)) {
+ markAllHighlightPainter.setPaint(color);
+ if (markedWord!=null)
+ repaint(); // Repaint if words are highlighted.
+ firePropertyChange(MARK_ALL_COLOR_PROPERTY, old, color);
+ }
+ }
+
+
+ /**
+ * Sets the popup menu used by this text area.<p>
+ *
+ * If you set the popup menu with this method, you'll want to consider also
+ * overriding {@link #configurePopupMenu(JPopupMenu)}, especially if you
+ * removed any of the default menu items.
+ *
+ * @param popupMenu The popup menu. If this is <code>null</code>, no
+ * popup menu will be displayed.
+ * @see #getPopupMenu()
+ * @see #configurePopupMenu(JPopupMenu)
+ */
+ public void setPopupMenu(JPopupMenu popupMenu) {
+ this.popupMenu = popupMenu;
+ popupMenuCreated = true;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setRoundedSelectionEdges(boolean rounded) {
+ if (getRoundedSelectionEdges()!=rounded) {
+ markAllHighlightPainter.setRoundedEdges(rounded);
+ super.setRoundedSelectionEdges(rounded); // Fires event.
+ }
+ }
+
+
+ /**
+ * Sets the text last selected/Ctrl+K'd in an <code>RTextArea</code>.
+ * This text will be searched for in subsequent Ctrl+K/Ctrl+Shift+K
+ * actions (Cmd+K on OS X).<p>
+ *
+ * Since the selected occurrence actions are built into RTextArea,
+ * applications usually do not have to call this method directly, but can
+ * choose to do so if they wish (for example, if they wish to set this
+ * value when the user does a search via a Find dialog).
+ *
+ * @param text The selected text.
+ * @see #getSelectedOccurrenceText()
+ */
+ public static void setSelectedOccurrenceText(String text) {
+ selectedOccurrenceText = text;
+ }
+
+
+ /**
+ * Sets the text mode for this editor pane. If the currently installed
+ * caret is an instance of {@link ConfigurableCaret}, it will be
+ * automatically updated to render itself appropriately for the new text
+ * mode.
+ *
+ * @param mode Either {@link #INSERT_MODE} or {@link #OVERWRITE_MODE}.
+ * @see #getTextMode()
+ */
+ public void setTextMode(int mode) {
+
+ if (mode!=INSERT_MODE && mode!=OVERWRITE_MODE)
+ mode = INSERT_MODE;
+
+ if (textMode != mode) {
+ Caret caret = getCaret();
+ if (caret instanceof ConfigurableCaret) {
+ ((ConfigurableCaret)caret).setStyle(carets[mode]);
+ }
+ textMode = mode;
+ }
+
+ }
+
+
+ /**
+ * Sets the tool tip supplier.
+ *
+ * @param supplier The new tool tip supplier, or <code>null</code> if
+ * there is to be no supplier.
+ * @see #getToolTipSupplier()
+ */
+ public void setToolTipSupplier(ToolTipSupplier supplier) {
+ this.toolTipSupplier = supplier;
+ }
+
+
+ /**
+ * Sets the UI used by this text area. This is overridden so only the
+ * right-click popup menu's UI is updated. The look and feel of an
+ * <code>RTextArea</code> is independent of the Java Look and Feel, and so
+ * this method does not change the text area itself. Subclasses (such as
+ * <code>RSyntaxTextArea</code> can call <code>setRTextAreaUI</code> if
+ * they wish to install a new UI.
+ *
+ * @param ui This parameter is ignored.
+ */
+ public final void setUI(TextUI ui) {
+
+ // Update the popup menu's ui.
+ if (popupMenu!=null) {
+ SwingUtilities.updateComponentTreeUI(popupMenu);
+ }
+
+ // Set things like selection color, selected text color, etc. to
+ // laf defaults (if values are null or UIResource instances).
+ RTextAreaUI rtaui = (RTextAreaUI)getUI();
+ if (rtaui!=null) {
+ rtaui.installDefaults();
+ }
+
+ }
+
+
+ /**
+ * Attempt to undo an "action" done in this text area.
+ *
+ * @see #redoLastAction()
+ */
+ public void undoLastAction() {
+ // NOTE: that the try/catch block shouldn't be necessary...
+ try {
+ if (undoManager.canUndo())
+ undoManager.undo();
+ }
+ catch (CannotUndoException cre) {
+ cre.printStackTrace();
+ }
+ }
+
+ /**
+ * Serializes this text area.
+ *
+ * @param s The stream to write to.
+ * @throws IOException If an IO error occurs.
+ */
+ private void writeObject(ObjectOutputStream s) throws IOException {
+
+ // UndoManagers cannot be serialized without Exceptions. See
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4275892
+ getDocument().removeUndoableEditListener(undoManager);
+ s.defaultWriteObject();
+ getDocument().addUndoableEditListener(undoManager);
+
+ }
+
+
+ /**
+ * Modified from <code>MutableCaretEvent</code> in
+ * <code>JTextComponent</code> so that mouse events get fired when the user
+ * is selecting text with the mouse as well. This class also displays the
+ * popup menu when the user right-clicks in the text area.
+ */
+ protected class RTextAreaMutableCaretEvent extends RTAMouseListener {
+
+ protected RTextAreaMutableCaretEvent(RTextArea textArea) {
+ super(textArea);
+ }
+
+ public void focusGained(FocusEvent e) {
+ Caret c = getCaret();
+ boolean enabled = c.getDot()!=c.getMark();
+ cutAction.setEnabled(enabled);
+ copyAction.setEnabled(enabled);
+ undoManager.updateActions(); // To reflect this text area.
+ }
+
+ public void focusLost(FocusEvent e) {
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+ Caret caret = getCaret();
+ dot = caret.getDot();
+ mark = caret.getMark();
+ fireCaretUpdate(this);
+ }
+ }
+
+ public void mousePressed(MouseEvent e) {
+ // WORKAROUND: Since JTextComponent only updates the caret
+ // location on mouse clicked and released, we'll do it on dragged
+ // events when the left mouse button is clicked.
+ if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
+ Caret caret = getCaret();
+ dot = caret.getDot();
+ mark = caret.getMark();
+ fireCaretUpdate(this);
+ }
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ if ((e.getModifiers()&MouseEvent.BUTTON3_MASK)!=0)
+ showPopup(e);
+ }
+
+ /**
+ * Shows a popup menu with cut, copy, paste, etc. options if the
+ * user clicked the right button.
+ *
+ * @param e The mouse event that caused this method to be called.
+ */
+ private void showPopup(MouseEvent e) {
+ JPopupMenu popupMenu = getPopupMenu();
+ if (popupMenu!=null) {
+ configurePopupMenu(popupMenu);
+ popupMenu.show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaBase.java b/src/org/fife/ui/rtextarea/RTextAreaBase.java
new file mode 100644
index 0000000..e934bda
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaBase.java
@@ -0,0 +1,1179 @@
+/*
+ * 04/07/2005
+ *
+ * RTextAreaBase.java - The base class for an RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.AWTEvent;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.event.ComponentEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import javax.swing.JTextArea;
+import javax.swing.event.CaretEvent;
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.TextUI;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.StyleContext;
+
+
+/**
+ * This is the base class for <code>RTextArea</code>; basically it's just an
+ * extension of <code>javax.swing.JTextArea</code> adding a bunch of properties.
+ * <p>
+ *
+ * This class is only supposed to be overridden by <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+abstract class RTextAreaBase extends JTextArea {
+
+ public static final String BACKGROUND_IMAGE_PROPERTY = "background.image";
+ public static final String CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY = "RTA.currentLineHighlightColor";
+ public static final String CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY = "RTA.currentLineHighlightFade";
+ public static final String HIGHLIGHT_CURRENT_LINE_PROPERTY = "RTA.currentLineHighlight";
+ public static final String ROUNDED_SELECTION_PROPERTY = "RTA.roundedSelection";
+
+ private boolean tabsEmulatedWithSpaces; // If true, tabs will be expanded to spaces.
+
+ private boolean highlightCurrentLine; // If true, the current line is highlighted.
+ private Color currentLineColor; // The color used to highlight the current line.
+ private boolean marginLineEnabled; // If true, paint a "margin line."
+ private Color marginLineColor; // The color used to paint the margin line.
+ private int marginLineX; // The x-location of the margin line.
+ private int marginSizeInChars; // How many 'm' widths the margin line is over.
+ private boolean fadeCurrentLineHighlight; // "Fade effect" for current line highlight.
+ private boolean roundedSelectionEdges;
+ private int previousCaretY;
+int currentCaretY; // Used to know when to rehighlight current line.
+
+ private BackgroundPainterStrategy backgroundPainter; // Paints the background.
+
+ private RTAMouseListener mouseListener;
+
+ private static final Color DEFAULT_CARET_COLOR = new ColorUIResource(255,51,51);
+ private static final Color DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR = new Color(255,255,170);
+ private static final Color DEFAULT_MARGIN_LINE_COLOR = new Color(255,224,224);
+ private static final int DEFAULT_TAB_SIZE = 4;
+ private static final int DEFAULT_MARGIN_LINE_POSITION = 80;
+
+
+ /**
+ * Constructor.
+ */
+ public RTextAreaBase() {
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ */
+ public RTextAreaBase(AbstractDocument doc) {
+ super(doc);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ */
+ public RTextAreaBase(String text) {
+ super(text);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextAreaBase(int rows, int cols) {
+ super(rows, cols);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextAreaBase(String text, int rows, int cols) {
+ super(text, rows, cols);
+ init();
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document for the editor.
+ * @param text The initial text to display.
+ * @param rows The number of rows to display.
+ * @param cols The number of columns to display.
+ * @throws IllegalArgumentException If either <code>rows</code> or
+ * <code>cols</code> is negative.
+ */
+ public RTextAreaBase(AbstractDocument doc, String text, int rows,
+ int cols) {
+ super(doc, text, rows, cols);
+ init();
+ }
+
+
+ /**
+ * Adds listeners that listen for changes to the current line, so we can
+ * update our "current line highlight." This is needed only because of an
+ * apparent difference between the JRE 1.4.2 and 1.5.0 (needed on 1.4.2,
+ * not needed on 1.5.0).
+ */
+ protected void addCurrentLineHighlightListeners() {
+ boolean add = true;
+ MouseMotionListener[] mouseMotionListeners = getMouseMotionListeners();
+ for (int i=0; i<mouseMotionListeners.length; i++) {
+ if (mouseMotionListeners[i]==mouseListener) {
+ add = false;
+ break;
+ }
+ }
+ if (add==true) {
+ //System.err.println("Adding mouse motion listener!");
+ addMouseMotionListener(mouseListener);
+ }
+ MouseListener[] mouseListeners = getMouseListeners();
+ for (int i=0; i<mouseListeners.length; i++) {
+ if (mouseListeners[i]==mouseListener) {
+ add = false;
+ break;
+ }
+ }
+ if (add==true) {
+ //System.err.println("Adding mouse listener!");
+ addMouseListener(mouseListener);
+ }
+ }
+
+
+ /*
+ * TODO: Figure out why RTextArea doesn't work with RTL orientation!
+ */
+// public void applyComponentOrientation(ComponentOrientation orientation) {
+// super.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
+// }
+
+
+ /**
+ * Converts all instances of a number of spaces equal to a tab size
+ * into a tab in this text area.
+ *
+ * @see #convertTabsToSpaces
+ * @see #getTabsEmulated
+ * @see #setTabsEmulated
+ */
+ public void convertSpacesToTabs() {
+
+ // FIXME: This is inefficient and will yield an OutOfMemoryError if
+ // done on a large document. We should scan 1 line at a time and
+ // replace; it'll be slower but safer.
+
+ int caretPosition = getCaretPosition();
+ int tabSize = getTabSize();
+ String tabInSpaces = "";
+ for (int i=0; i<tabSize; i++)
+ tabInSpaces += " ";
+ String text = getText();
+ setText(text.replaceAll(tabInSpaces, "\t"));
+ int newDocumentLength = getDocument().getLength();
+
+ // Place the caret back in its proper position.
+ if (caretPosition<newDocumentLength)
+ setCaretPosition(caretPosition);
+ else
+ setCaretPosition(newDocumentLength-1);
+
+ }
+
+
+ /**
+ * Converts all instances of a tab into a number of spaces equivalent
+ * to a tab in this text area.
+ *
+ * @see #convertSpacesToTabs
+ * @see #getTabsEmulated
+ * @see #setTabsEmulated
+ */
+ public void convertTabsToSpaces() {
+
+ // FIXME: This is inefficient and will yield an OutOfMemoryError if
+ // done on a large document. We should scan 1 line at a time and
+ // replace; it'll be slower but safer.
+
+ int caretPosition = getCaretPosition();
+ int tabSize = getTabSize();
+ StringBuffer tabInSpaces = new StringBuffer();
+ for (int i=0; i<tabSize; i++)
+ tabInSpaces.append(' ');
+ String text = getText();
+ setText(text.replaceAll("\t", tabInSpaces.toString()));
+
+ // Put caret back at same place in document.
+ setCaretPosition(caretPosition);
+
+ }
+
+
+ /**
+ * Returns the caret event/mouse listener for <code>RTextArea</code>s.
+ *
+ * @return The caret event/mouse listener.
+ */
+ protected abstract RTAMouseListener createMouseListener();
+
+
+ /**
+ * Returns the a real UI to install on this text component. Subclasses
+ * can override this method to return an extended version of
+ * <code>RTextAreaUI</code>.
+ *
+ * @return The UI.
+ */
+ protected abstract RTextAreaUI createRTextAreaUI();
+
+
+ /**
+ * Forces the current line highlight to be repainted. This hack is
+ * necessary for those situations when the view (appearance) changes
+ * but the caret's location hasn't (and thus the current line highlight
+ * coordinates won't get changed). Examples of this are when
+ * word wrap is toggled and when syntax styles are changed in an
+ * <code>RSyntaxTextArea</code>.
+ */
+ protected void forceCurrentLineHighlightRepaint() {
+ // Check isShowing() to prevent BadLocationException
+ // in constructor if linewrap is set to true.
+ if (isShowing()) {
+ // Changing previousCaretY makes us sure to get a repaint.
+ previousCaretY = -1;
+ // Trick it into checking for the need to repaint by firing
+ // a false caret event.
+ fireCaretUpdate(mouseListener);
+ }
+ }
+
+
+ /**
+ * Returns the <code>java.awt.Color</code> used as the background color for
+ * this text area. If a <code>java.awt.Image</code> image is currently
+ * being used instead, <code>null</code> is returned.
+ *
+ * @return The current background color, or <code>null</code> if an image
+ * is currently the background.
+ */
+ public final Color getBackground() {
+ Object bg = getBackgroundObject();
+ return (bg instanceof Color) ? (Color)bg : null;
+ }
+
+ /**
+ * Returns the image currently used for the background.
+ * If the current background is currently a <code>java.awt.Color</code> and
+ * not a <code>java.awt.Image</code>, then <code>null</code> is returned.
+ *
+ * @return A <code>java.awt.Image</code> used for the background, or
+ * <code>null</code> if the background is not an image.
+ * @see #setBackgroundImage
+ */
+ public final Image getBackgroundImage() {
+ Object bg = getBackgroundObject();
+ return (bg instanceof Image) ? (Image)bg : null;
+ }
+
+
+ /**
+ * Returns the <code>Object</code> representing the background for all
+ * documents in this tabbed pane; either a <code>java.awt.Color</code> or a
+ * <code>java.lang.Image</code> containing the image used as the background
+ * for this text area.
+ *
+ * @return The <code>Object</code> used for the background.
+ * @see #setBackgroundObject(Object newBackground)
+ */
+ public final Object getBackgroundObject() {
+ if (backgroundPainter==null)
+ return null;
+ return (backgroundPainter instanceof ImageBackgroundPainterStrategy) ?
+ (Object)((ImageBackgroundPainterStrategy)backgroundPainter).
+ getMasterImage() :
+ (Object)((ColorBackgroundPainterStrategy)backgroundPainter).
+ getColor();
+ }
+
+
+ /**
+ * Gets the line number that the caret is on.
+ *
+ * @return The zero-based line number that the caret is on.
+ */
+ public final int getCaretLineNumber() {
+ try {
+ return getLineOfOffset(getCaretPosition());
+ } catch (BadLocationException ble) {
+ return 0; // Never happens
+ }
+ }
+
+
+ /**
+ * Gets the position from the beginning of the current line that the caret
+ * is on.
+ *
+ * @return The zero-based position from the beginning of the current line
+ * that the caret is on.
+ */
+ public final int getCaretOffsetFromLineStart() {
+ try {
+ int pos = getCaretPosition();
+ return pos - getLineStartOffset(getLineOfOffset(pos));
+ } catch (BadLocationException ble) {
+ return 0; // Never happens
+ }
+ }
+
+
+ /**
+ * Returns the color being used to highlight the current line. Note that
+ * if highlighting the current line is turned off, you will not be seeing
+ * this highlight.
+ *
+ * @return The color being used to highlight the current line.
+ * @see #getHighlightCurrentLine()
+ * @see #setHighlightCurrentLine(boolean)
+ * @see #setCurrentLineHighlightColor
+ */
+ public Color getCurrentLineHighlightColor() {
+ return currentLineColor;
+ }
+
+
+ /**
+ * Returns the default caret color.
+ *
+ * @return The default caret color.
+ */
+ public static final Color getDefaultCaretColor() {
+ return DEFAULT_CARET_COLOR;
+ }
+
+
+ /**
+ * Returns the "default" color for highlighting the current line. Note
+ * that this color was chosen only because it looks nice (to me) against a
+ * white background.
+ *
+ * @return The default color for highlighting the current line.
+ */
+ public static final Color getDefaultCurrentLineHighlightColor() {
+ return DEFAULT_CURRENT_LINE_HIGHLIGHT_COLOR;
+ }
+
+
+ /**
+ * Returns the default font for text areas.
+ *
+ * @return The default font.
+ */
+ public static final Font getDefaultFont() {
+
+ // Use StyleContext to get a composite font for better Asian language
+ // support; see Sun bug S282887.
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+ Font font = null;
+
+ if (isOSX()) {
+ // Snow Leopard (1.6) uses Menlo as default monospaced font,
+ // pre-Snow Leopard used Monaco.
+ font = sc.getFont("Menlo", Font.PLAIN, 12);
+ if (!"Menlo".equals(font.getFamily())) {
+ font = sc.getFont("Monaco", Font.PLAIN, 12);
+ if (!"Monaco".equals(font.getFamily())) { // Shouldn't happen
+ font = sc.getFont("Monospaced", Font.PLAIN, 13);
+ }
+ }
+ }
+ else {
+ // Consolas added in Vista, used by VS2010+.
+ font = sc.getFont("Consolas", Font.PLAIN, 13);
+ if (!"Consolas".equals(font.getFamily())) {
+ font = sc.getFont("Monospaced", Font.PLAIN, 13);
+ }
+ }
+
+ //System.out.println(font.getFamily() + ", " + font.getName());
+ return font;
+
+ }
+
+
+ /**
+ * Returns the default foreground color for text in this text area.
+ *
+ * @return The default foreground color.
+ */
+ public static final Color getDefaultForeground() {
+ return Color.BLACK;
+ }
+
+
+ /**
+ * Returns the default color for the margin line.
+ *
+ * @return The default margin line color.
+ * @see #getMarginLineColor()
+ * @see #setMarginLineColor(Color)
+ */
+ public static final Color getDefaultMarginLineColor() {
+ return DEFAULT_MARGIN_LINE_COLOR;
+ }
+
+
+ /**
+ * Returns the default margin line position.
+ *
+ * @return The default margin line position.
+ * @see #getMarginLinePosition
+ * @see #setMarginLinePosition
+ */
+ public static final int getDefaultMarginLinePosition() {
+ return DEFAULT_MARGIN_LINE_POSITION;
+ }
+
+
+ /**
+ * Returns the default tab size, in spaces.
+ *
+ * @return The default tab size.
+ */
+ public static final int getDefaultTabSize() {
+ return DEFAULT_TAB_SIZE;
+ }
+
+
+ /**
+ * Returns whether the current line highlight is faded.
+ *
+ * @return Whether the current line highlight is faded.
+ * @see #setFadeCurrentLineHighlight
+ */
+ public boolean getFadeCurrentLineHighlight() {
+ return fadeCurrentLineHighlight;
+ }
+
+
+ /**
+ * Returns whether or not the current line is highlighted.
+ *
+ * @return Whether or the current line is highlighted.
+ * @see #setHighlightCurrentLine(boolean)
+ * @see #getCurrentLineHighlightColor
+ * @see #setCurrentLineHighlightColor
+ */
+ public boolean getHighlightCurrentLine() {
+ return highlightCurrentLine;
+ }
+
+
+ /**
+ * Returns the offset of the last character of the line that the caret is
+ * on.
+ *
+ * @return The last offset of the line that the caret is currently on.
+ */
+ public final int getLineEndOffsetOfCurrentLine() {
+ try {
+ return getLineEndOffset(getCaretLineNumber());
+ } catch (BadLocationException ble) {
+ return 0; // Never happens
+ }
+ }
+
+
+ /**
+ * Returns the height of a line of text in this text area.
+ *
+ * @return The height of a line of text.
+ */
+ public int getLineHeight() {
+ return getRowHeight();
+ }
+
+
+ /**
+ * Returns the offset of the first character of the line that the caret is
+ * on.
+ *
+ * @return The first offset of the line that the caret is currently on.
+ */
+ public final int getLineStartOffsetOfCurrentLine() {
+ try {
+ return getLineStartOffset(getCaretLineNumber());
+ } catch (BadLocationException ble) {
+ return 0; // Never happens
+ }
+ }
+
+
+ /**
+ * Returns the color used to paint the margin line.
+ *
+ * @return The margin line color.
+ * @see #setMarginLineColor(Color)
+ */
+ public Color getMarginLineColor() {
+ return marginLineColor;
+ }
+
+
+ /**
+ * Returns the margin line position (in pixels) from the left-hand side of
+ * the text area.
+ *
+ * @return The margin line position.
+ * @see #getDefaultMarginLinePosition
+ * @see #setMarginLinePosition
+ */
+ public int getMarginLinePixelLocation() {
+ return marginLineX;
+ }
+
+
+ /**
+ * Returns the margin line position (which is the number of 'm' widths in
+ * the current font the margin line is over).
+ *
+ * @return The margin line position.
+ * @see #getDefaultMarginLinePosition
+ * @see #setMarginLinePosition
+ */
+ public int getMarginLinePosition() {
+ return marginSizeInChars;
+ }
+
+
+ /**
+ * Returns whether selection edges are rounded in this text area.
+ *
+ * @return Whether selection edges are rounded.
+ * @see #setRoundedSelectionEdges(boolean)
+ */
+ public boolean getRoundedSelectionEdges() {
+ return roundedSelectionEdges;
+ }
+
+
+ /**
+ * Returns whether or not tabs are emulated with spaces (i.e., "soft"
+ * tabs).
+ *
+ * @return <code>true</code> if tabs are emulated with spaces;
+ * <code>false</code> if they aren't.
+ * @see #setTabsEmulated
+ */
+ public boolean getTabsEmulated() {
+ return tabsEmulatedWithSpaces;
+ }
+
+
+ /**
+ * Initializes this text area.
+ */
+ private void init() {
+
+ // Sets the UI. Note that setUI() is overridden in RTextArea to only
+ // update the popup menu; this method must be called to set the real
+ // UI. This is done because the look and feel of an RTextArea is
+ // independent of the installed Java look and feels.
+ setRTextAreaUI(createRTextAreaUI());
+
+ // So we get notified when the component is resized.
+ enableEvents(AWTEvent.COMPONENT_EVENT_MASK|AWTEvent.KEY_EVENT_MASK);
+
+ // Defaults for various properties.
+ setHighlightCurrentLine(true);
+ setCurrentLineHighlightColor(getDefaultCurrentLineHighlightColor());
+ setMarginLineEnabled(false);
+ setMarginLineColor(getDefaultMarginLineColor());
+ setMarginLinePosition(getDefaultMarginLinePosition());
+ setBackgroundObject(Color.WHITE);
+ setWrapStyleWord(true);// We only support wrapping at word boundaries.
+ setTabSize(5);
+ setForeground(Color.BLACK);
+ setTabsEmulated(false);
+
+ // Stuff needed by the caret listener below.
+ previousCaretY = currentCaretY = getInsets().top;
+
+ // Stuff to highlight the current line.
+ mouseListener = createMouseListener();
+ // Also acts as a focus listener so we can update our shared actions
+ // (cut, copy, etc. on the popup menu).
+ addFocusListener(mouseListener);
+ addCurrentLineHighlightListeners();
+
+ }
+
+
+ /**
+ * Returns whether or not the margin line is being painted.
+ *
+ * @return Whether or not the margin line is being painted.
+ * @see #setMarginLineEnabled
+ */
+ public boolean isMarginLineEnabled() {
+ return marginLineEnabled;
+ }
+
+
+ /**
+ * Returns whether the OS we're running on is OS X.
+ *
+ * @return Whether the OS we're running on is OS X.
+ */
+ public static boolean isOSX() {
+ // Recommended at:
+ // http://developer.apple.com/mac/library/technotes/tn2002/tn2110.html
+ String osName = System.getProperty("os.name").toLowerCase();
+ return osName.startsWith("mac os x");
+ }
+
+
+ /**
+ * Paints the text area.
+ *
+ * @param g The graphics context with which to paint.
+ */
+ protected void paintComponent(Graphics g) {
+
+ //long startTime = System.currentTimeMillis();
+
+ backgroundPainter.paint(g, getVisibleRect());
+
+ // Paint the main part of the text area.
+ TextUI ui = getUI();
+ if (ui != null) {
+ // Not allowed to modify g, so make a copy.
+ Graphics scratchGraphics = g.create();
+ try {
+ ui.update(scratchGraphics, this);
+ } finally {
+ scratchGraphics.dispose();
+ }
+ }
+
+ //long endTime = System.currentTimeMillis();
+ //System.err.println(endTime-startTime);
+
+ }
+
+
+ /**
+ * Updates the current line highlight location.
+ */
+ protected void possiblyUpdateCurrentLineHighlightLocation() {
+
+ int width = getWidth();
+ int lineHeight = getLineHeight();
+ int dot = getCaretPosition();
+
+ // If we're wrapping lines we need to check the actual y-coordinate
+ // of the caret, not just the line number, since a single logical
+ // line can span multiple physical lines.
+ if (getLineWrap()) {
+ try {
+ Rectangle temp = modelToView(dot);
+ if (temp!=null) {
+ currentCaretY = temp.y;
+ }
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Should never happen.
+ }
+ }
+
+ // No line wrap - we can simply check the line number (quicker).
+ else {
+// Document doc = getDocument();
+// if (doc!=null) {
+// Element map = doc.getDefaultRootElement();
+// int caretLine = map.getElementIndex(dot);
+// Rectangle alloc = ((RTextAreaUI)getUI()).
+// getVisibleEditorRect();
+// if (alloc!=null)
+// currentCaretY = alloc.y + caretLine*lineHeight;
+// }
+// Modified for code folding requirements
+try {
+ Rectangle temp = modelToView(dot);
+ if (temp!=null) {
+ currentCaretY = temp.y;
+ }
+} catch (BadLocationException ble) {
+ ble.printStackTrace(); // Should never happen.
+}
+ }
+
+ // Repaint current line (to fill in entire highlight), and old line
+ // (to erase entire old highlight) if necessary. Always repaint
+ // current line in case selection is added or removed.
+ repaint(0,currentCaretY, width,lineHeight);
+ if (previousCaretY!=currentCaretY) {
+ repaint(0,previousCaretY, width,lineHeight);
+ }
+
+ previousCaretY = currentCaretY;
+
+ }
+
+
+ /**
+ * Overridden so we can tell when the text area is resized and update the
+ * current-line highlight, if necessary (i.e., if it is enabled and if
+ * lineWrap is enabled.
+ *
+ * @param e The component event about to be sent to all registered
+ * <code>ComponentListener</code>s.
+ */
+ protected void processComponentEvent(ComponentEvent e) {
+
+ // In line wrap mode, resizing the text area means that the caret's
+ // "line" could change - not to a different logical line, but a
+ // different physical one. So, here we force a repaint of the current
+ // line's highlight if necessary.
+ if (e.getID()==ComponentEvent.COMPONENT_RESIZED &&
+ getLineWrap()==true && getHighlightCurrentLine()) {
+ previousCaretY = -1; // So we are sure to repaint.
+ fireCaretUpdate(mouseListener);
+ }
+
+ super.processComponentEvent(e);
+
+ }
+
+
+ /**
+ * Sets the background color of this text editor. Note that this is
+ * equivalent to calling <code>setBackgroundObject(bg)</code>.
+ *
+ * NOTE: the opaque property is set to <code>true</code> when the
+ * background is set to a color (by this method). When an image is used
+ * for the background, opaque is set to false. This is because
+ * we perform better when setOpaque is true, but if we use an
+ * image for the background when opaque is true, we get on-screen
+ * garbage when the user scrolls via the arrow keys. Thus we
+ * need setOpaque to be false in that case.<p>
+ * You never have to change the opaque property yourself; it is always done
+ * for you.
+ *
+ * @param bg The color to use as the background color.
+ */
+ public void setBackground(Color bg) {
+ Object oldBG = getBackgroundObject();
+ if (oldBG instanceof Color) { // Just change color of strategy.
+ ((ColorBackgroundPainterStrategy)backgroundPainter).
+ setColor(bg);
+ }
+ else { // Was an image painter...
+ backgroundPainter = new ColorBackgroundPainterStrategy(bg);
+ }
+ setOpaque(true);
+ firePropertyChange("background", oldBG, bg);
+ repaint();
+ }
+
+
+ /**
+ * Sets this image as the background image. This method fires a
+ * property change event of type {@link #BACKGROUND_IMAGE_PROPERTY}.<p>
+ *
+ * NOTE: the opaque property is set to <code>true</code> when the
+ * background is set to a color. When an image is used for the
+ * background (by this method), opaque is set to false. This is because
+ * we perform better when setOpaque is true, but if we use an
+ * image for the background when opaque is true, we get on-screen
+ * garbage when the user scrolls via the arrow keys. Thus we
+ * need setOpaque to be false in that case.<p>
+ * You never have to change the opaque property yourself; it is always done
+ * for you.
+ *
+ * @param image The image to use as this text area's background.
+ * @see #getBackgroundImage
+ */
+ public void setBackgroundImage(Image image) {
+ Object oldBG = getBackgroundObject();
+ if (oldBG instanceof Image) { // Just change image being displayed.
+ ((BufferedImageBackgroundPainterStrategy)backgroundPainter).
+ setImage(image);
+ }
+ else { // Was a color strategy...
+ BufferedImageBackgroundPainterStrategy strategy =
+ new BufferedImageBackgroundPainterStrategy(this);
+ strategy.setImage(image);
+ backgroundPainter = strategy;
+ }
+ setOpaque(false);
+ firePropertyChange(BACKGROUND_IMAGE_PROPERTY, oldBG, image);
+ repaint();
+ }
+
+
+ /**
+ * Makes the background into this <code>Object</code>.
+ *
+ * @param newBackground The <code>java.awt.Color</code> or
+ * <code>java.awt.Image</code> object. If <code>newBackground</code>
+ * is not either of these, the background is set to plain white.
+ */
+ public void setBackgroundObject(Object newBackground) {
+ if (newBackground instanceof Color) {
+ setBackground((Color)newBackground);
+ }
+ else if (newBackground instanceof Image) {
+ setBackgroundImage((Image)newBackground);
+ }
+ else {
+ setBackground(Color.WHITE);
+ }
+
+ }
+
+
+ /*
+ * TODO: Figure out why RTextArea doesn't work with RTL (e.g. Arabic)
+ * and fix it!
+ */
+// public void setComponentOrientation(ComponentOrientation o) {
+// if (!o.isLeftToRight()) {
+// o = ComponentOrientation.LEFT_TO_RIGHT;
+// }
+// super.setComponentOrientation(o);
+// }
+
+
+ /**
+ * Sets the color to use to highlight the current line. Note that if
+ * highlighting the current line is turned off, you will not be able to
+ * see this highlight. This method fires a property change of type
+ * {@link #CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY}.
+ *
+ * @param color The color to use to highlight the current line.
+ * @throws NullPointerException if <code>color</code> is <code>null</code>.
+ * @see #getHighlightCurrentLine()
+ * @see #setHighlightCurrentLine(boolean)
+ * @see #getCurrentLineHighlightColor
+ */
+ public void setCurrentLineHighlightColor(Color color) {
+ if (color==null)
+ throw new NullPointerException();
+ if (!color.equals(currentLineColor)) {
+ Color old = currentLineColor;
+ currentLineColor = color;
+ firePropertyChange(CURRENT_LINE_HIGHLIGHT_COLOR_PROPERTY,
+ old, color);
+ }
+ }
+
+
+ /**
+ * Sets whether the current line highlight should have a "fade" effect.
+ * This method fires a property change event of type
+ * <code>CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY</code>.
+ *
+ * @param fade Whether the fade effect should be enabled.
+ * @see #getFadeCurrentLineHighlight
+ */
+ public void setFadeCurrentLineHighlight(boolean fade) {
+ if (fade!=fadeCurrentLineHighlight) {
+ fadeCurrentLineHighlight = fade;
+ if (getHighlightCurrentLine())
+ forceCurrentLineHighlightRepaint();
+ firePropertyChange(CURRENT_LINE_HIGHLIGHT_FADE_PROPERTY,
+ !fade, fade);
+ }
+ }
+
+
+ /**
+ * Sets the font for this text area. This is overridden only so that we
+ * can update the size of the "current line highlight" and the location of
+ * the "margin line," if necessary.
+ *
+ * @param font The font to use for this text component.
+ */
+ public void setFont(Font font) {
+ super.setFont(font);
+ updateMarginLineX();
+ if (highlightCurrentLine)
+ possiblyUpdateCurrentLineHighlightLocation();
+ }
+
+
+ /**
+ * Sets whether or not the current line is highlighted. This method
+ * fires a property change of type {@link #HIGHLIGHT_CURRENT_LINE_PROPERTY}.
+ *
+ * @param highlight Whether or not to highlight the current line.
+ * @see #getHighlightCurrentLine()
+ * @see #getCurrentLineHighlightColor
+ * @see #setCurrentLineHighlightColor
+ */
+ public void setHighlightCurrentLine(boolean highlight) {
+ if (highlight!=highlightCurrentLine) {
+ highlightCurrentLine = highlight;
+ firePropertyChange(HIGHLIGHT_CURRENT_LINE_PROPERTY,
+ !highlight, highlight);
+ repaint(); // Repaint entire width of line.
+ }
+ }
+
+
+ /**
+ * Sets whether or not word wrap is enabled. This is overridden so that
+ * the "current line highlight" gets updated if it needs to be.
+ *
+ * @param wrap Whether or not word wrap should be enabled.
+ */
+ public void setLineWrap(boolean wrap) {
+ super.setLineWrap(wrap);
+ forceCurrentLineHighlightRepaint();
+ }
+
+
+ /**
+ * Sets the color used to paint the margin line.
+ *
+ * @param color The new margin line color.
+ * @see #getDefaultMarginLineColor()
+ * @see #getMarginLineColor()
+ */
+ public void setMarginLineColor(Color color) {
+ marginLineColor = color;
+ if (marginLineEnabled) {
+ Rectangle visibleRect = getVisibleRect();
+ repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+ }
+ }
+
+
+ /**
+ * Enables or disables the margin line.
+ *
+ * @param enabled Whether or not the margin line should be enabled.
+ * @see #isMarginLineEnabled
+ */
+ public void setMarginLineEnabled(boolean enabled) {
+ if (enabled!=marginLineEnabled) {
+ marginLineEnabled = enabled;
+ if (marginLineEnabled) {
+ Rectangle visibleRect = getVisibleRect();
+ repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+ }
+ }
+ }
+
+
+ /**
+ * Sets the number of 'm' widths the margin line is over.
+ *
+ * @param size The margin size.
+ * #see #getDefaultMarginLinePosition
+ * @see #getMarginLinePosition
+ */
+ public void setMarginLinePosition(int size) {
+ marginSizeInChars = size;
+ if (marginLineEnabled) {
+ Rectangle visibleRect = getVisibleRect();
+ repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+ updateMarginLineX();
+ repaint(marginLineX,visibleRect.y, 1,visibleRect.height);
+ }
+ }
+
+
+ /**
+ * Sets whether the edges of selections are rounded in this text area.
+ * This method fires a property change of type
+ * {@link #ROUNDED_SELECTION_PROPERTY}.
+ *
+ * @param rounded Whether selection edges should be rounded.
+ * @see #getRoundedSelectionEdges()
+ */
+ public void setRoundedSelectionEdges(boolean rounded) {
+ if (roundedSelectionEdges!=rounded) {
+ roundedSelectionEdges = rounded;
+ Caret c = getCaret();
+ if (c instanceof ConfigurableCaret) {
+ ((ConfigurableCaret)c).setRoundedSelectionEdges(rounded);
+ if (c.getDot()!=c.getMark()) { // e.g., there's is a selection
+ repaint();
+ }
+ }
+ firePropertyChange(ROUNDED_SELECTION_PROPERTY, !rounded,
+ rounded);
+ }
+ }
+
+
+ /**
+ * Sets the UI for this <code>RTextArea</code>. Note that, for instances
+ * of <code>RTextArea</code>, <code>setUI</code> only updates the popup
+ * menu; this is because <code>RTextArea</code>s' look and feels are
+ * independent of the Java Look and Feel. This method is here so
+ * subclasses can set a UI (subclass of <code>RTextAreaUI</code>) if they
+ * have to.
+ *
+ * @param ui The new UI.
+ * @see #setUI
+ */
+ protected void setRTextAreaUI(RTextAreaUI ui) {
+
+ super.setUI(ui);
+
+ // Workaround as setUI makes the text area opaque, even if we don't
+ // want it to be.
+ setOpaque(getBackgroundObject() instanceof Color);
+
+ }
+
+
+ /**
+ * Changes whether or not tabs should be emulated with spaces (i.e., soft
+ * tabs). Note that this affects all tabs inserted AFTER this call, not
+ * tabs already in the document. For that, see
+ * {@link #convertTabsToSpaces} and {@link #convertSpacesToTabs}.
+ *
+ * @param areEmulated Whether or not tabs should be emulated with spaces.
+ * @see #convertSpacesToTabs
+ * @see #convertTabsToSpaces
+ * @see #getTabsEmulated
+ */
+ public void setTabsEmulated(boolean areEmulated) {
+ tabsEmulatedWithSpaces = areEmulated;
+ }
+
+
+ /**
+ * Workaround, since in JDK1.4 it appears that <code>setTabSize()</code>
+ * doesn't work for a <code>JTextArea</code> unless you use the constructor
+ * specifying the number of rows and columns...<p>
+ * Sets the number of characters to expand tabs to. This will be multiplied
+ * by the maximum advance for variable width fonts. A PropertyChange event
+ * ("tabSize") is fired when the tab size changes.
+ *
+ * @param size Number of characters to expand to.
+ */
+ public void setTabSize(int size) {
+ super.setTabSize(size);
+ boolean b = getLineWrap();
+ setLineWrap(!b);
+ setLineWrap(b);
+ }
+
+
+ /**
+ * This is here so subclasses such as <code>RSyntaxTextArea</code> that
+ * have multiple fonts can define exactly what it means, for example, for
+ * the margin line to be "80 characters" over.
+ */
+ protected void updateMarginLineX() {
+ marginLineX = getFontMetrics(getFont()).charWidth('m') *
+ marginSizeInChars;
+ }
+
+
+ /**
+ * Returns the y-coordinate of the specified line.
+ *
+ * @param line The line number.
+ * @return The y-coordinate of the top of the line, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>line</code> isn't a valid line
+ * number for this document.
+ */
+ public int yForLine(int line) throws BadLocationException {
+ return ((RTextAreaUI)getUI()).yForLine(line);
+ }
+
+
+ /**
+ * Returns the y-coordinate of the line containing an offset.
+ *
+ * @param offs The offset info the document.
+ * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>offs</code> isn't a valid offset
+ * into the document.
+ */
+ public int yForLineContaining(int offs) throws BadLocationException {
+ return ((RTextAreaUI)getUI()).yForLineContaining(offs);
+ }
+
+
+ protected class RTAMouseListener extends CaretEvent implements
+ MouseListener, MouseMotionListener, FocusListener {
+
+ RTAMouseListener(RTextAreaBase textArea) {
+ super(textArea);
+ }
+
+ public void focusGained(FocusEvent e) {}
+ public void focusLost(FocusEvent e) {}
+ public void mouseDragged(MouseEvent e) {}
+ public void mouseMoved(MouseEvent e) {}
+ public void mouseClicked(MouseEvent e) {}
+ public void mousePressed(MouseEvent e) {}
+ public void mouseReleased(MouseEvent e) {}
+ public void mouseEntered(MouseEvent e) {}
+ public void mouseExited(MouseEvent e) {}
+
+ public int getDot() {
+ return dot;
+ }
+
+ public int getMark() {
+ return mark;
+ }
+
+ protected int dot;
+ protected int mark;
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java b/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java
new file mode 100644
index 0000000..526fcc5
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaEditorKit.java
@@ -0,0 +1,2582 @@
+/*
+ * 08/13/2004
+ *
+ * RTextAreaEditorKit.java - The editor kit used by RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.text.BreakIterator;
+import java.text.DateFormat;
+import java.util.Date;
+import javax.swing.*;
+import javax.swing.text.*;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
+
+
+/**
+ * An extension of <code>DefaultEditorKit</code> that adds functionality found
+ * in <code>RTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ */
+// FIXME: Replace Utilities calls with custom versions (in RSyntaxUtilities) to
+// cut down on all of the modelToViews, as each call causes
+// a getTokenList => expensive!
+public class RTextAreaEditorKit extends DefaultEditorKit {
+
+ /**
+ * The name of the action that begins recording a macro.
+ */
+ public static final String rtaBeginRecordingMacroAction = "RTA.BeginRecordingMacroAction";
+
+ /**
+ * The name of the action to decrease the font size.
+ */
+ public static final String rtaDecreaseFontSizeAction = "RTA.DecreaseFontSizeAction";
+
+ /**
+ * The name of the action that deletes the current line.
+ */
+ public static final String rtaDeleteLineAction = "RTA.DeleteLineAction";
+
+ /**
+ * The name of the action to delete the word before the caret.
+ */
+ public static final String rtaDeletePrevWordAction = "RTA.DeletePrevWordAction";
+
+ /**
+ * The name of the action taken to delete the remainder of the line (from
+ * the caret position to the end of the line).
+ */
+ public static final String rtaDeleteRestOfLineAction = "RTA.DeleteRestOfLineAction";
+
+ /**
+ * The name of the action that completes the word at the caret position
+ * with the last word in the document that starts with the text up to the
+ * caret.
+ */
+ public static final String rtaDumbCompleteWordAction = "RTA.DumbCompleteWordAction";
+
+ /**
+ * The name of the action that ends recording a macro.
+ */
+ public static final String rtaEndRecordingMacroAction = "RTA.EndRecordingMacroAction";
+
+ /**
+ * The name of the action to increase the font size.
+ */
+ public static final String rtaIncreaseFontSizeAction = "RTA.IncreaseFontSizeAction";
+
+ /**
+ * The name of the action that inverts the case of the current selection.
+ */
+ public static final String rtaInvertSelectionCaseAction = "RTA.InvertCaseAction";
+
+ /**
+ * The name of the action to join two lines.
+ */
+ public static final String rtaJoinLinesAction = "RTA.JoinLinesAction";
+
+ /**
+ * Action to move a line down.
+ */
+ public static final String rtaLineDownAction = "RTA.LineDownAction";
+
+ /**
+ * Action to move a line up.
+ */
+ public static final String rtaLineUpAction = "RTA.LineUpAction";
+
+ /**
+ * The name of the action to make the current selection lower-case.
+ */
+ public static final String rtaLowerSelectionCaseAction = "RTA.LowerCaseAction";
+
+ /**
+ * Action to select the next occurrence of the selected text.
+ */
+ public static final String rtaNextOccurrenceAction = "RTA.NextOccurrenceAction";
+
+ /**
+ * Action to select the previous occurrence of the selected text.
+ */
+ public static final String rtaPrevOccurrenceAction = "RTA.PrevOccurrenceAction";
+
+ /**
+ * Action to jump to the next bookmark.
+ */
+ public static final String rtaNextBookmarkAction = "RTA.NextBookmarkAction";
+
+ /**
+ * Action to jump to the previous bookmark.
+ */
+ public static final String rtaPrevBookmarkAction = "RTA.PrevBookmarkAction";
+
+ /**
+ * The name of the action that "plays back" the last macro.
+ */
+ public static final String rtaPlaybackLastMacroAction = "RTA.PlaybackLastMacroAction";
+
+ /**
+ * The name of the action for "redoing" the last action undone.
+ */
+ public static final String rtaRedoAction = "RTA.RedoAction";
+
+ /**
+ * The name of the action to scroll the text area down one line
+ * without changing the caret's position.
+ */
+ public static final String rtaScrollDownAction = "RTA.ScrollDownAction";
+
+ /**
+ * The name of the action to scroll the text area up one line
+ * without changing the caret's position.
+ */
+ public static final String rtaScrollUpAction = "RTA.ScrollUpAction";
+
+ /**
+ * The name of the action for "paging up" with the selection.
+ */
+ public static final String rtaSelectionPageUpAction = "RTA.SelectionPageUpAction";
+
+ /**
+ * The name of the action for "paging down" with the selection.
+ */
+ public static final String rtaSelectionPageDownAction = "RTA.SelectionPageDownAction";
+
+ /**
+ * The name of the action for "paging left" with the selection.
+ */
+ public static final String rtaSelectionPageLeftAction = "RTA.SelectionPageLeftAction";
+
+ /**
+ * The name of the action for "paging right" with the selection.
+ */
+ public static final String rtaSelectionPageRightAction = "RTA.SelectionPageRightAction";
+
+ /**
+ * The name of the action for inserting a time/date stamp.
+ */
+ public static final String rtaTimeDateAction = "RTA.TimeDateAction";
+
+ /**
+ * Toggles whether the current line has a bookmark, if this text area
+ * is in an {@link RTextScrollPane}.
+ */
+ public static final String rtaToggleBookmarkAction = "RTA.ToggleBookmarkAction";
+
+ /**
+ * The name of the action taken when the user hits the Insert key (thus
+ * toggling between insert and overwrite modes).
+ */
+ public static final String rtaToggleTextModeAction = "RTA.ToggleTextModeAction";
+
+ /**
+ * The name of the action for "undoing" the last action done.
+ */
+ public static final String rtaUndoAction = "RTA.UndoAction";
+
+ /**
+ * The name of the action for unselecting any selected text in the text
+ * area.
+ */
+ public static final String rtaUnselectAction = "RTA.UnselectAction";
+
+ /**
+ * The name of the action for making the current selection upper-case.
+ */
+ public static final String rtaUpperSelectionCaseAction = "RTA.UpperCaseAction";
+
+ /**
+ * The actions that <code>RTextAreaEditorKit</code> adds to those of
+ * the default editor kit.
+ */
+ private static final RecordableTextAction[] defaultActions = {
+ new BeginAction(beginAction, false),
+ new BeginAction(selectionBeginAction, true),
+ new BeginLineAction(beginLineAction, false),
+ new BeginLineAction(selectionBeginLineAction, true),
+ new BeginRecordingMacroAction(),
+ new BeginWordAction(beginWordAction, false),
+ new BeginWordAction(selectionBeginWordAction, true),
+ new CopyAction(),
+ new CutAction(),
+ new DefaultKeyTypedAction(),
+ new DeleteLineAction(),
+ new DeleteNextCharAction(),
+ new DeletePrevCharAction(),
+ new DeletePrevWordAction(),
+ new DeleteRestOfLineAction(),
+ new DumbCompleteWordAction(),
+ new EndAction(endAction, false),
+ new EndAction(selectionEndAction, true),
+ new EndLineAction(endLineAction, false),
+ new EndLineAction(selectionEndLineAction, true),
+ new EndRecordingMacroAction(),
+ new EndWordAction(endWordAction, false),
+ new EndWordAction(endWordAction, true),
+ new InsertBreakAction(),
+ new InsertContentAction(),
+ new InsertTabAction(),
+ new InvertSelectionCaseAction(),
+ new JoinLinesAction(),
+ new LowerSelectionCaseAction(),
+ new LineMoveAction(rtaLineUpAction, -1),
+ new LineMoveAction(rtaLineDownAction, 1),
+ new NextBookmarkAction(rtaNextBookmarkAction, true),
+ new NextBookmarkAction(rtaPrevBookmarkAction, false),
+ new NextVisualPositionAction(forwardAction, false, SwingConstants.EAST),
+ new NextVisualPositionAction(backwardAction, false, SwingConstants.WEST),
+ new NextVisualPositionAction(selectionForwardAction, true, SwingConstants.EAST),
+ new NextVisualPositionAction(selectionBackwardAction, true, SwingConstants.WEST),
+ new NextVisualPositionAction(upAction, false, SwingConstants.NORTH),
+ new NextVisualPositionAction(downAction, false, SwingConstants.SOUTH),
+ new NextVisualPositionAction(selectionUpAction, true, SwingConstants.NORTH),
+ new NextVisualPositionAction(selectionDownAction, true, SwingConstants.SOUTH),
+ new NextOccurrenceAction(rtaNextOccurrenceAction),
+ new PreviousOccurrenceAction(rtaPrevOccurrenceAction),
+ new NextWordAction(nextWordAction, false),
+ new NextWordAction(selectionNextWordAction, true),
+ new PageAction(rtaSelectionPageLeftAction, true, true),
+ new PageAction(rtaSelectionPageRightAction, false, true),
+ new PasteAction(),
+ new PlaybackLastMacroAction(),
+ new PreviousWordAction(previousWordAction, false),
+ new PreviousWordAction(selectionPreviousWordAction, true),
+ new RedoAction(),
+ new ScrollAction(rtaScrollUpAction, -1),
+ new ScrollAction(rtaScrollDownAction, 1),
+ new SelectAllAction(),
+ new SelectLineAction(),
+ new SelectWordAction(),
+ new SetReadOnlyAction(),
+ new SetWritableAction(),
+ new ToggleBookmarkAction(),
+ new ToggleTextModeAction(),
+ new UndoAction(),
+ new UnselectAction(),
+ new UpperSelectionCaseAction(),
+ new VerticalPageAction(pageUpAction, -1, false),
+ new VerticalPageAction(pageDownAction, 1, false),
+ new VerticalPageAction(rtaSelectionPageUpAction, -1, true),
+ new VerticalPageAction(rtaSelectionPageDownAction, 1, true)
+ };
+
+ /**
+ * The amount of characters read at a time when reading a file.
+ */
+ private static final int READBUFFER_SIZE = 32768;
+
+
+ /**
+ * Constructor.
+ */
+ public RTextAreaEditorKit() {
+ super();
+ }
+
+
+ /**
+ * Creates an icon row header to use in the gutter for a text area.
+ *
+ * @param textArea The text area.
+ * @return The icon row header.
+ */
+ public IconRowHeader createIconRowHeader(RTextArea textArea) {
+ return new IconRowHeader(textArea);
+ }
+
+
+ /**
+ * Creates a line number list to use in the gutter for a text area.
+ *
+ * @param textArea The text area.
+ * @return The line number list.
+ */
+ public LineNumberList createLineNumberList(RTextArea textArea) {
+ return new LineNumberList(textArea);
+ }
+
+
+ /**
+ * Fetches the set of commands that can be used
+ * on a text component that is using a model and
+ * view produced by this kit.
+ *
+ * @return the command list
+ */
+ public Action[] getActions() {
+ return defaultActions;
+ }
+
+
+ /**
+ * Inserts content from the given stream, which will be
+ * treated as plain text. This method is overridden merely
+ * so we can increase the number of characters read at a time.
+ *
+ * @param in The stream to read from
+ * @param doc The destination for the insertion.
+ * @param pos The location in the document to place the
+ * content >= 0.
+ * @exception IOException on any I/O error
+ * @exception BadLocationException if pos represents an invalid
+ * location within the document.
+ */
+ public void read(Reader in, Document doc, int pos)
+ throws IOException, BadLocationException {
+
+ char[] buff = new char[READBUFFER_SIZE];
+ int nch;
+ boolean lastWasCR = false;
+ boolean isCRLF = false;
+ boolean isCR = false;
+ int last;
+ boolean wasEmpty = (doc.getLength() == 0);
+
+ // Read in a block at a time, mapping \r\n to \n, as well as single
+ // \r's to \n's. If a \r\n is encountered, \r\n will be set as the
+ // newline string for the document, if \r is encountered it will
+ // be set as the newline character, otherwise the newline property
+ // for the document will be removed.
+ while ((nch = in.read(buff, 0, buff.length)) != -1) {
+ last = 0;
+ for (int counter = 0; counter < nch; counter++) {
+ switch (buff[counter]) {
+ case '\r':
+ if (lastWasCR) {
+ isCR = true;
+ if (counter == 0) {
+ doc.insertString(pos, "\n", null);
+ pos++;
+ }
+ else {
+ buff[counter - 1] = '\n';
+ }
+ }
+ else {
+ lastWasCR = true;
+ }
+ break;
+ case '\n':
+ if (lastWasCR) {
+ if (counter > (last + 1)) {
+ doc.insertString(pos, new String(buff, last,
+ counter - last - 1), null);
+ pos += (counter - last - 1);
+ }
+ // else nothing to do, can skip \r, next write will
+ // write \n
+ lastWasCR = false;
+ last = counter;
+ isCRLF = true;
+ }
+ break;
+ default:
+ if (lastWasCR) {
+ isCR = true;
+ if (counter == 0) {
+ doc.insertString(pos, "\n", null);
+ pos++;
+ }
+ else {
+ buff[counter - 1] = '\n';
+ }
+ lastWasCR = false;
+ }
+ break;
+ } // End of switch (buff[counter]).
+ } // End of for (int counter = 0; counter < nch; counter++).
+
+ if (last < nch) {
+ if(lastWasCR) {
+ if (last < (nch - 1)) {
+ doc.insertString(pos, new String(buff, last,
+ nch - last - 1), null);
+ pos += (nch - last - 1);
+ }
+ }
+ else {
+ doc.insertString(pos, new String(buff, last,
+ nch - last), null);
+ pos += (nch - last);
+ }
+ }
+
+ } // End of while ((nch = in.read(buff, 0, buff.length)) != -1).
+
+ if (lastWasCR) {
+ doc.insertString(pos, "\n", null);
+ isCR = true;
+ }
+
+ if (wasEmpty) {
+ if (isCRLF) {
+ doc.putProperty(EndOfLineStringProperty, "\r\n");
+ }
+ else if (isCR) {
+ doc.putProperty(EndOfLineStringProperty, "\r");
+ }
+ else {
+ doc.putProperty(EndOfLineStringProperty, "\n");
+ }
+ }
+
+ }
+
+
+ /**
+ * Creates a beep.
+ */
+ public static class BeepAction extends RecordableTextAction {
+
+ public BeepAction() {
+ super(beepAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+
+ public final String getMacroID() {
+ return beepAction;
+ }
+
+ }
+
+
+ /**
+ * Moves the caret to the beginning of the document.
+ */
+ public static class BeginAction extends RecordableTextAction {
+
+ private boolean select;
+
+ public BeginAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (select)
+ textArea.moveCaretPosition(0);
+ else
+ textArea.setCaretPosition(0);
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Toggles the position of the caret between the beginning of the line,
+ * and the first non-whitespace character on the line.
+ */
+ public static class BeginLineAction extends RecordableTextAction {
+
+ private Segment currentLine = new Segment(); // For speed.
+ private boolean select;
+
+ public BeginLineAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ int newPos = 0;
+
+ try {
+
+ // Is line wrap enabled?
+ if (textArea.getLineWrap()) {
+ int offs = textArea.getCaretPosition();
+ // TODO: Replace Utilities call with custom version
+ // to cut down on all of the modelToViews, as each call
+ // causes TokenList => expensive!
+ int begOffs = Utilities.getRowStart(textArea, offs);
+ // TODO: line wrap doesn't currently toggle between
+ // the first non-whitespace char and the actual start
+ // of the line line the no-line-wrap version does.
+ newPos = begOffs;
+ }
+
+ // No line wrap - optimized for performance!
+ else {
+
+ // We use the elements instead of calling
+ // getLineOfOffset(), etc. to speed things up just a
+ // tad (i.e. micro-optimize).
+ int caretPosition = textArea.getCaretPosition();
+ Document document = textArea.getDocument();
+ Element map = document.getDefaultRootElement();
+ int currentLineNum = map.getElementIndex(caretPosition);
+ Element currentLineElement = map.getElement(currentLineNum);
+ int currentLineStart = currentLineElement.getStartOffset();
+ int currentLineEnd = currentLineElement.getEndOffset();
+ int count = currentLineEnd - currentLineStart;
+ if (count>0) { // If there are chars in the line...
+ document.getText(currentLineStart, count, currentLine);
+ int firstNonWhitespace = getFirstNonWhitespacePos();
+ firstNonWhitespace = currentLineStart +
+ (firstNonWhitespace - currentLine.offset);
+ if (caretPosition!=firstNonWhitespace) {
+ newPos = firstNonWhitespace;
+ }
+ else {
+ newPos = currentLineStart;
+ }
+ }
+ else { // Empty line (at end of the document only).
+ newPos = currentLineStart;
+ }
+
+ }
+
+ if (select) {
+ textArea.moveCaretPosition(newPos);
+ }
+ else {
+ textArea.setCaretPosition(newPos);
+ }
+ //e.consume();
+
+ } catch (BadLocationException ble) {
+ /* Shouldn't ever happen. */
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ ble.printStackTrace();
+ }
+
+ }
+
+ private final int getFirstNonWhitespacePos() {
+ int offset = currentLine.offset;
+ int end = offset + currentLine.count - 1;
+ int pos = offset;
+ char[] array = currentLine.array;
+ char currentChar = array[pos];
+ while ((currentChar=='\t' || currentChar==' ') && (++pos<end))
+ currentChar = array[pos];
+ return pos;
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action that begins recording a macro.
+ */
+ public static class BeginRecordingMacroAction extends RecordableTextAction {
+
+
+ public BeginRecordingMacroAction() {
+ super(rtaBeginRecordingMacroAction);
+ }
+
+ public BeginRecordingMacroAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RTextArea.beginRecordingMacro();
+ }
+
+ public boolean isRecordable() {
+ return false; // Never record the recording of a macro!
+ }
+
+ public final String getMacroID() {
+ return rtaBeginRecordingMacroAction;
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the beginning of the word.
+ */
+ protected static class BeginWordAction extends RecordableTextAction {
+
+ private boolean select;
+
+ protected BeginWordAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ try {
+ int offs = textArea.getCaretPosition();
+ int begOffs = getWordStart(textArea, offs);
+ if (select)
+ textArea.moveCaretPosition(begOffs);
+ else
+ textArea.setCaretPosition(begOffs);
+ } catch (BadLocationException ble) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ protected int getWordStart(RTextArea textArea, int offs)
+ throws BadLocationException {
+ return Utilities.getWordStart(textArea, offs);
+ }
+
+ }
+
+
+ /**
+ * Action for copying text.
+ */
+ public static class CopyAction extends RecordableTextAction {
+
+
+ public CopyAction() {
+ super(DefaultEditorKit.copyAction);
+ }
+
+ public CopyAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.copy();
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.copyAction;
+ }
+
+ }
+
+
+ /**
+ * Action for cutting text.
+ */
+ public static class CutAction extends RecordableTextAction {
+
+ public CutAction() {
+ super(DefaultEditorKit.cutAction);
+ }
+
+ public CutAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.cut();
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.cutAction;
+ }
+
+ }
+
+
+ /**
+ * Action for decreasing the font size.
+ */
+ public static class DecreaseFontSizeAction extends RecordableTextAction {
+
+
+ protected float decreaseAmount;
+
+ protected static final float MINIMUM_SIZE = 2.0f;
+
+ public DecreaseFontSizeAction() {
+ super(rtaDecreaseFontSizeAction);
+ initialize();
+ }
+
+ public DecreaseFontSizeAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ initialize();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ Font font = textArea.getFont();
+ float oldSize = font.getSize2D();
+ float newSize = oldSize - decreaseAmount;
+ if (newSize>=MINIMUM_SIZE) {
+ // Shrink by decreaseAmount.
+ font = font.deriveFont(newSize);
+ textArea.setFont(font);
+ }
+ else if (oldSize>MINIMUM_SIZE) {
+ // Can't shrink by full decreaseAmount, but can shrink a
+ // little bit.
+ font = font.deriveFont(MINIMUM_SIZE);
+ textArea.setFont(font);
+ }
+ else {
+ // Our font size must be at or below MINIMUM_SIZE.
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return rtaDecreaseFontSizeAction;
+ }
+
+ protected void initialize() {
+ decreaseAmount = 1.0f;
+ }
+
+ }
+
+
+ /**
+ * The action to use when no actions in the input/action map meet the key
+ * pressed. This is actually called from the keymap I believe.
+ */
+ public static class DefaultKeyTypedAction extends RecordableTextAction {
+
+ private Action delegate;
+
+ public DefaultKeyTypedAction() {
+ super(DefaultEditorKit.defaultKeyTypedAction, null, null, null,
+ null);
+ delegate = new DefaultEditorKit.DefaultKeyTypedAction();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ // DefaultKeyTypedAction *is* different across different JVM's
+ // (at least the OSX implementation must be different - Alt+Numbers
+ // inputs symbols such as '[', '{', etc., which is a *required*
+ // feature on MacBooks running with non-English input, such as
+ // German or Swedish Pro). So we can't just copy the
+ // implementation, we must delegate to it.
+ delegate.actionPerformed(e);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.defaultKeyTypedAction;
+ }
+
+ }
+
+
+ /**
+ * Deletes the current line(s).
+ */
+ public static class DeleteLineAction extends RecordableTextAction {
+
+ public DeleteLineAction() {
+ super(RTextAreaEditorKit.rtaDeleteLineAction, null, null, null,
+ null);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+
+ int selStart = textArea.getSelectionStart();
+ int selEnd = textArea.getSelectionEnd();
+
+ try {
+
+ int line1 = textArea.getLineOfOffset(selStart);
+ int startOffs = textArea.getLineStartOffset(line1);
+ int line2 = textArea.getLineOfOffset(selEnd);
+ int endOffs = textArea.getLineEndOffset(line2);
+
+ // Don't remove the last line if no actual chars are selected
+ if (line2>line1) {
+ if (selEnd==textArea.getLineStartOffset(line2)) {
+ endOffs = selEnd;
+ }
+ }
+
+ textArea.replaceRange(null, startOffs, endOffs);
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace(); // Never happens
+ }
+
+ }
+
+ public final String getMacroID() {
+ return RTextAreaEditorKit.rtaDeleteLineAction;
+ }
+
+ }
+
+
+ /**
+ * Deletes the character of content that follows the current caret
+ * position.
+ */
+ public static class DeleteNextCharAction extends RecordableTextAction {
+
+ public DeleteNextCharAction() {
+ super(DefaultEditorKit.deleteNextCharAction, null, null,
+ null, null);
+ }
+
+ public DeleteNextCharAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ boolean beep = true;
+ if ((textArea != null) && (textArea.isEditable())) {
+ try {
+ Document doc = textArea.getDocument();
+ Caret caret = textArea.getCaret();
+ int dot = caret.getDot();
+ int mark = caret.getMark();
+ if (dot != mark) {
+ doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+ beep = false;
+ }
+ else if (dot < doc.getLength()) {
+ int delChars = 1;
+ if (dot < doc.getLength() - 1) {
+ String dotChars = doc.getText(dot, 2);
+ char c0 = dotChars.charAt(0);
+ char c1 = dotChars.charAt(1);
+ if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+ c1 >= '\uDC00' && c1 <= '\uDFFF') {
+ delChars = 2;
+ }
+ }
+ doc.remove(dot, delChars);
+ beep = false;
+ }
+ } catch (BadLocationException bl) {
+ }
+ }
+
+ if (beep)
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+ textArea.requestFocusInWindow();
+
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.deleteNextCharAction;
+ }
+
+ }
+
+
+ /**
+ * Deletes the character of content that precedes the current caret
+ * position.
+ */
+ public static class DeletePrevCharAction extends RecordableTextAction {
+
+ public DeletePrevCharAction() {
+ super(deletePrevCharAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ boolean beep = true;
+ if ((textArea != null) && (textArea.isEditable())) {
+ try {
+ Document doc = textArea.getDocument();
+ Caret caret = textArea.getCaret();
+ int dot = caret.getDot();
+ int mark = caret.getMark();
+ if (dot != mark) {
+ doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
+ beep = false;
+ }
+ else if (dot > 0) {
+ int delChars = 1;
+ if (dot > 1) {
+ String dotChars = doc.getText(dot - 2, 2);
+ char c0 = dotChars.charAt(0);
+ char c1 = dotChars.charAt(1);
+ if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
+ c1 >= '\uDC00' && c1 <= '\uDFFF') {
+ delChars = 2;
+ }
+ }
+ doc.remove(dot - delChars, delChars);
+ beep = false;
+ }
+ } catch (BadLocationException bl) {
+ }
+ }
+
+ if (beep)
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.deletePrevCharAction;
+ }
+
+ }
+
+
+ /**
+ * Action that deletes the previous word in the text area.
+ */
+ public static class DeletePrevWordAction extends RecordableTextAction {
+
+ public DeletePrevWordAction() {
+ super(rtaDeletePrevWordAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ try {
+ int end = textArea.getSelectionStart();
+ int start = getPreviousWordStart(textArea, end);
+ if (end>start) {
+ textArea.getDocument().remove(start, end-start);
+ }
+ } catch (BadLocationException ex) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+
+ public String getMacroID() {
+ return rtaDeletePrevWordAction;
+ }
+
+ /**
+ * Returns the starting offset to delete. Exists so subclasses can
+ * override.
+ */
+ protected int getPreviousWordStart(RTextArea textArea, int end)
+ throws BadLocationException {
+ return Utilities.getPreviousWord(textArea, end);
+ }
+
+ }
+
+
+ /**
+ * Action that deletes all text from the caret position to the end of the
+ * caret's line.
+ */
+ public static class DeleteRestOfLineAction extends RecordableTextAction {
+
+
+ public DeleteRestOfLineAction() {
+ super(rtaDeleteRestOfLineAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ try {
+
+ // We use the elements instead of calling getLineOfOffset(),
+ // etc. to speed things up just a tad (i.e. micro-optimize).
+ Document document = textArea.getDocument();
+ int caretPosition = textArea.getCaretPosition();
+ Element map = document.getDefaultRootElement();
+ int currentLineNum = map.getElementIndex(caretPosition);
+ Element currentLineElement = map.getElement(currentLineNum);
+ // Always take -1 as we don't want to remove the newline.
+ int currentLineEnd = currentLineElement.getEndOffset()-1;
+ if (caretPosition<currentLineEnd) {
+ document.remove(caretPosition,
+ currentLineEnd-caretPosition);
+ }
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ }
+
+ }
+
+ public final String getMacroID() {
+ return rtaDeleteRestOfLineAction;
+ }
+
+ }
+
+
+ /**
+ * Finds the most recent word in the document that matches the "word" up
+ * to the current caret position, and auto-completes the rest. Repeatedly
+ * calling this action at the same location in the document goes one
+ * match back each time it is called.
+ */
+ public static class DumbCompleteWordAction extends RecordableTextAction {
+
+ private int lastWordStart;
+ private int lastDot;
+ private int searchOffs;
+ private String lastPrefix;
+
+ public DumbCompleteWordAction() {
+ super(rtaDumbCompleteWordAction);
+ lastWordStart = searchOffs = lastDot = -1;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ return;
+ }
+
+ try {
+
+ int dot = textArea.getCaretPosition();
+ if (dot == 0) {
+ return;
+ }
+
+ int curWordStart = Utilities.getWordStart(textArea, dot - 1);
+
+ if (lastWordStart!=curWordStart || dot!=lastDot) {
+ lastPrefix = textArea.getText(curWordStart,dot-curWordStart);
+ // Utilities.getWordStart() treats spans of whitespace and
+ // single non-letter chars as "words."
+ if (lastPrefix.length()==0 ||
+ !Character.isLetter(lastPrefix.charAt(lastPrefix.length()-1))) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ lastWordStart = dot - lastPrefix.length();
+ searchOffs = lastWordStart;
+ }
+
+ while (searchOffs > 0) {
+ int wordStart = 0;
+ try {
+ wordStart = Utilities.getPreviousWord(textArea,
+ searchOffs);
+ } catch (BadLocationException ble) {
+ // No more words. Sometimes happens for example if the
+ // document starts off with whitespace - then searchOffs
+ // is > 0 but there are no more words
+ wordStart = BreakIterator.DONE;
+ }
+ if (wordStart==BreakIterator.DONE) {
+ UIManager.getLookAndFeel().provideErrorFeedback(
+ textArea);
+ break;
+ }
+ int end = Utilities.getWordEnd(textArea, wordStart);
+ String word = textArea.getText(wordStart, end - wordStart);
+ searchOffs = wordStart;
+ if (word.startsWith(lastPrefix)) {
+ textArea.replaceRange(word, lastWordStart, dot);
+ lastDot = textArea.getCaretPosition(); // Maybe shifted
+ break;
+ }
+ }
+
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ }
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Moves the caret to the end of the document.
+ */
+ public static class EndAction extends RecordableTextAction {
+
+ private boolean select;
+
+ public EndAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ int dot = getVisibleEnd(textArea);
+ if (select)
+ textArea.moveCaretPosition(dot);
+ else
+ textArea.setCaretPosition(dot);
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ protected int getVisibleEnd(RTextArea textArea) {
+ return textArea.getDocument().getLength();
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the end of the line.
+ */
+ public static class EndLineAction extends RecordableTextAction {
+
+ private boolean select;
+
+ public EndLineAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ int offs = textArea.getCaretPosition();
+ int endOffs = 0;
+ try {
+ if (textArea.getLineWrap()) {
+ // Must check per character, since one logical line may be
+ // many physical lines.
+ // FIXME: Replace Utilities call with custom version to
+ // cut down on all of the modelToViews, as each call causes
+ // a getTokenList => expensive!
+ endOffs = Utilities.getRowEnd(textArea, offs);
+ }
+ else {
+ Element root = textArea.getDocument().getDefaultRootElement();
+ int line = root.getElementIndex(offs);
+ endOffs = root.getElement(line).getEndOffset() - 1;
+ }
+ if (select) {
+ textArea.moveCaretPosition(endOffs);
+ }
+ else {
+ textArea.setCaretPosition(endOffs);
+ }
+ } catch (Exception ex) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action that ends recording a macro.
+ */
+ public static class EndRecordingMacroAction extends RecordableTextAction {
+
+
+ public EndRecordingMacroAction() {
+ super(rtaEndRecordingMacroAction);
+ }
+
+ public EndRecordingMacroAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ RTextArea.endRecordingMacro();
+ }
+
+ public final String getMacroID() {
+ return rtaEndRecordingMacroAction;
+ }
+
+ public boolean isRecordable() {
+ return false; // Never record the recording of a macro!
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the end of the word.
+ */
+ protected static class EndWordAction extends RecordableTextAction {
+
+ private boolean select;
+
+ protected EndWordAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ try {
+ int offs = textArea.getCaretPosition();
+ int endOffs = getWordEnd(textArea, offs);
+ if (select)
+ textArea.moveCaretPosition(endOffs);
+ else
+ textArea.setCaretPosition(endOffs);
+ } catch (BadLocationException ble) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ protected int getWordEnd(RTextArea textArea, int offs)
+ throws BadLocationException {
+ return Utilities.getWordEnd(textArea, offs);
+ }
+
+ }
+
+
+ /**
+ * Action for increasing the font size.
+ */
+ public static class IncreaseFontSizeAction extends RecordableTextAction {
+
+
+ protected float increaseAmount;
+
+ protected static final float MAXIMUM_SIZE = 40.0f;
+
+ public IncreaseFontSizeAction() {
+ super(rtaIncreaseFontSizeAction);
+ initialize();
+ }
+
+ public IncreaseFontSizeAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ initialize();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ Font font = textArea.getFont();
+ float oldSize = font.getSize2D();
+ float newSize = oldSize + increaseAmount;
+ if (newSize<=MAXIMUM_SIZE) {
+ // Grow by increaseAmount.
+ font = font.deriveFont(newSize);
+ textArea.setFont(font);
+ }
+ else if (oldSize<MAXIMUM_SIZE) {
+ // Can't grow by full increaseAmount, but can grow a
+ // little bit.
+ font = font.deriveFont(MAXIMUM_SIZE);
+ textArea.setFont(font);
+ }
+ else {
+ // Our font size must be at or bigger than MAXIMUM_SIZE.
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return rtaIncreaseFontSizeAction;
+ }
+
+ protected void initialize() {
+ increaseAmount = 1.0f;
+ }
+
+ }
+
+
+ /**
+ * Action for when the user presses the Enter key.
+ */
+ public static class InsertBreakAction extends RecordableTextAction {
+
+
+ public InsertBreakAction() {
+ super(DefaultEditorKit.insertBreakAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ textArea.replaceSelection("\n");
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.insertBreakAction;
+ }
+
+ /*
+ * Overridden for Sun bug 4515750. Sun fixed this in a more complicated
+ * way, but I'm not sure why. See BasicTextUI#getActionMap() and
+ * BasicTextUI.TextActionWrapper.
+ */
+ public boolean isEnabled() {
+ JTextComponent tc = getTextComponent(null);
+ return (tc==null || tc.isEditable()) ? super.isEnabled() : false;
+ }
+
+ }
+
+
+ /**
+ * Action taken when content is to be inserted.
+ */
+ public static class InsertContentAction extends RecordableTextAction {
+
+
+ public InsertContentAction() {
+ super(DefaultEditorKit.insertContentAction, null, null, null,
+ null);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ String content = e.getActionCommand();
+ if (content != null)
+ textArea.replaceSelection(content);
+ else
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.insertContentAction;
+ }
+
+ }
+
+
+ /**
+ * Places a tab character into the document. If there is a selection, it
+ * is removed before the tab is added.
+ */
+ public static class InsertTabAction extends RecordableTextAction {
+
+
+ public InsertTabAction() {
+ super(insertTabAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ textArea.replaceSelection("\t");
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.insertTabAction;
+ }
+
+ }
+
+
+ /**
+ * Action to invert the selection's case.
+ */
+ public static class InvertSelectionCaseAction extends RecordableTextAction {
+
+
+ public InvertSelectionCaseAction() {
+ super(rtaInvertSelectionCaseAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ String selection = textArea.getSelectedText();
+ if (selection!=null) {
+ StringBuffer buffer = new StringBuffer(selection);
+ int length = buffer.length();
+ for (int i=0; i<length; i++) {
+ char c = buffer.charAt(i);
+ if (Character.isUpperCase(c))
+ buffer.setCharAt(i, Character.toLowerCase(c));
+ else if (Character.isLowerCase(c))
+ buffer.setCharAt(i, Character.toUpperCase(c));
+ }
+ textArea.replaceSelection(buffer.toString());
+ }
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action to join the current line and the following line.
+ */
+ public static class JoinLinesAction extends RecordableTextAction {
+
+ public JoinLinesAction() {
+ super(rtaJoinLinesAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ try {
+ Caret c = textArea.getCaret();
+ int caretPos = c.getDot();
+ Document doc = textArea.getDocument();
+ Element map = doc.getDefaultRootElement();
+ int lineCount = map.getElementCount();
+ int line = map.getElementIndex(caretPos);
+ if (line==lineCount-1) {
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ return;
+ }
+ Element lineElem = map.getElement(line);
+ caretPos = lineElem.getEndOffset() - 1;
+ c.setDot(caretPos); // Gets rid of any selection.
+ doc.remove(caretPos, 1); // Should be '\n'.
+ } catch (BadLocationException ble) {
+ /* Shouldn't ever happen. */
+ ble.printStackTrace();
+ }
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action that moves a line up or down.
+ */
+ public static class LineMoveAction extends RecordableTextAction {
+
+ private int moveAmt;
+
+ public LineMoveAction(String name, int moveAmt) {
+ super(name);
+ this.moveAmt = moveAmt;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ try {
+ int caret = textArea.getCaretPosition();
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int line = root.getElementIndex(caret);
+ if (moveAmt==-1 && line>0) {
+ moveLineUp(textArea, line);
+ }
+ else if (moveAmt==1 && line<root.getElementCount()-1) {
+ moveLineDown(textArea, line);
+ }
+ else {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ } catch (BadLocationException ble) {
+ // Never happens.
+ ble.printStackTrace();
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ private final void moveLineDown(RTextArea textArea, int line)
+ throws BadLocationException {
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ Element elem = root.getElement(line);
+ int start = elem.getStartOffset();
+ int end = elem.getEndOffset();
+ int caret = textArea.getCaretPosition();
+ int caretOffset = caret - start;
+ String text = doc.getText(start, end-start);
+ doc.remove(start, end-start);
+ Element elem2 = root.getElement(line); // not "line+1" - removed.
+ //int start2 = elem2.getStartOffset();
+ int end2 = elem2.getEndOffset();
+ doc.insertString(end2, text, null);
+ elem = root.getElement(line+1);
+ textArea.setCaretPosition(elem.getStartOffset()+caretOffset);
+ }
+
+ private final void moveLineUp(RTextArea textArea, int line)
+ throws BadLocationException {
+ Document doc = textArea.getDocument();
+ Element root = doc.getDefaultRootElement();
+ int lineCount = root.getElementCount();
+ Element elem = root.getElement(line);
+ int start = elem.getStartOffset();
+ int end = line==lineCount-1 ? elem.getEndOffset()-1 :
+ elem.getEndOffset();
+ int caret = textArea.getCaretPosition();
+ int caretOffset = caret - start;
+ String text = doc.getText(start, end-start);
+ if (line==lineCount-1) {
+ start--; // Remove previous line's ending \n
+ }
+ doc.remove(start, end-start);
+ Element elem2 = root.getElement(line-1);
+ int start2 = elem2.getStartOffset();
+ //int end2 = elem2.getEndOffset();
+ if (line==lineCount-1) {
+ text += '\n';
+ }
+ doc.insertString(start2, text, null);
+ //caretOffset = Math.min(start2+caretOffset, end2-1);
+ textArea.setCaretPosition(start2+caretOffset);
+ }
+
+ }
+
+
+ /**
+ * Action to make the selection lower-case.
+ */
+ public static class LowerSelectionCaseAction extends RecordableTextAction {
+
+ public LowerSelectionCaseAction() {
+ super(rtaLowerSelectionCaseAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ String selection = textArea.getSelectedText();
+ if (selection!=null)
+ textArea.replaceSelection(selection.toLowerCase());
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action that moves the caret to the next (or previous) bookmark.
+ */
+ public static class NextBookmarkAction extends RecordableTextAction {
+
+ private boolean forward;
+
+ public NextBookmarkAction(String name, boolean forward) {
+ super(name);
+ this.forward = forward;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+
+ try {
+
+ GutterIconInfo[] bookmarks = gutter.getBookmarks();
+ if (bookmarks.length==0) {
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ return;
+ }
+
+ GutterIconInfo moveTo = null;
+ int curLine = textArea.getCaretLineNumber();
+
+ if (forward) {
+ for (int i=0; i<bookmarks.length; i++) {
+ GutterIconInfo bookmark = bookmarks[i];
+ int offs = bookmark.getMarkedOffset();
+ int line = textArea.getLineOfOffset(offs);
+ if (line>curLine) {
+ moveTo = bookmark;
+ break;
+ }
+ }
+ if (moveTo==null) { // Loop back to beginning
+ moveTo = bookmarks[0];
+ }
+ }
+ else {
+ for (int i=bookmarks.length-1; i>=0; i--) {
+ GutterIconInfo bookmark = bookmarks[i];
+ int offs = bookmark.getMarkedOffset();
+ int line = textArea.getLineOfOffset(offs);
+ if (line<curLine) {
+ moveTo = bookmark;
+ break;
+ }
+ }
+ if (moveTo==null) { // Loop back to end
+ moveTo = bookmarks[bookmarks.length-1];
+ }
+ }
+
+ int offs = moveTo.getMarkedOffset();
+ if (textArea instanceof RSyntaxTextArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ if (rsta.isCodeFoldingEnabled()) {
+ rsta.getFoldManager().
+ ensureOffsetNotInClosedFold(offs);
+ }
+ }
+ int line = textArea.getLineOfOffset(offs);
+ offs = textArea.getLineStartOffset(line);
+ textArea.setCaretPosition(offs);
+
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ ble.printStackTrace();
+ }
+ }
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Selects the next occurrence of the text last selected.
+ */
+ public static class NextOccurrenceAction extends RecordableTextAction {
+
+ public NextOccurrenceAction(String name) {
+ super(name);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ String selectedText = textArea.getSelectedText();
+ if (selectedText == null || selectedText.length() == 0) {
+ selectedText = RTextArea.getSelectedOccurrenceText();
+ if (selectedText == null || selectedText.length() == 0) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ }
+ SearchContext context = new SearchContext(selectedText);
+ if (!SearchEngine.find(textArea, context)) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ RTextArea.setSelectedOccurrenceText(selectedText);
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action to move the selection and/or caret. Constructor indicates
+ * direction to use.
+ */
+ public static class NextVisualPositionAction extends RecordableTextAction {
+
+ private boolean select;
+ private int direction;
+
+ public NextVisualPositionAction(String nm, boolean select, int dir) {
+ super(nm);
+ this.select = select;
+ this.direction = dir;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ Caret caret = textArea.getCaret();
+ int dot = caret.getDot();
+
+ /*
+ * Move to the beginning/end of selection on a "non-shifted"
+ * left- or right-keypress. We shouldn't have to worry about
+ * navigation filters as, if one is being used, it let us get
+ * to that position before.
+ */
+ if (!select) {
+ switch (direction) {
+ case SwingConstants.EAST:
+ int mark = caret.getMark();
+ if (dot!=mark) {
+ caret.setDot(Math.max(dot, mark));
+ return;
+ }
+ break;
+ case SwingConstants.WEST:
+ mark = caret.getMark();
+ if (dot!=mark) {
+ caret.setDot(Math.min(dot, mark));
+ return;
+ }
+ break;
+ default:
+ }
+ }
+
+ Position.Bias[] bias = new Position.Bias[1];
+ Point magicPosition = caret.getMagicCaretPosition();
+
+ try {
+
+ if(magicPosition == null &&
+ (direction == SwingConstants.NORTH ||
+ direction == SwingConstants.SOUTH)) {
+ Rectangle r = textArea.modelToView(dot);
+ magicPosition = new Point(r.x, r.y);
+ }
+
+ NavigationFilter filter = textArea.getNavigationFilter();
+
+ if (filter != null) {
+ dot = filter.getNextVisualPositionFrom(textArea, dot,
+ Position.Bias.Forward, direction, bias);
+ }
+ else {
+ dot = textArea.getUI().getNextVisualPositionFrom(
+ textArea, dot,
+ Position.Bias.Forward, direction, bias);
+ }
+ if (select)
+ caret.moveDot(dot);
+ else
+ caret.setDot(dot);
+
+ if(magicPosition != null &&
+ (direction == SwingConstants.NORTH ||
+ direction == SwingConstants.SOUTH)) {
+ caret.setMagicCaretPosition(magicPosition);
+ }
+
+ } catch (BadLocationException ble) {
+ ble.printStackTrace();
+ }
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the next word.
+ */
+ public static class NextWordAction extends RecordableTextAction {
+
+ private boolean select;
+
+ public NextWordAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ int offs = textArea.getCaretPosition();
+ int oldOffs = offs;
+ Element curPara = Utilities.getParagraphElement(textArea, offs);
+
+ try {
+ offs = getNextWord(textArea, offs);
+ if(offs >= curPara.getEndOffset() &&
+ oldOffs != curPara.getEndOffset() - 1) {
+ // we should first move to the end of current paragraph
+ // http://bugs.sun.com/view_bug.do?bug_id=4278839
+ offs = curPara.getEndOffset() - 1;
+ }
+ } catch (BadLocationException ble) {
+ int end = textArea.getDocument().getLength();
+ if (offs != end) {
+ if(oldOffs != curPara.getEndOffset() - 1)
+ offs = curPara.getEndOffset() - 1;
+ else
+ offs = end;
+ }
+ }
+
+ if (select)
+ textArea.moveCaretPosition(offs);
+ else
+ textArea.setCaretPosition(offs);
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ protected int getNextWord(RTextArea textArea, int offs)
+ throws BadLocationException {
+ return Utilities.getNextWord(textArea, offs);
+ }
+
+ }
+
+
+ /**
+ * Pages one view to the left or right.
+ */
+ static class PageAction extends RecordableTextAction {
+
+
+ private boolean select;
+ private boolean left;
+
+ public PageAction(String name, boolean left, boolean select) {
+ super(name);
+ this.select = select;
+ this.left = left;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ int selectedIndex;
+ Rectangle visible = new Rectangle();
+ textArea.computeVisibleRect(visible);
+ if (left)
+ visible.x = Math.max(0, visible.x - visible.width);
+ else
+ visible.x += visible.width;
+
+ selectedIndex = textArea.getCaretPosition();
+ if(selectedIndex != -1) {
+ if (left) {
+ selectedIndex = textArea.viewToModel(
+ new Point(visible.x, visible.y));
+ }
+ else {
+ selectedIndex = textArea.viewToModel(
+ new Point(visible.x + visible.width - 1,
+ visible.y + visible.height - 1));
+ }
+ Document doc = textArea.getDocument();
+ if ((selectedIndex != 0) &&
+ (selectedIndex > (doc.getLength()-1))) {
+ selectedIndex = doc.getLength()-1;
+ }
+ else if(selectedIndex < 0) {
+ selectedIndex = 0;
+ }
+ if (select)
+ textArea.moveCaretPosition(selectedIndex);
+ else
+ textArea.setCaretPosition(selectedIndex);
+ }
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Action for pasting text.
+ */
+ public static class PasteAction extends RecordableTextAction {
+
+
+ public PasteAction() {
+ super(DefaultEditorKit.pasteAction);
+ }
+
+ public PasteAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.paste();
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.pasteAction;
+ }
+
+ }
+
+
+ /**
+ * "Plays back" the last macro recorded.
+ */
+ public static class PlaybackLastMacroAction extends RecordableTextAction {
+
+
+ public PlaybackLastMacroAction() {
+ super(rtaPlaybackLastMacroAction);
+ }
+
+ public PlaybackLastMacroAction(String name, Icon icon,
+ String desc, Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.playbackLastMacro();
+ }
+
+ public boolean isRecordable() {
+ return false; // Don't record macro playbacks.
+ }
+
+ public final String getMacroID() {
+ return rtaPlaybackLastMacroAction;
+ }
+
+ }
+
+
+ /**
+ * Select the previous occurrence of the text last selected.
+ */
+ public static class PreviousOccurrenceAction extends RecordableTextAction {
+
+ public PreviousOccurrenceAction(String name) {
+ super(name);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ String selectedText = textArea.getSelectedText();
+ if (selectedText == null || selectedText.length() == 0) {
+ selectedText = RTextArea.getSelectedOccurrenceText();
+ if (selectedText == null || selectedText.length() == 0) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ }
+ SearchContext context = new SearchContext(selectedText);
+ context.setSearchForward(false);
+ if (!SearchEngine.find(textArea, context)) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ }
+ RTextArea.setSelectedOccurrenceText(selectedText);
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Positions the caret at the beginning of the previous word.
+ */
+ public static class PreviousWordAction extends RecordableTextAction {
+
+ private boolean select;
+
+ public PreviousWordAction(String name, boolean select) {
+ super(name);
+ this.select = select;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ int offs = textArea.getCaretPosition();
+ boolean failed = false;
+ try {
+
+ Element curPara = Utilities.getParagraphElement(textArea, offs);
+ offs = getPreviousWord(textArea, offs);
+ if(offs < curPara.getStartOffset()) {
+ offs = Utilities.getParagraphElement(textArea, offs).
+ getEndOffset() - 1;
+ }
+
+ } catch (BadLocationException bl) {
+ if (offs != 0)
+ offs = 0;
+ else
+ failed = true;
+ }
+
+ if (!failed) {
+ if (select)
+ textArea.moveCaretPosition(offs);
+ else
+ textArea.setCaretPosition(offs);
+ }
+ else
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ protected int getPreviousWord(RTextArea textArea, int offs)
+ throws BadLocationException {
+ return Utilities.getPreviousWord(textArea, offs);
+ }
+
+ }
+
+
+ /**
+ * Re-does the last action undone.
+ */
+ public static class RedoAction extends RecordableTextAction {
+
+
+ public RedoAction() {
+ super(rtaRedoAction);
+ }
+
+ public RedoAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (textArea.isEnabled() && textArea.isEditable()) {
+ textArea.redoLastAction();
+ textArea.requestFocusInWindow();
+ }
+ }
+
+ public final String getMacroID() {
+ return rtaRedoAction;
+ }
+
+ }
+
+
+ /**
+ * Scrolls the text area one line up or down, without changing
+ * the caret position.
+ */
+ public static class ScrollAction extends RecordableTextAction {
+
+ private int delta;
+
+ public ScrollAction(String name, int delta) {
+ super(name);
+ this.delta = delta;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ Container parent = textArea.getParent();
+ if (parent instanceof JViewport) {
+ JViewport viewport = (JViewport)parent;
+ Point p = viewport.getViewPosition();
+ p.y += delta*textArea.getLineHeight();
+ if (p.y<0) {
+ p.y = 0;
+ }
+ else {
+ Rectangle viewRect = viewport.getViewRect();
+ int visibleEnd = p.y + viewRect.height;
+ if (visibleEnd>=textArea.getHeight()) {
+ p.y = textArea.getHeight() - viewRect.height;
+ }
+ }
+ viewport.setViewPosition(p);
+ }
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Selects the entire document.
+ */
+ public static class SelectAllAction extends RecordableTextAction {
+
+
+ public SelectAllAction() {
+ super(selectAllAction);
+ }
+
+ public SelectAllAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ Document doc = textArea.getDocument();
+ textArea.setCaretPosition(0);
+ textArea.moveCaretPosition(doc.getLength());
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.selectAllAction;
+ }
+
+ }
+
+
+ /**
+ * Selects the line around the caret.
+ */
+ public static class SelectLineAction extends RecordableTextAction {
+
+ private Action start;
+ private Action end;
+
+ public SelectLineAction() {
+ super(selectLineAction);
+ start = new BeginLineAction("pigdog", false);
+ end = new EndLineAction("pigdog", true);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ start.actionPerformed(e);
+ end.actionPerformed(e);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.selectLineAction;
+ }
+
+ }
+
+
+ /**
+ * Selects the word around the caret.
+ */
+ public static class SelectWordAction extends RecordableTextAction {
+
+ protected Action start;
+ protected Action end;
+
+ public SelectWordAction() {
+ super(selectWordAction);
+ createActions();
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ start.actionPerformed(e);
+ end.actionPerformed(e);
+ }
+
+ protected void createActions() {
+ start = new BeginWordAction("pigdog", false);
+ end = new EndWordAction("pigdog", true);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.selectWordAction;
+ }
+
+ }
+
+
+ /**
+ * Puts the text area into read-only mode.
+ */
+ public static class SetReadOnlyAction extends RecordableTextAction {
+
+
+ public SetReadOnlyAction() {
+ super(readOnlyAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.setEditable(false);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.readOnlyAction;
+ }
+
+ public boolean isRecordable() {
+ return false; // Why would you want to record this?
+ }
+
+ }
+
+
+ /**
+ * Puts the text area into writable (from read-only) mode.
+ */
+ public static class SetWritableAction extends RecordableTextAction {
+
+
+ public SetWritableAction() {
+ super(writableAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.setEditable(true);
+ }
+
+ public final String getMacroID() {
+ return DefaultEditorKit.writableAction;
+ }
+
+ public boolean isRecordable() {
+ return false; // Why would you want to record this?
+ }
+
+ }
+
+
+ /**
+ * The action for inserting a time/date stamp.
+ */
+ public static class TimeDateAction extends RecordableTextAction {
+
+
+ public TimeDateAction() {
+ super(rtaTimeDateAction);
+ }
+
+ public TimeDateAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ Date today = new Date();
+ DateFormat timeDateStamp = DateFormat.getDateTimeInstance();
+ String dateString = timeDateStamp.format(today);
+ textArea.replaceSelection(dateString);
+ }
+
+ public final String getMacroID() {
+ return rtaTimeDateAction;
+ }
+
+ }
+
+
+ /**
+ * Toggles whether the current line has a bookmark.
+ */
+ public static class ToggleBookmarkAction extends RecordableTextAction {
+
+ public ToggleBookmarkAction() {
+ super(rtaToggleBookmarkAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ Gutter gutter = RSyntaxUtilities.getGutter(textArea);
+ if (gutter!=null) {
+ int line = textArea.getCaretLineNumber();
+ try {
+ gutter.toggleBookmark(line);
+ } catch (BadLocationException ble) { // Never happens
+ UIManager.getLookAndFeel().
+ provideErrorFeedback(textArea);
+ ble.printStackTrace();
+ }
+ }
+ }
+
+ public final String getMacroID() {
+ return rtaToggleBookmarkAction;
+ }
+
+ }
+
+
+ /**
+ * The action for the insert key toggling insert/overwrite modes.
+ */
+ public static class ToggleTextModeAction extends RecordableTextAction {
+
+ public ToggleTextModeAction() {
+ super(rtaToggleTextModeAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ int textMode = textArea.getTextMode();
+ if (textMode==RTextArea.INSERT_MODE)
+ textArea.setTextMode(RTextArea.OVERWRITE_MODE);
+ else
+ textArea.setTextMode(RTextArea.INSERT_MODE);
+ }
+
+ public final String getMacroID() {
+ return rtaToggleTextModeAction;
+ }
+
+ }
+
+
+ /**
+ * Undoes the last action done.
+ */
+ public static class UndoAction extends RecordableTextAction {
+
+ public UndoAction() {
+ super(rtaUndoAction);
+ }
+
+ public UndoAction(String name, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(name, icon, desc, mnemonic, accelerator);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (textArea.isEnabled() && textArea.isEditable()) {
+ textArea.undoLastAction();
+ textArea.requestFocusInWindow();
+ }
+ }
+
+ public final String getMacroID() {
+ return rtaUndoAction;
+ }
+
+ }
+
+
+ /**
+ * Removes the selection, if any.
+ */
+ public static class UnselectAction extends RecordableTextAction {
+
+
+ public UnselectAction() {
+ super(rtaUnselectAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ textArea.setCaretPosition(textArea.getCaretPosition());
+ }
+
+ public final String getMacroID() {
+ return rtaUnselectAction;
+ }
+
+ }
+
+
+ /**
+ * Action to make the selection upper-case.
+ */
+ public static class UpperSelectionCaseAction extends RecordableTextAction {
+
+
+ public UpperSelectionCaseAction() {
+ super(rtaUpperSelectionCaseAction);
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+ if (!textArea.isEditable() || !textArea.isEnabled()) {
+ UIManager.getLookAndFeel().provideErrorFeedback(textArea);
+ return;
+ }
+ String selection = textArea.getSelectedText();
+ if (selection!=null)
+ textArea.replaceSelection(selection.toUpperCase());
+ textArea.requestFocusInWindow();
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+ /**
+ * Scrolls up/down vertically. The select version of this action extends
+ * the selection, instead of simply moving the caret.
+ */
+ public static class VerticalPageAction extends RecordableTextAction {
+
+ private boolean select;
+ private int direction;
+
+ public VerticalPageAction(String name, int direction, boolean select) {
+ super(name);
+ this.select = select;
+ this.direction = direction;
+ }
+
+ public void actionPerformedImpl(ActionEvent e, RTextArea textArea) {
+
+ Rectangle visible = textArea.getVisibleRect();
+ Rectangle newVis = new Rectangle(visible);
+ int selectedIndex = textArea.getCaretPosition();
+ int scrollAmount = textArea.getScrollableBlockIncrement(
+ visible, SwingConstants.VERTICAL, direction);
+ int initialY = visible.y;
+ Caret caret = textArea.getCaret();
+ Point magicPosition = caret.getMagicCaretPosition();
+ int yOffset;
+
+ if (selectedIndex!=-1) {
+
+ try {
+
+ Rectangle dotBounds = textArea.modelToView(selectedIndex);
+ int x = (magicPosition != null) ? magicPosition.x :
+ dotBounds.x;
+ int h = dotBounds.height;
+ yOffset = direction *
+ ((int)Math.ceil(scrollAmount/(double)h)-1)*h;
+ newVis.y = constrainY(textArea, initialY+yOffset, yOffset, visible.height);
+ int newIndex;
+
+ if (visible.contains(dotBounds.x, dotBounds.y)) {
+ // Dot is currently visible, base the new
+ // location off the old, or
+ newIndex = textArea.viewToModel(
+ new Point(x, constrainY(textArea,
+ dotBounds.y + yOffset, 0, 0)));
+ }
+ else {
+ // Dot isn't visible, choose the top or the bottom
+ // for the new location.
+ if (direction == -1) {
+ newIndex = textArea.viewToModel(new Point(
+ x, newVis.y));
+ }
+ else {
+ newIndex = textArea.viewToModel(new Point(
+ x, newVis.y + visible.height));
+ }
+ }
+ newIndex = constrainOffset(textArea, newIndex);
+ if (newIndex != selectedIndex) {
+ // Make sure the new visible location contains
+ // the location of dot, otherwise Caret will
+ // cause an additional scroll.
+ adjustScrollIfNecessary(textArea, newVis, initialY,
+ newIndex);
+ if (select)
+ textArea.moveCaretPosition(newIndex);
+ else
+ textArea.setCaretPosition(newIndex);
+ }
+
+ } catch (BadLocationException ble) { }
+
+ } // End of if (selectedIndex!=-1).
+
+ else {
+ yOffset = direction * scrollAmount;
+ newVis.y = constrainY(textArea, initialY + yOffset, yOffset, visible.height);
+ }
+
+ if (magicPosition != null)
+ caret.setMagicCaretPosition(magicPosition);
+
+ textArea.scrollRectToVisible(newVis);
+ }
+
+ private int constrainY(JTextComponent textArea, int y, int vis, int screenHeight) {
+ if (y < 0)
+ y = 0;
+ else if (y + vis > textArea.getHeight()) {
+ //y = Math.max(0, textArea.getHeight() - vis);
+ y = Math.max(0, textArea.getHeight()-screenHeight);
+ }
+ return y;
+ }
+
+ private int constrainOffset(JTextComponent text, int offset) {
+ Document doc = text.getDocument();
+ if ((offset != 0) && (offset > doc.getLength()))
+ offset = doc.getLength();
+ if (offset < 0)
+ offset = 0;
+ return offset;
+ }
+
+ private void adjustScrollIfNecessary(JTextComponent text,
+ Rectangle visible, int initialY,
+ int index) {
+ try {
+ Rectangle dotBounds = text.modelToView(index);
+ if (dotBounds.y < visible.y ||
+ (dotBounds.y > (visible.y + visible.height)) ||
+ (dotBounds.y + dotBounds.height) >
+ (visible.y + visible.height)) {
+ int y;
+ if (dotBounds.y < visible.y)
+ y = dotBounds.y;
+ else
+ y = dotBounds.y + dotBounds.height - visible.height;
+ if ((direction == -1 && y < initialY) ||
+ (direction == 1 && y > initialY))
+ // Only adjust if won't cause scrolling upward.
+ visible.y = y;
+ }
+ } catch (BadLocationException ble) {}
+ }
+
+ public final String getMacroID() {
+ return getName();
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextAreaUI.java b/src/org/fife/ui/rtextarea/RTextAreaUI.java
new file mode 100644
index 0000000..e486a99
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextAreaUI.java
@@ -0,0 +1,581 @@
+/*
+ * 04/25/2007
+ *
+ * RTextAreaUI.java - UI used by instances of RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.text.*;
+import javax.swing.border.Border;
+import javax.swing.plaf.*;
+import javax.swing.plaf.basic.*;
+
+
+/**
+ * The UI used by instances of <code>RTextArea</code>. This UI takes into
+ * account all of the "extras" involved in an <code>RTextArea</code>, including
+ * having a special caret (for insert and overwrite), background images,
+ * highlighting the current line, etc.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public class RTextAreaUI extends BasicTextAreaUI implements ViewFactory {
+
+ private static final String SHARED_ACTION_MAP_NAME = "RTextAreaUI.actionMap";
+ private static final String SHARED_INPUT_MAP_NAME = "RTextAreaUI.inputMap";
+
+ protected RTextArea textArea; // The text area for which we are the UI.
+
+ private static final EditorKit defaultKit = new RTextAreaEditorKit();
+ private static final TransferHandler defaultTransferHandler =
+ new RTATextTransferHandler();
+
+ private static final String RTEXTAREA_KEYMAP_NAME = "RTextAreaKeymap";
+
+
+ /**
+ * Creates a UI for an RTextArea.
+ *
+ * @param textArea A text area.
+ * @return The UI.
+ */
+ public static ComponentUI createUI(JComponent textArea) {
+ return new RTextAreaUI(textArea);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea An instance of <code>RTextArea</code>.
+ * @throws IllegalArgumentException If <code>textArea</code> is not an
+ * instance of <code>RTextArea</code>.
+ */
+ public RTextAreaUI(JComponent textArea) {
+ if (!(textArea instanceof RTextArea)) {
+ throw new IllegalArgumentException("RTextAreaUI is for " +
+ "instances of RTextArea only!");
+ }
+ this.textArea = (RTextArea)textArea;
+ }
+
+
+ /**
+ * The Nimbus LAF (and any Synth laf might have similar issues) doesn't set
+ * many UIManager properties that BasicLAF UI's look for. This causes
+ * problems for custom Basic-based UI's such as RTextAreaUI. This method
+ * attempts to detect if Nimbus has been installed, and if so, sets proper
+ * values for some editor properties.
+ *
+ * @param editor The text area.
+ */
+ private void correctNimbusDefaultProblems(JTextComponent editor) {
+
+ // Don't check UIManager.getLookAndFeel().getName() for "Nimbus",
+ // as other Synth-based LaFs might have not set these properties,
+ // in which case we'll need to use our fallback values.
+
+ // Check for null, but not for UIResource, for these properties,
+ // because if Nimbus was installed these values would all be given
+ // null values. Another laf might have successfully installed
+ // UIResource values, which we don't want to override.
+
+ Color c = editor.getCaretColor();
+ if (c==null) {
+ editor.setCaretColor(RTextArea.getDefaultCaretColor());
+ }
+
+ c = editor.getSelectionColor();
+ if (c==null) {
+ c = UIManager.getColor("nimbusSelectionBackground");
+ if (c==null) { // Not Nimbus, but still need a value - fallback
+ c = UIManager.getColor("textHighlight");
+ if (c==null) {
+ c = new ColorUIResource(Color.BLUE);
+ }
+ }
+ editor.setSelectionColor(c);
+ }
+
+ c = editor.getSelectedTextColor();
+ if (c==null) {
+ c = UIManager.getColor("nimbusSelectedText");
+ if (c==null) { // Not Nimbus, but still need a value - fallback
+ c = UIManager.getColor("textHighlightText");
+ if (c==null) {
+ c = new ColorUIResource(Color.WHITE);
+ }
+ }
+ editor.setSelectedTextColor(c);
+ }
+
+ c = editor.getDisabledTextColor();
+ if (c==null) {
+ c = UIManager.getColor("nimbusDisabledText");
+ if (c==null) { // Not Nimbus, but still need a value - fallback
+ c = UIManager.getColor("textInactiveText");
+ if (c==null) {
+ c = new ColorUIResource(Color.DARK_GRAY);
+ }
+ }
+ editor.setDisabledTextColor(c);
+ }
+
+ Border border = editor.getBorder();
+ if (border==null) {
+ editor.setBorder(new BasicBorders.MarginBorder());
+ }
+
+ Insets margin = editor.getMargin();
+ if (margin==null) {
+ editor.setMargin(new InsetsUIResource(2, 2, 2, 2));
+ }
+
+ }
+
+
+ /**
+ * Creates the view for an element. Returns a WrappedPlainView or
+ * PlainView.
+ *
+ * @param elem The element.
+ * @return The view.
+ */
+ public View create(Element elem) {
+ if (textArea.getLineWrap())
+ return new WrappedPlainView(elem, textArea.getWrapStyleWord());
+ else
+ return new PlainView(elem);
+ }
+
+
+ /**
+ * Returns the default caret for an <code>RTextArea</code>. This caret is
+ * capable of displaying itself differently for insert/overwrite modes.
+ *
+ * @return The caret.
+ */
+ protected Caret createCaret() {
+ Caret caret = new ConfigurableCaret();
+ caret.setBlinkRate(500);
+ return caret;
+ }
+
+
+ /**
+ * Creates the keymap for this text area. This takes the super class's
+ * keymap, but sets the default keystroke to be RTextAreaEditorKit's
+ * DefaultKeyTypedAction. This must be done to override the default
+ * keymap's default key-typed action.
+ *
+ * @return The keymap.
+ */
+ protected Keymap createKeymap() {
+
+ // Load the keymap we'll be using (it's saved by
+ // JTextComponent.addKeymap).
+ Keymap map = JTextComponent.getKeymap(RTEXTAREA_KEYMAP_NAME);
+ if (map==null) {
+ Keymap parent = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
+ map = JTextComponent.addKeymap(RTEXTAREA_KEYMAP_NAME, parent);
+ map.setDefaultAction(new RTextAreaEditorKit.DefaultKeyTypedAction());
+ }
+
+ return map;
+
+ }
+
+
+ /**
+ * Creates a default action map. This action map contains actions for all
+ * basic text area work - cut, copy, paste, select, caret motion, etc.<p>
+ *
+ * This isn't named <code>createActionMap()</code> because there is a
+ * package-private member by that name in <code>BasicTextAreaUI</code>,
+ * and some compilers will give warnings that we are not overriding that
+ * method since it is package-private.
+ *
+ * @return The action map.
+ */
+ protected ActionMap createRTextAreaActionMap() {
+
+ // Get the actions of the text area (which in turn gets them from its
+ // DefaultEditorKit).
+ ActionMap map = new ActionMapUIResource();
+ Action[] actions = textArea.getActions();
+ int n = actions.length;
+ for (int i = 0; i < n; i++) {
+ Action a = actions[i];
+ map.put(a.getValue(Action.NAME), a);
+ }
+
+ // Not sure if we need these; not sure they are ever called
+ // (check their NAMEs).
+ map.put(TransferHandler.getCutAction().getValue(Action.NAME),
+ TransferHandler.getCutAction());
+ map.put(TransferHandler.getCopyAction().getValue(Action.NAME),
+ TransferHandler.getCopyAction());
+ map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
+ TransferHandler.getPasteAction());
+
+ return map;
+
+ }
+
+
+ /**
+ * Returns the name to use to cache/fetch the shared action map. This
+ * should be overridden by subclasses if the subclass has its own custom
+ * editor kit to install, so its actions get picked up.
+ *
+ * @return The name of the cached action map.
+ */
+ protected String getActionMapName() {
+ return SHARED_ACTION_MAP_NAME;
+ }
+
+
+ /**
+ * Fetches the EditorKit for the UI.
+ *
+ * @param tc the text component for which this UI is installed
+ * @return the editor capabilities
+ * @see TextUI#getEditorKit
+ */
+ public EditorKit getEditorKit(JTextComponent tc) {
+ return defaultKit;
+ }
+
+
+ /**
+ * Returns the text area for which we are the UI.
+ *
+ * @return The text area.
+ */
+ public RTextArea getRTextArea() {
+ return textArea;
+ }
+
+
+ /**
+ * Returns an action map to use by a text area.<p>
+ *
+ * This method is not named <code>getActionMap()</code> because there is
+ * a package-private method in <code>BasicTextAreaUI</code> with that name.
+ * Thus, creating a new method with that name causes certain compilers to
+ * issue warnings that you are not actually overriding the original method
+ * (since it is package-private).
+ *
+ * @return The action map.
+ * @see #createRTextAreaActionMap()
+ */
+ private ActionMap getRTextAreaActionMap() {
+
+ // Get the UIManager-cached action map; if this is the first
+ // RTextArea created, create the action map and cache it.
+ ActionMap map = (ActionMap)UIManager.get(getActionMapName());
+ if (map==null) {
+ map = createRTextAreaActionMap();
+ UIManager.put(getActionMapName(), map);
+ }
+
+ ActionMap componentMap = new ActionMapUIResource();
+ componentMap.put("requestFocus", new FocusAction());
+
+ if (map != null)
+ componentMap.setParent(map);
+ return componentMap;
+
+ }
+
+
+ /**
+ * Get the InputMap to use for the UI.<p>
+ *
+ * This method is not named <code>getInputMap()</code> because there is
+ * a package-private method in <code>BasicTextAreaUI</code> with that name.
+ * Thus, creating a new method with that name causes certain compilers to
+ * issue warnings that you are not actually overriding the original method
+ * (since it is package-private).
+ */
+ protected InputMap getRTextAreaInputMap() {
+ InputMap map = new InputMapUIResource();
+ InputMap shared = (InputMap)UIManager.get(SHARED_INPUT_MAP_NAME);
+ if (shared==null) {
+ shared = new RTADefaultInputMap();
+ UIManager.put(SHARED_INPUT_MAP_NAME, shared);
+ }
+ //KeyStroke[] keys = shared.allKeys();
+ //for (int i=0; i<keys.length; i++)
+ // System.err.println(keys[i] + " -> " + shared.get(keys[i]));
+ map.setParent(shared);
+ return map;
+ }
+
+
+ /**
+ * Gets the allocation to give the root View. Due
+ * to an unfortunate set of historical events this
+ * method is inappropriately named. The Rectangle
+ * returned has nothing to do with visibility.
+ * The component must have a non-zero positive size for
+ * this translation to be computed.
+ *
+ * @return the bounding box for the root view
+ */
+ protected Rectangle getVisibleEditorRect() {
+ Rectangle alloc = textArea.getBounds();
+ if ((alloc.width > 0) && (alloc.height > 0)) {
+ alloc.x = alloc.y = 0;
+ Insets insets = textArea.getInsets();
+ alloc.x += insets.left;
+ alloc.y += insets.top;
+ alloc.width -= insets.left + insets.right;
+ alloc.height -= insets.top + insets.bottom;
+ return alloc;
+ }
+ return null;
+ }
+
+
+ protected void installDefaults() {
+
+ super.installDefaults();
+
+ JTextComponent editor = getComponent();
+ editor.setFont(RTextAreaBase.getDefaultFont());
+
+ // Nimbus (and possibly other Synth lafs) doesn't play by BasicLaf
+ // rules and doesn't set properties needed by custom BasicTextAreaUI's.
+ correctNimbusDefaultProblems(editor);
+
+ editor.setTransferHandler(defaultTransferHandler);
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void installKeyboardActions() {
+
+ // NOTE: Don't call super.installKeyboardActions(), as that causes
+ // JTextAreas to stop responding to certain keystrokes if an RTextArea
+ // is the first-instantiated text area. This is because of the code
+ // path installKeyboardActions() -> getActionMap() -> createActionMap().
+ // In BasicTextUI#createActionMap(), "editor.getActions()" is called,
+ // and the current editor's returned Actions are used to create the
+ // ActionMap, which is then cached and used in all future J/RTextAreas.
+ // Unfortunately, RTextArea actions don't worn in JTextAreas.
+ //super.installKeyboardActions();
+
+ RTextArea textArea = getRTextArea();
+
+ // backward compatibility support... keymaps for the UI
+ // are now installed in the more friendly input map.
+ textArea.setKeymap(createKeymap());
+
+ // Since BasicTextUI.getInputMap() is package-private, instead use
+ // our own version here.
+ InputMap map = getRTextAreaInputMap();
+ SwingUtilities.replaceUIInputMap(textArea,JComponent.WHEN_FOCUSED,map);
+
+ // Same thing here with action map.
+ ActionMap am = getRTextAreaActionMap();
+ if (am!=null) {
+ SwingUtilities.replaceUIActionMap(textArea, am);
+ }
+
+
+ }
+
+
+ /**
+ * Installs this UI to the given text component.
+ */
+ public void installUI(JComponent c) {
+ if (!(c instanceof RTextArea)) {
+ throw new Error("RTextAreaUI needs an instance of RTextArea!");
+ }
+ super.installUI(c);
+ }
+
+
+ protected void paintBackground(Graphics g) {
+
+ // Only fill in the background if an image isn't being used.
+ Color bg = textArea.getBackground();
+ if (bg!=null) {
+ g.setColor(bg);
+ //g.fillRect(0, 0, textArea.getWidth(), textArea.getHeight());
+ Rectangle r = g.getClipBounds();
+ g.fillRect(r.x,r.y, r.width,r.height);
+ }
+
+ Rectangle visibleRect = textArea.getVisibleRect();
+
+ paintLineHighlights(g);
+ paintCurrentLineHighlight(g, visibleRect);
+ paintMarginLine(g, visibleRect);
+
+ }
+
+
+ /**
+ * Paints the highlighted current line, if it is enabled.
+ *
+ * @param g The graphics context with which to paint.
+ * @param visibleRect The visible rectangle of the text area.
+ */
+ protected void paintCurrentLineHighlight(Graphics g, Rectangle visibleRect) {
+
+ if (textArea.getHighlightCurrentLine()) {
+
+ Caret caret = textArea.getCaret();
+ if (caret.getDot()==caret.getMark()) {
+
+ Color highlight = textArea.getCurrentLineHighlightColor();
+ // NOTE: We use the getLineHeight() method below instead
+ // of currentCaretRect.height because of a bug where
+ // currentCaretRect.height is incorrect when an
+ // RSyntaxTextArea is first displayed (it is initialized
+ // with the text area's font.getHeight() (via RTextArea),
+ // but isn't changed to account for the syntax styles
+ // before it is displayed).
+ //int height = textArea.currentCaretRect.height);
+ int height = textArea.getLineHeight();
+
+ if (textArea.getFadeCurrentLineHighlight()) {
+ Graphics2D g2d = (Graphics2D)g;
+ Color bg = textArea.getBackground();
+ GradientPaint paint = new GradientPaint(
+ visibleRect.x,0, highlight,
+ visibleRect.x+visibleRect.width,0,
+ bg==null ? Color.WHITE : bg);
+ g2d.setPaint(paint);
+ g2d.fillRect(visibleRect.x,textArea.currentCaretY,
+ visibleRect.width, height);
+ }
+ else {
+ g.setColor(highlight);
+ g.fillRect(visibleRect.x,textArea.currentCaretY,
+ visibleRect.width, height);
+ }
+
+ } // End of if (caret.getDot()==caret.getMark()).
+
+ } // End of if (textArea.isCurrentLineHighlightEnabled()...
+
+ }
+
+
+ /**
+ * Paints any line highlights.
+ *
+ * @param g The graphics context.
+ */
+ protected void paintLineHighlights(Graphics g) {
+ LineHighlightManager lhm = textArea.getLineHighlightManager();
+ if (lhm!=null) {
+ lhm.paintLineHighlights(g);
+ }
+ }
+
+
+ /**
+ * Draws the "margin line" if enabled.
+ *
+ * @param g The graphics context to paint with.
+ * @param visibleRect The visible rectangle of this text area.
+ */
+ protected void paintMarginLine(Graphics g, Rectangle visibleRect) {
+ if (textArea.isMarginLineEnabled()) {
+ g.setColor(textArea.getMarginLineColor());
+ Insets insets = textArea.getInsets();
+ int marginLineX = textArea.getMarginLinePixelLocation() +
+ (insets==null ? 0 : insets.left);
+ g.drawLine(marginLineX,visibleRect.y,
+ marginLineX,visibleRect.y+visibleRect.height);
+ }
+ }
+
+
+ /**
+ * Returns the y-coordinate of the specified line.<p>
+ *
+ * The default implementation is equivalent to:
+ * <pre>
+ * int startOffs = textArea.getLineStartOffset(line);
+ * return yForLineContaining(startOffs);</code>
+ * </pre>
+ *
+ * Subclasses that can calculate this value more quickly than traditional
+ * {@link #modelToView(JTextComponent, int)} calls should override this
+ * method to do so. This method may be used when the entire bounding box
+ * isn't needed, to speed up rendering.
+ *
+ * @param line The line number.
+ * @return The y-coordinate of the top of the line, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>line</code> isn't a valid line
+ * number for this document.
+ */
+ public int yForLine(int line) throws BadLocationException {
+ int startOffs = textArea.getLineStartOffset(line);
+ return yForLineContaining(startOffs);
+ }
+
+
+ /**
+ * Returns the y-coordinate of the line containing an offset.<p>
+ *
+ * The default implementation is equivalent to:
+ * <pre>
+ * int line = textArea.getLineOfOffset(offs);
+ * int startOffs = textArea.getLineStartOffset(line);
+ * return modelToView(startOffs).y;</code>
+ * </pre>
+ *
+ * Subclasses that can calculate this value more quickly than traditional
+ * {@link #modelToView(JTextComponent, int)} calls should override this
+ * method to do so. This method may be used when the entire bounding box
+ * isn't needed, to speed up rendering.
+ *
+ * @param offs The offset info the document.
+ * @return The y-coordinate of the top of the offset, or <code>-1</code> if
+ * this text area doesn't yet have a positive size or the line is
+ * hidden (i.e. from folding).
+ * @throws BadLocationException If <code>offs</code> isn't a valid offset
+ * into the document.
+ */
+ public int yForLineContaining(int offs) throws BadLocationException {
+ Rectangle r = modelToView(textArea, offs);
+ return r!=null ? r.y : -1;
+ }
+
+
+ /**
+ * Registered in the ActionMap.
+ */
+ class FocusAction extends AbstractAction {
+
+ public void actionPerformed(ActionEvent e) {
+ textArea.requestFocus();
+ }
+
+ public boolean isEnabled() {
+ return textArea.isEditable();
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RTextScrollPane.java b/src/org/fife/ui/rtextarea/RTextScrollPane.java
new file mode 100644
index 0000000..f2a90d7
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RTextScrollPane.java
@@ -0,0 +1,236 @@
+/*
+ * 11/14/2003
+ *
+ * RTextScrollPane.java - A JScrollPane that will only accept RTextAreas
+ * so that it can display line numbers, fold indicators, and icons.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import javax.swing.JScrollPane;
+
+
+/**
+ * An extension of <code>javax.swing.JScrollPane</code> that will only take
+ * <code>RTextArea</code>s for its view. This class has the ability to show:
+ * <ul>
+ * <li>Line numbers
+ * <li>Per-line icons (for bookmarks, debugging breakpoints, error markers, etc.)
+ * <li>+/- icons to denote code folding regions.
+ * </ul>
+ *
+ * The actual "meat" of these extras is contained in the {@link Gutter} class.
+ * Each <code>RTextScrollPane</code> has a <code>Gutter</code> instance that
+ * it uses as its row header. The gutter is only made visible when one of its
+ * features is being used (line numbering, folding, and/or icons).
+ *
+ * @author Robert Futrell
+ * @version 0.9
+ */
+public class RTextScrollPane extends JScrollPane {
+
+ private RTextArea textArea;
+ private Gutter gutter;
+
+
+ /**
+ * Constructor. If you use this constructor, you must call
+ * {@link #setViewportView(Component)} and pass in an {@link RTextArea}
+ * for this scroll pane to render line numbers properly.
+ */
+ public RTextScrollPane() {
+ this(null, true);
+ }
+
+
+ /**
+ * Creates a scroll pane. A default value will be used for line number
+ * color (gray), and the current line's line number will be highlighted.
+ *
+ * @param textArea The text area this scroll pane will contain.
+ */
+ public RTextScrollPane(RTextArea textArea) {
+ this(textArea, true);
+ }
+
+
+ /**
+ * Creates a scroll pane. A default value will be used for line number
+ * color (gray), and the current line's line number will be highlighted.
+ *
+ * @param textArea The text area this scroll pane will contain. If this is
+ * <code>null</code>, you must call
+ * {@link #setViewportView(Component)}, passing in an
+ * {@link RTextArea}.
+ * @param lineNumbers Whether line numbers should be enabled.
+ */
+ public RTextScrollPane(RTextArea textArea, boolean lineNumbers) {
+ this(textArea, lineNumbers, Color.GRAY);
+ }
+
+
+ /**
+ * Creates a scroll pane with preferred size (width, height).
+ *
+ * @param area The text area this scroll pane will contain. If this is
+ * <code>null</code>, you must call
+ * {@link #setViewportView(Component)}, passing in an
+ * {@link RTextArea}.
+ * @param lineNumbers Whether line numbers are initially enabled.
+ * @param lineNumberColor The color to use for line numbers.
+ */
+ public RTextScrollPane(RTextArea area, boolean lineNumbers,
+ Color lineNumberColor) {
+
+ super(area);
+
+ // Create the text area and set it inside this scroll bar area.
+ textArea = area;
+
+ // Create the gutter for this document.
+ Font defaultFont = new Font("Monospaced", Font.PLAIN, 12);
+ gutter = new Gutter(textArea);
+ gutter.setLineNumberFont(defaultFont);
+ gutter.setLineNumberColor(lineNumberColor);
+ setLineNumbersEnabled(lineNumbers);
+
+ // Set miscellaneous properties.
+ setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
+ setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+ }
+
+
+ /**
+ * Ensures the gutter is visible if it's showing anything.
+ */
+ private void checkGutterVisibility() {
+ int count = gutter.getComponentCount();
+ if (count==0) {
+ if (getRowHeader()!=null && getRowHeader().getView()==gutter) {
+ setRowHeaderView(null);
+ }
+ }
+ else {
+ if (getRowHeader()==null || getRowHeader().getView()==null) {
+ setRowHeaderView(gutter);
+ }
+ }
+ }
+
+
+ /**
+ * Returns the gutter.
+ *
+ * @return The gutter.
+ */
+ public Gutter getGutter() {
+ return gutter;
+ }
+
+
+ /**
+ * Returns <code>true</code> if the line numbers are enabled and visible.
+ *
+ * @return Whether or not line numbers are visible.
+ * @see #setLineNumbersEnabled(boolean)
+ */
+ public boolean getLineNumbersEnabled() {
+ return gutter.getLineNumbersEnabled();
+ }
+
+
+ /**
+ * Returns the text area being displayed.
+ *
+ * @return The text area.
+ * @see #setViewportView(Component)
+ */
+ public RTextArea getTextArea() {
+ return (RTextArea)getViewport().getView();
+ }
+
+
+ /**
+ * Returns whether the fold indicator is enabled.
+ *
+ * @return Whether the fold indicator is enabled.
+ * @see #setFoldIndicatorEnabled(boolean)
+ */
+ public boolean isFoldIndicatorEnabled() {
+ return gutter.isFoldIndicatorEnabled();
+ }
+
+
+ /**
+ * Returns whether the icon row header is enabled.
+ *
+ * @return Whether the icon row header is enabled.
+ * @see #setIconRowHeaderEnabled(boolean)
+ */
+ public boolean isIconRowHeaderEnabled() {
+ return gutter.isIconRowHeaderEnabled();
+ }
+
+
+ /**
+ * Toggles whether the fold indicator is enabled.
+ *
+ * @param enabled Whether the fold indicator should be enabled.
+ * @see #isFoldIndicatorEnabled()
+ */
+ public void setFoldIndicatorEnabled(boolean enabled) {
+ gutter.setFoldIndicatorEnabled(enabled);
+ checkGutterVisibility();
+ }
+
+
+ /**
+ * Toggles whether the icon row header (used for breakpoints, bookmarks,
+ * etc.) is enabled.
+ *
+ * @param enabled Whether the icon row header is enabled.
+ * @see #isIconRowHeaderEnabled()
+ */
+ public void setIconRowHeaderEnabled(boolean enabled) {
+ gutter.setIconRowHeaderEnabled(enabled);
+ checkGutterVisibility();
+ }
+
+
+ /**
+ * Toggles whether or not line numbers are visible.
+ *
+ * @param enabled Whether or not line numbers should be visible.
+ * @see #getLineNumbersEnabled()
+ */
+ public void setLineNumbersEnabled(boolean enabled) {
+ gutter.setLineNumbersEnabled(enabled);
+ checkGutterVisibility();
+ }
+
+
+ /**
+ * Sets the view for this scroll pane. This must be an {@link RTextArea}.
+ *
+ * @param view The new view.
+ * @see #getTextArea()
+ */
+ public void setViewportView(Component view) {
+ if (!(view instanceof RTextArea)) {
+ throw new IllegalArgumentException("view must be an RTextArea");
+ }
+ super.setViewportView(view);
+ textArea = (RTextArea)view;
+ if (gutter!=null) {
+ gutter.setTextArea(textArea);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RUndoManager.java b/src/org/fife/ui/rtextarea/RUndoManager.java
new file mode 100644
index 0000000..0e52043
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RUndoManager.java
@@ -0,0 +1,251 @@
+/*
+ * 12/06/2008
+ *
+ * RUndoManager.java - Handles undo/redo behavior for RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.util.ResourceBundle;
+import javax.swing.Action;
+import javax.swing.UIManager;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import javax.swing.undo.CompoundEdit;
+import javax.swing.undo.UndoManager;
+import javax.swing.undo.UndoableEdit;
+
+
+/**
+ * This class manages undos/redos for a particular editor pane. It groups
+ * all undos that occur one character position apart together, to avoid
+ * Java's horrible "one character at a time" undo behavior. It also
+ * recognizes "replace" actions (i.e., text is selected, then the user
+ * types), and treats it as a single action, instead of a remove/insert
+ * action pair.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class RUndoManager extends UndoManager {
+
+ private RCompoundEdit compoundEdit;
+ private RTextArea textArea;
+ private int lastOffset;
+ private String cantUndoText;
+ private String cantRedoText;
+
+ private int internalAtomicEditDepth;
+
+ private static final String MSG = "org.fife.ui.rtextarea.RTextArea";
+
+
+ /**
+ * Constructor.
+ *
+ * @param textArea The parent text area.
+ */
+ public RUndoManager(RTextArea textArea) {
+ this.textArea = textArea;
+ ResourceBundle msg = ResourceBundle.getBundle(MSG);
+ cantUndoText = msg.getString("Action.CantUndo.Name");
+ cantRedoText = msg.getString("Action.CantRedo.Name");
+ }
+
+
+ /**
+ * Begins an "atomic" edit. This method is called when RTextArea
+ * KNOWS that some edits should be compound automatically, such as
+ * when the user is typing in overwrite mode (the deletion of the
+ * current char + insertion of the new one) or the playing back of a
+ * macro.
+ *
+ * @see #endInternalAtomicEdit()
+ */
+ public void beginInternalAtomicEdit() {
+ if (++internalAtomicEditDepth==1) {
+ if (compoundEdit!=null)
+ compoundEdit.end();
+ compoundEdit = new RCompoundEdit();
+ }
+ }
+
+
+ /**
+ * Ends an "atomic" edit.
+ *
+ * @see #beginInternalAtomicEdit()
+ */
+ public void endInternalAtomicEdit() {
+ if (internalAtomicEditDepth>0 && --internalAtomicEditDepth==0) {
+ addEdit(compoundEdit);
+ compoundEdit.end();
+ compoundEdit = null;
+ updateActions(); // Needed to show the new display name.
+ }
+ }
+
+
+ /**
+ * Returns the localized "Can't Redo" string.
+ *
+ * @return The localized "Can't Redo" string.
+ * @see #getCantUndoText()
+ */
+ public String getCantRedoText() {
+ return cantRedoText;
+ }
+
+
+ /**
+ * Returns the localized "Can't Undo" string.
+ *
+ * @return The localized "Can't Undo" string.
+ * @see #getCantRedoText()
+ */
+ public String getCantUndoText() {
+ return cantUndoText;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void redo() throws CannotRedoException {
+ super.redo();
+ updateActions();
+ }
+
+
+ private RCompoundEdit startCompoundEdit(UndoableEdit edit) {
+ lastOffset = textArea.getCaretPosition();
+ compoundEdit = new RCompoundEdit();
+ compoundEdit.addEdit(edit);
+ addEdit(compoundEdit);
+ return compoundEdit;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void undo() throws CannotUndoException {
+ super.undo();
+ updateActions();
+ }
+
+
+ public void undoableEditHappened(UndoableEditEvent e) {
+
+ // This happens when the first undoable edit occurs, and
+ // just after an undo. So, we need to update our actions.
+ if (compoundEdit==null) {
+ compoundEdit = startCompoundEdit(e.getEdit());
+ updateActions();
+ return;
+ }
+
+ else if (internalAtomicEditDepth>0) {
+ compoundEdit.addEdit(e.getEdit());
+ return;
+ }
+
+ // This happens when there's already an undo that has occurred.
+ // Test to see if these undos are on back-to-back characters,
+ // and if they are, group them as a single edit. Since an
+ // undo has already occurred, there is no need to update our
+ // actions here.
+ int diff = textArea.getCaretPosition() - lastOffset;
+ // "<=1" allows contiguous "overwrite mode" key presses to be
+ // grouped together.
+ if (Math.abs(diff)<=1) {//==1) {
+ compoundEdit.addEdit(e.getEdit());
+ lastOffset += diff;
+ //updateActions();
+ return;
+ }
+
+ // This happens when this UndoableEdit didn't occur at the
+ // character just after the previous undlabeledit. Since an
+ // undo has already occurred, there is no need to update our
+ // actions here either.
+ compoundEdit.end();
+ compoundEdit = startCompoundEdit(e.getEdit());
+ //updateActions();
+
+ }
+
+
+ /**
+ * Ensures that undo/redo actions are enabled appropriately and have
+ * descriptive text at all times.
+ */
+ public void updateActions() {
+
+ String text;
+
+ Action a = RTextArea.getAction(RTextArea.UNDO_ACTION);
+ if (canUndo()) {
+ a.setEnabled(true);
+ text = getUndoPresentationName();
+ a.putValue(Action.NAME, text);
+ a.putValue(Action.SHORT_DESCRIPTION, text);
+ }
+ else {
+ if (a.isEnabled()) {
+ a.setEnabled(false);
+ text = cantUndoText;
+ a.putValue(Action.NAME, text);
+ a.putValue(Action.SHORT_DESCRIPTION, text);
+ }
+ }
+
+ a = RTextArea.getAction(RTextArea.REDO_ACTION);
+ if (canRedo()) {
+ a.setEnabled(true);
+ text = getRedoPresentationName();
+ a.putValue(Action.NAME, text);
+ a.putValue(Action.SHORT_DESCRIPTION, text);
+ }
+ else {
+ if (a.isEnabled()) {
+ a.setEnabled(false);
+ text = cantRedoText;
+ a.putValue(Action.NAME, text);
+ a.putValue(Action.SHORT_DESCRIPTION, text);
+ }
+ }
+
+ }
+
+ /**
+ * The edit used by {@link RUndoManager}.
+ */
+ class RCompoundEdit extends CompoundEdit {
+
+ public String getUndoPresentationName() {
+ return UIManager.getString("AbstractUndoableEdit.undoText");
+ }
+
+ public String getRedoPresentationName() {
+ return UIManager.getString("AbstractUndoableEdit.redoText");
+ }
+
+ public boolean isInProgress() {
+ return false;
+ }
+
+ public void undo() throws CannotUndoException {
+ if (compoundEdit!=null)
+ compoundEdit.end();
+ super.undo();
+ compoundEdit = null;
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RecordableTextAction.java b/src/org/fife/ui/rtextarea/RecordableTextAction.java
new file mode 100644
index 0000000..f278c08
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RecordableTextAction.java
@@ -0,0 +1,289 @@
+/*
+ * 08/19/2004
+ *
+ * RecordableTextAction.java - An action that can be recorded and replayed
+ * in an RTextArea macro.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.ActionEvent;
+import java.util.ResourceBundle;
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.TextAction;
+
+
+/**
+ * The base action used by the actions defined in
+ * {@link RTextAreaEditorKit}. This action is what allows instances of
+ * <code>RTextArea</code> to record keystrokes into "macros;" if an action is
+ * recordable and occurs while the user is recording a macro, it adds itself to
+ * the currently-being-recorded macro.
+ *
+ * @author Robert Futrell
+ * @version 0.5
+ */
+public abstract class RecordableTextAction extends TextAction {
+
+ /**
+ * Whether or not this text action should be recorded in a macro.
+ */
+ private boolean isRecordable;
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The text (name) associated with the action.
+ */
+ public RecordableTextAction(String text) {
+ this(text, null, null, null, null);
+ }
+
+
+ /**
+ * Constructor.
+ *
+ * @param text The text (name) associated with the action.
+ * @param icon The icon associated with the action.
+ * @param desc The description of the action.
+ * @param mnemonic The mnemonic for the action.
+ * @param accelerator The accelerator key for the action.
+ */
+ public RecordableTextAction(String text, Icon icon, String desc,
+ Integer mnemonic, KeyStroke accelerator) {
+ super(text);
+ putValue(SMALL_ICON, icon);
+ putValue(SHORT_DESCRIPTION, desc);
+ putValue(ACCELERATOR_KEY, accelerator);
+ putValue(MNEMONIC_KEY, mnemonic);
+ setRecordable(true);
+ }
+
+
+ /**
+ * This method is final so that you cannot override it and mess up the
+ * macro-recording part of it. The actual meat of the action is in
+ * <code>actionPerformedImpl</code>.
+ *
+ * @param e The action being performed.
+ * @see #actionPerformedImpl
+ */
+ public final void actionPerformed(ActionEvent e) {
+
+ JTextComponent textComponent = getTextComponent(e);
+ if (textComponent instanceof RTextArea) {
+ RTextArea textArea = (RTextArea)textComponent;
+ //System.err.println("Recordable action: " + getMacroID());
+ if (RTextArea.isRecordingMacro() && isRecordable()) {
+ int mod = e.getModifiers();
+ // We ignore keypresses involving ctrl/alt/meta if they are
+ // "default" keypresses - i.e., they aren't some special
+ // action like paste (e.g., paste would return Ctrl+V, but
+ // its action would be "paste-action").
+ String macroID = getMacroID();
+//System.err.println(macroID);
+//System.err.println("... " + (mod&ActionEvent.ALT_MASK));
+//System.err.println("... " + (mod&ActionEvent.CTRL_MASK));
+//System.err.println("... " + (mod&ActionEvent.META_MASK));
+ if (!DefaultEditorKit.defaultKeyTypedAction.equals(macroID)
+ || (
+ (mod&ActionEvent.ALT_MASK)==0 &&
+ (mod&ActionEvent.CTRL_MASK)==0 &&
+ (mod&ActionEvent.META_MASK)==0)
+ ) {
+ String command = e.getActionCommand();
+ RTextArea.addToCurrentMacro(macroID, command);
+ //System.err.println("... recording it!");
+ }
+ }
+ actionPerformedImpl(e, textArea);
+ }
+
+ }
+
+
+ /**
+ * The actual meat of the action. If you wish to subclass this action
+ * and modify its behavior, this is the method to override.
+ *
+ * @param e The action being performed.
+ * @param textArea The text area "receiving" the action.
+ * @see #actionPerformed
+ */
+ public abstract void actionPerformedImpl(ActionEvent e, RTextArea textArea);
+
+
+ /**
+ * Returns the accelerator for this action.
+ *
+ * @return The accelerator.
+ * @see #setAccelerator(KeyStroke)
+ */
+ public KeyStroke getAccelerator() {
+ return (KeyStroke)getValue(ACCELERATOR_KEY);
+ }
+
+
+ /**
+ * Returns the description for this action.
+ *
+ * @return The description.
+ */
+ public String getDescription() {
+ return (String)getValue(SHORT_DESCRIPTION);
+ }
+
+
+ /**
+ * Returns the icon for this action.
+ *
+ * @return The icon.
+ */
+ public Icon getIcon() {
+ return (Icon)getValue(SMALL_ICON);
+ }
+
+
+ /**
+ * Returns the identifier for this macro. This method makes it so that you
+ * can create an instance of the <code>RTextAreaEditorKit.CutAction</code>
+ * action, for example, rename it to "Remove", and it will still be
+ * recorded as a "cut" action. Subclasses should return a unique string
+ * from this method; preferably the name of the action.<p>
+ * If you subclass a <code>RecordableTextAction</code>, you should NOT
+ * override this method; if you do, the action may not be properly
+ * recorded in a macro.
+ *
+ * @return The internally-used macro ID.
+ */
+ public abstract String getMacroID();
+
+
+ /**
+ * Returns the mnemonic for this action.
+ *
+ * @return The mnemonic, or <code>-1</code> if not defined.
+ * @see #setMnemonic(char)
+ * @see #setMnemonic(Integer)
+ */
+ public int getMnemonic() {
+ Integer i = (Integer)getValue(MNEMONIC_KEY);
+ return i!=null ? i.intValue() : -1;
+ }
+
+
+ /**
+ * Returns the name of this action.
+ *
+ * @return The name of this action.
+ * @see #setName(String)
+ */
+ public String getName() {
+ return (String)getValue(NAME);
+ }
+
+
+ /**
+ * Returns whether or not this action will be recorded and replayed in
+ * a macro.
+ *
+ * @return Whether or not this action will be recorded and replayed.
+ * @see #setRecordable
+ */
+ public boolean isRecordable() {
+ return isRecordable;
+ }
+
+
+ /**
+ * Sets the accelerator for this action.
+ *
+ * @param accelerator The new accelerator.
+ * @see #getAccelerator()
+ */
+ public void setAccelerator(KeyStroke accelerator) {
+ putValue(ACCELERATOR_KEY, accelerator);
+ }
+
+
+ /**
+ * Sets the mnemonic for this action.
+ *
+ * @param mnemonic The new mnemonic.
+ * @see #setMnemonic(Integer)
+ * @see #getMnemonic()
+ */
+ public void setMnemonic(char mnemonic) {
+ setMnemonic(new Integer(mnemonic));
+ }
+
+
+ /**
+ * Sets the mnemonic for this action.
+ *
+ * @param mnemonic The new mnemonic.
+ * @see #setMnemonic(char)
+ * @see #getMnemonic()
+ */
+ public void setMnemonic(Integer mnemonic) {
+ putValue(MNEMONIC_KEY, mnemonic);
+ }
+
+
+ /**
+ * Sets the name of this action.
+ *
+ * @param name The new name.
+ * @see #getName()
+ */
+ public void setName(String name) {
+ putValue(NAME, name);
+ }
+
+
+ /**
+ * Sets the name, mnemonic, and description of this action.
+ *
+ * @param msg The resource bundle.
+ * @param keyRoot The root of the keys for the properties.
+ * "<code>.Name</code>", "<code>.Mnemonic</code>", and
+ * "<code>.Desc</code>" will be appended to create the key for each
+ * property.
+ */
+ public void setProperties(ResourceBundle msg, String keyRoot) {
+ setName(msg.getString(keyRoot + ".Name"));
+ setMnemonic(msg.getString(keyRoot + ".Mnemonic").charAt(0));
+ setShortDescription(msg.getString(keyRoot + ".Desc"));
+ }
+
+
+ /**
+ * Sets whether or not this action will be recorded and replayed in
+ * a macro.
+ *
+ * @param recordable Whether or not this action should be recorded
+ * and replayed.
+ * @see #isRecordable
+ */
+ public void setRecordable(boolean recordable) {
+ isRecordable = recordable;
+ }
+
+
+ /**
+ * Sets the short description for this action.
+ *
+ * @param shortDesc The short description for this action.
+ */
+ public void setShortDescription(String shortDesc) {
+ putValue(SHORT_DESCRIPTION, shortDesc);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/RegExReplaceInfo.java b/src/org/fife/ui/rtextarea/RegExReplaceInfo.java
new file mode 100644
index 0000000..a3da689
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/RegExReplaceInfo.java
@@ -0,0 +1,85 @@
+/*
+ * 02/19/2006
+ *
+ * RegExReplaceInfo.java - Information about a regex text match.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Information on how to implement a regular expression "replace" operation.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class RegExReplaceInfo {
+
+ private String matchedText;
+ private int startIndex;
+ private int endIndex;
+ private String replacement;
+
+
+ /**
+ * Constructor.
+ *
+ * @param matchedText The text that matched the regular expression.
+ * @param start The start index of the matched text in the
+ * <code>CharSequence</code> searched.
+ * @param end The end index of the matched text in the
+ * <code>CharSequence</code> searched.
+ * @param replacement The text to replace the matched text with. This
+ * string has any matched groups and character escapes replaced.
+ */
+ public RegExReplaceInfo(String matchedText, int start, int end,
+ String replacement) {
+ this.matchedText = matchedText;
+ this.startIndex = start;
+ this.endIndex = end;
+ this.replacement = replacement;
+ }
+
+ /**
+ * Returns the end index of the matched text.
+ *
+ * @return The end index of the matched text in the document searched.
+ * @see #getMatchedText()
+ * @see #getEndIndex()
+ */
+ public int getEndIndex() {
+ return endIndex;
+ }
+
+ /**
+ * Returns the text that matched the regular expression.
+ *
+ * @return The matched text.
+ */
+ public String getMatchedText() {
+ return matchedText;
+ }
+
+ /**
+ * Returns the string to replaced the matched text with.
+ *
+ * @return The string to replace the matched text with.
+ */
+ public String getReplacement() {
+ return replacement;
+ }
+
+ /**
+ * Returns the start index of the matched text.
+ *
+ * @return The start index of the matched text in the document searched.
+ * @see #getMatchedText()
+ * @see #getEndIndex()
+ */
+ public int getStartIndex() {
+ return startIndex;
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/SearchContext.java b/src/org/fife/ui/rtextarea/SearchContext.java
new file mode 100644
index 0000000..c379d78
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/SearchContext.java
@@ -0,0 +1,244 @@
+/*
+ * 02/17/2012
+ *
+ * SearchContext.java - Container for options of a search/replace operation.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+
+/**
+ * Contains information about a find/replace operation. Applications can
+ * keep an instance of this class around and use it to maintain the user's
+ * selection for options such as "match case," "regular expression," etc.,
+ * between search operations. They can then pass the instance as a parameter
+ * to the public {@link SearchEngine} methods to do the actual searching.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchEngine
+ */
+public class SearchContext {
+
+ private String searchFor;
+
+ private String replaceWith;
+
+ private boolean forward;
+
+ private boolean matchCase;
+
+ private boolean wholeWord;
+
+ private boolean regex;
+
+ private boolean selectionOnly;
+
+
+ /**
+ * Creates a new search context. Specifies a forward search,
+ * case-insensitive, not whole-word, not a regular expression.
+ */
+ public SearchContext() {
+ this(null);
+ }
+
+
+ /**
+ * Creates a new search context. Specifies a forward search,
+ * case-insensitive, not whole-word, not a regular expression.
+ *
+ * @param searchFor The text to search for.
+ */
+ public SearchContext(String searchFor) {
+ this(searchFor, false);
+ }
+
+
+ /**
+ * Creates a new search context. Specifies a forward search, not
+ * whole-word, not a regular expression.
+ *
+ * @param searchFor The text to search for.
+ * @param matchCase Whether to do a case-sensitive search.
+ */
+ public SearchContext(String searchFor, boolean matchCase) {
+ this.searchFor = searchFor;
+ this.matchCase = matchCase;
+ forward = true;
+ }
+
+
+ /**
+ * Returns whether case should be honored while searching.
+ *
+ * @return Whether case should be honored.
+ * @see #setMatchCase(boolean)
+ */
+ public boolean getMatchCase() {
+ return matchCase;
+ }
+
+
+ /**
+ * Returns the text to replace with, if doing a replace operation.
+ *
+ * @return The text to replace with.
+ * @see #setReplaceWith(String)
+ * @see #getSearchFor()
+ */
+ public String getReplaceWith() {
+ return replaceWith;
+ }
+
+
+ /**
+ * Returns the text to search for.
+ *
+ * @return The text to search for.
+ * @see #setSearchFor(String)
+ * @see #getReplaceWith()
+ */
+ public String getSearchFor() {
+ return searchFor;
+ }
+
+
+ /**
+ * Returns whether the search should be forward through the text (vs.
+ * backwards).
+ *
+ * @return Whether we should search forwards.
+ * @see #setSearchForward(boolean)
+ */
+ public boolean getSearchForward() {
+ return forward;
+ }
+
+
+ /**
+ * Returns whether the search should only be done in the selected text.
+ * This flag is currently not supported.
+ *
+ * @return Whether only the selected text should be searched.
+ * @see #setSearchSelectionOnly(boolean)
+ */
+ public boolean getSearchSelectionOnly() {
+ return selectionOnly;
+ }
+
+
+ /**
+ * Returns whether only "whole word" matches should be returned. A match
+ * is considered to be "whole word" if the character on either side of the
+ * matched text is a non-word character, or if there is no character on
+ * one side of the word, such as when it's at the beginning or end of a
+ * line.
+ *
+ * @return Whether only "whole word" matches should be returned.
+ * @see #setWholeWord(boolean)
+ */
+ public boolean getWholeWord() {
+ return wholeWord;
+ }
+
+
+ /**
+ * Returns whether a regular expression search should be done.
+ *
+ * @return Whether a regular expression search should be done.
+ * @see #setRegularExpression(boolean)
+ */
+ public boolean isRegularExpression() {
+ return regex;
+ }
+
+
+ /**
+ * Sets whether case should be honored while searching.
+ *
+ * @param matchCase Whether case should be honored.
+ * @see #getMatchCase()
+ */
+ public void setMatchCase(boolean matchCase) {
+ this.matchCase = matchCase;
+ }
+
+
+ /**
+ * Sets whether a regular expression search should be done.
+ *
+ * @param regex Whether a regular expression search should be done.
+ * @see #isRegularExpression()
+ */
+ public void setRegularExpression(boolean regex) {
+ this.regex = regex;
+ }
+
+
+ /**
+ * Sets the text to replace with, if doing a replace operation.
+ *
+ * @param replaceWith The text to replace with.
+ * @see #getReplaceWith()
+ * @see #setSearchFor(String)
+ */
+ public void setReplaceWith(String replaceWith) {
+ this.replaceWith = replaceWith;
+ }
+
+
+ /**
+ * Sets the text to search for.
+ *
+ * @param searchFor The text to search for.
+ * @see #getSearchFor()
+ * @see #setReplaceWith(String)
+ */
+ public void setSearchFor(String searchFor) {
+ this.searchFor = searchFor;
+ }
+
+
+ /**
+ * Sets whether the search should be forward through the text (vs.
+ * backwards).
+ *
+ * @param forward Whether we should search forwards.
+ * @see #getSearchForward()
+ */
+ public void setSearchForward(boolean forward) {
+ this.forward = forward;
+ }
+
+
+ /**
+ * Sets whether only the selected text should be searched.
+ * This flag is currently not supported.
+ *
+ * @param selectionOnly Whether only selected text should be searched.
+ * @see #getSearchSelectionOnly()
+ */
+ public void setSearchSelectionOnly(boolean selectionOnly) {
+ this.selectionOnly = selectionOnly;
+ }
+
+
+ /**
+ * Sets whether only "whole word" matches should be returned. A match
+ * is considered to be "whole word" if the character on either side of the
+ * matched text is a non-word character, or if there is no character on
+ * one side of the word, such as when it's at the beginning or end of a
+ * line.
+ *
+ * @param wholeWord Whether only "whole word" matches should be returned.
+ * @see #getWholeWord()
+ */
+ public void setWholeWord(boolean wholeWord) {
+ this.wholeWord = wholeWord;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/SearchEngine.java b/src/org/fife/ui/rtextarea/SearchEngine.java
new file mode 100644
index 0000000..1c7f1d9
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/SearchEngine.java
@@ -0,0 +1,833 @@
+/*
+ * 02/19/2006
+ *
+ * SearchEngine.java - Handles find/replace operations in an RTextArea.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import javax.swing.JTextArea;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
+
+
+/**
+ * A singleton class that can perform advanced find/replace operations
+ * in an {@link RTextArea}. Simply create a {@link SearchContext} and call
+ * one of the following methods:
+ *
+ * <ul>
+ * <li>{@link #find(JTextArea, SearchContext)}
+ * <li>{@link #replace(RTextArea, SearchContext)}
+ * <li>{@link #replaceAll(RTextArea, SearchContext)}
+ * </ul>
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ * @see SearchContext
+ */
+public class SearchEngine {
+
+
+ /**
+ * Private constructor to prevent instantiation.
+ */
+ private SearchEngine() {
+ }
+
+
+ /**
+ * Finds the next instance of the string/regular expression specified
+ * from the caret position. If a match is found, it is selected in this
+ * text area.
+ *
+ * @param textArea The text area in which to search.
+ * @param context What to search for and all search options.
+ * @return Whether a match was found (and thus selected).
+ * @throws PatternSyntaxException If this is a regular expression search
+ * but the search text is an invalid regular expression.
+ * @see #replace(RTextArea, SearchContext)
+ * @see #replaceAll(RTextArea, SearchContext)
+ */
+ public static boolean find(JTextArea textArea, SearchContext context) {
+
+ String text = context.getSearchFor();
+ if (text==null || text.length()==0) {
+ return false;
+ }
+
+ // Be smart about what position we're "starting" at. We don't want
+ // to find a match in the currently selected text (if any), so we
+ // start searching AFTER the selection if searching forward, and
+ // BEFORE the selection if searching backward.
+ Caret c = textArea.getCaret();
+ boolean forward = context.getSearchForward();
+ int start = forward ? Math.max(c.getDot(), c.getMark()) :
+ Math.min(c.getDot(), c.getMark());
+
+ String findIn = getFindInText(textArea, start, forward);
+ if (findIn==null || findIn.length()==0) return false;
+
+ // Find the next location of the text we're searching for.
+ if (!context.isRegularExpression()) {
+ int pos = getNextMatchPos(text, findIn, forward,
+ context.getMatchCase(), context.getWholeWord());
+ findIn = null; // May help garbage collecting.
+ if (pos!=-1) {
+ // Without this, if JTextArea isn't in focus, selection
+ // won't appear selected.
+ c.setSelectionVisible(true);
+ pos = forward ? start+pos : pos;
+ selectAndPossiblyCenter(textArea, pos, pos+text.length());
+ return true;
+ }
+ }
+ else {
+ // Regex matches can have varying widths. The returned point's
+ // x- and y-values represent the start and end indices of the
+ // match in findIn.
+ Point regExPos = getNextMatchPosRegEx(text, findIn, forward,
+ context.getMatchCase(), context.getWholeWord());
+ findIn = null; // May help garbage collecting.
+ if (regExPos!=null) {
+ // Without this, if JTextArea isn't in focus, selection
+ // won't appear selected.
+ c.setSelectionVisible(true);
+ if (forward) {
+ regExPos.translate(start, start);
+ }
+ selectAndPossiblyCenter(textArea, regExPos.x, regExPos.y);
+ return true;
+ }
+ }
+
+ // No match.
+ return false;
+
+ }
+
+
+ /**
+ * Returns a <code>CharSequence</code> for a text area that doesn't make a
+ * copy of its contents for iteration. This conserves memory but is likely
+ * just a tad slower.
+ *
+ * @param textArea The text area whose document is the basis for the
+ * <code>CharSequence</code>.
+ * @param start The starting offset of the sequence (or ending offset if
+ * <code>forward</code> is <code>false</code>).
+ * @param forward Whether we're searching forward or backward.
+ * @return The character sequence.
+ */
+ private static CharSequence getFindInCharSequence(RTextArea textArea,
+ int start, boolean forward) {
+ RDocument doc = (RDocument)textArea.getDocument();
+ int csStart = 0;
+ int csEnd = 0;
+ if (forward) {
+ csStart = start;
+ csEnd = doc.getLength();
+ }
+ else {
+ csStart = 0;
+ csEnd = start;
+ }
+ return new RDocumentCharSequence(doc, csStart, csEnd);
+ }
+
+
+ /**
+ * Returns the text in which to search, as a string. This is used
+ * internally to grab the smallest buffer possible in which to search.
+ */
+ private static String getFindInText(JTextArea textArea, int start,
+ boolean forward) {
+
+ // Be smart about the text we grab to search in. We grab more than
+ // a single line because our searches can return multi-line results.
+ // We copy only the chars that will be searched through.
+ String findIn = null;
+ try {
+ if (forward) {
+ findIn = textArea.getText(start,
+ textArea.getDocument().getLength()-start);
+ }
+ else { // backward
+ findIn = textArea.getText(0, start);
+ }
+ } catch (BadLocationException ble) {
+ // Never happens; findIn will be null anyway.
+ ble.printStackTrace();
+ }
+
+ return findIn;
+
+ }
+
+
+ /**
+ * This method is called internally by
+ * <code>getNextMatchPosRegExImpl</code> and is used to get the locations
+ * of all regular-expression matches, and possibly their replacement
+ * strings.<p>
+ *
+ * Returns either:
+ * <ul>
+ * <li>A list of points representing the starting and ending positions
+ * of all matches returned by the specified matcher, or
+ * <li>A list of <code>RegExReplaceInfo</code>s describing the matches
+ * found by the matcher and the replacement strings for each.
+ * </ul>
+ *
+ * If <code>replacement</code> is <code>null</code>, this method call is
+ * assumed to be part of a "find" operation and points are returned. If
+ * if is non-<code>null</code>, it is assumed to be part of a "replace"
+ * operation and the <code>RegExReplaceInfo</code>s are returned.<p>
+ *
+ * @param m The matcher.
+ * @param replaceStr The string to replace matches with. This is a
+ * "template" string and can contain captured group references in
+ * the form "<code>${digit}</code>".
+ * @return A list of result objects.
+ * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+ * an invalid group (less than zero or greater than the number of
+ * groups matched).
+ */
+ private static List getMatches(Matcher m, String replaceStr) {
+ ArrayList matches = new ArrayList();
+ while (m.find()) {
+ Point loc = new Point(m.start(), m.end());
+ if (replaceStr==null) { // Find, not replace.
+ matches.add(loc);
+ }
+ else { // Replace.
+ matches.add(new RegExReplaceInfo(m.group(0), loc.x, loc.y,
+ getReplacementText(m, replaceStr)));
+ }
+ }
+ return matches;
+ }
+
+
+ /**
+ * Searches <code>searchIn</code> for an occurrence of
+ * <code>searchFor</code> either forwards or backwards, matching
+ * case or not.<p>
+ *
+ * Most clients will have no need to call this method directly.
+ *
+ * @param searchFor The string to look for.
+ * @param searchIn The string to search in.
+ * @param forward Whether to search forward or backward in
+ * <code>searchIn</code>.
+ * @param matchCase If <code>true</code>, do a case-sensitive search for
+ * <code>searchFor</code>.
+ * @param wholeWord If <code>true</code>, <code>searchFor</code>
+ * occurrences embedded in longer words in <code>searchIn</code>
+ * don't count as matches.
+ * @return The starting position of a match, or <code>-1</code> if no
+ * match was found.
+ */
+ public static final int getNextMatchPos(String searchFor, String searchIn,
+ boolean forward, boolean matchCase,
+ boolean wholeWord) {
+
+ // Make our variables lower case if we're ignoring case.
+ if (!matchCase) {
+ return getNextMatchPosImpl(searchFor.toLowerCase(),
+ searchIn.toLowerCase(), forward,
+ matchCase, wholeWord);
+ }
+
+ return getNextMatchPosImpl(searchFor, searchIn, forward,
+ matchCase, wholeWord);
+
+ }
+
+
+ /**
+ * Actually does the work of matching; assumes searchFor and searchIn
+ * are already upper/lower-cased appropriately.<br>
+ * The reason this method is here is to attempt to speed up
+ * <code>FindInFilesDialog</code>; since it repeatedly calls
+ * this method instead of <code>getNextMatchPos</code>, it gets better
+ * performance as it no longer has to allocate a lower-cased string for
+ * every call.
+ *
+ * @param searchFor The string to search for.
+ * @param searchIn The string to search in.
+ * @param goForward Whether the search is forward or backward.
+ * @param matchCase Whether the search is case-sensitive.
+ * @param wholeWord Whether only whole words should be matched.
+ * @return The location of the next match, or <code>-1</code> if no
+ * match was found.
+ */
+ private static final int getNextMatchPosImpl(String searchFor,
+ String searchIn, boolean goForward,
+ boolean matchCase, boolean wholeWord) {
+
+ if (wholeWord) {
+ int len = searchFor.length();
+ int temp = goForward ? 0 : searchIn.length();
+ int tempChange = goForward ? 1 : -1;
+ while (true) {
+ if (goForward)
+ temp = searchIn.indexOf(searchFor, temp);
+ else
+ temp = searchIn.lastIndexOf(searchFor, temp);
+ if (temp!=-1) {
+ if (isWholeWord(searchIn, temp, len)) {
+ return temp;
+ }
+ else {
+ temp += tempChange;
+ continue;
+ }
+ }
+ return temp; // Always -1.
+ }
+ }
+ else {
+ return goForward ? searchIn.indexOf(searchFor) :
+ searchIn.lastIndexOf(searchFor);
+ }
+
+ }
+
+
+ /**
+ * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+ * either forwards or backwards, matching case or not.
+ *
+ * @param regEx The regular expression to look for.
+ * @param searchIn The string to search in.
+ * @param goForward Whether to search forward. If <code>false</code>,
+ * search backward.
+ * @param matchCase Whether or not to do a case-sensitive search for
+ * <code>regEx</code>.
+ * @param wholeWord If <code>true</code>, <code>regEx</code>
+ * occurrences embedded in longer words in <code>searchIn</code>
+ * don't count as matches.
+ * @return A <code>Point</code> representing the starting and ending
+ * position of the match, or <code>null</code> if no match was
+ * found.
+ * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+ * regular expression.
+ * @see #getNextMatchPos
+ */
+ private static Point getNextMatchPosRegEx(String regEx,
+ CharSequence searchIn, boolean goForward,
+ boolean matchCase, boolean wholeWord) {
+ return (Point)getNextMatchPosRegExImpl(regEx, searchIn, goForward,
+ matchCase, wholeWord, null);
+ }
+
+
+ /**
+ * Searches <code>searchIn</code> for an occurrence of <code>regEx</code>
+ * either forwards or backwards, matching case or not.
+ *
+ * @param regEx The regular expression to look for.
+ * @param searchIn The string to search in.
+ * @param goForward Whether to search forward. If <code>false</code>,
+ * search backward.
+ * @param matchCase Whether or not to do a case-sensitive search for
+ * <code>regEx</code>.
+ * @param wholeWord If <code>true</code>, <code>regEx</code>
+ * occurrences embedded in longer words in <code>searchIn</code>
+ * don't count as matches.
+ * @param replaceStr The string that will replace the match found (if
+ * a match is found). The object returned will contain the
+ * replacement string with matched groups substituted. If this
+ * value is <code>null</code>, it is assumed this call is part of a
+ * "find" instead of a "replace" operation.
+ * @return If <code>replaceStr</code> is <code>null</code>, a
+ * <code>Point</code> representing the starting and ending points
+ * of the match. If it is non-<code>null</code>, an object with
+ * information about the match and the morphed string to replace
+ * it with. If no match is found, <code>null</code> is returned.
+ * @throws PatternSyntaxException If <code>regEx</code> is an invalid
+ * regular expression.
+ * @throws IndexOutOfBoundsException If <code>replaceStr</code> references
+ * an invalid group (less than zero or greater than the number of
+ * groups matched).
+ * @see #getNextMatchPos
+ */
+ private static Object getNextMatchPosRegExImpl(String regEx,
+ CharSequence searchIn, boolean goForward,
+ boolean matchCase, boolean wholeWord,
+ String replaceStr) {
+
+ if (wholeWord) {
+ regEx = "\\b" + regEx + "\\b";
+ }
+
+ // Make a pattern that takes into account whether or not to match case.
+ int flags = Pattern.MULTILINE; // '^' and '$' are done per line.
+ flags |= matchCase ? 0 : (Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+ Pattern pattern = Pattern.compile(regEx, flags);
+
+ // Make a Matcher to find the regEx instances.
+ Matcher m = pattern.matcher(searchIn);
+
+ // Search forwards
+ if (goForward) {
+ if (m.find()) {
+ if (replaceStr==null) { // Find, not replace.
+ return new Point(m.start(), m.end());
+ }
+ // Otherwise, replace
+ return new RegExReplaceInfo(m.group(0),
+ m.start(), m.end(),
+ getReplacementText(m, replaceStr));
+ }
+ }
+
+ // Search backwards
+ else {
+ List matches = getMatches(m, replaceStr);
+ if (!matches.isEmpty()) {
+ return matches.get(matches.size()-1);
+ }
+ }
+
+ return null; // No match found
+
+ }
+
+
+ /**
+ * Returns information on how to implement a regular expression "replace"
+ * action in the specified text with the specified replacement string.
+ *
+ * @param searchIn The string to search in.
+ * @param context The search options.
+ * @return A <code>RegExReplaceInfo</code> object describing how to
+ * implement the replace.
+ * @throws PatternSyntaxException If the search text is an invalid regular
+ * expression.
+ * @throws IndexOutOfBoundsException If the replacement text references an
+ * invalid group (less than zero or greater than the number of
+ * groups matched).
+ * @see #getNextMatchPos
+ */
+ private static RegExReplaceInfo getRegExReplaceInfo(CharSequence searchIn,
+ SearchContext context) {
+ // Can't pass null to getNextMatchPosRegExImpl or it'll think
+ // you're doing a "find" operation instead of "replace, and return a
+ // Point.
+ String replacement = context.getReplaceWith();
+ if (replacement==null) {
+ replacement = "";
+ }
+ String regex = context.getSearchFor();
+ boolean goForward = context.getSearchForward();
+ boolean matchCase = context.getMatchCase();
+ boolean wholeWord = context.getWholeWord();
+ return (RegExReplaceInfo)getNextMatchPosRegExImpl(regex, searchIn,
+ goForward, matchCase, wholeWord, replacement);
+ }
+
+
+ /**
+ * Called internally by <code>getMatches()</code>. This method assumes
+ * that the specified matcher has just found a match, and that you want
+ * to get the string with which to replace that match.<p>
+ *
+ * Escapes simply insert the escaped character, except for <code>\n</code>
+ * and <code>\t</code>, which insert a newline and tab respectively.
+ * Substrings of the form <code>$\d+</code> are considered to be matched
+ * groups. To include a literal dollar sign in your template, escape it
+ * (i.e. <code>\$</code>).<p>
+ *
+ * Most clients will have no need to call this method directly.
+ *
+ * @param m The matcher.
+ * @param template The template for the replacement string. For example,
+ * "<code>foo</code>" would yield the replacement string
+ * "<code>foo</code>", while "<code>$1 is the greatest</code>"
+ * would yield different values depending on the value of the first
+ * captured group in the match.
+ * @return The string to replace the match with.
+ * @throws IndexOutOfBoundsException If <code>template</code> references
+ * an invalid group (less than zero or greater than the number of
+ * groups matched).
+ */
+ public static String getReplacementText(Matcher m, CharSequence template) {
+
+ // NOTE: This code was mostly ripped off from J2SE's Matcher
+ // class.
+
+ // Process substitution string to replace group references with groups
+ int cursor = 0;
+ StringBuffer result = new StringBuffer();
+
+ while (cursor < template.length()) {
+
+ char nextChar = template.charAt(cursor);
+
+ if (nextChar == '\\') { // Escape character.
+ nextChar = template.charAt(++cursor);
+ switch (nextChar) { // Special cases.
+ case 'n':
+ nextChar = '\n';
+ break;
+ case 't':
+ nextChar = '\t';
+ break;
+ }
+ result.append(nextChar);
+ cursor++;
+ }
+ else if (nextChar == '$') { // Group reference.
+
+ cursor++; // Skip the '$'.
+
+ // The first number is always a group
+ int refNum = template.charAt(cursor) - '0';
+ if ((refNum < 0)||(refNum > 9)) {
+ // This should really be an IllegalArgumentException,
+ // but we cheat to keep all "group" errors throwing
+ // the same exception type.
+ throw new IndexOutOfBoundsException(
+ "No group " + template.charAt(cursor));
+ }
+ cursor++;
+
+ // Capture the largest legal group string
+ boolean done = false;
+ while (!done) {
+ if (cursor >= template.length()) {
+ break;
+ }
+ int nextDigit = template.charAt(cursor) - '0';
+ if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
+ break;
+ }
+ int newRefNum = (refNum * 10) + nextDigit;
+ if (m.groupCount() < newRefNum) {
+ done = true;
+ }
+ else {
+ refNum = newRefNum;
+ cursor++;
+ }
+ }
+
+ // Append group
+ if (m.group(refNum) != null)
+ result.append(m.group(refNum));
+
+ }
+
+ else {
+ result.append(nextChar);
+ cursor++;
+ }
+
+ }
+
+ return result.toString();
+
+ }
+
+
+ /**
+ * Returns whether the characters on either side of
+ * <code>substr(searchIn, startPos, startPos+searchStringLength)</code>
+ * are <em>not</em> letters or digits.
+ */
+ private static final boolean isWholeWord(CharSequence searchIn,
+ int offset, int len) {
+
+ boolean wsBefore, wsAfter;
+
+ try {
+ wsBefore = !Character.isLetterOrDigit(searchIn.charAt(offset - 1));
+ } catch (IndexOutOfBoundsException e) { wsBefore = true; }
+ try {
+ wsAfter = !Character.isLetterOrDigit(searchIn.charAt(offset + len));
+ } catch (IndexOutOfBoundsException e) { wsAfter = true; }
+
+ return wsBefore && wsAfter;
+
+ }
+
+
+ /**
+ * Makes the caret's dot and mark the same location so that, for the
+ * next search in the specified direction, a match will be found even
+ * if it was within the original dot and mark's selection.
+ *
+ * @param textArea The text area.
+ * @param forward Whether the search will be forward through the
+ * document (<code>false</code> means backward).
+ * @return The new dot and mark position.
+ */
+ private static int makeMarkAndDotEqual(JTextArea textArea,
+ boolean forward) {
+ Caret c = textArea.getCaret();
+ int val = forward ? Math.min(c.getDot(), c.getMark()) :
+ Math.max(c.getDot(), c.getMark());
+ c.setDot(val);
+ return val;
+ }
+
+
+ /**
+ * Finds the next instance of the regular expression specified from
+ * the caret position. If a match is found, it is replaced with
+ * the specified replacement string.
+ *
+ * @param textArea The text area in which to search.
+ * @param context What to search for and all search options.
+ * @return Whether a match was found (and thus replaced).
+ * @throws PatternSyntaxException If this is a regular expression search
+ * but the search text is an invalid regular expression.
+ * @throws IndexOutOfBoundsException If this is a regular expression search
+ * but the replacement text references an invalid group (less than
+ * zero or greater than the number of groups matched).
+ * @see #replace(RTextArea, SearchContext)
+ * @see #find(JTextArea, SearchContext)
+ */
+ private static boolean regexReplace(RTextArea textArea,
+ SearchContext context) throws PatternSyntaxException {
+
+ // Be smart about what position we're "starting" at. For example,
+ // if they are searching backwards and there is a selection such that
+ // the dot is past the mark, and the selection is the text for which
+ // you're searching, this search will find and return the current
+ // selection. So, in that case we start at the beginning of the
+ // selection.
+ Caret c = textArea.getCaret();
+ boolean forward = context.getSearchForward();
+ int start = makeMarkAndDotEqual(textArea, forward);
+
+ CharSequence findIn = getFindInCharSequence(textArea, start, forward);
+ if (findIn==null) return false;
+
+ // Find the next location of the text we're searching for.
+ RegExReplaceInfo info = getRegExReplaceInfo(findIn, context);
+
+ findIn = null; // May help garbage collecting.
+
+ // If a match was found, do the replace and return!
+ if (info!=null) {
+
+ // Without this, if JTextArea isn't in focus, selection won't
+ // appear selected.
+ c.setSelectionVisible(true);
+
+ int matchStart = info.getStartIndex();
+ int matchEnd = info.getEndIndex();
+ if (forward) {
+ matchStart += start;
+ matchEnd += start;
+ }
+ selectAndPossiblyCenter(textArea, matchStart, matchEnd);
+ textArea.replaceSelection(info.getReplacement());
+
+ return true;
+
+ }
+
+ // No match.
+ return false;
+
+ }
+
+
+ /**
+ * Finds the next instance of the text/regular expression specified from
+ * the caret position. If a match is found, it is replaced with the
+ * specified replacement string.
+ *
+ * @param textArea The text area in which to search.
+ * @param context What to search for and all search options.
+ * @return Whether a match was found (and thus replaced).
+ * @throws PatternSyntaxException If this is a regular expression search
+ * but the search text is an invalid regular expression.
+ * @throws IndexOutOfBoundsException If this is a regular expression search
+ * but the replacement text references an invalid group (less than
+ * zero or greater than the number of groups matched).
+ * @see #replaceAll(RTextArea, SearchContext)
+ * @see #find(JTextArea, SearchContext)
+ */
+ public static boolean replace(RTextArea textArea, SearchContext context)
+ throws PatternSyntaxException {
+
+ String toFind = context.getSearchFor();
+ if (toFind==null || toFind.length()==0) {
+ return false;
+ }
+
+ textArea.beginAtomicEdit();
+ try {
+
+ // Regular expression replacements have their own method.
+ if (context.isRegularExpression()) {
+ return regexReplace(textArea, context);
+ }
+
+ // Plain text search. If we find it, replace it!
+ // First make the dot and mark equal (get rid of any selection), as
+ // a common use-case is the user will use "Find" to select the text
+ // to replace, then click "Replace" to replace the current
+ // selection. Since our find() method searches from an endpoint of
+ // the selection, we must remove the selection to work properly.
+ makeMarkAndDotEqual(textArea, context.getSearchForward());
+ if (find(textArea, context)) {
+ textArea.replaceSelection(context.getReplaceWith());
+ return true;
+ }
+
+ } finally {
+ textArea.endAtomicEdit();
+ }
+
+ return false;
+
+ }
+
+
+ /**
+ * Replaces all instances of the text/regular expression specified in
+ * the specified document with the specified replacement.
+ *
+ * @param textArea The text area in which to search.
+ * @param context What to search for and all search options.
+ * @return The number of replacements done.
+ * @throws PatternSyntaxException If this is a regular expression search
+ * but the replacement text is an invalid regular expression.
+ * @throws IndexOutOfBoundsException If this is a regular expression search
+ * but the replacement text references an invalid group (less than
+ * zero or greater than the number of groups matched).
+ * @see #replace(RTextArea, SearchContext)
+ * @see #find(JTextArea, SearchContext)
+ */
+ public static int replaceAll(RTextArea textArea, SearchContext context)
+ throws PatternSyntaxException {
+
+ context.setSearchForward(true); // Replace all always searches forward
+ String toFind = context.getSearchFor();
+ if (toFind==null || toFind.length()==0) {
+ return 0;
+ }
+
+ int count = 0;
+
+ textArea.beginAtomicEdit();
+ try {
+ int oldOffs = textArea.getCaretPosition();
+ textArea.setCaretPosition(0);
+ while (SearchEngine.replace(textArea, context)) {
+ count++;
+ }
+ if (count==0) { // If nothing was found, don't move the caret.
+ textArea.setCaretPosition(oldOffs);
+ }
+ } finally {
+ textArea.endAtomicEdit();
+ }
+
+ return count;
+
+ }
+
+
+ /**
+ * Selects a range of text in a text component. If the new selection is
+ * outside of the previous viewable rectangle, then the view is centered
+ * around the new selection.
+ *
+ * @param textArea The text component whose selection is to be centered.
+ * @param start The start of the range to select.
+ * @param end The end of the range to select.
+ */
+ private static void selectAndPossiblyCenter(JTextArea textArea, int start,
+ int end) {
+
+ boolean foldsExpanded = false;
+ if (textArea instanceof RSyntaxTextArea) {
+ RSyntaxTextArea rsta = (RSyntaxTextArea)textArea;
+ FoldManager fm = rsta.getFoldManager();
+ if (fm.isCodeFoldingSupportedAndEnabled()) {
+ foldsExpanded = fm.ensureOffsetNotInClosedFold(start);
+ foldsExpanded |= fm.ensureOffsetNotInClosedFold(end);
+ }
+ }
+
+ textArea.setSelectionStart(start);
+ textArea.setSelectionEnd(end);
+
+ Rectangle r = null;
+ try {
+ r = textArea.modelToView(start);
+ if (r==null) { // Not yet visible; i.e. JUnit tests
+ return;
+ }
+ if (end!=start) {
+ r = r.union(textArea.modelToView(end));
+ }
+ } catch (BadLocationException ble) { // Never happens
+ ble.printStackTrace();
+ textArea.setSelectionStart(start);
+ textArea.setSelectionEnd(end);
+ return;
+ }
+
+ Rectangle visible = textArea.getVisibleRect();
+
+ // If the new selection is already in the view, don't scroll,
+ // as that is visually jarring.
+ if (!foldsExpanded && visible.contains(r)) {
+ textArea.setSelectionStart(start);
+ textArea.setSelectionEnd(end);
+ return;
+ }
+
+ visible.x = r.x - (visible.width - r.width) / 2;
+ visible.y = r.y - (visible.height - r.height) / 2;
+
+ Rectangle bounds = textArea.getBounds();
+ Insets i = textArea.getInsets();
+ bounds.x = i.left;
+ bounds.y = i.top;
+ bounds.width -= i.left + i.right;
+ bounds.height -= i.top + i.bottom;
+
+ if (visible.x < bounds.x) {
+ visible.x = bounds.x;
+ }
+
+ if (visible.x + visible.width > bounds.x + bounds.width) {
+ visible.x = bounds.x + bounds.width - visible.width;
+ }
+
+ if (visible.y < bounds.y) {
+ visible.y = bounds.y;
+ }
+
+ if (visible.y + visible.height > bounds.y + bounds.height) {
+ visible.y = bounds.y + bounds.height - visible.height;
+ }
+
+ textArea.scrollRectToVisible(visible);
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/ToolTipSupplier.java b/src/org/fife/ui/rtextarea/ToolTipSupplier.java
new file mode 100644
index 0000000..3a7b68a
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/ToolTipSupplier.java
@@ -0,0 +1,39 @@
+/*
+ * 02/05/2009
+ *
+ * ToolTipSupplier.java - Can provide tool tips to RTextAreas without the need
+ * for subclassing.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.event.MouseEvent;
+
+
+/**
+ * A <tt>ToolTipSupplier</tt> can create tool tip text for an <tt>RTextArea</tt>
+ * on its behalf. A text area will check its <tt>ToolTipSupplier</tt> for a
+ * tool tip before calling the super class's implementation of
+ * {@link RTextArea#getToolTipText()}. This allows
+ * applications to intercept tool tip events and provide the text for a tool
+ * tip without subclassing <tt>RTextArea</tt>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public interface ToolTipSupplier {
+
+
+ /**
+ * Returns the tool tip text to display for a given mouse event.
+ *
+ * @param textArea The text area.
+ * @param e The mouse event.
+ * @return The tool tip, or <code>null</code> if none.
+ */
+ public String getToolTipText(RTextArea textArea, MouseEvent e);
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java b/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java
new file mode 100644
index 0000000..147c0e3
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java
@@ -0,0 +1,136 @@
+/*
+ * 01/22/2005
+ *
+ * VolatileImageBackgroundPainterStrategy.java - Renders an RTextAreaBase's
+ * background as an image using VolatileImages.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.image.VolatileImage;
+
+
+/**
+ * A strategy for painting the background of an <code>RTextAreaBase</code>
+ * as an image. The image is always stretched to completely fill the
+ * <code>RTextAreaBase</code>.<p>
+ *
+ * A <code>java.awt.image.VolatileImage</code> is used for rendering;
+ * theoretically, this should be the best image format for performance.<p>
+ *
+ * You can set the scaling hint used when stretching/skewing the image
+ * to fit in the <code>RTextAreaBase</code>'s background via the
+ * <code>setScalingHint</code> method, but keep in mind the more
+ * accurate the scaling hint, the less responsive your application will
+ * be when stretching the window (as that's the only time the image's
+ * size is recalculated).
+ *
+ * @author Robert Futrell
+ * @version 0.1
+ * @see org.fife.ui.rtextarea.ImageBackgroundPainterStrategy
+ * @see org.fife.ui.rtextarea.BufferedImageBackgroundPainterStrategy
+ */
+public class VolatileImageBackgroundPainterStrategy
+ extends ImageBackgroundPainterStrategy {
+
+ private VolatileImage bgImage;
+
+
+ /**
+ * Constructor.
+ *
+ * @param ta The text area whose background we'll be painting.
+ */
+ public VolatileImageBackgroundPainterStrategy(RTextAreaBase ta) {
+ super(ta);
+ }
+
+
+ /**
+ * Paints the image at the specified location. This method assumes
+ * scaling has already been done, and simply paints the background
+ * image "as-is."
+ *
+ * @param g The graphics context.
+ * @param x The x-coordinate at which to paint.
+ * @param y The y-coordinate at which to paint.
+ */
+ protected void paintImage(Graphics g, int x, int y) {
+ if (bgImage != null) {
+ do {
+ int rc = bgImage.validate(null);//getGraphicsConfiguration());
+ if (rc==VolatileImage.IMAGE_RESTORED) {
+ // FIXME: If the image needs to be restored are its width
+ // and height still valid?? If not, we'll need to cache
+ // these values...
+ renderImage(bgImage.getWidth(), bgImage.getHeight(),
+ getScalingHint());
+ }
+ g.drawImage(bgImage, x,y, null);
+ } while (bgImage.contentsLost());
+ }
+ }
+
+
+ /**
+ * Renders the image at the proper size into <code>bgImage</code>.
+ * This method assumes that <code>bgImage</code> is not
+ * <code>null</code>.
+ *
+ * @param width The width of the volatile image to render into.
+ * @param height The height of the volatile image to render into.
+ * @param hint The scaling hint to use.
+ */
+ protected void renderImage(int width, int height, int hint) {
+ Image master = getMasterImage();
+ if (master!=null) {
+ do {
+ Image i = master.getScaledInstance(width,height, hint);
+ tracker.addImage(i, 1);
+ try {
+ tracker.waitForID(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ bgImage = null;
+ return;
+ } finally {
+ tracker.removeImage(i, 1);
+ }
+ bgImage.getGraphics().drawImage(i, 0,0, null);
+ tracker.addImage(bgImage, 0);
+ try {
+ tracker.waitForID(0);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ bgImage = null;
+ return;
+ } finally {
+ tracker.removeImage(bgImage, 0);
+ }
+ } while (bgImage.contentsLost());
+ } // End of if (master!=null).
+ else {
+ bgImage = null;
+ }
+ }
+
+
+ /**
+ * Rescales the displayed image to be the specified size.
+ *
+ * @param width The new width of the image.
+ * @param height The new height of the image.
+ * @param hint The scaling hint to use.
+ */
+ protected void rescaleImage(int width, int height, int hint) {
+ bgImage = getRTextAreaBase().createVolatileImage(width, height);
+ if (bgImage!=null)
+ renderImage(width, height, hint);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/rtextarea/package.html b/src/org/fife/ui/rtextarea/package.html
new file mode 100644
index 0000000..69aabdb
--- /dev/null
+++ b/src/org/fife/ui/rtextarea/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ A single-font text editor with many custom features.
+ </body>
+</html>
diff --git a/src/org/fife/util/DynamicIntArray.java b/src/org/fife/util/DynamicIntArray.java
new file mode 100644
index 0000000..df3ce7a
--- /dev/null
+++ b/src/org/fife/util/DynamicIntArray.java
@@ -0,0 +1,423 @@
+/*
+ * 03/26/2004
+ *
+ * DynamicIntArray.java - Similar to an ArrayList, but holds ints instead
+ * of Objects.
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.util;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+
+/**
+ * Similar to a <code>java.util.ArrayList</code>, but specifically for
+ * <code>int</code>s. This is basically an array of integers that resizes
+ * itself (if necessary) when adding new elements.
+ *
+ * @author Robert Futrell
+ * @version 0.8
+ */
+public class DynamicIntArray implements Serializable {
+
+ /**
+ * The actual data.
+ */
+ private int[] data;
+
+ /**
+ * The number of values in the array. Note that this is NOT the
+ * capacity of the array; rather, <code>size <= capacity</code>.
+ */
+ private int size;
+
+
+ /**
+ * Constructs a new array object with an initial capacity of 10.
+ */
+ public DynamicIntArray() {
+ this(10);
+ }
+
+
+ /**
+ * Constructs a new array object with a given initial capacity.
+ *
+ * @param initialCapacity The initial capacity.
+ * @throws IllegalArgumentException If <code>initialCapacity</code> is
+ * negative.
+ */
+ public DynamicIntArray(int initialCapacity) {
+ if (initialCapacity<0) {
+ throw new IllegalArgumentException("Illegal initialCapacity: "
+ + initialCapacity);
+ }
+ data = new int[initialCapacity];
+ size = 0;
+ }
+
+
+ /**
+ * Constructs a new array object from the given int array. The resulting
+ * <code>DynamicIntArray</code> will have an initial capacity of 110%
+ * the size of the array.
+ *
+ * @param intArray Initial data for the array object.
+ * @throws NullPointerException If <code>intArray</code> is
+ * <code>null</code>.
+ */
+ public DynamicIntArray(int[] intArray) {
+ size = intArray.length;
+ int capacity = (int)Math.min(size*110L/100, Integer.MAX_VALUE);
+ data = new int[capacity];
+ System.arraycopy(intArray,0, data,0, size); // source, dest, length.
+ }
+
+
+ /**
+ * Appends the specified <code>int</code> to the end of this array.
+ *
+ * @param value The <code>int</code> to be appended to this array.
+ */
+ public void add(int value) {
+ ensureCapacity(size + 1);
+ data[size++] = value;
+ }
+
+
+ /**
+ * Inserts all <code>int</code>s in the specified array into this array
+ * object at the specified location. Shifts the <code>int</code>
+ * currently at that position (if any) and any subsequent
+ * <code>int</code>s to the right (adds one to their indices).
+ *
+ * @param index The index at which the specified integer is to be
+ * inserted.
+ * @param intArray The array of <code>int</code>s to insert.
+ * @throws IndexOutOfBoundsException If <code>index</code> is less than
+ * zero or greater than <code>getSize()</code>.
+ * @throws NullPointerException If <code>intArray<code> is
+ * <code>null<code>.
+ */
+ public void add(int index, int[] intArray) {
+ if (index>size) {
+ throwException2(index);
+ }
+ int addCount = intArray.length;
+ ensureCapacity(size+addCount);
+ int moveCount = size - index;
+ if (moveCount>0)
+ System.arraycopy(data,index, data,index+addCount, moveCount);
+ System.arraycopy(data,index, intArray,0, moveCount);
+ size += addCount;
+ }
+
+
+ /**
+ * Inserts the specified <code>int</code> at the specified position in
+ * this array. Shifts the <code>int</code> currently at that position (if
+ * any) and any subsequent <code>int</code>s to the right (adds one to
+ * their indices).
+ *
+ * @param index The index at which the specified integer is to be
+ * inserted.
+ * @param value The <code>int</code> to be inserted.
+ * @throws IndexOutOfBoundsException If <code>index</code> is less than
+ * zero or greater than <code>getSize()</code>.
+ */
+ public void add(int index, int value) {
+ if (index>size) {
+ throwException2(index);
+ }
+ ensureCapacity(size+1);
+ System.arraycopy(data,index, data,index+1, size-index);
+ data[index] = value;
+ size++;
+ }
+
+
+ /**
+ * Removes all values from this array object. Capacity will remain the
+ * same.
+ */
+ public void clear() {
+ size = 0;
+ }
+
+
+ /**
+ * Returns whether this array contains a given integer. This method
+ * performs a linear search, so it is not optimized for performance.
+ *
+ * @param integer The <code>int</code> for which to search.
+ * @return Whether the given integer is contained in this array.
+ */
+ public boolean contains(int integer) {
+ for (int i=0; i<size; i++) {
+ if (data[i]==integer)
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Decrements all values in the array in the specified range.
+ *
+ * @param from The range start offset (inclusive).
+ * @param to The range end offset (exclusive).
+ * @see #increment(int, int)
+ */
+ public void decrement(int from, int to) {
+ for (int i=from; i<to; i++) {
+ data[i]--;
+ }
+ }
+
+
+ /**
+ * Makes sure that this <code>DynamicIntArray</code> instance can hold
+ * at least the number of elements specified. If it can't, then the
+ * capacity is increased.
+ *
+ * @param minCapacity The desired minimum capacity.
+ */
+ private final void ensureCapacity(int minCapacity) {
+ int oldCapacity = data.length;
+ if (minCapacity > oldCapacity) {
+ int[] oldData = data;
+ // Ensures we don't just keep increasing capacity by some small
+ // number like 1...
+ int newCapacity = (oldCapacity * 3)/2 + 1;
+ if (newCapacity < minCapacity)
+ newCapacity = minCapacity;
+ data = new int[newCapacity];
+ System.arraycopy(oldData,0, data,0, size);
+ }
+ }
+
+
+ /**
+ * Sets the value of all entries in this array to the specified value.
+ *
+ * @param value The new value for all elements in the array.
+ */
+ public void fill(int value) {
+ Arrays.fill(data, value);
+ }
+
+
+ /**
+ * Returns the <code>int</code> at the specified position in this array
+ * object.
+ *
+ * @param index The index of the <code>int</code> to return.
+ * @return The <code>int</code> at the specified position in this array.
+ * @throws IndexOutOfBoundsException If <code>index</code> is less than
+ * zero or greater than or equal to <code>getSize()</code>.
+ */
+ public int get(int index) {
+ // Small enough to be inlined, and throwException() is rarely called.
+ if (index>=size) {
+ throwException(index);
+ }
+ return data[index];
+ }
+
+
+ /**
+ * Returns the <code>int</code> at the specified position in this array
+ * object, without doing any bounds checking. You really should use
+ * {@link #get(int)} instead of this method.
+ *
+ * @param index The index of the <code>int</code> to return.
+ * @return The <code>int</code> at the specified position in this array.
+ */
+ public int getUnsafe(int index) {
+ // Small enough to be inlined.
+ return data[index];
+ }
+
+
+ /**
+ * Returns the number of <code>int</code>s in this array object.
+ *
+ * @return The number of <code>int</code>s in this array object.
+ */
+ public int getSize() {
+ return size;
+ }
+
+
+ /**
+ * Increments all values in the array in the specified range.
+ *
+ * @param from The range start offset (inclusive).
+ * @param to The range end offset (exclusive).
+ * @see #decrement(int, int)
+ */
+ public void increment(int from, int to) {
+ for (int i=from; i<to; i++) {
+ data[i]++;
+ }
+ }
+
+
+ public void insertRange(int offs, int count, int value) {
+ if (offs>size) {
+ throwException2(offs);
+ }
+ ensureCapacity(size+count);
+ System.arraycopy(data,offs, data,offs+count, size-offs);
+ if (value!=0) {
+ Arrays.fill(data, offs, offs+count, value);
+ }
+ size += count;
+ }
+
+
+ /**
+ * Returns whether or not this array object is empty.
+ *
+ * @return Whether or not this array object contains no elements.
+ */
+ public boolean isEmpty() {
+ return size==0;
+ }
+
+
+ /**
+ * Removes the <code>int</code> at the specified location from this array
+ * object.
+ *
+ * @param index The index of the <code>int</code> to remove.
+ * @throws IndexOutOfBoundsException If <code>index</code> is less than
+ * zero or greater than or equal to <code>getSize()</code>.
+ */
+ public void remove(int index) {
+ if (index>=size) {
+ throwException(index);
+ }
+ int toMove = size - index - 1;
+ if (toMove>0) {
+ System.arraycopy(data,index+1, data,index, toMove);
+ }
+ --size;
+ }
+
+
+ /**
+ * Removes the <code>int</code>s in the specified range from this array
+ * object.
+ *
+ * @param fromIndex The index of the first <code>int</code> to remove.
+ * @param toIndex The index AFTER the last <code>int</code> to remove.
+ * @throws IndexOutOfBoundsException If either of <code>fromIndex</code>
+ * or <code>toIndex</code> is less than zero or greater than or
+ * equal to <code>getSize()</code>.
+ */
+ public void removeRange(int fromIndex, int toIndex) {
+ if (fromIndex>=size || toIndex>size) {
+ throwException3(fromIndex, toIndex);
+ }
+ int moveCount = size - toIndex;
+ System.arraycopy(data,toIndex, data,fromIndex, moveCount);
+ size -= (toIndex - fromIndex);
+ }
+
+
+ /**
+ * Sets the <code>int</code> value at the specified position in this
+ * array object.
+ *
+ * @param index The index of the <code>int</code> to set
+ * @param value The value to set it to.
+ * @throws IndexOutOfBoundsException If <code>index</code> is less than
+ * zero or greater than or equal to <code>getSize()</code>.
+ */
+ public void set(int index, int value) {
+ // Small enough to be inlined, and throwException() is rarely called.
+ if (index>=size) {
+ throwException(index);
+ }
+ data[index] = value;
+ }
+
+
+ /**
+ * Sets the <code>int</code> value at the specified position in this
+ * array object, without doing any bounds checking. You should use
+ * {@link #set(int, int)} instead of this method.
+ *
+ * @param index The index of the <code>int</code> to set
+ * @param value The value to set it to.
+ */
+ public void setUnsafe(int index, int value) {
+ // Small enough to be inlined.
+ data[index] = value;
+ }
+
+
+ /**
+ * Throws an exception. This method isolates error-handling code from
+ * the error-checking code, so that callers (e.g. {@link #get} and
+ * {@link #set}) can be both small enough to be inlined, as well as
+ * not usually make any expensive method calls (since their callers will
+ * usually not pass illegal arguments to them).
+ *
+ * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+ * this Sun bug report</a> for more information.
+ *
+ * @param index The invalid index.
+ * @throws IndexOutOfBoundsException Always.
+ */
+ private final void throwException(int index)
+ throws IndexOutOfBoundsException {
+ throw new IndexOutOfBoundsException("Index " + index +
+ " not in valid range [0-" + (size-1) + "]");
+ }
+
+
+ /**
+ * Throws an exception. This method isolates error-handling code from
+ * the error-checking code, so that callers can be both small enough to be
+ * inlined, as well as not usually make any expensive method calls (since
+ * their callers will usually not pass illegal arguments to them).
+ *
+ * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+ * this Sun bug report</a> for more information.
+ *
+ * @param index The invalid index.
+ * @throws IndexOutOfBoundsException Always.
+ */
+ private final void throwException2(int index)
+ throws IndexOutOfBoundsException {
+ throw new IndexOutOfBoundsException("Index " + index +
+ ", not in range [0-" + size + "]");
+ }
+
+
+ /**
+ * Throws an exception. This method isolates error-handling code from
+ * the error-checking code, so that callers can be both small enough to be
+ * inlined, as well as not usually make any expensive method calls (since
+ * their callers will usually not pass illegal arguments to them).
+ *
+ * See <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956">
+ * this Sun bug report</a> for more information.
+ *
+ * @param index The invalid index.
+ * @throws IndexOutOfBoundsException Always.
+ */
+ private final void throwException3(int fromIndex, int toIndex)
+ throws IndexOutOfBoundsException {
+ throw new IndexOutOfBoundsException("Index range [" +
+ fromIndex + ", " + toIndex +
+ "] not in valid range [0-" + (size-1) + "]");
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/util/package.html b/src/org/fife/util/package.html
new file mode 100644
index 0000000..5a25a9d
--- /dev/null
+++ b/src/org/fife/util/package.html
@@ -0,0 +1,5 @@
+<html>
+ <body>
+ General utility classes.
+ </body>
+</html>
diff --git a/src/theme.dtd b/src/theme.dtd
new file mode 100644
index 0000000..a801939
--- /dev/null
+++ b/src/theme.dtd
@@ -0,0 +1,78 @@
+<!-- DTD for RSyntaxTextArea Theme XML. See /themes folder for examples. -->
+<!ELEMENT RSyntaxTheme (baseFont?, background, caret, selection,
+ currentLineHighlight, marginLine, markAllHighlight, markOccurrencesHighlight,
+ matchedBracket, hyperlinks, secondaryLanguages, gutterBorder, lineNumbers,
+ foldIndicator, iconRowHeader, tokenStyles)>
+<!ELEMENT background EMPTY>
+<!ELEMENT baseFont EMPTY>
+<!ELEMENT caret EMPTY>
+<!ELEMENT selection EMPTY>
+<!ELEMENT currentLineHighlight EMPTY>
+<!ELEMENT marginLine EMPTY>
+<!ELEMENT markAllHighlight EMPTY>
+<!ELEMENT markOccurrencesHighlight EMPTY>
+<!ELEMENT matchedBracket EMPTY>
+<!ELEMENT hyperlinks EMPTY>
+<!ELEMENT secondaryLanguages (language+)>
+<!ELEMENT language EMPTY>
+<!ELEMENT gutterBorder EMPTY>
+<!ELEMENT lineNumbers EMPTY>
+<!ELEMENT foldIndicator EMPTY>
+<!ELEMENT iconRowHeader EMPTY>
+<!ELEMENT tokenStyles (style+)>
+<!ELEMENT style EMPTY>
+
+<!ATTLIST RSyntaxTheme
+ version CDATA #REQUIRED>
+<!ATTLIST background
+ color CDATA #REQUIRED>
+<!ATTLIST baseFont
+ family CDATA #IMPLIED
+ size CDATA #IMPLIED>
+<!ATTLIST caret
+ color CDATA #REQUIRED>
+<!ATTLIST selection
+ fg CDATA #IMPLIED
+ useFG (true|false) "true"
+ bg CDATA #REQUIRED
+ roundedEdges (true|false) "false">
+<!ATTLIST currentLineHighlight
+ color CDATA #REQUIRED
+ fade (true|false) "false">
+<!ATTLIST marginLine
+ fg CDATA #REQUIRED>
+<!ATTLIST markAllHighlight
+ color CDATA #REQUIRED>
+<!ATTLIST markOccurrencesHighlight
+ color CDATA #REQUIRED
+ border (true|false) "false">
+<!ATTLIST matchedBracket
+ fg CDATA #REQUIRED
+ bg CDATA #IMPLIED
+ highlightBoth (true|false) "false"
+ animate (true|false) "false">
+<!ATTLIST hyperlinks
+ fg CDATA #REQUIRED>
+<!ATTLIST language
+ index (1|2|3) #REQUIRED
+ bg CDATA #REQUIRED>
+<!ATTLIST gutterBorder
+ color CDATA #REQUIRED>
+<!ATTLIST lineNumbers
+ fg CDATA #REQUIRED
+ fontFamily CDATA #IMPLIED
+ fontSize CDATA #IMPLIED>
+<!ATTLIST foldIndicator
+ fg CDATA #REQUIRED
+ iconBg CDATA #REQUIRED>
+<!ATTLIST iconRowHeader
+ activeLineRange CDATA #REQUIRED>
+<!ATTLIST style
+ token CDATA #REQUIRED
+ fg CDATA #IMPLIED
+ bg CDATA #IMPLIED
+ fontFamily CDATA #IMPLIED
+ fontSize CDATA #IMPLIED
+ bold (true|false) "false"
+ italic (true|false) "false"
+ underline (true|false) "false">
diff --git a/test/org/fife/ui/rtextarea/SearchEngineTest.java b/test/org/fife/ui/rtextarea/SearchEngineTest.java
new file mode 100644
index 0000000..8a29693
--- /dev/null
+++ b/test/org/fife/ui/rtextarea/SearchEngineTest.java
@@ -0,0 +1,647 @@
+/*
+ * 05/12/2010
+ *
+ * SearchEngineTest.java - Test cases for SearchEngine.java
+ *
+ * This library is distributed under a modified BSD license. See the included
+ * RSyntaxTextArea.License.txt file for details.
+ */
+package org.fife.ui.rtextarea;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import javax.swing.text.BadLocationException;
+
+import junit.framework.TestCase;
+
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rtextarea.SearchEngine;
+
+/**
+ * Some very basic unit tests for the {@link SearchEngine} used by
+ * <code>RTextArea</code>/<code>RSyntaxTextArea</code>.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+public class SearchEngineTest extends TestCase {
+
+ private RSyntaxTextArea textArea = new RSyntaxTextArea();
+
+ private static String text;
+
+
+ /**
+ * Asserts that two strings are equal, ignoring case.
+ *
+ * @param expected
+ * @param actual
+ */
+ private void assertEqualsIgnoreCase(String expected, String actual) {
+ expected = expected != null ? expected.toLowerCase() : null;
+ actual = actual != null ? actual.toLowerCase() : null;
+ assertEquals(expected, actual);
+ }
+
+
+ /**
+ * Asserts that the text area's selection is at the expected location and
+ * has the expected value.
+ *
+ * @param expected
+ * @param offs
+ * @param matchCase
+ */
+ private void assertSelected(String expected, int offs, boolean matchCase) {
+ String actual = textArea.getSelectedText();
+ if (matchCase) {
+ assertEquals(expected, actual);
+ } else {
+ assertEqualsIgnoreCase(expected, actual);
+ }
+ int selOffs = textArea.getSelectionStart();
+ assertEquals("unexpected selection offset: ", offs, selOffs);
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void setUp() throws Exception {
+
+ // setUp() is called once per test, each with a new instantiation of
+ // SearchEngineTest, so check a static variable to ensure that
+ // initialization is only done once.
+
+ if (text == null || text.length() <= 0) {
+
+ StringBuffer sb = new StringBuffer();
+ InputStream in = getClass().getResourceAsStream("text.txt");
+ BufferedReader br = new BufferedReader(new InputStreamReader(in));
+ String s = null;
+ try {
+ while ((s=br.readLine())!=null) {
+ sb.append(s).append("\n");
+ }
+ } finally {
+ br.close();
+ }
+
+ // Strip off last newline
+ text = sb.toString().substring(0, sb.length()-1);
+
+ }
+
+ super.setUp();
+
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.find()</code> when searching backward.
+ */
+ public void testSearchEngineFindBackward() throws BadLocationException {
+
+ textArea.setText(text);
+
+ int end = text.length();
+ SearchContext context = new SearchContext();
+ context.setSearchForward(false);
+
+ // Search for "chuck", ignoring case.
+ context.setSearchFor("chuck");
+ context.setMatchCase(false);
+ textArea.setCaretPosition(end);
+ boolean found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 48, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 26, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "Chuck", matching case.
+ context.setSearchFor("Chuck");
+ context.setMatchCase(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("Chuck", 26, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "chuck", ignoring case, whole word
+ context.setSearchFor("Chuck");
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "wood", matching case, whole word
+ context.setSearchFor("wood");
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("wood", 9, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for ".ould", regex, ignoring case
+ context.setSearchFor(".ould");
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("could", 54, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("wOuld", 14, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for ".ould", regex, matching case
+ context.setSearchFor(".ould");
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("could", 54, true);
+ found = SearchEngine.find(textArea,context);
+ assertEquals(false, found);
+
+ // Search for "[cd]huck", regex, ignoring case, whole word
+ context.setSearchFor("[cd]hUCk");
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "[cd]huck", regex, matching case, whole word
+ context.setSearchFor("[cd]huck");
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(end);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.find()</code> when searching forward.
+ */
+ public void testSearchEngineFindForward() throws BadLocationException {
+
+ textArea.setText(text);
+
+ SearchContext context = new SearchContext();
+
+ // Search for "chuck", ignoring case.
+ context.setSearchFor("chuck");
+ boolean found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 26, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 48, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "Chuck", matching case.
+ context.setSearchFor("Chuck");
+ context.setMatchCase(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("Chuck", 26, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "chuck", ignoring case, whole word
+ context.setSearchFor("chuck");
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "wood", matching case, whole word
+ context.setSearchFor("wood");
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("wood", 9, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for ".ould", regex, ignoring case
+ context.setSearchFor(".ould");
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("wOuld", 14, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("could", 54, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for ".ould", regex, matching case
+ context.setSearchFor(".ould");
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("could", 54, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "[cd]huck", regex, ignoring case, whole word
+ context.setSearchFor("[cd]hUCk");
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 32, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, context.getMatchCase());
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ // Search for "[cd]huck", regex, matching case, whole word
+ context.setSearchFor("[cd]huck");
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(0);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(true, found);
+ assertSelected("chuck", 60, true);
+ found = SearchEngine.find(textArea, context);
+ assertEquals(false, found);
+
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.replace()</code>.
+ *
+ * @param forward Whether to test searching forward or backward.
+ */
+ private void testSearchEngineReplace(boolean forward)
+ throws BadLocationException {
+
+ int offs = forward ? 0 : text.length();
+ SearchContext context = new SearchContext();
+ context.setSearchForward(forward);
+ context.setReplaceWith("FOOBAR");
+
+ // Search for "chuck", ignoring case.
+ context.setSearchFor("chuck");
+ textArea.setText(text);
+ String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() + ")", context.getReplaceWith());
+ textArea.setCaretPosition(offs);
+ boolean found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for "chuck", matching case.
+ context.setSearchFor("chuck");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(false);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for "chuck", ignoring case, whole word.
+ context.setSearchFor("chuck");
+ textArea.setText(text);
+ expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(false);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for "chuck", matching case, whole word.
+ context.setSearchFor("chuck");
+ textArea.setText(text);
+ expected = "How much wood wOuld a woodChuck chUck, if a woodchuck could FOOBAR wOod?";
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ context.setRegularExpression(false);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for ".huck", regex, ignoring case
+ context.setSearchFor(".huck");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() + ")", context.getReplaceWith());
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for ".huck", regex, matching case
+ context.setSearchFor(".huck");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for "[cd]huck", regex, ignoring case, whole word
+ context.setSearchFor("[cd]huck");
+ textArea.setText(text);
+ expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could FOOBAR wOod?";
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ // Search for "[cd]hUck", regex, matching case, whole word
+ context.setSearchFor("[cd]hUck");
+ textArea.setText(text);
+ expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ textArea.setCaretPosition(offs);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(true, found);
+ found = SearchEngine.replace(textArea, context);
+ assertEquals(false, found);
+ assertEquals(expected, textArea.getText());
+
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.replace()</code> when searching backward.
+ */
+ public void testSearchEngineReplaceBackward() throws BadLocationException {
+ testSearchEngineReplace(false);
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.replace()</code> when searching forward.
+ */
+ public void testSearchEngineReplaceForward() throws BadLocationException {
+ testSearchEngineReplace(true);
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.replaceAll()</code>.
+ */
+ public void testSearchEngineReplaceAll() throws BadLocationException {
+
+ SearchContext context = new SearchContext();
+ context.setReplaceWith("FOOBAR");
+
+ // Replace "chuck", ignoring case.
+ context.setSearchFor("chuck");
+ textArea.setText(text);
+ String expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() + ")", context.getReplaceWith());
+ int count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(4, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wood", matching case.
+ context.setSearchFor("wood");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(false);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(3, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wood", ignoring case, whole word.
+ context.setSearchFor("wood");
+ textArea.setText(text);
+ expected = "How much FOOBAR wOuld a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(false);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(2, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "chUck", matching case, whole word.
+ context.setSearchFor("chUck");
+ textArea.setText(text);
+ expected = "How much wood wOuld a woodChuck FOOBAR, if a woodchuck could chuck wOod?";
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ context.setRegularExpression(false);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(1, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wo(?:o|ul)d", regex, ignoring case.
+ context.setSearchFor("wo(?:o|ul)d");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll("(?i:" + context.getSearchFor() + ")", context.getReplaceWith());
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(5, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wo(?:o|ul)d", regex, matching case.
+ context.setSearchFor("wo(?:o|ul)d");
+ textArea.setText(text);
+ expected = textArea.getText().replaceAll(context.getSearchFor(), context.getReplaceWith());
+ context.setMatchCase(true);
+ context.setWholeWord(false);
+ context.setRegularExpression(true);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(3, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wo(?:o|ul)d", regex, ignoring case, whole word
+ context.setSearchFor("wo(?:o|ul)d");
+ textArea.setText(text);
+ expected = "How much FOOBAR FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+ context.setMatchCase(false);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(3, count);
+ assertEquals(expected, textArea.getText());
+
+ // Replace "wO(?:o|ul)d", regex, matching case, whole word
+ context.setSearchFor("wO(?:o|ul)d");
+ textArea.setText(text);
+ expected = "How much wood FOOBAR a woodChuck chUck, if a woodchuck could chuck FOOBAR?";
+ context.setMatchCase(true);
+ context.setWholeWord(true);
+ context.setRegularExpression(true);
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(2, count);
+ assertEquals(expected, textArea.getText());
+
+ }
+
+
+ /**
+ * Tests <code>SearchEngine.replaceAll()</code> when the replacement string
+ * has captured groups.
+ */
+ public void testSearchEngineRegexReplaceAllWithCapturedGroups() throws BadLocationException {
+
+ SearchContext context = new SearchContext();
+ context.setRegularExpression(true);
+
+ // A single captured group.
+ context.setSearchFor("r(o+)t");
+ textArea.setText("root roOt root");
+ String expected = "oo oO oo";
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setReplaceWith("$1");
+ int count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(3, count);
+ assertEquals(expected, textArea.getText());
+
+ // Multiple captured groups.
+ context.setSearchFor("(\\d)(\\d+)[kM]");
+ textArea.setText("152k 5271143M 3985k");
+ expected = "1.52 5.271143 3.985";
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setReplaceWith("$1.$2");
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(3, count);
+ assertEquals(expected, textArea.getText());
+
+ // No matches
+ context.setSearchFor("(\\d)(\\d+)ABC");
+ expected = "152k 5271143M 3985k";
+ textArea.setText(expected);
+ textArea.setCaretPosition(8);
+ context.setMatchCase(false);
+ context.setWholeWord(false);
+ context.setReplaceWith("$1.$2");
+ count = SearchEngine.replaceAll(textArea, context);
+ assertEquals(0, count);
+ assertEquals(expected, textArea.getText());
+ assertEquals(8, textArea.getCaretPosition()); // Caret doesn't move
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/test/org/fife/ui/rtextarea/text.txt b/test/org/fife/ui/rtextarea/text.txt
new file mode 100644
index 0000000..e1a2e9e
--- /dev/null
+++ b/test/org/fife/ui/rtextarea/text.txt
@@ -0,0 +1 @@
+How much wood wOuld a woodChuck chUck, if a woodchuck could chuck wOod?
\ No newline at end of file
diff --git a/themes/dark.xml b/themes/dark.xml
new file mode 100644
index 0000000..9b51fbc
--- /dev/null
+++ b/themes/dark.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ Dark theme based off of Notepad++'s Obsidian theme.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="293134"/>
+ <caret color="c1cbc2"/>
+ <selection useFG="false" bg="404E51" roundedEdges="false"/>
+ <currentLineHighlight color="2F393C" fade="false"/>
+ <marginLine fg="394448"/>
+ <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+ <markOccurrencesHighlight color="5b7179" border="false"/>
+ <matchedBracket fg="6A8088" bg="6b8189" highlightBoth="false" animate="true"/>
+ <hyperlinks fg="a082bd"/>
+ <secondaryLanguages>
+ <language index="1" bg="334455"/>
+ <language index="2" bg="223322"/>
+ <language index="3" bg="ffe0f0"/>
+ </secondaryLanguages>
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="81969A"/>
+ <lineNumbers fg="81969A"/>
+ <foldIndicator fg="6A8088" iconBg="2f383c"/>
+ <iconRowHeader activeLineRange="3399ff"/>
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="E0E2E4"/>
+ <style token="RESERVED_WORD" fg="93C763" bold="true"/>
+ <style token="RESERVED_WORD_2" fg="93C763" bold="true"/>
+ <style token="ANNOTATION" fg="E8E2B7"/>
+ <style token="COMMENT_DOCUMENTATION" fg="6C788C"/>
+ <style token="COMMENT_EOL" fg="66747B"/>
+ <style token="COMMENT_MULTILINE" fg="66747B"/>
+ <style token="COMMENT_KEYWORD" fg="ae9fbf"/>
+ <style token="COMMENT_MARKUP" fg="ae9fbf"/>
+ <style token="FUNCTION" fg="E0E2E4"/>
+ <style token="DATA_TYPE" fg="678CB1" bold="true"/>
+ <style token="LITERAL_BOOLEAN" fg="93C763" bold="true"/>
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="FFCD22"/>
+ <style token="LITERAL_NUMBER_FLOAT" fg="FFCD22"/>
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="FFCD22"/>
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="EC7600"/>
+ <style token="LITERAL_CHAR" fg="EC7600"/>
+ <style token="LITERAL_BACKQUOTE" fg="EC7600"/>
+ <style token="MARKUP_TAG_DELIMITER" fg="678CB1"/>
+ <style token="MARKUP_TAG_NAME" fg="ABBFD3" bold="true"/>
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="B3B689"/>
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="e1e2cf"/>
+ <style token="MARKUP_COMMENT" fg="66747B"/>
+ <style token="MARKUP_DTD" fg="A082BD"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="A082BD"/>
+ <style token="MARKUP_CDATA" fg="d5e6f0"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="ae9fbf"/>
+ <style token="MARKUP_ENTITY_REFERENCE" fg="678CB1"/>
+ <style token="OPERATOR" fg="E8E2B7"/>
+ <style token="PREPROCESSOR" fg="A082BD"/>
+ <style token="REGEX" fg="d39745"/>
+ <style token="SEPARATOR" fg="E8E2B7"/>
+ <style token="VARIABLE" fg="ae9fbf" bold="true"/>
+ <style token="WHITESPACE" fg="E0E2E4"/>
+
+ <style token="ERROR_IDENTIFIER" fg="E0E2E4" bg="04790e"/>
+ <style token="ERROR_NUMBER_FORMAT" fg="E0E2E4" bg="04790e"/>
+ <style token="ERROR_STRING_DOUBLE" fg="E0E2E4" bg="04790e"/>
+ <style token="ERROR_CHAR" fg="E0E2E4" bg="04790e"/>
+ </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/default-alt.xml b/themes/default-alt.xml
new file mode 100644
index 0000000..24ac97c
--- /dev/null
+++ b/themes/default-alt.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ RSyntaxTextArea's default theme, using the "standard" selection style.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="ffffff"/>
+ <caret color="ff0000"/>
+ <selection fg="default" bg="default"/>
+ <currentLineHighlight color="ffffaa" fade="false"/>
+ <marginLine fg="b0b4b9"/>
+ <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+ <markOccurrencesHighlight color="d4d4d4" border="false"/>
+ <matchedBracket fg="000080" bg="eaeaff" highlightBoth="false" animate="true"/>
+ <hyperlinks fg="0000ff"/>
+ <secondaryLanguages>
+ <language index="1" bg="fff0cc"/>
+ <language index="2" bg="dafeda"/>
+ <language index="3" bg="ffe0f0"/>
+ </secondaryLanguages>
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="dddddd"/>
+ <lineNumbers fg="787878"/>
+ <foldIndicator fg="808080" iconBg="ffffff"/>
+ <iconRowHeader activeLineRange="3399ff"/>
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="000000"/>
+ <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+ <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+ <style token="ANNOTATION" fg="808080"/>
+ <style token="COMMENT_DOCUMENTATION" fg="a40000" italic="true"/>
+ <style token="COMMENT_EOL" fg="008000" italic="true"/>
+ <style token="COMMENT_MULTILINE" fg="008000" italic="true"/>
+ <style token="COMMENT_KEYWORD" fg="ff9900" bold="true"/>
+ <style token="COMMENT_MARKUP" fg="808080"/>
+ <style token="DATA_TYPE" fg="008080" bold="true"/>
+ <style token="FUNCTION" fg="ad8000"/>
+ <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="6400C8"/>
+ <style token="LITERAL_NUMBER_FLOAT" fg="6400C8"/>
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="6400C8"/>
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="DC009C"/>
+ <style token="LITERAL_CHAR" fg="DC009C"/>
+ <style token="LITERAL_BACKQUOTE" fg="DC009C"/>
+ <style token="MARKUP_TAG_DELIMITER" fg="ff0000"/>
+ <style token="MARKUP_TAG_NAME" fg="0000ff"/>
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="3f7f7f"/>
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="DC009C"/>
+ <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+ <style token="MARKUP_DTD" fg="ad8000"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+ <style token="MARKUP_CDATA" fg="cc6600"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+ <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+ <style token="OPERATOR" fg="804040"/>
+ <style token="PREPROCESSOR" fg="808080"/>
+ <style token="REGEX" fg="008040"/>
+ <style token="SEPARATOR" fg="ff0000"/>
+ <style token="VARIABLE" fg="ee8800" bold="true"/>
+ <style token="WHITESPACE" fg="000000"/>
+
+ <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+ </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/default.xml b/themes/default.xml
new file mode 100644
index 0000000..3a3bbfd
--- /dev/null
+++ b/themes/default.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ RSyntaxTextArea's default theme.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="ffffff"/>
+ <caret color="ff0000"/>
+ <selection fg="default" useFG="false" bg="c8c8ff"/>
+ <currentLineHighlight color="ffffaa" fade="false"/>
+ <marginLine fg="b0b4b9"/>
+ <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+ <markOccurrencesHighlight color="d4d4d4" border="false"/>
+ <matchedBracket fg="000080" bg="eaeaff" highlightBoth="false" animate="true"/>
+ <hyperlinks fg="0000ff"/>
+ <secondaryLanguages>
+ <language index="1" bg="fff0cc"/>
+ <language index="2" bg="dafeda"/>
+ <language index="3" bg="ffe0f0"/>
+ </secondaryLanguages>
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="dddddd"/>
+ <lineNumbers fg="787878"/>
+ <foldIndicator fg="808080" iconBg="ffffff"/>
+ <iconRowHeader activeLineRange="3399ff"/>
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="000000"/>
+ <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+ <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+ <style token="ANNOTATION" fg="808080"/>
+ <style token="COMMENT_DOCUMENTATION" fg="a40000" italic="true"/>
+ <style token="COMMENT_EOL" fg="008000" italic="true"/>
+ <style token="COMMENT_MULTILINE" fg="008000" italic="true"/>
+ <style token="COMMENT_KEYWORD" fg="ff9900" bold="true"/>
+ <style token="COMMENT_MARKUP" fg="808080"/>
+ <style token="DATA_TYPE" fg="008080" bold="true"/>
+ <style token="FUNCTION" fg="ad8000"/>
+ <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="6400C8"/>
+ <style token="LITERAL_NUMBER_FLOAT" fg="6400C8"/>
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="6400C8"/>
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="DC009C"/>
+ <style token="LITERAL_CHAR" fg="DC009C"/>
+ <style token="LITERAL_BACKQUOTE" fg="DC009C"/>
+ <style token="MARKUP_TAG_DELIMITER" fg="ff0000"/>
+ <style token="MARKUP_TAG_NAME" fg="0000ff"/>
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="3f7f7f"/>
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="DC009C"/>
+ <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+ <style token="MARKUP_DTD" fg="ad8000"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+ <style token="MARKUP_CDATA" fg="cc6600"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+ <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+ <style token="OPERATOR" fg="804040"/>
+ <style token="PREPROCESSOR" fg="808080"/>
+ <style token="REGEX" fg="008040"/>
+ <style token="SEPARATOR" fg="ff0000"/>
+ <style token="VARIABLE" fg="ee8800" bold="true"/>
+ <style token="WHITESPACE" fg="000000"/>
+
+ <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+ </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/eclipse.xml b/themes/eclipse.xml
new file mode 100644
index 0000000..1196f80
--- /dev/null
+++ b/themes/eclipse.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ Theme that mimics Eclipse's defaults.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="ffffff"/>
+ <caret color="000000"/>
+ <selection bg="default" fg="default"/>
+ <currentLineHighlight color="e8f2fe" fade="false"/>
+ <marginLine fg="b0b4b9"/>
+ <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+ <markOccurrencesHighlight color="d4d4d4" border="false"/>
+ <matchedBracket fg="c0c0c0" highlightBoth="false" animate="false"/>
+ <hyperlinks fg="0000ff"/>
+ <secondaryLanguages>
+ <language index="1" bg="fff0cc"/>
+ <language index="2" bg="dafeda"/>
+ <language index="3" bg="ffe0f0"/>
+ </secondaryLanguages>
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="dddddd"/>
+ <lineNumbers fg="787878"/>
+ <foldIndicator fg="808080" iconBg="ffffff"/>
+ <iconRowHeader activeLineRange="3399ff"/>
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="000000"/>
+ <style token="RESERVED_WORD" fg="7f0055" bold="true"/>
+ <style token="RESERVED_WORD_2" fg="7f0055" bold="true"/>
+ <style token="ANNOTATION" fg="808080"/>
+ <style token="COMMENT_DOCUMENTATION" fg="3f5fbf"/>
+ <style token="COMMENT_EOL" fg="3f7f5f"/>
+ <style token="COMMENT_MULTILINE" fg="3f7f5f"/>
+ <style token="COMMENT_KEYWORD" fg="7F9FBF" bold="true"/>
+ <style token="COMMENT_MARKUP" fg="7f7f9f"/>
+ <style token="DATA_TYPE" fg="7f0055" bold="true"/>
+ <style token="FUNCTION" fg="000000"/>
+ <style token="LITERAL_BOOLEAN" fg="7f0055" bold="true"/>
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="000000"/>
+ <style token="LITERAL_NUMBER_FLOAT" fg="000000"/>
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="000000"/>
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="2900ff"/>
+ <style token="LITERAL_CHAR" fg="2900ff"/>
+ <style token="LITERAL_BACKQUOTE" fg="2900ff"/>
+ <style token="MARKUP_TAG_DELIMITER" fg="008080"/>
+ <style token="MARKUP_TAG_NAME" fg="3f7f7f"/>
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="7f007f"/>
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="2a00ff" italic="true"/>
+ <style token="MARKUP_COMMENT" fg="3f5fbf"/>
+ <style token="MARKUP_DTD" fg="008080"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+ <style token="MARKUP_CDATA" fg="000000"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+ <style token="MARKUP_ENTITY_REFERENCE" fg="2a00ff"/>
+ <style token="OPERATOR" fg="000000"/>
+ <style token="PREPROCESSOR" fg="808080"/>
+ <style token="REGEX" fg="008040"/>
+ <style token="SEPARATOR" fg="000000"/>
+ <style token="VARIABLE" fg="ff9900" bold="true"/>
+ <style token="WHITESPACE" fg="000000"/>
+
+ <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+ </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/idea.xml b/themes/idea.xml
new file mode 100644
index 0000000..b4ae50f
--- /dev/null
+++ b/themes/idea.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ Theme that mimics IntelliJ IDEA's defaults.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="ffffff" />
+ <caret color="000000" />
+ <selection fg="default" bg="default" />
+ <currentLineHighlight color="ffffd7" fade="false" />
+ <marginLine fg="b0b4b9" />
+ <markAllHighlight color="ccccff" />
+ <markOccurrencesHighlight color="ccccff" border="false" />
+ <matchedBracket fg="99ccff" bg="99ccff" highlightBoth="true" animate="false" />
+ <hyperlinks fg="0000ff" />
+ <secondaryLanguages>
+ <language index="1" bg="fff0cc" />
+ <language index="2" bg="dafeda" />
+ <language index="3" bg="ffe0f0" />
+ </secondaryLanguages>
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="dddddd" />
+ <lineNumbers fg="787878" />
+ <foldIndicator fg="808080" iconBg="ffffff" />
+ <iconRowHeader activeLineRange="3399ff" />
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="000000" />
+ <style token="RESERVED_WORD" fg="000080" bold="true" />
+ <style token="RESERVED_WORD_2" fg="000080" bold="true" />
+ <style token="ANNOTATION" fg="808000" />
+ <style token="COMMENT_DOCUMENTATION" fg="808080" italic="true" />
+ <style token="COMMENT_EOL" fg="808080" italic="true" />
+ <style token="COMMENT_MULTILINE" fg="808080" italic="true" />
+ <style token="COMMENT_KEYWORD" fg="808080" bold="true" underline="true" italic="true" />
+ <style token="COMMENT_MARKUP" fg="808080" bg="e2ffe2" italic="true" />
+ <style token="DATA_TYPE" fg="000080" bold="true" />
+ <style token="FUNCTION" fg="000000" />
+ <style token="LITERAL_BOOLEAN" fg="000080" bold="true" />
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="0000ff" />
+ <style token="LITERAL_NUMBER_FLOAT" fg="0000ff" />
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="0000ff" />
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="008000" bold="true" />
+ <style token="LITERAL_CHAR" fg="008000" bold="true" />
+ <style token="LITERAL_BACKQUOTE" fg="008000" bold="true" />
+ <style token="MARKUP_TAG_DELIMITER" fg="000000" bold="true" />
+ <style token="MARKUP_TAG_NAME" fg="000080" bold="true" />
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="0000ff" bold="true" />
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="008000" bold="true" />
+ <style token="MARKUP_COMMENT" fg="808080" italic="true"/>
+ <style token="MARKUP_DTD" fg="808080"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+ <style token="MARKUP_CDATA" fg="cc6600"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="008080"/>
+ <style token="MARKUP_ENTITY_REFERENCE" fg="008000"/>
+ <style token="OPERATOR" fg="000000" />
+ <style token="PREPROCESSOR" fg="808080" />
+ <style token="REGEX" fg="008040" />
+ <style token="SEPARATOR" fg="000000" />
+ <style token="VARIABLE" fg="810ca8" bold="true" />
+ <style token="WHITESPACE" fg="000000" />
+
+ <style token="ERROR_IDENTIFIER" fg="ff0000" />
+ <style token="ERROR_NUMBER_FORMAT" fg="ff0000" />
+ <style token="ERROR_STRING_DOUBLE" fg="ff0000" />
+ <style token="ERROR_CHAR" fg="ff0000" />
+ </tokenStyles>
+
+</RSyntaxTheme>
diff --git a/themes/vs.xml b/themes/vs.xml
new file mode 100644
index 0000000..78692d9
--- /dev/null
+++ b/themes/vs.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE RSyntaxTheme SYSTEM "theme.dtd">
+
+<!--
+ Theme that mimics Visual Studio's defaults.
+ See theme.dtd and org.fife.ui.rsyntaxtextarea.Theme for more information.
+-->
+<RSyntaxTheme version="1.0">
+
+ <!-- Omitting baseFont will use a system-appropriate monospaced. -->
+ <!--<baseFont family="..." size="13"/>-->
+
+ <!-- General editor colors. -->
+ <background color="ffffff"/>
+ <caret color="000000"/>
+ <selection fg="default" bg="default"/>
+ <currentLineHighlight color="e8f2fe" fade="false"/>
+ <marginLine fg="b0b4b9"/>
+ <markAllHighlight color="6b8189"/> <!-- TODO: Fix me -->
+ <markOccurrencesHighlight color="d4d4d4" border="false"/> <!-- TODO: Fix me -->
+ <matchedBracket fg="DBE0CC" highlightBoth="false" animate="false"/>
+ <hyperlinks fg="0000ff"/>
+ <secondaryLanguages>
+ <language index="1" bg="fff0cc"/>
+ <language index="2" bg="dafeda"/>
+ <language index="3" bg="ffe0f0"/>
+ </secondaryLanguages>
+
+
+ <!-- Gutter styling. -->
+ <gutterBorder color="808080"/>
+ <lineNumbers fg="2B91AF"/>
+ <foldIndicator fg="808080" iconBg="ffffff"/>
+ <iconRowHeader activeLineRange="3399ff"/>
+
+ <!-- Syntax tokens. -->
+ <tokenStyles>
+ <style token="IDENTIFIER" fg="000000"/>
+ <style token="RESERVED_WORD" fg="0000ff" bold="true"/>
+ <style token="RESERVED_WORD_2" fg="0000ff" bold="true"/>
+ <style token="ANNOTATION" fg="808080"/>
+ <style token="COMMENT_DOCUMENTATION" fg="008000"/>
+ <style token="COMMENT_EOL" fg="008000"/>
+ <style token="COMMENT_MULTILINE" fg="008000"/>
+ <style token="COMMENT_KEYWORD" fg="ae9fbf"/>
+ <style token="COMMENT_MARKUP" fg="808080"/>
+ <style token="DATA_TYPE" fg="0000ff" bold="true"/>
+ <style token="FUNCTION" fg="000000"/>
+ <style token="LITERAL_BOOLEAN" fg="0000ff" bold="true"/>
+ <style token="LITERAL_NUMBER_DECIMAL_INT" fg="000000"/>
+ <style token="LITERAL_NUMBER_FLOAT" fg="000000"/>
+ <style token="LITERAL_NUMBER_HEXADECIMAL" fg="000000"/>
+ <style token="LITERAL_STRING_DOUBLE_QUOTE" fg="A31515"/>
+ <style token="LITERAL_CHAR" fg="A31515"/>
+ <style token="LITERAL_BACKQUOTE" fg="A31515"/>
+ <style token="MARKUP_TAG_DELIMITER" fg="0000ff"/>
+ <style token="MARKUP_TAG_NAME" fg="A31515"/>
+ <style token="MARKUP_TAG_ATTRIBUTE" fg="ff0000"/>
+ <style token="MARKUP_TAG_ATTRIBUTE_VALUE" fg="0000ff"/>
+ <style token="MARKUP_COMMENT" fg="006000" italic="true"/>
+ <style token="MARKUP_DTD" fg="ad8000"/>
+ <style token="MARKUP_PROCESSING_INSTRUCTION" fg="808080"/>
+ <style token="MARKUP_CDATA" fg="000000"/>
+ <style token="MARKUP_CDATA_DELIMITER" fg="0000ff"/>
+ <style token="OPERATOR" fg="000000"/>
+ <style token="PREPROCESSOR" fg="808080"/>
+ <style token="REGEX" fg="000000"/>
+ <style token="SEPARATOR" fg="000000"/>
+ <style token="VARIABLE" fg="ff9900" bold="true"/>
+ <style token="WHITESPACE" fg="000000"/>
+
+ <style token="ERROR_IDENTIFIER" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_NUMBER_FORMAT" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_STRING_DOUBLE" fg="000000" bg="ffcccc"/>
+ <style token="ERROR_CHAR" fg="000000" bg="ffcccc"/>
+ </tokenStyles>
+
+</RSyntaxTheme>
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/rsyntaxtextarea.git
More information about the pkg-java-commits
mailing list