155 patches
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/BooleanStack.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/BooleanStack.java
new file mode 100644
index 0000000..3889819
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/BooleanStack.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.jst.jsp.core.internal.contenttype;
+
+/*
+ * 
+ * A non-resizable class implementing the behavior of java.util.Stack, but
+ * directly for the <code> boolean </code> primitive.
+ */
+import java.util.EmptyStackException;
+
+public class BooleanStack {
+	private boolean[] list = null;
+
+	private int size = 0;
+	
+	/**
+	 * This field is not meant to be modified by anyone! In a typical document, tags should not
+	 * be embedded to such a depth that it would cause a stack overflow. Three tests in JSPTokenizerTest (test144807_*)
+	 * create embedded tags up to a depth of 400. Because of this test, we allow for modification of the maxDepth as a
+	 * static field before the JSPTokenizer is created.
+	 * 
+	 * Changing this value can impact the tokenizing of a JSP file!
+	 */
+	public static int maxDepth = 100;
+
+	public BooleanStack() {
+		this(maxDepth);
+	}
+
+	public BooleanStack(int maxdepth) {
+		super();
+		list = new boolean[maxdepth];
+		initialize();
+	}
+
+	public void clear() {
+		initialize();
+	}
+
+	public boolean empty() {
+		return size == 0;
+	}
+
+	public boolean get(int slot) {
+		return list[slot];
+	}
+
+	private void initialize() {
+		size = 0;
+	}
+
+	/**
+	 * Returns the boolean at the top of the stack without removing it
+	 * 
+	 * @return boolean at the top of this stack.
+	 * @exception EmptyStackException
+	 *                when empty.
+	 */
+	public boolean peek() {
+		if (size == 0)
+			throw new EmptyStackException();
+		return list[size - 1];
+	}
+
+	/**
+	 * Removes and returns the boolean at the top of the stack
+	 * 
+	 * @return boolean at the top of this stack.
+	 * @exception EmptyStackException
+	 *                when empty.
+	 */
+	public boolean pop() {
+		boolean value = peek();
+		list[size - 1] = false;
+		size--;
+		return value;
+	}
+
+	/**
+	 * Pushes an item onto the top of this stack.
+	 * 
+	 * @param newValue -
+	 *            the boolean to be pushed onto this stack.
+	 * @return the <code>newValue</code> argument.
+	 */
+	public boolean push(boolean newValue) {
+		if (size == list.length) {
+			throw new StackOverflowError();
+		}
+		list[size++] = newValue;
+		return newValue;
+	}
+
+	public int size() {
+		return list.length;
+	}
+	
+	public static void setMaxDepth(int depth) {
+		
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
index 886a0a3..5366bf9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.java;
 
@@ -1569,6 +1570,7 @@
 		ITextRegion delim = null;
 		ITextRegion content = null;
 		String type = null;
+		String quotetype = null;
 		if(embeddedRegions.get(0).getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_OPEN) {
 			Iterator iterator = embeddedRegions.iterator();
 			iterator.next();
@@ -1580,7 +1582,9 @@
 			// possible delimiter, check later
 			delim = embeddedRegions.get(i);
 			type = delim.getType();
-
+			if(type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE
+				|| type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)
+				quotetype = type;
 			// check next region to see if it's content
 			if (i + 1 < embeddedRegions.size()) {
 				String regionType = embeddedRegions.get(i + 1).getType();
@@ -1601,7 +1605,7 @@
 					fLastJSPType = EXPRESSION;
 					// translateExpressionString(embeddedContainer.getText(content),
 					// fCurrentNode, contentStart, content.getLength());
-					translateExpressionString(embeddedContainer.getText(content), embeddedContainer, contentStart, content.getLength(), false);
+					translateExpressionString(embeddedContainer.getText(content), embeddedContainer, contentStart, content.getLength(), quotetype);
 				}
 				else if (type == DOMJSPRegionContexts.JSP_SCRIPTLET_OPEN) {
 					fLastJSPType = SCRIPTLET;
@@ -1942,6 +1946,44 @@
 		appendToBuffer(newText, fUserCode, true, embeddedContainer, jspPositionStart, jspPositionLength, isIndirect);
 		appendToBuffer(EXPRESSION_SUFFIX, fUserCode, false, embeddedContainer);
 	}
+	
+	protected void translateExpressionString(String newText, ITextRegionCollection embeddedContainer, int jspPositionStart, int jspPositionLength, String quotetype) {
+		if(quotetype == null || quotetype == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE ||quotetype == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE ) {
+			translateExpressionString(newText, embeddedContainer, jspPositionStart, jspPositionLength, false);
+			return;
+		}
+
+		//-- This is a quoted attribute. We need to unquote as per the JSP spec: JSP 2.0 page 1-36
+		appendToBuffer(EXPRESSION_PREFIX, fUserCode, false, embeddedContainer);
+
+		int length = newText.length();
+		int runStart = 0;
+		int i = 0;
+		for ( ; i < length; i++) {
+			//-- collect a new run
+			char c = newText.charAt(i);
+			if (c == '\\') {
+				//-- Escaped value. Add the run, then unescape
+				int runLength = i-runStart;
+				if (runLength > 0) {
+					appendToBuffer(newText.substring(runStart, i), fUserCode, true, embeddedContainer, jspPositionStart, runLength, true, true);
+					jspPositionStart += runLength + 1;
+					jspPositionLength -= runLength + 1;
+				}
+				runStart = ++i;
+				if (i >= length) { // Escape but no data follows?!
+					//- error.
+					break;
+				}
+				c = newText.charAt(i);				// The escaped character, copied verbatim
+			}
+		}
+		//-- Copy last-run
+		int runLength = i - runStart;
+		if (runLength > 0)
+			appendToBuffer(newText.substring(runStart, i), fUserCode, true, embeddedContainer, jspPositionStart, runLength, true, false);
+		appendToBuffer(EXPRESSION_SUFFIX, fUserCode, false, embeddedContainer);
+	}
 
 	protected void translateDeclarationString(String newText, ITextRegionCollection embeddedContainer, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
 		appendToBuffer(newText, fUserDeclarations, true, embeddedContainer, jspPositionStart, jspPositionLength, isIndirect);
@@ -2002,6 +2044,10 @@
 		appendToBuffer(newText, buffer, addToMap, jspReferenceRegion, start, length, false);
 	}
 
+	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
+		appendToBuffer(newText, buffer, addToMap, jspReferenceRegion, jspPositionStart, jspPositionLength, isIndirect, false);
+	}
+
 	/**
 	 * Adds newText to the buffer passed in, and adds to translation mapping
 	 * as specified by the addToMap flag. some special cases to consider (that
@@ -2012,7 +2058,7 @@
 	 * @param buffer
 	 * @param addToMap
 	 */
-	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect) {
+	private void appendToBuffer(String newText, StringBuffer buffer, boolean addToMap, ITextRegionCollection jspReferenceRegion, int jspPositionStart, int jspPositionLength, boolean isIndirect, boolean nonl) {
 
 		int origNewTextLength = newText.length();
 
@@ -2021,7 +2067,7 @@
 			return;
 
 		// add a newline so translation looks cleaner
-		if (!newText.endsWith(ENDL))
+		if (!nonl && !newText.endsWith(ENDL))
 			newText += ENDL;
 
 		if (buffer == fUserCode) {
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
index 2fed20d..bc1a523 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
@@ -1,7 +1,7 @@
-/* The following code was generated by JFlex 1.2.2 on 4/29/08 9:05 PM */
+/* The following code was generated by JFlex 1.2.2 on 2/4/09 2:15 PM */
 
 /*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,6 +9,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 
 package org.eclipse.jst.jsp.core.internal.parser.internal;
@@ -19,6 +20,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.jst.jsp.core.internal.contenttype.BooleanStack;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
@@ -35,8 +37,8 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 4/29/08 9:05 PM from the specification file
- * <tt>file:/E:/wtp-1.5/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
+ * on 2/4/09 2:15 PM from the specification file
+ * <tt>file:/D:/dev/workspaces/wtp1.5/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
  */
 public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {
 
@@ -44,26 +46,26 @@
   final public static int YYEOF = -1;
 
   /** lexical states */
-  final public static int ST_JSP_VBL_DQUOTES = 51;
-  final public static int ST_JSP_VBL_SQUOTES = 50;
-  final public static int ST_JSP_VBL_SQUOTES_END = 52;
+  final public static int ST_JSP_VBL_DQUOTES = 52;
+  final public static int ST_JSP_VBL_SQUOTES = 51;
+  final public static int ST_JSP_VBL_SQUOTES_END = 53;
   final public static int ST_XML_COMMENT_END = 4;
   final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE = 21;
-  final public static int ST_JSP_EL_SQUOTES_END = 45;
-  final public static int ST_JSP_EL_DQUOTES = 44;
-  final public static int ST_JSP_EL = 42;
+  final public static int ST_JSP_EL_SQUOTES_END = 46;
+  final public static int ST_JSP_EL_DQUOTES = 45;
+  final public static int ST_JSP_EL = 43;
   final public static int ST_BLOCK_TAG_SCAN = 36;
-  final public static int ST_JSP_EL_SQUOTES = 43;
+  final public static int ST_JSP_EL_SQUOTES = 44;
   final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
   final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;
   final public static int ST_DHTML_TAG_CLOSE = 15;
-  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 41;
+  final public static int ST_XML_ATTRIBUTE_VALUE_DQUOTED = 42;
   final public static int ST_DHTML_EQUALS = 13;
   final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
   final public static int ST_XML_ATTRIBUTE_VALUE = 25;
-  final public static int ST_JSP_VBL = 49;
-  final public static int ST_JSP_SQUOTED_VBL = 55;
-  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 40;
+  final public static int ST_JSP_VBL = 50;
+  final public static int ST_JSP_SQUOTED_VBL = 56;
+  final public static int ST_XML_ATTRIBUTE_VALUE_SQUOTED = 41;
   final public static int ST_XML_ATTRIBUTE_NAME = 23;
   final public static int ST_XML_EQUALS = 24;
   final public static int YYINITIAL = 0;
@@ -73,8 +75,8 @@
   final public static int ST_XML_ELEMENT_DECLARATION = 32;
   final public static int ST_XML_DECLARATION_CLOSE = 27;
   final public static int ST_JSP_DIRECTIVE_EQUALS = 20;
-  final public static int ST_JSP_VBL_DQUOTES_END = 53;
-  final public static int ST_JSP_DQUOTED_EL = 47;
+  final public static int ST_JSP_VBL_DQUOTES_END = 54;
+  final public static int ST_JSP_DQUOTED_EL = 48;
   final public static int ST_XML_DOCTYPE_DECLARATION = 28;
   final public static int ST_CDATA_END = 2;
   final public static int ST_PI_WS = 6;
@@ -82,13 +84,13 @@
   final public static int ST_JSP_DIRECTIVE_NAME_WHITESPACE = 18;
   final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 33;
   final public static int ST_XML_ATTLIST_DECLARATION = 34;
-  final public static int ST_JSP_EL_DQUOTES_END = 46;
-  final public static int ST_JSP_SQUOTED_EL = 48;
+  final public static int ST_JSP_EL_DQUOTES_END = 47;
+  final public static int ST_JSP_SQUOTED_EL = 49;
   final public static int ST_JSP_COMMENT_END = 39;
   final public static int ST_XML_PI_EQUALS = 9;
   final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 35;
   final public static int ST_XML_DOCTYPE_ID_PUBLIC = 30;
-  final public static int ST_JSP_DQUOTED_VBL = 54;
+  final public static int ST_JSP_DQUOTED_VBL = 55;
   final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
   final public static int ST_ABORT_EMBEDDED = 37;
   final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 29;
@@ -101,80 +103,81 @@
   final public static int ST_XML_TAG_NAME = 22;
   final public static int ST_XML_PI_TAG_CLOSE = 11;
   final public static int ST_XML_COMMENT = 3;
+  final public static int ST_JSP_ATTRIBUTE_VALUE = 40;
 
   /** 
    * Translates characters to character classes
    */
   final private static String yycmap_packed = 
-    "\11\0\1\5\1\26\2\0\1\17\22\0\1\17\1\25\1\12\1\65"+
-    "\1\15\1\22\1\13\1\14\1\24\1\24\1\24\1\24\1\24\1\7"+
-    "\1\6\1\3\12\20\1\11\1\72\1\1\1\51\1\2\1\4\1\21"+
-    "\1\40\1\73\1\36\1\37\1\55\1\70\1\62\1\62\1\63\1\62"+
-    "\1\62\1\33\1\31\1\64\1\52\1\54\1\62\1\67\1\66\1\41"+
-    "\1\71\2\62\1\27\1\53\1\62\1\35\1\104\1\23\1\0\1\10"+
-    "\1\0\1\57\1\103\1\74\1\60\1\43\1\70\1\75\1\106\1\46"+
-    "\1\100\1\62\1\34\1\32\1\50\1\47\1\101\1\62\1\44\1\45"+
-    "\1\56\1\102\1\42\1\62\1\30\1\61\1\62\1\16\1\0\1\105"+
-    "\71\0\1\77\10\0\27\76\1\0\37\76\1\0\72\76\2\0\13\76"+
-    "\2\0\10\76\1\0\65\76\1\0\104\76\11\0\44\76\3\0\2\76"+
-    "\4\0\36\76\70\0\131\76\22\0\7\76\16\0\2\77\56\0\106\77"+
-    "\32\0\2\77\44\0\1\76\1\77\3\76\1\0\1\76\1\0\24\76"+
-    "\1\0\54\76\1\0\7\76\3\0\1\76\1\0\1\76\1\0\1\76"+
-    "\1\0\1\76\1\0\22\76\15\0\14\76\1\0\102\76\1\0\14\76"+
-    "\1\0\44\76\1\0\4\77\11\0\65\76\2\0\2\76\2\0\2\76"+
-    "\3\0\34\76\2\0\10\76\2\0\2\76\67\0\46\76\2\0\1\76"+
-    "\7\0\46\76\12\0\21\77\1\0\27\77\1\0\3\77\1\0\1\77"+
-    "\1\0\2\77\1\0\1\77\13\0\33\76\5\0\3\76\56\0\32\76"+
-    "\5\0\1\77\12\76\10\77\15\0\12\77\6\0\1\77\107\76\2\0"+
-    "\5\76\1\0\17\76\1\0\4\76\1\0\1\76\17\77\2\76\2\77"+
-    "\1\0\4\77\2\0\12\77\u0207\0\3\77\1\0\65\76\2\0\1\77"+
-    "\1\76\20\77\3\0\4\77\3\0\12\76\2\77\2\0\12\77\21\0"+
-    "\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0\7\76\1\0"+
-    "\1\76\3\0\4\76\2\0\1\77\1\0\7\77\2\0\2\77\2\0"+
-    "\3\77\11\0\1\77\4\0\2\76\1\0\3\76\2\77\2\0\12\77"+
-    "\2\76\20\0\1\77\2\0\6\76\4\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\1\0\2\76\1\0\2\76\2\0\1\77\1\0"+
-    "\5\77\4\0\2\77\2\0\3\77\13\0\4\76\1\0\1\76\7\0"+
-    "\12\77\2\77\3\76\14\0\3\77\1\0\7\76\1\0\1\76\1\0"+
-    "\3\76\1\0\26\76\1\0\7\76\1\0\2\76\1\0\5\76\2\0"+
-    "\1\77\1\76\10\77\1\0\3\77\1\0\3\77\22\0\1\76\5\0"+
-    "\12\77\21\0\3\77\1\0\10\76\2\0\2\76\2\0\26\76\1\0"+
-    "\7\76\1\0\2\76\2\0\4\76\2\0\1\77\1\76\6\77\3\0"+
-    "\2\77\2\0\3\77\10\0\2\77\4\0\2\76\1\0\3\76\4\0"+
-    "\12\77\22\0\2\77\1\0\6\76\3\0\3\76\1\0\4\76\3\0"+
-    "\2\76\1\0\1\76\1\0\2\76\3\0\2\76\3\0\3\76\3\0"+
-    "\10\76\1\0\3\76\4\0\5\77\3\0\3\77\1\0\4\77\11\0"+
-    "\1\77\17\0\11\77\21\0\3\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\12\76\1\0\5\76\4\0\7\77\1\0\3\77\1\0"+
-    "\4\77\7\0\2\77\11\0\2\76\4\0\12\77\22\0\2\77\1\0"+
-    "\10\76\1\0\3\76\1\0\27\76\1\0\12\76\1\0\5\76\4\0"+
-    "\7\77\1\0\3\77\1\0\4\77\7\0\2\77\7\0\1\76\1\0"+
-    "\2\76\4\0\12\77\22\0\2\77\1\0\10\76\1\0\3\76\1\0"+
-    "\27\76\1\0\20\76\4\0\6\77\2\0\3\77\1\0\4\77\11\0"+
-    "\1\77\10\0\2\76\4\0\12\77\221\0\56\76\1\0\1\76\1\77"+
-    "\2\76\7\77\5\0\6\76\1\77\10\77\1\0\12\77\47\0\2\76"+
-    "\1\0\1\76\2\0\2\76\1\0\1\76\2\0\1\76\6\0\4\76"+
-    "\1\0\7\76\1\0\3\76\1\0\1\76\1\0\1\76\2\0\2\76"+
-    "\1\0\2\76\1\0\1\76\1\77\2\76\6\77\1\0\2\77\1\76"+
-    "\2\0\5\76\1\0\1\77\1\0\6\77\2\0\12\77\76\0\2\77"+
-    "\6\0\12\77\13\0\1\77\1\0\1\77\1\0\1\77\4\0\2\77"+
-    "\10\76\1\0\41\76\7\0\24\77\1\0\6\77\4\0\6\77\1\0"+
-    "\1\77\1\0\25\77\3\0\7\77\1\0\1\77\346\0\46\76\12\0"+
-    "\47\76\11\0\1\76\1\0\2\76\1\0\3\76\1\0\1\76\1\0"+
-    "\2\76\1\0\5\76\51\0\1\76\1\0\1\76\1\0\1\76\13\0"+
-    "\1\76\1\0\1\76\1\0\1\76\3\0\2\76\3\0\1\76\5\0"+
-    "\3\76\1\0\1\76\1\0\1\76\1\0\1\76\1\0\1\76\3\0"+
-    "\2\76\3\0\2\76\1\0\1\76\50\0\1\76\11\0\1\76\2\0"+
-    "\1\76\2\0\2\76\7\0\2\76\1\0\1\76\1\0\7\76\50\0"+
-    "\1\76\4\0\1\76\10\0\1\76\u0c06\0\234\76\4\0\132\76\6\0"+
-    "\26\76\2\0\6\76\2\0\46\76\2\0\6\76\2\0\10\76\1\0"+
-    "\1\76\1\0\1\76\1\0\1\76\1\0\37\76\2\0\65\76\1\0"+
-    "\7\76\1\0\1\76\3\0\3\76\1\0\7\76\3\0\4\76\2\0"+
-    "\6\76\4\0\15\76\5\0\3\76\1\0\7\76\323\0\15\77\4\0"+
-    "\1\77\104\0\1\76\3\0\2\76\2\0\1\76\121\0\3\76\u0e82\0"+
-    "\1\77\1\0\1\76\31\0\11\76\6\77\1\0\5\77\13\0\124\76"+
-    "\4\0\2\77\2\0\2\77\2\0\132\76\1\0\3\77\6\0\50\76"+
-    "\u1cd3\0\u51a6\76\u0c5a\0\u2ba4\76\134\0\u0800\0\u1ffe\0\2\0";
+    "\11\0\1\5\1\27\2\0\1\20\22\0\1\20\1\26\1\12\1\66"+
+    "\1\15\1\23\1\13\1\14\1\25\1\25\1\25\1\25\1\25\1\7"+
+    "\1\6\1\3\12\21\1\11\1\73\1\1\1\52\1\2\1\4\1\22"+
+    "\1\41\1\74\1\37\1\40\1\56\1\71\1\63\1\63\1\64\1\63"+
+    "\1\63\1\34\1\32\1\65\1\53\1\55\1\63\1\70\1\67\1\42"+
+    "\1\72\2\63\1\30\1\54\1\63\1\36\1\17\1\24\1\0\1\10"+
+    "\1\0\1\60\1\104\1\75\1\61\1\44\1\71\1\76\1\106\1\47"+
+    "\1\101\1\63\1\35\1\33\1\51\1\50\1\102\1\63\1\45\1\46"+
+    "\1\57\1\103\1\43\1\63\1\31\1\62\1\63\1\16\1\0\1\105"+
+    "\71\0\1\100\10\0\27\77\1\0\37\77\1\0\72\77\2\0\13\77"+
+    "\2\0\10\77\1\0\65\77\1\0\104\77\11\0\44\77\3\0\2\77"+
+    "\4\0\36\77\70\0\131\77\22\0\7\77\16\0\2\100\56\0\106\100"+
+    "\32\0\2\100\44\0\1\77\1\100\3\77\1\0\1\77\1\0\24\77"+
+    "\1\0\54\77\1\0\7\77\3\0\1\77\1\0\1\77\1\0\1\77"+
+    "\1\0\1\77\1\0\22\77\15\0\14\77\1\0\102\77\1\0\14\77"+
+    "\1\0\44\77\1\0\4\100\11\0\65\77\2\0\2\77\2\0\2\77"+
+    "\3\0\34\77\2\0\10\77\2\0\2\77\67\0\46\77\2\0\1\77"+
+    "\7\0\46\77\12\0\21\100\1\0\27\100\1\0\3\100\1\0\1\100"+
+    "\1\0\2\100\1\0\1\100\13\0\33\77\5\0\3\77\56\0\32\77"+
+    "\5\0\1\100\12\77\10\100\15\0\12\100\6\0\1\100\107\77\2\0"+
+    "\5\77\1\0\17\77\1\0\4\77\1\0\1\77\17\100\2\77\2\100"+
+    "\1\0\4\100\2\0\12\100\u0207\0\3\100\1\0\65\77\2\0\1\100"+
+    "\1\77\20\100\3\0\4\100\3\0\12\77\2\100\2\0\12\100\21\0"+
+    "\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0\7\77\1\0"+
+    "\1\77\3\0\4\77\2\0\1\100\1\0\7\100\2\0\2\100\2\0"+
+    "\3\100\11\0\1\100\4\0\2\77\1\0\3\77\2\100\2\0\12\100"+
+    "\2\77\20\0\1\100\2\0\6\77\4\0\2\77\2\0\26\77\1\0"+
+    "\7\77\1\0\2\77\1\0\2\77\1\0\2\77\2\0\1\100\1\0"+
+    "\5\100\4\0\2\100\2\0\3\100\13\0\4\77\1\0\1\77\7\0"+
+    "\12\100\2\100\3\77\14\0\3\100\1\0\7\77\1\0\1\77\1\0"+
+    "\3\77\1\0\26\77\1\0\7\77\1\0\2\77\1\0\5\77\2\0"+
+    "\1\100\1\77\10\100\1\0\3\100\1\0\3\100\22\0\1\77\5\0"+
+    "\12\100\21\0\3\100\1\0\10\77\2\0\2\77\2\0\26\77\1\0"+
+    "\7\77\1\0\2\77\2\0\4\77\2\0\1\100\1\77\6\100\3\0"+
+    "\2\100\2\0\3\100\10\0\2\100\4\0\2\77\1\0\3\77\4\0"+
+    "\12\100\22\0\2\100\1\0\6\77\3\0\3\77\1\0\4\77\3\0"+
+    "\2\77\1\0\1\77\1\0\2\77\3\0\2\77\3\0\3\77\3\0"+
+    "\10\77\1\0\3\77\4\0\5\100\3\0\3\100\1\0\4\100\11\0"+
+    "\1\100\17\0\11\100\21\0\3\100\1\0\10\77\1\0\3\77\1\0"+
+    "\27\77\1\0\12\77\1\0\5\77\4\0\7\100\1\0\3\100\1\0"+
+    "\4\100\7\0\2\100\11\0\2\77\4\0\12\100\22\0\2\100\1\0"+
+    "\10\77\1\0\3\77\1\0\27\77\1\0\12\77\1\0\5\77\4\0"+
+    "\7\100\1\0\3\100\1\0\4\100\7\0\2\100\7\0\1\77\1\0"+
+    "\2\77\4\0\12\100\22\0\2\100\1\0\10\77\1\0\3\77\1\0"+
+    "\27\77\1\0\20\77\4\0\6\100\2\0\3\100\1\0\4\100\11\0"+
+    "\1\100\10\0\2\77\4\0\12\100\221\0\56\77\1\0\1\77\1\100"+
+    "\2\77\7\100\5\0\6\77\1\100\10\100\1\0\12\100\47\0\2\77"+
+    "\1\0\1\77\2\0\2\77\1\0\1\77\2\0\1\77\6\0\4\77"+
+    "\1\0\7\77\1\0\3\77\1\0\1\77\1\0\1\77\2\0\2\77"+
+    "\1\0\2\77\1\0\1\77\1\100\2\77\6\100\1\0\2\100\1\77"+
+    "\2\0\5\77\1\0\1\100\1\0\6\100\2\0\12\100\76\0\2\100"+
+    "\6\0\12\100\13\0\1\100\1\0\1\100\1\0\1\100\4\0\2\100"+
+    "\10\77\1\0\41\77\7\0\24\100\1\0\6\100\4\0\6\100\1\0"+
+    "\1\100\1\0\25\100\3\0\7\100\1\0\1\100\346\0\46\77\12\0"+
+    "\47\77\11\0\1\77\1\0\2\77\1\0\3\77\1\0\1\77\1\0"+
+    "\2\77\1\0\5\77\51\0\1\77\1\0\1\77\1\0\1\77\13\0"+
+    "\1\77\1\0\1\77\1\0\1\77\3\0\2\77\3\0\1\77\5\0"+
+    "\3\77\1\0\1\77\1\0\1\77\1\0\1\77\1\0\1\77\3\0"+
+    "\2\77\3\0\2\77\1\0\1\77\50\0\1\77\11\0\1\77\2\0"+
+    "\1\77\2\0\2\77\7\0\2\77\1\0\1\77\1\0\7\77\50\0"+
+    "\1\77\4\0\1\77\10\0\1\77\u0c06\0\234\77\4\0\132\77\6\0"+
+    "\26\77\2\0\6\77\2\0\46\77\2\0\6\77\2\0\10\77\1\0"+
+    "\1\77\1\0\1\77\1\0\1\77\1\0\37\77\2\0\65\77\1\0"+
+    "\7\77\1\0\1\77\3\0\3\77\1\0\7\77\3\0\4\77\2\0"+
+    "\6\77\4\0\15\77\5\0\3\77\1\0\7\77\323\0\15\100\4\0"+
+    "\1\100\104\0\1\77\3\0\2\77\2\0\1\77\121\0\3\77\u0e82\0"+
+    "\1\100\1\0\1\77\31\0\11\77\6\100\1\0\5\100\13\0\124\77"+
+    "\4\0\2\100\2\0\2\100\2\0\132\77\1\0\3\100\6\0\50\77"+
+    "\u1cd3\0\u51a6\77\u0c5a\0\u2ba4\77\134\0\u0800\0\u1ffe\0\2\0";
 
   /** 
    * Translates characters to character classes
@@ -191,585 +194,618 @@
      2130,  2201,  2272,  2343,  2414,  2485,  2556,  2627,  2698,  2769, 
      2840,  2911,  2982,  3053,  3124,  3195,  3266,  3337,  3408,  3479, 
      3550,  3621,  3692,  3763,  3834,  3905,  3976,  4047,  4118,  4189, 
-     4260,  4331,  4402,  4473,  4402,  4473,  4544,  4402,  4402,  4473, 
-     4615,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  4402,  4473, 
-     5183,  5254,  5325,  4402,  5396,  5396,  5467,  5538,  5609,  5183, 
-     4402,  5680,  5751,  4402,  5822,  5893,  5964,  6035,  4402,  4473, 
-     6106,  6177,  6248,  6319,  6390,  6461,  4402,  6532,  6532,  6603, 
-     6674,  6745,  6816,  6887,  4402,  6958,  7029,  7100,  7171,  7242, 
-     7313,  4402,  7384,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
-     4402,  7952,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8449, 
-     8520,  8591,  8662,  8733,  8733,  8804,  8875,  8946,  9017,  9017, 
-     9088,  9159,  9230,  9301,  4402,  9372,  9372,  9443,  9514,  9585, 
-     9656,  4402,  4402,  4473,  4402,  4473,  9727,  9798,  9869,  9940, 
-     4402, 10011, 10082, 10153, 10224,  4402, 10295, 10366, 10437, 10508, 
-     4402,  4402, 10579,  4402, 10650, 10721, 10650, 10792, 10863, 10792, 
-     4402,  4402, 10934, 11005, 11076,  4402, 11147, 11218, 11289, 11360, 
-    11431,  4402,  4402, 11502,  4402, 11573, 11644, 11573, 11715, 11786, 
-    11715,  4402,  4402, 11857, 11928, 11999,  4402, 12070, 12141, 12212, 
-     4402,  4402, 12283, 12354, 12425, 12496, 12567,  4402, 12638, 12709, 
-    12780, 12851, 12922, 12993, 13064, 13135,  4402, 13206, 13277, 13348, 
-     4402,  4402,  5396,  5538,  4402, 13419,  5609, 13490,  5680,  5822, 
-     5893, 13561,  5964,  4402, 13632, 13703,  6035, 13774,  4402, 12354, 
-     4402,  6532,  6603,  4402, 13845,  6674, 13916,  4402, 13987, 14058, 
-     7384, 14129,  7597,  4402, 14200,  7668, 14271, 14342, 14413, 14484, 
-    14555, 14626,  8165,  4402, 14697, 14768,  8449,  8520,  4402, 14839, 
-    14910, 14981, 15052, 15123,  8662,  8449,  8733,  8804,  4402,  8875, 
-     8946,  8733,  9017,  9088,  4402, 15194, 15265, 15336, 15407, 15478, 
-    15549, 15620,  9372,  9443,  4402, 15691, 15762, 15833, 15904, 15975, 
-    16046, 16117, 16188, 16259,  4402,  4402,  4402, 16330,  4402,  4402, 
-    16401, 16472, 16543, 16614, 10650,  4402, 16685, 16756, 10792,  4402, 
-    16827, 16898, 16969, 17040, 17111, 17182, 17253, 17324, 17395, 11360, 
-    11573,  4402, 17466, 17537, 11715,  4402, 17608, 17679, 17750, 17821, 
-    17892, 17963, 18034, 18105, 18176,  4402,  4402,  4402, 18247, 18318, 
-    18389, 18460, 18531,  4402, 18602, 18673,  4402,  4402,  4402,  4402, 
-     4402,  4828, 18744, 18815, 18886, 18957, 19028, 19099, 19170, 19099, 
-    19241, 19312, 19241, 19383, 19454, 19525, 19596, 19667, 19738, 19809, 
-    19809, 19880, 19951, 19951, 20022,  9230,  9230,  9230, 20093, 20164, 
-    20235, 20235, 20306,  9585,  9585,  9585, 20377, 20448, 16543, 20519, 
-    10437, 10437, 10437, 20590, 20661, 10650, 10650, 10650, 20732, 20803, 
-    10792, 10792, 10792, 20874, 20945, 10934, 10934, 10934, 17111, 21016, 
-    21087, 11147, 11147, 11147, 17324, 21158, 21229, 11360, 11360, 11360, 
-    21300, 11573, 11573, 11573, 21371, 21442, 11715, 11715, 11715, 21513, 
-    21584, 11857, 11857, 11857, 17892, 21655, 21726, 12070, 12070, 12070, 
-    18105, 21797,  4402,  4402, 21868, 21939,  4402, 22010, 22081, 22152, 
-    22223,  7384,  4402,  4402, 22294, 22365, 22436, 22507, 22578, 15052, 
-    15407,  9230, 22649, 15904,  9585, 22720,  4402, 10437, 10650, 22791, 
-    10792, 22862, 10934, 22933,  4402, 11147, 23004, 11360, 11573, 23075, 
-    11715, 23146, 11857, 23217,  4402, 12070, 23288, 23359, 23430, 23501, 
-    23572, 23643, 23714, 23785, 23856, 23927, 23998, 24069, 24140, 24211, 
-    24282, 24353, 24424, 24495, 24566, 24637, 24708, 24779, 24850,  4828, 
-    24921, 24992, 25063, 25134, 25205,  4402,  4402, 25276, 25347, 25418, 
-    25489, 17111, 17324, 25560, 25631, 17892, 18105, 25702, 25773, 25844, 
-    25915,  4402,  4402,  4402, 25986, 26057, 26128, 26199, 26270, 26341, 
-    26412, 26483,  7100, 26554, 26625, 26696, 26767, 26838, 26909, 26980, 
-     4402, 27051, 27122,  9230,  9585, 10650, 10792, 11573, 11715, 27193, 
-    27264, 27335, 27406, 27477, 27548, 27619, 27690,  4828, 27761, 27832, 
-    27903, 27974, 28045, 28116, 28187, 28258, 28329, 28400, 28471, 28542, 
-    28613, 28684, 28755, 28826, 28897, 28968, 29039, 29110, 29181, 29252, 
-    29323, 29394, 29465, 29536, 29607, 29678, 29749, 29820, 29891, 29962, 
-    30033, 30104, 30175, 30246,  4402, 30317, 30388, 30459, 30530,  7100, 
-    30601, 30672, 30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240, 
-    31311, 31382, 31453, 31524
+     4260,  4331,  4402,  4473,  4544,  4473,  4544,  4615,  4473,  4473, 
+     4544,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  4473, 
+     4544,  5254,  5325,  5396,  4473,  5467,  5467,  5538,  5609,  5680, 
+     5254,  4473,  5751,  5822,  4473,  5893,  5964,  6035,  6106,  4473, 
+     4544,  6177,  6248,  6319,  6390,  6461,  6532,  4473,  6603,  6603, 
+     6674,  6745,  6816,  6887,  6958,  4473,  7029,  7100,  7171,  7242, 
+     7313,  7384,  4473,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
+     7952,  4473,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8520, 
+     8520,  8591,  8662,  8733,  8804,  8804,  8875,  8946,  9017,  9088, 
+     9088,  9159,  9230,  9301,  9372,  4473,  9443,  9443,  9514,  9585, 
+     9656,  9727,  4473,  4473,  4544,  4473,  4544,  9798,  9869,  7526, 
+     9940, 10011, 10082, 10153, 10224, 10295, 10366, 10437,  4473, 10508, 
+    10579, 10650, 10721,  4473, 10792, 10863, 10934, 11005,  4473,  4473, 
+    11076,  4473, 11147, 11218, 11147, 11289, 11360, 11289,  4473,  4473, 
+    11431, 11502,  4473, 11573,  4473, 11644, 11715, 11786, 11857, 11928, 
+     4473,  4473, 11999,  4473, 12070, 12141, 12070, 12212, 12283, 12212, 
+     4473,  4473, 12354, 12425, 12496,  4473, 12567, 12638, 12709,  4473, 
+     4473, 12780, 12851, 12922, 12993, 13064,  4473, 13135, 13206, 13277, 
+    13348, 13419, 13490, 13561, 13632,  4473, 13703, 13774, 13845,  4473, 
+     4473,  5467,  5609,  4473, 13916,  5680, 13987,  5751,  5893,  5964, 
+    14058,  6035,  4473, 14129, 14200,  6106, 14271,  4473, 12851,  4473, 
+     6603,  6674,  4473, 14342,  6745, 14413,  4473, 14484, 14555,  7455, 
+    14626,  7668,  4473, 14697,  7739, 14768, 14839, 14910, 14981, 15052, 
+    15123,  8236,  4473, 15194, 15265,  8520,  8591,  4473, 15336, 15407, 
+    15478, 15549, 15620,  8733,  8520,  8804,  8875,  4473,  8946,  9017, 
+     8804,  9088,  9159,  4473, 15691, 15762, 15833, 15904, 15975, 16046, 
+    16117,  9443,  9514,  4473, 16188, 16259, 16330, 16401, 16472, 16543, 
+    16614, 16685,  9869, 10011,  4473, 16756, 16827, 10082, 16898, 16969, 
+    17040, 17111,  4473, 17182,  4473,  4473,  4473,  4473, 17253, 17324, 
+    17395, 17466, 11147,  4473, 17537, 17608, 11289,  4473, 17679, 17750, 
+    17821, 17892, 17963, 18034, 18105, 18176, 18247, 11857, 12070,  4473, 
+    18318, 18389, 12212,  4473, 18460, 18531, 18602, 18673, 18744, 18815, 
+    18886, 18957, 19028,  4473,  4473,  4473, 19099, 19170, 19241, 19312, 
+    19383,  4473, 19454, 19525,  4473,  4473,  4473,  4473,  4473,  4899, 
+    19596, 19667, 19738, 19809, 19880, 19951, 20022, 19951, 20093, 20164, 
+    20093, 20235, 20306, 20377, 20448, 20519, 20590, 20661, 20661, 20732, 
+    20803, 20803, 20874,  9301,  9301,  9301, 20945, 21016, 21087, 21087, 
+    21158,  9656,  9656,  9656, 21229, 21300, 10011, 10082, 21371, 21371, 
+    21442, 21442, 17395, 21513, 10934, 10934, 10934, 21584, 21655, 11147, 
+    11147, 11147, 21726, 21797, 11289, 11289, 11289, 21868, 21939, 11431, 
+    11431, 11431, 17963, 22010, 22081, 11644, 11644, 11644, 18176, 22152, 
+    22223, 11857, 11857, 11857, 22294, 12070, 12070, 12070, 22365, 22436, 
+    12212, 12212, 12212, 22507, 22578, 12354, 12354, 12354, 18744, 22649, 
+    22720, 12567, 12567, 12567, 18957, 22791,  4473,  4473, 22862, 22933, 
+     4473, 23004, 23075, 23146, 23217,  7455,  4473,  4473, 23288, 23359, 
+    23430, 23501, 23572, 15549, 15904,  9301, 23643, 16401,  9656, 23714, 
+     4473,  9869, 10934, 11147, 23785, 11289, 23856, 11431, 23927,  4473, 
+    11644, 23998, 11857, 12070, 24069, 12212, 24140, 12354, 24211,  4473, 
+    12567, 24282, 24353, 24424, 24495, 24566, 24637, 24708, 24779, 24850, 
+    24921, 24992, 25063, 25134, 25205, 25276, 25347, 25418, 25489, 25560, 
+    25631, 25702, 25773, 25844,  4899, 25915, 25986, 26057, 26128, 26199, 
+     4473,  4473, 26270, 26341, 26412, 26483, 17963, 18176, 26554, 26625, 
+    18744, 18957, 26696, 26767, 26838, 26909,  4473,  4473,  4473, 26980, 
+    27051, 27122, 27193, 27264, 27335, 27406, 27477,  7171, 27548, 27619, 
+    27690, 27761, 27832, 27903, 27974,  4473, 28045, 28116,  9301,  9656, 
+    11147, 11289, 12070, 12212, 28187, 28258, 28329, 28400, 28471, 28542, 
+    28613, 28684,  4899, 28755, 28826, 28897, 28968, 29039, 29110, 29181, 
+    29252, 29323, 29394, 29465, 29536, 29607, 29678, 29749, 29820, 29891, 
+    29962, 30033, 30104, 30175, 30246, 30317, 30388, 30459, 30530, 30601, 
+    30672, 30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240,  4473, 
+    31311, 31382, 31453, 31524,  7171, 31595, 31666, 31737, 31808, 31879, 
+    31950, 32021, 32092, 32163, 32234, 32305, 32376, 32447, 32518
   };
 
   /** 
    * The packed transition table of the DFA
    */
   final private static String yy_packed = 
-    "\1\71\1\72\11\71\1\73\1\71\1\74\4\71\1\75"+
-    "\42\71\1\76\21\71\1\77\1\100\105\77\1\101\1\102"+
-    "\21\101\1\103\2\101\1\104\60\101\1\105\1\106\105\105"+
-    "\1\101\1\102\5\101\1\107\16\101\1\104\61\101\1\102"+
-    "\2\101\1\110\1\111\2\101\2\112\5\101\1\111\6\101"+
-    "\1\111\1\113\1\114\4\112\1\101\10\112\1\115\2\112"+
-    "\1\101\11\112\1\115\1\112\1\101\4\112\1\101\4\112"+
-    "\1\101\4\112\2\101\1\112\1\101\1\102\2\101\1\110"+
-    "\1\116\11\101\1\116\6\101\1\116\60\101\1\117\1\120"+
-    "\2\117\1\121\21\117\1\104\60\117\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\101\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\101\1\102\2\101"+
-    "\1\122\1\111\2\101\2\123\5\101\1\111\6\101\1\111"+
-    "\6\123\1\101\13\123\1\124\13\123\1\101\4\123\1\101"+
-    "\4\123\1\101\4\123\2\101\1\123\1\125\1\102\1\101"+
-    "\1\126\1\127\1\111\4\125\1\130\1\125\1\131\2\125"+
-    "\1\111\6\125\1\111\60\125\1\101\1\102\2\101\1\132"+
-    "\21\101\1\104\61\101\1\102\1\133\1\134\1\101\1\111"+
-    "\2\101\2\135\5\101\1\111\6\101\1\111\6\135\1\101"+
-    "\13\135\1\101\13\135\1\101\4\135\1\101\4\135\1\101"+
-    "\4\135\2\101\1\135\1\101\1\102\1\133\1\134\1\101"+
-    "\1\111\2\101\2\135\5\101\1\111\6\101\1\111\6\135"+
-    "\1\101\13\135\1\136\13\135\1\101\4\135\1\101\4\135"+
-    "\1\101\4\135\2\101\1\135\1\137\1\102\1\133\1\140"+
-    "\1\137\1\111\4\137\1\141\1\137\1\142\2\137\1\111"+
-    "\6\137\1\111\60\137\1\101\1\102\3\101\1\111\11\101"+
-    "\1\111\6\101\1\111\60\101\1\143\1\144\20\143\1\145"+
-    "\64\143\1\101\1\146\3\101\1\111\2\101\2\147\5\101"+
-    "\1\111\2\101\1\150\3\101\1\111\6\147\1\101\13\147"+
-    "\1\101\13\147\1\101\4\147\1\101\4\147\1\101\4\147"+
-    "\2\101\1\147\1\101\1\146\3\101\1\151\11\101\1\151"+
-    "\2\101\1\150\3\101\1\151\61\101\1\146\3\101\1\111"+
-    "\2\101\2\152\5\101\1\111\2\101\1\150\3\101\1\111"+
-    "\6\152\1\101\13\152\1\101\13\152\1\101\4\152\1\101"+
-    "\4\152\1\101\4\152\2\101\1\152\1\101\1\146\3\101"+
-    "\1\111\2\101\2\152\5\101\1\111\2\101\1\150\3\101"+
-    "\1\111\6\152\1\101\13\152\1\153\13\152\1\101\4\152"+
-    "\1\101\4\152\1\101\4\152\2\101\1\152\1\154\1\146"+
-    "\1\101\1\155\1\154\1\111\4\154\1\156\1\154\1\157"+
-    "\2\154\1\111\2\154\1\160\3\154\1\111\60\154\1\161"+
-    "\1\162\1\163\1\164\4\161\2\165\15\161\6\166\1\161"+
-    "\13\166\1\161\13\166\1\161\4\166\1\161\4\166\1\161"+
-    "\1\167\3\166\2\161\1\166\1\101\1\170\1\163\1\164"+
-    "\1\101\1\111\2\101\2\171\5\101\1\111\6\101\1\111"+
-    "\6\171\1\101\13\171\1\101\13\171\1\101\4\171\1\101"+
-    "\4\171\1\101\4\171\2\101\1\171\1\101\1\170\1\163"+
-    "\1\164\1\101\1\111\2\101\2\171\5\101\1\111\6\101"+
-    "\1\111\6\171\1\101\13\171\1\172\13\171\1\101\4\171"+
-    "\1\101\4\171\1\101\4\171\2\101\1\171\1\173\1\174"+
-    "\1\163\1\175\1\173\1\111\4\173\1\176\1\173\1\177"+
-    "\1\200\1\173\1\111\6\173\1\111\36\173\1\201\21\173"+
-    "\1\101\1\202\1\203\2\101\1\111\11\101\1\111\6\101"+
-    "\1\111\10\101\1\204\1\205\2\101\1\206\11\101\1\206"+
-    "\1\101\1\205\1\204\27\101\1\102\1\203\2\101\1\111"+
-    "\11\101\1\111\6\101\1\111\6\101\1\207\52\101\1\102"+
-    "\1\203\2\101\1\111\2\101\2\210\5\101\1\111\6\101"+
-    "\1\111\6\210\1\207\13\210\1\101\13\210\1\101\4\210"+
-    "\1\101\4\210\1\101\4\210\2\101\1\210\1\101\1\102"+
-    "\1\203\2\101\1\111\11\101\1\111\6\101\1\111\6\101"+
-    "\1\207\7\101\1\211\6\101\1\212\11\101\1\211\12\101"+
-    "\1\212\5\101\1\213\1\102\1\203\1\214\1\213\1\111"+
-    "\4\213\1\215\1\213\1\216\2\213\1\111\6\213\1\111"+
-    "\6\213\1\217\51\213\1\220\1\102\1\203\1\221\1\220"+
-    "\1\111\4\220\1\222\1\220\1\223\2\220\1\111\6\220"+
-    "\1\111\6\220\1\224\51\220\1\225\1\102\1\203\1\226"+
-    "\1\225\1\111\4\225\1\227\1\225\1\230\2\225\1\111"+
-    "\6\225\1\111\60\225\1\231\1\232\1\233\104\231\1\234"+
-    "\1\102\1\203\1\235\1\234\1\111\4\234\1\236\1\234"+
-    "\1\237\2\234\1\111\6\234\1\111\60\234\1\240\1\241"+
-    "\1\242\104\240\1\243\1\244\105\243\1\101\1\102\24\101"+
-    "\1\104\60\101\1\245\1\246\105\245\1\101\1\102\5\101"+
-    "\1\247\16\101\1\104\60\101\1\250\1\251\3\250\1\252"+
-    "\6\250\1\253\1\254\1\250\1\252\6\250\1\252\36\250"+
-    "\1\255\21\250\1\256\1\251\3\256\1\257\4\256\1\260"+
-    "\2\256\1\261\1\256\1\257\6\256\1\257\36\256\1\262"+
-    "\21\256\1\263\1\264\10\263\1\265\1\263\1\266\1\267"+
-    "\67\263\1\270\1\263\1\271\1\272\12\271\1\101\11\271"+
-    "\1\273\60\271\1\274\1\275\10\274\1\101\13\274\1\276"+
-    "\60\274\1\101\1\102\12\101\1\277\11\101\1\104\61\101"+
-    "\1\102\10\101\1\300\13\101\1\104\60\101\1\301\1\302"+
-    "\10\301\1\260\71\301\1\303\1\304\1\301\1\305\1\306"+
-    "\12\305\1\253\67\305\1\307\1\304\1\305\1\310\1\311"+
-    "\10\310\1\312\1\310\1\313\50\310\1\314\17\310\1\315"+
-    "\1\310\1\316\1\317\12\316\1\101\11\316\1\320\60\316"+
-    "\1\321\1\322\10\321\1\101\13\321\1\323\60\321\1\101"+
-    "\1\102\12\101\1\324\11\101\1\104\61\101\1\102\10\101"+
-    "\1\325\13\101\1\104\60\101\1\326\1\327\10\326\1\260"+
-    "\71\326\1\330\1\331\1\326\1\332\1\333\12\332\1\253"+
-    "\67\332\1\334\1\331\1\332\1\71\1\0\11\71\1\0"+
-    "\1\71\1\0\4\71\1\0\42\71\1\0\21\71\3\0"+
-    "\1\335\1\336\15\0\1\337\2\0\1\340\66\0\1\341"+
-    "\2\0\2\342\5\0\1\341\6\0\1\341\6\342\1\0"+
-    "\13\342\1\0\13\342\1\343\4\342\1\0\4\342\1\0"+
-    "\4\342\2\0\1\342\1\344\1\0\11\344\1\0\1\344"+
-    "\1\345\1\346\3\344\1\0\64\344\5\0\1\341\2\0"+
-    "\2\347\5\0\1\341\6\0\1\341\6\347\1\0\13\347"+
-    "\1\0\13\347\1\0\4\347\1\0\4\347\1\0\4\347"+
-    "\2\0\1\347\1\344\1\0\11\344\1\0\2\344\1\350"+
-    "\3\344\1\0\42\344\1\351\21\344\131\0\1\337\2\0"+
-    "\1\352\104\0\1\353\72\0\1\354\101\0\1\355\111\0"+
-    "\1\111\11\0\1\111\6\0\1\111\66\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\112\6\0"+
-    "\1\112\6\0\2\112\2\356\2\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\2\112\1\356\1\357\2\112"+
-    "\1\0\13\112\1\0\13\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\112\6\0\1\112\6\0\2\112"+
-    "\2\360\2\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\5\0\1\116\11\0\1\116"+
-    "\6\0\1\116\62\0\1\361\106\0\1\362\112\0\4\123"+
-    "\6\0\1\123\6\0\6\123\1\0\13\123\1\0\13\123"+
-    "\1\0\4\123\1\0\11\123\2\0\1\123\1\125\2\0"+
-    "\1\363\1\125\1\0\4\125\1\0\1\125\1\0\2\125"+
-    "\1\0\6\125\1\0\61\125\1\0\1\362\1\363\1\125"+
-    "\1\0\4\125\1\0\1\125\1\0\2\125\1\0\6\125"+
-    "\1\0\60\125\1\364\1\0\10\364\1\365\2\364\1\366"+
-    "\47\364\1\366\21\364\1\367\1\0\12\367\1\365\1\370"+
-    "\47\367\1\370\21\367\2\0\1\133\1\371\111\0\4\135"+
-    "\6\0\1\135\6\0\6\135\1\0\13\135\1\0\13\135"+
-    "\1\0\4\135\1\0\11\135\2\0\1\135\1\137\2\0"+
-    "\1\372\1\137\1\0\4\137\1\0\1\137\1\0\2\137"+
-    "\1\0\6\137\1\0\61\137\1\0\1\133\1\373\1\137"+
-    "\1\0\4\137\1\0\1\137\1\0\2\137\1\0\6\137"+
-    "\1\0\60\137\1\141\1\0\1\374\1\375\1\141\1\374"+
-    "\4\141\1\376\1\141\1\374\1\377\1\141\1\374\6\141"+
-    "\1\374\36\141\1\377\21\141\1\142\1\0\1\u0100\1\u0101"+
-    "\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\u0102\1\142"+
-    "\1\u0100\6\142\1\u0100\36\142\1\u0102\21\142\2\0\1\u0103"+
-    "\126\0\1\337\2\0\1\u0104\67\0\4\147\6\0\1\147"+
-    "\6\0\6\147\1\0\13\147\1\0\13\147\1\0\4\147"+
-    "\1\0\11\147\2\0\1\147\2\0\1\u0105\111\0\1\151"+
-    "\11\0\1\151\6\0\1\151\66\0\4\152\6\0\1\152"+
-    "\6\0\6\152\1\0\13\152\1\0\13\152\1\0\4\152"+
-    "\1\0\11\152\2\0\1\152\1\154\2\0\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\u0107\1\0\10\u0107\1\u0108\2\u0107\1\u0109"+
-    "\47\u0107\1\u0109\21\u0107\1\u010a\1\0\12\u010a\1\u0108\1\u010b"+
-    "\47\u010a\1\u010b\21\u010a\1\154\1\0\1\u0105\1\u0106\1\154"+
-    "\1\0\4\154\1\0\1\154\1\0\2\154\1\0\6\154"+
-    "\1\0\60\154\1\161\3\0\23\161\6\0\1\161\13\0"+
-    "\1\161\13\0\1\161\4\0\1\161\4\0\1\161\4\0"+
-    "\2\161\4\0\1\335\16\0\1\337\2\0\1\340\63\0"+
-    "\1\u010c\104\0\1\161\3\0\2\161\4\165\6\161\1\165"+
-    "\6\161\6\166\1\161\13\166\1\161\13\166\1\161\4\166"+
-    "\1\161\4\166\1\165\4\166\2\161\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\13\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\6\0\4\166"+
-    "\6\0\1\166\6\0\6\166\1\0\7\166\1\u010d\3\166"+
-    "\1\0\13\166\1\0\4\166\1\0\11\166\2\0\1\166"+
-    "\3\0\1\335\4\0\2\u010e\10\0\1\337\2\0\1\340"+
-    "\1\0\6\u010e\1\0\13\u010e\1\0\13\u010e\1\0\4\u010e"+
-    "\1\0\4\u010e\1\0\4\u010e\2\0\1\u010e\6\0\4\171"+
-    "\6\0\1\171\6\0\6\171\1\0\13\171\1\0\13\171"+
-    "\1\0\4\171\1\0\11\171\2\0\1\171\1\173\2\0"+
-    "\1\u010f\1\173\1\0\4\173\1\0\1\173\1\0\2\173"+
-    "\1\0\6\173\1\0\60\173\3\0\1\335\4\0\2\u0110"+
-    "\10\0\1\337\2\0\1\340\1\0\6\u0110\1\0\13\u0110"+
-    "\1\0\13\u0110\1\0\4\u0110\1\0\4\u0110\1\0\4\u0110"+
-    "\2\0\1\u0110\1\173\1\0\1\u010c\1\u010f\1\173\1\0"+
-    "\4\173\1\0\1\173\1\0\2\173\1\0\6\173\1\0"+
-    "\60\173\1\u0111\1\0\10\u0111\1\u0112\2\u0111\1\u0113\47\u0111"+
-    "\1\u0113\21\u0111\1\u0114\1\0\12\u0114\1\u0112\1\u0115\47\u0114"+
-    "\1\u0115\21\u0114\1\173\2\0\1\u010f\1\173\1\0\4\173"+
-    "\1\0\1\173\1\0\1\173\1\u0116\1\0\6\173\1\0"+
-    "\61\173\2\0\1\u010f\1\173\1\0\4\173\1\0\1\173"+
-    "\1\0\1\173\1\u0117\1\0\6\173\1\0\60\173\3\0"+
-    "\1\335\16\0\1\337\2\0\1\u0104\130\0\1\u0118\2\0"+
-    "\1\u0118\75\0\1\u0119\14\0\1\u0119\63\0\2\u011a\52\0"+
-    "\23\u011b\1\u011c\63\u011b\6\0\4\210\6\0\1\210\6\0"+
-    "\6\210\1\0\13\210\1\0\13\210\1\0\4\210\1\0"+
-    "\11\210\2\0\1\210\53\0\1\u011d\5\0\1\u011d\116\0"+
-    "\1\u011e\10\0\1\u011e\4\0\1\213\2\0\1\u011f\1\213"+
-    "\1\0\4\213\1\0\1\213\1\0\2\213\1\0\6\213"+
-    "\1\0\60\213\1\u0120\1\0\10\u0120\1\u0121\2\u0120\1\u0122"+
-    "\47\u0120\1\u0122\21\u0120\1\u0123\1\0\1\u0123\2\u0124\1\u0123"+
-    "\4\u0124\2\u0123\1\u0125\1\u0126\1\u0123\4\u0124\1\u0123\11\u0124"+
-    "\1\u0123\27\u0124\1\u0126\10\u0124\2\u0123\4\u0124\2\u0123\1\u0124"+
-    "\1\217\2\u011b\1\u0127\1\217\1\u011b\4\217\1\u011b\1\217"+
-    "\1\u011b\2\217\1\u011b\3\217\1\u0128\2\217\1\u011b\60\217"+
-    "\1\220\2\0\1\u0129\1\220\1\0\4\220\1\0\1\220"+
-    "\1\0\2\220\1\0\6\220\1\0\60\220\12\u012a\1\u012b"+
-    "\74\u012a\14\u012c\1\u012b\72\u012c\1\224\2\u011b\1\u012d\1\224"+
-    "\1\u011b\4\224\1\u011b\1\224\1\u011b\2\224\1\u011b\3\224"+
-    "\1\u012e\2\224\1\u011b\60\224\1\225\2\0\1\u012f\1\225"+
-    "\1\0\4\225\1\0\1\225\1\0\2\225\1\0\6\225"+
-    "\1\0\60\225\1\u0130\1\0\10\u0130\1\u0131\2\u0130\1\u0132"+
-    "\47\u0130\1\u0132\21\u0130\1\u0133\1\0\1\u0133\2\u0134\1\u0133"+
-    "\4\u0134\2\u0133\1\u0135\1\u0136\1\u0133\4\u0134\1\u0133\11\u0134"+
-    "\1\u0133\27\u0134\1\u0136\10\u0134\2\u0133\4\u0134\2\u0133\1\u0134"+
-    "\2\231\1\0\106\231\1\0\17\231\1\u0137\2\231\1\u0138"+
-    "\61\231\1\234\2\0\1\u0139\1\234\1\0\4\234\1\0"+
-    "\1\234\1\0\2\234\1\0\6\234\1\0\60\234\1\u013a"+
-    "\1\0\10\u013a\1\u013b\2\u013a\1\u013c\47\u013a\1\u013c\21\u013a"+
-    "\1\u013d\1\0\1\u013d\2\u013e\1\u013d\4\u013e\2\u013d\1\u013f"+
-    "\1\u0140\1\u013d\4\u013e\1\u013d\11\u013e\1\u013d\27\u013e\1\u0140"+
-    "\10\u013e\2\u013d\4\u013e\2\u013d\1\u013e\2\240\1\0\106\240"+
-    "\1\0\17\240\1\u0141\2\240\1\u0142\61\240\7\0\1\u0143"+
-    "\77\0\1\250\1\0\12\250\1\0\1\u0144\47\250\1\u0144"+
-    "\21\250\3\0\1\u0145\16\0\1\337\2\0\1\352\61\0"+
-    "\1\250\1\0\3\250\1\252\6\250\1\0\1\u0144\1\250"+
-    "\1\252\6\250\1\252\36\250\1\u0144\37\250\1\u0146\106\250"+
-    "\1\u0147\70\250\1\256\1\0\10\256\1\0\2\256\1\u0148"+
-    "\47\256\1\u0148\22\256\1\0\3\256\1\257\4\256\1\0"+
-    "\2\256\1\u0148\1\256\1\257\6\256\1\257\36\256\1\u0148"+
-    "\37\256\1\u0149\106\256\1\u014a\70\256\12\263\1\0\1\263"+
-    "\1\0\1\u014b\67\263\1\0\13\263\1\0\1\263\1\0"+
-    "\1\u014b\4\263\1\u014c\62\263\1\0\13\263\1\0\1\263"+
-    "\1\0\1\263\1\u014d\66\263\1\u014e\1\263\14\u014f\1\u0150"+
-    "\106\u014f\1\u0150\5\u014f\1\u0151\2\u014f\1\u0152\61\u014f\12\u0153"+
-    "\1\u0154\106\u0153\1\u0154\7\u0153\1\u0155\2\u0153\1\u0156\61\u0153"+
-    "\12\301\1\0\71\301\1\u0157\1\0\13\301\1\0\7\301"+
-    "\1\u0158\61\301\1\u0157\1\0\13\301\1\u0159\74\301\14\305"+
-    "\1\0\67\305\1\u015a\1\0\15\305\1\0\5\305\1\u015b"+
-    "\61\305\1\u015a\1\0\15\305\1\u015c\72\305\12\310\1\0"+
-    "\1\310\1\0\70\310\1\0\13\310\1\0\1\310\1\0"+
-    "\5\310\1\u015d\62\310\1\0\13\310\1\0\1\310\1\0"+
-    "\1\310\1\u015e\66\310\1\0\1\310\14\u015f\1\u0160\106\u015f"+
-    "\1\u0160\5\u015f\1\u0161\2\u015f\1\u0162\61\u015f\12\u0163\1\u0164"+
-    "\106\u0163\1\u0164\7\u0163\1\u0165\2\u0163\1\u0166\61\u0163\12\326"+
-    "\1\0\71\326\1\u0167\1\0\13\326\1\0\7\326\1\u0168"+
-    "\61\326\1\u0167\1\0\13\326\1\u0169\74\326\14\332\1\0"+
-    "\67\332\1\u016a\1\0\15\332\1\0\5\332\1\u016b\61\332"+
-    "\1\u016a\1\0\15\332\1\u016c\72\332\7\0\1\u016d\11\0"+
-    "\1\u016e\3\0\1\u016f\23\0\1\u0170\44\0\1\u0171\25\0"+
-    "\1\u0172\56\0\1\341\2\0\2\u0173\5\0\1\341\6\0"+
-    "\1\341\6\u0173\1\0\13\u0173\1\0\13\u0173\1\0\4\u0173"+
-    "\1\0\4\u0173\1\0\4\u0173\2\0\1\u0173\1\u0174\1\0"+
-    "\3\u0174\1\u0175\4\342\1\u0174\1\0\3\u0174\1\u0175\1\342"+
-    "\1\u0174\1\0\3\u0174\1\u0175\6\342\1\u0174\13\342\1\u0174"+
-    "\13\342\1\u0174\4\342\1\u0176\11\342\2\u0174\1\342\20\0"+
-    "\1\u0177\7\0\1\u0178\73\0\1\345\71\0\105\346\1\u0179"+
-    "\1\346\1\u0174\1\0\3\u0174\1\u0175\4\347\1\u0174\1\0"+
-    "\3\u0174\1\u0175\1\347\1\u0174\1\0\3\u0174\1\u0175\6\347"+
-    "\1\u0174\13\347\1\u0174\13\347\1\u0174\4\347\1\u017a\11\347"+
-    "\2\u0174\1\347\105\350\1\u017b\1\350\65\0\1\351\56\0"+
-    "\1\u0172\53\0\1\u017c\106\0\1\u017d\112\0\4\112\6\0"+
-    "\1\112\6\0\4\112\2\u017e\1\0\13\112\1\0\13\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\4\112\1\u017e\1\u017f\1\0\13\112"+
-    "\1\0\13\112\1\0\4\112\1\0\11\112\2\0\1\112"+
-    "\6\0\4\112\6\0\1\112\6\0\6\112\1\0\13\112"+
-    "\1\0\2\112\1\u0180\10\112\1\0\4\112\1\0\6\112"+
-    "\1\u0180\2\112\2\0\1\112\12\364\1\365\3\364\1\0"+
-    "\70\364\14\367\1\365\1\367\1\0\70\367\1\374\1\0"+
-    "\10\374\1\376\2\374\1\u0181\47\374\1\u0181\21\374\1\141"+
-    "\2\374\1\375\1\141\1\374\4\141\1\376\1\141\1\374"+
-    "\1\141\1\137\1\374\6\141\1\374\60\141\1\u0100\1\0"+
-    "\12\u0100\1\376\1\u0182\47\u0100\1\u0182\21\u0100\1\142\2\u0100"+
-    "\1\u0101\1\142\1\u0100\4\142\1\u0100\1\142\1\376\1\142"+
-    "\1\137\1\u0100\6\142\1\u0100\60\142\12\u0107\1\u0108\3\u0107"+
-    "\1\0\70\u0107\14\u010a\1\u0108\1\u010a\1\0\70\u010a\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\6\166\1\u0183\2\166\2\0"+
-    "\1\166\6\0\4\u010e\6\0\1\u010e\6\0\6\u010e\1\0"+
-    "\13\u010e\1\0\13\u010e\1\0\4\u010e\1\0\11\u010e\2\0"+
-    "\1\u010e\6\0\4\u0110\6\0\1\u0110\6\0\6\u0110\1\0"+
-    "\13\u0110\1\0\13\u0110\1\0\4\u0110\1\0\11\u0110\2\0"+
-    "\1\u0110\12\u0111\1\u0112\3\u0111\1\0\70\u0111\14\u0114\1\u0112"+
-    "\1\u0114\1\0\70\u0114\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185"+
-    "\4\u0184\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185"+
-    "\56\u0184\1\173\1\u0184\1\u0187\2\u0188\1\u0189\1\u0187\1\u0188"+
-    "\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188\6\u0187\1\u0188"+
-    "\56\u0187\1\173\1\u0187\36\0\1\u018a\35\0\1\u018a\53\0"+
-    "\1\u018b\14\0\1\u018b\73\0\1\u018c\11\0\1\u018c\76\0"+
-    "\1\u018d\20\0\1\u018d\113\0\1\u018e\7\0\1\u018e\3\0"+
-    "\12\u0120\1\u0121\3\u0120\1\0\70\u0120\1\u0123\1\0\12\u0123"+
-    "\1\u0121\1\u018f\47\u0123\1\u018f\22\u0123\1\0\12\u0123\1\u0190"+
-    "\1\u018f\47\u0123\1\u018f\21\u0123\14\0\1\u0191\72\0\14\u0123"+
-    "\1\u0190\1\u0123\1\0\70\u0123\12\u0130\1\u0131\3\u0130\1\0"+
-    "\70\u0130\1\u0133\1\0\12\u0133\1\u0131\1\u0192\47\u0133\1\u0192"+
-    "\22\u0133\1\0\12\u0133\1\u0193\1\u0192\47\u0133\1\u0192\21\u0133"+
-    "\14\0\1\u0194\72\0\14\u0133\1\u0193\1\u0133\1\0\70\u0133"+
-    "\2\231\1\0\4\231\1\u0195\11\231\1\u0196\3\231\1\u0197"+
-    "\23\231\1\u0198\37\231\1\0\32\231\1\u0199\51\231\12\u013a"+
-    "\1\u013b\3\u013a\1\0\70\u013a\1\u013d\1\0\12\u013d\1\u013b"+
-    "\1\u019a\47\u013d\1\u019a\22\u013d\1\0\12\u013d\1\u019b\1\u019a"+
-    "\47\u013d\1\u019a\21\u013d\14\0\1\u019c\72\0\14\u013d\1\u019b"+
-    "\1\u013d\1\0\70\u013d\2\240\1\0\4\240\1\u019d\11\240"+
-    "\1\u019e\3\240\1\u019f\23\240\1\u01a0\37\240\1\0\32\240"+
-    "\1\u01a1\51\240\22\0\1\u01a2\64\0\16\250\1\0\70\250"+
-    "\16\256\1\0\70\256\12\263\1\0\1\263\1\0\1\263"+
-    "\1\u01a3\66\263\1\u014e\10\263\1\u01a4\2\263\1\0\1\263"+
-    "\1\0\1\u014b\3\263\1\u01a5\3\263\1\u01a6\23\263\1\u01a7"+
-    "\33\263\1\0\1\263\12\u01a3\1\0\1\u01a3\1\0\70\u01a3"+
-    "\1\0\1\u01a3\12\u014e\1\0\1\u014e\1\0\1\u01a8\67\u014e"+
-    "\1\0\1\u014e\7\u014f\1\u01a9\4\u014f\1\u0150\4\u014f\1\u01aa"+
-    "\3\u014f\1\u01ab\23\u014f\1\u01ac\51\u014f\1\u0150\20\u014f\1\u01ad"+
-    "\51\u014f\7\u0153\1\u01ae\2\u0153\1\u0154\6\u0153\1\u01af\3\u0153"+
-    "\1\u01b0\23\u0153\1\u01b1\47\u0153\1\u0154\22\u0153\1\u01b2\51\u0153"+
-    "\12\301\1\0\103\301\1\u01b3\2\301\1\0\6\301\1\u01b4"+
-    "\3\301\1\u01b5\23\301\1\u01b6\32\301\1\u0157\1\0\1\301"+
-    "\104\u01b7\1\u01b8\2\u01b7\14\305\1\0\101\305\1\u01b9\4\305"+
-    "\1\0\4\305\1\u01ba\3\305\1\u01bb\23\305\1\u01bc\32\305"+
-    "\1\u015a\1\0\1\305\104\u01bd\1\u01be\2\u01bd\7\310\1\u01bf"+
-    "\2\310\1\0\1\310\1\0\4\310\1\u01c0\3\310\1\u01c1"+
-    "\23\310\1\u01c2\33\310\1\0\1\310\7\u015f\1\u01c3\4\u015f"+
-    "\1\u0160\4\u015f\1\u01c4\3\u015f\1\u01c5\23\u015f\1\u01c6\51\u015f"+
-    "\1\u0160\20\u015f\1\u01c7\51\u015f\7\u0163\1\u01c8\2\u0163\1\u0164"+
-    "\6\u0163\1\u01c9\3\u0163\1\u01ca\23\u0163\1\u01cb\47\u0163\1\u0164"+
-    "\22\u0163\1\u01cc\51\u0163\12\326\1\0\103\326\1\u01cd\2\326"+
-    "\1\0\6\326\1\u01ce\3\326\1\u01cf\23\326\1\u01d0\32\326"+
-    "\1\u0167\1\0\1\326\104\u01d1\1\u01d2\2\u01d1\14\332\1\0"+
-    "\101\332\1\u01d3\4\332\1\0\4\332\1\u01d4\3\332\1\u01d5"+
-    "\23\332\1\u01d6\32\332\1\u016a\1\0\1\332\104\u01d7\1\u01d8"+
-    "\2\u01d7\7\0\1\u01d9\106\0\1\u01da\135\0\1\u01db\50\0"+
-    "\1\u0173\1\0\11\u0173\1\0\6\u0173\1\0\64\u0173\1\u0174"+
-    "\1\0\11\u0174\1\0\6\u0174\1\0\47\u0174\1\0\15\u0174"+
-    "\1\0\3\u0174\1\u0175\5\u0174\1\0\3\u0174\1\u0175\2\u0174"+
-    "\1\0\3\u0174\1\u0175\43\u0174\1\u01dc\14\u0174\20\0\1\u0177"+
-    "\51\0\1\u01dd\34\0\1\u01de\15\0\3\u01de\2\0\1\u01de"+
-    "\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de\2\0\2\u01de"+
-    "\6\0\1\u01de\11\0\1\112\1\u01df\2\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\13\112\1\0\4\112"+
-    "\1\0\11\112\2\0\1\112\6\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\11\112\1\u01e0\1\112\1\0\1\u01e0"+
-    "\12\112\1\0\4\112\1\0\11\112\2\0\1\112\12\374"+
-    "\1\376\3\374\1\0\70\374\14\u0100\1\376\1\u0100\1\0"+
-    "\70\u0100\6\0\3\166\1\u01e1\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\1\u0184\2\u0185\1\u0186\1\u0184\1\u0185\4\u0184"+
-    "\1\u0185\1\u0184\1\u0185\2\u0184\1\u0185\6\u0184\1\u0185\56\u0184"+
-    "\1\u01e2\1\u0184\105\u0185\1\u01e3\1\u0185\1\u0187\2\u0188\1\u0189"+
-    "\1\u0187\1\u0188\4\u0187\1\u0188\1\u0187\1\u0188\2\u0187\1\u0188"+
-    "\6\u0187\1\u0188\56\u0187\1\u01e2\1\u0187\105\u0188\1\u01e4\1\u0188"+
-    "\41\0\1\u01e5\14\0\1\u01e5\63\0\2\u01e6\103\0\2\u01e7"+
-    "\115\0\1\u01e8\14\0\1\u01e8\63\0\2\u01e9\52\0\14\u0123"+
-    "\1\u0121\1\u0123\1\0\70\u0123\3\0\2\u01ea\1\0\4\u01ea"+
-    "\2\0\1\u0125\1\u01ea\1\0\4\u01ea\1\0\11\u01ea\1\0"+
-    "\40\u01ea\2\0\4\u01ea\2\0\1\u01ea\14\u0133\1\u0131\1\u0133"+
-    "\1\0\70\u0133\3\0\2\u01eb\1\0\4\u01eb\2\0\1\u0135"+
-    "\1\u01eb\1\0\4\u01eb\1\0\11\u01eb\1\0\40\u01eb\2\0"+
-    "\4\u01eb\2\0\1\u01eb\2\231\1\0\4\231\1\u01ec\101\231"+
-    "\1\0\33\231\1\u01ed\50\231\14\u013d\1\u013b\1\u013d\1\0"+
-    "\70\u013d\3\0\2\u01ee\1\0\4\u01ee\2\0\1\u013f\1\u01ee"+
-    "\1\0\4\u01ee\1\0\11\u01ee\1\0\40\u01ee\2\0\4\u01ee"+
-    "\2\0\1\u01ee\2\240\1\0\4\240\1\u01ef\101\240\1\0"+
-    "\33\240\1\u01f0\50\240\2\0\1\u01f1\104\0\7\263\1\u01f2"+
-    "\2\263\1\0\1\263\1\0\1\u014b\67\263\1\0\1\263"+
-    "\12\u014e\1\0\1\u014e\1\0\1\u014e\1\0\70\u014e\7\u014f"+
-    "\1\u01f3\4\u014f\1\u0150\106\u014f\1\u0150\21\u014f\1\u01f4\50\u014f"+
-    "\7\u0153\1\u01f5\2\u0153\1\u0154\106\u0153\1\u0154\23\u0153\1\u01f6"+
-    "\50\u0153\7\301\1\u01f7\2\301\1\0\71\301\1\u0157\1\0"+
-    "\1\301\12\u01f8\1\u01f9\72\u01f8\1\0\1\u01f8\7\305\1\u01fa"+
-    "\4\305\1\0\67\305\1\u015a\1\0\1\305\14\u01fb\1\u01f9"+
-    "\70\u01fb\1\0\1\u01fb\7\310\1\u01fc\2\310\1\0\1\310"+
-    "\1\0\70\310\1\0\1\310\7\u015f\1\u01fd\4\u015f\1\u0160"+
-    "\106\u015f\1\u0160\21\u015f\1\u01fe\50\u015f\7\u0163\1\u01ff\2\u0163"+
-    "\1\u0164\106\u0163\1\u0164\23\u0163\1\u0200\50\u0163\7\326\1\u0201"+
-    "\2\326\1\0\71\326\1\u0167\1\0\1\326\12\u0202\1\u0203"+
-    "\72\u0202\1\0\1\u0202\7\332\1\u0204\4\332\1\0\67\332"+
-    "\1\u016a\1\0\1\332\14\u0205\1\u0203\70\u0205\1\0\1\u0205"+
-    "\37\0\1\u0206\141\0\1\u01dc\34\0\1\u01de\15\0\3\u01de"+
-    "\2\0\1\u01de\11\0\1\u01de\1\0\2\u01de\7\0\1\u01de"+
-    "\1\0\1\u01dd\2\u01de\6\0\1\u01de\11\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\7\112\1\u0207\3\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\6\112\1\u0208"+
-    "\4\112\1\0\13\112\1\0\1\112\1\u0208\2\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0209\4\166\1\0\6\166\1\u020a"+
-    "\4\166\1\0\4\166\1\0\11\166\2\0\1\166\53\0"+
-    "\1\u020b\5\0\1\u020b\73\0\1\u020c\14\0\1\u020c\66\0"+
-    "\1\u020d\11\0\1\u020d\74\0\1\u020e\11\0\1\u020e\77\0"+
-    "\1\u020f\14\0\1\u020f\23\0\2\231\1\0\34\231\1\u0210"+
-    "\47\231\2\240\1\0\34\240\1\u0211\47\240\14\u014f\1\u0150"+
-    "\22\u014f\1\u0212\47\u014f\12\u0153\1\u0154\24\u0153\1\u0213\47\u0153"+
-    "\12\u01f8\1\u01b7\71\u01f8\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u01bd"+
-    "\67\u01fb\1\u0215\1\u01bd\1\u01fb\14\u015f\1\u0160\22\u015f\1\u0216"+
-    "\47\u015f\12\u0163\1\u0164\24\u0163\1\u0217\47\u0163\12\u0202\1\u01d1"+
-    "\71\u0202\1\u0218\1\u01d1\1\u0202\14\u0205\1\u01d7\67\u0205\1\u0219"+
-    "\1\u01d7\1\u0205\40\0\1\u021a\54\0\4\112\6\0\1\112"+
-    "\6\0\6\112\1\0\13\112\1\0\4\112\1\u021b\6\112"+
-    "\1\0\4\112\1\0\11\112\2\0\1\112\6\0\4\112"+
-    "\6\0\1\112\6\0\6\112\1\0\3\112\1\u021c\7\112"+
-    "\1\0\4\112\1\u021c\6\112\1\0\4\112\1\0\11\112"+
-    "\2\0\1\112\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\11\166\1\u021d\1\166\1\0\13\166\1\0\4\166"+
-    "\1\0\11\166\2\0\1\166\6\0\4\166\6\0\1\166"+
-    "\6\0\6\166\1\0\10\166\1\u021e\2\166\1\0\13\166"+
-    "\1\0\4\166\1\0\11\166\2\0\1\166\54\0\1\u021f"+
-    "\24\0\1\u021f\52\0\1\u0220\20\0\1\u0220\70\0\1\u0221"+
-    "\13\0\1\u0221\53\0\2\u0222\112\0\1\u0223\35\0\1\u0223"+
-    "\12\0\2\231\1\0\35\231\1\u0224\46\231\2\240\1\0"+
-    "\35\240\1\u0225\46\240\14\u014f\1\u0150\23\u014f\1\u0226\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0227\46\u0153\12\u01f8\1\u0228\71\u01f8"+
-    "\1\u0214\1\u01b7\1\u01f8\14\u01fb\1\u0229\67\u01fb\1\u0215\1\u01bd"+
-    "\1\u01fb\14\u015f\1\u0160\23\u015f\1\u022a\46\u015f\12\u0163\1\u0164"+
-    "\25\u0163\1\u022b\46\u0163\12\u0202\1\u022c\71\u0202\1\u0218\1\u01d1"+
-    "\1\u0202\14\u0205\1\u022d\67\u0205\1\u0219\1\u01d7\1\u0205\41\0"+
-    "\1\u022e\53\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\7\112\1\u022f\3\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\11\166\1\u0230\1\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\6\166\1\u0231\4\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\43\0"+
-    "\1\u0232\11\0\1\u0232\72\0\1\u0233\14\0\1\u0233\71\0"+
-    "\1\u0234\14\0\1\u0234\30\0\2\231\1\0\36\231\1\u0235"+
-    "\45\231\2\240\1\0\36\240\1\u0236\45\240\14\u014f\1\u0150"+
-    "\24\u014f\1\u0237\45\u014f\12\u0153\1\u0154\26\u0153\1\u0238\45\u0153"+
-    "\14\u015f\1\u0160\24\u015f\1\u0239\45\u015f\12\u0163\1\u0164\26\u0163"+
-    "\1\u023a\45\u0163\40\0\1\u023b\54\0\4\112\6\0\1\112"+
-    "\6\0\5\112\1\u023c\1\0\13\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u023d"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u023e"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\2\231\1\0\35\231\1\u023f\46\231\2\240\1\0"+
-    "\35\240\1\u0240\46\240\14\u014f\1\u0150\23\u014f\1\u0241\46\u014f"+
-    "\12\u0153\1\u0154\25\u0153\1\u0242\46\u0153\14\u015f\1\u0160\23\u015f"+
-    "\1\u0243\46\u015f\12\u0163\1\u0164\25\u0163\1\u0244\46\u0163\35\0"+
-    "\1\u0245\57\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0246\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\1\166\1\u0247\7\166\2\0\1\166\2\231\1\0\32\231"+
-    "\1\u0248\51\231\2\240\1\0\32\240\1\u0249\51\240\14\u014f"+
-    "\1\u0150\20\u014f\1\u024a\51\u014f\12\u0153\1\u0154\22\u0153\1\u024b"+
-    "\51\u0153\14\u015f\1\u0160\20\u015f\1\u024c\51\u015f\12\u0163\1\u0164"+
-    "\22\u0163\1\u024d\51\u0163\6\0\4\112\6\0\1\112\6\0"+
-    "\6\112\1\0\7\112\1\u024e\3\112\1\0\13\112\1\0"+
-    "\4\112\1\0\11\112\2\0\1\112\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u024f"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\112\6\0\1\112\6\0\6\112\1\0\13\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\u0250\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u0251"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\5\112\1\u0252\5\112\1\0\13\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\4\166\1\u0253\6\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\112\6\0"+
-    "\1\112\6\0\6\112\1\0\5\112\1\u0254\5\112\1\0"+
-    "\13\112\1\0\4\112\1\0\11\112\2\0\1\112\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\5\166\1\u0255"+
-    "\5\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\112\6\0\1\112\6\0\6\112\1\0"+
-    "\13\112\1\0\4\112\1\u0256\6\112\1\0\4\112\1\0"+
-    "\11\112\2\0\1\112\6\u0257\4\u0258\6\u0257\1\u0258\5\u0257"+
-    "\1\0\6\u0258\1\u0257\13\u0258\1\u0257\13\u0258\1\u0257\4\u0258"+
-    "\1\u0257\11\u0258\2\u0257\1\u0258\42\0\1\u0259\3\0\1\u025a"+
-    "\7\0\1\u025b\1\u025c\21\0\1\u025d\13\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\4\166\1\u025e\3\166\1\u025f"+
-    "\2\166\1\0\4\166\1\u0260\1\u0261\5\166\1\0\4\166"+
-    "\1\0\6\166\1\u0262\2\166\2\0\1\166\57\0\1\u0263"+
-    "\77\0\1\u0264\115\0\1\u0265\105\0\1\u0266\107\0\1\u0267"+
-    "\35\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\5\166\1\u0268\5\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\12\166\1\u0269\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\5\166\1\u026a\5\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u026b"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u026c\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\44\0\1\u026d\136\0\1\u026e\107\0\1\u026f\67\0"+
-    "\1\u0270\125\0\1\u0271\17\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u0272\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\13\166\1\0"+
-    "\4\166\1\0\1\166\1\u0273\7\166\2\0\1\166\6\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\2\166\1\u0274\6\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\4\166\1\u0275\6\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\2\166\1\u0276\6\166\2\0\1\166\46\0\1\u0277\74\0"+
-    "\1\u0278\106\0\1\u0279\116\0\1\u027a\105\0\1\u027b\51\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\10\166\1\u027c"+
-    "\2\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\5\166\1\u027d"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\5\166"+
-    "\1\u027e\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\11\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\6\166\1\u027f\4\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\5\166\1\u0280\5\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\57\0"+
-    "\1\u0281\131\0\1\u0282\52\0\1\u0283\106\0\1\u0284\46\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\5\166\1\u0285\5\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u0286"+
-    "\1\166\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\10\166\1\u0287\2\166\1\0\13\166\1\0"+
-    "\4\166\1\0\11\166\2\0\1\166\6\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\10\166\1\u0288\2\166\1\0"+
-    "\13\166\1\0\4\166\1\0\11\166\2\0\1\166\103\0"+
-    "\1\u0289\63\0\1\u0271\131\0\1\u027b\106\0\1\u028a\11\0"+
-    "\4\166\6\0\1\166\6\0\6\166\1\0\13\166\1\0"+
-    "\13\166\1\0\4\166\1\0\10\166\1\u028b\2\0\1\166"+
-    "\6\0\4\166\6\0\1\166\6\0\6\166\1\0\13\166"+
-    "\1\0\6\166\1\u0276\4\166\1\0\4\166\1\0\11\166"+
-    "\2\0\1\166\6\0\4\166\6\0\1\166\6\0\6\166"+
-    "\1\0\13\166\1\0\13\166\1\0\4\166\1\0\10\166"+
-    "\1\u0280\2\0\1\166\6\0\4\166\6\0\1\166\6\0"+
-    "\6\166\1\0\13\166\1\0\13\166\1\0\4\166\1\0"+
-    "\10\166\1\u028c\2\0\1\166\34\0\1\u0271\154\0\1\u028d"+
-    "\12\0\4\166\6\0\1\166\6\0\5\166\1\u0276\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\11\166\2\0"+
-    "\1\166\6\0\4\166\6\0\1\166\6\0\6\166\1\0"+
-    "\13\166\1\0\13\166\1\0\4\166\1\0\7\166\1\u028e"+
-    "\1\166\2\0\1\166\56\0\1\u0271\36\0\4\166\6\0"+
-    "\1\166\6\0\6\166\1\0\13\166\1\0\4\166\1\u0276"+
-    "\6\166\1\0\4\166\1\0\11\166\2\0\1\166";
+    "\1\72\1\73\11\72\1\74\1\72\1\75\5\72\1\76"+
+    "\42\72\1\77\20\72\1\100\1\101\105\100\1\102\1\103"+
+    "\22\102\1\104\2\102\1\105\57\102\1\106\1\107\105\106"+
+    "\1\102\1\103\5\102\1\110\17\102\1\105\60\102\1\103"+
+    "\2\102\1\111\1\112\2\102\2\113\6\102\1\112\6\102"+
+    "\1\112\1\114\1\115\4\113\1\102\10\113\1\116\2\113"+
+    "\1\102\11\113\1\116\1\113\1\102\4\113\1\102\4\113"+
+    "\1\102\4\113\1\102\1\113\1\102\1\103\2\102\1\111"+
+    "\1\117\12\102\1\117\6\102\1\117\57\102\1\120\1\121"+
+    "\2\120\1\122\22\120\1\105\57\120\1\102\1\103\2\102"+
+    "\1\123\1\112\2\102\2\124\6\102\1\112\6\102\1\112"+
+    "\6\124\1\102\13\124\1\102\13\124\1\102\4\124\1\102"+
+    "\4\124\1\102\4\124\1\102\1\124\1\102\1\103\2\102"+
+    "\1\123\1\112\2\102\2\124\6\102\1\112\6\102\1\112"+
+    "\6\124\1\102\13\124\1\125\13\124\1\102\4\124\1\102"+
+    "\4\124\1\102\4\124\1\102\1\124\1\126\1\103\1\102"+
+    "\1\127\1\130\1\112\4\126\1\131\1\126\1\132\3\126"+
+    "\1\112\6\126\1\112\57\126\1\102\1\103\2\102\1\133"+
+    "\22\102\1\105\60\102\1\103\1\134\1\135\1\102\1\112"+
+    "\2\102\2\136\6\102\1\112\6\102\1\112\6\136\1\102"+
+    "\13\136\1\102\13\136\1\102\4\136\1\102\4\136\1\102"+
+    "\4\136\1\102\1\136\1\102\1\103\1\134\1\135\1\102"+
+    "\1\112\2\102\2\136\6\102\1\112\6\102\1\112\6\136"+
+    "\1\102\13\136\1\137\13\136\1\102\4\136\1\102\4\136"+
+    "\1\102\4\136\1\102\1\136\1\140\1\103\1\134\1\141"+
+    "\1\140\1\112\4\140\1\142\1\140\1\143\3\140\1\112"+
+    "\6\140\1\112\57\140\1\102\1\103\3\102\1\112\12\102"+
+    "\1\112\6\102\1\112\57\102\1\144\1\145\21\144\1\146"+
+    "\63\144\1\102\1\147\3\102\1\112\2\102\2\150\6\102"+
+    "\1\112\2\102\1\151\3\102\1\112\6\150\1\102\13\150"+
+    "\1\102\13\150\1\102\4\150\1\102\4\150\1\102\4\150"+
+    "\1\102\1\150\1\102\1\147\3\102\1\152\12\102\1\152"+
+    "\2\102\1\151\3\102\1\152\60\102\1\147\3\102\1\112"+
+    "\2\102\2\153\6\102\1\112\2\102\1\151\3\102\1\112"+
+    "\6\153\1\102\13\153\1\102\13\153\1\102\4\153\1\102"+
+    "\4\153\1\102\4\153\1\102\1\153\1\102\1\147\3\102"+
+    "\1\112\2\102\2\153\6\102\1\112\2\102\1\151\3\102"+
+    "\1\112\6\153\1\102\13\153\1\154\13\153\1\102\4\153"+
+    "\1\102\4\153\1\102\4\153\1\102\1\153\1\155\1\147"+
+    "\1\102\1\156\1\155\1\112\4\155\1\157\1\155\1\160"+
+    "\3\155\1\112\2\155\1\161\3\155\1\112\57\155\1\162"+
+    "\1\163\1\164\1\165\4\162\2\166\16\162\6\167\1\162"+
+    "\13\167\1\162\13\167\1\162\4\167\1\162\4\167\1\162"+
+    "\1\170\3\167\1\162\1\167\1\102\1\171\1\164\1\165"+
+    "\1\102\1\112\2\102\2\172\6\102\1\112\6\102\1\112"+
+    "\6\172\1\102\13\172\1\102\13\172\1\102\4\172\1\102"+
+    "\4\172\1\102\4\172\1\102\1\172\1\102\1\171\1\164"+
+    "\1\165\1\102\1\112\2\102\2\172\6\102\1\112\6\102"+
+    "\1\112\6\172\1\102\13\172\1\173\13\172\1\102\4\172"+
+    "\1\102\4\172\1\102\4\172\1\102\1\172\1\174\1\175"+
+    "\1\164\1\176\1\174\1\112\4\174\1\177\1\174\1\200"+
+    "\1\201\2\174\1\112\6\174\1\112\36\174\1\202\20\174"+
+    "\1\102\1\203\1\204\2\102\1\112\12\102\1\112\6\102"+
+    "\1\112\10\102\1\205\1\206\2\102\1\207\11\102\1\207"+
+    "\1\102\1\206\1\205\26\102\1\103\1\204\2\102\1\112"+
+    "\12\102\1\112\6\102\1\112\6\102\1\210\51\102\1\103"+
+    "\1\204\2\102\1\112\2\102\2\211\6\102\1\112\6\102"+
+    "\1\112\6\211\1\210\13\211\1\102\13\211\1\102\4\211"+
+    "\1\102\4\211\1\102\4\211\1\102\1\211\1\102\1\103"+
+    "\1\204\2\102\1\112\12\102\1\112\6\102\1\112\6\102"+
+    "\1\210\7\102\1\212\6\102\1\213\11\102\1\212\12\102"+
+    "\1\213\4\102\1\214\1\103\1\204\1\215\1\214\1\112"+
+    "\4\214\1\216\1\214\1\217\3\214\1\112\6\214\1\112"+
+    "\6\214\1\220\50\214\1\221\1\103\1\204\1\222\1\221"+
+    "\1\112\4\221\1\223\1\221\1\224\3\221\1\112\6\221"+
+    "\1\112\6\221\1\225\50\221\1\226\1\103\1\204\1\227"+
+    "\1\226\1\112\4\226\1\230\1\226\1\231\3\226\1\112"+
+    "\6\226\1\112\57\226\1\232\1\233\1\234\104\232\1\235"+
+    "\1\103\1\204\1\236\1\235\1\112\4\235\1\237\1\235"+
+    "\1\240\3\235\1\112\6\235\1\112\57\235\1\241\1\242"+
+    "\1\243\104\241\1\244\1\245\105\244\1\102\1\103\25\102"+
+    "\1\105\57\102\1\246\1\247\105\246\1\102\1\103\5\102"+
+    "\1\250\17\102\1\105\57\102\1\251\1\252\1\164\1\253"+
+    "\1\251\1\112\4\251\1\254\1\251\1\255\1\256\2\251"+
+    "\1\112\6\251\1\112\36\251\1\257\20\251\1\260\1\261"+
+    "\3\260\1\262\6\260\1\263\1\264\2\260\1\262\6\260"+
+    "\1\262\36\260\1\265\20\260\1\266\1\261\3\266\1\267"+
+    "\4\266\1\270\2\266\1\271\2\266\1\267\6\266\1\267"+
+    "\36\266\1\272\20\266\1\273\1\274\10\273\1\275\1\273"+
+    "\1\276\1\277\67\273\1\300\1\273\1\301\1\302\12\301"+
+    "\1\102\12\301\1\303\57\301\1\304\1\305\10\304\1\102"+
+    "\14\304\1\306\57\304\1\102\1\103\12\102\1\307\12\102"+
+    "\1\105\60\102\1\103\10\102\1\310\14\102\1\105\57\102"+
+    "\1\311\1\312\10\311\1\313\4\311\1\314\65\311\1\315"+
+    "\1\311\1\316\1\317\12\316\1\263\2\316\1\320\65\316"+
+    "\1\315\1\316\1\321\1\322\10\321\1\323\1\321\1\324"+
+    "\51\321\1\325\16\321\1\326\1\321\1\327\1\330\12\327"+
+    "\1\102\12\327\1\331\57\327\1\332\1\333\10\332\1\102"+
+    "\14\332\1\334\57\332\1\102\1\103\12\102\1\335\12\102"+
+    "\1\105\60\102\1\103\10\102\1\336\14\102\1\105\57\102"+
+    "\1\337\1\340\10\337\1\313\4\337\1\341\65\337\1\342"+
+    "\1\337\1\343\1\344\12\343\1\263\2\343\1\345\65\343"+
+    "\1\342\1\343\1\72\1\0\11\72\1\0\1\72\1\0"+
+    "\5\72\1\0\42\72\1\0\20\72\3\0\1\346\1\347"+
+    "\16\0\1\350\2\0\1\351\65\0\1\352\2\0\2\353"+
+    "\6\0\1\352\6\0\1\352\6\353\1\0\13\353\1\0"+
+    "\13\353\1\354\4\353\1\0\4\353\1\0\4\353\1\0"+
+    "\1\353\1\355\1\0\11\355\1\0\1\355\1\356\1\357"+
+    "\4\355\1\0\63\355\5\0\1\352\2\0\2\360\6\0"+
+    "\1\352\6\0\1\352\6\360\1\0\13\360\1\0\13\360"+
+    "\1\0\4\360\1\0\4\360\1\0\4\360\1\0\1\360"+
+    "\1\355\1\0\11\355\1\0\2\355\1\361\4\355\1\0"+
+    "\42\355\1\362\20\355\132\0\1\350\2\0\1\363\104\0"+
+    "\1\364\71\0\1\365\101\0\1\366\111\0\1\112\12\0"+
+    "\1\112\6\0\1\112\65\0\4\113\7\0\1\113\6\0"+
+    "\6\113\1\0\13\113\1\0\13\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\6\0\4\113\7\0\1\113\6\0"+
+    "\2\113\2\367\2\113\1\0\13\113\1\0\13\113\1\0"+
+    "\4\113\1\0\11\113\1\0\1\113\6\0\4\113\7\0"+
+    "\1\113\6\0\2\113\1\367\1\370\2\113\1\0\13\113"+
+    "\1\0\13\113\1\0\4\113\1\0\11\113\1\0\1\113"+
+    "\6\0\4\113\7\0\1\113\6\0\2\113\2\371\2\113"+
+    "\1\0\13\113\1\0\13\113\1\0\4\113\1\0\11\113"+
+    "\1\0\1\113\5\0\1\117\12\0\1\117\6\0\1\117"+
+    "\61\0\1\372\106\0\1\373\112\0\4\124\7\0\1\124"+
+    "\6\0\6\124\1\0\13\124\1\0\13\124\1\0\4\124"+
+    "\1\0\11\124\1\0\1\124\1\126\2\0\1\374\1\126"+
+    "\1\0\4\126\1\0\1\126\1\0\3\126\1\0\6\126"+
+    "\1\0\60\126\1\0\1\373\1\374\1\126\1\0\4\126"+
+    "\1\0\1\126\1\0\3\126\1\0\6\126\1\0\57\126"+
+    "\1\375\1\0\10\375\1\376\2\375\1\377\50\375\1\377"+
+    "\20\375\1\u0100\1\0\12\u0100\1\376\1\u0101\50\u0100\1\u0101"+
+    "\20\u0100\2\0\1\134\1\u0102\111\0\4\136\7\0\1\136"+
+    "\6\0\6\136\1\0\13\136\1\0\13\136\1\0\4\136"+
+    "\1\0\11\136\1\0\1\136\1\140\2\0\1\u0103\1\140"+
+    "\1\0\4\140\1\0\1\140\1\0\3\140\1\0\6\140"+
+    "\1\0\60\140\1\0\1\134\1\u0104\1\140\1\0\4\140"+
+    "\1\0\1\140\1\0\3\140\1\0\6\140\1\0\57\140"+
+    "\1\142\1\0\1\u0105\1\u0106\1\142\1\u0105\4\142\1\u0107"+
+    "\1\142\1\u0105\1\u0108\2\142\1\u0105\6\142\1\u0105\36\142"+
+    "\1\u0108\20\142\1\143\1\0\1\u0109\1\u010a\1\143\1\u0109"+
+    "\4\143\1\u0109\1\143\1\u0107\1\u010b\2\143\1\u0109\6\143"+
+    "\1\u0109\36\143\1\u010b\20\143\2\0\1\u010c\127\0\1\350"+
+    "\2\0\1\u010d\66\0\4\150\7\0\1\150\6\0\6\150"+
+    "\1\0\13\150\1\0\13\150\1\0\4\150\1\0\11\150"+
+    "\1\0\1\150\2\0\1\u010e\111\0\1\152\12\0\1\152"+
+    "\6\0\1\152\65\0\4\153\7\0\1\153\6\0\6\153"+
+    "\1\0\13\153\1\0\13\153\1\0\4\153\1\0\11\153"+
+    "\1\0\1\153\1\155\2\0\1\u010f\1\155\1\0\4\155"+
+    "\1\0\1\155\1\0\3\155\1\0\6\155\1\0\57\155"+
+    "\1\u0110\1\0\10\u0110\1\u0111\2\u0110\1\u0112\50\u0110\1\u0112"+
+    "\20\u0110\1\u0113\1\0\12\u0113\1\u0111\1\u0114\50\u0113\1\u0114"+
+    "\20\u0113\1\155\1\0\1\u010e\1\u010f\1\155\1\0\4\155"+
+    "\1\0\1\155\1\0\3\155\1\0\6\155\1\0\57\155"+
+    "\1\162\3\0\24\162\6\0\1\162\13\0\1\162\13\0"+
+    "\1\162\4\0\1\162\4\0\1\162\4\0\1\162\4\0"+
+    "\1\346\17\0\1\350\2\0\1\351\62\0\1\u0115\104\0"+
+    "\1\162\3\0\2\162\4\166\7\162\1\166\6\162\6\167"+
+    "\1\162\13\167\1\162\13\167\1\162\4\167\1\162\4\167"+
+    "\1\166\4\167\1\162\1\167\6\0\4\167\7\0\1\167"+
+    "\6\0\6\167\1\0\13\167\1\0\13\167\1\0\4\167"+
+    "\1\0\11\167\1\0\1\167\6\0\4\167\7\0\1\167"+
+    "\6\0\6\167\1\0\7\167\1\u0116\3\167\1\0\13\167"+
+    "\1\0\4\167\1\0\11\167\1\0\1\167\3\0\1\346"+
+    "\4\0\2\u0117\11\0\1\350\2\0\1\351\1\0\6\u0117"+
+    "\1\0\13\u0117\1\0\13\u0117\1\0\4\u0117\1\0\4\u0117"+
+    "\1\0\4\u0117\1\0\1\u0117\6\0\4\172\7\0\1\172"+
+    "\6\0\6\172\1\0\13\172\1\0\13\172\1\0\4\172"+
+    "\1\0\11\172\1\0\1\172\1\174\2\0\1\u0118\1\174"+
+    "\1\0\4\174\1\0\1\174\1\0\3\174\1\0\6\174"+
+    "\1\0\57\174\3\0\1\346\4\0\2\u0119\11\0\1\350"+
+    "\2\0\1\351\1\0\6\u0119\1\0\13\u0119\1\0\13\u0119"+
+    "\1\0\4\u0119\1\0\4\u0119\1\0\4\u0119\1\0\1\u0119"+
+    "\1\174\1\0\1\u0115\1\u0118\1\174\1\0\4\174\1\0"+
+    "\1\174\1\0\3\174\1\0\6\174\1\0\57\174\1\u011a"+
+    "\1\0\10\u011a\1\u011b\2\u011a\1\u011c\50\u011a\1\u011c\20\u011a"+
+    "\1\u011d\1\0\12\u011d\1\u011b\1\u011e\50\u011d\1\u011e\20\u011d"+
+    "\1\174\2\0\1\u0118\1\174\1\0\4\174\1\0\1\174"+
+    "\1\0\1\174\1\u011f\1\174\1\0\6\174\1\0\60\174"+
+    "\2\0\1\u0118\1\174\1\0\4\174\1\0\1\174\1\0"+
+    "\1\174\1\u0120\1\174\1\0\6\174\1\0\57\174\3\0"+
+    "\1\346\17\0\1\350\2\0\1\u010d\130\0\1\u0121\2\0"+
+    "\1\u0121\75\0\1\u0122\14\0\1\u0122\63\0\2\u0123\51\0"+
+    "\24\u0124\1\u0125\62\u0124\6\0\4\211\7\0\1\211\6\0"+
+    "\6\211\1\0\13\211\1\0\13\211\1\0\4\211\1\0"+
+    "\11\211\1\0\1\211\54\0\1\u0126\5\0\1\u0126\116\0"+
+    "\1\u0127\10\0\1\u0127\3\0\1\214\2\0\1\u0128\1\214"+
+    "\1\0\4\214\1\0\1\214\1\0\3\214\1\0\6\214"+
+    "\1\0\57\214\1\u0129\1\0\10\u0129\1\u012a\2\u0129\1\u012b"+
+    "\50\u0129\1\u012b\20\u0129\1\u012c\1\0\1\u012c\2\u012d\1\u012c"+
+    "\4\u012d\2\u012c\1\u012e\1\u012f\2\u012c\4\u012d\1\u012c\11\u012d"+
+    "\1\u012c\27\u012d\1\u012f\10\u012d\2\u012c\4\u012d\1\u012c\1\u012d"+
+    "\1\220\2\u0124\1\u0130\1\220\1\u0124\4\220\1\u0124\1\220"+
+    "\1\u0124\3\220\1\u0124\3\220\1\u0131\2\220\1\u0124\57\220"+
+    "\1\221\2\0\1\u0132\1\221\1\0\4\221\1\0\1\221"+
+    "\1\0\3\221\1\0\6\221\1\0\57\221\12\u0133\1\u0134"+
+    "\74\u0133\14\u0135\1\u0134\72\u0135\1\225\2\u0124\1\u0136\1\225"+
+    "\1\u0124\4\225\1\u0124\1\225\1\u0124\3\225\1\u0124\3\225"+
+    "\1\u0137\2\225\1\u0124\57\225\1\226\2\0\1\u0138\1\226"+
+    "\1\0\4\226\1\0\1\226\1\0\3\226\1\0\6\226"+
+    "\1\0\57\226\1\u0139\1\0\10\u0139\1\u013a\2\u0139\1\u013b"+
+    "\50\u0139\1\u013b\20\u0139\1\u013c\1\0\1\u013c\2\u013d\1\u013c"+
+    "\4\u013d\2\u013c\1\u013e\1\u013f\2\u013c\4\u013d\1\u013c\11\u013d"+
+    "\1\u013c\27\u013d\1\u013f\10\u013d\2\u013c\4\u013d\1\u013c\1\u013d"+
+    "\2\232\1\0\106\232\1\0\20\232\1\u0140\2\232\1\u0141"+
+    "\60\232\1\235\2\0\1\u0142\1\235\1\0\4\235\1\0"+
+    "\1\235\1\0\3\235\1\0\6\235\1\0\57\235\1\u0143"+
+    "\1\0\10\u0143\1\u0144\2\u0143\1\u0145\50\u0143\1\u0145\20\u0143"+
+    "\1\u0146\1\0\1\u0146\2\u0147\1\u0146\4\u0147\2\u0146\1\u0148"+
+    "\1\u0149\2\u0146\4\u0147\1\u0146\11\u0147\1\u0146\27\u0147\1\u0149"+
+    "\10\u0147\2\u0146\4\u0147\1\u0146\1\u0147\2\241\1\0\106\241"+
+    "\1\0\20\241\1\u014a\2\241\1\u014b\60\241\7\0\1\u014c"+
+    "\77\0\1\251\2\0\1\u014d\1\251\1\0\4\251\1\0"+
+    "\1\251\1\0\3\251\1\0\6\251\1\0\60\251\1\0"+
+    "\1\u0115\1\u014d\1\251\1\0\4\251\1\0\1\251\1\0"+
+    "\3\251\1\0\6\251\1\0\57\251\1\u014e\1\0\10\u014e"+
+    "\1\u014f\2\u014e\1\u0150\1\u014e\1\u0151\46\u014e\1\u0150\20\u014e"+
+    "\1\u0152\1\0\12\u0152\1\u014f\1\u0153\1\u0152\1\u0154\46\u0152"+
+    "\1\u0153\20\u0152\1\251\2\0\1\u014d\1\251\1\0\4\251"+
+    "\1\0\1\251\1\0\1\251\1\u0155\1\251\1\0\6\251"+
+    "\1\0\60\251\2\0\1\u014d\1\251\1\0\4\251\1\0"+
+    "\1\251\1\0\1\251\1\u0156\1\251\1\0\6\251\1\0"+
+    "\57\251\1\260\1\0\12\260\2\0\50\260\1\0\20\260"+
+    "\3\0\1\u0157\17\0\1\350\2\0\1\363\60\0\1\260"+
+    "\1\0\3\260\1\262\6\260\2\0\2\260\1\262\6\260"+
+    "\1\262\36\260\1\0\20\260\5\0\1\u0158\10\0\1\u0159"+
+    "\1\0\1\u0158\6\0\1\u0158\64\0\1\u0158\10\0\1\u015a"+
+    "\1\0\1\u0158\6\0\1\u0158\57\0\1\266\1\0\10\266"+
+    "\1\0\2\266\1\0\50\266\1\0\21\266\1\0\3\266"+
+    "\1\267\4\266\1\0\2\266\1\0\2\266\1\267\6\266"+
+    "\1\267\36\266\1\0\20\266\5\0\1\u0158\10\0\1\u015b"+
+    "\1\0\1\u0158\6\0\1\u0158\64\0\1\u0158\10\0\1\u015c"+
+    "\1\0\1\u0158\6\0\1\u0158\57\0\12\273\1\0\1\273"+
+    "\1\0\1\u015d\67\273\1\0\13\273\1\0\1\273\1\0"+
+    "\1\u015d\5\273\1\u015e\61\273\1\0\13\273\1\0\1\273"+
+    "\1\0\1\273\1\u015f\66\273\1\u0160\1\273\14\u0161\1\u0162"+
+    "\106\u0161\1\u0162\6\u0161\1\u0163\2\u0161\1\u0164\60\u0161\12\u0165"+
+    "\1\u0166\106\u0165\1\u0166\10\u0165\1\u0167\2\u0165\1\u0168\60\u0165"+
+    "\12\311\1\0\4\311\1\u0169\65\311\1\0\13\311\1\0"+
+    "\4\311\1\u0169\3\311\1\u016a\61\311\1\0\13\311\1\u016b"+
+    "\74\311\14\316\1\0\2\316\1\u016c\65\316\1\0\15\316"+
+    "\1\0\2\316\1\u016c\3\316\1\u016d\61\316\1\0\15\316"+
+    "\1\u016e\72\316\12\321\1\0\1\321\1\0\70\321\1\0"+
+    "\13\321\1\0\1\321\1\0\6\321\1\u016f\61\321\1\0"+
+    "\13\321\1\0\1\321\1\0\1\321\1\u0170\66\321\1\0"+
+    "\1\321\14\u0171\1\u0172\106\u0171\1\u0172\6\u0171\1\u0173\2\u0171"+
+    "\1\u0174\60\u0171\12\u0175\1\u0176\106\u0175\1\u0176\10\u0175\1\u0177"+
+    "\2\u0175\1\u0178\60\u0175\12\337\1\0\4\337\1\u0179\65\337"+
+    "\1\0\13\337\1\0\4\337\1\u0179\3\337\1\u017a\61\337"+
+    "\1\0\13\337\1\u017b\74\337\14\343\1\0\2\343\1\u017c"+
+    "\65\343\1\0\15\343\1\0\2\343\1\u017c\3\343\1\u017d"+
+    "\61\343\1\0\15\343\1\u017e\72\343\7\0\1\u017f\12\0"+
+    "\1\u0180\3\0\1\u0181\23\0\1\u0182\43\0\1\u0183\26\0"+
+    "\1\u0184\55\0\1\352\2\0\2\u0185\6\0\1\352\6\0"+
+    "\1\352\6\u0185\1\0\13\u0185\1\0\13\u0185\1\0\4\u0185"+
+    "\1\0\4\u0185\1\0\4\u0185\1\0\1\u0185\1\u0186\1\0"+
+    "\3\u0186\1\u0187\4\353\1\u0186\1\0\4\u0186\1\u0187\1\353"+
+    "\1\u0186\1\0\3\u0186\1\u0187\6\353\1\u0186\13\353\1\u0186"+
+    "\13\353\1\u0186\4\353\1\u0188\11\353\1\u0186\1\353\21\0"+
+    "\1\u0189\7\0\1\u018a\72\0\1\356\71\0\105\357\1\u018b"+
+    "\1\357\1\u0186\1\0\3\u0186\1\u0187\4\360\1\u0186\1\0"+
+    "\4\u0186\1\u0187\1\360\1\u0186\1\0\3\u0186\1\u0187\6\360"+
+    "\1\u0186\13\360\1\u0186\13\360\1\u0186\4\360\1\u018c\11\360"+
+    "\1\u0186\1\360\105\361\1\u018d\1\361\66\0\1\362\56\0"+
+    "\1\u0184\52\0\1\u018e\106\0\1\u018f\112\0\4\113\7\0"+
+    "\1\113\6\0\4\113\2\u0190\1\0\13\113\1\0\13\113"+
+    "\1\0\4\113\1\0\11\113\1\0\1\113\6\0\4\113"+
+    "\7\0\1\113\6\0\4\113\1\u0190\1\u0191\1\0\13\113"+
+    "\1\0\13\113\1\0\4\113\1\0\11\113\1\0\1\113"+
+    "\6\0\4\113\7\0\1\113\6\0\6\113\1\0\13\113"+
+    "\1\0\2\113\1\u0192\10\113\1\0\4\113\1\0\6\113"+
+    "\1\u0192\2\113\1\0\1\113\12\375\1\376\3\375\1\0"+
+    "\70\375\14\u0100\1\376\1\u0100\1\0\70\u0100\1\u0105\1\0"+
+    "\10\u0105\1\u0107\2\u0105\1\u0193\50\u0105\1\u0193\20\u0105\1\142"+
+    "\2\u0105\1\u0106\1\142\1\u0105\4\142\1\u0107\1\142\1\u0105"+
+    "\1\142\1\140\1\142\1\u0105\6\142\1\u0105\57\142\1\u0109"+
+    "\1\0\12\u0109\1\u0107\1\u0194\50\u0109\1\u0194\20\u0109\1\143"+
+    "\2\u0109\1\u010a\1\143\1\u0109\4\143\1\u0109\1\143\1\u0107"+
+    "\1\143\1\140\1\143\1\u0109\6\143\1\u0109\57\143\12\u0110"+
+    "\1\u0111\3\u0110\1\0\70\u0110\14\u0113\1\u0111\1\u0113\1\0"+
+    "\70\u0113\6\0\4\167\7\0\1\167\6\0\6\167\1\0"+
+    "\13\167\1\0\13\167\1\0\4\167\1\0\6\167\1\u0195"+
+    "\2\167\1\0\1\167\6\0\4\u0117\7\0\1\u0117\6\0"+
+    "\6\u0117\1\0\13\u0117\1\0\13\u0117\1\0\4\u0117\1\0"+
+    "\11\u0117\1\0\1\u0117\6\0\4\u0119\7\0\1\u0119\6\0"+
+    "\6\u0119\1\0\13\u0119\1\0\13\u0119\1\0\4\u0119\1\0"+
+    "\11\u0119\1\0\1\u0119\12\u011a\1\u011b\3\u011a\1\0\70\u011a"+
+    "\14\u011d\1\u011b\1\u011d\1\0\70\u011d\1\u0196\2\u0197\1\u0198"+
+    "\1\u0196\1\u0197\4\u0196\1\u0197\1\u0196\1\u0197\3\u0196\1\u0197"+
+    "\6\u0196\1\u0197\55\u0196\1\174\1\u0196\1\u0199\2\u019a\1\u019b"+
+    "\1\u0199\1\u019a\4\u0199\1\u019a\1\u0199\1\u019a\3\u0199\1\u019a"+
+    "\6\u0199\1\u019a\55\u0199\1\174\1\u0199\37\0\1\u019c\35\0"+
+    "\1\u019c\53\0\1\u019d\14\0\1\u019d\73\0\1\u019e\11\0"+
+    "\1\u019e\76\0\1\u019f\20\0\1\u019f\113\0\1\u01a0\7\0"+
+    "\1\u01a0\2\0\12\u0129\1\u012a\3\u0129\1\0\70\u0129\1\u012c"+
+    "\1\0\12\u012c\1\u012a\1\u01a1\50\u012c\1\u01a1\21\u012c\1\0"+
+    "\12\u012c\1\u01a2\1\u01a1\50\u012c\1\u01a1\20\u012c\14\0\1\u01a3"+
+    "\72\0\14\u012c\1\u01a2\1\u012c\1\0\70\u012c\12\u0139\1\u013a"+
+    "\3\u0139\1\0\70\u0139\1\u013c\1\0\12\u013c\1\u013a\1\u01a4"+
+    "\50\u013c\1\u01a4\21\u013c\1\0\12\u013c\1\u01a5\1\u01a4\50\u013c"+
+    "\1\u01a4\20\u013c\14\0\1\u01a6\72\0\14\u013c\1\u01a5\1\u013c"+
+    "\1\0\70\u013c\2\232\1\0\4\232\1\u01a7\12\232\1\u01a8"+
+    "\3\232\1\u01a9\23\232\1\u01aa\36\232\1\0\33\232\1\u01ab"+
+    "\50\232\12\u0143\1\u0144\3\u0143\1\0\70\u0143\1\u0146\1\0"+
+    "\12\u0146\1\u0144\1\u01ac\50\u0146\1\u01ac\21\u0146\1\0\12\u0146"+
+    "\1\u01ad\1\u01ac\50\u0146\1\u01ac\20\u0146\14\0\1\u01ae\72\0"+
+    "\14\u0146\1\u01ad\1\u0146\1\0\70\u0146\2\241\1\0\4\241"+
+    "\1\u01af\12\241\1\u01b0\3\241\1\u01b1\23\241\1\u01b2\36\241"+
+    "\1\0\33\241\1\u01b3\50\241\23\0\1\u01b4\63\0\12\u014e"+
+    "\1\u014f\3\u014e\1\0\71\u014e\1\0\10\u014e\1\u01b5\2\u014e"+
+    "\1\u0150\1\u014e\1\u0151\46\u014e\1\u0150\20\u014e\14\u0152\1\u014f"+
+    "\1\u0152\1\0\71\u0152\1\0\12\u0152\1\u01b6\1\u0153\1\u0152"+
+    "\1\u0154\46\u0152\1\u0153\20\u0152\1\u01b7\2\u0197\1\u01b8\1\u01b7"+
+    "\1\u0197\4\u01b7\1\u0197\1\u01b7\1\u0197\3\u01b7\1\u0197\6\u01b7"+
+    "\1\u0197\55\u01b7\1\251\1\u01b7\1\u01b9\2\u019a\1\u01ba\1\u01b9"+
+    "\1\u019a\4\u01b9\1\u019a\1\u01b9\1\u019a\3\u01b9\1\u019a\6\u01b9"+
+    "\1\u019a\55\u01b9\1\251\1\u01b9\5\0\1\u0158\12\0\1\u0158"+
+    "\6\0\1\u0158\57\0\12\273\1\0\1\273\1\0\1\273"+
+    "\1\u01bb\66\273\1\u0160\10\273\1\u01bc\2\273\1\0\1\273"+
+    "\1\0\1\u015d\4\273\1\u01bd\3\273\1\u01be\23\273\1\u01bf"+
+    "\32\273\1\0\1\273\12\u01bb\1\0\1\u01bb\1\0\70\u01bb"+
+    "\1\0\1\u01bb\12\u0160\1\0\1\u0160\1\0\1\u01c0\67\u0160"+
+    "\1\0\1\u0160\7\u0161\1\u01c1\4\u0161\1\u0162\5\u0161\1\u01c2"+
+    "\3\u0161\1\u01c3\23\u0161\1\u01c4\50\u0161\1\u0162\21\u0161\1\u01c5"+
+    "\50\u0161\7\u0165\1\u01c6\2\u0165\1\u0166\7\u0165\1\u01c7\3\u0165"+
+    "\1\u01c8\23\u0165\1\u01c9\46\u0165\1\u0166\23\u0165\1\u01ca\50\u0165"+
+    "\12\311\1\0\103\311\1\u01cb\2\311\1\0\4\311\1\u0169"+
+    "\2\311\1\u01cc\3\311\1\u01cd\23\311\1\u01ce\32\311\1\0"+
+    "\1\311\17\u01cf\1\u01d0\67\u01cf\14\316\1\0\101\316\1\u01d1"+
+    "\4\316\1\0\2\316\1\u016c\2\316\1\u01d2\3\316\1\u01d3"+
+    "\23\316\1\u01d4\32\316\1\0\1\316\17\u01d5\1\u01d6\67\u01d5"+
+    "\7\321\1\u01d7\2\321\1\0\1\321\1\0\5\321\1\u01d8"+
+    "\3\321\1\u01d9\23\321\1\u01da\32\321\1\0\1\321\7\u0171"+
+    "\1\u01db\4\u0171\1\u0172\5\u0171\1\u01dc\3\u0171\1\u01dd\23\u0171"+
+    "\1\u01de\50\u0171\1\u0172\21\u0171\1\u01df\50\u0171\7\u0175\1\u01e0"+
+    "\2\u0175\1\u0176\7\u0175\1\u01e1\3\u0175\1\u01e2\23\u0175\1\u01e3"+
+    "\46\u0175\1\u0176\23\u0175\1\u01e4\50\u0175\12\337\1\0\103\337"+
+    "\1\u01e5\2\337\1\0\4\337\1\u0179\2\337\1\u01e6\3\337"+
+    "\1\u01e7\23\337\1\u01e8\32\337\1\0\1\337\17\u01e9\1\u01ea"+
+    "\67\u01e9\14\343\1\0\101\343\1\u01eb\4\343\1\0\2\343"+
+    "\1\u017c\2\343\1\u01ec\3\343\1\u01ed\23\343\1\u01ee\32\343"+
+    "\1\0\1\343\17\u01ef\1\u01f0\67\u01ef\7\0\1\u01f1\106\0"+
+    "\1\u01f2\136\0\1\u01f3\47\0\1\u0185\1\0\11\u0185\1\0"+
+    "\7\u0185\1\0\63\u0185\1\u0186\1\0\11\u0186\1\0\7\u0186"+
+    "\1\0\47\u0186\1\0\14\u0186\1\0\3\u0186\1\u0187\5\u0186"+
+    "\1\0\4\u0186\1\u0187\2\u0186\1\0\3\u0186\1\u0187\43\u0186"+
+    "\1\u01f4\13\u0186\21\0\1\u0189\51\0\1\u01f5\34\0\1\u01f6"+
+    "\15\0\3\u01f6\2\0\1\u01f6\11\0\1\u01f6\1\0\2\u01f6"+
+    "\7\0\1\u01f6\2\0\2\u01f6\6\0\1\u01f6\10\0\1\113"+
+    "\1\u01f7\2\113\7\0\1\113\6\0\6\113\1\0\13\113"+
+    "\1\0\13\113\1\0\4\113\1\0\11\113\1\0\1\113"+
+    "\6\0\4\113\7\0\1\113\6\0\6\113\1\0\11\113"+
+    "\1\u01f8\1\113\1\0\1\u01f8\12\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\12\u0105\1\u0107\3\u0105\1\0\70\u0105"+
+    "\14\u0109\1\u0107\1\u0109\1\0\70\u0109\6\0\3\167\1\u01f9"+
+    "\7\0\1\167\6\0\6\167\1\0\13\167\1\0\13\167"+
+    "\1\0\4\167\1\0\11\167\1\0\1\167\1\u0196\2\u0197"+
+    "\1\u0198\1\u0196\1\u0197\4\u0196\1\u0197\1\u0196\1\u0197\3\u0196"+
+    "\1\u0197\6\u0196\1\u0197\55\u0196\1\u01fa\1\u0196\105\u0197\1\u01fb"+
+    "\1\u0197\1\u0199\2\u019a\1\u019b\1\u0199\1\u019a\4\u0199\1\u019a"+
+    "\1\u0199\1\u019a\3\u0199\1\u019a\6\u0199\1\u019a\55\u0199\1\u01fa"+
+    "\1\u0199\105\u019a\1\u01fc\1\u019a\42\0\1\u01fd\14\0\1\u01fd"+
+    "\63\0\2\u01fe\103\0\2\u01ff\115\0\1\u0200\14\0\1\u0200"+
+    "\63\0\2\u0201\51\0\14\u012c\1\u012a\1\u012c\1\0\70\u012c"+
+    "\3\0\2\u0202\1\0\4\u0202\2\0\1\u012e\1\u0202\2\0"+
+    "\4\u0202\1\0\11\u0202\1\0\40\u0202\2\0\4\u0202\1\0"+
+    "\1\u0202\14\u013c\1\u013a\1\u013c\1\0\70\u013c\3\0\2\u0203"+
+    "\1\0\4\u0203\2\0\1\u013e\1\u0203\2\0\4\u0203\1\0"+
+    "\11\u0203\1\0\40\u0203\2\0\4\u0203\1\0\1\u0203\2\232"+
+    "\1\0\4\232\1\u0204\101\232\1\0\34\232\1\u0205\47\232"+
+    "\14\u0146\1\u0144\1\u0146\1\0\70\u0146\3\0\2\u0206\1\0"+
+    "\4\u0206\2\0\1\u0148\1\u0206\2\0\4\u0206\1\0\11\u0206"+
+    "\1\0\40\u0206\2\0\4\u0206\1\0\1\u0206\2\241\1\0"+
+    "\4\241\1\u0207\101\241\1\0\34\241\1\u0208\47\241\2\0"+
+    "\1\u0209\104\0\1\u01b7\2\u0197\1\u01b8\1\u01b7\1\u0197\4\u01b7"+
+    "\1\u0197\1\u01b7\1\u0197\3\u01b7\1\u0197\6\u01b7\1\u0197\55\u01b7"+
+    "\1\u020a\1\u01b7\1\u01b9\2\u019a\1\u01ba\1\u01b9\1\u019a\4\u01b9"+
+    "\1\u019a\1\u01b9\1\u019a\3\u01b9\1\u019a\6\u01b9\1\u019a\55\u01b9"+
+    "\1\u020a\1\u01b9\7\273\1\u020b\2\273\1\0\1\273\1\0"+
+    "\1\u015d\67\273\1\0\1\273\12\u0160\1\0\1\u0160\1\0"+
+    "\1\u0160\1\0\70\u0160\7\u0161\1\u020c\4\u0161\1\u0162\106\u0161"+
+    "\1\u0162\22\u0161\1\u020d\47\u0161\7\u0165\1\u020e\2\u0165\1\u0166"+
+    "\106\u0165\1\u0166\24\u0165\1\u020f\47\u0165\7\311\1\u0210\2\311"+
+    "\1\0\4\311\1\u0169\65\311\1\0\1\311\12\u0211\1\u0212"+
+    "\72\u0211\1\0\1\u0211\7\316\1\u0213\4\316\1\0\2\316"+
+    "\1\u016c\65\316\1\0\1\316\14\u0214\1\u0212\70\u0214\1\0"+
+    "\1\u0214\7\321\1\u0215\2\321\1\0\1\321\1\0\70\321"+
+    "\1\0\1\321\7\u0171\1\u0216\4\u0171\1\u0172\106\u0171\1\u0172"+
+    "\22\u0171\1\u0217\47\u0171\7\u0175\1\u0218\2\u0175\1\u0176\106\u0175"+
+    "\1\u0176\24\u0175\1\u0219\47\u0175\7\337\1\u021a\2\337\1\0"+
+    "\4\337\1\u0179\65\337\1\0\1\337\12\u021b\1\u021c\72\u021b"+
+    "\1\0\1\u021b\7\343\1\u021d\4\343\1\0\2\343\1\u017c"+
+    "\65\343\1\0\1\343\14\u021e\1\u021c\70\u021e\1\0\1\u021e"+
+    "\40\0\1\u021f\141\0\1\u01f4\34\0\1\u01f6\15\0\3\u01f6"+
+    "\2\0\1\u01f6\11\0\1\u01f6\1\0\2\u01f6\7\0\1\u01f6"+
+    "\1\0\1\u01f5\2\u01f6\6\0\1\u01f6\10\0\4\113\7\0"+
+    "\1\113\6\0\6\113\1\0\7\113\1\u0220\3\113\1\0"+
+    "\13\113\1\0\4\113\1\0\11\113\1\0\1\113\6\0"+
+    "\4\113\7\0\1\113\6\0\6\113\1\0\6\113\1\u0221"+
+    "\4\113\1\0\13\113\1\0\1\113\1\u0221\2\113\1\0"+
+    "\11\113\1\0\1\113\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\6\167\1\u0222\4\167\1\0\6\167\1\u0223"+
+    "\4\167\1\0\4\167\1\0\11\167\1\0\1\167\54\0"+
+    "\1\u0224\5\0\1\u0224\73\0\1\u0225\14\0\1\u0225\66\0"+
+    "\1\u0226\11\0\1\u0226\74\0\1\u0227\11\0\1\u0227\77\0"+
+    "\1\u0228\14\0\1\u0228\22\0\2\232\1\0\35\232\1\u0229"+
+    "\46\232\2\241\1\0\35\241\1\u022a\46\241\14\u0161\1\u0162"+
+    "\23\u0161\1\u022b\46\u0161\12\u0165\1\u0166\25\u0165\1\u022c\46\u0165"+
+    "\12\u0211\1\u01cf\4\u0211\1\u022d\65\u0211\1\u01cf\1\u0211\14\u0214"+
+    "\1\u01d5\2\u0214\1\u022e\65\u0214\1\u01d5\1\u0214\14\u0171\1\u0172"+
+    "\23\u0171\1\u022f\46\u0171\12\u0175\1\u0176\25\u0175\1\u0230\46\u0175"+
+    "\12\u021b\1\u01e9\4\u021b\1\u0231\65\u021b\1\u01e9\1\u021b\14\u021e"+
+    "\1\u01ef\2\u021e\1\u0232\65\u021e\1\u01ef\1\u021e\41\0\1\u0233"+
+    "\53\0\4\113\7\0\1\113\6\0\6\113\1\0\13\113"+
+    "\1\0\4\113\1\u0234\6\113\1\0\4\113\1\0\11\113"+
+    "\1\0\1\113\6\0\4\113\7\0\1\113\6\0\6\113"+
+    "\1\0\3\113\1\u0235\7\113\1\0\4\113\1\u0235\6\113"+
+    "\1\0\4\113\1\0\11\113\1\0\1\113\6\0\4\167"+
+    "\7\0\1\167\6\0\6\167\1\0\11\167\1\u0236\1\167"+
+    "\1\0\13\167\1\0\4\167\1\0\11\167\1\0\1\167"+
+    "\6\0\4\167\7\0\1\167\6\0\6\167\1\0\10\167"+
+    "\1\u0237\2\167\1\0\13\167\1\0\4\167\1\0\11\167"+
+    "\1\0\1\167\55\0\1\u0238\24\0\1\u0238\52\0\1\u0239"+
+    "\20\0\1\u0239\70\0\1\u023a\13\0\1\u023a\53\0\2\u023b"+
+    "\112\0\1\u023c\35\0\1\u023c\11\0\2\232\1\0\36\232"+
+    "\1\u023d\45\232\2\241\1\0\36\241\1\u023e\45\241\14\u0161"+
+    "\1\u0162\24\u0161\1\u023f\45\u0161\12\u0165\1\u0166\26\u0165\1\u0240"+
+    "\45\u0165\12\u0211\1\u0241\4\u0211\1\u022d\65\u0211\1\u01cf\1\u0211"+
+    "\14\u0214\1\u0242\2\u0214\1\u022e\65\u0214\1\u01d5\1\u0214\14\u0171"+
+    "\1\u0172\24\u0171\1\u0243\45\u0171\12\u0175\1\u0176\26\u0175\1\u0244"+
+    "\45\u0175\12\u021b\1\u0245\4\u021b\1\u0231\65\u021b\1\u01e9\1\u021b"+
+    "\14\u021e\1\u0246\2\u021e\1\u0232\65\u021e\1\u01ef\1\u021e\42\0"+
+    "\1\u0247\52\0\4\113\7\0\1\113\6\0\6\113\1\0"+
+    "\13\113\1\0\7\113\1\u0248\3\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\11\167\1\u0249\1\167\1\0\13\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\6\167\1\u024a\4\167\1\0"+
+    "\13\167\1\0\4\167\1\0\11\167\1\0\1\167\44\0"+
+    "\1\u024b\11\0\1\u024b\72\0\1\u024c\14\0\1\u024c\71\0"+
+    "\1\u024d\14\0\1\u024d\27\0\2\232\1\0\37\232\1\u024e"+
+    "\44\232\2\241\1\0\37\241\1\u024f\44\241\14\u0161\1\u0162"+
+    "\25\u0161\1\u0250\44\u0161\12\u0165\1\u0166\27\u0165\1\u0251\44\u0165"+
+    "\14\u0171\1\u0172\25\u0171\1\u0252\44\u0171\12\u0175\1\u0176\27\u0175"+
+    "\1\u0253\44\u0175\41\0\1\u0254\53\0\4\113\7\0\1\113"+
+    "\6\0\5\113\1\u0255\1\0\13\113\1\0\13\113\1\0"+
+    "\4\113\1\0\11\113\1\0\1\113\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\13\167\1\0\4\167\1\u0256"+
+    "\6\167\1\0\4\167\1\0\11\167\1\0\1\167\6\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\5\167\1\u0257"+
+    "\5\167\1\0\13\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\2\232\1\0\36\232\1\u0258\45\232\2\241\1\0"+
+    "\36\241\1\u0259\45\241\14\u0161\1\u0162\24\u0161\1\u025a\45\u0161"+
+    "\12\u0165\1\u0166\26\u0165\1\u025b\45\u0165\14\u0171\1\u0172\24\u0171"+
+    "\1\u025c\45\u0171\12\u0175\1\u0176\26\u0175\1\u025d\45\u0175\36\0"+
+    "\1\u025e\56\0\4\113\7\0\1\113\6\0\6\113\1\0"+
+    "\5\113\1\u025f\5\113\1\0\13\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\13\167\1\0\13\167\1\0\4\167\1\0"+
+    "\1\167\1\u0260\7\167\1\0\1\167\2\232\1\0\33\232"+
+    "\1\u0261\50\232\2\241\1\0\33\241\1\u0262\50\241\14\u0161"+
+    "\1\u0162\21\u0161\1\u0263\50\u0161\12\u0165\1\u0166\23\u0165\1\u0264"+
+    "\50\u0165\14\u0171\1\u0172\21\u0171\1\u0265\50\u0171\12\u0175\1\u0176"+
+    "\23\u0175\1\u0266\50\u0175\6\0\4\113\7\0\1\113\6\0"+
+    "\6\113\1\0\7\113\1\u0267\3\113\1\0\13\113\1\0"+
+    "\4\113\1\0\11\113\1\0\1\113\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\13\167\1\0\4\167\1\u0268"+
+    "\6\167\1\0\4\167\1\0\11\167\1\0\1\167\6\0"+
+    "\4\113\7\0\1\113\6\0\6\113\1\0\13\113\1\0"+
+    "\13\113\1\0\4\113\1\0\11\113\1\0\1\u0269\6\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\10\167\1\u026a"+
+    "\2\167\1\0\13\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\6\0\4\113\7\0\1\113\6\0\6\113\1\0"+
+    "\5\113\1\u026b\5\113\1\0\13\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\4\167\1\u026c\6\167\1\0\13\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\113\7\0"+
+    "\1\113\6\0\6\113\1\0\5\113\1\u026d\5\113\1\0"+
+    "\13\113\1\0\4\113\1\0\11\113\1\0\1\113\6\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\5\167\1\u026e"+
+    "\5\167\1\0\13\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\6\0\4\113\7\0\1\113\6\0\6\113\1\0"+
+    "\13\113\1\0\4\113\1\u026f\6\113\1\0\4\113\1\0"+
+    "\11\113\1\0\1\113\6\u0270\4\u0271\7\u0270\1\u0271\5\u0270"+
+    "\1\0\6\u0271\1\u0270\13\u0271\1\u0270\13\u0271\1\u0270\4\u0271"+
+    "\1\u0270\11\u0271\1\u0270\1\u0271\43\0\1\u0272\3\0\1\u0273"+
+    "\7\0\1\u0274\1\u0275\21\0\1\u0276\12\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\4\167\1\u0277\3\167\1\u0278"+
+    "\2\167\1\0\4\167\1\u0279\1\u027a\5\167\1\0\4\167"+
+    "\1\0\6\167\1\u027b\2\167\1\0\1\167\60\0\1\u027c"+
+    "\77\0\1\u027d\115\0\1\u027e\105\0\1\u027f\107\0\1\u0280"+
+    "\34\0\4\167\7\0\1\167\6\0\6\167\1\0\13\167"+
+    "\1\0\5\167\1\u0281\5\167\1\0\4\167\1\0\11\167"+
+    "\1\0\1\167\6\0\4\167\7\0\1\167\6\0\6\167"+
+    "\1\0\12\167\1\u0282\1\0\13\167\1\0\4\167\1\0"+
+    "\11\167\1\0\1\167\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\13\167\1\0\5\167\1\u0283\5\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\13\167\1\0\4\167\1\u0284"+
+    "\6\167\1\0\4\167\1\0\11\167\1\0\1\167\6\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\13\167\1\0"+
+    "\5\167\1\u0285\5\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\45\0\1\u0286\136\0\1\u0287\107\0\1\u0288\67\0"+
+    "\1\u0289\125\0\1\u028a\16\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\6\167\1\u028b\4\167\1\0\13\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\13\167\1\0\13\167\1\0"+
+    "\4\167\1\0\1\167\1\u028c\7\167\1\0\1\167\6\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\13\167\1\0"+
+    "\13\167\1\0\4\167\1\0\2\167\1\u028d\6\167\1\0"+
+    "\1\167\6\0\4\167\7\0\1\167\6\0\6\167\1\0"+
+    "\13\167\1\0\4\167\1\u028e\6\167\1\0\4\167\1\0"+
+    "\11\167\1\0\1\167\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\13\167\1\0\13\167\1\0\4\167\1\0"+
+    "\2\167\1\u028f\6\167\1\0\1\167\47\0\1\u0290\74\0"+
+    "\1\u0291\106\0\1\u0292\116\0\1\u0293\105\0\1\u0294\50\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\10\167\1\u0295"+
+    "\2\167\1\0\13\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\6\0\4\167\7\0\1\167\6\0\5\167\1\u0296"+
+    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\11\167"+
+    "\1\0\1\167\6\0\4\167\7\0\1\167\6\0\5\167"+
+    "\1\u0297\1\0\13\167\1\0\13\167\1\0\4\167\1\0"+
+    "\11\167\1\0\1\167\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\6\167\1\u0298\4\167\1\0\13\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\5\167\1\u0299\5\167\1\0"+
+    "\13\167\1\0\4\167\1\0\11\167\1\0\1\167\60\0"+
+    "\1\u029a\131\0\1\u029b\52\0\1\u029c\106\0\1\u029d\45\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\13\167\1\0"+
+    "\5\167\1\u029e\5\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\6\0\4\167\7\0\1\167\6\0\6\167\1\0"+
+    "\13\167\1\0\13\167\1\0\4\167\1\0\7\167\1\u029f"+
+    "\1\167\1\0\1\167\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\10\167\1\u02a0\2\167\1\0\13\167\1\0"+
+    "\4\167\1\0\11\167\1\0\1\167\6\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\10\167\1\u02a1\2\167\1\0"+
+    "\13\167\1\0\4\167\1\0\11\167\1\0\1\167\104\0"+
+    "\1\u02a2\63\0\1\u028a\131\0\1\u0294\106\0\1\u02a3\10\0"+
+    "\4\167\7\0\1\167\6\0\6\167\1\0\13\167\1\0"+
+    "\13\167\1\0\4\167\1\0\10\167\1\u02a4\1\0\1\167"+
+    "\6\0\4\167\7\0\1\167\6\0\6\167\1\0\13\167"+
+    "\1\0\6\167\1\u028f\4\167\1\0\4\167\1\0\11\167"+
+    "\1\0\1\167\6\0\4\167\7\0\1\167\6\0\6\167"+
+    "\1\0\13\167\1\0\13\167\1\0\4\167\1\0\10\167"+
+    "\1\u0299\1\0\1\167\6\0\4\167\7\0\1\167\6\0"+
+    "\6\167\1\0\13\167\1\0\13\167\1\0\4\167\1\0"+
+    "\10\167\1\u02a5\1\0\1\167\35\0\1\u028a\154\0\1\u02a6"+
+    "\11\0\4\167\7\0\1\167\6\0\5\167\1\u028f\1\0"+
+    "\13\167\1\0\13\167\1\0\4\167\1\0\11\167\1\0"+
+    "\1\167\6\0\4\167\7\0\1\167\6\0\6\167\1\0"+
+    "\13\167\1\0\13\167\1\0\4\167\1\0\7\167\1\u02a7"+
+    "\1\167\1\0\1\167\57\0\1\u028a\35\0\4\167\7\0"+
+    "\1\167\6\0\6\167\1\0\13\167\1\0\4\167\1\u028f"+
+    "\6\167\1\0\4\167\1\0\11\167\1\0\1\167";
 
   /** 
    * The transition table of the DFA
@@ -797,45 +833,47 @@
   private final static byte YY_ATTRIBUTE[] = {
      1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
      0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  0, 
-     0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9,  1, 
-     9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1, 
-     1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
-     1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9, 
-     1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3,  9,  9, 
-     1,  1,  1,  9,  1,  1,  1,  1,  1,  9,  9,  1,  9,  3,  3,  3, 
-     3,  3,  3,  9,  9,  1,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1, 
-     0,  1,  0,  9,  1,  2,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1, 
-     9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  0, 
-     0,  1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  9,  1,  1,  0,  1, 
-     0,  9,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0,  0,  0,  0, 
-     9,  0,  0,  0,  1,  0,  0,  1,  0,  0,  9,  0,  0,  1,  0,  0, 
-     9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  9,  0,  0,  0,  1,  0, 
-     1,  1,  0,  0,  9,  9,  9,  0,  9,  9,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1,  2, 13, 
-     3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9,  9,  9, 
-     0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9,  1,  1,  1, 
-     0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  1, 
-     0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1, 
-     1,  0,  1,  1,  1,  1,  1,  0,  2,  3,  3,  3,  2,  2,  3,  3, 
-     3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1, 
-     1,  1,  2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1, 
-     0,  0,  1,  1,  1,  1,  0,  0,  9,  9,  0,  1,  9,  0,  1,  1, 
-     1,  5, 13, 13,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  1,  1, 
-     9,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  1,  3,  2,  3,  2, 
-     1,  0,  9,  1,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0,  0,  1, 
-     1,  2,  2,  0,  0,  2,  2,  0,  0,  0,  1,  1,  1,  1,  0,  0, 
-     0,  9,  9,  1,  1,  2,  2,  1,  1,  2,  2,  1,  1,  0,  1,  1, 
-     1,  9,  9,  9,  1,  1,  2,  2,  2,  2,  0,  1,  1,  1,  1,  1, 
-     2,  2,  2,  2,  9,  1,  1,  1,  1,  3,  3,  3,  3,  1,  1,  1, 
-     1,  1,  1,  1,  1,  1,  0,  1,  0,  0,  0,  0,  0,  1,  1,  1, 
-     1,  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0, 
-     0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  9,  1,  1,  1,  1,  1, 
-     0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,  0,  1
+     1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0, 
+     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  9, 
+     1,  9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9, 
+     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1, 
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
+     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
+     1,  1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
+     1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  9,  1,  9, 
+     3,  3,  3,  3,  3,  3,  9,  9,  1,  1,  9,  1,  9,  1,  1,  1, 
+     1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3,  9,  9,  1,  1, 
+     1,  9,  1,  1,  1,  9,  9,  1,  1,  0,  1,  0,  9,  1,  2,  1, 
+     2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0,  0,  9,  0,  0, 
+     0,  0,  0,  0,  0,  0,  9,  1,  0,  0,  1,  9,  0,  9,  0,  0, 
+     9,  0,  0,  0,  9,  1,  1,  0,  1,  0,  9,  0,  0,  0,  1,  1, 
+     0,  0,  0,  0,  9,  0,  0,  0,  0,  9,  0,  0,  0,  1,  0,  0, 
+     1,  0,  0,  9,  0,  0,  1,  0,  0,  9,  0,  0,  0,  1,  0,  1, 
+     1,  0,  0,  9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  0,  9,  0, 
+     0,  0,  0,  0,  1,  1,  9,  1,  9,  9,  9,  9,  1,  1,  1,  1, 
+     2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1, 
+     2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9, 
+     9,  9,  0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9,  1, 
+     1,  1,  0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0, 
+     0,  1,  0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1, 
+     1,  1,  1,  0,  1,  1,  3,  2,  3,  2,  1,  1,  1,  1,  1,  0, 
+     2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1,  0,  0, 
+     1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  2,  3,  3,  3,  2,  2, 
+     3,  3,  3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0, 
+     9,  9,  0,  1,  9,  0,  1,  1,  1,  5, 13, 13,  0,  0,  0,  0, 
+     0,  0,  0,  1,  1,  0,  1,  1,  9,  5,  1,  3,  2,  3,  2,  1, 
+     0,  9,  1,  0,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  0,  1, 
+     1,  1,  1,  0,  0,  0,  0,  0,  1,  1,  2,  2,  0,  0,  2,  2, 
+     0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  9,  9,  1,  1,  2,  2, 
+     1,  1,  2,  2,  1,  1,  0,  1,  1,  1,  9,  9,  9,  1,  1,  2, 
+     2,  2,  2,  0,  1,  1,  1,  1,  1,  2,  2,  2,  2,  9,  1,  1, 
+     1,  1,  3,  3,  3,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0, 
+     1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0, 
+     1,  1,  1,  1,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0, 
+     0,  0,  0,  9,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1, 
+     1,  0,  0,  1,  1,  0,  1
   };
 
   /** the input device */
@@ -908,6 +946,9 @@
 	// a "hint" as to what state to enter once an embedded region has
 	//   been completed
 	private int fEmbeddedPostState = YYINITIAL;
+	
+	private BooleanStack fJspTagStack = new BooleanStack();
+	
 	// the container used to create embedded regions
 	private ContextRegionContainer fEmbeddedContainer = null;
 	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";
@@ -1663,7 +1704,8 @@
 		fBufferedStart = 1;
 		fBufferedLength = 0;
 		fStateStack = new IntStack();
-	
+		fJspTagStack.clear();
+
 		fLastInternalBlockStart = -1;
 	
 		context = null;
@@ -1711,6 +1753,11 @@
 		//  context as usual.
 		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);
 	}
+	
+	/* user method */
+	private boolean isJspTag() {
+	  return fJspTagStack.empty() ? false : fJspTagStack.peek();
+	}
 
 
   /**
@@ -1740,10 +1787,10 @@
    * @return         the unpacked transition table
    */
   private static int [] yy_unpack(String packed) {
-    int [] trans = new int[31595];
+    int [] trans = new int[32589];
     int i = 0;  /* index in packed string  */
     int j = 0;  /* index in unpacked array */
-    while (i < 8206) {
+    while (i < 8702) {
       int count = packed.charAt(i++);
       int value = packed.charAt(i++);
       value--;
@@ -2075,10 +2122,48 @@
 
       switch (yy_action) {    
 
-        case 622: 
-        case 627: 
-        case 634: 
-        case 639: 
+        case 123: 
+        case 128: 
+        case 129: 
+        case 282: 
+        case 286: 
+        case 287: 
+        case 405: 
+        case 408: 
+        case 505: 
+          {  /* only allow for non-JSP tags for this does not obey JSP quoting rules */
+	if(Debug.debugTokenizer)
+		dump("attr value");//$NON-NLS-1$
+	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
+	fEmbeddedPostState = ST_XML_EQUALS;
+        yybegin(ST_XML_ATTRIBUTE_NAME);
+        return XML_TAG_ATTRIBUTE_VALUE;
+ }
+        case 680: break;
+        case 168: 
+        case 173: 
+        case 174: 
+        case 334: 
+        case 340: 
+        case 341: 
+        case 436: 
+        case 437: 
+        case 438: 
+        case 440: 
+        case 521: 
+          {  /* JSP attribute values have escape semantics */
+	if(Debug.debugTokenizer)
+		dump("jsp attr value");//$NON-NLS-1$
+	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
+	fEmbeddedPostState = ST_XML_EQUALS;
+	yybegin(ST_XML_ATTRIBUTE_NAME);
+	return XML_TAG_ATTRIBUTE_VALUE;
+ }
+        case 681: break;
+        case 647: 
+        case 652: 
+        case 659: 
+        case 664: 
           { 
 	if(Debug.debugTokenizer)
 		dump("jsp directive tag name");//$NON-NLS-1$
@@ -2087,8 +2172,8 @@
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return JSP_DIRECTIVE_NAME;
  }
-        case 655: break;
-        case 597: 
+        case 682: break;
+        case 622: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XSL processing instruction target");//$NON-NLS-1$
@@ -2096,14 +2181,14 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 656: break;
-        case 580: 
-        case 583: 
-        case 584: 
-        case 585: 
-        case 586: 
-        case 587: 
-        case 588: 
+        case 683: break;
+        case 605: 
+        case 608: 
+        case 609: 
+        case 610: 
+        case 611: 
+        case 612: 
+        case 613: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nCDATA start");//$NON-NLS-1$
@@ -2111,8 +2196,8 @@
 	yybegin(ST_CDATA_TEXT);
 	return XML_CDATA_OPEN;
  }
-        case 657: break;
-        case 572: 
+        case 684: break;
+        case 597: 
           { 
 	if(Debug.debugTokenizer)
 		dump("jsp:root tag name");//$NON-NLS-1$
@@ -2121,32 +2206,32 @@
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return JSP_ROOT_TAG_NAME;
  }
-        case 658: break;
-        case 563: 
+        case 685: break;
+        case 588: 
           { 
 	if(Debug.debugTokenizer)
 		dump("element");//$NON-NLS-1$
 	yybegin(ST_XML_ELEMENT_DECLARATION);
 	return XML_ELEMENT_DECLARATION;
  }
-        case 659: break;
-        case 562: 
+        case 686: break;
+        case 587: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist");//$NON-NLS-1$
 	yybegin(ST_XML_ATTLIST_DECLARATION);
 	return XML_ATTLIST_DECLARATION;
  }
-        case 660: break;
-        case 561: 
+        case 687: break;
+        case 586: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype");//$NON-NLS-1$
 	yybegin(ST_XML_DOCTYPE_DECLARATION);
 	return XML_DOCTYPE_DECLARATION;
  }
-        case 661: break;
-        case 546: 
+        case 688: break;
+        case 571: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype external id");//$NON-NLS-1$
@@ -2154,8 +2239,8 @@
 	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
 	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
  }
-        case 662: break;
-        case 545: 
+        case 689: break;
+        case 570: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype external id");//$NON-NLS-1$
@@ -2163,8 +2248,8 @@
 	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
 	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
  }
-        case 663: break;
-        case 539: 
+        case 690: break;
+        case 564: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction target");//$NON-NLS-1$
@@ -2173,33 +2258,33 @@
         yybegin(ST_DHTML_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 664: break;
-        case 514: 
-        case 555: 
-        case 556: 
+        case 691: break;
+        case 539: 
+        case 580: 
+        case 581: 
           { 
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 665: break;
-        case 504: 
-        case 551: 
-        case 552: 
+        case 692: break;
+        case 529: 
+        case 576: 
+        case 577: 
           { 
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 666: break;
-        case 496: 
+        case 693: break;
+        case 520: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nJSP comment close");//$NON-NLS-1$
 	yybegin(YYINITIAL);
 	return JSP_COMMENT_CLOSE;
  }
-        case 667: break;
-        case 483: 
+        case 694: break;
+        case 507: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2217,11 +2302,11 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 668: break;
-        case 482: 
+        case 695: break;
+        case 506: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2239,15 +2324,15 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 669: break;
-        case 476: 
+        case 696: break;
+        case 500: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nCharRef");//$NON-NLS-1$
 	return XML_CHAR_REFERENCE;
  }
-        case 670: break;
-        case 473: 
+        case 697: break;
+        case 497: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\ncomment start");//$NON-NLS-1$
@@ -2256,20 +2341,20 @@
 	yybegin(ST_XML_COMMENT);
 	return XML_COMMENT_OPEN;
  }
-        case 671: break;
-        case 472: 
-        case 491: 
-        case 494: 
-        case 497: 
-        case 498: 
-        case 500: 
-        case 502: 
-        case 505: 
-        case 507: 
-        case 508: 
-        case 510: 
-        case 512: 
+        case 698: break;
+        case 496: 
         case 515: 
+        case 518: 
+        case 522: 
+        case 523: 
+        case 525: 
+        case 527: 
+        case 530: 
+        case 532: 
+        case 533: 
+        case 535: 
+        case 537: 
+        case 540: 
           { 
 	/* JSP comment begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2311,7 +2396,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspCommentStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP comment start");//$NON-NLS-1$
@@ -2348,12 +2433,16 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
 		return PROXY_CONTEXT;
 	}
  }
-        case 672: break;
-        case 381: 
-        case 382: 
+        case 699: break;
+        case 399: 
+        case 400: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction target");//$NON-NLS-1$
@@ -2362,8 +2451,8 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 673: break;
-        case 380: 
+        case 700: break;
+        case 398: 
           { 
 	if(Debug.debugTokenizer)
 		dump("comment end");//$NON-NLS-1$
@@ -2371,16 +2460,16 @@
 	yybegin(YYINITIAL);
 	return XML_COMMENT_CLOSE;
  }
-        case 674: break;
-        case 379: 
+        case 701: break;
+        case 397: 
           { 
 	if(Debug.debugTokenizer)
 		dump("CDATA end");//$NON-NLS-1$
 	yybegin(fStateStack.pop());
 	return XML_CDATA_CLOSE;
  }
-        case 675: break;
-        case 378: 
+        case 702: break;
+        case 396: 
           { 
 	yybegin(ST_JSP_VBL);
 	if(yylength() > 2)
@@ -2393,15 +2482,15 @@
 	yybegin(YYINITIAL);
 	return PROXY_CONTEXT;
  }
-        case 676: break;
-        case 377: 
+        case 703: break;
+        case 395: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nPEReference");//$NON-NLS-1$
 	return XML_PE_REFERENCE;
  }
-        case 677: break;
-        case 376: 
+        case 704: break;
+        case 394: 
           { 
 	yybegin(ST_JSP_EL);
 	if(yylength() > 2)
@@ -2414,27 +2503,27 @@
 	yybegin(YYINITIAL);
 	return PROXY_CONTEXT;
  }
-        case 678: break;
-        case 373: 
+        case 705: break;
+        case 391: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nEntityRef");//$NON-NLS-1$
 	return XML_ENTITY_REFERENCE;
  }
-        case 679: break;
-        case 367: 
-        case 407: 
-        case 415: 
-        case 422: 
-        case 427: 
-        case 432: 
-        case 437: 
-        case 443: 
-        case 449: 
-        case 453: 
-        case 458: 
-        case 463: 
-        case 469: 
+        case 706: break;
+        case 385: 
+        case 425: 
+        case 433: 
+        case 446: 
+        case 451: 
+        case 456: 
+        case 461: 
+        case 467: 
+        case 473: 
+        case 477: 
+        case 482: 
+        case 487: 
+        case 493: 
           { 
 	/* JSP expression begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2470,7 +2559,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspExpressionStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP expression start");//$NON-NLS-1$
@@ -2501,23 +2590,28 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
+		
 		return PROXY_CONTEXT;
 	}
  }
-        case 680: break;
-        case 366: 
-        case 406: 
-        case 414: 
-        case 421: 
-        case 426: 
-        case 431: 
-        case 436: 
-        case 442: 
-        case 448: 
-        case 452: 
-        case 457: 
-        case 462: 
-        case 468: 
+        case 707: break;
+        case 384: 
+        case 424: 
+        case 432: 
+        case 445: 
+        case 450: 
+        case 455: 
+        case 460: 
+        case 466: 
+        case 472: 
+        case 476: 
+        case 481: 
+        case 486: 
+        case 492: 
           { 
 	/* JSP declaration begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2553,7 +2647,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDeclarationStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP declaration start");//$NON-NLS-1$
@@ -2584,23 +2678,27 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+		}
 		return PROXY_CONTEXT;
 	}
  }
-        case 681: break;
-        case 365: 
-        case 405: 
-        case 413: 
-        case 420: 
-        case 425: 
-        case 430: 
-        case 435: 
-        case 441: 
-        case 447: 
-        case 451: 
-        case 456: 
-        case 461: 
-        case 467: 
+        case 708: break;
+        case 383: 
+        case 423: 
+        case 431: 
+        case 444: 
+        case 449: 
+        case 454: 
+        case 459: 
+        case 465: 
+        case 471: 
+        case 475: 
+        case 480: 
+        case 485: 
+        case 491: 
           { 
 	/* JSP directive begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -2636,7 +2734,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDirectiveStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP declaration start");//$NON-NLS-1$
@@ -2670,60 +2768,60 @@
 		return PROXY_CONTEXT;
 	}
  }
-        case 682: break;
-        case 355: 
+        case 709: break;
+        case 373: 
           { 
 	yybegin(ST_JSP_VBL_DQUOTES_END);
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 683: break;
-        case 351: 
+        case 710: break;
+        case 369: 
           { 
 	yybegin(ST_JSP_VBL_SQUOTES_END);
 	return JSP_VBL_QUOTED_CONTENT;
  }
-        case 684: break;
-        case 349: 
+        case 711: break;
+        case 367: 
           { 
 	fELlevel++;
 	if(fELlevel == 1) {
 		return JSP_VBL_OPEN;
 	}
  }
-        case 685: break;
-        case 339: 
+        case 712: break;
+        case 357: 
           { 
 	yybegin(ST_JSP_EL_DQUOTES_END);
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 686: break;
-        case 335: 
+        case 713: break;
+        case 353: 
           { 
 	yybegin(ST_JSP_EL_SQUOTES_END);
 	return JSP_EL_QUOTED_CONTENT;
  }
-        case 687: break;
-        case 333: 
+        case 714: break;
+        case 351: 
           { 
 	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
 	return JSP_EL_CONTENT;
  }
-        case 688: break;
-        case 332: 
+        case 715: break;
+        case 350: 
           { 
 	fELlevel++;
 	if(fELlevel == 1) {
 		return JSP_EL_OPEN;
 	}
  }
-        case 689: break;
-        case 329: 
+        case 716: break;
+        case 347: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_DQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
 	// abort early when an unescaped double quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2732,14 +2830,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 690: break;
-        case 328: 
+        case 717: break;
+        case 346: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_DQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});
+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});
 	// abort early when an unescaped double quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2748,14 +2846,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 691: break;
-        case 326: 
+        case 718: break;
+        case 345: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_SQUOTED_VBL);
-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
 	// abort early when an unescaped single quote is found in the VBL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2764,14 +2862,14 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 692: break;
-        case 325: 
+        case 719: break;
+        case 344: 
           { 
 	int enterState = yystate();
 	yybegin(ST_JSP_SQUOTED_EL);
-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});
+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});
 	// abort early when an unescaped single quote is found in the EL
-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
 		yybegin(ST_ABORT_EMBEDDED);
 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 	}
@@ -2780,11 +2878,11 @@
 	}
 	return PROXY_CONTEXT;
  }
-        case 693: break;
-        case 324: 
+        case 720: break;
+        case 342: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$NON-NLS-1$
 	}
 	int incomingState = yystate();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
@@ -2797,15 +2895,15 @@
         yybegin(incomingState);
 	return PROXY_CONTEXT;
  }
-        case 694: break;
-        case 283: 
-        case 295: 
-        case 301: 
+        case 721: break;
+        case 292: 
+        case 304: 
+        case 310: 
           { 
 	return XML_DOCTYPE_INTERNAL_SUBSET;
  }
-        case 695: break;
-        case 271: 
+        case 722: break;
+        case 280: 
           { 
 	String tagName = yytext().substring(1);
 	// pushback to just after the opening bracket
@@ -2814,7 +2912,7 @@
 	 * If this tag can not be nested or we're already searching for an
 	 * attribute name, equals, or value, return immediately.
 	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
 		yybegin(ST_XML_TAG_NAME);
 		return XML_TAG_OPEN;
 	}
@@ -2830,8 +2928,8 @@
 	yybegin(ST_XML_ATTRIBUTE_NAME);
 	return PROXY_CONTEXT;
  }
-        case 696: break;
-        case 269: 
+        case 723: break;
+        case 278: 
           { 
 	String tagName = yytext().substring(1);
 	// pushback to just after the opening bracket
@@ -2840,7 +2938,7 @@
 	 * If this tag can not be nested or we're already searching for an
 	 * attribute name, equals, or value, return immediately.
 	 */
-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {
+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
 		yybegin(ST_XML_TAG_NAME);
 		return XML_TAG_OPEN;
 	}
@@ -2856,20 +2954,49 @@
 	yybegin(ST_XML_EQUALS);
 	return PROXY_CONTEXT;
  }
-        case 697: break;
-        case 267: 
+        case 724: break;
+        case 276: 
           { 
         yybegin(YYINITIAL);
 	fEmbeddedHint = UNDEFINED;
 	if(Debug.debugTokenizer)
 		dump("empty tag close");//$NON-NLS-1$
+		if (!fJspTagStack.empty())
+			fJspTagStack.pop();
         return XML_EMPTY_TAG_CLOSE;
  }
-        case 698: break;
-        case 125: 
+        case 725: break;
+        case 269: 
           { 
+	if(Debug.debugTokenizer)
+		dump("JSP end");//$NON-NLS-1$
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		if(fStateStack.peek()!=YYINITIAL)
+			System.out.println("end embedded region");//$NON-NLS-1$
+	}
+	yybegin(fStateStack.pop());
+	return JSP_DIRECTIVE_CLOSE;
+ }
+        case 726: break;
+        case 267: 
+          { 
+	if(Debug.debugTokenizer)
+		dump("JSP end");//$NON-NLS-1$
+	if (Debug.debugTokenizer) {
+		if(fStateStack.peek()!=YYINITIAL)
+			System.out.println("end embedded region");//$NON-NLS-1$
+	}
+	yybegin(fStateStack.pop());
+	return JSP_CLOSE;
+ }
+        case 727: break;
+        case 126: 
+        case 171: 
+          { 
+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;
+
+	if (Debug.debugTokenizer) {
+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
@@ -2877,18 +3004,18 @@
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
 		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);
+	assembleEmbeddedContainer(type, type);
 	fStateStack.pop();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
 	yybegin(ST_XML_ATTRIBUTE_NAME);
 	return PROXY_CONTEXT;
  }
-        case 699: break;
-        case 123: 
+        case 728: break;
+        case 124: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
@@ -2903,36 +3030,18 @@
 	fEmbeddedPostState = ST_XML_EQUALS;
 	return PROXY_CONTEXT;
  }
