/* ELParserTokenManager.java */
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParserTokenManager.java */
package org.apache.el.parser;

/** Token Manager. */
@SuppressWarnings("all") // Ignore warnings in generated code
public class ELParserTokenManager implements ELParserConstants {
java.util.Deque<Integer> deque = new java.util.ArrayDeque<Integer>();

  /** Debug output. */
  public  java.io.PrintStream debugStream = System.out;
  /** Set debug output. */
  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
private final int jjStopStringLiteralDfa_0(int pos, long active0){
   switch (pos)
   {
      case 0:
         if ((active0 & 0xcL) != 0L)
         {
            jjmatchedKind = 1;
            return 5;
         }
         return -1;
      default :
         return -1;
   }
}
private final int jjStartNfa_0(int pos, long active0){
   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
}
private int jjStopAtPos(int pos, int kind)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   return pos + 1;
}
private int jjMoveStringLiteralDfa0_0(){
   switch(curChar)
   {
      case 35:
         return jjMoveStringLiteralDfa1_0(0x8L);
      case 36:
         return jjMoveStringLiteralDfa1_0(0x4L);
      default :
         return jjMoveNfa_0(7, 0);
   }
}
private int jjMoveStringLiteralDfa1_0(long active0){
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(0, active0);
      return 1;
   }
   switch(curChar)
   {
      case 123:
         if ((active0 & 0x4L) != 0L) {
            return jjStopAtPos(1, 2);
        } else if ((active0 & 0x8L) != 0L) {
            return jjStopAtPos(1, 3);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_0(0, active0);
}
static final long[] jjbitVec0 = {
   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
};
static final long[] jjbitVec2 = {
   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
};
private int jjMoveNfa_0(int startState, int curPos)
{
   int startsAt = 0;
   jjnewStateCnt = 8;
   int i = 1;
   jjstateSet[0] = startState;
   int kind = 0x7fffffff;
   for (;;)
   {
      if (++jjround == 0x7fffffff) {
        ReInitRounds();
    }
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(jjstateSet[--i])
            {
               case 7:
                  if ((0xffffffe7ffffffffL & l) != 0L)
                  {
                     if (kind > 1) {
                        kind = 1;
                    }
                     { jjCheckNAddStates(0, 4); }
                  }
                  else if ((0x1800000000L & l) != 0L)
                  {
                     if (kind > 1) {
                        kind = 1;
                    }
                     { jjCheckNAdd(5); }
                  }
                  if ((0xffffffe7ffffffffL & l) != 0L)
                     { jjCheckNAddTwoStates(0, 1); }
                  break;
               case 0:
                  if ((0xffffffe7ffffffffL & l) != 0L)
                     { jjCheckNAddTwoStates(0, 1); }
                  break;
               case 2:
                  if ((0xffffffe7ffffffffL & l) == 0L) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(0, 4); }
                  break;
               case 3:
                  if ((0xffffffe7ffffffffL & l) != 0L)
                     { jjCheckNAddTwoStates(3, 4); }
                  break;
               case 4:
                  if ((0x1800000000L & l) != 0L)
                     { jjCheckNAdd(5); }
                  break;
               case 5:
                  if ((0xffffffe7ffffffffL & l) == 0L) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(5, 8); }
                  break;
               case 6:
                  if ((0x1800000000L & l) == 0L) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(9, 13); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 7:
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(0, 4); }
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddTwoStates(0, 1); }
                  else if (curChar == 92)
                  {
                     if (kind > 1) {
                        kind = 1;
                    }
                     { jjCheckNAddStates(14, 17); }
                  }
                  break;
               case 0:
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddTwoStates(0, 1); }
                  break;
               case 1:
                  if (curChar != 92) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(14, 17); }
                  break;
               case 2:
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(0, 4); }
                  break;
               case 3:
                  { jjCheckNAddTwoStates(3, 4); }
                  break;
               case 5:
                  if ((0xf7ffffffefffffffL & l) == 0L) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(5, 8); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 077);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 7:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjCheckNAddTwoStates(0, 1); }
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                  {
                     if (kind > 1) {
                        kind = 1;
                    }
                     { jjCheckNAddStates(0, 4); }
                  }
                  break;
               case 0:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjCheckNAddTwoStates(0, 1); }
                  break;
               case 2:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(0, 4); }
                  break;
               case 3:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjCheckNAddTwoStates(3, 4); }
                  break;
               case 5:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 1) {
                    kind = 1;
                }
                  { jjCheckNAddStates(5, 8); }
                  break;
               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) {
                break;
            } else {
                break;
            }
            }
         } while(i != startsAt);
      }
      if (kind != 0x7fffffff)
      {
         jjmatchedKind = kind;
         jjmatchedPos = curPos;
         kind = 0x7fffffff;
      }
      ++curPos;
      if ((i = jjnewStateCnt) == (startsAt = 8 - (jjnewStateCnt = startsAt))) {
        return curPos;
    }
      try { curChar = input_stream.readChar(); }
      catch(java.io.IOException e) { return curPos; }
   }
}
private final int jjStopStringLiteralDfa_2(int pos, long active0){
   switch (pos)
   {
      case 0:
         if ((active0 & 0x20000L) != 0L) {
            return 1;
        }
         if ((active0 & 0x141d555401c000L) != 0L)
         {
            jjmatchedKind = 56;
            return 30;
         }
         return -1;
      case 1:
         if ((active0 & 0x41554000000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x1419400001c000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 1;
            return 30;
         }
         return -1;
      case 2:
         if ((active0 & 0x14014000000000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x18000001c000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 2;
            return 30;
         }
         return -1;
      case 3:
         if ((active0 & 0x14000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x180000008000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 3;
            return 30;
         }
         return -1;
      case 4:
         if ((active0 & 0x80000008000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 4;
            return 30;
         }
         return -1;
      case 5:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 5;
            return 30;
         }
         return -1;
      case 6:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 6;
            return 30;
         }
         return -1;
      case 7:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 7;
            return 30;
         }
         return -1;
      case 8:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 8;
            return 30;
         }
         return -1;
      default :
         return -1;
   }
}
private final int jjStartNfa_2(int pos, long active0){
   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
}
private int jjMoveStringLiteralDfa0_2(){
   switch(curChar)
   {
      case 33:
         jjmatchedKind = 37;
         return jjMoveStringLiteralDfa1_2(0x800000000L);
      case 37:
         return jjStopAtPos(0, 51);
      case 38:
         return jjMoveStringLiteralDfa1_2(0x8000000000L);
      case 40:
         return jjStopAtPos(0, 18);
      case 41:
         return jjStopAtPos(0, 19);
      case 42:
         return jjStopAtPos(0, 45);
      case 43:
         jjmatchedKind = 46;
         return jjMoveStringLiteralDfa1_2(0x20000000000000L);
      case 44:
         return jjStopAtPos(0, 24);
      case 45:
         jjmatchedKind = 47;
         return jjMoveStringLiteralDfa1_2(0x80000000000000L);
      case 46:
         return jjStartNfaWithStates_2(0, 17, 1);
      case 47:
         return jjStopAtPos(0, 49);
      case 58:
         return jjStopAtPos(0, 22);
      case 59:
         return jjStopAtPos(0, 23);
      case 60:
         jjmatchedKind = 27;
         return jjMoveStringLiteralDfa1_2(0x80000000L);
      case 61:
         jjmatchedKind = 54;
         return jjMoveStringLiteralDfa1_2(0x200000000L);
      case 62:
         jjmatchedKind = 25;
         return jjMoveStringLiteralDfa1_2(0x20000000L);
      case 63:
         return jjStopAtPos(0, 48);
      case 91:
         return jjStopAtPos(0, 20);
      case 93:
         return jjStopAtPos(0, 21);
      case 97:
         return jjMoveStringLiteralDfa1_2(0x10000000000L);
      case 100:
         return jjMoveStringLiteralDfa1_2(0x4000000000000L);
      case 101:
         return jjMoveStringLiteralDfa1_2(0x80400000000L);
      case 102:
         return jjMoveStringLiteralDfa1_2(0x8000L);
      case 103:
         return jjMoveStringLiteralDfa1_2(0x44000000L);
      case 105:
         return jjMoveStringLiteralDfa1_2(0x100000000000L);
      case 108:
         return jjMoveStringLiteralDfa1_2(0x110000000L);
      case 109:
         return jjMoveStringLiteralDfa1_2(0x10000000000000L);
      case 110:
         return jjMoveStringLiteralDfa1_2(0x5000010000L);
      case 111:
         return jjMoveStringLiteralDfa1_2(0x40000000000L);
      case 116:
         return jjMoveStringLiteralDfa1_2(0x4000L);
      case 123:
         return jjStopAtPos(0, 8);
      case 124:
         return jjMoveStringLiteralDfa1_2(0x20000000000L);
      case 125:
         return jjStopAtPos(0, 9);
      default :
         return jjMoveNfa_2(0, 0);
   }
}
private int jjMoveStringLiteralDfa1_2(long active0){
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(0, active0);
      return 1;
   }
   switch(curChar)
   {
      case 38:
         if ((active0 & 0x8000000000L) != 0L) {
            return jjStopAtPos(1, 39);
        }
         break;
      case 61:
         if ((active0 & 0x20000000L) != 0L) {
            return jjStopAtPos(1, 29);
        } else if ((active0 & 0x80000000L) != 0L) {
            return jjStopAtPos(1, 31);
        } else if ((active0 & 0x200000000L) != 0L) {
            return jjStopAtPos(1, 33);
        } else if ((active0 & 0x800000000L) != 0L) {
            return jjStopAtPos(1, 35);
        } else if ((active0 & 0x20000000000000L) != 0L) {
            return jjStopAtPos(1, 53);
        }
         break;
      case 62:
         if ((active0 & 0x80000000000000L) != 0L) {
            return jjStopAtPos(1, 55);
        }
         break;
      case 97:
         return jjMoveStringLiteralDfa2_2(active0, 0x8000L);
      case 101:
         if ((active0 & 0x40000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 30, 30);
        } else if ((active0 & 0x100000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 32, 30);
        } else if ((active0 & 0x1000000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 36, 30);
        }
         break;
      case 105:
         return jjMoveStringLiteralDfa2_2(active0, 0x4000000000000L);
      case 109:
         return jjMoveStringLiteralDfa2_2(active0, 0x80000000000L);
      case 110:
         return jjMoveStringLiteralDfa2_2(active0, 0x110000000000L);
      case 111:
         return jjMoveStringLiteralDfa2_2(active0, 0x10004000000000L);
      case 113:
         if ((active0 & 0x400000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 34, 30);
        }
         break;
      case 114:
         if ((active0 & 0x40000000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 42, 30);
        }
         return jjMoveStringLiteralDfa2_2(active0, 0x4000L);
      case 116:
         if ((active0 & 0x4000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 26, 30);
        } else if ((active0 & 0x10000000L) != 0L) {
            return jjStartNfaWithStates_2(1, 28, 30);
        }
         break;
      case 117:
         return jjMoveStringLiteralDfa2_2(active0, 0x10000L);
      case 124:
         if ((active0 & 0x20000000000L) != 0L) {
            return jjStopAtPos(1, 41);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_2(0, active0);
}
private int jjMoveStringLiteralDfa2_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(0, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(1, active0);
      return 2;
   }
   switch(curChar)
   {
      case 100:
         if ((active0 & 0x10000000000L) != 0L) {
            return jjStartNfaWithStates_2(2, 40, 30);
        } else if ((active0 & 0x10000000000000L) != 0L) {
            return jjStartNfaWithStates_2(2, 52, 30);
        }
         break;
      case 108:
         return jjMoveStringLiteralDfa3_2(active0, 0x18000L);
      case 112:
         return jjMoveStringLiteralDfa3_2(active0, 0x80000000000L);
      case 115:
         return jjMoveStringLiteralDfa3_2(active0, 0x100000000000L);
      case 116:
         if ((active0 & 0x4000000000L) != 0L) {
            return jjStartNfaWithStates_2(2, 38, 30);
        }
         break;
      case 117:
         return jjMoveStringLiteralDfa3_2(active0, 0x4000L);
      case 118:
         if ((active0 & 0x4000000000000L) != 0L) {
            return jjStartNfaWithStates_2(2, 50, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_2(1, active0);
}
private int jjMoveStringLiteralDfa3_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(1, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(2, active0);
      return 3;
   }
   switch(curChar)
   {
      case 101:
         if ((active0 & 0x4000L) != 0L) {
            return jjStartNfaWithStates_2(3, 14, 30);
        }
         break;
      case 108:
         if ((active0 & 0x10000L) != 0L) {
            return jjStartNfaWithStates_2(3, 16, 30);
        }
         break;
      case 115:
         return jjMoveStringLiteralDfa4_2(active0, 0x8000L);
      case 116:
         return jjMoveStringLiteralDfa4_2(active0, 0x180000000000L);
      default :
         break;
   }
   return jjStartNfa_2(2, active0);
}
private int jjMoveStringLiteralDfa4_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(2, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(3, active0);
      return 4;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa5_2(active0, 0x100000000000L);
      case 101:
         if ((active0 & 0x8000L) != 0L) {
            return jjStartNfaWithStates_2(4, 15, 30);
        }
         break;
      case 121:
         if ((active0 & 0x80000000000L) != 0L) {
            return jjStartNfaWithStates_2(4, 43, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_2(3, active0);
}
private int jjMoveStringLiteralDfa5_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(3, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(4, active0);
      return 5;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa6_2(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_2(4, active0);
}
private int jjMoveStringLiteralDfa6_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(4, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(5, active0);
      return 6;
   }
   switch(curChar)
   {
      case 99:
         return jjMoveStringLiteralDfa7_2(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_2(5, active0);
}
private int jjMoveStringLiteralDfa7_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(5, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(6, active0);
      return 7;
   }
   switch(curChar)
   {
      case 101:
         return jjMoveStringLiteralDfa8_2(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_2(6, active0);
}
private int jjMoveStringLiteralDfa8_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(6, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(7, active0);
      return 8;
   }
   switch(curChar)
   {
      case 111:
         return jjMoveStringLiteralDfa9_2(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_2(7, active0);
}
private int jjMoveStringLiteralDfa9_2(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_2(7, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_2(8, active0);
      return 9;
   }
   switch(curChar)
   {
      case 102:
         if ((active0 & 0x100000000000L) != 0L) {
            return jjStartNfaWithStates_2(9, 44, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_2(8, active0);
}
private int jjStartNfaWithStates_2(int pos, int kind, int state)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) { return pos + 1; }
   return jjMoveNfa_2(state, pos + 1);
}
static final long[] jjbitVec3 = {
   0x1ff00000fffffffeL, 0xffffffffffffc000L, 0xffffffffL, 0x600000000000000L
};
static final long[] jjbitVec4 = {
   0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL
};
static final long[] jjbitVec5 = {
   0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
};
static final long[] jjbitVec6 = {
   0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffL, 0x0L
};
static final long[] jjbitVec7 = {
   0xffffffffffffffffL, 0xffffffffffffffffL, 0x0L, 0x0L
};
static final long[] jjbitVec8 = {
   0x3fffffffffffL, 0x0L, 0x0L, 0x0L
};
private int jjMoveNfa_2(int startState, int curPos)
{
   int startsAt = 0;
   jjnewStateCnt = 30;
   int i = 1;
   jjstateSet[0] = startState;
   int kind = 0x7fffffff;
   for (;;)
   {
      if (++jjround == 0x7fffffff) {
        ReInitRounds();
    }
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0x3ff000000000000L & l) != 0L)
                  {
                     if (kind > 10) {
                        kind = 10;
                    }
                     { jjCheckNAddStates(18, 22); }
                  }
                  else if ((0x1800000000L & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAddTwoStates(28, 29); }
                  }
                  else if (curChar == 39)
                     { jjCheckNAddStates(23, 25); }
                  else if (curChar == 34)
                     { jjCheckNAddStates(26, 28); }
                  else if (curChar == 46)
                     { jjCheckNAdd(1); }
                  break;
               case 30:
                  if ((0x3ff001000000000L & l) != 0L)
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  if ((0x3ff001000000000L & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  break;
               case 1:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(1, 2); }
                  break;
               case 3:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(4); }
                  break;
               case 4:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(4); }
                  break;
               case 5:
                  if (curChar == 34)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 6:
                  if ((0xfffffffbffffffffL & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 8:
                  if ((0x8400000000L & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 9:
                  if (curChar == 34 && kind > 13) {
                    kind = 13;
                }
                  break;
               case 10:
                  if (curChar == 39)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 11:
                  if ((0xffffff7fffffffffL & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 13:
                  if ((0x8400000000L & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 14:
                  if (curChar == 39 && kind > 13) {
                    kind = 13;
                }
                  break;
               case 15:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 10) {
                    kind = 10;
                }
                  { jjCheckNAddStates(18, 22); }
                  break;
               case 16:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 10) {
                    kind = 10;
                }
                  { jjCheckNAdd(16); }
                  break;
               case 17:
                  if ((0x3ff000000000000L & l) != 0L)
                     { jjCheckNAddTwoStates(17, 18); }
                  break;
               case 18:
                  if (curChar != 46) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(19, 20); }
                  break;
               case 19:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(19, 20); }
                  break;
               case 21:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(22); }
                  break;
               case 22:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(22); }
                  break;
               case 23:
                  if ((0x3ff000000000000L & l) != 0L)
                     { jjCheckNAddTwoStates(23, 24); }
                  break;
               case 25:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(26); }
                  break;
               case 26:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(26); }
                  break;
               case 27:
                  if ((0x1800000000L & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 28:
                  if ((0x3ff001000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if ((0x3ff001000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 30:
                  if ((0x7fffffe87fffffeL & l) != 0L)
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  if ((0x7fffffe87fffffeL & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  break;
               case 2:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(29, 30); }
                  break;
               case 6:
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 7:
                  if (curChar == 92) {
                    jjstateSet[jjnewStateCnt++] = 8;
                }
                  break;
               case 8:
                  if (curChar == 92)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 11:
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 12:
                  if (curChar == 92) {
                    jjstateSet[jjnewStateCnt++] = 13;
                }
                  break;
               case 13:
                  if (curChar == 92)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 20:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(31, 32); }
                  break;
               case 24:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(33, 34); }
                  break;
               case 28:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 077);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 30:
                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  break;
               case 6:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjAddStates(26, 28); }
                  break;
               case 11:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjAddStates(23, 25); }
                  break;
               case 28:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) {
                break;
            } else {
                break;
            }
            }
         } while(i != startsAt);
      }
      if (kind != 0x7fffffff)
      {
         jjmatchedKind = kind;
         jjmatchedPos = curPos;
         kind = 0x7fffffff;
      }
      ++curPos;
      if ((i = jjnewStateCnt) == (startsAt = 30 - (jjnewStateCnt = startsAt))) {
        return curPos;
    }
      try { curChar = input_stream.readChar(); }
      catch(java.io.IOException e) { return curPos; }
   }
}
private final int jjStopStringLiteralDfa_1(int pos, long active0){
   switch (pos)
   {
      case 0:
         if ((active0 & 0x20000L) != 0L) {
            return 1;
        }
         if ((active0 & 0x141d555401c000L) != 0L)
         {
            jjmatchedKind = 56;
            return 30;
         }
         return -1;
      case 1:
         if ((active0 & 0x41554000000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x1419400001c000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 1;
            return 30;
         }
         return -1;
      case 2:
         if ((active0 & 0x14014000000000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x18000001c000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 2;
            return 30;
         }
         return -1;
      case 3:
         if ((active0 & 0x14000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x180000008000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 3;
            return 30;
         }
         return -1;
      case 4:
         if ((active0 & 0x80000008000L) != 0L) {
            return 30;
        }
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 4;
            return 30;
         }
         return -1;
      case 5:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 5;
            return 30;
         }
         return -1;
      case 6:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 6;
            return 30;
         }
         return -1;
      case 7:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 7;
            return 30;
         }
         return -1;
      case 8:
         if ((active0 & 0x100000000000L) != 0L)
         {
            jjmatchedKind = 56;
            jjmatchedPos = 8;
            return 30;
         }
         return -1;
      default :
         return -1;
   }
}
private final int jjStartNfa_1(int pos, long active0){
   return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
}
private int jjMoveStringLiteralDfa0_1(){
   switch(curChar)
   {
      case 33:
         jjmatchedKind = 37;
         return jjMoveStringLiteralDfa1_1(0x800000000L);
      case 37:
         return jjStopAtPos(0, 51);
      case 38:
         return jjMoveStringLiteralDfa1_1(0x8000000000L);
      case 40:
         return jjStopAtPos(0, 18);
      case 41:
         return jjStopAtPos(0, 19);
      case 42:
         return jjStopAtPos(0, 45);
      case 43:
         jjmatchedKind = 46;
         return jjMoveStringLiteralDfa1_1(0x20000000000000L);
      case 44:
         return jjStopAtPos(0, 24);
      case 45:
         jjmatchedKind = 47;
         return jjMoveStringLiteralDfa1_1(0x80000000000000L);
      case 46:
         return jjStartNfaWithStates_1(0, 17, 1);
      case 47:
         return jjStopAtPos(0, 49);
      case 58:
         return jjStopAtPos(0, 22);
      case 59:
         return jjStopAtPos(0, 23);
      case 60:
         jjmatchedKind = 27;
         return jjMoveStringLiteralDfa1_1(0x80000000L);
      case 61:
         jjmatchedKind = 54;
         return jjMoveStringLiteralDfa1_1(0x200000000L);
      case 62:
         jjmatchedKind = 25;
         return jjMoveStringLiteralDfa1_1(0x20000000L);
      case 63:
         return jjStopAtPos(0, 48);
      case 91:
         return jjStopAtPos(0, 20);
      case 93:
         return jjStopAtPos(0, 21);
      case 97:
         return jjMoveStringLiteralDfa1_1(0x10000000000L);
      case 100:
         return jjMoveStringLiteralDfa1_1(0x4000000000000L);
      case 101:
         return jjMoveStringLiteralDfa1_1(0x80400000000L);
      case 102:
         return jjMoveStringLiteralDfa1_1(0x8000L);
      case 103:
         return jjMoveStringLiteralDfa1_1(0x44000000L);
      case 105:
         return jjMoveStringLiteralDfa1_1(0x100000000000L);
      case 108:
         return jjMoveStringLiteralDfa1_1(0x110000000L);
      case 109:
         return jjMoveStringLiteralDfa1_1(0x10000000000000L);
      case 110:
         return jjMoveStringLiteralDfa1_1(0x5000010000L);
      case 111:
         return jjMoveStringLiteralDfa1_1(0x40000000000L);
      case 116:
         return jjMoveStringLiteralDfa1_1(0x4000L);
      case 123:
         return jjStopAtPos(0, 8);
      case 124:
         return jjMoveStringLiteralDfa1_1(0x20000000000L);
      case 125:
         return jjStopAtPos(0, 9);
      default :
         return jjMoveNfa_1(0, 0);
   }
}
private int jjMoveStringLiteralDfa1_1(long active0){
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(0, active0);
      return 1;
   }
   switch(curChar)
   {
      case 38:
         if ((active0 & 0x8000000000L) != 0L) {
            return jjStopAtPos(1, 39);
        }
         break;
      case 61:
         if ((active0 & 0x20000000L) != 0L) {
            return jjStopAtPos(1, 29);
        } else if ((active0 & 0x80000000L) != 0L) {
            return jjStopAtPos(1, 31);
        } else if ((active0 & 0x200000000L) != 0L) {
            return jjStopAtPos(1, 33);
        } else if ((active0 & 0x800000000L) != 0L) {
            return jjStopAtPos(1, 35);
        } else if ((active0 & 0x20000000000000L) != 0L) {
            return jjStopAtPos(1, 53);
        }
         break;
      case 62:
         if ((active0 & 0x80000000000000L) != 0L) {
            return jjStopAtPos(1, 55);
        }
         break;
      case 97:
         return jjMoveStringLiteralDfa2_1(active0, 0x8000L);
      case 101:
         if ((active0 & 0x40000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 30, 30);
        } else if ((active0 & 0x100000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 32, 30);
        } else if ((active0 & 0x1000000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 36, 30);
        }
         break;
      case 105:
         return jjMoveStringLiteralDfa2_1(active0, 0x4000000000000L);
      case 109:
         return jjMoveStringLiteralDfa2_1(active0, 0x80000000000L);
      case 110:
         return jjMoveStringLiteralDfa2_1(active0, 0x110000000000L);
      case 111:
         return jjMoveStringLiteralDfa2_1(active0, 0x10004000000000L);
      case 113:
         if ((active0 & 0x400000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 34, 30);
        }
         break;
      case 114:
         if ((active0 & 0x40000000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 42, 30);
        }
         return jjMoveStringLiteralDfa2_1(active0, 0x4000L);
      case 116:
         if ((active0 & 0x4000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 26, 30);
        } else if ((active0 & 0x10000000L) != 0L) {
            return jjStartNfaWithStates_1(1, 28, 30);
        }
         break;
      case 117:
         return jjMoveStringLiteralDfa2_1(active0, 0x10000L);
      case 124:
         if ((active0 & 0x20000000000L) != 0L) {
            return jjStopAtPos(1, 41);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_1(0, active0);
}
private int jjMoveStringLiteralDfa2_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(0, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(1, active0);
      return 2;
   }
   switch(curChar)
   {
      case 100:
         if ((active0 & 0x10000000000L) != 0L) {
            return jjStartNfaWithStates_1(2, 40, 30);
        } else if ((active0 & 0x10000000000000L) != 0L) {
            return jjStartNfaWithStates_1(2, 52, 30);
        }
         break;
      case 108:
         return jjMoveStringLiteralDfa3_1(active0, 0x18000L);
      case 112:
         return jjMoveStringLiteralDfa3_1(active0, 0x80000000000L);
      case 115:
         return jjMoveStringLiteralDfa3_1(active0, 0x100000000000L);
      case 116:
         if ((active0 & 0x4000000000L) != 0L) {
            return jjStartNfaWithStates_1(2, 38, 30);
        }
         break;
      case 117:
         return jjMoveStringLiteralDfa3_1(active0, 0x4000L);
      case 118:
         if ((active0 & 0x4000000000000L) != 0L) {
            return jjStartNfaWithStates_1(2, 50, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_1(1, active0);
}
private int jjMoveStringLiteralDfa3_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(1, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(2, active0);
      return 3;
   }
   switch(curChar)
   {
      case 101:
         if ((active0 & 0x4000L) != 0L) {
            return jjStartNfaWithStates_1(3, 14, 30);
        }
         break;
      case 108:
         if ((active0 & 0x10000L) != 0L) {
            return jjStartNfaWithStates_1(3, 16, 30);
        }
         break;
      case 115:
         return jjMoveStringLiteralDfa4_1(active0, 0x8000L);
      case 116:
         return jjMoveStringLiteralDfa4_1(active0, 0x180000000000L);
      default :
         break;
   }
   return jjStartNfa_1(2, active0);
}
private int jjMoveStringLiteralDfa4_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(2, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(3, active0);
      return 4;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa5_1(active0, 0x100000000000L);
      case 101:
         if ((active0 & 0x8000L) != 0L) {
            return jjStartNfaWithStates_1(4, 15, 30);
        }
         break;
      case 121:
         if ((active0 & 0x80000000000L) != 0L) {
            return jjStartNfaWithStates_1(4, 43, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_1(3, active0);
}
private int jjMoveStringLiteralDfa5_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(3, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(4, active0);
      return 5;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa6_1(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_1(4, active0);
}
private int jjMoveStringLiteralDfa6_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(4, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(5, active0);
      return 6;
   }
   switch(curChar)
   {
      case 99:
         return jjMoveStringLiteralDfa7_1(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_1(5, active0);
}
private int jjMoveStringLiteralDfa7_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(5, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(6, active0);
      return 7;
   }
   switch(curChar)
   {
      case 101:
         return jjMoveStringLiteralDfa8_1(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_1(6, active0);
}
private int jjMoveStringLiteralDfa8_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(6, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(7, active0);
      return 8;
   }
   switch(curChar)
   {
      case 111:
         return jjMoveStringLiteralDfa9_1(active0, 0x100000000000L);
      default :
         break;
   }
   return jjStartNfa_1(7, active0);
}
private int jjMoveStringLiteralDfa9_1(long old0, long active0){
   if (((active0 &= old0)) == 0L) {
    return jjStartNfa_1(7, old0);
}
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_1(8, active0);
      return 9;
   }
   switch(curChar)
   {
      case 102:
         if ((active0 & 0x100000000000L) != 0L) {
            return jjStartNfaWithStates_1(9, 44, 30);
        }
         break;
      default :
         break;
   }
   return jjStartNfa_1(8, active0);
}
private int jjStartNfaWithStates_1(int pos, int kind, int state)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) { return pos + 1; }
   return jjMoveNfa_1(state, pos + 1);
}
private int jjMoveNfa_1(int startState, int curPos)
{
   int startsAt = 0;
   jjnewStateCnt = 30;
   int i = 1;
   jjstateSet[0] = startState;
   int kind = 0x7fffffff;
   for (;;)
   {
      if (++jjround == 0x7fffffff) {
        ReInitRounds();
    }
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0x3ff000000000000L & l) != 0L)
                  {
                     if (kind > 10) {
                        kind = 10;
                    }
                     { jjCheckNAddStates(18, 22); }
                  }
                  else if ((0x1800000000L & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAddTwoStates(28, 29); }
                  }
                  else if (curChar == 39)
                     { jjCheckNAddStates(23, 25); }
                  else if (curChar == 34)
                     { jjCheckNAddStates(26, 28); }
                  else if (curChar == 46)
                     { jjCheckNAdd(1); }
                  break;
               case 30:
                  if ((0x3ff001000000000L & l) != 0L)
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  if ((0x3ff001000000000L & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  break;
               case 1:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(1, 2); }
                  break;
               case 3:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(4); }
                  break;
               case 4:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(4); }
                  break;
               case 5:
                  if (curChar == 34)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 6:
                  if ((0xfffffffbffffffffL & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 8:
                  if ((0x8400000000L & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 9:
                  if (curChar == 34 && kind > 13) {
                    kind = 13;
                }
                  break;
               case 10:
                  if (curChar == 39)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 11:
                  if ((0xffffff7fffffffffL & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 13:
                  if ((0x8400000000L & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 14:
                  if (curChar == 39 && kind > 13) {
                    kind = 13;
                }
                  break;
               case 15:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 10) {
                    kind = 10;
                }
                  { jjCheckNAddStates(18, 22); }
                  break;
               case 16:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 10) {
                    kind = 10;
                }
                  { jjCheckNAdd(16); }
                  break;
               case 17:
                  if ((0x3ff000000000000L & l) != 0L)
                     { jjCheckNAddTwoStates(17, 18); }
                  break;
               case 18:
                  if (curChar != 46) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(19, 20); }
                  break;
               case 19:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAddTwoStates(19, 20); }
                  break;
               case 21:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(22); }
                  break;
               case 22:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(22); }
                  break;
               case 23:
                  if ((0x3ff000000000000L & l) != 0L)
                     { jjCheckNAddTwoStates(23, 24); }
                  break;
               case 25:
                  if ((0x280000000000L & l) != 0L)
                     { jjCheckNAdd(26); }
                  break;
               case 26:
                  if ((0x3ff000000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 11) {
                    kind = 11;
                }
                  { jjCheckNAdd(26); }
                  break;
               case 27:
                  if ((0x1800000000L & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 28:
                  if ((0x3ff001000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if ((0x3ff001000000000L & l) == 0L) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 30:
                  if ((0x7fffffe87fffffeL & l) != 0L)
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  if ((0x7fffffe87fffffeL & l) != 0L)
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  break;
               case 2:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(29, 30); }
                  break;
               case 6:
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 7:
                  if (curChar == 92) {
                    jjstateSet[jjnewStateCnt++] = 8;
                }
                  break;
               case 8:
                  if (curChar == 92)
                     { jjCheckNAddStates(26, 28); }
                  break;
               case 11:
                  if ((0xffffffffefffffffL & l) != 0L)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 12:
                  if (curChar == 92) {
                    jjstateSet[jjnewStateCnt++] = 13;
                }
                  break;
               case 13:
                  if (curChar == 92)
                     { jjCheckNAddStates(23, 25); }
                  break;
               case 20:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(31, 32); }
                  break;
               case 24:
                  if ((0x2000000020L & l) != 0L)
                     { jjAddStates(33, 34); }
                  break;
               case 28:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if ((0x7fffffe87fffffeL & l) == 0L) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 077);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAddTwoStates(28, 29); }
                  break;
               case 30:
                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                  {
                     if (kind > 56) {
                        kind = 56;
                    }
                     { jjCheckNAdd(28); }
                  }
                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                  {
                     if (kind > 57) {
                        kind = 57;
                    }
                     { jjCheckNAdd(29); }
                  }
                  break;
               case 6:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjAddStates(26, 28); }
                  break;
               case 11:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     { jjAddStates(23, 25); }
                  break;
               case 28:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 56) {
                    kind = 56;
                }
                  { jjCheckNAdd(28); }
                  break;
               case 29:
                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) {
                    break;
                }
                  if (kind > 57) {
                    kind = 57;
                }
                  { jjCheckNAdd(29); }
                  break;
               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) {
                break;
            } else {
                break;
            }
            }
         } while(i != startsAt);
      }
      if (kind != 0x7fffffff)
      {
         jjmatchedKind = kind;
         jjmatchedPos = curPos;
         kind = 0x7fffffff;
      }
      ++curPos;
      if ((i = jjnewStateCnt) == (startsAt = 30 - (jjnewStateCnt = startsAt))) {
        return curPos;
    }
      try { curChar = input_stream.readChar(); }
      catch(java.io.IOException e) { return curPos; }
   }
}

