/* The following code was generated by JFlex 1.2.2 on 8/20/09 11:25 AM */

/*******************************************************************************
 * 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
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Frits Jalvingh - contributions for bug 150794
 *******************************************************************************/

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

import java.io.CharArrayReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.parser.ContextRegionContainer;
import org.eclipse.wst.xml.core.internal.parser.IntStack;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 8/20/09 11:25 AM from the specification file
 * <tt>file:/D:/dev/workspaces/wtp3.2_review/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
 */
public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {

  /** this character denotes the end of file */
  final public static int YYEOF = -1;

  /** lexical states */
  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 = 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 = 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 = 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 = 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;
  final public static int ST_JSP_DIRECTIVE_ATTRIBUTE_NAME = 19;
  final public static int ST_JSP_CONTENT = 16;
  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 31;
  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 = 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;
  final public static int ST_CDATA_TEXT = 1;
  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 = 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 = 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;
  final public static int ST_JSP_COMMENT = 38;
  final public static int ST_PI_CONTENT = 7;
  final public static int ST_BLOCK_TAG_INTERNAL_SCAN = 37;
  final public static int ST_PI = 5;
  final public static int ST_XML_DECLARATION = 26;
  final public static int ST_JSP_DIRECTIVE_NAME = 17;
  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\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
   */
  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);

  /** 
   * Translates a state to a row index in the transition table
   */
  final private static int yy_rowMap [] = { 
        0,    71,   142,   213,   284,   355,   426,   497,   568,   639, 
      710,   781,   852,   923,   994,  1065,  1136,  1207,  1278,  1349, 
     1420,  1491,  1562,  1633,  1704,  1775,  1846,  1917,  1988,  2059, 
     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,  4544,  4615,  4544,  4615,  4686,  4544, 
     4544,  4615,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  5254, 
     4544,  4615,  5325,  5396,  5467,  4544,  5538,  5538,  5609,  5680, 
     5751,  5325,  4544,  5822,  5893,  4544,  5964,  6035,  6106,  6177, 
     4544,  4615,  6248,  6319,  6390,  6461,  6532,  6603,  4544,  6674, 
     6674,  6745,  6816,  6887,  6958,  7029,  4544,  7100,  7171,  7242, 
     7313,  7384,  7455,  4544,  7526,  7597,  7668,  7739,  7810,  7881, 
     7952,  8023,  4544,  8094,  8165,  8236,  8307,  8378,  8449,  8520, 
     8591,  8591,  8662,  8733,  8804,  8875,  8875,  8946,  9017,  9088, 
     9159,  9159,  9230,  9301,  9372,  9443,  4544,  9514,  9514,  9585, 
     9656,  9727,  9798,  4544,  4544,  4615,  4544,  4615,  9869,  9940, 
     7597, 10011, 10082, 10153, 10224, 10295, 10366, 10437, 10508,  4544, 
    10579, 10650, 10721, 10792,  4544, 10863, 10934, 11005, 11076,  4544, 
     4544, 11147,  4544, 11218, 11289, 11218, 11360, 11431, 11360,  4544, 
     4544, 11502, 11573,  4544, 11644,  4544, 11715, 11786, 11857, 11928, 
    11999,  4544,  4544, 12070,  4544, 12141, 12212, 12141, 12283, 12354, 
    12283,  4544,  4544, 12425, 12496, 12567,  4544, 12638, 12709, 12780, 
     4544,  4544, 12851, 12922, 12993, 13064, 13135,  4544, 13206, 13277, 
    13348, 13419, 13490, 13561, 13632, 13703, 13774,  4544, 13845, 13916, 
    13987,  4544,  4544,  5538,  5680,  4544, 14058, 14129,  5751, 14200, 
    14271,  5822,  5964,  6035, 14342,  6106,  4544, 14413, 14484, 14555, 
     6177, 14626, 14697,  4544, 12922,  4544,  6674,  6745,  4544, 14768, 
    14839,  6816, 14910, 14981,  4544, 15052, 15123,  7526, 15194,  7739, 
     4544, 15265, 15336,  7810, 15407, 15478, 15549, 15620, 15691, 15762, 
    15833,  8307,  4544, 15904, 15975,  8591,  8662,  4544, 16046, 16117, 
    16188, 16259, 16330, 16401, 16472,  8804,  8591,  8875,  8946,  4544, 
     9017,  9088,  8875,  9159,  9230,  4544, 16543, 16614, 16685, 16756, 
    16827, 16898, 16969, 17040, 17111,  9514,  9585,  4544, 17182, 17253, 
    17324, 17395, 17466, 17537, 17608, 17679, 17750, 17821,  9940, 10082, 
     4544, 17892, 17963, 10153, 18034, 18105, 18176, 18247,  4544, 18318, 
     4544,  4544,  4544,  4544, 18389, 18460, 18531, 18602, 11218,  4544, 
    18673, 18744, 11360,  4544, 18815, 18886, 18957, 19028, 19099, 19170, 
    19241, 19312, 19383, 11928, 12141,  4544, 19454, 19525, 12283,  4544, 
    19596, 19667, 19738, 19809, 19880, 19951, 20022, 20093, 20164,  4544, 
     4544,  4544, 20235, 20306, 20377, 20448, 20519,  4544, 20590, 20661, 
     4544,  4544,  4544,  4544,  4544,  4970, 20732, 20803, 20874, 20945, 
    21016, 21087, 21158, 21229, 21300, 21371, 21442, 21513, 21584, 21655, 
    21726, 21797, 21868, 21797, 21939, 22010, 21939, 22081, 22152, 22223, 
    22294, 22365, 22436, 22507, 22578, 22578, 22649, 22720, 22791, 22862, 
    22862, 22933, 23004,  9372,  9372,  9372, 23075, 23146, 23217, 23288, 
    23288, 23359, 23430,  9727,  9727,  9727, 23501, 23572, 10082, 23643, 
    10153, 23714, 23785, 23785, 23856, 23856, 18531, 23927, 11005, 11005, 
    11005, 23998, 24069, 11218, 11218, 11218, 24140, 24211, 11360, 11360, 
    11360, 24282, 24353, 11502, 11502, 11502, 19099, 24424, 24495, 11715, 
    11715, 11715, 19312, 24566, 24637, 11928, 11928, 11928, 24708, 12141, 
    12141, 12141, 24779, 24850, 12283, 12283, 12283, 24921, 24992, 12425, 
    12425, 12425, 19880, 25063, 25134, 12638, 12638, 12638, 20093, 25205, 
     4544,  4544, 25276, 25347,  4544, 25418, 25489, 25560, 25631, 25702, 
    25773,  7526,  4544,  4544, 25844, 25915, 25986, 26057, 26128, 16330, 
    16827,  9372, 26199, 17466,  9727, 26270,  4544,  9940, 11005, 11218, 
    26341, 11360, 26412, 11502, 26483,  4544, 11715, 26554, 11928, 12141, 
    26625, 12283, 26696, 12425, 26767,  4544, 12638, 26838, 26909, 26980, 
    27051, 27122, 27193, 27264, 27335, 27406, 27477, 27548, 27619, 27690, 
    27761, 27832, 27903, 27974, 28045, 28116, 28187, 28258, 28329, 28400, 
     4970, 28471, 28542, 28613, 28684, 28755,  4544,  4544, 28826, 28897, 
    28968, 29039, 19099, 19312, 29110, 29181, 19880, 20093, 29252, 29323, 
    29394, 29465,  4544,  4544,  4544, 29536, 29607, 29678, 29749, 29820, 
    29891, 29962, 30033,  7242, 30104, 30175, 30246, 30317, 30388, 30459, 
    30530,  4544, 30601, 30672,  9372,  9727, 11218, 11360, 12141, 12283, 
    30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240,  4970, 31311, 
    31382, 31453, 31524, 31595, 31666, 31737, 31808, 31879, 31950, 32021, 
    32092, 32163, 32234, 32305, 32376, 32447, 32518, 32589, 32660, 32731, 
    32802, 32873, 32944, 33015, 33086, 33157, 33228, 33299, 33370, 33441, 
    33512, 33583, 33654, 33725, 33796,  4544, 33867, 33938, 34009, 34080, 
     7242, 34151, 34222, 34293, 34364, 34435, 34506, 34577, 34648, 34719, 
    34790, 34861, 34932, 35003, 35074
  };

  /** 
   * The packed transition table of the DFA
   */
  final private static String yy_packed = 
    "\1\72\1\73\11\72\1\74\1\72\1\75\1\72\1\76"+
    "\3\72\1\77\42\72\1\100\20\72\1\101\1\102\105\101"+
    "\1\103\1\104\22\103\1\105\2\103\1\106\57\103\1\107"+
    "\1\110\105\107\1\103\1\104\5\103\1\111\17\103\1\106"+
    "\60\103\1\104\2\103\1\112\1\113\2\103\2\114\6\103"+
    "\1\113\6\103\1\113\1\115\1\116\4\114\1\103\10\114"+
    "\1\117\2\114\1\103\11\114\1\117\1\114\1\103\4\114"+
    "\1\103\4\114\1\103\4\114\1\103\1\114\1\103\1\104"+
    "\2\103\1\112\1\120\12\103\1\120\6\103\1\120\57\103"+
    "\1\121\1\122\2\121\1\123\22\121\1\106\57\121\1\103"+
    "\1\104\2\103\1\124\1\113\2\103\2\125\6\103\1\113"+
    "\6\103\1\113\6\125\1\103\13\125\1\103\13\125\1\103"+
    "\4\125\1\103\4\125\1\103\4\125\1\103\1\125\1\103"+
    "\1\104\2\103\1\124\1\113\2\103\2\125\6\103\1\113"+
    "\6\103\1\113\6\125\1\103\13\125\1\126\13\125\1\103"+
    "\4\125\1\103\4\125\1\103\4\125\1\103\1\125\1\127"+
    "\1\104\1\103\1\130\1\131\1\113\4\127\1\132\1\127"+
    "\1\133\3\127\1\113\6\127\1\113\57\127\1\103\1\104"+
    "\2\103\1\134\22\103\1\106\60\103\1\104\1\135\1\136"+
    "\1\103\1\113\2\103\2\137\6\103\1\113\6\103\1\113"+
    "\6\137\1\103\13\137\1\103\13\137\1\103\4\137\1\103"+
    "\4\137\1\103\4\137\1\103\1\137\1\103\1\104\1\135"+
    "\1\136\1\103\1\113\2\103\2\137\6\103\1\113\6\103"+
    "\1\113\6\137\1\103\13\137\1\140\13\137\1\103\4\137"+
    "\1\103\4\137\1\103\4\137\1\103\1\137\1\141\1\104"+
    "\1\135\1\142\1\141\1\113\4\141\1\143\1\141\1\144"+
    "\3\141\1\113\6\141\1\113\57\141\1\103\1\104\3\103"+
    "\1\113\12\103\1\113\6\103\1\113\57\103\1\145\1\146"+
    "\21\145\1\147\63\145\1\103\1\150\3\103\1\113\2\103"+
    "\2\151\6\103\1\113\2\103\1\152\3\103\1\113\6\151"+
    "\1\103\13\151\1\103\13\151\1\103\4\151\1\103\4\151"+
    "\1\103\4\151\1\103\1\151\1\103\1\150\3\103\1\153"+
    "\12\103\1\153\2\103\1\152\3\103\1\153\60\103\1\150"+
    "\3\103\1\113\2\103\2\154\6\103\1\113\2\103\1\152"+
    "\3\103\1\113\6\154\1\103\13\154\1\103\13\154\1\103"+
    "\4\154\1\103\4\154\1\103\4\154\1\103\1\154\1\103"+
    "\1\150\3\103\1\113\2\103\2\154\6\103\1\113\2\103"+
    "\1\152\3\103\1\113\6\154\1\103\13\154\1\155\13\154"+
    "\1\103\4\154\1\103\4\154\1\103\4\154\1\103\1\154"+
    "\1\156\1\150\1\103\1\157\1\156\1\113\4\156\1\160"+
    "\1\156\1\161\3\156\1\113\2\156\1\162\3\156\1\113"+
    "\57\156\1\163\1\164\1\165\1\166\4\163\2\167\16\163"+
    "\6\170\1\163\13\170\1\163\13\170\1\163\4\170\1\163"+
    "\4\170\1\163\1\171\3\170\1\163\1\170\1\103\1\172"+
    "\1\165\1\166\1\103\1\113\2\103\2\173\6\103\1\113"+
    "\6\103\1\113\6\173\1\103\13\173\1\103\13\173\1\103"+
    "\4\173\1\103\4\173\1\103\4\173\1\103\1\173\1\103"+
    "\1\172\1\165\1\166\1\103\1\113\2\103\2\173\6\103"+
    "\1\113\6\103\1\113\6\173\1\103\13\173\1\174\13\173"+
    "\1\103\4\173\1\103\4\173\1\103\4\173\1\103\1\173"+
    "\1\175\1\176\1\165\1\177\1\175\1\113\4\175\1\200"+
    "\1\175\1\201\1\202\2\175\1\113\6\175\1\113\36\175"+
    "\1\203\20\175\1\103\1\204\1\205\2\103\1\113\12\103"+
    "\1\113\6\103\1\113\10\103\1\206\1\207\2\103\1\210"+
    "\11\103\1\210\1\103\1\207\1\206\26\103\1\104\1\205"+
    "\2\103\1\113\12\103\1\113\6\103\1\113\6\103\1\211"+
    "\51\103\1\104\1\205\2\103\1\113\2\103\2\212\6\103"+
    "\1\113\6\103\1\113\6\212\1\211\13\212\1\103\13\212"+
    "\1\103\4\212\1\103\4\212\1\103\4\212\1\103\1\212"+
    "\1\103\1\104\1\205\2\103\1\113\12\103\1\113\6\103"+
    "\1\113\6\103\1\211\7\103\1\213\6\103\1\214\11\103"+
    "\1\213\12\103\1\214\4\103\1\215\1\104\1\205\1\216"+
    "\1\215\1\113\4\215\1\217\1\215\1\220\3\215\1\113"+
    "\6\215\1\113\6\215\1\221\50\215\1\222\1\104\1\205"+
    "\1\223\1\222\1\113\4\222\1\224\1\222\1\225\3\222"+
    "\1\113\6\222\1\113\6\222\1\226\50\222\1\227\1\104"+
    "\1\205\1\230\1\227\1\113\4\227\1\231\1\227\1\232"+
    "\3\227\1\113\6\227\1\113\57\227\1\233\1\234\1\235"+
    "\104\233\1\236\1\104\1\205\1\237\1\236\1\113\4\236"+
    "\1\240\1\236\1\241\3\236\1\113\6\236\1\113\57\236"+
    "\1\242\1\243\1\244\104\242\1\245\1\246\105\245\1\103"+
    "\1\104\25\103\1\106\57\103\1\247\1\250\105\247\1\103"+
    "\1\104\5\103\1\251\17\103\1\106\57\103\1\252\1\253"+
    "\1\165\1\254\1\252\1\113\4\252\1\255\1\252\1\256"+
    "\1\257\2\252\1\113\6\252\1\113\36\252\1\260\20\252"+
    "\1\261\1\262\3\261\1\263\6\261\1\264\1\265\2\261"+
    "\1\263\6\261\1\263\36\261\1\266\20\261\1\267\1\262"+
    "\3\267\1\270\4\267\1\271\2\267\1\272\2\267\1\270"+
    "\6\267\1\270\36\267\1\273\20\267\1\274\1\275\10\274"+
    "\1\276\1\274\1\277\1\300\67\274\1\301\1\274\1\302"+
    "\1\303\12\302\1\103\12\302\1\304\57\302\1\305\1\306"+
    "\10\305\1\103\14\305\1\307\57\305\1\103\1\104\12\103"+
    "\1\310\12\103\1\106\60\103\1\104\10\103\1\311\14\103"+
    "\1\106\57\103\1\312\1\313\10\312\1\314\4\312\1\315"+
    "\65\312\1\316\1\312\1\317\1\320\12\317\1\264\2\317"+
    "\1\321\65\317\1\316\1\317\1\322\1\323\10\322\1\324"+
    "\1\322\1\325\51\322\1\326\16\322\1\327\1\322\1\330"+
    "\1\331\12\330\1\103\12\330\1\332\57\330\1\333\1\334"+
    "\10\333\1\103\14\333\1\335\57\333\1\103\1\104\12\103"+
    "\1\336\12\103\1\106\60\103\1\104\10\103\1\337\14\103"+
    "\1\106\57\103\1\340\1\341\10\340\1\314\4\340\1\342"+
    "\65\340\1\343\1\340\1\344\1\345\12\344\1\264\2\344"+
    "\1\346\65\344\1\343\1\344\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\347\1\350\16\0\1\351\2\0\1\352\65\0\1\353"+
    "\2\0\2\354\6\0\1\353\6\0\1\353\6\354\1\0"+
    "\13\354\1\0\13\354\1\355\4\354\1\0\4\354\1\0"+
    "\4\354\1\0\1\354\1\356\1\0\11\356\1\0\1\356"+
    "\1\357\1\360\4\356\1\0\63\356\1\72\1\0\11\72"+
    "\1\0\1\72\1\361\5\72\1\0\42\72\1\361\20\72"+
    "\5\0\1\353\2\0\2\362\6\0\1\353\6\0\1\353"+
    "\6\362\1\0\13\362\1\0\13\362\1\0\4\362\1\0"+
    "\4\362\1\0\4\362\1\0\1\362\1\356\1\0\11\356"+
    "\1\0\2\356\1\363\4\356\1\0\42\356\1\364\20\356"+
    "\132\0\1\351\2\0\1\365\104\0\1\366\71\0\1\367"+
    "\101\0\1\370\111\0\1\113\12\0\1\113\6\0\1\113"+
    "\65\0\4\114\7\0\1\114\6\0\6\114\1\0\13\114"+
    "\1\0\13\114\1\0\4\114\1\0\11\114\1\0\1\114"+
    "\6\0\4\114\7\0\1\114\6\0\2\114\2\371\2\114"+
    "\1\0\13\114\1\0\13\114\1\0\4\114\1\0\11\114"+
    "\1\0\1\114\6\0\4\114\7\0\1\114\6\0\2\114"+
    "\1\371\1\372\2\114\1\0\13\114\1\0\13\114\1\0"+
    "\4\114\1\0\11\114\1\0\1\114\6\0\4\114\7\0"+
    "\1\114\6\0\2\114\2\373\2\114\1\0\13\114\1\0"+
    "\13\114\1\0\4\114\1\0\11\114\1\0\1\114\5\0"+
    "\1\120\12\0\1\120\6\0\1\120\61\0\1\374\106\0"+
    "\1\375\112\0\4\125\7\0\1\125\6\0\6\125\1\0"+
    "\13\125\1\0\13\125\1\0\4\125\1\0\11\125\1\0"+
    "\1\125\1\127\2\0\1\376\1\127\1\0\4\127\1\0"+
    "\1\127\1\0\3\127\1\0\6\127\1\0\60\127\1\0"+
    "\1\375\1\376\1\127\1\0\4\127\1\0\1\127\1\0"+
    "\3\127\1\0\6\127\1\0\57\127\1\377\1\0\10\377"+
    "\1\u0100\2\377\1\u0101\1\377\1\u0102\46\377\1\u0101\20\377"+
    "\1\u0103\1\0\12\u0103\1\u0100\1\u0104\1\u0103\1\u0105\46\u0103"+
    "\1\u0104\20\u0103\2\0\1\135\1\u0106\111\0\4\137\7\0"+
    "\1\137\6\0\6\137\1\0\13\137\1\0\13\137\1\0"+
    "\4\137\1\0\11\137\1\0\1\137\1\141\2\0\1\u0107"+
    "\1\141\1\0\4\141\1\0\1\141\1\0\3\141\1\0"+
    "\6\141\1\0\60\141\1\0\1\135\1\u0108\1\141\1\0"+
    "\4\141\1\0\1\141\1\0\3\141\1\0\6\141\1\0"+
    "\57\141\1\143\1\0\1\u0109\1\u010a\1\143\1\u0109\4\143"+
    "\1\u010b\1\143\1\u0109\1\u010c\1\143\1\u010d\1\u0109\6\143"+
    "\1\u0109\36\143\1\u010c\20\143\1\144\1\0\1\u010e\1\u010f"+
    "\1\144\1\u010e\4\144\1\u010e\1\144\1\u010b\1\u0110\1\144"+
    "\1\u0111\1\u010e\6\144\1\u010e\36\144\1\u0110\20\144\2\0"+
    "\1\u0112\127\0\1\351\2\0\1\u0113\66\0\4\151\7\0"+
    "\1\151\6\0\6\151\1\0\13\151\1\0\13\151\1\0"+
    "\4\151\1\0\11\151\1\0\1\151\2\0\1\u0114\111\0"+
    "\1\153\12\0\1\153\6\0\1\153\65\0\4\154\7\0"+
    "\1\154\6\0\6\154\1\0\13\154\1\0\13\154\1\0"+
    "\4\154\1\0\11\154\1\0\1\154\1\156\2\0\1\u0115"+
    "\1\156\1\0\4\156\1\0\1\156\1\0\3\156\1\0"+
    "\6\156\1\0\57\156\1\u0116\1\0\10\u0116\1\u0117\2\u0116"+
    "\1\u0118\1\u0116\1\u0119\46\u0116\1\u0118\20\u0116\1\u011a\1\0"+
    "\12\u011a\1\u0117\1\u011b\1\u011a\1\u011c\46\u011a\1\u011b\20\u011a"+
    "\1\156\1\0\1\u0114\1\u0115\1\156\1\0\4\156\1\0"+
    "\1\156\1\0\3\156\1\0\6\156\1\0\57\156\1\163"+
    "\3\0\24\163\6\0\1\163\13\0\1\163\13\0\1\163"+
    "\4\0\1\163\4\0\1\163\4\0\1\163\4\0\1\347"+
    "\17\0\1\351\2\0\1\352\62\0\1\u011d\104\0\1\163"+
    "\3\0\2\163\4\167\7\163\1\167\6\163\6\170\1\163"+
    "\13\170\1\163\13\170\1\163\4\170\1\163\4\170\1\167"+
    "\4\170\1\163\1\170\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\7\170\1\u011e\3\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\3\0\1\347\4\0"+
    "\2\u011f\11\0\1\351\2\0\1\352\1\0\6\u011f\1\0"+
    "\13\u011f\1\0\13\u011f\1\0\4\u011f\1\0\4\u011f\1\0"+
    "\4\u011f\1\0\1\u011f\6\0\4\173\7\0\1\173\6\0"+
    "\6\173\1\0\13\173\1\0\13\173\1\0\4\173\1\0"+
    "\11\173\1\0\1\173\1\175\2\0\1\u0120\1\175\1\0"+
    "\4\175\1\0\1\175\1\0\3\175\1\0\6\175\1\0"+
    "\57\175\3\0\1\347\4\0\2\u0121\11\0\1\351\2\0"+
    "\1\352\1\0\6\u0121\1\0\13\u0121\1\0\13\u0121\1\0"+
    "\4\u0121\1\0\4\u0121\1\0\4\u0121\1\0\1\u0121\1\175"+
    "\1\0\1\u011d\1\u0120\1\175\1\0\4\175\1\0\1\175"+
    "\1\0\3\175\1\0\6\175\1\0\57\175\1\u0122\1\0"+
    "\10\u0122\1\u0123\2\u0122\1\u0124\1\u0122\1\u0125\46\u0122\1\u0124"+
    "\20\u0122\1\u0126\1\0\12\u0126\1\u0123\1\u0127\1\u0126\1\u0128"+
    "\46\u0126\1\u0127\20\u0126\1\175\2\0\1\u0120\1\175\1\0"+
    "\4\175\1\0\1\175\1\0\1\175\1\u0129\1\175\1\0"+
    "\6\175\1\0\60\175\2\0\1\u0120\1\175\1\0\4\175"+
    "\1\0\1\175\1\0\1\175\1\u012a\1\175\1\0\6\175"+
    "\1\0\57\175\3\0\1\347\17\0\1\351\2\0\1\u0113"+
    "\130\0\1\u012b\2\0\1\u012b\75\0\1\u012c\14\0\1\u012c"+
    "\63\0\2\u012d\51\0\24\u012e\1\u012f\62\u012e\6\0\4\212"+
    "\7\0\1\212\6\0\6\212\1\0\13\212\1\0\13\212"+
    "\1\0\4\212\1\0\11\212\1\0\1\212\54\0\1\u0130"+
    "\5\0\1\u0130\116\0\1\u0131\10\0\1\u0131\3\0\1\215"+
    "\2\0\1\u0132\1\215\1\0\4\215\1\0\1\215\1\0"+
    "\3\215\1\0\6\215\1\0\57\215\1\u0133\1\0\10\u0133"+
    "\1\u0134\2\u0133\1\u0135\1\u0133\1\u0136\46\u0133\1\u0135\20\u0133"+
    "\1\u0137\1\0\1\u0137\2\u0138\1\u0137\4\u0138\2\u0137\1\u0139"+
    "\1\u013a\1\u0137\1\u013b\4\u0138\1\u0137\11\u0138\1\u0137\27\u0138"+
    "\1\u013a\10\u0138\2\u0137\4\u0138\1\u0137\1\u0138\1\221\2\u012e"+
    "\1\u013c\1\221\1\u012e\4\221\1\u012e\1\221\1\u012e\3\221"+
    "\1\u012e\3\221\1\u013d\2\221\1\u012e\57\221\1\222\2\0"+
    "\1\u013e\1\222\1\0\4\222\1\0\1\222\1\0\3\222"+
    "\1\0\6\222\1\0\57\222\12\u013f\1\u0140\74\u013f\14\u0141"+
    "\1\u0140\72\u0141\1\226\2\u012e\1\u0142\1\226\1\u012e\4\226"+
    "\1\u012e\1\226\1\u012e\3\226\1\u012e\3\226\1\u0143\2\226"+
    "\1\u012e\57\226\1\227\2\0\1\u0144\1\227\1\0\4\227"+
    "\1\0\1\227\1\0\3\227\1\0\6\227\1\0\57\227"+
    "\1\u0145\1\0\10\u0145\1\u0146\2\u0145\1\u0147\1\u0145\1\u0148"+
    "\46\u0145\1\u0147\20\u0145\1\u0149\1\0\1\u0149\2\u014a\1\u0149"+
    "\4\u014a\2\u0149\1\u014b\1\u014c\1\u0149\1\u014d\4\u014a\1\u0149"+
    "\11\u014a\1\u0149\27\u014a\1\u014c\10\u014a\2\u0149\4\u014a\1\u0149"+
    "\1\u014a\2\233\1\0\106\233\1\0\20\233\1\u014e\2\233"+
    "\1\u014f\60\233\1\236\2\0\1\u0150\1\236\1\0\4\236"+
    "\1\0\1\236\1\0\3\236\1\0\6\236\1\0\57\236"+
    "\1\u0151\1\0\10\u0151\1\u0152\2\u0151\1\u0153\1\u0151\1\u0154"+
    "\46\u0151\1\u0153\20\u0151\1\u0155\1\0\1\u0155\2\u0156\1\u0155"+
    "\4\u0156\2\u0155\1\u0157\1\u0158\1\u0155\1\u0159\4\u0156\1\u0155"+
    "\11\u0156\1\u0155\27\u0156\1\u0158\10\u0156\2\u0155\4\u0156\1\u0155"+
    "\1\u0156\2\242\1\0\106\242\1\0\20\242\1\u015a\2\242"+
    "\1\u015b\60\242\7\0\1\u015c\77\0\1\252\2\0\1\u015d"+
    "\1\252\1\0\4\252\1\0\1\252\1\0\3\252\1\0"+
    "\6\252\1\0\60\252\1\0\1\u011d\1\u015d\1\252\1\0"+
    "\4\252\1\0\1\252\1\0\3\252\1\0\6\252\1\0"+
    "\57\252\1\u015e\1\0\10\u015e\1\u015f\2\u015e\1\u0160\1\u015e"+
    "\1\u0161\46\u015e\1\u0160\20\u015e\1\u0162\1\0\12\u0162\1\u015f"+
    "\1\u0163\1\u0162\1\u0164\46\u0162\1\u0163\20\u0162\1\252\2\0"+
    "\1\u015d\1\252\1\0\4\252\1\0\1\252\1\0\1\252"+
    "\1\u0165\1\252\1\0\6\252\1\0\60\252\2\0\1\u015d"+
    "\1\252\1\0\4\252\1\0\1\252\1\0\1\252\1\u0166"+
    "\1\252\1\0\6\252\1\0\57\252\1\261\1\0\12\261"+
    "\2\0\50\261\1\0\20\261\3\0\1\u0167\17\0\1\351"+
    "\2\0\1\365\60\0\1\261\1\0\3\261\1\263\6\261"+
    "\2\0\2\261\1\263\6\261\1\263\36\261\1\0\20\261"+
    "\5\0\1\u0168\10\0\1\u0169\1\0\1\u0168\6\0\1\u0168"+
    "\64\0\1\u0168\10\0\1\u016a\1\0\1\u0168\6\0\1\u0168"+
    "\57\0\1\267\1\0\10\267\1\0\2\267\1\0\50\267"+
    "\1\0\21\267\1\0\3\267\1\270\4\267\1\0\2\267"+
    "\1\0\2\267\1\270\6\267\1\270\36\267\1\0\20\267"+
    "\5\0\1\u0168\10\0\1\u016b\1\0\1\u0168\6\0\1\u0168"+
    "\64\0\1\u0168\10\0\1\u016c\1\0\1\u0168\6\0\1\u0168"+
    "\57\0\12\274\1\0\1\274\1\0\1\u016d\67\274\1\0"+
    "\13\274\1\0\1\274\1\0\1\u016d\5\274\1\u016e\61\274"+
    "\1\0\13\274\1\0\1\274\1\0\1\274\1\u016f\66\274"+
    "\1\u0170\1\274\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\312\1\0\4\312\1\u0179"+
    "\65\312\1\0\13\312\1\0\4\312\1\u0179\3\312\1\u017a"+
    "\61\312\1\0\13\312\1\u017b\74\312\14\317\1\0\2\317"+
    "\1\u017c\65\317\1\0\15\317\1\0\2\317\1\u017c\3\317"+
    "\1\u017d\61\317\1\0\15\317\1\u017e\72\317\12\322\1\0"+
    "\1\322\1\0\70\322\1\0\13\322\1\0\1\322\1\0"+
    "\6\322\1\u017f\61\322\1\0\13\322\1\0\1\322\1\0"+
    "\1\322\1\u0180\66\322\1\0\1\322\14\u0181\1\u0182\106\u0181"+
    "\1\u0182\6\u0181\1\u0183\2\u0181\1\u0184\60\u0181\12\u0185\1\u0186"+
    "\106\u0185\1\u0186\10\u0185\1\u0187\2\u0185\1\u0188\60\u0185\12\340"+
    "\1\0\4\340\1\u0189\65\340\1\0\13\340\1\0\4\340"+
    "\1\u0189\3\340\1\u018a\61\340\1\0\13\340\1\u018b\74\340"+
    "\14\344\1\0\2\344\1\u018c\65\344\1\0\15\344\1\0"+
    "\2\344\1\u018c\3\344\1\u018d\61\344\1\0\15\344\1\u018e"+
    "\72\344\7\0\1\u018f\12\0\1\u0190\3\0\1\u0191\23\0"+
    "\1\u0192\43\0\1\u0193\26\0\1\u0194\55\0\1\353\2\0"+
    "\2\u0195\6\0\1\353\6\0\1\353\6\u0195\1\0\13\u0195"+
    "\1\0\13\u0195\1\0\4\u0195\1\0\4\u0195\1\0\4\u0195"+
    "\1\0\1\u0195\1\u0196\1\0\3\u0196\1\u0197\4\354\1\u0196"+
    "\1\0\4\u0196\1\u0197\1\354\1\u0196\1\0\3\u0196\1\u0197"+
    "\6\354\1\u0196\13\354\1\u0196\13\354\1\u0196\4\354\1\u0198"+
    "\11\354\1\u0196\1\354\21\0\1\u0199\7\0\1\u019a\72\0"+
    "\1\357\71\0\105\360\1\u019b\1\360\16\0\1\356\70\0"+
    "\1\u0196\1\0\3\u0196\1\u0197\4\362\1\u0196\1\0\4\u0196"+
    "\1\u0197\1\362\1\u0196\1\0\3\u0196\1\u0197\6\362\1\u0196"+
    "\13\362\1\u0196\13\362\1\u0196\4\362\1\u019c\11\362\1\u0196"+
    "\1\362\105\363\1\u019d\1\363\66\0\1\364\56\0\1\u0194"+
    "\52\0\1\u019e\106\0\1\u019f\112\0\4\114\7\0\1\114"+
    "\6\0\4\114\2\u01a0\1\0\13\114\1\0\13\114\1\0"+
    "\4\114\1\0\11\114\1\0\1\114\6\0\4\114\7\0"+
    "\1\114\6\0\4\114\1\u01a0\1\u01a1\1\0\13\114\1\0"+
    "\13\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
    "\4\114\7\0\1\114\6\0\6\114\1\0\13\114\1\0"+
    "\2\114\1\u01a2\10\114\1\0\4\114\1\0\6\114\1\u01a2"+
    "\2\114\1\0\1\114\12\377\1\u0100\3\377\1\0\71\377"+
    "\1\0\10\377\1\u0100\2\377\1\u01a3\1\377\1\u0102\46\377"+
    "\1\u01a3\20\377\14\u0103\1\u0100\1\u0103\1\0\71\u0103\1\0"+
    "\12\u0103\1\u0100\1\u01a4\1\u0103\1\u0105\46\u0103\1\u01a4\20\u0103"+
    "\1\u0109\1\0\10\u0109\1\u010b\2\u0109\1\u01a5\1\u0109\1\u01a6"+
    "\46\u0109\1\u01a5\20\u0109\1\143\2\u0109\1\u010a\1\143\1\u0109"+
    "\4\143\1\u010b\1\143\1\u0109\1\143\1\141\1\143\1\u0109"+
    "\6\143\1\u0109\60\143\1\0\1\u0109\1\u010a\1\143\1\u0109"+
    "\4\143\1\u010b\1\143\1\u0109\1\u01a7\1\143\1\u010d\1\u0109"+
    "\6\143\1\u0109\36\143\1\u01a7\20\143\1\u010e\1\0\12\u010e"+
    "\1\u010b\1\u01a8\1\u010e\1\u01a9\46\u010e\1\u01a8\20\u010e\1\144"+
    "\2\u010e\1\u010f\1\144\1\u010e\4\144\1\u010e\1\144\1\u010b"+
    "\1\144\1\141\1\144\1\u010e\6\144\1\u010e\60\144\1\0"+
    "\1\u010e\1\u010f\1\144\1\u010e\4\144\1\u010e\1\144\1\u010b"+
    "\1\u01aa\1\144\1\u0111\1\u010e\6\144\1\u010e\36\144\1\u01aa"+
    "\20\144\12\u0116\1\u0117\3\u0116\1\0\71\u0116\1\0\10\u0116"+
    "\1\u0117\2\u0116\1\u01ab\1\u0116\1\u0119\46\u0116\1\u01ab\20\u0116"+
    "\14\u011a\1\u0117\1\u011a\1\0\71\u011a\1\0\12\u011a\1\u0117"+
    "\1\u01ac\1\u011a\1\u011c\46\u011a\1\u01ac\20\u011a\6\0\4\170"+
    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\13\170"+
    "\1\0\4\170\1\0\6\170\1\u01ad\2\170\1\0\1\170"+
    "\6\0\4\u011f\7\0\1\u011f\6\0\6\u011f\1\0\13\u011f"+
    "\1\0\13\u011f\1\0\4\u011f\1\0\11\u011f\1\0\1\u011f"+
    "\6\0\4\u0121\7\0\1\u0121\6\0\6\u0121\1\0\13\u0121"+
    "\1\0\13\u0121\1\0\4\u0121\1\0\11\u0121\1\0\1\u0121"+
    "\12\u0122\1\u0123\3\u0122\1\0\71\u0122\1\0\10\u0122\1\u0123"+
    "\2\u0122\1\u01ae\1\u0122\1\u0125\46\u0122\1\u01ae\20\u0122\14\u0126"+
    "\1\u0123\1\u0126\1\0\71\u0126\1\0\12\u0126\1\u0123\1\u01af"+
    "\1\u0126\1\u0128\46\u0126\1\u01af\20\u0126\1\u01b0\2\u01b1\1\u01b2"+
    "\1\u01b0\1\u01b1\4\u01b0\1\u01b1\1\u01b0\1\u01b1\3\u01b0\1\u01b1"+
    "\6\u01b0\1\u01b1\55\u01b0\1\175\1\u01b0\1\u01b3\2\u01b4\1\u01b5"+
    "\1\u01b3\1\u01b4\4\u01b3\1\u01b4\1\u01b3\1\u01b4\3\u01b3\1\u01b4"+
    "\6\u01b3\1\u01b4\55\u01b3\1\175\1\u01b3\37\0\1\u01b6\35\0"+
    "\1\u01b6\53\0\1\u01b7\14\0\1\u01b7\73\0\1\u01b8\11\0"+
    "\1\u01b8\76\0\1\u01b9\20\0\1\u01b9\113\0\1\u01ba\7\0"+
    "\1\u01ba\2\0\12\u0133\1\u0134\3\u0133\1\0\71\u0133\1\0"+
    "\10\u0133\1\u0134\2\u0133\1\u01bb\1\u0133\1\u0136\46\u0133\1\u01bb"+
    "\20\u0133\1\u0137\1\0\12\u0137\1\u0134\1\u01bc\1\u0137\1\u013b"+
    "\46\u0137\1\u01bc\21\u0137\1\0\12\u0137\1\u01bd\1\u01bc\1\u0137"+
    "\1\u013b\46\u0137\1\u01bc\20\u0137\14\0\1\u01be\72\0\14\u0137"+
    "\1\u01bd\1\u0137\1\0\71\u0137\1\0\12\u0137\1\u0134\1\u01bf"+
    "\1\u0137\1\u013b\46\u0137\1\u01bf\20\u0137\12\u0145\1\u0146\3\u0145"+
    "\1\0\71\u0145\1\0\10\u0145\1\u0146\2\u0145\1\u01c0\1\u0145"+
    "\1\u0148\46\u0145\1\u01c0\20\u0145\1\u0149\1\0\12\u0149\1\u0146"+
    "\1\u01c1\1\u0149\1\u014d\46\u0149\1\u01c1\21\u0149\1\0\12\u0149"+
    "\1\u01c2\1\u01c1\1\u0149\1\u014d\46\u0149\1\u01c1\20\u0149\14\0"+
    "\1\u01c3\72\0\14\u0149\1\u01c2\1\u0149\1\0\71\u0149\1\0"+
    "\12\u0149\1\u0146\1\u01c4\1\u0149\1\u014d\46\u0149\1\u01c4\20\u0149"+
    "\2\233\1\0\4\233\1\u01c5\12\233\1\u01c6\3\233\1\u01c7"+
    "\23\233\1\u01c8\36\233\1\0\33\233\1\u01c9\50\233\12\u0151"+
    "\1\u0152\3\u0151\1\0\71\u0151\1\0\10\u0151\1\u0152\2\u0151"+
    "\1\u01ca\1\u0151\1\u0154\46\u0151\1\u01ca\20\u0151\1\u0155\1\0"+
    "\12\u0155\1\u0152\1\u01cb\1\u0155\1\u0159\46\u0155\1\u01cb\21\u0155"+
    "\1\0\12\u0155\1\u01cc\1\u01cb\1\u0155\1\u0159\46\u0155\1\u01cb"+
    "\20\u0155\14\0\1\u01cd\72\0\14\u0155\1\u01cc\1\u0155\1\0"+
    "\71\u0155\1\0\12\u0155\1\u0152\1\u01ce\1\u0155\1\u0159\46\u0155"+
    "\1\u01ce\20\u0155\2\242\1\0\4\242\1\u01cf\12\242\1\u01d0"+
    "\3\242\1\u01d1\23\242\1\u01d2\36\242\1\0\33\242\1\u01d3"+
    "\50\242\23\0\1\u01d4\63\0\12\u015e\1\u015f\3\u015e\1\0"+
    "\71\u015e\1\0\10\u015e\1\u01d5\2\u015e\1\u01d6\1\u015e\1\u0161"+
    "\46\u015e\1\u01d6\20\u015e\14\u0162\1\u015f\1\u0162\1\0\71\u0162"+
    "\1\0\12\u0162\1\u01d7\1\u01d8\1\u0162\1\u0164\46\u0162\1\u01d8"+
    "\20\u0162\1\u01d9\2\u01b1\1\u01da\1\u01d9\1\u01b1\4\u01d9\1\u01b1"+
    "\1\u01d9\1\u01b1\3\u01d9\1\u01b1\6\u01d9\1\u01b1\55\u01d9\1\252"+
    "\1\u01d9\1\u01db\2\u01b4\1\u01dc\1\u01db\1\u01b4\4\u01db\1\u01b4"+
    "\1\u01db\1\u01b4\3\u01db\1\u01b4\6\u01db\1\u01b4\55\u01db\1\252"+
    "\1\u01db\5\0\1\u0168\12\0\1\u0168\6\0\1\u0168\57\0"+
    "\12\274\1\0\1\274\1\0\1\274\1\u01dd\66\274\1\u0170"+
    "\10\274\1\u01de\2\274\1\0\1\274\1\0\1\u016d\4\274"+
    "\1\u01df\3\274\1\u01e0\23\274\1\u01e1\32\274\1\0\1\274"+
    "\12\u01dd\1\0\1\u01dd\1\0\70\u01dd\1\0\1\u01dd\12\u0170"+
    "\1\0\1\u0170\1\0\1\u01e2\67\u0170\1\0\1\u0170\7\u0171"+
    "\1\u01e3\4\u0171\1\u0172\5\u0171\1\u01e4\3\u0171\1\u01e5\23\u0171"+
    "\1\u01e6\50\u0171\1\u0172\21\u0171\1\u01e7\50\u0171\7\u0175\1\u01e8"+
    "\2\u0175\1\u0176\7\u0175\1\u01e9\3\u0175\1\u01ea\23\u0175\1\u01eb"+
    "\46\u0175\1\u0176\23\u0175\1\u01ec\50\u0175\12\312\1\0\103\312"+
    "\1\u01ed\2\312\1\0\4\312\1\u0179\2\312\1\u01ee\3\312"+
    "\1\u01ef\23\312\1\u01f0\32\312\1\0\1\312\17\u01f1\1\u01f2"+
    "\67\u01f1\14\317\1\0\101\317\1\u01f3\4\317\1\0\2\317"+
    "\1\u017c\2\317\1\u01f4\3\317\1\u01f5\23\317\1\u01f6\32\317"+
    "\1\0\1\317\17\u01f7\1\u01f8\67\u01f7\7\322\1\u01f9\2\322"+
    "\1\0\1\322\1\0\5\322\1\u01fa\3\322\1\u01fb\23\322"+
    "\1\u01fc\32\322\1\0\1\322\7\u0181\1\u01fd\4\u0181\1\u0182"+
    "\5\u0181\1\u01fe\3\u0181\1\u01ff\23\u0181\1\u0200\50\u0181\1\u0182"+
    "\21\u0181\1\u0201\50\u0181\7\u0185\1\u0202\2\u0185\1\u0186\7\u0185"+
    "\1\u0203\3\u0185\1\u0204\23\u0185\1\u0205\46\u0185\1\u0186\23\u0185"+
    "\1\u0206\50\u0185\12\340\1\0\103\340\1\u0207\2\340\1\0"+
    "\4\340\1\u0189\2\340\1\u0208\3\340\1\u0209\23\340\1\u020a"+
    "\32\340\1\0\1\340\17\u020b\1\u020c\67\u020b\14\344\1\0"+
    "\101\344\1\u020d\4\344\1\0\2\344\1\u018c\2\344\1\u020e"+
    "\3\344\1\u020f\23\344\1\u0210\32\344\1\0\1\344\17\u0211"+
    "\1\u0212\67\u0211\7\0\1\u0213\106\0\1\u0214\136\0\1\u0215"+
    "\47\0\1\u0195\1\0\11\u0195\1\0\7\u0195\1\0\63\u0195"+
    "\1\u0196\1\0\11\u0196\1\0\7\u0196\1\0\47\u0196\1\0"+
    "\14\u0196\1\0\3\u0196\1\u0197\5\u0196\1\0\4\u0196\1\u0197"+
    "\2\u0196\1\0\3\u0196\1\u0197\43\u0196\1\u0216\13\u0196\21\0"+
    "\1\u0199\51\0\1\u0217\34\0\1\u0218\15\0\3\u0218\2\0"+
    "\1\u0218\11\0\1\u0218\1\0\2\u0218\7\0\1\u0218\2\0"+
    "\2\u0218\6\0\1\u0218\10\0\1\114\1\u0219\2\114\7\0"+
    "\1\114\6\0\6\114\1\0\13\114\1\0\13\114\1\0"+
    "\4\114\1\0\11\114\1\0\1\114\6\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\11\114\1\u021a\1\114\1\0"+
    "\1\u021a\12\114\1\0\4\114\1\0\11\114\1\0\1\114"+
    "\12\377\1\u0100\74\377\14\u0103\1\u0100\72\u0103\12\u0109\1\u010b"+
    "\3\u0109\1\0\71\u0109\1\0\10\u0109\1\u010b\2\u0109\1\u021b"+
    "\1\u0109\1\u01a6\46\u0109\1\u021b\20\u0109\1\143\2\u0109\1\u010a"+
    "\1\143\1\u0109\4\143\1\u010b\1\143\1\u0109\3\143\1\u0109"+
    "\6\143\1\u0109\57\143\14\u010e\1\u010b\1\u010e\1\0\71\u010e"+
    "\1\0\12\u010e\1\u010b\1\u021c\1\u010e\1\u01a9\46\u010e\1\u021c"+
    "\20\u010e\1\144\2\u010e\1\u010f\1\144\1\u010e\4\144\1\u010e"+
    "\1\144\1\u010b\3\144\1\u010e\6\144\1\u010e\57\144\12\u0116"+
    "\1\u0117\74\u0116\14\u011a\1\u0117\72\u011a\6\0\3\170\1\u021d"+
    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\13\170"+
    "\1\0\4\170\1\0\11\170\1\0\1\170\12\u0122\1\u0123"+
    "\74\u0122\14\u0126\1\u0123\72\u0126\1\u01b0\2\u01b1\1\u01b2\1\u01b0"+
    "\1\u01b1\4\u01b0\1\u01b1\1\u01b0\1\u01b1\3\u01b0\1\u01b1\6\u01b0"+
    "\1\u01b1\55\u01b0\1\u021e\1\u01b0\105\u01b1\1\u021f\1\u01b1\1\u01b3"+
    "\2\u01b4\1\u01b5\1\u01b3\1\u01b4\4\u01b3\1\u01b4\1\u01b3\1\u01b4"+
    "\3\u01b3\1\u01b4\6\u01b3\1\u01b4\55\u01b3\1\u021e\1\u01b3\105\u01b4"+
    "\1\u0220\1\u01b4\42\0\1\u0221\14\0\1\u0221\63\0\2\u0222"+
    "\103\0\2\u0223\115\0\1\u0224\14\0\1\u0224\63\0\2\u0225"+
    "\51\0\12\u0133\1\u0134\74\u0133\14\u0137\1\u0134\1\u0137\1\0"+
    "\70\u0137\3\0\2\u0226\1\0\4\u0226\2\0\1\u0139\1\u0226"+
    "\2\0\4\u0226\1\0\11\u0226\1\0\40\u0226\2\0\4\u0226"+
    "\1\0\1\u0226\14\u0137\1\u0134\72\u0137\12\u0145\1\u0146\74\u0145"+
    "\14\u0149\1\u0146\1\u0149\1\0\70\u0149\3\0\2\u0227\1\0"+
    "\4\u0227\2\0\1\u014b\1\u0227\2\0\4\u0227\1\0\11\u0227"+
    "\1\0\40\u0227\2\0\4\u0227\1\0\1\u0227\14\u0149\1\u0146"+
    "\72\u0149\2\233\1\0\4\233\1\u0228\101\233\1\0\34\233"+
    "\1\u0229\47\233\12\u0151\1\u0152\74\u0151\14\u0155\1\u0152\1\u0155"+
    "\1\0\70\u0155\3\0\2\u022a\1\0\4\u022a\2\0\1\u0157"+
    "\1\u022a\2\0\4\u022a\1\0\11\u022a\1\0\40\u022a\2\0"+
    "\4\u022a\1\0\1\u022a\14\u0155\1\u0152\72\u0155\2\242\1\0"+
    "\4\242\1\u022b\101\242\1\0\34\242\1\u022c\47\242\2\0"+
    "\1\u022d\104\0\12\u015e\1\u015f\74\u015e\14\u0162\1\u015f\72\u0162"+
    "\1\u01d9\2\u01b1\1\u01da\1\u01d9\1\u01b1\4\u01d9\1\u01b1\1\u01d9"+
    "\1\u01b1\3\u01d9\1\u01b1\6\u01d9\1\u01b1\55\u01d9\1\u022e\1\u01d9"+
    "\1\u01db\2\u01b4\1\u01dc\1\u01db\1\u01b4\4\u01db\1\u01b4\1\u01db"+
    "\1\u01b4\3\u01db\1\u01b4\6\u01db\1\u01b4\55\u01db\1\u022e\1\u01db"+
    "\7\274\1\u022f\2\274\1\0\1\274\1\0\1\u016d\67\274"+
    "\1\0\1\274\12\u0170\1\0\1\u0170\1\0\1\u0170\1\0"+
    "\70\u0170\7\u0171\1\u0230\4\u0171\1\u0172\106\u0171\1\u0172\22\u0171"+
    "\1\u0231\47\u0171\7\u0175\1\u0232\2\u0175\1\u0176\106\u0175\1\u0176"+
    "\24\u0175\1\u0233\47\u0175\7\312\1\u0234\2\312\1\0\4\312"+
    "\1\u0179\65\312\1\0\1\312\12\u0235\1\u0236\72\u0235\1\0"+
    "\1\u0235\7\317\1\u0237\4\317\1\0\2\317\1\u017c\65\317"+
    "\1\0\1\317\14\u0238\1\u0236\70\u0238\1\0\1\u0238\7\322"+
    "\1\u0239\2\322\1\0\1\322\1\0\70\322\1\0\1\322"+
    "\7\u0181\1\u023a\4\u0181\1\u0182\106\u0181\1\u0182\22\u0181\1\u023b"+
    "\47\u0181\7\u0185\1\u023c\2\u0185\1\u0186\106\u0185\1\u0186\24\u0185"+
    "\1\u023d\47\u0185\7\340\1\u023e\2\340\1\0\4\340\1\u0189"+
    "\65\340\1\0\1\340\12\u023f\1\u0240\72\u023f\1\0\1\u023f"+
    "\7\344\1\u0241\4\344\1\0\2\344\1\u018c\65\344\1\0"+
    "\1\344\14\u0242\1\u0240\70\u0242\1\0\1\u0242\40\0\1\u0243"+
    "\141\0\1\u0216\34\0\1\u0218\15\0\3\u0218\2\0\1\u0218"+
    "\11\0\1\u0218\1\0\2\u0218\7\0\1\u0218\1\0\1\u0217"+
    "\2\u0218\6\0\1\u0218\10\0\4\114\7\0\1\114\6\0"+
    "\6\114\1\0\7\114\1\u0244\3\114\1\0\13\114\1\0"+
    "\4\114\1\0\11\114\1\0\1\114\6\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\6\114\1\u0245\4\114\1\0"+
    "\13\114\1\0\1\114\1\u0245\2\114\1\0\11\114\1\0"+
    "\1\114\12\u0109\1\u010b\74\u0109\14\u010e\1\u010b\72\u010e\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\6\170\1\u0246"+
    "\4\170\1\0\6\170\1\u0247\4\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\54\0\1\u0248\5\0\1\u0248\73\0"+
    "\1\u0249\14\0\1\u0249\66\0\1\u024a\11\0\1\u024a\74\0"+
    "\1\u024b\11\0\1\u024b\77\0\1\u024c\14\0\1\u024c\22\0"+
    "\2\233\1\0\35\233\1\u024d\46\233\2\242\1\0\35\242"+
    "\1\u024e\46\242\14\u0171\1\u0172\23\u0171\1\u024f\46\u0171\12\u0175"+
    "\1\u0176\25\u0175\1\u0250\46\u0175\12\u0235\1\u01f1\4\u0235\1\u0251"+
    "\65\u0235\1\u01f1\1\u0235\14\u0238\1\u01f7\2\u0238\1\u0252\65\u0238"+
    "\1\u01f7\1\u0238\14\u0181\1\u0182\23\u0181\1\u0253\46\u0181\12\u0185"+
    "\1\u0186\25\u0185\1\u0254\46\u0185\12\u023f\1\u020b\4\u023f\1\u0255"+
    "\65\u023f\1\u020b\1\u023f\14\u0242\1\u0211\2\u0242\1\u0256\65\u0242"+
    "\1\u0211\1\u0242\41\0\1\u0257\53\0\4\114\7\0\1\114"+
    "\6\0\6\114\1\0\13\114\1\0\4\114\1\u0258\6\114"+
    "\1\0\4\114\1\0\11\114\1\0\1\114\6\0\4\114"+
    "\7\0\1\114\6\0\6\114\1\0\3\114\1\u0259\7\114"+
    "\1\0\4\114\1\u0259\6\114\1\0\4\114\1\0\11\114"+
    "\1\0\1\114\6\0\4\170\7\0\1\170\6\0\6\170"+
    "\1\0\11\170\1\u025a\1\170\1\0\13\170\1\0\4\170"+
    "\1\0\11\170\1\0\1\170\6\0\4\170\7\0\1\170"+
    "\6\0\6\170\1\0\10\170\1\u025b\2\170\1\0\13\170"+
    "\1\0\4\170\1\0\11\170\1\0\1\170\55\0\1\u025c"+
    "\24\0\1\u025c\52\0\1\u025d\20\0\1\u025d\70\0\1\u025e"+
    "\13\0\1\u025e\53\0\2\u025f\112\0\1\u0260\35\0\1\u0260"+
    "\11\0\2\233\1\0\36\233\1\u0261\45\233\2\242\1\0"+
    "\36\242\1\u0262\45\242\14\u0171\1\u0172\24\u0171\1\u0263\45\u0171"+
    "\12\u0175\1\u0176\26\u0175\1\u0264\45\u0175\12\u0235\1\u0265\4\u0235"+
    "\1\u0251\65\u0235\1\u01f1\1\u0235\14\u0238\1\u0266\2\u0238\1\u0252"+
    "\65\u0238\1\u01f7\1\u0238\14\u0181\1\u0182\24\u0181\1\u0267\45\u0181"+
    "\12\u0185\1\u0186\26\u0185\1\u0268\45\u0185\12\u023f\1\u0269\4\u023f"+
    "\1\u0255\65\u023f\1\u020b\1\u023f\14\u0242\1\u026a\2\u0242\1\u0256"+
    "\65\u0242\1\u0211\1\u0242\42\0\1\u026b\52\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\13\114\1\0\7\114\1\u026c"+
    "\3\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\11\170\1\u026d"+
    "\1\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\6\170\1\u026e\4\170\1\0\13\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\44\0\1\u026f\11\0\1\u026f\72\0"+
    "\1\u0270\14\0\1\u0270\71\0\1\u0271\14\0\1\u0271\27\0"+
    "\2\233\1\0\37\233\1\u0272\44\233\2\242\1\0\37\242"+
    "\1\u0273\44\242\14\u0171\1\u0172\25\u0171\1\u0274\44\u0171\12\u0175"+
    "\1\u0176\27\u0175\1\u0275\44\u0175\14\u0181\1\u0182\25\u0181\1\u0276"+
    "\44\u0181\12\u0185\1\u0186\27\u0185\1\u0277\44\u0185\41\0\1\u0278"+
    "\53\0\4\114\7\0\1\114\6\0\5\114\1\u0279\1\0"+
    "\13\114\1\0\13\114\1\0\4\114\1\0\11\114\1\0"+
    "\1\114\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\13\170\1\0\4\170\1\u027a\6\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\5\170\1\u027b\5\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\2\233\1\0\36\233"+
    "\1\u027c\45\233\2\242\1\0\36\242\1\u027d\45\242\14\u0171"+
    "\1\u0172\24\u0171\1\u027e\45\u0171\12\u0175\1\u0176\26\u0175\1\u027f"+
    "\45\u0175\14\u0181\1\u0182\24\u0181\1\u0280\45\u0181\12\u0185\1\u0186"+
    "\26\u0185\1\u0281\45\u0185\36\0\1\u0282\56\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\5\114\1\u0283\5\114\1\0"+
    "\13\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\13\170\1\0"+
    "\13\170\1\0\4\170\1\0\1\170\1\u0284\7\170\1\0"+
    "\1\170\2\233\1\0\33\233\1\u0285\50\233\2\242\1\0"+
    "\33\242\1\u0286\50\242\14\u0171\1\u0172\21\u0171\1\u0287\50\u0171"+
    "\12\u0175\1\u0176\23\u0175\1\u0288\50\u0175\14\u0181\1\u0182\21\u0181"+
    "\1\u0289\50\u0181\12\u0185\1\u0186\23\u0185\1\u028a\50\u0185\6\0"+
    "\4\114\7\0\1\114\6\0\6\114\1\0\7\114\1\u028b"+
    "\3\114\1\0\13\114\1\0\4\114\1\0\11\114\1\0"+
    "\1\114\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\13\170\1\0\4\170\1\u028c\6\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\6\0\4\114\7\0\1\114\6\0"+
    "\6\114\1\0\13\114\1\0\13\114\1\0\4\114\1\0"+
    "\11\114\1\0\1\u028d\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\10\170\1\u028e\2\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\6\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\5\114\1\u028f\5\114\1\0"+
    "\13\114\1\0\4\114\1\0\11\114\1\0\1\114\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\4\170\1\u0290"+
    "\6\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\114\7\0\1\114\6\0\6\114\1\0"+
    "\5\114\1\u0291\5\114\1\0\13\114\1\0\4\114\1\0"+
    "\11\114\1\0\1\114\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\5\170\1\u0292\5\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\6\0\4\114\7\0"+
    "\1\114\6\0\6\114\1\0\13\114\1\0\4\114\1\u0293"+
    "\6\114\1\0\4\114\1\0\11\114\1\0\1\114\6\u0294"+
    "\4\u0295\7\u0294\1\u0295\5\u0294\1\0\6\u0295\1\u0294\13\u0295"+
    "\1\u0294\13\u0295\1\u0294\4\u0295\1\u0294\11\u0295\1\u0294\1\u0295"+
    "\43\0\1\u0296\3\0\1\u0297\7\0\1\u0298\1\u0299\21\0"+
    "\1\u029a\12\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\4\170\1\u029b\3\170\1\u029c\2\170\1\0\4\170\1\u029d"+
    "\1\u029e\5\170\1\0\4\170\1\0\6\170\1\u029f\2\170"+
    "\1\0\1\170\60\0\1\u02a0\77\0\1\u02a1\115\0\1\u02a2"+
    "\105\0\1\u02a3\107\0\1\u02a4\34\0\4\170\7\0\1\170"+
    "\6\0\6\170\1\0\13\170\1\0\5\170\1\u02a5\5\170"+
    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
    "\7\0\1\170\6\0\6\170\1\0\12\170\1\u02a6\1\0"+
    "\13\170\1\0\4\170\1\0\11\170\1\0\1\170\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\13\170\1\0"+
    "\5\170\1\u02a7\5\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\13\170\1\0\4\170\1\u02a8\6\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\13\170\1\0\5\170\1\u02a9\5\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\45\0\1\u02aa\136\0"+
    "\1\u02ab\107\0\1\u02ac\67\0\1\u02ad\125\0\1\u02ae\16\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\6\170\1\u02af"+
    "\4\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\13\170\1\0\13\170\1\0\4\170\1\0\1\170\1\u02b0"+
    "\7\170\1\0\1\170\6\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
    "\2\170\1\u02b1\6\170\1\0\1\170\6\0\4\170\7\0"+
    "\1\170\6\0\6\170\1\0\13\170\1\0\4\170\1\u02b2"+
    "\6\170\1\0\4\170\1\0\11\170\1\0\1\170\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\13\170\1\0"+
    "\13\170\1\0\4\170\1\0\2\170\1\u02b3\6\170\1\0"+
    "\1\170\47\0\1\u02b4\74\0\1\u02b5\106\0\1\u02b6\116\0"+
    "\1\u02b7\105\0\1\u02b8\50\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\10\170\1\u02b9\2\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\6\0\4\170\7\0"+
    "\1\170\6\0\5\170\1\u02ba\1\0\13\170\1\0\13\170"+
    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
    "\7\0\1\170\6\0\5\170\1\u02bb\1\0\13\170\1\0"+
    "\13\170\1\0\4\170\1\0\11\170\1\0\1\170\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\6\170\1\u02bc"+
    "\4\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\5\170\1\u02bd\5\170\1\0\13\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\60\0\1\u02be\131\0\1\u02bf\52\0"+
    "\1\u02c0\106\0\1\u02c1\45\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\13\170\1\0\5\170\1\u02c2\5\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\6\0\4\170\7\0"+
    "\1\170\6\0\6\170\1\0\13\170\1\0\13\170\1\0"+
    "\4\170\1\0\7\170\1\u02c3\1\170\1\0\1\170\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\10\170\1\u02c4"+
    "\2\170\1\0\13\170\1\0\4\170\1\0\11\170\1\0"+
    "\1\170\6\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\10\170\1\u02c5\2\170\1\0\13\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170\104\0\1\u02c6\63\0\1\u02ae\131\0"+
    "\1\u02b8\106\0\1\u02c7\10\0\4\170\7\0\1\170\6\0"+
    "\6\170\1\0\13\170\1\0\13\170\1\0\4\170\1\0"+
    "\10\170\1\u02c8\1\0\1\170\6\0\4\170\7\0\1\170"+
    "\6\0\6\170\1\0\13\170\1\0\6\170\1\u02b3\4\170"+
    "\1\0\4\170\1\0\11\170\1\0\1\170\6\0\4\170"+
    "\7\0\1\170\6\0\6\170\1\0\13\170\1\0\13\170"+
    "\1\0\4\170\1\0\10\170\1\u02bd\1\0\1\170\6\0"+
    "\4\170\7\0\1\170\6\0\6\170\1\0\13\170\1\0"+
    "\13\170\1\0\4\170\1\0\10\170\1\u02c9\1\0\1\170"+
    "\35\0\1\u02ae\154\0\1\u02ca\11\0\4\170\7\0\1\170"+
    "\6\0\5\170\1\u02b3\1\0\13\170\1\0\13\170\1\0"+
    "\4\170\1\0\11\170\1\0\1\170\6\0\4\170\7\0"+
    "\1\170\6\0\6\170\1\0\13\170\1\0\13\170\1\0"+
    "\4\170\1\0\7\170\1\u02cb\1\170\1\0\1\170\57\0"+
    "\1\u02ae\35\0\4\170\7\0\1\170\6\0\6\170\1\0"+
    "\13\170\1\0\4\170\1\u02b3\6\170\1\0\4\170\1\0"+
    "\11\170\1\0\1\170";

  /** 
   * The transition table of the DFA
   */
  final private static int yytrans [] = yy_unpack(yy_packed);


  /* error codes */
  final private static int YY_UNKNOWN_ERROR = 0;
  // final private static int YY_ILLEGAL_STATE = 1;
  final private static int YY_NO_MATCH = 2;
  final private static int YY_PUSHBACK_2BIG = 3;

  /* error messages for the codes above */
  final private static String YY_ERROR_MSG[] = {
    "Unkown internal scanner error",		//$NON-NLS-1$
    "Internal error: unknown state",		//$NON-NLS-1$
    "Error: could not match input",		//$NON-NLS-1$
    "Error: pushback value was too large"	//$NON-NLS-1$
  };

  /**
   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  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,  1,  0,  0,  0,  0, 
     0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  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, 
     0,  1,  2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0,  0,  9, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  1,  1,  0,  0,  1, 
     1,  9,  0,  9,  0,  0,  9,  0,  0,  0,  0,  0,  9,  1,  1,  0, 
     1,  0,  9,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  9,  0, 
     0,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  9, 
     0,  0,  1,  0,  0,  9,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0, 
     0,  9,  0,  0,  0,  0,  1,  0,  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,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  3, 
     2,  2,  3,  2,  2,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0, 
     0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  0,  1,  0,  0,  1,  1, 
     1,  1,  1,  0,  1,  0,  1,  0,  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,  0,  0,  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 */
  private java.io.Reader yy_reader;

  /** the current state of the DFA */
  private int yy_state;

  /** the current lexical state */
  private int yy_lexical_state = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char yy_buffer[] = new char[16384];

  /** the textposition at the last accepting state */
  private int yy_markedPos;

  /** the textposition at the last state to be included in yytext */
  private int yy_pushbackPos;

  /** the current text position in the buffer */
  private int yy_currentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int yy_startRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int yy_endRead;

  /** number of newlines encountered up to the start of the matched text */
  private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  // private int yycolumn; 

  /** 
   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
   */
  // private boolean yy_atBOL;

  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
  private boolean yy_atEOF;

  /** denotes if the user-EOF-code has already been executed */
  private boolean yy_eof_done;

  /* user code: */
	private int fTokenCount = 0;
 
	// required holders for white-space compacting
	private boolean fShouldLoadBuffered = false;
	private String fBufferedContext = null;
	private int fBufferedStart = 1;
	private int fBufferedLength = 0;
	private ContextRegionContainer fBufferedEmbeddedContainer = null;
	private String f_context = null;

	// state stack for handling embedded regions
	private IntStack fStateStack = new IntStack();
	// a "hint" as to what an embedded region should be evaluated
	private String fEmbeddedHint = UNDEFINED;
	// a "hint" as to what state to enter once an embedded region has
	//   been completed
	private int fEmbeddedPostState = YYINITIAL;
	
	// the container used to create embedded regions
	private ContextRegionContainer fEmbeddedContainer = null;
	private static final String PROXY_CONTEXT = "PROXY_CONTEXT";

	private String context = null;
	private int start = 0;
	private int textLength = 0;
	private int length = 0;

	// offset for tracking position specific block tags
	private int fOffset = 0;
	
	// the name of the current tag being opened
	private String fCurrentTagName = null;

	// the name of the current tag inside of an embedded region
	private String internalTagName = null;
	private String internalContext = null;

	// the list of tag name BlockMarkers
	private List fBlockMarkers = new ArrayList(0);
	private List fNestablePrefixes = new ArrayList(1);
	
	// where the last internal container block was found
	private int fLastInternalBlockStart = -1;

	// required to not seek text blocks on an end tag
	private boolean fIsBlockingEnabled = false;
	private boolean fIsCaseSensitiveBlocking = true;

	private static final boolean fForbidJSP = false;
	
	private int fELlevel = 0;

	private JSPParserRegionFactory fRegionFactory = new JSPParserRegionFactory();

	// Is the embedded tag a JSP tag
	private boolean fEmbeddedTag = false;
	// Is the non-embedded tag a JSP tag
	private boolean fContainerTag = false;
	// Is the tokenizer in a non-embedded tag (between < and >)
	private boolean fInTagContainer = false;
	// Is the tokenizer in an embedded tag (between < and >)
	private boolean fInTagEmbedded = false;

	/**
	 * user method 
	 */
	public final void addBlockMarker(BlockMarker marker) {
		if(containsTagName(marker.getTagName()))
			return;
		fBlockMarkers.add(marker);
	}
	/**
	 * user method
	 */
	public final void addNestablePrefix(TagMarker marker) {
		fNestablePrefixes.add(marker);
	}
	/* user method */
	public List getNestablePrefixes() {
		return fNestablePrefixes;
	}
	/**
	 * user method
	 */
	private boolean isNestable(String tagName) {
		//Iterator blocks = fNestablePrefixes.iterator();
		//while(blocks.hasNext()) {
		//	TagMarker marker = (TagMarker)blocks.next();
		//	String markerName = marker.getTagName();
		//	if(tagName.length() > markerName.length() + 1 && tagName.startsWith(markerName) && tagName.charAt(markerName.length()) == ':') {
		//		return marker.isGlobal() || getOffset() >= marker.getMarker().getStart();
		//	}
		//}
		//return false;
		return true;
	}
	/**
	 * user method 
	 */
	public final void removeNestablePrefix(String name) {
		if (fNestablePrefixes != null) {
			Iterator nestables = fNestablePrefixes.iterator();
			while (nestables.hasNext()) {
				if (((TagMarker) nestables.next()).getTagName().equalsIgnoreCase(name))
					nestables.remove();
			}
		}
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(BlockMarker marker) {
		fBlockMarkers.remove(marker);
	}
	/**
	 * user method 
	 */
	public final void removeBlockMarker(String tagname) {
		if (fBlockMarkers != null) {
			Iterator blocks = fBlockMarkers.iterator();
			while (blocks.hasNext()) {
				if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
					blocks.remove();
			}
		}
	}
	/* user method */
	private final void assembleEmbeddedTagSequence(String startType, String endTagName) {
		assembleEmbeddedContainer(startType, null, endTagName);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String[] endTypes) {
		assembleEmbeddedContainer(startType, endTypes, null);
	}
	/* user method */
	private final void assembleEmbeddedContainer(String startType, String endType) {
		assembleEmbeddedContainer(startType, new String[]{endType}, null);
	}
	/**
	 *  user method 
	 * 
	 * Assembles an embedded container beginning with the given startType as
	 * the first ContextRegion within it and of the type fEmbeddedHint.  The
	 * endTypes[] array contains the context types that will cause a successful
	 * exit.  Use of the endTagName parameter alters this behavior to force an
	 * exit on an XML_TAG_CLOSE after seeing an XML_TAG_NAME whose significant
	 * text matches the endTagName String.  All contents in between are
	 * insignificant, and yes, this means comments are allowed inside.
	 **/
	private final void assembleEmbeddedContainer(String startType, String[] endTypes, String endTagName) {
		// the context of the region being added to the embedded container
		internalContext = startType;
		// keep track of where this container began; to provide relative indeces for the regions
		int containerStart = yychar;
		boolean notFinished = true;
		// keep track of where we seem to be so that the endTagName can be checked
		boolean isInEndTag = false;
		boolean isInFirstTag = true;
		// create the embedded container and setup its "type"
		if (fEmbeddedContainer == null) {
			fEmbeddedContainer = new ContextRegionContainer();
			fEmbeddedContainer.setType(fEmbeddedHint);
			fEmbeddedContainer.setStart(containerStart);
			// TODO: parent region needs to be set .... but not sure where to get it from 
			//		fEmbeddedContainer.setParent(parentRegion);
		}
		containerStart = fEmbeddedContainer.getStart();
		while (notFinished) {
			// add the region to the container
			if (internalContext != null && internalContext != PROXY_CONTEXT) {
				ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				// DW, 4/16/2003 token regions no longer have parents
				//newToken.setParent(fEmbeddedContainer);
			}
			try {
				// longscan determines whether to attempt a blockTagScan within the embedded container
				boolean longscan = false;
				// save the tokenizer state in case of a block tag scan
				int previousState = yystate();
				String previousCurrentTagName = fCurrentTagName;
				int previousPostState = fEmbeddedPostState;
				String previousEmbeddedHint = fEmbeddedHint;
				// determine if a block tag scan is necessary
				if (internalContext == XML_TAG_NAME) {
					internalTagName = yytext();
					if(!isNestable(internalTagName)) {
						internalTagName = null;
						// snagged a tag name we shouldn't have
						fEmbeddedPostState = ST_ABORT_EMBEDDED;
						notFinished = false;
					}
				}
				else if (internalContext == XML_TAG_OPEN || internalContext == XML_END_TAG_OPEN) {
					internalTagName = null;
				}
				// do upkeep for endTagName usage; must be here since the next token could be the close
				if (internalContext == XML_END_TAG_OPEN) {
					isInEndTag = true;
				} else if (internalContext == XML_TAG_CLOSE) {
					isInFirstTag = isInEndTag = false;
				} else {
				 	ITextRegionList embeddedRegions = fEmbeddedContainer.getRegions();
					if (embeddedRegions.size() > 2 && (embeddedRegions.get(embeddedRegions.size()-1)).getType() == XML_TAG_CLOSE && (embeddedRegions.get(embeddedRegions.size() - 3)).getType() == XML_TAG_OPEN && internalTagName != null) {
						if (containsTagName(internalTagName)) {
							longscan = true;
							yybegin(ST_BLOCK_TAG_SCAN);
						}
					}
				}
				if (longscan)
					fCurrentTagName = internalTagName;
				// read the next region and context
				internalContext = primGetNextToken();
				if (longscan) {
					// Returning from a block tag scan requires restoring some state variables
					// as well as handling the block region and setting up for normal scanning
					// inside the embedded container
					ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
					fEmbeddedContainer.getRegions().add(newToken);
					fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
					fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
					// DW, 4/16/2003 token regions no longer have parents
					// newToken.setParent(fEmbeddedContainer);
					longscan = false;
					fEmbeddedPostState = previousPostState;
					fEmbeddedHint = previousEmbeddedHint;
					fCurrentTagName = previousCurrentTagName;
					yybegin(previousState);
					internalContext = primGetNextToken();
				}
			} catch (IOException e) {
				// primGetNextToken() calls may throw an IOException
				// catch and do nothing since the isEOF check below
				// will properly exit if the input was too short
			} catch (Exception f) {
				// some other exception happened; never should
				Logger.logException(f);
			}
			boolean isEndingType = yystate() == ST_ABORT_EMBEDDED;
			if(!isEndingType) {
				// check for ending context
				if (endTagName == null) {
					for (int i = 0; i < endTypes.length; i++) {
						isEndingType = isEndingType || (internalContext == endTypes[i]);
					}
				}
				else {
					isEndingType = ((isInEndTag && internalContext == XML_TAG_CLOSE) || (isInFirstTag && internalContext == XML_EMPTY_TAG_CLOSE)) && internalTagName != null && internalTagName.equals(endTagName);
				}
			}
			ITextRegionList embeddedList = fEmbeddedContainer.getRegions();
			notFinished = notFinished && ((!isEndingType) && !isEOF() && (endTagName != null || internalContext != UNDEFINED) && !(internalContext == PROXY_CONTEXT && (embeddedList.get(embeddedList.size()-1)).getType() == UNDEFINED));
		}
		// finish adding the last context
		if (internalContext != null && internalContext != PROXY_CONTEXT) {
			ITextRegion newToken = fRegionFactory.createToken(internalContext, yychar - containerStart, yylength(), yylength());
			fEmbeddedContainer.getRegions().add(newToken);
			// DW, 4/16/2003 token regions no longer have parents
			//newToken.setParent(fEmbeddedContainer);
			fEmbeddedContainer.setLength(yychar - containerStart + yylength());
			fEmbeddedContainer.setTextLength(yychar - containerStart + yylength());
		}
		yybegin(fEmbeddedPostState);
	}
	/* user method */
	public final boolean isCaseSensitiveBlocking() {
		return fIsCaseSensitiveBlocking;
	}
	/* user method */
	public final void setCaseSensitiveBlocking(boolean newValue) {
		fIsCaseSensitiveBlocking = newValue;
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP() {
		return getBlockMarkerAllowsJSP(fCurrentTagName);
	}
	/* user method */
	public boolean getBlockMarkerAllowsJSP(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return marker.allowsJSP();
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return marker.allowsJSP();
		}
		return true;
	}
	/* user method */
	public boolean getBlockMarkerCaseSensitivity() {
		return getBlockMarkerCaseSensitivity(fCurrentTagName);
	}
	public boolean getBlockMarkerCaseSensitivity(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			boolean casesensitive = marker.isCaseSensitive();
			if(casesensitive && marker.getTagName().equals(name))
				return casesensitive;
			else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
				return casesensitive;
		}
		return true;
	}
	/* user method */
	public String getBlockMarkerContext() {
		return getBlockMarkerContext(fCurrentTagName);
	}
	/* user method */
	public String getBlockMarkerContext(String name) {
		Iterator iterator = fBlockMarkers.iterator();
		while(iterator.hasNext()) {
			BlockMarker marker = (BlockMarker)iterator.next();
			if(marker.getTagName().equals(name))
				return marker.getContext();
		}
		return BLOCK_TEXT;
	}
	/* user method */
	public List getBlockMarkers() {
		return fBlockMarkers;
	}
	/* user method */
	public final int getOffset() {
		return fOffset + yychar;
	}
	private final boolean isBlockMarker() {
		return isBlockMarker(fCurrentTagName);
	}
	private final boolean isBlockMarker(String tagName) {
		if (!fIsBlockingEnabled)
			return false;
		return containsTagName(tagName);
	}
	/**
	 * user method
	 */
	public final void beginBlockTagScan(String newTagName) {
		beginBlockMarkerScan(newTagName, BLOCK_TEXT);
	}
	/**
	 * user method
	 *
	 * Special tokenizer setup.  Allows tokenization to be initiated at the
	 * start of a text block within a "newTagName" tag.
	 *
	 * Example: 
	 *	Tokenizer toker = new Tokenizer();
	 *	toker.setCaseSensitiveBlocking(false);
	 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
	 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
	 *	toker.getRegions(); 
	 *
	 * Returns:
	 *	BLOCK_TEXT: 0-40
	 *	XML_END_TAG_OPEN: 41-42
	 *	XML_TAG_NAME: 43-48
	 *	XML_TAG_CLOSE: 49-49
	 *	XML_CONTENT: 50-57
	 *
	 */
	public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
		yybegin(ST_BLOCK_TAG_SCAN);
		fCurrentTagName = newTagName;
	}