-        case 700: break;
+        case 729: break;
         case 122: 
-        case 127: 
-        case 128: 
-        case 273: 
-        case 277: 
-        case 278: 
-        case 387: 
-        case 390: 
-        case 481: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("attr value");//$NON-NLS-1$
-	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
-	fEmbeddedPostState = ST_XML_EQUALS;
-        yybegin(ST_XML_ATTRIBUTE_NAME);
-        return XML_TAG_ATTRIBUTE_VALUE;
- }
-        case 701: break;
-        case 121: 
           { 
 	if(Debug.debugTokenizer)
 		dump("equals");//$NON-NLS-1$
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
-        yybegin(ST_XML_ATTRIBUTE_VALUE);
+        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 702: break;
-        case 120: 
+        case 730: break;
+        case 121: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr name");//$NON-NLS-1$
@@ -2941,61 +3050,63 @@
         yybegin(ST_XML_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 703: break;
-        case 116: 
+        case 731: break;
         case 117: 
         case 118: 
-        case 268: 
-        case 386: 
-        case 480: 
-        case 520: 
-        case 521: 
-        case 540: 
-        case 541: 
-        case 559: 
-        case 560: 
-        case 573: 
-        case 582: 
-        case 590: 
-        case 592: 
-        case 594: 
-        case 596: 
-        case 599: 
-        case 605: 
-        case 606: 
+        case 119: 
+        case 277: 
+        case 404: 
+        case 504: 
+        case 545: 
+        case 546: 
+        case 565: 
+        case 566: 
+        case 584: 
+        case 585: 
+        case 598: 
         case 607: 
-        case 608: 
-        case 609: 
         case 615: 
-        case 616: 
         case 617: 
-        case 618: 
         case 619: 
-        case 625: 
-        case 626: 
-        case 628: 
-        case 629: 
-        case 635: 
-        case 636: 
-        case 637: 
-        case 638: 
+        case 621: 
+        case 624: 
+        case 630: 
+        case 631: 
+        case 632: 
+        case 633: 
+        case 634: 
+        case 640: 
+        case 641: 
+        case 642: 
+        case 643: 
         case 644: 
-        case 645: 
-        case 646: 
-        case 647: 
         case 650: 
         case 651: 
         case 653: 
+        case 654: 
+        case 660: 
+        case 661: 
+        case 662: 
+        case 663: 
+        case 669: 
+        case 670: 
+        case 671: 
+        case 672: 
+        case 675: 
+        case 676: 
+        case 678: 
           { 
 	if(Debug.debugTokenizer)
 		dump("tag name");//$NON-NLS-1$
+    String tagname = yytext();
+	fJspTagStack.push(tagname.indexOf(':') != -1);
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
         yybegin(ST_XML_ATTRIBUTE_NAME);
         return XML_TAG_NAME;
  }
-        case 704: break;
-        case 114: 
+        case 732: break;
+        case 115: 
           { 
 	if(Debug.debugTokenizer)
 		dump("tag close");//$NON-NLS-1$
@@ -3007,58 +3118,60 @@
 	}
 	else
         	yybegin(YYINITIAL);
+        if (!fJspTagStack.empty())
+			fJspTagStack.pop();
         return XML_TAG_CLOSE;
  }
-        case 705: break;
-        case 107: 
-        case 111: 
-        case 263: 
+        case 733: break;
+        case 108: 
+        case 112: 
+        case 272: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr value");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 706: break;
-        case 106: 
+        case 734: break;
+        case 107: 
           { 
 	if(Debug.debugTokenizer)
 		dump("equals");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 707: break;
-        case 105: 
+        case 735: break;
+        case 106: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attr name");//$NON-NLS-1$
         yybegin(ST_JSP_DIRECTIVE_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 708: break;
-        case 102: 
+        case 736: break;
+        case 103: 
           { 
 	if(Debug.debugTokenizer)
 		dump("JSP directive name");//$NON-NLS-1$
 	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
 	return JSP_DIRECTIVE_NAME;
  }
-        case 709: break;
-        case 98: 
+        case 737: break;
         case 99: 
         case 100: 
+        case 101: 
           { 
 	if(Debug.debugTokenizer)
 		dump("JSP code content");//$NON-NLS-1$
 	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
  }
-        case 710: break;
-        case 94: 
-        case 96: 
+        case 738: break;
+        case 95: 
         case 97: 
-        case 253: 
-        case 254: 
-        case 257: 
+        case 98: 
+        case 262: 
+        case 263: 
+        case 266: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
@@ -3067,8 +3180,8 @@
         yybegin(ST_DHTML_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 711: break;
-        case 93: 
+        case 739: break;
+        case 94: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction '='");//$NON-NLS-1$
@@ -3077,16 +3190,16 @@
         yybegin(ST_DHTML_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 712: break;
-        case 92: 
+        case 740: break;
+        case 93: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
         yybegin(ST_DHTML_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 713: break;
-        case 90: 
+        case 741: break;
+        case 91: 
           { 
 	if(Debug.debugTokenizer)
 		dump("DHTML processing instruction end");//$NON-NLS-1$
@@ -3094,10 +3207,10 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 714: break;
-        case 84: 
-        case 86: 
-        case 244: 
+        case 742: break;
+        case 85: 
+        case 87: 
+        case 253: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction attribute value");//$NON-NLS-1$
@@ -3106,8 +3219,8 @@
         yybegin(ST_XML_PI_ATTRIBUTE_NAME);
         return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 715: break;
-        case 83: 
+        case 743: break;
+        case 84: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction '='");//$NON-NLS-1$
@@ -3116,79 +3229,79 @@
         yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
         return XML_TAG_ATTRIBUTE_EQUALS;
  }
-        case 716: break;
-        case 49: 
-        case 199: 
-        case 200: 
-        case 203: 
-        case 213: 
-        case 214: 
-        case 217: 
-        case 218: 
-        case 360: 
-        case 363: 
-        case 446: 
-        case 460: 
-        case 466: 
+        case 744: break;
+        case 50: 
+        case 208: 
+        case 209: 
+        case 212: 
+        case 222: 
+        case 223: 
+        case 226: 
+        case 227: 
+        case 378: 
+        case 381: 
+        case 470: 
+        case 484: 
+        case 490: 
           { 
 	return JSP_VBL_CONTENT;
  }
-        case 717: break;
-        case 42: 
-        case 178: 
-        case 179: 
-        case 182: 
-        case 192: 
-        case 193: 
-        case 196: 
-        case 197: 
-        case 330: 
-        case 344: 
-        case 347: 
-        case 418: 
-        case 419: 
-        case 434: 
-        case 440: 
+        case 745: break;
+        case 43: 
+        case 186: 
+        case 187: 
+        case 190: 
+        case 200: 
+        case 201: 
+        case 205: 
+        case 206: 
+        case 348: 
+        case 362: 
+        case 365: 
+        case 442: 
+        case 443: 
+        case 458: 
+        case 464: 
           { 
 	return JSP_EL_CONTENT;
  }
-        case 718: break;
+        case 746: break;
         case 35: 
-        case 159: 
         case 160: 
-        case 321: 
-        case 412: 
-        case 416: 
-        case 495: 
-        case 528: 
-        case 548: 
-        case 565: 
-        case 575: 
+        case 161: 
+        case 330: 
+        case 430: 
+        case 434: 
+        case 519: 
+        case 553: 
+        case 573: 
+        case 590: 
+        case 600: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist contentspec");//$NON-NLS-1$
 	return XML_ATTLIST_DECL_CONTENT;
  }
-        case 719: break;
+        case 747: break;
         case 33: 
-        case 152: 
         case 153: 
-        case 311: 
-        case 404: 
-        case 408: 
-        case 492: 
-        case 527: 
-        case 547: 
-        case 564: 
-        case 574: 
+        case 154: 
+        case 320: 
+        case 422: 
+        case 426: 
+        case 516: 
+        case 552: 
+        case 572: 
+        case 589: 
+        case 599: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl contentspec");//$NON-NLS-1$
 	return XML_ELEMENT_DECL_CONTENT;
  }
-        case 720: break;
+        case 748: break;
         case 22: 
-        case 112: 
+        case 113: 
           { 
 	if(Debug.debugTokenizer)
 		dump("inappropriate tag name");//$NON-NLS-1$
@@ -3200,16 +3313,16 @@
 	yybegin(YYINITIAL);
         return XML_CONTENT;
  }
-        case 721: break;
+        case 749: break;
         case 18: 
-        case 104: 
+        case 105: 
           { 
 	if(Debug.debugTokenizer)
 		dump("white space");//$NON-NLS-1$
 	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
 	return WHITE_SPACE;
  }
-        case 722: break;
+        case 750: break;
         case 5: 
         case 8: 
         case 9: 
@@ -3235,39 +3348,40 @@
         case 34: 
         case 40: 
         case 41: 
-        case 72: 
-        case 169: 
-        case 174: 
+        case 42: 
+        case 73: 
+        case 177: 
+        case 182: 
           { 
 	if(Debug.debugTokenizer)
 		dump("white space");//$NON-NLS-1$
         return WHITE_SPACE;
  }
-        case 723: break;
+        case 751: break;
         case 0: 
-        case 56: 
-        case 59: 
-        case 61: 
-        case 225: 
-        case 227: 
-        case 228: 
-        case 230: 
-        case 232: 
-        case 370: 
-        case 371: 
-        case 372: 
-        case 475: 
+        case 57: 
+        case 60: 
+        case 62: 
+        case 234: 
+        case 236: 
+        case 237: 
+        case 239: 
+        case 241: 
+        case 388: 
+        case 389: 
+        case 390: 
+        case 499: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nXML content");//$NON-NLS-1$
 	return XML_CONTENT;
  }
-        case 724: break;
-        case 57: 
-        case 101: 
-        case 113: 
-        case 119: 
-        case 129: 
+        case 752: break;
+        case 58: 
+        case 102: 
+        case 114: 
+        case 120: 
+        case 130: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nstart tag open");//$NON-NLS-1$
@@ -3276,71 +3390,69 @@
         yybegin(ST_XML_TAG_NAME);
         return XML_TAG_OPEN;
  }
-        case 725: break;
-        case 58: 
-        case 60: 
-        case 64: 
+        case 753: break;
+        case 59: 
+        case 61: 
         case 65: 
         case 66: 
-        case 70: 
+        case 67: 
         case 71: 
-        case 81: 
-        case 85: 
-        case 87: 
+        case 72: 
+        case 82: 
+        case 86: 
         case 88: 
         case 89: 
-        case 91: 
-        case 95: 
-        case 103: 
-        case 108: 
+        case 90: 
+        case 92: 
+        case 96: 
+        case 104: 
         case 109: 
         case 110: 
-        case 115: 
-        case 124: 
-        case 131: 
+        case 111: 
+        case 116: 
+        case 125: 
         case 132: 
         case 133: 
         case 134: 
-        case 136: 
+        case 135: 
         case 137: 
-        case 139: 
+        case 138: 
         case 140: 
         case 141: 
-        case 144: 
+        case 142: 
         case 145: 
         case 146: 
-        case 149: 
+        case 147: 
         case 150: 
         case 151: 
-        case 156: 
+        case 152: 
         case 157: 
         case 158: 
-        case 166: 
-        case 171: 
-        case 172: 
-        case 176: 
-        case 177: 
-        case 184: 
-        case 185: 
-        case 187: 
-        case 188: 
-        case 194: 
-        case 198: 
-        case 205: 
-        case 206: 
-        case 208: 
-        case 209: 
+        case 159: 
+        case 167: 
+        case 169: 
+        case 170: 
+        case 192: 
+        case 193: 
+        case 195: 
+        case 196: 
+        case 203: 
+        case 207: 
+        case 214: 
         case 215: 
-        case 219: 
+        case 217: 
+        case 218: 
+        case 224: 
+        case 228: 
           { 
 	if (Debug.debugTokenizer)
 		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
 			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
 	return UNDEFINED;
  }
-        case 726: break;
-        case 62: 
+        case 754: break;
         case 63: 
+        case 64: 
           { 
 	if(Debug.debugTokenizer)
 		dump("CDATA text");//$NON-NLS-1$
@@ -3351,46 +3463,46 @@
 		yybegin(ST_CDATA_END);
 	return returnedContext;
  }
-        case 727: break;
-        case 67: 
-        case 186: 
-        case 189: 
-        case 207: 
-        case 210: 
+        case 755: break;
+        case 68: 
+        case 194: 
+        case 197: 
+        case 216: 
+        case 219: 
           { 
 	if(Debug.debugTokenizer)
 		dump("LINE FEED");//$NON-NLS-1$
 	return WHITE_SPACE;
  }
-        case 728: break;
-        case 68: 
+        case 756: break;
         case 69: 
+        case 70: 
           { 
 	if(Debug.debugTokenizer)
 		dump("comment content");//$NON-NLS-1$
 	return scanXMLCommentText();
  }
-        case 729: break;
-        case 73: 
+        case 757: break;
         case 74: 
         case 75: 
         case 76: 
-        case 237: 
-        case 238: 
-        case 239: 
-        case 383: 
-        case 478: 
-        case 479: 
-        case 518: 
-        case 519: 
-        case 538: 
-        case 558: 
-        case 571: 
-        case 581: 
-        case 589: 
-        case 591: 
-        case 593: 
-        case 595: 
+        case 77: 
+        case 246: 
+        case 247: 
+        case 248: 
+        case 401: 
+        case 502: 
+        case 503: 
+        case 543: 
+        case 544: 
+        case 563: 
+        case 583: 
+        case 596: 
+        case 606: 
+        case 614: 
+        case 616: 
+        case 618: 
+        case 620: 
           { 
 	if(Debug.debugTokenizer)
 		dump("processing instruction target");//$NON-NLS-1$
@@ -3398,33 +3510,35 @@
         yybegin(ST_PI_WS);
         return XML_TAG_NAME;
  }
-        case 730: break;
-        case 77: 
+        case 758: break;
+        case 78: 
           { 
         yybegin(ST_PI_CONTENT);
         return WHITE_SPACE;
  }
-        case 731: break;
-        case 78: 
+        case 759: break;
         case 79: 
         case 80: 
+        case 81: 
           { 
 		// block scan until close is found
 	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
  }
-        case 732: break;
-        case 82: 
+        case 760: break;
+        case 83: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction attribute name");//$NON-NLS-1$
         yybegin(ST_XML_PI_EQUALS);
         return XML_TAG_ATTRIBUTE_NAME;
  }
-        case 733: break;
-        case 126: 
+        case 761: break;
+        case 127: 
+        case 172: 
           { 
+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
 	}
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
@@ -3432,15 +3546,15 @@
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
 		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);