/** Token literal values. */
public static final String[] jjstrLiteralImages = {
"", null, "\44\173", "\43\173", null, null, null, null, "\173", "\175", null,
null, null, null, "\164\162\165\145", "\146\141\154\163\145", "\156\165\154\154",
"\56", "\50", "\51", "\133", "\135", "\72", "\73", "\54", "\76", "\147\164", "\74",
"\154\164", "\76\75", "\147\145", "\74\75", "\154\145", "\75\75", "\145\161", "\41\75",
"\156\145", "\41", "\156\157\164", "\46\46", "\141\156\144", "\174\174", "\157\162",
"\145\155\160\164\171", "\151\156\163\164\141\156\143\145\157\146", "\52", "\53", "\55", "\77", "\57",
"\144\151\166", "\45", "\155\157\144", "\53\75", "\75", "\55\76", null, null, null, null, null,
null, };
protected Token jjFillToken()
{
   final Token t;
   final String curTokenImage;
   final int beginLine;
   final int endLine;
   final int beginColumn;
   final int endColumn;
   String im = jjstrLiteralImages[jjmatchedKind];
   curTokenImage = (im == null) ? input_stream.GetImage() : im;
   beginLine = input_stream.getBeginLine();
   beginColumn = input_stream.getBeginColumn();
   endLine = input_stream.getEndLine();
   endColumn = input_stream.getEndColumn();
   t = Token.newToken(jjmatchedKind, curTokenImage);

   t.beginLine = beginLine;
   t.endLine = endLine;
   t.beginColumn = beginColumn;
   t.endColumn = endColumn;

   return t;
}
static final int[] jjnextStates = {
   0, 1, 3, 4, 2, 0, 1, 4, 2, 0, 1, 4, 5, 2, 0, 1,
   2, 6, 16, 17, 18, 23, 24, 11, 12, 14, 6, 7, 9, 3, 4, 21,
   22, 25, 26,
};
private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
   switch(hiByte)
   {
      case 0:
         return ((jjbitVec2[i2] & l2) != 0L);
      default :
         if ((jjbitVec0[i1] & l1) != 0L) {
            return true;
        }
         return false;
   }
}
private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
{
   switch(hiByte)
   {
      case 0:
         return ((jjbitVec4[i2] & l2) != 0L);
      case 48:
         return ((jjbitVec5[i2] & l2) != 0L);
      case 49:
         return ((jjbitVec6[i2] & l2) != 0L);
      case 51:
         return ((jjbitVec7[i2] & l2) != 0L);
      case 61:
         return ((jjbitVec8[i2] & l2) != 0L);
      default :
         if ((jjbitVec3[i1] & l1) != 0L) {
            return true;
        }
         return false;
   }
}