/**
 * Method doScan.
 * 
 * Returns a context region for all of the text from the current position upto the end of input or
 * to right *before* the first occurence of searchString
 * 
 * @param searchString - target string to search for ex.: "-->", "</tagname"
 * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
 * @param allowJSP - check for and allow for JSP markup <%%>
 * @param context - the context of the scanned region if non-zero length
 * @param exitState - the state to go to if the region was of non-zero length
 * @param abortState - the state to go to if the searchString was found immediately
 * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
 * @throws IOException
 */
private final String doScan(String searchString, boolean requireTailSeparator, boolean allowJSP, boolean allowCDATA, String searchContext, int exitState, int immediateFallbackState) throws IOException {
	boolean stillSearching = true;
	// Disable further block (probably)
	fIsBlockingEnabled = false;
	int searchStringLength = searchString.length();
	int n = 0;
	char lastCheckChar;
	int i;
	boolean same = false;
	// Check for JSP starts ("<%") if the tag is global like SCRIPT or STYLE
	boolean checkJSPs = allowJSP && !fForbidJSP;
	boolean checkedForJSPsOnce = !checkJSPs;
	boolean checkedJSPsAtStartOnce = false;
	
	while (stillSearching) {
		n = 0;
		// Ensure that enough data from the input exists to compare against the search String.
		n = yy_advance();
		while(n != YYEOF && yy_currentPos < searchStringLength)
			n = yy_advance();
//		c = (char) n;
		// If the input was too short or we've exhausted the input, stop immediately.
		if (n == YYEOF && checkedForJSPsOnce) {
			stillSearching = false;
		}
		else {
			/**
			 * Look for starting JSPs "<%"
			 */
			checkedForJSPsOnce = true;
			// 1) yy_currentPos - searchStringLength : There's at least searchStringLength of input available; once that's read, check for JSPs
			// ---
			// Look for a JSP beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
			if(checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				yy_buffer[yy_currentPos - searchStringLength] == '<' && yy_buffer[yy_currentPos - searchStringLength + 1] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 2) yy_currentPos - jspstarter.length : There's not searchStringLength of input available; check for a JSP 2 spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkJSPs && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos..(yy_currentPos+jspStartlength-1) : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkJSPs && !checkedJSPsAtStartOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedJSPsAtStartOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}


			/**
			 * Look for starting CDATA "<![CDATA["
			 */
			// 1) yy_currentPos - searchStringLength: There's at least searchStringLength of input available; once that's read, check for CDATA
			// ---
			// Look for a CDATA beginning at current-searchStringLength; if so, backup and switch scanner states to handle it.
			// Ensure that we've not encountered a complete block (<[!CDATA[]]>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
/*			if(checkCDATA && yy_currentPos > searchStringLength && yy_currentPos + searchStringLength < yy_buffer.length && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
				charsMatch(cdataStarter, yy_buffer, 0, yy_currentPos - searchStringLength)) {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				// go to a state where CDATA can be found
				if (fEmbeddedContainer == null) {
					fEmbeddedContainer = new ContextRegionContainer();
					fEmbeddedContainer.setType(searchContext);
					fEmbeddedContainer.setStart(yychar);
				}
				ITextRegion newToken = fRegionFactory.createToken(searchContext, yychar, yylength(), yylength());
				fEmbeddedContainer.getRegions().add(newToken);
				fEmbeddedContainer.setLength(fEmbeddedContainer.getLength() + yylength());
				fEmbeddedContainer.setTextLength(fEmbeddedContainer.getTextLength() + yylength());
				yybegin(YYINITIAL);
				String context = primGetNextToken();
				if(context.equals(XMLRegionContexts.XML_CDATA_OPEN)) {
					assembleEmbeddedContainer(XMLRegionContexts.XML_CDATA_OPEN, XMLRegionContexts.XML_CDATA_CLOSE);
				}
				yybegin(resumeState);
				return searchContext;
			}
*//*
			// 2) yy_currentPos - cdataStarter.length: There's not searchStringLength of input available; check for a CDATA right here spots back in what we could read
			// ---
			// Look for a JSP beginning at the current position; this case wouldn't be handled by the preceding section
			// since it relies upon *having* closeTagStringLength amount of input to work as designed.  Must be sure we don't
			// spill over the end of the buffer while checking.
			else if(checkCDATA && yy_startRead != fLastInternalBlockStart && yy_currentPos > 0 && yy_currentPos < yy_buffer.length - 1 &&
					yy_buffer[yy_currentPos - 1] == '<' && yy_buffer[yy_currentPos] == '%') {
				fLastInternalBlockStart = yy_markedPos = yy_currentPos - 1;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
			// 3) yy_currentPos : Check at the start of the block one time
			// ---
			// Look for a JSP beginning immediately in the block area; this case wouldn't be handled by the preceding section
			// since it relies upon yy_currentPos equaling exactly the previous end +1 to work as designed.
			else if(checkCDATA && !checkedForCDATAOnce && yy_startRead != fLastInternalBlockStart && yy_startRead > 0 &&
					yy_startRead < yy_buffer.length - 1 && yy_buffer[yy_startRead] == '<' && yy_buffer[yy_startRead + 1] == '%') {
				checkedForCDATAOnce = true;
				fLastInternalBlockStart = yy_markedPos = yy_startRead;
				yy_currentPos = yy_markedPos + 1;
				int resumeState = yystate();
				yybegin(ST_BLOCK_TAG_INTERNAL_SCAN);
				if(yy_markedPos == yy_startRead) {
					String jspContext = primGetNextToken();
					yybegin(resumeState);
					return jspContext;
				}
				return searchContext;
			}
*/
			// Check the characters in the target versus the last targetLength characters read from the buffer
			// and see if it matches
			if (n == YYEOF) {
				stillSearching = false;
			}
			else {
				same = true;
				// safety check for array accesses
				if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
					for(i = 0; i < searchStringLength; i++) {
						if(same && fIsCaseSensitiveBlocking)
							same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
						else if(same && !fIsCaseSensitiveBlocking)
							same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
					}
				}
				// safety check failed; no match is possible right now
				else {
					same = false;
				}
			}
			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
				// Additional check for close tags to ensure that targetString="</script" doesn't match
				// "</scriptS"
				lastCheckChar = yy_buffer[yy_currentPos];
				// Succeed on "</script>" and "</script "
				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
					stillSearching = false;
			}
			else {
				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
			}
		}
	}
	if (n != YYEOF || same) {
		// We've stopped short of the end or definitely found a match
		yy_markedPos = yy_currentPos - searchStringLength;
		yy_currentPos = yy_markedPos + 1;
		// If the searchString occurs at the very beginning of what would have
		// been a Block, resume scanning normally immediately
		if (yy_markedPos == yy_startRead) {
			yybegin(immediateFallbackState);
			return primGetNextToken();
		}
	}
	else {
		// We ran through the rest of the input
		yy_markedPos = yy_currentPos;
		yy_currentPos++;
	}
	yybegin(exitState);
	// If the ending occurs at the very beginning of what would have
	// been a Block, resume scanning normally immediately
	if(yy_markedPos == yy_startRead)
		return primGetNextToken();
	return searchContext;
}
/**
 * user method 
 * does a lookahead for the current tag name
 */