+	assembleEmbeddedContainer(type, type);
 	fStateStack.pop();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
 	fEmbeddedPostState = ST_XML_EQUALS;
         yybegin(ST_XML_ATTRIBUTE_NAME);
 	return PROXY_CONTEXT;
  }
-        case 734: break;
-        case 130: 
+        case 762: break;
+        case 131: 
           { 
 	if(Debug.debugTokenizer)
 		dump("declaration end");//$NON-NLS-1$
@@ -3451,20 +3565,20 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 735: break;
-        case 135: 
+        case 763: break;
+        case 136: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype type");//$NON-NLS-1$
 	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
 	return XML_DOCTYPE_NAME;
  }
-        case 736: break;
-        case 138: 
-        case 142: 
-        case 288: 
-        case 292: 
-        case 399: 
+        case 764: break;
+        case 139: 
+        case 143: 
+        case 297: 
+        case 301: 
+        case 417: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype public reference");//$NON-NLS-1$
@@ -3473,10 +3587,10 @@
 	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
 	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
  }
-        case 737: break;
-        case 143: 
-        case 147: 
-        case 298: 
+        case 765: break;
+        case 144: 
+        case 148: 
+        case 307: 
           { 
 	if(Debug.debugTokenizer)
 		dump("doctype system reference");//$NON-NLS-1$
@@ -3485,11 +3599,11 @@
 	yybegin(ST_XML_DECLARATION_CLOSE);
 	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
  }
