/* The following code was generated by JFlex 1.2.2 on 1/27/09 11:06 AM */

/*******************************************************************************
 * Copyright (c) 2004, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Frits Jalvingh - contributions for bug 150794
 *******************************************************************************/

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

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

import org.eclipse.jst.jsp.core.internal.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 1/27/09 11:06 AM from the specification file
 * <tt>file:/D:/workspaces/wtp301/sandbox/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();
	
		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);
          }
      }
    }
  }    


}