private final String doBlockTagScan() throws IOException {
	fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
	return doScan("</" + fCurrentTagName, true, getBlockMarkerAllowsJSP(), true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
}
	/**
	 * user method
	 *
	 * Converts the raw context String returned by the primGetNextToken()
	 * method into a full ITextRegion by pulling in values for the
	 * current offset within the scanning text.
	 *
	 * Returns null when EOF is encountered and attaches intermittently
	 * discovered whitespace onto the end of useful regions.
	 *
	 * Note that this algorithm caches the token following the one being returned
	 * so that whitespace can be collapsed.
	 */
	public final ITextRegion getNextToken() throws IOException {
		fEmbeddedContainer = null;
		// load the starting non-whitespace token (assume that it is so)
		if (fShouldLoadBuffered) {
			if (fBufferedEmbeddedContainer != null) {
				ITextRegion container = fBufferedEmbeddedContainer;
				fBufferedEmbeddedContainer = null;
				fShouldLoadBuffered = false;
				return container;
			}
			context = fBufferedContext;
			start = fBufferedStart;
			textLength = length = fBufferedLength;
			fShouldLoadBuffered = false;
		} else {
			context = primGetNextToken();
			if (context == PROXY_CONTEXT) {
				return fEmbeddedContainer;
			} else if (context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
				if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
					fCurrentTagName = yytext();
				else
					fCurrentTagName = null;
			} else if (context == XML_TAG_OPEN) {
				fIsBlockingEnabled = true;
			} else if (context == XML_END_TAG_OPEN) {
				fIsBlockingEnabled = false;
			}
			start = yychar;
			textLength = length = yylength();
			if (yy_atEOF) {
				fTokenCount++;
				return null;
			}
		}
		// store the next token
		f_context = primGetNextToken();
		if (f_context == PROXY_CONTEXT) {
			fBufferedEmbeddedContainer = fEmbeddedContainer;
			fShouldLoadBuffered = true;
		} else if (f_context == XML_TAG_NAME || f_context == JSP_ROOT_TAG_NAME || f_context == JSP_DIRECTIVE_NAME) {
			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
				fCurrentTagName = yytext();
			else
				fCurrentTagName = null;
		} else if (f_context == XML_TAG_OPEN) {
			fIsBlockingEnabled = true;
		} else if (f_context == XML_END_TAG_OPEN) {
			fIsBlockingEnabled = false;
		}
		fBufferedContext = f_context;
		fBufferedStart = yychar;
		fBufferedLength = yylength();
		fShouldLoadBuffered = true;
		if (fBufferedContext == WHITE_SPACE) {
			fShouldLoadBuffered = false;
			length += fBufferedLength;
		}
		if (context == null) {
			// EOF
			if (Debug.debugTokenizer) {
				System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
			}
			return null;
		}
		fTokenCount++;
		return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
	}
	/* user method */
	public JSPTokenizer(){
		super();
	}
	/* user method */
	public JSPTokenizer(char[] charArray){
			this(new CharArrayReader(charArray));
	}
	/* user method */
	public void reset(char[] charArray) {
		reset(new CharArrayReader(charArray), 0);
	}
	/* user method */
	public void reset(char[] charArray, int newOffset) {
		reset(new CharArrayReader(charArray), newOffset);
	}
	/* user method */
	public void reset(java.io.InputStream in) {
		reset(new java.io.InputStreamReader(in), 0);
	}
	/* user method */
	public void reset(java.io.InputStream in, int newOffset) {
		reset(new java.io.InputStreamReader(in), newOffset);
	}
	/* user method */
	public void reset(java.io.Reader in) {
		reset(in, 0);
	}
	/**
	 * user method *
	 *
	 * Reset internal counters and vars to "newly created" values, in the hopes
	 * that resetting a pre-existing tokenizer is faster than creating a new one.
	 *
	 * This method contains code blocks that were essentially duplicated from the
	 * <em>generated</em> output of this specification before this method was
	 * added.  Those code blocks were under the above copyright.
	 */
	public void reset(java.io.Reader in, int newOffset) {
		if (Debug.debugTokenizer) {
			System.out.println("resetting tokenizer");//$NON-NLS-1$
		}
		fOffset = newOffset;
	
		/* the input device */
		yy_reader = in;
	
		/* the current state of the DFA */
		yy_state = 0;
	
		/* the current lexical state */
		yy_lexical_state = YYINITIAL;
	
		/* this buffer contains the current text to be matched and is
		the source of the yytext() string */
		java.util.Arrays.fill(yy_buffer, (char)0);
	
		/* the textposition at the last accepting state */
		yy_markedPos = 0;
	
		/* the textposition at the last state to be included in yytext */
		yy_pushbackPos = 0;
	
		/* the current text position in the buffer */
		yy_currentPos = 0;
	
		/* startRead marks the beginning of the yytext() string in the buffer */
		yy_startRead = 0;
	
		/** 
		 * endRead marks the last character in the buffer, that has been read
		 * from input 
		 */
		yy_endRead = 0;
	
		/* number of newlines encountered up to the start of the matched text */
		yyline = 0;
	
		/* the number of characters up to the start of the matched text */
		yychar = 0;
	
		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
		yy_atEOF = false;
	
		/* denotes if the user-EOF-code has already been executed */
		yy_eof_done = false;
	
	
		/* user vars: */
		fTokenCount = 0;
	 
		fShouldLoadBuffered = false;
		fBufferedContext = null;
		fBufferedStart = 1;
		fBufferedLength = 0;
		fStateStack = new IntStack();
	
		fLastInternalBlockStart = -1;
	
		context = null;
		start = 0;
		textLength = 0;
		length = 0;
	
		fEmbeddedContainer = null;
		
		fELlevel = 0;
	}
	/**
	 * user method
	 *
	 */
	public BlockTokenizer newInstance() {
		JSPTokenizer newInstance = new JSPTokenizer();
		// global tagmarkers can be shared; they have no state and 
		// are never destroyed (e.g. 'release')
		for(int i = 0; i < fBlockMarkers.size(); i++) {
			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
			if(blockMarker.isGlobal())
				newInstance.addBlockMarker(blockMarker);
		}
		for(int i = 0; i < fNestablePrefixes.size(); i++) {
			TagMarker marker = (TagMarker) fNestablePrefixes.get(i);
			if(marker.isGlobal())
				newInstance.addNestablePrefix(marker);
		}
		return newInstance;
	}
	/* user method */
	private final String scanXMLCommentText() throws IOException {
		// Scan for '-->' and return the text up to that point as
		//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_XML_COMMENT_END state and return the next
		//  context as usual.
		return doScan("-->", false, true, true, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
	}
	/* user method */
	private final String scanJSPCommentText() throws IOException {
		// Scan for '--%>' and return the text up to that point as
		//   JSP_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
		//  case change to the ST_JSP_COMMENT_END state and return the next
		//  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 (fContainerTag && fEmbeddedContainer != null) || (fContainerTag && fInTagContainer) || (fEmbeddedTag && fInTagEmbedded);
	}


  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public JSPTokenizer(java.io.Reader in) {
    this.yy_reader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public JSPTokenizer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /** 
   * Unpacks the compressed DFA transition table.
   *
   * @param packed   the packed transition table
   * @return         the unpacked transition table
   */
  private static int [] yy_unpack(String packed) {
    int [] trans = new int[35145];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 9302) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do trans[j++] = value; while (--count > 0);
    }
    return trans;
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] yy_unpack_cmap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 1376) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Gets the next input character.
   *
   * @return      the next character of the input stream, EOF if the
   *              end of the stream is reached.
   * @exception   IOException  if any I/O-Error occurs
   */
  private int yy_advance() throws java.io.IOException {

    /* standard case */
    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

    /* if the eof is reached, we don't need to work hard */ 
    if (yy_atEOF) return YYEOF;

    /* otherwise: need to refill the buffer */

    /* first: make room (if you can) */
    if (yy_startRead > 0) {
      System.arraycopy(yy_buffer, yy_startRead, 
                       yy_buffer, 0, 
                       yy_endRead-yy_startRead);

      /* translate stored positions */
      yy_endRead-= yy_startRead;
      yy_currentPos-= yy_startRead;
      yy_markedPos-= yy_startRead;
      yy_pushbackPos-= yy_startRead;
      yy_startRead = 0;
    }

    /* is the buffer big enough? */
    if (yy_currentPos >= yy_buffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[yy_currentPos*2];
      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
      yy_buffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
                                            yy_buffer.length-yy_endRead);

    if ( numRead == -1 ) return YYEOF;

    yy_endRead+= numRead;

    return yy_buffer[yy_currentPos++];
  }

    
  /**
   * Closes the input stream.
   */
  final public void yyclose() throws java.io.IOException {
    yy_atEOF = true;            /* indicate end of file */
    yy_endRead = yy_startRead;  /* invalidate buffer    */
    yy_reader.close();
  }


  /**
   * Returns the current lexical state.
   */
  final public int yystate() {
    return yy_lexical_state;
  }

  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  final public void yybegin(int newState) {
    yy_lexical_state = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  final public String yytext() {
    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
  }

  /**
   * Returns the length of the matched text region.
   */
  final public int yylength() {
    return yy_markedPos-yy_startRead;
  }


  /**
   * Reports an error that occured while scanning - from the SED JFlex skeleton
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void yy_ScanError(int errorCode) {
    try {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[errorCode]);
    }
    catch (ArrayIndexOutOfBoundsException e) {
      Logger.log(Logger.ERROR, YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
    }
    // DO NOT EXIT the VM on an error
    // System.exit(1);
  } 


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  void yypushback(int number) {
    if ( number > yylength() )
      yy_ScanError(YY_PUSHBACK_2BIG);

    yy_markedPos -= number;
  }

	/**
	 * user method - skeleton.sed
	 */
	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
		for(int j = 0; j < fBlockMarkers.size(); j++) {
			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
			if(marker.getTagName().length() == tagnameLength) {
				boolean matchesSoFar = true;
				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
					if(marker.isCaseSensitive()) {
						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
							matchesSoFar = false;
					}
					else {
						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
							matchesSoFar = false;
					}
				}
				if(matchesSoFar)
					return true;
			}
		}
		return false;
	}

	/**
	 * user method - skeleton.sed
	 *
	 * Return ALL of the regions scannable within the remaining text
	 * Note: for verification use
	 */
	public final List getRegions() {
		List tokens = new ArrayList();
		ITextRegion region = null;
		try {
			region = getNextToken();
			while(region != null) {
				if (region != null) {
					tokens.add(region);
				}
				region = getNextToken();
			}
		}
		catch (StackOverflowError e) {
			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
			throw e;
		}
		catch (Exception e) {
			// Since this is convenience method and NOT the recommended 
			// way of getting tokens, many errors are simply hidden
			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
		}
		return tokens;
	}
	/**
	 * user method - skeleton.sed
	 */
	private final void dump(String s) {
		if (Debug.debugTokenizer) {
			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
		}
	}
	/* user method  - skeleton.sed */
	public final boolean isEOF() {
		return yy_atEOF;
	}