-        case 738: break;
-        case 148: 
-        case 304: 
-        case 308: 
-        case 402: 
+        case 766: break;
+        case 149: 
+        case 313: 
+        case 317: 
+        case 420: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl name");//$NON-NLS-1$
@@ -3498,8 +3612,8 @@
 	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
 	return XML_ELEMENT_DECL_NAME;
  }
-        case 739: break;
-        case 154: 
+        case 767: break;
+        case 155: 
           { 
 	if(Debug.debugTokenizer)
 		dump("elementdecl close");//$NON-NLS-1$
@@ -3510,11 +3624,11 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 740: break;
-        case 155: 
-        case 314: 
-        case 318: 
-        case 410: 
+        case 768: break;
+        case 156: 
+        case 323: 
+        case 327: 
+        case 428: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist name");//$NON-NLS-1$
@@ -3523,8 +3637,8 @@
 	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
 	return XML_ATTLIST_DECL_NAME;
  }
-        case 741: break;
-        case 161: 
+        case 769: break;
+        case 162: 
           { 
 	if(Debug.debugTokenizer)
 		dump("attlist close");//$NON-NLS-1$
@@ -3535,25 +3649,30 @@
 	yybegin(fStateStack.pop());
 	return XML_DECLARATION_CLOSE;
  }
