/* The following code was generated by JFlex 1.2.2 on 2/19/09 5:27 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.contenttype.BooleanStack;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
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 2/19/09 5:27 PM from the specification file
 * <tt>file:/D:/dev/workspaces/wtp3isolation/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,  4473,  4544,  4615,  4473,  4473, 
     4544,  4686,  4757,  4828,  4899,  4970,  5041,  5112,  5183,  4473, 
     4544,  5254,  5325,  5396,  4473,  5467,  5467,  5538,  5609,  5680, 
     5254,  4473,  5751,  5822,  4473,  5893,  5964,  6035,  6106,  4473, 
     4544,  6177,  6248,  6319,  6390,  6461,  6532,  4473,  6603,  6603, 
     6674,  6745,  6816,  6887,  6958,  4473,  7029,  7100,  7171,  7242, 
     7313,  7384,  4473,  7455,  7526,  7597,  7668,  7739,  7810,  7881, 
     7952,  4473,  8023,  8094,  8165,  8236,  8307,  8378,  8449,  8520, 
     8520,  8591,  8662,  8733,  8804,  8804,  8875,  8946,  9017,  9088, 
     9088,  9159,  9230,  9301,  9372,  4473,  9443,  9443,  9514,  9585, 
     9656,  9727,  4473,  4473,  4544,  4473,  4544,  9798,  9869,  7526, 
     9940, 10011, 10082, 10153, 10224, 10295, 10366, 10437,  4473, 10508, 
    10579, 10650, 10721,  4473, 10792, 10863, 10934, 11005,  4473,  4473, 
    11076,  4473, 11147, 11218, 11147, 11289, 11360, 11289,  4473,  4473, 
    11431, 11502,  4473, 11573,  4473, 11644, 11715, 11786, 11857, 11928, 
     4473,  4473, 11999,  4473, 12070, 12141, 12070, 12212, 12283, 12212, 
     4473,  4473, 12354, 12425, 12496,  4473, 12567, 12638, 12709,  4473, 
     4473, 12780, 12851, 12922, 12993, 13064,  4473, 13135, 13206, 13277, 
    13348, 13419, 13490, 13561, 13632,  4473, 13703, 13774, 13845,  4473, 
     4473,  5467,  5609,  4473, 13916,  5680, 13987,  5751,  5893,  5964, 
    14058,  6035,  4473, 14129, 14200,  6106, 14271,  4473, 12851,  4473, 
     6603,  6674,  4473, 14342,  6745, 14413,  4473, 14484, 14555,  7455, 
    14626,  7668,  4473, 14697,  7739, 14768, 14839, 14910, 14981, 15052, 
    15123,  8236,  4473, 15194, 15265,  8520,  8591,  4473, 15336, 15407, 
    15478, 15549, 15620,  8733,  8520,  8804,  8875,  4473,  8946,  9017, 
     8804,  9088,  9159,  4473, 15691, 15762, 15833, 15904, 15975, 16046, 
    16117,  9443,  9514,  4473, 16188, 16259, 16330, 16401, 16472, 16543, 
    16614, 16685,  9869, 10011,  4473, 16756, 16827, 10082, 16898, 16969, 
    17040, 17111,  4473, 17182,  4473,  4473,  4473,  4473, 17253, 17324, 
    17395, 17466, 11147,  4473, 17537, 17608, 11289,  4473, 17679, 17750, 
    17821, 17892, 17963, 18034, 18105, 18176, 18247, 11857, 12070,  4473, 
    18318, 18389, 12212,  4473, 18460, 18531, 18602, 18673, 18744, 18815, 
    18886, 18957, 19028,  4473,  4473,  4473, 19099, 19170, 19241, 19312, 
    19383,  4473, 19454, 19525,  4473,  4473,  4473,  4473,  4473,  4899, 
    19596, 19667, 19738, 19809, 19880, 19951, 20022, 19951, 20093, 20164, 
    20093, 20235, 20306, 20377, 20448, 20519, 20590, 20661, 20661, 20732, 
    20803, 20803, 20874,  9301,  9301,  9301, 20945, 21016, 21087, 21087, 
    21158,  9656,  9656,  9656, 21229, 21300, 10011, 10082, 21371, 21371, 
    21442, 21442, 17395, 21513, 10934, 10934, 10934, 21584, 21655, 11147, 
    11147, 11147, 21726, 21797, 11289, 11289, 11289, 21868, 21939, 11431, 
    11431, 11431, 17963, 22010, 22081, 11644, 11644, 11644, 18176, 22152, 
    22223, 11857, 11857, 11857, 22294, 12070, 12070, 12070, 22365, 22436, 
    12212, 12212, 12212, 22507, 22578, 12354, 12354, 12354, 18744, 22649, 
    22720, 12567, 12567, 12567, 18957, 22791,  4473,  4473, 22862, 22933, 
     4473, 23004, 23075, 23146, 23217,  7455,  4473,  4473, 23288, 23359, 
    23430, 23501, 23572, 15549, 15904,  9301, 23643, 16401,  9656, 23714, 
     4473,  9869, 10934, 11147, 23785, 11289, 23856, 11431, 23927,  4473, 
    11644, 23998, 11857, 12070, 24069, 12212, 24140, 12354, 24211,  4473, 
    12567, 24282, 24353, 24424, 24495, 24566, 24637, 24708, 24779, 24850, 
    24921, 24992, 25063, 25134, 25205, 25276, 25347, 25418, 25489, 25560, 
    25631, 25702, 25773, 25844,  4899, 25915, 25986, 26057, 26128, 26199, 
     4473,  4473, 26270, 26341, 26412, 26483, 17963, 18176, 26554, 26625, 
    18744, 18957, 26696, 26767, 26838, 26909,  4473,  4473,  4473, 26980, 
    27051, 27122, 27193, 27264, 27335, 27406, 27477,  7171, 27548, 27619, 
    27690, 27761, 27832, 27903, 27974,  4473, 28045, 28116,  9301,  9656, 
    11147, 11289, 12070, 12212, 28187, 28258, 28329, 28400, 28471, 28542, 
    28613, 28684,  4899, 28755, 28826, 28897, 28968, 29039, 29110, 29181, 
    29252, 29323, 29394, 29465, 29536, 29607, 29678, 29749, 29820, 29891, 
    29962, 30033, 30104, 30175, 30246, 30317, 30388, 30459, 30530, 30601, 
    30672, 30743, 30814, 30885, 30956, 31027, 31098, 31169, 31240,  4473, 
    31311, 31382, 31453, 31524,  7171, 31595, 31666, 31737, 31808, 31879, 
    31950, 32021, 32092, 32163, 32234, 32305, 32376, 32447, 32518
  };

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

  /** 
   * The transition table of the DFA
   */
  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,  9, 
     1,  9,  1,  1,  9,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9, 
     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  9,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
     1,  1,  9,  9,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  9,  1,  9, 
     3,  3,  3,  3,  3,  3,  9,  9,  1,  1,  9,  1,  9,  1,  1,  1, 
     1,  1,  9,  9,  1,  9,  3,  3,  3,  3,  3,  3,  9,  9,  1,  1, 
     1,  9,  1,  1,  1,  9,  9,  1,  1,  0,  1,  0,  9,  1,  2,  1, 
     2,  1,  0,  0,  0,  9,  1,  1,  1,  9,  9,  0,  0,  9,  0,  0, 
     0,  0,  0,  0,  0,  0,  9,  1,  0,  0,  1,  9,  0,  9,  0,  0, 
     9,  0,  0,  0,  9,  1,  1,  0,  1,  0,  9,  0,  0,  0,  1,  1, 
     0,  0,  0,  0,  9,  0,  0,  0,  0,  9,  0,  0,  0,  1,  0,  0, 
     1,  0,  0,  9,  0,  0,  1,  0,  0,  9,  0,  0,  0,  1,  0,  1, 
     1,  0,  0,  9,  0,  0,  0,  1,  0,  1,  1,  0,  0,  0,  9,  0, 
     0,  0,  0,  0,  1,  1,  9,  1,  9,  9,  9,  9,  1,  1,  1,  1, 
     2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  1,  1, 
     2, 13,  3,  2,  2, 13,  3,  2,  0,  1,  1,  0,  1,  1,  0,  9, 
     9,  9,  0,  0,  1,  1,  1,  9,  0,  0, 13,  9, 13,  9,  9,  1, 
     1,  1,  0,  0,  1,  3,  2,  2,  3,  2,  2,  0,  0,  0,  0,  0, 
     0,  1,  0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  1,  0,  1,  1, 
     1,  1,  1,  0,  1,  1,  3,  2,  3,  2,  1,  1,  1,  1,  1,  0, 
     2,  3,  3,  3,  2,  2,  3,  3,  3,  2,  1,  1,  1,  1,  0,  0, 
     1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  2,  3,  3,  3,  2,  2, 
     3,  3,  3,  2,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  0,  0, 
     9,  9,  0,  1,  9,  0,  1,  1,  1,  5, 13, 13,  0,  0,  0,  0, 
     0,  0,  0,  1,  1,  0,  1,  1,  9,  5,  1,  3,  2,  3,  2,  1, 
     0,  9,  1,  0,  1,  3,  2,  3,  2,  1,  0,  9,  1,  0,  0,  1, 
     1,  1,  1,  0,  0,  0,  0,  0,  1,  1,  2,  2,  0,  0,  2,  2, 
     0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  9,  9,  1,  1,  2,  2, 
     1,  1,  2,  2,  1,  1,  0,  1,  1,  1,  9,  9,  9,  1,  1,  2, 
     2,  2,  2,  0,  1,  1,  1,  1,  1,  2,  2,  2,  2,  9,  1,  1, 
     1,  1,  3,  3,  3,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0, 
     1,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0, 
     1,  1,  1,  1,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0, 
     0,  0,  0,  9,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  1,  1, 
     1,  0,  0,  1,  1,  0,  1
  };

  /** the input device */
  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;
	
	private BooleanStack fJspTagStack = new BooleanStack();
	
	// 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();

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

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


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


  /**
   * 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[32589];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 8702) {
      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 123: 
        case 128: 
        case 129: 
        case 282: 
        case 286: 
        case 287: 
        case 405: 
        case 408: 
        case 505: 
          {  /* only allow for non-JSP tags for this does not obey JSP quoting rules */
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 680: break;
        case 168: 
        case 173: 
        case 174: 
        case 334: 
        case 340: 
        case 341: 
        case 436: 
        case 437: 
        case 438: 
        case 440: 
        case 521: 
          {  /* JSP attribute values have escape semantics */
	if(Debug.debugTokenizer)
		dump("jsp attr value");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
	yybegin(ST_XML_ATTRIBUTE_NAME);
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 681: break;
        case 647: 
        case 652: 
        case 659: 
        case 664: 
          { 
	if(Debug.debugTokenizer)
		dump("jsp directive tag name");//$NON-NLS-1$
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return JSP_DIRECTIVE_NAME;
 }
        case 682: break;
        case 622: 
          { 
	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 683: break;
        case 605: 
        case 608: 
        case 609: 
        case 610: 
        case 611: 
        case 612: 
        case 613: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 684: break;
        case 597: 
          { 
	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 685: break;
        case 588: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 686: break;
        case 587: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 687: break;
        case 586: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 688: break;
        case 571: 
          { 
	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 689: break;
        case 570: 
          { 
	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 690: break;
        case 564: 
          { 
	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 691: break;
        case 539: 
        case 580: 
        case 581: 
          { 
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 692: break;
        case 529: 
        case 576: 
        case 577: 
          { 
	return JSP_EL_QUOTED_CONTENT;
 }
        case 693: break;
        case 520: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment close");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return JSP_COMMENT_CLOSE;
 }
        case 694: break;
        case 507: 
          { 
	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 695: break;
        case 506: 
          { 
	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 696: break;
        case 500: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 697: break;
        case 497: 
          { 
	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 698: break;
        case 496: 
        case 515: 
        case 518: 
        case 522: 
        case 523: 
        case 525: 
        case 527: 
        case 530: 
        case 532: 
        case 533: 
        case 535: 
        case 537: 
        case 540: 
          { 
	/* JSP comment begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  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 699: break;
        case 399: 
        case 400: 
          { 
	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 700: break;
        case 398: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 701: break;
        case 397: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 702: break;
        case 396: 
          { 
	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 703: break;
        case 395: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 704: break;
        case 394: 
          { 
	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 705: break;
        case 391: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 706: break;
        case 385: 
        case 425: 
        case 433: 
        case 446: 
        case 451: 
        case 456: 
        case 461: 
        case 467: 
        case 473: 
        case 477: 
        case 482: 
        case 487: 
        case 493: 
          { 
	/* JSP expression begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  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 707: break;
        case 384: 
        case 424: 
        case 432: 
        case 445: 
        case 450: 
        case 455: 
        case 460: 
        case 466: 
        case 472: 
        case 476: 
        case 481: 
        case 486: 
        case 492: 
          { 
	/* JSP declaration begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  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 708: break;
        case 383: 
        case 423: 
        case 431: 
        case 444: 
        case 449: 
        case 454: 
        case 459: 
        case 465: 
        case 471: 
        case 475: 
        case 480: 
        case 485: 
        case 491: 
          { 
	/* JSP directive begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  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 709: break;
        case 373: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 710: break;
        case 369: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES_END);
	return JSP_VBL_QUOTED_CONTENT;
 }
        case 711: break;
        case 367: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_VBL_OPEN;
	}
 }
        case 712: break;
        case 357: 
          { 
	yybegin(ST_JSP_EL_DQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 713: break;
        case 353: 
          { 
	yybegin(ST_JSP_EL_SQUOTES_END);
	return JSP_EL_QUOTED_CONTENT;
 }
        case 714: break;
        case 351: 
          { 
	//System.out.println(JSP_EL_CONTENT+ ":[" + yytext() + "]");
	return JSP_EL_CONTENT;
 }
        case 715: break;
        case 350: 
          { 
	fELlevel++;
	if(fELlevel == 1) {
		return JSP_EL_OPEN;
	}
 }
        case 716: break;
        case 347: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, 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 717: break;
        case 346: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_DQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_DQUOTE, 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 718: break;
        case 345: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_VBL);
	assembleEmbeddedContainer(JSP_VBL_OPEN, new String[]{JSP_VBL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, 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 719: break;
        case 344: 
          { 
	int enterState = yystate();
	yybegin(ST_JSP_SQUOTED_EL);
	assembleEmbeddedContainer(JSP_EL_OPEN, new String[]{JSP_EL_CLOSE, XML_TAG_ATTRIBUTE_VALUE_SQUOTE, 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 720: break;
        case 342: 
          { 
	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 721: break;
        case 292: 
        case 304: 
        case 310: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 722: break;
        case 280: 
          { 
	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 723: break;
        case 278: 
          { 
	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 724: break;
        case 276: 
          { 
        yybegin(YYINITIAL);
	fEmbeddedHint = UNDEFINED;
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$
		if (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_EMPTY_TAG_CLOSE;
 }
        case 725: break;
        case 269: 
          { 
	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 726: break;
        case 267: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return JSP_CLOSE;
 }
        case 727: break;
        case 126: 
        case 171: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_DQUOTE : JSP_TAG_ATTRIBUTE_VALUE_DQUOTE;

	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+type);//$NON-NLS-1$
	}
	fEmbeddedHint = XML_TAG_ATTRIBUTE_VALUE;
	fEmbeddedPostState = ST_XML_ATTRIBUTE_VALUE_DQUOTED;
	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 728: break;
        case 124: 
          { 
	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 729: break;
        case 122: 
          { 
	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 730: break;
        case 121: 
          { 
	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 731: break;
        case 117: 
        case 118: 
        case 119: 
        case 277: 
        case 404: 
        case 504: 
        case 545: 
        case 546: 
        case 565: 
        case 566: 
        case 584: 
        case 585: 
        case 598: 
        case 607: 
        case 615: 
        case 617: 
        case 619: 
        case 621: 
        case 624: 
        case 630: 
        case 631: 
        case 632: 
        case 633: 
        case 634: 
        case 640: 
        case 641: 
        case 642: 
        case 643: 
        case 644: 
        case 650: 
        case 651: 
        case 653: 
        case 654: 
        case 660: 
        case 661: 
        case 662: 
        case 663: 
        case 669: 
        case 670: 
        case 671: 
        case 672: 
        case 675: 
        case 676: 
        case 678: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
    String tagname = yytext();
	fJspTagStack.push(tagname.indexOf(':') != -1);
	fEmbeddedHint = XML_TAG_ATTRIBUTE_NAME;
	fEmbeddedPostState = ST_XML_EQUALS;
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 732: break;
        case 115: 
          { 
	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 (!fJspTagStack.empty())
			fJspTagStack.pop();
        return XML_TAG_CLOSE;
 }
        case 733: break;
        case 108: 
        case 112: 
        case 272: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 734: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 735: break;
        case 106: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_JSP_DIRECTIVE_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 736: break;
        case 103: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP directive name");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_NAME_WHITESPACE);
	return JSP_DIRECTIVE_NAME;
 }
        case 737: break;
        case 99: 
        case 100: 
        case 101: 
          { 
	if(Debug.debugTokenizer)
		dump("JSP code content");//$NON-NLS-1$
	return doScan("%>", false, false, false, JSP_CONTENT, ST_JSP_CONTENT, ST_JSP_CONTENT);
 }
        case 738: break;
        case 95: 
        case 97: 
        case 98: 
        case 262: 
        case 263: 
        case 266: 
          { 
	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 739: break;
        case 94: 
          { 
	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 740: break;
        case 93: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 741: break;
        case 91: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 742: break;
        case 85: 
        case 87: 
        case 253: 
          { 
	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 743: break;
        case 84: 
          { 
	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 744: break;
        case 50: 
        case 208: 
        case 209: 
        case 212: 
        case 222: 
        case 223: 
        case 226: 
        case 227: 
        case 378: 
        case 381: 
        case 470: 
        case 484: 
        case 490: 
          { 
	return JSP_VBL_CONTENT;
 }
        case 745: break;
        case 43: 
        case 186: 
        case 187: 
        case 190: 
        case 200: 
        case 201: 
        case 205: 
        case 206: 
        case 348: 
        case 362: 
        case 365: 
        case 442: 
        case 443: 
        case 458: 
        case 464: 
          { 
	return JSP_EL_CONTENT;
 }
        case 746: break;
        case 35: 
        case 160: 
        case 161: 
        case 330: 
        case 430: 
        case 434: 
        case 519: 
        case 553: 
        case 573: 
        case 590: 
        case 600: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 747: break;
        case 33: 
        case 153: 
        case 154: 
        case 320: 
        case 422: 
        case 426: 
        case 516: 
        case 552: 
        case 572: 
        case 589: 
        case 599: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 748: break;
        case 22: 
        case 113: 
          { 
	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 749: break;
        case 18: 
        case 105: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
	yybegin(ST_JSP_DIRECTIVE_ATTRIBUTE_NAME);
	return WHITE_SPACE;
 }
        case 750: 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 73: 
        case 177: 
        case 182: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 751: break;
        case 0: 
        case 57: 
        case 60: 
        case 62: 
        case 234: 
        case 236: 
        case 237: 
        case 239: 
        case 241: 
        case 388: 
        case 389: 
        case 390: 
        case 499: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 752: break;
        case 58: 
        case 102: 
        case 114: 
        case 120: 
        case 130: 
          { 
	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 753: break;
        case 59: 
        case 61: 
        case 65: 
        case 66: 
        case 67: 
        case 71: 
        case 72: 
        case 82: 
        case 86: 
        case 88: 
        case 89: 
        case 90: 
        case 92: 
        case 96: 
        case 104: 
        case 109: 
        case 110: 
        case 111: 
        case 116: 
        case 125: 
        case 132: 
        case 133: 
        case 134: 
        case 135: 
        case 137: 
        case 138: 
        case 140: 
        case 141: 
        case 142: 
        case 145: 
        case 146: 
        case 147: 
        case 150: 
        case 151: 
        case 152: 
        case 157: 
        case 158: 
        case 159: 
        case 167: 
        case 169: 
        case 170: 
        case 192: 
        case 193: 
        case 195: 
        case 196: 
        case 203: 
        case 207: 
        case 214: 
        case 215: 
        case 217: 
        case 218: 
        case 224: 
        case 228: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 754: break;
        case 63: 
        case 64: 
          { 
	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 755: break;
        case 68: 
        case 194: 
        case 197: 
        case 216: 
        case 219: 
          { 
	if(Debug.debugTokenizer)
		dump("LINE FEED");//$NON-NLS-1$
	return WHITE_SPACE;
 }
        case 756: break;
        case 69: 
        case 70: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 757: break;
        case 74: 
        case 75: 
        case 76: 
        case 77: 
        case 246: 
        case 247: 
        case 248: 
        case 401: 
        case 502: 
        case 503: 
        case 543: 
        case 544: 
        case 563: 
        case 583: 
        case 596: 
        case 606: 
        case 614: 
        case 616: 
        case 618: 
        case 620: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
	fEmbeddedHint = XML_CONTENT;
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 758: break;
        case 78: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 759: break;
        case 79: 
        case 80: 
        case 81: 
          { 
		// block scan until close is found
	return doScan("?>", false, false, false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
 }
        case 760: break;
        case 83: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 761: break;
        case 127: 
        case 172: 
          { 
	String type = yy_lexical_state == ST_XML_ATTRIBUTE_VALUE ? XML_TAG_ATTRIBUTE_VALUE_SQUOTE : JSP_TAG_ATTRIBUTE_VALUE_SQUOTE;
	if (Debug.debugTokenizer) {
		System.out.println("begin embedded region: " + fEmbeddedHint+", "+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 762: break;
        case 131: 
          { 
	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 763: break;
        case 136: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 764: break;
        case 139: 
        case 143: 
        case 297: 
        case 301: 
        case 417: 
          { 
	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 765: break;
        case 144: 
        case 148: 
        case 307: 
          { 
	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 766: break;
        case 149: 
        case 313: 
        case 317: 
        case 420: 
          { 
	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 767: break;
        case 155: 
          { 
	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 768: break;
        case 156: 
        case 323: 
        case 327: 
        case 428: 
          { 
	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 769: break;
        case 162: 
          { 
	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 770: break;
        case 165: 
        case 166: 
          { 
	if(Debug.debugTokenizer)
		dump("\nJSP comment text");//$NON-NLS-1$
	return scanJSPCommentText();
 }
        case 771: break;
        case 175: 
        case 179: 
        case 180: 
        case 181: 
        case 184: 
        case 185: 
        case 343: 
          { 
	return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 772: break;
        case 176: 
          { 
	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 773: break;
        case 178: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_SQUOTE : XML_TAG_ATTRIBUTE_VALUE_SQUOTE;
 }
        case 774: break;
        case 183: 
          { 
	return isJspTag()? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE : XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 775: break;
        case 188: 
          { 
	yybegin(ST_JSP_EL_DQUOTES);
	return JSP_EL_DQUOTE;
 }
        case 776: break;
        case 189: 
          { 
	yybegin(ST_JSP_EL_SQUOTES);
	return JSP_EL_SQUOTE;
 }
        case 777: break;
        case 191: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_EL_CLOSE;
	}
	return JSP_EL_CONTENT;
 }
        case 778: break;
        case 198: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_SQUOTE;
 }
        case 779: break;
        case 199: 
          { 
	yybegin(ST_JSP_EL);
	return JSP_EL_DQUOTE;
 }
        case 780: break;
        case 202: 
          { 
	return isJspTag() ? JSP_TAG_ATTRIBUTE_VALUE_DQUOTE: XML_TAG_ATTRIBUTE_VALUE_DQUOTE;
 }
        case 781: break;
        case 204: 
          { 
	return JSP_EL_CLOSE;
 }
        case 782: break;
        case 210: 
          { 
	yybegin(ST_JSP_VBL_DQUOTES);
	return JSP_VBL_DQUOTE;
 }
        case 783: break;
        case 211: 
          { 
	yybegin(ST_JSP_VBL_SQUOTES);
	return JSP_VBL_SQUOTE;
 }
        case 784: break;
        case 213: 
          { 
	fELlevel--;
	if(fELlevel == 0) {
		yybegin(YYINITIAL);
		return JSP_VBL_CLOSE;
	}
	return JSP_VBL_CONTENT;
 }
        case 785: break;
        case 220: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_SQUOTE;
 }
        case 786: break;
        case 221: 
          { 
	yybegin(ST_JSP_VBL);
	return JSP_VBL_DQUOTE;
 }
        case 787: break;
        case 225: 
          { 
	return JSP_VBL_CLOSE;
 }
        case 788: break;
        case 229: 
          { 
	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 789: break;
        case 230: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 790: break;
        case 231: 
        case 319: 
        case 329: 
        case 349: 
        case 354: 
        case 358: 
        case 361: 
        case 364: 
        case 366: 
        case 370: 
        case 374: 
        case 377: 
        case 380: 
          { 
	/* JSP scriptlet begun (anywhere)
	 * A consequence of the start anywhere possibility is that the
	 *  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 791: break;
        case 232: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 792: break;
        case 245: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 793: break;
        case 249: 
          { 
		// ended with nothing inside
		fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 794: break;
        case 250: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
	fEmbeddedHint = UNDEFINED;
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 795: break;
        case 163: 
        case 164: 
          { 
		return doBlockTagScan();
	 }
        case 796: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