/* user method - skeleton.sed */
protected final boolean containsTagName(String markerTagName) {
	Iterator blocks = fBlockMarkers.iterator();
	while(blocks.hasNext()) {
		BlockMarker marker = (BlockMarker)blocks.next();
		if(marker.isCaseSensitive()) {
			if(marker.getTagName().equals(markerTagName))
				return true;
		}
		else {
			if(marker.getTagName().equalsIgnoreCase(markerTagName))
				return true;
		}
	}
	return false;
}

  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void yy_do_eof() {
    if (!yy_eof_done) {
      yy_eof_done = true;
    // do nothing, this is the downstream parser's job

    }
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   IOException  if any I/O-Error occurs
   */
  public String primGetNextToken() throws java.io.IOException {
    int yy_input;
    int yy_action;

    yy_pushbackPos = -1;
    boolean yy_was_pushback;

    while (true) {

      yychar+= yylength();

      boolean yy_counted = false;
      for (yy_currentPos = yy_startRead; yy_currentPos < yy_markedPos;
                                                      yy_currentPos++) {
        switch (yy_buffer[yy_currentPos]) {
        case '\r':
          yyline++;
          yy_counted = true;
          break;
        case '\n':
          if (yy_counted)
            yy_counted = false;
          else {
            yyline++;
          }
          break;
        default:
          yy_counted = false;
        }
      }

      if (yy_counted) {
        if ( yy_advance() == '\n' ) yyline--;
        if ( !yy_atEOF ) yy_currentPos--;
      }

      yy_action = -1;

      yy_currentPos = yy_startRead = yy_markedPos;

      yy_state = yy_lexical_state;

      yy_was_pushback = false;

      yy_forAction: {
        while (true) {
    
          yy_input = yy_advance();

          if ( yy_input == YYEOF ) break yy_forAction;

          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
          if (yy_next == -1) break yy_forAction;
          yy_state = yy_next;

          int yy_attributes = YY_ATTRIBUTE[yy_state];
          if ( (yy_attributes & 2) > 0 )
            yy_pushbackPos = yy_currentPos;

          if ( (yy_attributes & 1) > 0 ) {
            yy_was_pushback = (yy_attributes & 4) > 0;
            yy_action = yy_state; 
            yy_markedPos = yy_currentPos; 
            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
          }

        }
      }

      if (yy_was_pushback)
        yy_markedPos = yy_pushbackPos;

      switch (yy_action) {    

        case 124: 
        case 129: 
        case 130: 
        case 290: 
        case 296: 
        case 297: 
        case 431: 
        case 434: 
        case 541: 
          {  /* 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 716: break;
        case 169: 
        case 174: 
        case 175: 
        case 350: 
        case 356: 
        case 357: 
        case 468: 
        case 470: 
        case 472: 
        case 474: 
        case 557: 
          {  /* 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 717: break;
        case 683: 
        case 688: 
        case 695: 
        case 700: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp directive tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_DIRECTIVE_NAME;
 }
        case 718: break;
        case 658: 
          { 
	if(Debug.debugTokenizer)
		dump("XSL processing instruction target");//$NON-NLS-1$
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 719: break;
        case 641: 
        case 644: 
        case 645: 
        case 646: 
        case 647: 
        case 648: 
        case 649: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 720: break;
        case 633: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp:root tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_ROOT_TAG_NAME;
 }
        case 721: break;
        case 624: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 722: break;
        case 623: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 723: break;
        case 622: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 724: break;
        case 607: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_PUBREF;
	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
 }
        case 725: break;
        case 606: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	fEmbeddedHint = XML_DOCTYPE_EXTERNAL_ID_SYSREF;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
 }
        case 726: break;
        case 600: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 727: break;
        case 575: 
        case 616: 
        case 617: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 728: break;
        case 565: 
        case 612: 
        case 613: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 729: break;
        case 556: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 730: break;
        case 543: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("VBL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_VBL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 731: break;
        case 542: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", el-unquoted");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(yylength() > 2)
		yypushback(yylength() -2);
	if(Debug.debugTokenizer)
		dump("EL in attr value");//$NON-NLS-1$
	yybegin(ST_JSP_EL);
	fELlevel++;
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE});
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 732: break;
        case 534: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 733: break;
        case 531: 
          { 
	if(Debug.debugTokenizer)
		dump("\ncomment start");//$NON-NLS-1$
	fEmbeddedHint = XML_COMMENT_TEXT;
	fEmbeddedPostState = ST_XML_COMMENT;
	yybegin(ST_XML_COMMENT);
	return XML_COMMENT_OPEN;
 }
        case 734: break;
        case 530: 
        case 551: 
        case 554: 
        case 558: 
        case 559: 
        case 561: 
        case 563: 
        case 566: 
        case 568: 
        case 569: 
        case 571: 
        case 573: 
        case 576: 
          { 
	/* JSP comment begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(3);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(4);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(4);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(4);
		return scanJSPCommentText();
	}
	else if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)  {
		yybegin(ST_JSP_COMMENT);
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN)
			yybegin(ST_BLOCK_TAG_SCAN);
		return PROXY_CONTEXT;
	}
	// finished sanity checks
	if(yystate()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP comment start");//$NON-NLS-1$
		yybegin(ST_JSP_COMMENT);
		return JSP_COMMENT_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspCommentStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP comment start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_COMMENT);
		// the comment container itself will act as comment text
		fEmbeddedHint = JSP_COMMENT_TEXT;
		assembleEmbeddedContainer(JSP_COMMENT_OPEN, JSP_COMMENT_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		/*
		 * required help for successive embedded regions; mark this one as a
		 * comment so it will be otherwise ignored but preserved (which is why
		 * we can't use white-space)
		 */
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			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 735: break;
        case 415: 
        case 416: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 736: break;
        case 414: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 737: break;
        case 413: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 738: break;
        case 412: 
          { 
	yybegin(ST_JSP_VBL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_VBL_OPEN, JSP_VBL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 739: break;
        case 411: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 740: break;
        case 410: 
          { 
	yybegin(ST_JSP_EL);
	if(yylength() > 2)
		yypushback(yylength() - 2);
	fELlevel++;
	fEmbeddedHint = XML_CONTENT;
	fEmbeddedPostState = YYINITIAL;
	assembleEmbeddedContainer(JSP_EL_OPEN, JSP_EL_CLOSE);
	fEmbeddedHint = XML_CONTENT;
	yybegin(YYINITIAL);
	return PROXY_CONTEXT;
 }
        case 741: break;
        case 407: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 742: break;
        case 401: 
        case 455: 
        case 465: 
        case 480: 
        case 485: 
        case 490: 
        case 495: 
        case 501: 
        case 507: 
        case 511: 
        case 516: 
        case 521: 
        case 527: 
          { 
	/* JSP expression begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just an expression out in content
		if(Debug.debugTokenizer)
			dump("\nJSP expression start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_EXPRESSION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspExpressionStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP expression start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_EXPRESSION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			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 743: break;
        case 400: 
        case 454: 
        case 464: 
        case 479: 
        case 484: 
        case 489: 
        case 494: 
        case 500: 
        case 506: 
        case 510: 
        case 515: 
        case 520: 
        case 526: 
          { 
	/* JSP declaration begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a declaration out in content
		if(Debug.debugTokenizer)
			dump("\nJSP declaration start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_DECLARATION_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDeclarationStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP declaration start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_DECLARATION_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			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 744: break;
        case 399: 
        case 453: 
        case 463: 
        case 478: 
        case 483: 
        case 488: 
        case 493: 
        case 499: 
        case 505: 
        case 509: 
        case 514: 
        case 519: 
        case 525: 
          { 
	/* JSP directive begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(2);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(3);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(3);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(3);
		return scanJSPCommentText();
	}
	// end sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a declaration out in content
		if(Debug.debugTokenizer)
			dump("\nJSP directive start");//$NON-NLS-1$
		yybegin(ST_JSP_DIRECTIVE_NAME);
		return JSP_DIRECTIVE_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspDirectiveStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP declaration start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_DIRECTIVE_NAME);
		assembleEmbeddedContainer(JSP_DIRECTIVE_OPEN, new String[]{JSP_DIRECTIVE_CLOSE, JSP_CLOSE});
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		return PROXY_CONTEXT;
	}
 }
        case 745: break;
        case 389: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 746: break;
        case 385: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 747: break;
        case 383: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 748: break;
        case 373: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 749: break;
        case 369: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 750: break;
        case 367: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 751: break;
        case 366: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 752: break;
        case 363: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_VBL);
	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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 753: break;
        case 362: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_EL);
	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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_DQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 754: break;
        case 361: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_VBL);
	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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 755: break;
        case 360: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_EL);
	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) || fEmbeddedContainer.getLastRegion().getType().equals(JSP_TAG_ATTRIBUTE_VALUE_SQUOTE)) {
		yybegin(ST_ABORT_EMBEDDED);
		fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	}
	else {
		yybegin(enterState);
	}
	return PROXY_CONTEXT;
 }
        case 756: break;
        case 358: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericEndTagOpen");//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - end tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_END_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 757: break;
        case 302: 
        case 316: 
        case 322: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 758: break;
        case 288: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * 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 || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 759: break;
        case 286: 
          { 
	String tagName = yytext().substring(1);
	// pushback to just after the opening bracket
	yypushback(yylength() - 1);
	/*
	 * 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 || fStateStack.peek() == ST_JSP_ATTRIBUTE_VALUE))) {
		yybegin(ST_XML_TAG_NAME);
		return XML_TAG_OPEN;
	}
	if(Debug.debugTokenizer)
		dump("tag in place of attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	// embedded container should be looking for the name (again) next
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
	fStateStack.pop();
	yybegin(ST_XML_EQUALS);
	return PROXY_CONTEXT;
 }
        case 760: break;
        case 284: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$

	if (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_EMPTY_TAG_CLOSE;
 }
        case 761: break;
        case 275: 
          { 
	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 762: break;
        case 273: 
          { 
	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 763: break;
        case 127: 
        case 172: 
          { 
	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;
	yybegin(ST_XML_ATTRIBUTE_VALUE_DQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex double quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 764: break;
        case 125: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", unquoted genericTagOpen");//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP tag embedded name start - start tag");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	fStateStack.pop();
        yybegin(ST_XML_ATTRIBUTE_NAME);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	return PROXY_CONTEXT;
 }
        case 765: break;
        case 123: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(isJspTag() ? ST_JSP_ATTRIBUTE_VALUE : ST_XML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 766: break;
        case 122: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 767: break;
        case 118: 
        case 119: 
        case 120: 
        case 285: 
        case 428: 
        case 540: 
        case 581: 
        case 582: 
        case 601: 
        case 602: 
        case 620: 
        case 621: 
        case 634: 
        case 643: 
        case 651: 
        case 653: 
        case 655: 
        case 657: 
        case 660: 
        case 666: 
        case 667: 
        case 668: 
        case 669: 
        case 670: 
        case 676: 
        case 677: 
        case 678: 
        case 679: 
        case 680: 
        case 686: 
        case 687: 
        case 689: 
        case 690: 
        case 696: 
        case 697: 
        case 698: 
        case 699: 
        case 705: 
        case 706: 
        case 707: 
        case 708: 
        case 711: 
        case 712: 
        case 714: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
    boolean jspTag = tagname.indexOf(':') != -1;
	if (fEmbeddedContainer != null) {
    	fEmbeddedTag = jspTag;
		fInTagEmbedded = true;
    }
	else {
		fContainerTag = jspTag;
		fInTagContainer = true;
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 768: break;
        case 116: 
          { 
	if(Debug.debugTokenizer)
		dump("tag close");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	if(isBlockMarker()) {
		fEmbeddedHint = getBlockMarkerContext();
		fEmbeddedPostState = ST_BLOCK_TAG_SCAN;
        	yybegin(ST_BLOCK_TAG_SCAN);
	}
	else
        	yybegin(YYINITIAL);

	if (fEmbeddedContainer != null)
		fInTagEmbedded = false;
	else
		fInTagContainer = false;

	return XML_TAG_CLOSE;
 }
        case 769: break;
        case 109: 
        case 113: 
        case 278: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 770: break;
        case 108: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 771: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 772: break;
        case 104: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 773: break;
        case 100: 
        case 101: 
        case 102: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 774: break;
        case 96: 
        case 98: 
        case 99: 
        case 266: 
        case 267: 
        case 268: 
        case 271: 
        case 272: 
        case 422: 
        case 425: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 775: break;
        case 95: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 776: break;
        case 94: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 777: break;
        case 92: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 778: break;
        case 86: 
        case 88: 
        case 255: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 779: break;
        case 85: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction '='");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 780: break;
        case 50: 
        case 209: 
        case 210: 
        case 213: 
        case 223: 
        case 224: 
        case 227: 
        case 228: 
        case 394: 
        case 397: 
        case 504: 
        case 518: 
        case 524: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 781: break;
        case 43: 
        case 187: 
        case 188: 
        case 191: 
        case 201: 
        case 202: 
        case 206: 
        case 207: 
        case 364: 
        case 378: 
        case 381: 
        case 476: 
        case 477: 
        case 492: 
        case 498: 
          { 
	return JSP_EL_CONTENT;
 }
        case 782: break;
        case 35: 
        case 161: 
        case 162: 
        case 346: 
        case 462: 
        case 466: 
        case 555: 
        case 589: 
        case 609: 
        case 626: 
        case 636: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 783: break;
        case 33: 
        case 154: 
        case 155: 
        case 334: 
        case 452: 
        case 456: 
        case 552: 
        case 588: 
        case 608: 
        case 625: 
        case 635: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 784: break;
        case 22: 
        case 114: 
          { 
	if(Debug.debugTokenizer)
		dump("inappropriate tag name");//$NON-NLS-1$
	if(!fStateStack.empty() && (fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_SQUOTED||fStateStack.peek()==ST_XML_ATTRIBUTE_VALUE_DQUOTED)) {
		yybegin(ST_ABORT_EMBEDDED);
		yypushback(yylength()-1);
		return XML_TAG_ATTRIBUTE_VALUE;
	}
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 785: break;
        case 18: 
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 786: break;
        case 5: 
        case 8: 
        case 9: 
        case 10: 
        case 12: 
        case 13: 
        case 14: 
        case 15: 
        case 17: 
        case 19: 
        case 20: 
        case 21: 
        case 23: 
        case 24: 
        case 25: 
        case 26: 
        case 27: 
        case 28: 
        case 29: 
        case 30: 
        case 31: 
        case 32: 
        case 34: 
        case 40: 
        case 41: 
        case 42: 
        case 74: 
        case 178: 
        case 183: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 787: break;
        case 0: 
        case 57: 
        case 60: 
        case 61: 
        case 63: 
        case 235: 
        case 237: 
        case 238: 
        case 241: 
        case 243: 
        case 404: 
        case 405: 
        case 406: 
        case 533: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 788: break;
        case 58: 
        case 103: 
        case 115: 
        case 121: 
        case 131: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 789: break;
        case 59: 
        case 62: 
        case 66: 
        case 67: 
        case 68: 
        case 72: 
        case 73: 
        case 83: 
        case 87: 
        case 89: 
        case 90: 
        case 91: 
        case 93: 
        case 97: 
        case 105: 
        case 110: 
        case 111: 
        case 112: 
        case 117: 
        case 126: 
        case 133: 
        case 134: 
        case 135: 
        case 136: 
        case 138: 
        case 139: 
        case 141: 
        case 142: 
        case 143: 
        case 146: 
        case 147: 
        case 148: 
        case 151: 
        case 152: 
        case 153: 
        case 158: 
        case 159: 
        case 160: 
        case 168: 
        case 170: 
        case 171: 
        case 193: 
        case 194: 
        case 196: 
        case 197: 
        case 204: 
        case 208: 
        case 215: 
        case 216: 
        case 218: 
        case 219: 
        case 225: 
        case 229: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 790: break;
        case 64: 
        case 65: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA text");//$NON-NLS-1$
	fEmbeddedPostState = ST_CDATA_TEXT;
	fEmbeddedHint = XML_CDATA_TEXT;
	String returnedContext = doScan("]]>", false, true, true, XML_CDATA_TEXT, ST_CDATA_END,  ST_CDATA_END);//$NON-NLS-1$
	if(returnedContext == XML_CDATA_TEXT)
		yybegin(ST_CDATA_END);
	return returnedContext;
 }
        case 791: break;
        case 69: 
        case 195: 
        case 198: 
        case 217: 
        case 220: 
          { 
	if(Debug.debugTokenizer)
		dump("LINE FEED");//$NON-NLS-1$
	return WHITE_SPACE;
 }
        case 792: break;
        case 70: 
        case 71: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 793: break;
        case 75: 
        case 76: 
        case 77: 
        case 78: 
        case 248: 
        case 249: 
        case 250: 
        case 417: 
        case 536: 
        case 537: 
        case 579: 
        case 580: 
        case 599: 
        case 619: 
        case 632: 
        case 642: 
        case 650: 
        case 652: 
        case 654: 
        case 656: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 794: break;
        case 79: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 795: break;
        case 80: 
        case 81: 
        case 82: 
          { 
		// 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 796: break;
        case 84: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 797: break;
        case 128: 
        case 173: 
          { 
	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+", "+type);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
	yybegin(ST_XML_ATTRIBUTE_VALUE_SQUOTED);
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("JSP attribute value start - complex single quoted");//$NON-NLS-1$
	assembleEmbeddedContainer(type, type);
	fStateStack.pop();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
	return PROXY_CONTEXT;
 }
        case 798: break;
        case 132: 
          { 
	if(Debug.debugTokenizer)
		dump("declaration end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 799: break;
        case 137: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 800: break;
        case 140: 
        case 144: 
        case 307: 
        case 312: 
        case 444: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype public reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
 }
        case 801: break;
        case 145: 
        case 149: 
        case 319: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype system reference");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_DECLARATION_CLOSE);
	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
 }
        case 802: break;
        case 150: 
        case 325: 
        case 330: 
        case 449: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
	return XML_ELEMENT_DECL_NAME;
 }
        case 803: break;
        case 156: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 804: break;
        case 157: 
        case 337: 
        case 342: 
        case 459: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist name");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	fEmbeddedPostState = YYINITIAL;
	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
	return XML_ATTLIST_DECL_NAME;
 }
        case 805: break;
        case 163: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 806: break;
        case 166: 
        case 167: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 807: break;
        case 176: 
        case 180: 
        case 181: 
        case 182: 
        case 185: 
        case 186: 
        case 359: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 808: break;
        case 177: 
          { 
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", genericTagOpen");//$NON-NLS-1$
	}
	int incomingState = yystate();
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
	if(Debug.debugTokenizer)
		dump("tag inside of JSP attribute value start");//$NON-NLS-1$
	yybegin(ST_XML_TAG_NAME);
	assembleEmbeddedContainer(XML_TAG_OPEN, new String[]{XML_TAG_CLOSE,XML_EMPTY_TAG_CLOSE});
	if(yystate() != ST_ABORT_EMBEDDED)
        yybegin(incomingState);
	return PROXY_CONTEXT;
 }
        case 809: break;
        case 179: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 810: break;
        case 184: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 811: break;
        case 189: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 812: break;
        case 190: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 813: break;
        case 192: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 814: break;
        case 199: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 815: break;
        case 200: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 816: break;
        case 203: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 817: break;
        case 205: 
          { 
	return JSP_EL_CLOSE;
 }
        case 818: break;
        case 211: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 819: break;
        case 212: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 820: break;
        case 214: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 821: break;
        case 221: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 822: break;
        case 222: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 823: break;
        case 226: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 824: break;
        case 230: 
          { 
	if(Debug.debugTokenizer)
		dump("\nend tag open");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_NAME;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
        yybegin(ST_XML_TAG_NAME);
        return XML_END_TAG_OPEN;
 }
        case 825: break;
        case 231: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 826: break;
        case 232: 
        case 333: 
        case 345: 
        case 365: 
        case 370: 
        case 374: 
        case 377: 
        case 380: 
        case 382: 
        case 386: 
        case 390: 
        case 393: 
        case 396: 
          { 
	/* JSP scriptlet begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  incoming state must be checked to see if it's erroneous
	 *  due to the order of precedence generated
	 */
	// begin sanity checks
	if(yystate() == ST_JSP_CONTENT) {
		// at the beginning?!
		yypushback(1);
		return JSP_CONTENT;
	}
	else if(yystate() == ST_BLOCK_TAG_SCAN) {
		yypushback(2);
		return doBlockTagScan();
	}
	else if(yystate() == ST_XML_COMMENT) {
		yypushback(2);
		return scanXMLCommentText();
	}
	else if(yystate() == ST_JSP_COMMENT) {
		yypushback(2);
		return scanJSPCommentText();
	}
	// finished sanity checks
	fStateStack.push(yystate());
	if(fStateStack.peek()==YYINITIAL) {
		// the simple case, just a regular scriptlet out in content
		if(Debug.debugTokenizer)
			dump("\nJSP scriptlet start");//$NON-NLS-1$
		yybegin(ST_JSP_CONTENT);
		return JSP_SCRIPTLET_OPEN;
	}
	else {
		if (Debug.debugTokenizer) {
			System.out.println("begin embedded region: " + fEmbeddedHint+", jspScriptletStart");//$NON-NLS-1$
		}
		if(Debug.debugTokenizer)
			dump("JSP scriptlet start");//$NON-NLS-1$
		if(yystate() == ST_XML_ATTRIBUTE_VALUE_DQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE_SQUOTED)
			fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_SQUOTED;
		else if(yystate() == ST_CDATA_TEXT) {
			fEmbeddedPostState = ST_CDATA_TEXT;
			fEmbeddedHint = XML_CDATA_TEXT;
		}
		yybegin(ST_JSP_CONTENT);
		assembleEmbeddedContainer(JSP_SCRIPTLET_OPEN, JSP_CLOSE);
		if(yystate() == ST_BLOCK_TAG_INTERNAL_SCAN) {
			yybegin(ST_BLOCK_TAG_SCAN);
			return BLOCK_TEXT;
		}
		// required help for successive embedded regions
		if(yystate() == ST_XML_TAG_NAME) {
			fEmbeddedHint = XML_TAG_NAME;
			fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
		}
		else if((yystate() == ST_XML_ATTRIBUTE_NAME || yystate() == ST_XML_EQUALS)) {
			fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
			fEmbeddedPostState = ST_XML_EQUALS;
		}
		else if(yystate() == ST_XML_ATTRIBUTE_VALUE) {
			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 827: break;
        case 233: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 828: break;
        case 247: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 829: break;
        case 251: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 830: break;
        case 252: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 831: break;
        case 164: 
        case 165: 
          { 
		return doBlockTagScan();
	 }
        case 832: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