-        case 742: break;
-        case 164: 
+        case 770: break;
         case 165: 
+        case 166: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nJSP comment text");//$NON-NLS-1$
 	return scanJSPCommentText();
  }
-        case 743: break;
-        case 167: 
-        case 173: 
+        case 771: break;
+        case 175: 
+        case 179: 
+        case 180: 
+        case 181: 
+        case 184: 
+        case 185: 
+        case 343: 
           { 
 	return XML_TAG_ATTRIBUTE_VALUE;
  }
-        case 744: break;
-        case 168: 
+        case 772: break;
+        case 176: 
           { 
 	if (Debug.debugTokenizer) {
-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$NON-NLS-1$
 	}
 	int incomingState = yystate();
 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
@@ -3566,30 +3685,30 @@
         yybegin(incomingState);
 	return PROXY_CONTEXT;
  }
-        case 745: break;
-        case 170: 
+        case 773: break;
+        case 178: 
           { 
-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
  }
-        case 746: break;
-        case 175: 
+        case 774: break;
+        case 183: 
           { 
-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
+	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
  }
-        case 747: break;
-        case 180: 
+        case 775: break;
+        case 188: 
           { 
 	yybegin(ST_JSP_EL_DQUOTES);
 	return JSP_EL_DQUOTE;
  }