int curLexState = 0;
int defaultLexState = 0;
int jjnewStateCnt;
int jjround;
int jjmatchedPos;
int jjmatchedKind;

/** Get the next Token. */
public Token getNextToken()
{
  Token matchedToken;
  int curPos = 0;

  EOFLoop :
  for (;;)
  {
   try
   {
      curChar = input_stream.BeginToken();
   }
   catch(Exception e)
   {
      jjmatchedKind = 0;
      jjmatchedPos = -1;
      matchedToken = jjFillToken();
      return matchedToken;
   }
   image = jjimage;
   image.setLength(0);
   jjimageLen = 0;

   switch(curLexState)
   {
     case 0:
       jjmatchedKind = 0x7fffffff;
       jjmatchedPos = 0;
       curPos = jjMoveStringLiteralDfa0_0();
       break;
     case 1:
       try { input_stream.backup(0);
          while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) {
            curChar = input_stream.BeginToken();
        }
       }
       catch (java.io.IOException e1) { continue EOFLoop; }
       jjmatchedKind = 0x7fffffff;
       jjmatchedPos = 0;
       curPos = jjMoveStringLiteralDfa0_1();
       if (jjmatchedPos == 0 && jjmatchedKind > 61)
       {
          jjmatchedKind = 61;
       }
       break;
     case 2:
       try { input_stream.backup(0);
          while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) {
            curChar = input_stream.BeginToken();
        }
       }
       catch (java.io.IOException e1) { continue EOFLoop; }
       jjmatchedKind = 0x7fffffff;
       jjmatchedPos = 0;
       curPos = jjMoveStringLiteralDfa0_2();
       if (jjmatchedPos == 0 && jjmatchedKind > 61)
       {
          jjmatchedKind = 61;
       }
       break;
   }
     if (jjmatchedKind != 0x7fffffff)
     {
        if (jjmatchedPos + 1 < curPos) {
            input_stream.backup(curPos - jjmatchedPos - 1);
        }
        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
        {
           matchedToken = jjFillToken();
           TokenLexicalActions(matchedToken);
       if (jjnewLexState[jjmatchedKind] != -1) {
        curLexState = jjnewLexState[jjmatchedKind];
    }
           return matchedToken;
        }
        else
        {
         if (jjnewLexState[jjmatchedKind] != -1) {
            curLexState = jjnewLexState[jjmatchedKind];
        }
           continue EOFLoop;
        }
     }
     int error_line = input_stream.getEndLine();
     int error_column = input_stream.getEndColumn();
     String error_after = null;
     boolean EOFSeen = false;
     try { input_stream.readChar(); input_stream.backup(1); }
     catch (java.io.IOException e1) {
        EOFSeen = true;
        error_after = curPos <= 1 ? "" : input_stream.GetImage();
        if (curChar == '\n' || curChar == '\r') {
           error_line++;
           error_column = 0;
        } else {
            error_column++;
        }
     }
     if (!EOFSeen) {
        input_stream.backup(1);
        error_after = curPos <= 1 ? "" : input_stream.GetImage();
     }
     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
  }
}

