/* The following code was generated by JFlex 1.2.2 on 10/15/09 3:23 PM */

/*******************************************************************************
 * 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 10/15/09 3:23 PM from the specification file
 * <tt>file:/D:/dev/workspaces/wtp3.2/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;
	boolean wasBlockingEnabled = fIsBlockingEnabled;
	try {
		// 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 && same; i++) {
							if(fIsCaseSensitiveBlocking)
								same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
							else
								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;
	}
	finally {
		fIsBlockingEnabled = wasBlockingEnabled;
	}
}
/**
 * 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);
          }
      }
    }
  }    


}