-        case 748: break;
-        case 181: 
+        case 776: break;
+        case 189: 
           { 
 	yybegin(ST_JSP_EL_SQUOTES);
 	return JSP_EL_SQUOTE;
  }
-        case 749: break;
-        case 183: 
+        case 777: break;
+        case 191: 
           { 
 	fELlevel--;
 	if(fELlevel == 0) {
@@ -3598,37 +3717,42 @@
 	}
 	return JSP_EL_CONTENT;
  }
-        case 750: break;
-        case 190: 
+        case 778: break;
+        case 198: 
           { 
 	yybegin(ST_JSP_EL);
 	return JSP_EL_SQUOTE;
  }
-        case 751: break;
-        case 191: 
+        case 779: break;
+        case 199: 
           { 
 	yybegin(ST_JSP_EL);
 	return JSP_EL_DQUOTE;
  }
-        case 752: break;
-        case 195: 
+        case 780: break;
+        case 202: 
+          { 
+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
+ }
+        case 781: break;
+        case 204: 
           { 
 	return JSP_EL_CLOSE;
  }
-        case 753: break;
-        case 201: 
+        case 782: break;
+        case 210: 
           { 
 	yybegin(ST_JSP_VBL_DQUOTES);
 	return JSP_VBL_DQUOTE;
  }