void SkipLexicalActions(Token matchedToken)
{
   switch(jjmatchedKind)
   {
      default :
         break;
   }
}
void MoreLexicalActions()
{
   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
   switch(jjmatchedKind)
   {
      default :
         break;
   }
}
void TokenLexicalActions(Token matchedToken)
{
   switch(jjmatchedKind)
   {
      case 2 :
        image.append(jjstrLiteralImages[2]);
        lengthOfMatch = jjstrLiteralImages[2].length();
                                      deque.push(DEFAULT);
         break;
      case 3 :
        image.append(jjstrLiteralImages[3]);
        lengthOfMatch = jjstrLiteralImages[3].length();
                                       deque.push(DEFAULT);
         break;
      case 8 :
        image.append(jjstrLiteralImages[8]);
        lengthOfMatch = jjstrLiteralImages[8].length();
                                 deque.push(curLexState);
         break;
      case 9 :
        image.append(jjstrLiteralImages[9]);
        lengthOfMatch = jjstrLiteralImages[9].length();
                      SwitchTo(deque.pop());
         break;
      default :
         break;
   }
}
private void jjCheckNAdd(int state)
{
   if (jjrounds[state] != jjround)
   {
      jjstateSet[jjnewStateCnt++] = state;
      jjrounds[state] = jjround;
   }
}
private void jjAddStates(int start, int end)
{
   do {
      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
   } while (start++ != end);
}
private void jjCheckNAddTwoStates(int state1, int state2)
{
   jjCheckNAdd(state1);
   jjCheckNAdd(state2);
}