-        case 754: break;
-        case 202: 
+        case 783: break;
+        case 211: 
           { 
 	yybegin(ST_JSP_VBL_SQUOTES);
 	return JSP_VBL_SQUOTE;
  }
-        case 755: break;
-        case 204: 
+        case 784: break;
+        case 213: 
           { 
 	fELlevel--;
 	if(fELlevel == 0) {
@@ -3637,25 +3761,25 @@
 	}
 	return JSP_VBL_CONTENT;
  }
-        case 756: break;
-        case 211: 
+        case 785: break;
+        case 220: 
           { 
 	yybegin(ST_JSP_VBL);
 	return JSP_VBL_SQUOTE;
  }
-        case 757: break;
-        case 212: 
+        case 786: break;
+        case 221: 
           { 
 	yybegin(ST_JSP_VBL);
 	return JSP_VBL_DQUOTE;
  }
-        case 758: break;
-        case 216: 
+        case 787: break;
+        case 225: 
           { 
 	return JSP_VBL_CLOSE;
  }
-        case 759: break;
-        case 220: 
+        case 788: break;
+        case 229: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nend tag open");//$NON-NLS-1$
@@ -3664,28 +3788,28 @@
         yybegin(ST_XML_TAG_NAME);
         return XML_END_TAG_OPEN;
  }
-        case 760: break;
-        case 221: 
+        case 789: break;
+        case 230: 
           { 
 	if(Debug.debugTokenizer)
 		dump("\nprocessing instruction start");//$NON-NLS-1$
 	yybegin(ST_PI);
         return XML_PI_OPEN;
  }
-        case 761: break;
-        case 222: 
-        case 310: 
-        case 320: 
-        case 331: 
-        case 336: 
-        case 340: 
-        case 343: 
-        case 346: 
-        case 348: 
-        case 352: 
-        case 356: 
-        case 359: 
-        case 362: 
+        case 790: break;
+        case 231: 
+        case 319: 
+        case 329: 
+        case 349: 
+        case 354: 
+        case 358: 
+        case 361: 
+        case 364: 
+        case 366: 
+        case 370: 
+        case 374: 
+        case 377: 
+        case 380: 
           { 
 	/* JSP scriptlet begun (anywhere)
 	 * A consequence of the start anywhere possibility is that the
@@ -3721,7 +3845,7 @@
 	}
 	else {
 		if (Debug.debugTokenizer) {
-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$
+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspScriptletStart");//$NON-NLS-1$
 		}
 		if(Debug.debugTokenizer)
 			dump("JSP scriptlet start");//$NON-NLS-1$
@@ -3752,11 +3876,16 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
 		}
+        else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {
+            fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
+            fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
+        }
+		
 		return PROXY_CONTEXT;
 	}
  }
-        case 762: break;
-        case 223: 
+        case 791: break;
+        case 232: 
           { 
 	fStateStack.push(yystate());
 	if(Debug.debugTokenizer)
@@ -3764,8 +3893,8 @@
         yybegin(ST_XML_DECLARATION);
 	return XML_DECLARATION_OPEN;
  }
-        case 763: break;
-        case 236: 
+        case 792: break;
+        case 245: 
           { 
 	if(Debug.debugTokenizer)
 		dump("processing instruction end");//$NON-NLS-1$
@@ -3773,16 +3902,16 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 764: break;
-        case 240: 
+        case 793: break;
+        case 249: 
           { 
 		// ended with nothing inside
 		fEmbeddedHint = UNDEFINED;
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 765: break;
-        case 241: 
+        case 794: break;
+        case 250: 
           { 
 	if(Debug.debugTokenizer)
 		dump("XML processing instruction end");//$NON-NLS-1$
@@ -3790,37 +3919,13 @@
         yybegin(YYINITIAL);
         return XML_PI_CLOSE;
  }
-        case 766: break;
-        case 258: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_CLOSE;
- }
-        case 767: break;
-        case 260: 
-          { 
-	if(Debug.debugTokenizer)
-		dump("JSP end");//$NON-NLS-1$
-	if (Debug.debugTokenizer) {
-		if(fStateStack.peek()!=YYINITIAL)
-			System.out.println("end embedded region");//$NON-NLS-1$
-	}
-	yybegin(fStateStack.pop());
-	return JSP_DIRECTIVE_CLOSE;
- }
-        case 768: break;
-        case 162: 
+        case 795: break;
         case 163: 
+        case 164: 
           { 
 		return doBlockTagScan();
 	 }
-        case 769: break;
+        case 796: break;
         default: 
           if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
             yy_atEOF = true;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
index f0aa201..747540e 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/regions/DOMJSPRegionContexts.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     Frits Jalvingh - contributions for bug 150794
  *     
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.regions;
@@ -50,7 +51,13 @@
 	public static final String JSP_VBL_OPEN = "JSP_VBL_OPEN"; //$NON-NLS-1$
 	public static final String JSP_VBL_QUOTED_CONTENT = "JSP_VBL_QUOTED_CONTENT"; //$NON-NLS-1$
 	public static final String JSP_VBL_SQUOTE = "JSP_VBL_SQUOTE"; //$NON-NLS-1$
-	public static final String XML_TAG_ATTRIBUTE_VALUE_DQUOTE = "XML_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
 
+	/** Non-taglib XML tag, needing single escape unquoting for embedded expressions */
+	public static final String XML_TAG_ATTRIBUTE_VALUE_DQUOTE = "XML_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
 	public static final String XML_TAG_ATTRIBUTE_VALUE_SQUOTE = "XML_TAG_ATTRIBUTE_VALUE_SQUOTE"; //$NON-NLS-1$
+
+	/** Taglib tag attribute with double quote, needing 'double escaping' */
+	public static final String JSP_TAG_ATTRIBUTE_VALUE_DQUOTE = "JSP_TAG_ATTRIBUTE_VALUE_DQUOTE"; //$NON-NLS-1$
+	/** Taglib tag attribute with single quote, needing 'double escaping' */
+	public static final String JSP_TAG_ATTRIBUTE_VALUE_SQUOTE = "JSP_TAG_ATTRIBUTE_VALUE_SQUOTE"; //$NON-NLS-1$
 }
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/LineStyleProviderForJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/LineStyleProviderForJSP.java
index 56bcc43..68e8e3d 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/LineStyleProviderForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/LineStyleProviderForJSP.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 package org.eclipse.jst.jsp.ui.internal.style;
 
@@ -81,7 +82,7 @@
 				else if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
 					result = (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
 				}
-				else if ((type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) || (type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || (type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
+				else if ((type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) || (type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || (type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE)|| (type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_DQUOTE) || (type == DOMJSPRegionContexts.JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
 					result = (TextAttribute) getTextAttributes().get(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE);
 				}
 				else if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/DoubleQuotedStringRule.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/DoubleQuotedStringRule.java
new file mode 100644
index 0000000..eabb960
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/DoubleQuotedStringRule.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Frits Jalvingh and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Frits Jalvingh - initial version (bugfix for 150794)
+ *******************************************************************************/
+package org.eclipse.jst.jsp.ui.internal.style.java;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * This rule matches the double-quoted strings present in JSP tag attributes. A double-quoted
+ * strings starts with \" (two characters!) and ends with \" (two characters!) too. The sequence
+ * \" is escaped by the horror \\\" (4 chars!?) as per the JSP spec.
+ *
+ * @author <a href="mailto:jal@etc.to">Frits Jalvingh</a>
+ * Created on Aug 5, 2007
+ */
+public class DoubleQuotedStringRule implements IPredicateRule {
+	private IToken	fToken;
+	private int		m_qc;
+
+	public DoubleQuotedStringRule(IToken tok) {
+		fToken = tok;
+	}
+	public IToken evaluate(ICharacterScanner scanner, boolean resume) {
+		if(resume) {
+			if(findEnd(scanner, m_qc))
+				return fToken;
+		} else {
+			int c= scanner.read();
+			if(c == '\\') {
+				c = scanner.read();
+				if(c == '"' || c == '\'') {
+					if(findEnd(scanner, c))
+						return fToken;
+				}
+				scanner.unread();
+			}
+			scanner.unread();
+		}
+		return Token.UNDEFINED;
+	}
+
+	private boolean findEnd(ICharacterScanner scanner, int qc) {
+		m_qc = qc;
+		int count = 0;
+		int c;
+		int nsl = 0;
+		while((c= scanner.read()) != ICharacterScanner.EOF) {
+			count++;
+			if(c == '\\') {
+				nsl++;
+				if(nsl >= 4)
+					nsl = 0;
+			} else if(c == qc) {
+				if(nsl == 1)
+					return true;
+				nsl = 0;
+			} else
+				nsl= 0;
+		}
+		while(--count >= 0)
+			scanner.unread();
+		return false;
+	}
+
+	public IToken getSuccessToken() {
+		return fToken;
+	}
+
+	public IToken evaluate(ICharacterScanner scanner) {
+		return evaluate(scanner, false);
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/JavaCodeScanner.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/JavaCodeScanner.java
index 528ed65..9d6c26e 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/JavaCodeScanner.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/JavaCodeScanner.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 package org.eclipse.jst.jsp.ui.internal.style.java;
 
@@ -85,6 +86,8 @@
 			wordRule.addWord(fgConstants[i], fTypeToken);
 		rules.add(wordRule);
 
+		// Add the double-quoted string rule
+		rules.add(new DoubleQuotedStringRule(fStringToken));
 
 		IRule[] result = new IRule[rules.size()];
 		rules.toArray(result);
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/LineStyleProviderForJava.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/LineStyleProviderForJava.java
index a10936a..a41e055 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/LineStyleProviderForJava.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/style/java/LineStyleProviderForJava.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Frits Jalvingh - contributions for bug 150794
  *******************************************************************************/
 package org.eclipse.jst.jsp.ui.internal.style.java;
 
@@ -67,6 +68,7 @@
 	public LineStyleProviderForJava() {
 		super();
 		fScanner = new JavaCodeScanner();
+		loadColors();		// Make sure we have rules before we start parsing
 	}
 
 	/**
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
index d14c3d7..16a9c30 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
@@ -1,5 +1,5 @@
 /*******************************************************************************

- * Copyright (c) 2004, 2008 IBM Corporation and others.

+ * Copyright (c) 2004, 2009 IBM Corporation and others.

  * All rights reserved. This program and the accompanying materials

  * are made available under the terms of the Eclipse Public License v1.0

  * which accompanies this distribution, and is available at

@@ -7,6 +7,7 @@
  * 

  * Contributors:

  *     IBM Corporation - initial API and implementation

+ *     Frits Jalvingh - contributions for bug 150794

  *******************************************************************************/

 

 package org.eclipse.jst.jsp.core.internal.parser.internal;

@@ -17,6 +18,7 @@
 import java.util.Iterator;

 import java.util.List;

 

+import org.eclipse.jst.jsp.core.internal.contenttype.BooleanStack;

 import org.eclipse.jst.jsp.core.internal.Logger;

 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;

 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;

@@ -49,6 +51,9 @@
 	// a "hint" as to what state to enter once an embedded region has

 	//   been completed

 	private int fEmbeddedPostState = YYINITIAL;

+	

+	private BooleanStack fJspTagStack = new BooleanStack();

+	

 	// the container used to create embedded regions

 	private ContextRegionContainer fEmbeddedContainer = null;

 	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";

@@ -804,6 +809,7 @@
 		fBufferedStart = 1;

 		fBufferedLength = 0;

 		fStateStack = new IntStack();

+		fJspTagStack.clear();

 	

 		fLastInternalBlockStart = -1;

 	

@@ -852,6 +858,11 @@
 		//  context as usual.

 		return doScan("--%>", false, false, true, JSP_COMMENT_TEXT, ST_JSP_COMMENT_END, ST_JSP_COMMENT_END);

 	}

+	

+	/* user method */

+	private boolean isJspTag() {

+	  return fJspTagStack.empty() ? false : fJspTagStack.peek();

+	}

 %}

 

 %eof{

@@ -920,6 +931,7 @@
 %state ST_JSP_COMMENT

 %state ST_JSP_COMMENT_END

 

+%state ST_JSP_ATTRIBUTE_VALUE

 %state ST_XML_ATTRIBUTE_VALUE_SQUOTED

 %state ST_XML_ATTRIBUTE_VALUE_DQUOTED

 

@@ -991,6 +1003,9 @@
 // [10] AttValue ::= '"' ([^<&"] | Reference)* '"' |  "'" ([^<&'] | Reference)* "'"

 AttValue = ( \"([^<"\x24\x23] | [\x24\x23][^\x7b"] | {Reference})*[\x24\x23]*\" | \'([^<'\x24\x23] | [\x24\x23][^\x7b'] | {Reference})*[\x24\x23]*\'  | ([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )*)

 

+// As Attvalue, but accepts escaped versions of the lead-in quote also

+QuotedAttValue = ( \"([^<"\x24\x23] | [\x24\x23][^\x7b"] | \\\" | {Reference})*[\x24\x23]*\" | \'([^<'\x24\x23] | [\x24\x23][^\x7b'] | \\\' | {Reference})*[\x24\x23]*\'  | ([^\'\"\040\011\012\015<>/]|\/+[^\'\"\040\011\012\015<>/] )*)

+

 // [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") 

 SystemLiteral = ((\" [^\"]* \") | (\' [^\']* \')) 

 

@@ -1338,7 +1353,7 @@
 %%

 

 /* white space within a tag */

-<ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_PI, ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_ATTLIST_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE,ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED,ST_DHTML_ATTRIBUTE_NAME,ST_DHTML_EQUALS,ST_DHTML_ATTRIBUTE_VALUE,ST_DHTML_TAG_CLOSE> {S}* {

+<ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE, ST_PI, ST_XML_PI_EQUALS, ST_XML_PI_ATTRIBUTE_NAME, ST_XML_PI_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_XML_DOCTYPE_DECLARATION, ST_XML_ELEMENT_DECLARATION, ST_XML_ATTLIST_DECLARATION, ST_XML_DECLARATION_CLOSE, ST_XML_DOCTYPE_ID_PUBLIC, ST_XML_DOCTYPE_ID_SYSTEM, ST_XML_DOCTYPE_EXTERNAL_ID, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE,ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED,ST_DHTML_ATTRIBUTE_NAME,ST_DHTML_EQUALS,ST_DHTML_ATTRIBUTE_VALUE,ST_DHTML_TAG_CLOSE> {S}* {

 	if(Debug.debugTokenizer)

 		dump("white space");//$NON-NLS-1$

         return WHITE_SPACE;

@@ -1359,14 +1374,16 @@
 /* VERY special cases for tags as values */

 /* quoted JSP */

 <ST_XML_ATTRIBUTE_VALUE_DQUOTED> ["] {

-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

+	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

 }

 <ST_XML_ATTRIBUTE_VALUE_SQUOTED> ['] {

-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

 }

-<ST_XML_ATTRIBUTE_VALUE> ["] {

+<ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> ["] {

+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;

+

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$

 	}

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;

@@ -1374,16 +1391,17 @@
 	fStateStack.push(yystate());

 	if(Debug.debugTokenizer)

 		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$

-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_DQUOTE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE);

+	assembleEmbeddedContainer(type, type);

 	fStateStack.pop();

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

 	fEmbeddedPostState = ST_XML_EQUALS;

 	yybegin(ST_XML_ATTRIBUTE_NAME);

 	return PROXY_CONTEXT;

 }

-<ST_XML_ATTRIBUTE_VALUE> ['] {

+<ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> ['] {

+	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$

 	}

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;

@@ -1391,7 +1409,7 @@
 	fStateStack.push(yystate());

 	if(Debug.debugTokenizer)

 		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$

-	assembleEmbeddedContainer(XML_TAG_ATTRIBUTE_VALUE_SQUOTE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE);

+	assembleEmbeddedContainer(type, type);

 	fStateStack.pop();

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

 	fEmbeddedPostState = ST_XML_EQUALS;

@@ -1399,16 +1417,16 @@
 	return PROXY_CONTEXT;

 }

 

-<ST_XML_ATTRIBUTE_VALUE_DQUOTED> ([^<"\x24\x23]|[\x24\x23][^\x7b])+ {

+<ST_XML_ATTRIBUTE_VALUE_DQUOTED> ([^<"\x24\x23]+|[\x24\x23]{S}*) {

 	return XML_TAG_ATTRIBUTE_VALUE;

 }

-<ST_XML_ATTRIBUTE_VALUE_SQUOTED> ([^<'\x24\x23]|[\x24\x23][^\x7b])+ {

+<ST_XML_ATTRIBUTE_VALUE_SQUOTED> ([^<'\x24\x23]+|[\x24\x23]{S}*) {

 	return XML_TAG_ATTRIBUTE_VALUE;

 }

 

 <ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED> {genericTagOpen} {

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$NON-NLS-1$

 	}

 	int incomingState = yystate();

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

@@ -1423,7 +1441,7 @@
 }

 <ST_XML_ATTRIBUTE_VALUE_DQUOTED,ST_XML_ATTRIBUTE_VALUE_SQUOTED> {genericEndTagOpen} {

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$NON-NLS-1$

 	}

 	int incomingState = yystate();

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

@@ -1440,7 +1458,7 @@
 /* unquoted */

 <ST_XML_ATTRIBUTE_VALUE> {genericTagOpen} {

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$NON-NLS-1$

 	}

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

@@ -1456,7 +1474,7 @@
 	return PROXY_CONTEXT;

 }

 

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION> {genericEndTagOpen} {

+<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE, ST_XML_DECLARATION> {genericEndTagOpen} {

 	if(Debug.debugTokenizer)

 		dump("\nend tag open");//$NON-NLS-1$

 	fEmbeddedHint = XML_TAG_NAME;

@@ -1485,6 +1503,8 @@
 <ST_XML_TAG_NAME> {Name} {

 	if(Debug.debugTokenizer)

 		dump("tag name");//$NON-NLS-1$

+    String tagname = yytext();

+	fJspTagStack.push(tagname.indexOf(':') != -1);

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

 	fEmbeddedPostState = ST_XML_EQUALS;

         yybegin(ST_XML_ATTRIBUTE_NAME);

@@ -1506,11 +1526,11 @@
 		dump("equals");//$NON-NLS-1$

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

-        yybegin(ST_XML_ATTRIBUTE_VALUE);

+        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);

         return XML_TAG_ATTRIBUTE_EQUALS;

 }

 /* the value was found, look for the next name */

-<ST_XML_ATTRIBUTE_VALUE> {AttValue} {

+<ST_XML_ATTRIBUTE_VALUE> {AttValue} { /* only allow for non-JSP tags for this does not obey JSP quoting rules */

 	if(Debug.debugTokenizer)

 		dump("attr value");//$NON-NLS-1$

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

@@ -1518,8 +1538,17 @@
         yybegin(ST_XML_ATTRIBUTE_NAME);

         return XML_TAG_ATTRIBUTE_VALUE;

 }

+<ST_JSP_ATTRIBUTE_VALUE> {QuotedAttValue} { /* JSP attribute values have escape semantics */

+	if(Debug.debugTokenizer)

+		dump("jsp attr value");//$NON-NLS-1$

+	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;

+	fEmbeddedPostState = ST_XML_EQUALS;

+	yybegin(ST_XML_ATTRIBUTE_NAME);

+	return XML_TAG_ATTRIBUTE_VALUE;

+}

+

 /* the tag's close was found */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagClose} {

+<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> {genericTagClose} {

 	if(Debug.debugTokenizer)

 		dump("tag close");//$NON-NLS-1$

 	fEmbeddedHint = UNDEFINED;

@@ -1530,14 +1559,18 @@
 	}

 	else

         	yybegin(YYINITIAL);

+        if (!fJspTagStack.empty())

+			fJspTagStack.pop();

         return XML_TAG_CLOSE;

 }

 /* the tag's close was found, but the tag doesn't need a matching end tag */

-<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericEmptyTagClose} {

+<ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> {genericEmptyTagClose} {

         yybegin(YYINITIAL);

 	fEmbeddedHint = UNDEFINED;

 	if(Debug.debugTokenizer)

 		dump("empty tag close");//$NON-NLS-1$

+		if (!fJspTagStack.empty())

+			fJspTagStack.pop();

         return XML_EMPTY_TAG_CLOSE;

 }

 

@@ -1564,7 +1597,7 @@
 	 * If this tag can not be nested or we're already searching for an

 	 * attribute name, equals, or value, return immediately.

 	 */

-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {

+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {

 		yybegin(ST_XML_TAG_NAME);

 		return XML_TAG_OPEN;

 	}

@@ -1580,7 +1613,7 @@
 	yybegin(ST_XML_EQUALS);

 	return PROXY_CONTEXT;

 }

-<ST_XML_ATTRIBUTE_VALUE> <{Name} {

+<ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> <{Name} {

 	String tagName = yytext().substring(1);

 	// pushback to just after the opening bracket

 	yypushback(yylength() - 1);

@@ -1588,7 +1621,7 @@
 	 * If this tag can not be nested or we're already searching for an

 	 * attribute name, equals, or value, return immediately.

 	 */

-	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE))) {

+	if (!isNestable(tagName) || (!fStateStack.empty() && (fStateStack.peek() == ST_XML_ATTRIBUTE_NAME || fStateStack.peek() == ST_XML_EQUALS || fStateStack.peek() == ST_XML_ATTRIBUTE_VALUE || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {

 		yybegin(ST_XML_TAG_NAME);

 		return XML_TAG_OPEN;

 	}

@@ -1608,7 +1641,7 @@
 

 // XML & JSP Comments

 

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {CommentStart} {

+<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE, ST_XML_DECLARATION, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {CommentStart} {

 	if(Debug.debugTokenizer)

 		dump("\ncomment start");//$NON-NLS-1$

 	fEmbeddedHint = XML_COMMENT_TEXT;

@@ -1680,7 +1713,7 @@
 	}

 	else {

 		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspScriptletStart");//$NON-NLS-1$

 		}

 		if(Debug.debugTokenizer)

 			dump("JSP scriptlet start");//$NON-NLS-1$

@@ -1711,6 +1744,11 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 		}

+        else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {

+            fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

+            fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

+        }

+		

 		return PROXY_CONTEXT;

 	}

 }

@@ -1749,7 +1787,7 @@
 	}

 	else {

 		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspExpressionStart");//$NON-NLS-1$

 		}

 		if(Debug.debugTokenizer)

 			dump("JSP expression start");//$NON-NLS-1$

@@ -1780,6 +1818,11 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 		}

+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {

+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

+		}

+		

 		return PROXY_CONTEXT;

 	}

 }

@@ -1818,7 +1861,7 @@
 	}

 	else {

 		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDeclarationStart");//$NON-NLS-1$

 		}

 		if(Debug.debugTokenizer)

 			dump("JSP declaration start");//$NON-NLS-1$

@@ -1849,6 +1892,10 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 		}

+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {

+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

+		}

 		return PROXY_CONTEXT;

 	}

 }

@@ -1893,7 +1940,7 @@
 	}

 	else {

 		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspCommentStart");//$NON-NLS-1$

 		}

 		if(Debug.debugTokenizer)

 			dump("JSP comment start");//$NON-NLS-1$

@@ -1930,6 +1977,10 @@
 			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 		}

+		else if(yystate() == ST_JSP_ATTRIBUTE_VALUE) {

+			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

+			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

+		}

 		return PROXY_CONTEXT;

 	}

 }

@@ -1977,7 +2028,7 @@
 	}

 	else {

 		if (Debug.debugTokenizer) {

-			System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDirectiveStart");//$NON-NLS-1$

 		}

 		if(Debug.debugTokenizer)

 			dump("JSP declaration start");//$NON-NLS-1$

@@ -2064,9 +2115,9 @@
 <ST_XML_ATTRIBUTE_VALUE_DQUOTED> \x24\x7b {

 	int enterState = yystate();

 	yybegin(ST_JSP_DQUOTED_EL);

-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});

+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});

 	// abort early when an unescaped double quote is found in the EL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

 		yybegin(ST_ABORT_EMBEDDED);

 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 	}

@@ -2078,9 +2129,9 @@
 <ST_XML_ATTRIBUTE_VALUE_DQUOTED> \x23\x7b {

 	int enterState = yystate();

 	yybegin(ST_JSP_DQUOTED_VBL);

-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE});

+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, JSP_TAG_ATTRIBUTE_VALUE_DQUOTE});

 	// abort early when an unescaped double quote is found in the VBL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_DQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {

 		yybegin(ST_ABORT_EMBEDDED);

 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 	}

@@ -2092,9 +2143,9 @@
 <ST_XML_ATTRIBUTE_VALUE_SQUOTED> \x24\x7b {

 	int enterState = yystate();

 	yybegin(ST_JSP_SQUOTED_EL);

-	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});

+	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});

 	// abort early when an unescaped single quote is found in the EL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

 		yybegin(ST_ABORT_EMBEDDED);

 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 	}

@@ -2106,9 +2157,9 @@
 <ST_XML_ATTRIBUTE_VALUE_SQUOTED> \x23\x7b {

 	int enterState = yystate();

 	yybegin(ST_JSP_SQUOTED_VBL);

-	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE});

+	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, JSP_TAG_ATTRIBUTE_VALUE_SQUOTE});

 	// abort early when an unescaped single quote is found in the VBL

-	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

+	if(fEmbeddedContainer.getLastRegion().getType().equals(XML_TAG_ATTRIBUTE_VALUE_SQUOTE) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {

 		yybegin(ST_ABORT_EMBEDDED);

 		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

 	}

@@ -2120,11 +2171,11 @@
 

 // unescaped double quote, return as ending region

 <ST_JSP_DQUOTED_EL,ST_JSP_DQUOTED_VBL> ["] {

-	return XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;

 }

 // unescaped single quote, return as ending region

 <ST_JSP_SQUOTED_EL,ST_JSP_SQUOTED_VBL> ['] {

-	return XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

+	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;

 }

 

 

@@ -2304,9 +2355,9 @@
 	return JSP_VBL_CONTENT;

 }

 // EL unquoted in tag (section 2.1 declares it as valid in template text (XML_CONTENT) or attribute values

-<ST_XML_ATTRIBUTE_VALUE> \x24\x7b[^\x7d]+/\x7d {

+<ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> \x24\x7b[^\x7d]+/\x7d {

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$

 	}

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

@@ -2325,9 +2376,9 @@
 	return PROXY_CONTEXT;

 }

 // VBL unquoted in tag or attribute values

-<ST_XML_ATTRIBUTE_VALUE> \x23\x7b[^\x7d]+/\x7d {

+<ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> \x23\x7b[^\x7d]+/\x7d {

 	if (Debug.debugTokenizer) {

-		System.out.println("begin embedded region: " + fEmbeddedHint);//$NON-NLS-1$

+		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$

 	}

 	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

@@ -2525,7 +2576,7 @@
 

 // XML declarations

 

-<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE> {genericTagOpen}! {

+<YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_ATTRIBUTE_VALUE, ST_JSP_ATTRIBUTE_VALUE> {genericTagOpen}! {

 	fStateStack.push(yystate());

 	if(Debug.debugTokenizer)

 		dump("\ndeclaration start");//$NON-NLS-1$

diff --git a/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html b/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
index f1da945..9607f1e 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
+++ b/features/org.eclipse.wst.xml_core.feature.patch/buildnotes_org.eclipse.wst.xml_core.feature.patch.html
@@ -22,6 +22,9 @@
 <p>Bug <a
 	href='https://bugs.eclipse.org/bugs/show_bug.cgi?id=250030'>250030</a>.
 Ignoring problems caused by missing start and end tags</p>
+<p>Bug <a
+	href='https://bugs.eclipse.org/bugs/show_bug.cgi?id=262637'>262637</a>.
+JSP quote escaping as per JSP rules in tag attributes are reported as ERRORS.</p>
 
 </body>
 </head>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.xml_core.feature.patch/feature.properties b/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
index 0f55025..0c6d760 100644
--- a/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
+++ b/features/org.eclipse.wst.xml_core.feature.patch/feature.properties
@@ -29,7 +29,8 @@
 Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=165215 Unable to load ValidateEditHeadlessContext class \n\
 Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=234781 Fixes needed for JSP validation and other minor updates\n\
 Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=250030 Ignoring problems caused by missing start and end tags\n\
-Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=235445 CatalogWriter.write() does not closing the outputstream\n\ 
+Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=235445 CatalogWriter.write() does not closing the outputstream\n\
+Bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=262637 JSP quote escaping as per JSP rules in tag attributes are reported as ERRORS.\n\ 
 # "copyright" property - text of the "Feature Update Copyright"
 copyright=\
 Copyright (c) 2008 IBM Corporation and others.\n\