private void jjCheckNAddStates(int start, int end)
{
   do {
      jjCheckNAdd(jjnextStates[start]);
   } while (start++ != end);
}

    /** Constructor. */
    public ELParserTokenManager(SimpleCharStream stream){

      if (SimpleCharStream.staticFlag) {
        throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
    }

    input_stream = stream;
  }

  /** Constructor. */
  public ELParserTokenManager (SimpleCharStream stream, int lexState){
    ReInit(stream);
    SwitchTo(lexState);
  }

  /** Reinitialise parser. */

  public void ReInit(SimpleCharStream stream)
  {


    jjmatchedPos =
    jjnewStateCnt =
    0;
    curLexState = defaultLexState;
    input_stream = stream;
    ReInitRounds();
  }

  private void ReInitRounds()
  {
    int i;
    jjround = 0x80000001;
    for (i = 30; i-- > 0;) {
        jjrounds[i] = 0x80000000;
    }
  }

  /** Reinitialise parser. */
  public void ReInit(SimpleCharStream stream, int lexState)

  {
    ReInit(stream);
    SwitchTo(lexState);
  }

  /** Switch to specified lex state. */
  public void SwitchTo(int lexState)
  {
    if (lexState >= 3 || lexState < 0) {
        throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
    } else {
        curLexState = lexState;
    }
  }


/** Lexer state names. */
public static final String[] lexStateNames = {
   "DEFAULT",
   "IN_EXPRESSION",
   "IN_SET_OR_MAP",
};

/** Lex State array. */
public static final int[] jjnewLexState = {
   -1, -1, 1, 1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
static final long[] jjtoToken = {
   0x23ffffffffffef0fL,
};
static final long[] jjtoSkip = {
   0xf0L,
};
static final long[] jjtoSpecial = {
   0x0L,
};
static final long[] jjtoMore = {
   0x0L,
};
    protected SimpleCharStream  input_stream;

    private final int[] jjrounds = new int[30];
    private final int[] jjstateSet = new int[2 * 30];
    private final StringBuilder jjimage = new StringBuilder();
    private StringBuilder image = jjimage;
    private int jjimageLen;
    private int lengthOfMatch;
    protected int curChar;
}
