diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 8864e8e..702b1e0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -2,6 +2,7 @@
     sha: ea227f024bd89d638aea319c92806737e3375979
     hooks:
     -   id: trailing-whitespace
+        exclude: stix2patterns/grammars/*
     -   id: flake8
         args:
         - --ignore=F403,F405
diff --git a/stix2patterns/grammars/STIXPatternLexer.py b/stix2patterns/grammars/STIXPatternLexer.py
index 8b0ddd1..a6a1f51 100644
--- a/stix2patterns/grammars/STIXPatternLexer.py
+++ b/stix2patterns/grammars/STIXPatternLexer.py
@@ -9,7 +9,7 @@ import sys
 def serializedATN():
     with StringIO() as buf:
         buf.write(u"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2")
-        buf.write(u"\67\u0257\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6")
+        buf.write(u"\67\u01ef\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6")
         buf.write(u"\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4")
         buf.write(u"\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t")
         buf.write(u"\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27")
@@ -18,277 +18,227 @@ def serializedATN():
         buf.write(u"#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4")
         buf.write(u",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62")
         buf.write(u"\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\4")
-        buf.write(u"8\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@")
-        buf.write(u"\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\t")
-        buf.write(u"I\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R")
-        buf.write(u"\tR\4S\tS\3\2\3\2\3\2\3\2\7\2\u00ac\n\2\f\2\16\2\u00af")
-        buf.write(u"\13\2\5\2\u00b1\n\2\3\3\5\3\u00b4\n\3\3\3\3\3\3\3\7\3")
-        buf.write(u"\u00b9\n\3\f\3\16\3\u00bc\13\3\5\3\u00be\n\3\3\4\3\4")
-        buf.write(u"\7\4\u00c2\n\4\f\4\16\4\u00c5\13\4\3\4\3\4\6\4\u00c9")
-        buf.write(u"\n\4\r\4\16\4\u00ca\3\5\5\5\u00ce\n\5\3\5\7\5\u00d1\n")
-        buf.write(u"\5\f\5\16\5\u00d4\13\5\3\5\3\5\6\5\u00d8\n\5\r\5\16\5")
-        buf.write(u"\u00d9\3\6\3\6\3\6\7\6\u00df\n\6\f\6\16\6\u00e2\13\6")
-        buf.write(u"\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\7\7\u00ed\n\7\f")
-        buf.write(u"\7\16\7\u00f0\13\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3")
-        buf.write(u"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u0103\n\7\3\7")
-        buf.write(u"\3\7\3\b\3\b\3\b\3\b\3\b\3\b\7\b\u010d\n\b\f\b\16\b\u0110")
-        buf.write(u"\13\b\3\b\3\b\3\t\3\t\5\t\u0116\n\t\3\n\3\n\3\n\3\n\3")
-        buf.write(u"\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u0123\n\n\3\n\3\n\3\n")
-        buf.write(u"\3\n\3\n\3\n\3\n\5\n\u012c\n\n\3\n\3\n\3\n\3\n\3\n\5")
-        buf.write(u"\n\u0133\n\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u013d")
-        buf.write(u"\n\n\3\n\3\n\6\n\u0141\n\n\r\n\16\n\u0142\5\n\u0145\n")
-        buf.write(u"\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3")
-        buf.write(u"\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3")
-        buf.write(u"\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20")
-        buf.write(u"\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3")
-        buf.write(u"\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22")
-        buf.write(u"\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3")
-        buf.write(u"\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26")
-        buf.write(u"\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3")
-        buf.write(u"\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31")
-        buf.write(u"\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3")
-        buf.write(u"\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34")
-        buf.write(u"\3\35\3\35\7\35\u01be\n\35\f\35\16\35\u01c1\13\35\3\36")
-        buf.write(u"\3\36\7\36\u01c5\n\36\f\36\16\36\u01c8\13\36\3\37\3\37")
-        buf.write(u"\3\37\5\37\u01cd\n\37\3 \3 \3 \3 \5 \u01d3\n \3!\3!\3")
-        buf.write(u"\"\3\"\3\"\3#\3#\3$\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3")
-        buf.write(u")\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3")
-        buf.write(u"\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3\66")
-        buf.write(u"\3\66\3\67\3\67\38\38\39\39\3:\3:\3;\3;\3<\3<\3=\3=\3")
-        buf.write(u">\3>\3?\3?\3@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F")
-        buf.write(u"\3G\3G\3H\3H\3I\3I\3J\3J\3K\3K\3L\3L\3M\3M\3N\3N\3N\3")
-        buf.write(u"O\3O\3P\6P\u0237\nP\rP\16P\u0238\3P\3P\3Q\3Q\3Q\3Q\7")
-        buf.write(u"Q\u0241\nQ\fQ\16Q\u0244\13Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3")
-        buf.write(u"R\7R\u024f\nR\fR\16R\u0252\13R\3R\3R\3S\3S\3\u0242\2")
-        buf.write(u"T\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r")
-        buf.write(u"\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30")
-        buf.write(u"/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K")
-        buf.write(u"\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\2g\2i\2k\2m\2o\2")
-        buf.write(u"q\2s\2u\2w\2y\2{\2}\2\177\2\u0081\2\u0083\2\u0085\2\u0087")
-        buf.write(u"\2\u0089\2\u008b\2\u008d\2\u008f\2\u0091\2\u0093\2\u0095")
-        buf.write(u"\2\u0097\2\u0099\2\u009b\2\u009d\2\u009f\64\u00a1\65")
-        buf.write(u"\u00a3\66\u00a5\67\3\2+\3\2\63;\3\2\62;\4\2))^^\3\2\62")
-        buf.write(u"\64\3\2\63\64\3\2\62\63\3\2\62\65\3\2\62\67\5\2C\\aa")
-        buf.write(u"c|\6\2\62;C\\aac|\7\2//\62;C\\aac|\4\2CCcc\4\2DDdd\4")
-        buf.write(u"\2EEee\4\2FFff\4\2GGgg\4\2HHhh\4\2IIii\4\2JJjj\4\2KK")
-        buf.write(u"kk\4\2LLll\4\2MMmm\4\2NNnn\4\2OOoo\4\2PPpp\4\2QQqq\4")
-        buf.write(u"\2RRrr\4\2SSss\4\2TTtt\4\2UUuu\4\2VVvv\4\2WWww\4\2XX")
-        buf.write(u"xx\4\2YYyy\4\2ZZzz\4\2[[{{\4\2\\\\||\5\2\62;CHch\6\2")
-        buf.write(u"--\61;C\\c|\f\2\13\17\"\"\u0087\u0087\u00a2\u00a2\u1682")
-        buf.write(u"\u1682\u2002\u200c\u202a\u202b\u2031\u2031\u2061\u2061")
-        buf.write(u"\u3002\u3002\4\2\f\f\17\17\2\u0259\2\3\3\2\2\2\2\5\3")
-        buf.write(u"\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2")
-        buf.write(u"\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2")
-        buf.write(u"\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2")
-        buf.write(u"\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'")
-        buf.write(u"\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2")
-        buf.write(u"\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2")
-        buf.write(u"\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2")
-        buf.write(u"\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2")
-        buf.write(u"\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3")
-        buf.write(u"\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2")
-        buf.write(u"_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2\u009f\3\2\2\2\2\u00a1")
-        buf.write(u"\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\3\u00a7\3\2")
-        buf.write(u"\2\2\5\u00b3\3\2\2\2\7\u00bf\3\2\2\2\t\u00cd\3\2\2\2")
-        buf.write(u"\13\u00db\3\2\2\2\r\u00e5\3\2\2\2\17\u0106\3\2\2\2\21")
-        buf.write(u"\u0115\3\2\2\2\23\u0117\3\2\2\2\25\u0149\3\2\2\2\27\u014d")
-        buf.write(u"\3\2\2\2\31\u0150\3\2\2\2\33\u0154\3\2\2\2\35\u015f\3")
-        buf.write(u"\2\2\2\37\u0164\3\2\2\2!\u016c\3\2\2\2#\u0177\3\2\2\2")
-        buf.write(u"%\u0180\3\2\2\2\'\u0185\3\2\2\2)\u0188\3\2\2\2+\u018e")
-        buf.write(u"\3\2\2\2-\u0193\3\2\2\2/\u019b\3\2\2\2\61\u01a0\3\2\2")
-        buf.write(u"\2\63\u01a6\3\2\2\2\65\u01ad\3\2\2\2\67\u01b5\3\2\2\2")
-        buf.write(u"9\u01bb\3\2\2\2;\u01c2\3\2\2\2=\u01cc\3\2\2\2?\u01d2")
-        buf.write(u"\3\2\2\2A\u01d4\3\2\2\2C\u01d6\3\2\2\2E\u01d9\3\2\2\2")
-        buf.write(u"G\u01db\3\2\2\2I\u01de\3\2\2\2K\u01e0\3\2\2\2M\u01e2")
-        buf.write(u"\3\2\2\2O\u01e4\3\2\2\2Q\u01e6\3\2\2\2S\u01e8\3\2\2\2")
-        buf.write(u"U\u01ea\3\2\2\2W\u01ec\3\2\2\2Y\u01ee\3\2\2\2[\u01f0")
-        buf.write(u"\3\2\2\2]\u01f2\3\2\2\2_\u01f4\3\2\2\2a\u01f6\3\2\2\2")
-        buf.write(u"c\u01f8\3\2\2\2e\u01fa\3\2\2\2g\u01fc\3\2\2\2i\u01fe")
-        buf.write(u"\3\2\2\2k\u0200\3\2\2\2m\u0202\3\2\2\2o\u0204\3\2\2\2")
-        buf.write(u"q\u0206\3\2\2\2s\u0208\3\2\2\2u\u020a\3\2\2\2w\u020c")
-        buf.write(u"\3\2\2\2y\u020e\3\2\2\2{\u0210\3\2\2\2}\u0212\3\2\2\2")
-        buf.write(u"\177\u0214\3\2\2\2\u0081\u0216\3\2\2\2\u0083\u0218\3")
-        buf.write(u"\2\2\2\u0085\u021a\3\2\2\2\u0087\u021c\3\2\2\2\u0089")
-        buf.write(u"\u021e\3\2\2\2\u008b\u0220\3\2\2\2\u008d\u0222\3\2\2")
-        buf.write(u"\2\u008f\u0224\3\2\2\2\u0091\u0226\3\2\2\2\u0093\u0228")
-        buf.write(u"\3\2\2\2\u0095\u022a\3\2\2\2\u0097\u022c\3\2\2\2\u0099")
-        buf.write(u"\u022e\3\2\2\2\u009b\u0230\3\2\2\2\u009d\u0233\3\2\2")
-        buf.write(u"\2\u009f\u0236\3\2\2\2\u00a1\u023c\3\2\2\2\u00a3\u024a")
-        buf.write(u"\3\2\2\2\u00a5\u0255\3\2\2\2\u00a7\u00b0\7/\2\2\u00a8")
-        buf.write(u"\u00b1\7\62\2\2\u00a9\u00ad\t\2\2\2\u00aa\u00ac\t\3\2")
-        buf.write(u"\2\u00ab\u00aa\3\2\2\2\u00ac\u00af\3\2\2\2\u00ad\u00ab")
-        buf.write(u"\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00b1\3\2\2\2\u00af")
-        buf.write(u"\u00ad\3\2\2\2\u00b0\u00a8\3\2\2\2\u00b0\u00a9\3\2\2")
-        buf.write(u"\2\u00b1\4\3\2\2\2\u00b2\u00b4\7-\2\2\u00b3\u00b2\3\2")
-        buf.write(u"\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00bd\3\2\2\2\u00b5\u00be")
-        buf.write(u"\7\62\2\2\u00b6\u00ba\t\2\2\2\u00b7\u00b9\t\3\2\2\u00b8")
-        buf.write(u"\u00b7\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2\2")
-        buf.write(u"\2\u00ba\u00bb\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc\u00ba")
-        buf.write(u"\3\2\2\2\u00bd\u00b5\3\2\2\2\u00bd\u00b6\3\2\2\2\u00be")
-        buf.write(u"\6\3\2\2\2\u00bf\u00c3\7/\2\2\u00c0\u00c2\t\3\2\2\u00c1")
-        buf.write(u"\u00c0\3\2\2\2\u00c2\u00c5\3\2\2\2\u00c3\u00c1\3\2\2")
-        buf.write(u"\2\u00c3\u00c4\3\2\2\2\u00c4\u00c6\3\2\2\2\u00c5\u00c3")
-        buf.write(u"\3\2\2\2\u00c6\u00c8\7\60\2\2\u00c7\u00c9\t\3\2\2\u00c8")
-        buf.write(u"\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00c8\3\2\2")
-        buf.write(u"\2\u00ca\u00cb\3\2\2\2\u00cb\b\3\2\2\2\u00cc\u00ce\7")
-        buf.write(u"-\2\2\u00cd\u00cc\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00d2")
-        buf.write(u"\3\2\2\2\u00cf\u00d1\t\3\2\2\u00d0\u00cf\3\2\2\2\u00d1")
-        buf.write(u"\u00d4\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d2\u00d3\3\2\2")
-        buf.write(u"\2\u00d3\u00d5\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5\u00d7")
-        buf.write(u"\7\60\2\2\u00d6\u00d8\t\3\2\2\u00d7\u00d6\3\2\2\2\u00d8")
-        buf.write(u"\u00d9\3\2\2\2\u00d9\u00d7\3\2\2\2\u00d9\u00da\3\2\2")
-        buf.write(u"\2\u00da\n\3\2\2\2\u00db\u00dc\7j\2\2\u00dc\u00e0\5I")
-        buf.write(u"%\2\u00dd\u00df\5\u009bN\2\u00de\u00dd\3\2\2\2\u00df")
-        buf.write(u"\u00e2\3\2\2\2\u00e0\u00de\3\2\2\2\u00e0\u00e1\3\2\2")
-        buf.write(u"\2\u00e1\u00e3\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e3\u00e4")
-        buf.write(u"\5I%\2\u00e4\f\3\2\2\2\u00e5\u00e6\7d\2\2\u00e6\u00ee")
-        buf.write(u"\5I%\2\u00e7\u00e8\5\u009dO\2\u00e8\u00e9\5\u009dO\2")
-        buf.write(u"\u00e9\u00ea\5\u009dO\2\u00ea\u00eb\5\u009dO\2\u00eb")
-        buf.write(u"\u00ed\3\2\2\2\u00ec\u00e7\3\2\2\2\u00ed\u00f0\3\2\2")
-        buf.write(u"\2\u00ee\u00ec\3\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u0102")
-        buf.write(u"\3\2\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f2\5\u009dO\2\u00f2")
-        buf.write(u"\u00f3\5\u009dO\2\u00f3\u00f4\5\u009dO\2\u00f4\u00f5")
-        buf.write(u"\5\u009dO\2\u00f5\u0103\3\2\2\2\u00f6\u00f7\5\u009dO")
-        buf.write(u"\2\u00f7\u00f8\5\u009dO\2\u00f8\u00f9\5\u009dO\2\u00f9")
-        buf.write(u"\u00fa\3\2\2\2\u00fa\u00fb\7?\2\2\u00fb\u0103\3\2\2\2")
-        buf.write(u"\u00fc\u00fd\5\u009dO\2\u00fd\u00fe\5\u009dO\2\u00fe")
-        buf.write(u"\u00ff\3\2\2\2\u00ff\u0100\7?\2\2\u0100\u0101\7?\2\2")
-        buf.write(u"\u0101\u0103\3\2\2\2\u0102\u00f1\3\2\2\2\u0102\u00f6")
-        buf.write(u"\3\2\2\2\u0102\u00fc\3\2\2\2\u0103\u0104\3\2\2\2\u0104")
-        buf.write(u"\u0105\5I%\2\u0105\16\3\2\2\2\u0106\u010e\5I%\2\u0107")
-        buf.write(u"\u010d\n\4\2\2\u0108\u0109\7^\2\2\u0109\u010d\7)\2\2")
-        buf.write(u"\u010a\u010b\7^\2\2\u010b\u010d\7^\2\2\u010c\u0107\3")
-        buf.write(u"\2\2\2\u010c\u0108\3\2\2\2\u010c\u010a\3\2\2\2\u010d")
-        buf.write(u"\u0110\3\2\2\2\u010e\u010c\3\2\2\2\u010e\u010f\3\2\2")
-        buf.write(u"\2\u010f\u0111\3\2\2\2\u0110\u010e\3\2\2\2\u0111\u0112")
-        buf.write(u"\5I%\2\u0112\20\3\2\2\2\u0113\u0116\5/\30\2\u0114\u0116")
-        buf.write(u"\5\61\31\2\u0115\u0113\3\2\2\2\u0115\u0114\3\2\2\2\u0116")
-        buf.write(u"\22\3\2\2\2\u0117\u0118\7v\2\2\u0118\u0119\5I%\2\u0119")
-        buf.write(u"\u011a\t\3\2\2\u011a\u011b\t\3\2\2\u011b\u011c\t\3\2")
-        buf.write(u"\2\u011c\u011d\t\3\2\2\u011d\u0122\5[.\2\u011e\u011f")
-        buf.write(u"\7\62\2\2\u011f\u0123\t\2\2\2\u0120\u0121\7\63\2\2\u0121")
-        buf.write(u"\u0123\t\5\2\2\u0122\u011e\3\2\2\2\u0122\u0120\3\2\2")
-        buf.write(u"\2\u0123\u0124\3\2\2\2\u0124\u012b\5[.\2\u0125\u0126")
-        buf.write(u"\7\62\2\2\u0126\u012c\t\2\2\2\u0127\u0128\t\6\2\2\u0128")
-        buf.write(u"\u012c\t\3\2\2\u0129\u012a\7\65\2\2\u012a\u012c\t\7\2")
-        buf.write(u"\2\u012b\u0125\3\2\2\2\u012b\u0127\3\2\2\2\u012b\u0129")
-        buf.write(u"\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u0132\7V\2\2\u012e")
-        buf.write(u"\u012f\t\7\2\2\u012f\u0133\t\3\2\2\u0130\u0131\7\64\2")
-        buf.write(u"\2\u0131\u0133\t\b\2\2\u0132\u012e\3\2\2\2\u0132\u0130")
-        buf.write(u"\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0135\5K&\2\u0135")
-        buf.write(u"\u0136\t\t\2\2\u0136\u0137\t\3\2\2\u0137\u013c\5K&\2")
-        buf.write(u"\u0138\u0139\t\t\2\2\u0139\u013d\t\3\2\2\u013a\u013b")
-        buf.write(u"\78\2\2\u013b\u013d\7\62\2\2\u013c\u0138\3\2\2\2\u013c")
-        buf.write(u"\u013a\3\2\2\2\u013d\u0144\3\2\2\2\u013e\u0140\5M\'\2")
-        buf.write(u"\u013f\u0141\t\3\2\2\u0140\u013f\3\2\2\2\u0141\u0142")
-        buf.write(u"\3\2\2\2\u0142\u0140\3\2\2\2\u0142\u0143\3\2\2\2\u0143")
-        buf.write(u"\u0145\3\2\2\2\u0144\u013e\3\2\2\2\u0144\u0145\3\2\2")
-        buf.write(u"\2\u0145\u0146\3\2\2\2\u0146\u0147\7\\\2\2\u0147\u0148")
-        buf.write(u"\5I%\2\u0148\24\3\2\2\2\u0149\u014a\5e\63\2\u014a\u014b")
-        buf.write(u"\5\177@\2\u014b\u014c\5k\66\2\u014c\26\3\2\2\2\u014d")
-        buf.write(u"\u014e\5\u0081A\2\u014e\u014f\5\u0087D\2\u014f\30\3\2")
-        buf.write(u"\2\2\u0150\u0151\5\177@\2\u0151\u0152\5\u0081A\2\u0152")
-        buf.write(u"\u0153\5\u008bF\2\u0153\32\3\2\2\2\u0154\u0155\5o8\2")
-        buf.write(u"\u0155\u0156\5\u0081A\2\u0156\u0157\5{>\2\u0157\u0158")
-        buf.write(u"\5{>\2\u0158\u0159\5\u0081A\2\u0159\u015a\5\u0091I\2")
-        buf.write(u"\u015a\u015b\5m\67\2\u015b\u015c\5k\66\2\u015c\u015d")
-        buf.write(u"\5g\64\2\u015d\u015e\5\u0095K\2\u015e\34\3\2\2\2\u015f")
-        buf.write(u"\u0160\5{>\2\u0160\u0161\5u;\2\u0161\u0162\5y=\2\u0162")
-        buf.write(u"\u0163\5m\67\2\u0163\36\3\2\2\2\u0164\u0165\5}?\2\u0165")
-        buf.write(u"\u0166\5e\63\2\u0166\u0167\5\u008bF\2\u0167\u0168\5i")
-        buf.write(u"\65\2\u0168\u0169\5s:\2\u0169\u016a\5m\67\2\u016a\u016b")
-        buf.write(u"\5\u0089E\2\u016b \3\2\2\2\u016c\u016d\5u;\2\u016d\u016e")
-        buf.write(u"\5\u0089E\2\u016e\u016f\5\u0089E\2\u016f\u0170\5\u008d")
-        buf.write(u"G\2\u0170\u0171\5\u0083B\2\u0171\u0172\5m\67\2\u0172")
-        buf.write(u"\u0173\5\u0087D\2\u0173\u0174\5\u0089E\2\u0174\u0175")
-        buf.write(u"\5m\67\2\u0175\u0176\5\u008bF\2\u0176\"\3\2\2\2\u0177")
-        buf.write(u"\u0178\5u;\2\u0178\u0179\5\u0089E\2\u0179\u017a\5\u0089")
-        buf.write(u"E\2\u017a\u017b\5\u008dG\2\u017b\u017c\5g\64\2\u017c")
-        buf.write(u"\u017d\5\u0089E\2\u017d\u017e\5m\67\2\u017e\u017f\5\u008b")
-        buf.write(u"F\2\u017f$\3\2\2\2\u0180\u0181\5{>\2\u0181\u0182\5e\63")
-        buf.write(u"\2\u0182\u0183\5\u0089E\2\u0183\u0184\5\u008bF\2\u0184")
-        buf.write(u"&\3\2\2\2\u0185\u0186\5u;\2\u0186\u0187\5\177@\2\u0187")
-        buf.write(u"(\3\2\2\2\u0188\u0189\5\u0089E\2\u0189\u018a\5\u008b")
-        buf.write(u"F\2\u018a\u018b\5e\63\2\u018b\u018c\5\u0087D\2\u018c")
-        buf.write(u"\u018d\5\u008bF\2\u018d*\3\2\2\2\u018e\u018f\5\u0089")
-        buf.write(u"E\2\u018f\u0190\5\u008bF\2\u0190\u0191\5\u0081A\2\u0191")
-        buf.write(u"\u0192\5\u0083B\2\u0192,\3\2\2\2\u0193\u0194\5\u0089")
-        buf.write(u"E\2\u0194\u0195\5m\67\2\u0195\u0196\5i\65\2\u0196\u0197")
-        buf.write(u"\5\u0081A\2\u0197\u0198\5\177@\2\u0198\u0199\5k\66\2")
-        buf.write(u"\u0199\u019a\5\u0089E\2\u019a.\3\2\2\2\u019b\u019c\5")
-        buf.write(u"\u008bF\2\u019c\u019d\5\u0087D\2\u019d\u019e\5\u008d")
-        buf.write(u"G\2\u019e\u019f\5m\67\2\u019f\60\3\2\2\2\u01a0\u01a1")
-        buf.write(u"\5o8\2\u01a1\u01a2\5e\63\2\u01a2\u01a3\5{>\2\u01a3\u01a4")
-        buf.write(u"\5\u0089E\2\u01a4\u01a5\5m\67\2\u01a5\62\3\2\2\2\u01a6")
-        buf.write(u"\u01a7\5\u0091I\2\u01a7\u01a8\5u;\2\u01a8\u01a9\5\u008b")
-        buf.write(u"F\2\u01a9\u01aa\5s:\2\u01aa\u01ab\5u;\2\u01ab\u01ac\5")
-        buf.write(u"\177@\2\u01ac\64\3\2\2\2\u01ad\u01ae\5\u0087D\2\u01ae")
-        buf.write(u"\u01af\5m\67\2\u01af\u01b0\5\u0083B\2\u01b0\u01b1\5m")
-        buf.write(u"\67\2\u01b1\u01b2\5e\63\2\u01b2\u01b3\5\u008bF\2\u01b3")
-        buf.write(u"\u01b4\5\u0089E\2\u01b4\66\3\2\2\2\u01b5\u01b6\5\u008b")
-        buf.write(u"F\2\u01b6\u01b7\5u;\2\u01b7\u01b8\5}?\2\u01b8\u01b9\5")
-        buf.write(u"m\67\2\u01b9\u01ba\5\u0089E\2\u01ba8\3\2\2\2\u01bb\u01bf")
-        buf.write(u"\t\n\2\2\u01bc\u01be\t\13\2\2\u01bd\u01bc\3\2\2\2\u01be")
-        buf.write(u"\u01c1\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2")
-        buf.write(u"\2\u01c0:\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c2\u01c6\t\n")
-        buf.write(u"\2\2\u01c3\u01c5\t\f\2\2\u01c4\u01c3\3\2\2\2\u01c5\u01c8")
-        buf.write(u"\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7")
-        buf.write(u"<\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c9\u01cd\7?\2\2\u01ca")
-        buf.write(u"\u01cb\7?\2\2\u01cb\u01cd\7?\2\2\u01cc\u01c9\3\2\2\2")
-        buf.write(u"\u01cc\u01ca\3\2\2\2\u01cd>\3\2\2\2\u01ce\u01cf\7#\2")
-        buf.write(u"\2\u01cf\u01d3\7?\2\2\u01d0\u01d1\7>\2\2\u01d1\u01d3")
-        buf.write(u"\7@\2\2\u01d2\u01ce\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d3")
-        buf.write(u"@\3\2\2\2\u01d4\u01d5\7>\2\2\u01d5B\3\2\2\2\u01d6\u01d7")
-        buf.write(u"\7>\2\2\u01d7\u01d8\7?\2\2\u01d8D\3\2\2\2\u01d9\u01da")
-        buf.write(u"\7@\2\2\u01daF\3\2\2\2\u01db\u01dc\7@\2\2\u01dc\u01dd")
-        buf.write(u"\7?\2\2\u01ddH\3\2\2\2\u01de\u01df\7)\2\2\u01dfJ\3\2")
-        buf.write(u"\2\2\u01e0\u01e1\7<\2\2\u01e1L\3\2\2\2\u01e2\u01e3\7")
-        buf.write(u"\60\2\2\u01e3N\3\2\2\2\u01e4\u01e5\7.\2\2\u01e5P\3\2")
-        buf.write(u"\2\2\u01e6\u01e7\7+\2\2\u01e7R\3\2\2\2\u01e8\u01e9\7")
-        buf.write(u"*\2\2\u01e9T\3\2\2\2\u01ea\u01eb\7_\2\2\u01ebV\3\2\2")
-        buf.write(u"\2\u01ec\u01ed\7]\2\2\u01edX\3\2\2\2\u01ee\u01ef\7-\2")
-        buf.write(u"\2\u01efZ\3\2\2\2\u01f0\u01f1\5]/\2\u01f1\\\3\2\2\2\u01f2")
-        buf.write(u"\u01f3\7/\2\2\u01f3^\3\2\2\2\u01f4\u01f5\7`\2\2\u01f5")
-        buf.write(u"`\3\2\2\2\u01f6\u01f7\7\61\2\2\u01f7b\3\2\2\2\u01f8\u01f9")
-        buf.write(u"\7,\2\2\u01f9d\3\2\2\2\u01fa\u01fb\t\r\2\2\u01fbf\3\2")
-        buf.write(u"\2\2\u01fc\u01fd\t\16\2\2\u01fdh\3\2\2\2\u01fe\u01ff")
-        buf.write(u"\t\17\2\2\u01ffj\3\2\2\2\u0200\u0201\t\20\2\2\u0201l")
-        buf.write(u"\3\2\2\2\u0202\u0203\t\21\2\2\u0203n\3\2\2\2\u0204\u0205")
-        buf.write(u"\t\22\2\2\u0205p\3\2\2\2\u0206\u0207\t\23\2\2\u0207r")
-        buf.write(u"\3\2\2\2\u0208\u0209\t\24\2\2\u0209t\3\2\2\2\u020a\u020b")
-        buf.write(u"\t\25\2\2\u020bv\3\2\2\2\u020c\u020d\t\26\2\2\u020dx")
-        buf.write(u"\3\2\2\2\u020e\u020f\t\27\2\2\u020fz\3\2\2\2\u0210\u0211")
-        buf.write(u"\t\30\2\2\u0211|\3\2\2\2\u0212\u0213\t\31\2\2\u0213~")
-        buf.write(u"\3\2\2\2\u0214\u0215\t\32\2\2\u0215\u0080\3\2\2\2\u0216")
-        buf.write(u"\u0217\t\33\2\2\u0217\u0082\3\2\2\2\u0218\u0219\t\34")
-        buf.write(u"\2\2\u0219\u0084\3\2\2\2\u021a\u021b\t\35\2\2\u021b\u0086")
-        buf.write(u"\3\2\2\2\u021c\u021d\t\36\2\2\u021d\u0088\3\2\2\2\u021e")
-        buf.write(u"\u021f\t\37\2\2\u021f\u008a\3\2\2\2\u0220\u0221\t \2")
-        buf.write(u"\2\u0221\u008c\3\2\2\2\u0222\u0223\t!\2\2\u0223\u008e")
-        buf.write(u"\3\2\2\2\u0224\u0225\t\"\2\2\u0225\u0090\3\2\2\2\u0226")
-        buf.write(u"\u0227\t#\2\2\u0227\u0092\3\2\2\2\u0228\u0229\t$\2\2")
-        buf.write(u"\u0229\u0094\3\2\2\2\u022a\u022b\t%\2\2\u022b\u0096\3")
-        buf.write(u"\2\2\2\u022c\u022d\t&\2\2\u022d\u0098\3\2\2\2\u022e\u022f")
-        buf.write(u"\t\'\2\2\u022f\u009a\3\2\2\2\u0230\u0231\5\u0099M\2\u0231")
-        buf.write(u"\u0232\5\u0099M\2\u0232\u009c\3\2\2\2\u0233\u0234\t(")
-        buf.write(u"\2\2\u0234\u009e\3\2\2\2\u0235\u0237\t)\2\2\u0236\u0235")
-        buf.write(u"\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u0236\3\2\2\2\u0238")
-        buf.write(u"\u0239\3\2\2\2\u0239\u023a\3\2\2\2\u023a\u023b\bP\2\2")
-        buf.write(u"\u023b\u00a0\3\2\2\2\u023c\u023d\7\61\2\2\u023d\u023e")
-        buf.write(u"\7,\2\2\u023e\u0242\3\2\2\2\u023f\u0241\13\2\2\2\u0240")
-        buf.write(u"\u023f\3\2\2\2\u0241\u0244\3\2\2\2\u0242\u0243\3\2\2")
-        buf.write(u"\2\u0242\u0240\3\2\2\2\u0243\u0245\3\2\2\2\u0244\u0242")
-        buf.write(u"\3\2\2\2\u0245\u0246\7,\2\2\u0246\u0247\7\61\2\2\u0247")
-        buf.write(u"\u0248\3\2\2\2\u0248\u0249\bQ\2\2\u0249\u00a2\3\2\2\2")
-        buf.write(u"\u024a\u024b\7\61\2\2\u024b\u024c\7\61\2\2\u024c\u0250")
-        buf.write(u"\3\2\2\2\u024d\u024f\n*\2\2\u024e\u024d\3\2\2\2\u024f")
-        buf.write(u"\u0252\3\2\2\2\u0250\u024e\3\2\2\2\u0250\u0251\3\2\2")
-        buf.write(u"\2\u0251\u0253\3\2\2\2\u0252\u0250\3\2\2\2\u0253\u0254")
-        buf.write(u"\bR\2\2\u0254\u00a4\3\2\2\2\u0255\u0256\13\2\2\2\u0256")
-        buf.write(u"\u00a6\3\2\2\2 \2\u00ad\u00b0\u00b3\u00ba\u00bd\u00c3")
-        buf.write(u"\u00ca\u00cd\u00d2\u00d9\u00e0\u00ee\u0102\u010c\u010e")
-        buf.write(u"\u0115\u0122\u012b\u0132\u013c\u0142\u0144\u01bf\u01c6")
-        buf.write(u"\u01cc\u01d2\u0238\u0242\u0250\3\b\2\2")
+        buf.write(u"8\t8\49\t9\3\2\3\2\3\2\3\2\7\2x\n\2\f\2\16\2{\13\2\5")
+        buf.write(u"\2}\n\2\3\3\5\3\u0080\n\3\3\3\3\3\3\3\7\3\u0085\n\3\f")
+        buf.write(u"\3\16\3\u0088\13\3\5\3\u008a\n\3\3\4\3\4\7\4\u008e\n")
+        buf.write(u"\4\f\4\16\4\u0091\13\4\3\4\3\4\6\4\u0095\n\4\r\4\16\4")
+        buf.write(u"\u0096\3\5\5\5\u009a\n\5\3\5\7\5\u009d\n\5\f\5\16\5\u00a0")
+        buf.write(u"\13\5\3\5\3\5\6\5\u00a4\n\5\r\5\16\5\u00a5\3\6\3\6\3")
+        buf.write(u"\6\7\6\u00ab\n\6\f\6\16\6\u00ae\13\6\3\6\3\6\3\7\3\7")
+        buf.write(u"\3\7\3\7\3\7\3\7\3\7\7\7\u00b9\n\7\f\7\16\7\u00bc\13")
+        buf.write(u"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3")
+        buf.write(u"\7\3\7\3\7\3\7\3\7\5\7\u00cf\n\7\3\7\3\7\3\b\3\b\3\b")
+        buf.write(u"\3\b\3\b\3\b\7\b\u00d9\n\b\f\b\16\b\u00dc\13\b\3\b\3")
+        buf.write(u"\b\3\t\3\t\5\t\u00e2\n\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n")
+        buf.write(u"\3\n\3\n\3\n\3\n\5\n\u00ef\n\n\3\n\3\n\3\n\3\n\3\n\3")
+        buf.write(u"\n\3\n\5\n\u00f8\n\n\3\n\3\n\3\n\3\n\3\n\5\n\u00ff\n")
+        buf.write(u"\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u0109\n\n\3\n")
+        buf.write(u"\3\n\6\n\u010d\n\n\r\n\16\n\u010e\5\n\u0111\n\n\3\n\3")
+        buf.write(u"\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3")
+        buf.write(u"\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16")
+        buf.write(u"\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3")
+        buf.write(u"\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21")
+        buf.write(u"\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3")
+        buf.write(u"\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24")
+        buf.write(u"\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3")
+        buf.write(u"\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30")
+        buf.write(u"\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3")
+        buf.write(u"\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33")
+        buf.write(u"\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3")
+        buf.write(u"\35\7\35\u018a\n\35\f\35\16\35\u018d\13\35\3\36\3\36")
+        buf.write(u"\7\36\u0191\n\36\f\36\16\36\u0194\13\36\3\37\3\37\3\37")
+        buf.write(u"\5\37\u0199\n\37\3 \3 \3 \3 \5 \u019f\n \3!\3!\3\"\3")
+        buf.write(u"\"\3\"\3#\3#\3$\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3")
+        buf.write(u")\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61")
+        buf.write(u"\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3")
+        buf.write(u"\66\6\66\u01cf\n\66\r\66\16\66\u01d0\3\66\3\66\3\67\3")
+        buf.write(u"\67\3\67\3\67\7\67\u01d9\n\67\f\67\16\67\u01dc\13\67")
+        buf.write(u"\3\67\3\67\3\67\3\67\3\67\38\38\38\38\78\u01e7\n8\f8")
+        buf.write(u"\168\u01ea\138\38\38\39\39\3\u01da\2:\3\3\5\4\7\5\t\6")
+        buf.write(u"\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20")
+        buf.write(u"\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65")
+        buf.write(u"\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]")
+        buf.write(u"\60_\61a\62c\63e\2g\2i\2k\64m\65o\66q\67\3\2\21\3\2\63")
+        buf.write(u";\3\2\62;\4\2))^^\3\2\62\64\3\2\63\64\3\2\62\63\3\2\62")
+        buf.write(u"\65\3\2\62\67\5\2C\\aac|\6\2\62;C\\aac|\7\2//\62;C\\")
+        buf.write(u"aac|\5\2\62;CHch\6\2--\61;C\\c|\f\2\13\17\"\"\u0087\u0087")
+        buf.write(u"\u00a2\u00a2\u1682\u1682\u2002\u200c\u202a\u202b\u2031")
+        buf.write(u"\u2031\u2061\u2061\u3002\u3002\4\2\f\f\17\17\2\u020b")
+        buf.write(u"\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13")
+        buf.write(u"\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3")
+        buf.write(u"\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3")
+        buf.write(u"\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2")
+        buf.write(u"\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3")
+        buf.write(u"\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2")
+        buf.write(u"\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2")
+        buf.write(u"?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2")
+        buf.write(u"\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2")
+        buf.write(u"\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2")
+        buf.write(u"\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2k\3")
+        buf.write(u"\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\3s\3\2\2\2\5")
+        buf.write(u"\177\3\2\2\2\7\u008b\3\2\2\2\t\u0099\3\2\2\2\13\u00a7")
+        buf.write(u"\3\2\2\2\r\u00b1\3\2\2\2\17\u00d2\3\2\2\2\21\u00e1\3")
+        buf.write(u"\2\2\2\23\u00e3\3\2\2\2\25\u0115\3\2\2\2\27\u0119\3\2")
+        buf.write(u"\2\2\31\u011c\3\2\2\2\33\u0120\3\2\2\2\35\u012b\3\2\2")
+        buf.write(u"\2\37\u0130\3\2\2\2!\u0138\3\2\2\2#\u0143\3\2\2\2%\u014c")
+        buf.write(u"\3\2\2\2\'\u0151\3\2\2\2)\u0154\3\2\2\2+\u015a\3\2\2")
+        buf.write(u"\2-\u015f\3\2\2\2/\u0167\3\2\2\2\61\u016c\3\2\2\2\63")
+        buf.write(u"\u0172\3\2\2\2\65\u0179\3\2\2\2\67\u0181\3\2\2\29\u0187")
+        buf.write(u"\3\2\2\2;\u018e\3\2\2\2=\u0198\3\2\2\2?\u019e\3\2\2\2")
+        buf.write(u"A\u01a0\3\2\2\2C\u01a2\3\2\2\2E\u01a5\3\2\2\2G\u01a7")
+        buf.write(u"\3\2\2\2I\u01aa\3\2\2\2K\u01ac\3\2\2\2M\u01ae\3\2\2\2")
+        buf.write(u"O\u01b0\3\2\2\2Q\u01b2\3\2\2\2S\u01b4\3\2\2\2U\u01b6")
+        buf.write(u"\3\2\2\2W\u01b8\3\2\2\2Y\u01ba\3\2\2\2[\u01bc\3\2\2\2")
+        buf.write(u"]\u01be\3\2\2\2_\u01c0\3\2\2\2a\u01c2\3\2\2\2c\u01c4")
+        buf.write(u"\3\2\2\2e\u01c6\3\2\2\2g\u01c8\3\2\2\2i\u01cb\3\2\2\2")
+        buf.write(u"k\u01ce\3\2\2\2m\u01d4\3\2\2\2o\u01e2\3\2\2\2q\u01ed")
+        buf.write(u"\3\2\2\2s|\7/\2\2t}\7\62\2\2uy\t\2\2\2vx\t\3\2\2wv\3")
+        buf.write(u"\2\2\2x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z}\3\2\2\2{y\3\2")
+        buf.write(u"\2\2|t\3\2\2\2|u\3\2\2\2}\4\3\2\2\2~\u0080\7-\2\2\177")
+        buf.write(u"~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0089\3\2\2\2\u0081")
+        buf.write(u"\u008a\7\62\2\2\u0082\u0086\t\2\2\2\u0083\u0085\t\3\2")
+        buf.write(u"\2\u0084\u0083\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084")
+        buf.write(u"\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u008a\3\2\2\2\u0088")
+        buf.write(u"\u0086\3\2\2\2\u0089\u0081\3\2\2\2\u0089\u0082\3\2\2")
+        buf.write(u"\2\u008a\6\3\2\2\2\u008b\u008f\7/\2\2\u008c\u008e\t\3")
+        buf.write(u"\2\2\u008d\u008c\3\2\2\2\u008e\u0091\3\2\2\2\u008f\u008d")
+        buf.write(u"\3\2\2\2\u008f\u0090\3\2\2\2\u0090\u0092\3\2\2\2\u0091")
+        buf.write(u"\u008f\3\2\2\2\u0092\u0094\7\60\2\2\u0093\u0095\t\3\2")
+        buf.write(u"\2\u0094\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0094")
+        buf.write(u"\3\2\2\2\u0096\u0097\3\2\2\2\u0097\b\3\2\2\2\u0098\u009a")
+        buf.write(u"\7-\2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a")
+        buf.write(u"\u009e\3\2\2\2\u009b\u009d\t\3\2\2\u009c\u009b\3\2\2")
+        buf.write(u"\2\u009d\u00a0\3\2\2\2\u009e\u009c\3\2\2\2\u009e\u009f")
+        buf.write(u"\3\2\2\2\u009f\u00a1\3\2\2\2\u00a0\u009e\3\2\2\2\u00a1")
+        buf.write(u"\u00a3\7\60\2\2\u00a2\u00a4\t\3\2\2\u00a3\u00a2\3\2\2")
+        buf.write(u"\2\u00a4\u00a5\3\2\2\2\u00a5\u00a3\3\2\2\2\u00a5\u00a6")
+        buf.write(u"\3\2\2\2\u00a6\n\3\2\2\2\u00a7\u00a8\7j\2\2\u00a8\u00ac")
+        buf.write(u"\5I%\2\u00a9\u00ab\5g\64\2\u00aa\u00a9\3\2\2\2\u00ab")
+        buf.write(u"\u00ae\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ac\u00ad\3\2\2")
+        buf.write(u"\2\u00ad\u00af\3\2\2\2\u00ae\u00ac\3\2\2\2\u00af\u00b0")
+        buf.write(u"\5I%\2\u00b0\f\3\2\2\2\u00b1\u00b2\7d\2\2\u00b2\u00ba")
+        buf.write(u"\5I%\2\u00b3\u00b4\5i\65\2\u00b4\u00b5\5i\65\2\u00b5")
+        buf.write(u"\u00b6\5i\65\2\u00b6\u00b7\5i\65\2\u00b7\u00b9\3\2\2")
+        buf.write(u"\2\u00b8\u00b3\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8")
+        buf.write(u"\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb\u00ce\3\2\2\2\u00bc")
+        buf.write(u"\u00ba\3\2\2\2\u00bd\u00be\5i\65\2\u00be\u00bf\5i\65")
+        buf.write(u"\2\u00bf\u00c0\5i\65\2\u00c0\u00c1\5i\65\2\u00c1\u00cf")
+        buf.write(u"\3\2\2\2\u00c2\u00c3\5i\65\2\u00c3\u00c4\5i\65\2\u00c4")
+        buf.write(u"\u00c5\5i\65\2\u00c5\u00c6\3\2\2\2\u00c6\u00c7\7?\2\2")
+        buf.write(u"\u00c7\u00cf\3\2\2\2\u00c8\u00c9\5i\65\2\u00c9\u00ca")
+        buf.write(u"\5i\65\2\u00ca\u00cb\3\2\2\2\u00cb\u00cc\7?\2\2\u00cc")
+        buf.write(u"\u00cd\7?\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00bd\3\2\2\2")
+        buf.write(u"\u00ce\u00c2\3\2\2\2\u00ce\u00c8\3\2\2\2\u00cf\u00d0")
+        buf.write(u"\3\2\2\2\u00d0\u00d1\5I%\2\u00d1\16\3\2\2\2\u00d2\u00da")
+        buf.write(u"\5I%\2\u00d3\u00d9\n\4\2\2\u00d4\u00d5\7^\2\2\u00d5\u00d9")
+        buf.write(u"\7)\2\2\u00d6\u00d7\7^\2\2\u00d7\u00d9\7^\2\2\u00d8\u00d3")
+        buf.write(u"\3\2\2\2\u00d8\u00d4\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d9")
+        buf.write(u"\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da\u00db\3\2\2")
+        buf.write(u"\2\u00db\u00dd\3\2\2\2\u00dc\u00da\3\2\2\2\u00dd\u00de")
+        buf.write(u"\5I%\2\u00de\20\3\2\2\2\u00df\u00e2\5/\30\2\u00e0\u00e2")
+        buf.write(u"\5\61\31\2\u00e1\u00df\3\2\2\2\u00e1\u00e0\3\2\2\2\u00e2")
+        buf.write(u"\22\3\2\2\2\u00e3\u00e4\7v\2\2\u00e4\u00e5\5I%\2\u00e5")
+        buf.write(u"\u00e6\t\3\2\2\u00e6\u00e7\t\3\2\2\u00e7\u00e8\t\3\2")
+        buf.write(u"\2\u00e8\u00e9\t\3\2\2\u00e9\u00ee\5[.\2\u00ea\u00eb")
+        buf.write(u"\7\62\2\2\u00eb\u00ef\t\2\2\2\u00ec\u00ed\7\63\2\2\u00ed")
+        buf.write(u"\u00ef\t\5\2\2\u00ee\u00ea\3\2\2\2\u00ee\u00ec\3\2\2")
+        buf.write(u"\2\u00ef\u00f0\3\2\2\2\u00f0\u00f7\5[.\2\u00f1\u00f2")
+        buf.write(u"\7\62\2\2\u00f2\u00f8\t\2\2\2\u00f3\u00f4\t\6\2\2\u00f4")
+        buf.write(u"\u00f8\t\3\2\2\u00f5\u00f6\7\65\2\2\u00f6\u00f8\t\7\2")
+        buf.write(u"\2\u00f7\u00f1\3\2\2\2\u00f7\u00f3\3\2\2\2\u00f7\u00f5")
+        buf.write(u"\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fe\7V\2\2\u00fa")
+        buf.write(u"\u00fb\t\7\2\2\u00fb\u00ff\t\3\2\2\u00fc\u00fd\7\64\2")
+        buf.write(u"\2\u00fd\u00ff\t\b\2\2\u00fe\u00fa\3\2\2\2\u00fe\u00fc")
+        buf.write(u"\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101\5K&\2\u0101")
+        buf.write(u"\u0102\t\t\2\2\u0102\u0103\t\3\2\2\u0103\u0108\5K&\2")
+        buf.write(u"\u0104\u0105\t\t\2\2\u0105\u0109\t\3\2\2\u0106\u0107")
+        buf.write(u"\78\2\2\u0107\u0109\7\62\2\2\u0108\u0104\3\2\2\2\u0108")
+        buf.write(u"\u0106\3\2\2\2\u0109\u0110\3\2\2\2\u010a\u010c\5M\'\2")
+        buf.write(u"\u010b\u010d\t\3\2\2\u010c\u010b\3\2\2\2\u010d\u010e")
+        buf.write(u"\3\2\2\2\u010e\u010c\3\2\2\2\u010e\u010f\3\2\2\2\u010f")
+        buf.write(u"\u0111\3\2\2\2\u0110\u010a\3\2\2\2\u0110\u0111\3\2\2")
+        buf.write(u"\2\u0111\u0112\3\2\2\2\u0112\u0113\7\\\2\2\u0113\u0114")
+        buf.write(u"\5I%\2\u0114\24\3\2\2\2\u0115\u0116\7C\2\2\u0116\u0117")
+        buf.write(u"\7P\2\2\u0117\u0118\7F\2\2\u0118\26\3\2\2\2\u0119\u011a")
+        buf.write(u"\7Q\2\2\u011a\u011b\7T\2\2\u011b\30\3\2\2\2\u011c\u011d")
+        buf.write(u"\7P\2\2\u011d\u011e\7Q\2\2\u011e\u011f\7V\2\2\u011f\32")
+        buf.write(u"\3\2\2\2\u0120\u0121\7H\2\2\u0121\u0122\7Q\2\2\u0122")
+        buf.write(u"\u0123\7N\2\2\u0123\u0124\7N\2\2\u0124\u0125\7Q\2\2\u0125")
+        buf.write(u"\u0126\7Y\2\2\u0126\u0127\7G\2\2\u0127\u0128\7F\2\2\u0128")
+        buf.write(u"\u0129\7D\2\2\u0129\u012a\7[\2\2\u012a\34\3\2\2\2\u012b")
+        buf.write(u"\u012c\7N\2\2\u012c\u012d\7K\2\2\u012d\u012e\7M\2\2\u012e")
+        buf.write(u"\u012f\7G\2\2\u012f\36\3\2\2\2\u0130\u0131\7O\2\2\u0131")
+        buf.write(u"\u0132\7C\2\2\u0132\u0133\7V\2\2\u0133\u0134\7E\2\2\u0134")
+        buf.write(u"\u0135\7J\2\2\u0135\u0136\7G\2\2\u0136\u0137\7U\2\2\u0137")
+        buf.write(u" \3\2\2\2\u0138\u0139\7K\2\2\u0139\u013a\7U\2\2\u013a")
+        buf.write(u"\u013b\7U\2\2\u013b\u013c\7W\2\2\u013c\u013d\7R\2\2\u013d")
+        buf.write(u"\u013e\7G\2\2\u013e\u013f\7T\2\2\u013f\u0140\7U\2\2\u0140")
+        buf.write(u"\u0141\7G\2\2\u0141\u0142\7V\2\2\u0142\"\3\2\2\2\u0143")
+        buf.write(u"\u0144\7K\2\2\u0144\u0145\7U\2\2\u0145\u0146\7U\2\2\u0146")
+        buf.write(u"\u0147\7W\2\2\u0147\u0148\7D\2\2\u0148\u0149\7U\2\2\u0149")
+        buf.write(u"\u014a\7G\2\2\u014a\u014b\7V\2\2\u014b$\3\2\2\2\u014c")
+        buf.write(u"\u014d\7N\2\2\u014d\u014e\7C\2\2\u014e\u014f\7U\2\2\u014f")
+        buf.write(u"\u0150\7V\2\2\u0150&\3\2\2\2\u0151\u0152\7K\2\2\u0152")
+        buf.write(u"\u0153\7P\2\2\u0153(\3\2\2\2\u0154\u0155\7U\2\2\u0155")
+        buf.write(u"\u0156\7V\2\2\u0156\u0157\7C\2\2\u0157\u0158\7T\2\2\u0158")
+        buf.write(u"\u0159\7V\2\2\u0159*\3\2\2\2\u015a\u015b\7U\2\2\u015b")
+        buf.write(u"\u015c\7V\2\2\u015c\u015d\7Q\2\2\u015d\u015e\7R\2\2\u015e")
+        buf.write(u",\3\2\2\2\u015f\u0160\7U\2\2\u0160\u0161\7G\2\2\u0161")
+        buf.write(u"\u0162\7E\2\2\u0162\u0163\7Q\2\2\u0163\u0164\7P\2\2\u0164")
+        buf.write(u"\u0165\7F\2\2\u0165\u0166\7U\2\2\u0166.\3\2\2\2\u0167")
+        buf.write(u"\u0168\7v\2\2\u0168\u0169\7t\2\2\u0169\u016a\7w\2\2\u016a")
+        buf.write(u"\u016b\7g\2\2\u016b\60\3\2\2\2\u016c\u016d\7h\2\2\u016d")
+        buf.write(u"\u016e\7c\2\2\u016e\u016f\7n\2\2\u016f\u0170\7u\2\2\u0170")
+        buf.write(u"\u0171\7g\2\2\u0171\62\3\2\2\2\u0172\u0173\7Y\2\2\u0173")
+        buf.write(u"\u0174\7K\2\2\u0174\u0175\7V\2\2\u0175\u0176\7J\2\2\u0176")
+        buf.write(u"\u0177\7K\2\2\u0177\u0178\7P\2\2\u0178\64\3\2\2\2\u0179")
+        buf.write(u"\u017a\7T\2\2\u017a\u017b\7G\2\2\u017b\u017c\7R\2\2\u017c")
+        buf.write(u"\u017d\7G\2\2\u017d\u017e\7C\2\2\u017e\u017f\7V\2\2\u017f")
+        buf.write(u"\u0180\7U\2\2\u0180\66\3\2\2\2\u0181\u0182\7V\2\2\u0182")
+        buf.write(u"\u0183\7K\2\2\u0183\u0184\7O\2\2\u0184\u0185\7G\2\2\u0185")
+        buf.write(u"\u0186\7U\2\2\u01868\3\2\2\2\u0187\u018b\t\n\2\2\u0188")
+        buf.write(u"\u018a\t\13\2\2\u0189\u0188\3\2\2\2\u018a\u018d\3\2\2")
+        buf.write(u"\2\u018b\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c:\3\2")
+        buf.write(u"\2\2\u018d\u018b\3\2\2\2\u018e\u0192\t\n\2\2\u018f\u0191")
+        buf.write(u"\t\f\2\2\u0190\u018f\3\2\2\2\u0191\u0194\3\2\2\2\u0192")
+        buf.write(u"\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193<\3\2\2\2\u0194")
+        buf.write(u"\u0192\3\2\2\2\u0195\u0199\7?\2\2\u0196\u0197\7?\2\2")
+        buf.write(u"\u0197\u0199\7?\2\2\u0198\u0195\3\2\2\2\u0198\u0196\3")
+        buf.write(u"\2\2\2\u0199>\3\2\2\2\u019a\u019b\7#\2\2\u019b\u019f")
+        buf.write(u"\7?\2\2\u019c\u019d\7>\2\2\u019d\u019f\7@\2\2\u019e\u019a")
+        buf.write(u"\3\2\2\2\u019e\u019c\3\2\2\2\u019f@\3\2\2\2\u01a0\u01a1")
+        buf.write(u"\7>\2\2\u01a1B\3\2\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4")
+        buf.write(u"\7?\2\2\u01a4D\3\2\2\2\u01a5\u01a6\7@\2\2\u01a6F\3\2")
+        buf.write(u"\2\2\u01a7\u01a8\7@\2\2\u01a8\u01a9\7?\2\2\u01a9H\3\2")
+        buf.write(u"\2\2\u01aa\u01ab\7)\2\2\u01abJ\3\2\2\2\u01ac\u01ad\7")
+        buf.write(u"<\2\2\u01adL\3\2\2\2\u01ae\u01af\7\60\2\2\u01afN\3\2")
+        buf.write(u"\2\2\u01b0\u01b1\7.\2\2\u01b1P\3\2\2\2\u01b2\u01b3\7")
+        buf.write(u"+\2\2\u01b3R\3\2\2\2\u01b4\u01b5\7*\2\2\u01b5T\3\2\2")
+        buf.write(u"\2\u01b6\u01b7\7_\2\2\u01b7V\3\2\2\2\u01b8\u01b9\7]\2")
+        buf.write(u"\2\u01b9X\3\2\2\2\u01ba\u01bb\7-\2\2\u01bbZ\3\2\2\2\u01bc")
+        buf.write(u"\u01bd\5]/\2\u01bd\\\3\2\2\2\u01be\u01bf\7/\2\2\u01bf")
+        buf.write(u"^\3\2\2\2\u01c0\u01c1\7`\2\2\u01c1`\3\2\2\2\u01c2\u01c3")
+        buf.write(u"\7\61\2\2\u01c3b\3\2\2\2\u01c4\u01c5\7,\2\2\u01c5d\3")
+        buf.write(u"\2\2\2\u01c6\u01c7\t\r\2\2\u01c7f\3\2\2\2\u01c8\u01c9")
+        buf.write(u"\5e\63\2\u01c9\u01ca\5e\63\2\u01cah\3\2\2\2\u01cb\u01cc")
+        buf.write(u"\t\16\2\2\u01ccj\3\2\2\2\u01cd\u01cf\t\17\2\2\u01ce\u01cd")
+        buf.write(u"\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0")
+        buf.write(u"\u01d1\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3\b\66\2")
+        buf.write(u"\2\u01d3l\3\2\2\2\u01d4\u01d5\7\61\2\2\u01d5\u01d6\7")
+        buf.write(u",\2\2\u01d6\u01da\3\2\2\2\u01d7\u01d9\13\2\2\2\u01d8")
+        buf.write(u"\u01d7\3\2\2\2\u01d9\u01dc\3\2\2\2\u01da\u01db\3\2\2")
+        buf.write(u"\2\u01da\u01d8\3\2\2\2\u01db\u01dd\3\2\2\2\u01dc\u01da")
+        buf.write(u"\3\2\2\2\u01dd\u01de\7,\2\2\u01de\u01df\7\61\2\2\u01df")
+        buf.write(u"\u01e0\3\2\2\2\u01e0\u01e1\b\67\2\2\u01e1n\3\2\2\2\u01e2")
+        buf.write(u"\u01e3\7\61\2\2\u01e3\u01e4\7\61\2\2\u01e4\u01e8\3\2")
+        buf.write(u"\2\2\u01e5\u01e7\n\20\2\2\u01e6\u01e5\3\2\2\2\u01e7\u01ea")
+        buf.write(u"\3\2\2\2\u01e8\u01e6\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9")
+        buf.write(u"\u01eb\3\2\2\2\u01ea\u01e8\3\2\2\2\u01eb\u01ec\b8\2\2")
+        buf.write(u"\u01ecp\3\2\2\2\u01ed\u01ee\13\2\2\2\u01eer\3\2\2\2 ")
+        buf.write(u"\2y|\177\u0086\u0089\u008f\u0096\u0099\u009e\u00a5\u00ac")
+        buf.write(u"\u00ba\u00ce\u00d8\u00da\u00e1\u00ee\u00f7\u00fe\u0108")
+        buf.write(u"\u010e\u0110\u018b\u0192\u0198\u019e\u01d0\u01da\u01e8")
+        buf.write(u"\3\b\2\2")
         return buf.getvalue()
 
 
@@ -357,35 +307,35 @@ class STIXPatternLexer(Lexer):
     modeNames = [ u"DEFAULT_MODE" ]
 
     literalNames = [ u"<INVALID>",
-            u"'<'", u"'<='", u"'>'", u"'>='", u"'''", u"':'", u"'.'", u"','",
-            u"')'", u"'('", u"']'", u"'['", u"'+'", u"'-'", u"'^'", u"'/'",
-            u"'*'" ]
+            u"'AND'", u"'OR'", u"'NOT'", u"'FOLLOWEDBY'", u"'LIKE'", u"'MATCHES'", 
+            u"'ISSUPERSET'", u"'ISSUBSET'", u"'LAST'", u"'IN'", u"'START'", 
+            u"'STOP'", u"'SECONDS'", u"'true'", u"'false'", u"'WITHIN'", 
+            u"'REPEATS'", u"'TIMES'", u"'<'", u"'<='", u"'>'", u"'>='", 
+            u"'''", u"':'", u"'.'", u"','", u"')'", u"'('", u"']'", u"'['", 
+            u"'+'", u"'-'", u"'^'", u"'/'", u"'*'" ]
 
     symbolicNames = [ u"<INVALID>",
-            u"IntNegLiteral", u"IntPosLiteral", u"FloatNegLiteral", u"FloatPosLiteral",
-            u"HexLiteral", u"BinaryLiteral", u"StringLiteral", u"BoolLiteral",
-            u"TimestampLiteral", u"AND", u"OR", u"NOT", u"FOLLOWEDBY", u"LIKE",
-            u"MATCHES", u"ISSUPERSET", u"ISSUBSET", u"LAST", u"IN", u"START",
-            u"STOP", u"SECONDS", u"TRUE", u"FALSE", u"WITHIN", u"REPEATS",
-            u"TIMES", u"IdentifierWithoutHyphen", u"IdentifierWithHyphen",
-            u"EQ", u"NEQ", u"LT", u"LE", u"GT", u"GE", u"QUOTE", u"COLON",
-            u"DOT", u"COMMA", u"RPAREN", u"LPAREN", u"RBRACK", u"LBRACK",
-            u"PLUS", u"HYPHEN", u"MINUS", u"POWER_OP", u"DIVIDE", u"ASTERISK",
+            u"IntNegLiteral", u"IntPosLiteral", u"FloatNegLiteral", u"FloatPosLiteral", 
+            u"HexLiteral", u"BinaryLiteral", u"StringLiteral", u"BoolLiteral", 
+            u"TimestampLiteral", u"AND", u"OR", u"NOT", u"FOLLOWEDBY", u"LIKE", 
+            u"MATCHES", u"ISSUPERSET", u"ISSUBSET", u"LAST", u"IN", u"START", 
+            u"STOP", u"SECONDS", u"TRUE", u"FALSE", u"WITHIN", u"REPEATS", 
+            u"TIMES", u"IdentifierWithoutHyphen", u"IdentifierWithHyphen", 
+            u"EQ", u"NEQ", u"LT", u"LE", u"GT", u"GE", u"QUOTE", u"COLON", 
+            u"DOT", u"COMMA", u"RPAREN", u"LPAREN", u"RBRACK", u"LBRACK", 
+            u"PLUS", u"HYPHEN", u"MINUS", u"POWER_OP", u"DIVIDE", u"ASTERISK", 
             u"WS", u"COMMENT", u"LINE_COMMENT", u"InvalidCharacter" ]
 
-    ruleNames = [ u"IntNegLiteral", u"IntPosLiteral", u"FloatNegLiteral",
-                  u"FloatPosLiteral", u"HexLiteral", u"BinaryLiteral", u"StringLiteral",
-                  u"BoolLiteral", u"TimestampLiteral", u"AND", u"OR", u"NOT",
-                  u"FOLLOWEDBY", u"LIKE", u"MATCHES", u"ISSUPERSET", u"ISSUBSET",
-                  u"LAST", u"IN", u"START", u"STOP", u"SECONDS", u"TRUE",
-                  u"FALSE", u"WITHIN", u"REPEATS", u"TIMES", u"IdentifierWithoutHyphen",
-                  u"IdentifierWithHyphen", u"EQ", u"NEQ", u"LT", u"LE",
-                  u"GT", u"GE", u"QUOTE", u"COLON", u"DOT", u"COMMA", u"RPAREN",
-                  u"LPAREN", u"RBRACK", u"LBRACK", u"PLUS", u"HYPHEN", u"MINUS",
-                  u"POWER_OP", u"DIVIDE", u"ASTERISK", u"A", u"B", u"C",
-                  u"D", u"E", u"F", u"G", u"H", u"I", u"J", u"K", u"L",
-                  u"M", u"N", u"O", u"P", u"Q", u"R", u"S", u"T", u"U",
-                  u"V", u"W", u"X", u"Y", u"Z", u"HexDigit", u"TwoHexDigits",
+    ruleNames = [ u"IntNegLiteral", u"IntPosLiteral", u"FloatNegLiteral", 
+                  u"FloatPosLiteral", u"HexLiteral", u"BinaryLiteral", u"StringLiteral", 
+                  u"BoolLiteral", u"TimestampLiteral", u"AND", u"OR", u"NOT", 
+                  u"FOLLOWEDBY", u"LIKE", u"MATCHES", u"ISSUPERSET", u"ISSUBSET", 
+                  u"LAST", u"IN", u"START", u"STOP", u"SECONDS", u"TRUE", 
+                  u"FALSE", u"WITHIN", u"REPEATS", u"TIMES", u"IdentifierWithoutHyphen", 
+                  u"IdentifierWithHyphen", u"EQ", u"NEQ", u"LT", u"LE", 
+                  u"GT", u"GE", u"QUOTE", u"COLON", u"DOT", u"COMMA", u"RPAREN", 
+                  u"LPAREN", u"RBRACK", u"LBRACK", u"PLUS", u"HYPHEN", u"MINUS", 
+                  u"POWER_OP", u"DIVIDE", u"ASTERISK", u"HexDigit", u"TwoHexDigits", 
                   u"Base64Char", u"WS", u"COMMENT", u"LINE_COMMENT", u"InvalidCharacter" ]
 
     grammarFileName = u"STIXPattern.g4"
@@ -396,3 +346,5 @@ class STIXPatternLexer(Lexer):
         self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
         self._actions = None
         self._predicates = None
+
+
diff --git a/stix2patterns/grammars/STIXPatternListener.py b/stix2patterns/grammars/STIXPatternListener.py
index e7f88d4..4af4467 100644
--- a/stix2patterns/grammars/STIXPatternListener.py
+++ b/stix2patterns/grammars/STIXPatternListener.py
@@ -1,8 +1,6 @@
 # Generated from STIXPattern.g4 by ANTLR 4.7.1
-
 from antlr4 import *
 
-
 # This class defines a complete listener for a parse tree produced by STIXPatternParser.
 class STIXPatternListener(ParseTreeListener):
 
@@ -283,3 +281,5 @@ class STIXPatternListener(ParseTreeListener):
     # Exit a parse tree produced by STIXPatternParser#orderableLiteral.
     def exitOrderableLiteral(self, ctx):
         pass
+
+
diff --git a/stix2patterns/grammars/STIXPatternParser.py b/stix2patterns/grammars/STIXPatternParser.py
index c4d3e6d..b74cc45 100644
--- a/stix2patterns/grammars/STIXPatternParser.py
+++ b/stix2patterns/grammars/STIXPatternParser.py
@@ -1,112 +1,109 @@
 # Generated from STIXPattern.g4 by ANTLR 4.7.1
 # encoding: utf-8
 from __future__ import print_function
-
+from antlr4 import *
 from io import StringIO
 import sys
 
-from antlr4 import *
-
-
 def serializedATN():
     with StringIO() as buf:
         buf.write(u"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3")
-        buf.write(u"\67\u00e8\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7")
+        buf.write(u"\67\u00e9\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7")
         buf.write(u"\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t")
         buf.write(u"\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22")
-        buf.write(u"\4\23\t\23\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\7\3/\n\3\f")
-        buf.write(u"\3\16\3\62\13\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4:\n\4\f\4")
-        buf.write(u"\16\4=\13\4\3\5\3\5\3\5\3\5\3\5\3\5\7\5E\n\5\f\5\16\5")
-        buf.write(u"H\13\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6S\n\6\3")
-        buf.write(u"\6\3\6\3\6\3\6\3\6\3\6\7\6[\n\6\f\6\16\6^\13\6\3\7\3")
-        buf.write(u"\7\3\7\3\7\3\7\3\7\7\7f\n\7\f\7\16\7i\13\7\3\b\3\b\3")
-        buf.write(u"\b\3\b\3\b\3\b\7\bq\n\b\f\b\16\bt\13\b\3\t\3\t\5\tx\n")
-        buf.write(u"\t\3\t\3\t\3\t\3\t\3\t\5\t\177\n\t\3\t\3\t\3\t\3\t\3")
-        buf.write(u"\t\5\t\u0086\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u008d\n\t\3")
-        buf.write(u"\t\3\t\3\t\3\t\3\t\5\t\u0094\n\t\3\t\3\t\3\t\3\t\3\t")
-        buf.write(u"\5\t\u009b\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u00a2\n\t\3\t")
-        buf.write(u"\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u00ab\n\t\3\n\3\n\3\n\3")
-        buf.write(u"\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3")
-        buf.write(u"\r\3\r\5\r\u00be\n\r\3\16\3\16\3\17\3\17\3\20\3\20\3")
-        buf.write(u"\20\3\20\3\20\3\20\5\20\u00ca\n\20\3\20\3\20\7\20\u00ce")
-        buf.write(u"\n\20\f\20\16\20\u00d1\13\20\3\21\3\21\3\21\3\21\3\21")
-        buf.write(u"\3\21\7\21\u00d9\n\21\f\21\16\21\u00dc\13\21\3\21\3\21")
-        buf.write(u"\5\21\u00e0\n\21\3\22\3\22\5\22\u00e4\n\22\3\23\3\23")
-        buf.write(u"\3\23\2\t\4\6\b\n\f\16\36\24\2\4\6\b\n\f\16\20\22\24")
-        buf.write(u"\26\30\32\34\36 \"$\2\t\3\2 !\3\2\"%\4\2\4\4\6\6\3\2")
-        buf.write(u"\36\37\4\2\t\t\36\36\4\2\3\4\63\63\4\2\3\t\13\13\2\u00f2")
-        buf.write(u"\2&\3\2\2\2\4(\3\2\2\2\6\63\3\2\2\2\b>\3\2\2\2\nR\3\2")
-        buf.write(u"\2\2\f_\3\2\2\2\16j\3\2\2\2\20\u00aa\3\2\2\2\22\u00ac")
-        buf.write(u"\3\2\2\2\24\u00b1\3\2\2\2\26\u00b5\3\2\2\2\30\u00b9\3")
-        buf.write(u"\2\2\2\32\u00bf\3\2\2\2\34\u00c1\3\2\2\2\36\u00c9\3\2")
-        buf.write(u"\2\2 \u00df\3\2\2\2\"\u00e3\3\2\2\2$\u00e5\3\2\2\2&\'")
-        buf.write(u"\5\4\3\2\'\3\3\2\2\2()\b\3\1\2)*\5\6\4\2*\60\3\2\2\2")
-        buf.write(u"+,\f\4\2\2,-\7\17\2\2-/\5\4\3\5.+\3\2\2\2/\62\3\2\2\2")
-        buf.write(u"\60.\3\2\2\2\60\61\3\2\2\2\61\5\3\2\2\2\62\60\3\2\2\2")
-        buf.write(u"\63\64\b\4\1\2\64\65\5\b\5\2\65;\3\2\2\2\66\67\f\4\2")
-        buf.write(u"\2\678\7\r\2\28:\5\6\4\59\66\3\2\2\2:=\3\2\2\2;9\3\2")
-        buf.write(u"\2\2;<\3\2\2\2<\7\3\2\2\2=;\3\2\2\2>?\b\5\1\2?@\5\n\6")
-        buf.write(u"\2@F\3\2\2\2AB\f\4\2\2BC\7\f\2\2CE\5\b\5\5DA\3\2\2\2")
-        buf.write(u"EH\3\2\2\2FD\3\2\2\2FG\3\2\2\2G\t\3\2\2\2HF\3\2\2\2I")
-        buf.write(u"J\b\6\1\2JK\7-\2\2KL\5\f\7\2LM\7,\2\2MS\3\2\2\2NO\7+")
-        buf.write(u"\2\2OP\5\4\3\2PQ\7*\2\2QS\3\2\2\2RI\3\2\2\2RN\3\2\2\2")
-        buf.write(u"S\\\3\2\2\2TU\f\5\2\2U[\5\22\n\2VW\f\4\2\2W[\5\24\13")
-        buf.write(u"\2XY\f\3\2\2Y[\5\26\f\2ZT\3\2\2\2ZV\3\2\2\2ZX\3\2\2\2")
-        buf.write(u"[^\3\2\2\2\\Z\3\2\2\2\\]\3\2\2\2]\13\3\2\2\2^\\\3\2\2")
-        buf.write(u"\2_`\b\7\1\2`a\5\16\b\2ag\3\2\2\2bc\f\4\2\2cd\7\r\2\2")
-        buf.write(u"df\5\f\7\5eb\3\2\2\2fi\3\2\2\2ge\3\2\2\2gh\3\2\2\2h\r")
-        buf.write(u"\3\2\2\2ig\3\2\2\2jk\b\b\1\2kl\5\20\t\2lr\3\2\2\2mn\f")
-        buf.write(u"\4\2\2no\7\f\2\2oq\5\16\b\5pm\3\2\2\2qt\3\2\2\2rp\3\2")
-        buf.write(u"\2\2rs\3\2\2\2s\17\3\2\2\2tr\3\2\2\2uw\5\30\r\2vx\7\16")
-        buf.write(u"\2\2wv\3\2\2\2wx\3\2\2\2xy\3\2\2\2yz\t\2\2\2z{\5\"\22")
-        buf.write(u"\2{\u00ab\3\2\2\2|~\5\30\r\2}\177\7\16\2\2~}\3\2\2\2")
-        buf.write(u"~\177\3\2\2\2\177\u0080\3\2\2\2\u0080\u0081\t\3\2\2\u0081")
-        buf.write(u"\u0082\5$\23\2\u0082\u00ab\3\2\2\2\u0083\u0085\5\30\r")
-        buf.write(u"\2\u0084\u0086\7\16\2\2\u0085\u0084\3\2\2\2\u0085\u0086")
-        buf.write(u"\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088\7\25\2\2\u0088")
-        buf.write(u"\u0089\5 \21\2\u0089\u00ab\3\2\2\2\u008a\u008c\5\30\r")
-        buf.write(u"\2\u008b\u008d\7\16\2\2\u008c\u008b\3\2\2\2\u008c\u008d")
-        buf.write(u"\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\7\20\2\2\u008f")
-        buf.write(u"\u0090\7\t\2\2\u0090\u00ab\3\2\2\2\u0091\u0093\5\30\r")
-        buf.write(u"\2\u0092\u0094\7\16\2\2\u0093\u0092\3\2\2\2\u0093\u0094")
-        buf.write(u"\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0096\7\21\2\2\u0096")
-        buf.write(u"\u0097\7\t\2\2\u0097\u00ab\3\2\2\2\u0098\u009a\5\30\r")
-        buf.write(u"\2\u0099\u009b\7\16\2\2\u009a\u0099\3\2\2\2\u009a\u009b")
-        buf.write(u"\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009d\7\23\2\2\u009d")
-        buf.write(u"\u009e\7\t\2\2\u009e\u00ab\3\2\2\2\u009f\u00a1\5\30\r")
-        buf.write(u"\2\u00a0\u00a2\7\16\2\2\u00a1\u00a0\3\2\2\2\u00a1\u00a2")
-        buf.write(u"\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a4\7\22\2\2\u00a4")
-        buf.write(u"\u00a5\7\t\2\2\u00a5\u00ab\3\2\2\2\u00a6\u00a7\7+\2\2")
-        buf.write(u"\u00a7\u00a8\5\f\7\2\u00a8\u00a9\7*\2\2\u00a9\u00ab\3")
-        buf.write(u"\2\2\2\u00aau\3\2\2\2\u00aa|\3\2\2\2\u00aa\u0083\3\2")
-        buf.write(u"\2\2\u00aa\u008a\3\2\2\2\u00aa\u0091\3\2\2\2\u00aa\u0098")
-        buf.write(u"\3\2\2\2\u00aa\u009f\3\2\2\2\u00aa\u00a6\3\2\2\2\u00ab")
-        buf.write(u"\21\3\2\2\2\u00ac\u00ad\7\26\2\2\u00ad\u00ae\7\t\2\2")
-        buf.write(u"\u00ae\u00af\7\27\2\2\u00af\u00b0\7\t\2\2\u00b0\23\3")
-        buf.write(u"\2\2\2\u00b1\u00b2\7\33\2\2\u00b2\u00b3\t\4\2\2\u00b3")
-        buf.write(u"\u00b4\7\30\2\2\u00b4\25\3\2\2\2\u00b5\u00b6\7\34\2\2")
-        buf.write(u"\u00b6\u00b7\7\4\2\2\u00b7\u00b8\7\35\2\2\u00b8\27\3")
-        buf.write(u"\2\2\2\u00b9\u00ba\5\32\16\2\u00ba\u00bb\7\'\2\2\u00bb")
-        buf.write(u"\u00bd\5\34\17\2\u00bc\u00be\5\36\20\2\u00bd\u00bc\3")
-        buf.write(u"\2\2\2\u00bd\u00be\3\2\2\2\u00be\31\3\2\2\2\u00bf\u00c0")
-        buf.write(u"\t\5\2\2\u00c0\33\3\2\2\2\u00c1\u00c2\t\6\2\2\u00c2\35")
-        buf.write(u"\3\2\2\2\u00c3\u00c4\b\20\1\2\u00c4\u00c5\7(\2\2\u00c5")
-        buf.write(u"\u00ca\t\6\2\2\u00c6\u00c7\7-\2\2\u00c7\u00c8\t\7\2\2")
-        buf.write(u"\u00c8\u00ca\7,\2\2\u00c9\u00c3\3\2\2\2\u00c9\u00c6\3")
-        buf.write(u"\2\2\2\u00ca\u00cf\3\2\2\2\u00cb\u00cc\f\5\2\2\u00cc")
-        buf.write(u"\u00ce\5\36\20\6\u00cd\u00cb\3\2\2\2\u00ce\u00d1\3\2")
-        buf.write(u"\2\2\u00cf\u00cd\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\37")
-        buf.write(u"\3\2\2\2\u00d1\u00cf\3\2\2\2\u00d2\u00d3\7+\2\2\u00d3")
-        buf.write(u"\u00e0\7*\2\2\u00d4\u00d5\7+\2\2\u00d5\u00da\5\"\22\2")
-        buf.write(u"\u00d6\u00d7\7)\2\2\u00d7\u00d9\5\"\22\2\u00d8\u00d6")
-        buf.write(u"\3\2\2\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da")
-        buf.write(u"\u00db\3\2\2\2\u00db\u00dd\3\2\2\2\u00dc\u00da\3\2\2")
-        buf.write(u"\2\u00dd\u00de\7*\2\2\u00de\u00e0\3\2\2\2\u00df\u00d2")
-        buf.write(u"\3\2\2\2\u00df\u00d4\3\2\2\2\u00e0!\3\2\2\2\u00e1\u00e4")
-        buf.write(u"\5$\23\2\u00e2\u00e4\7\n\2\2\u00e3\u00e1\3\2\2\2\u00e3")
-        buf.write(u"\u00e2\3\2\2\2\u00e4#\3\2\2\2\u00e5\u00e6\t\b\2\2\u00e6")
-        buf.write(u"%\3\2\2\2\30\60;FRZ\\grw~\u0085\u008c\u0093\u009a\u00a1")
-        buf.write(u"\u00aa\u00bd\u00c9\u00cf\u00da\u00df\u00e3")
+        buf.write(u"\4\23\t\23\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\7\3\60")
+        buf.write(u"\n\3\f\3\16\3\63\13\3\3\4\3\4\3\4\3\4\3\4\3\4\7\4;\n")
+        buf.write(u"\4\f\4\16\4>\13\4\3\5\3\5\3\5\3\5\3\5\3\5\7\5F\n\5\f")
+        buf.write(u"\5\16\5I\13\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6")
+        buf.write(u"T\n\6\3\6\3\6\3\6\3\6\3\6\3\6\7\6\\\n\6\f\6\16\6_\13")
+        buf.write(u"\6\3\7\3\7\3\7\3\7\3\7\3\7\7\7g\n\7\f\7\16\7j\13\7\3")
+        buf.write(u"\b\3\b\3\b\3\b\3\b\3\b\7\br\n\b\f\b\16\bu\13\b\3\t\3")
+        buf.write(u"\t\5\ty\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0080\n\t\3\t\3\t")
+        buf.write(u"\3\t\3\t\3\t\5\t\u0087\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u008e")
+        buf.write(u"\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0095\n\t\3\t\3\t\3\t\3")
+        buf.write(u"\t\3\t\5\t\u009c\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u00a3\n")
+        buf.write(u"\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u00ac\n\t\3\n\3\n")
+        buf.write(u"\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r")
+        buf.write(u"\3\r\3\r\3\r\5\r\u00bf\n\r\3\16\3\16\3\17\3\17\3\20\3")
+        buf.write(u"\20\3\20\3\20\3\20\3\20\5\20\u00cb\n\20\3\20\3\20\7\20")
+        buf.write(u"\u00cf\n\20\f\20\16\20\u00d2\13\20\3\21\3\21\3\21\3\21")
+        buf.write(u"\3\21\3\21\7\21\u00da\n\21\f\21\16\21\u00dd\13\21\3\21")
+        buf.write(u"\3\21\5\21\u00e1\n\21\3\22\3\22\5\22\u00e5\n\22\3\23")
+        buf.write(u"\3\23\3\23\2\t\4\6\b\n\f\16\36\24\2\4\6\b\n\f\16\20\22")
+        buf.write(u"\24\26\30\32\34\36 \"$\2\t\3\2 !\3\2\"%\4\2\4\4\6\6\3")
+        buf.write(u"\2\36\37\4\2\t\t\36\36\4\2\3\4\63\63\4\2\3\t\13\13\2")
+        buf.write(u"\u00f3\2&\3\2\2\2\4)\3\2\2\2\6\64\3\2\2\2\b?\3\2\2\2")
+        buf.write(u"\nS\3\2\2\2\f`\3\2\2\2\16k\3\2\2\2\20\u00ab\3\2\2\2\22")
+        buf.write(u"\u00ad\3\2\2\2\24\u00b2\3\2\2\2\26\u00b6\3\2\2\2\30\u00ba")
+        buf.write(u"\3\2\2\2\32\u00c0\3\2\2\2\34\u00c2\3\2\2\2\36\u00ca\3")
+        buf.write(u"\2\2\2 \u00e0\3\2\2\2\"\u00e4\3\2\2\2$\u00e6\3\2\2\2")
+        buf.write(u"&\'\5\4\3\2\'(\7\2\2\3(\3\3\2\2\2)*\b\3\1\2*+\5\6\4\2")
+        buf.write(u"+\61\3\2\2\2,-\f\4\2\2-.\7\17\2\2.\60\5\4\3\5/,\3\2\2")
+        buf.write(u"\2\60\63\3\2\2\2\61/\3\2\2\2\61\62\3\2\2\2\62\5\3\2\2")
+        buf.write(u"\2\63\61\3\2\2\2\64\65\b\4\1\2\65\66\5\b\5\2\66<\3\2")
+        buf.write(u"\2\2\678\f\4\2\289\7\r\2\29;\5\6\4\5:\67\3\2\2\2;>\3")
+        buf.write(u"\2\2\2<:\3\2\2\2<=\3\2\2\2=\7\3\2\2\2><\3\2\2\2?@\b\5")
+        buf.write(u"\1\2@A\5\n\6\2AG\3\2\2\2BC\f\4\2\2CD\7\f\2\2DF\5\b\5")
+        buf.write(u"\5EB\3\2\2\2FI\3\2\2\2GE\3\2\2\2GH\3\2\2\2H\t\3\2\2\2")
+        buf.write(u"IG\3\2\2\2JK\b\6\1\2KL\7-\2\2LM\5\f\7\2MN\7,\2\2NT\3")
+        buf.write(u"\2\2\2OP\7+\2\2PQ\5\4\3\2QR\7*\2\2RT\3\2\2\2SJ\3\2\2")
+        buf.write(u"\2SO\3\2\2\2T]\3\2\2\2UV\f\5\2\2V\\\5\22\n\2WX\f\4\2")
+        buf.write(u"\2X\\\5\24\13\2YZ\f\3\2\2Z\\\5\26\f\2[U\3\2\2\2[W\3\2")
+        buf.write(u"\2\2[Y\3\2\2\2\\_\3\2\2\2][\3\2\2\2]^\3\2\2\2^\13\3\2")
+        buf.write(u"\2\2_]\3\2\2\2`a\b\7\1\2ab\5\16\b\2bh\3\2\2\2cd\f\4\2")
+        buf.write(u"\2de\7\r\2\2eg\5\f\7\5fc\3\2\2\2gj\3\2\2\2hf\3\2\2\2")
+        buf.write(u"hi\3\2\2\2i\r\3\2\2\2jh\3\2\2\2kl\b\b\1\2lm\5\20\t\2")
+        buf.write(u"ms\3\2\2\2no\f\4\2\2op\7\f\2\2pr\5\16\b\5qn\3\2\2\2r")
+        buf.write(u"u\3\2\2\2sq\3\2\2\2st\3\2\2\2t\17\3\2\2\2us\3\2\2\2v")
+        buf.write(u"x\5\30\r\2wy\7\16\2\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2z")
+        buf.write(u"{\t\2\2\2{|\5\"\22\2|\u00ac\3\2\2\2}\177\5\30\r\2~\u0080")
+        buf.write(u"\7\16\2\2\177~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0081")
+        buf.write(u"\3\2\2\2\u0081\u0082\t\3\2\2\u0082\u0083\5$\23\2\u0083")
+        buf.write(u"\u00ac\3\2\2\2\u0084\u0086\5\30\r\2\u0085\u0087\7\16")
+        buf.write(u"\2\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088")
+        buf.write(u"\3\2\2\2\u0088\u0089\7\25\2\2\u0089\u008a\5 \21\2\u008a")
+        buf.write(u"\u00ac\3\2\2\2\u008b\u008d\5\30\r\2\u008c\u008e\7\16")
+        buf.write(u"\2\2\u008d\u008c\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f")
+        buf.write(u"\3\2\2\2\u008f\u0090\7\20\2\2\u0090\u0091\7\t\2\2\u0091")
+        buf.write(u"\u00ac\3\2\2\2\u0092\u0094\5\30\r\2\u0093\u0095\7\16")
+        buf.write(u"\2\2\u0094\u0093\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0096")
+        buf.write(u"\3\2\2\2\u0096\u0097\7\21\2\2\u0097\u0098\7\t\2\2\u0098")
+        buf.write(u"\u00ac\3\2\2\2\u0099\u009b\5\30\r\2\u009a\u009c\7\16")
+        buf.write(u"\2\2\u009b\u009a\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009d")
+        buf.write(u"\3\2\2\2\u009d\u009e\7\23\2\2\u009e\u009f\7\t\2\2\u009f")
+        buf.write(u"\u00ac\3\2\2\2\u00a0\u00a2\5\30\r\2\u00a1\u00a3\7\16")
+        buf.write(u"\2\2\u00a2\u00a1\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a4")
+        buf.write(u"\3\2\2\2\u00a4\u00a5\7\22\2\2\u00a5\u00a6\7\t\2\2\u00a6")
+        buf.write(u"\u00ac\3\2\2\2\u00a7\u00a8\7+\2\2\u00a8\u00a9\5\f\7\2")
+        buf.write(u"\u00a9\u00aa\7*\2\2\u00aa\u00ac\3\2\2\2\u00abv\3\2\2")
+        buf.write(u"\2\u00ab}\3\2\2\2\u00ab\u0084\3\2\2\2\u00ab\u008b\3\2")
+        buf.write(u"\2\2\u00ab\u0092\3\2\2\2\u00ab\u0099\3\2\2\2\u00ab\u00a0")
+        buf.write(u"\3\2\2\2\u00ab\u00a7\3\2\2\2\u00ac\21\3\2\2\2\u00ad\u00ae")
+        buf.write(u"\7\26\2\2\u00ae\u00af\7\t\2\2\u00af\u00b0\7\27\2\2\u00b0")
+        buf.write(u"\u00b1\7\t\2\2\u00b1\23\3\2\2\2\u00b2\u00b3\7\33\2\2")
+        buf.write(u"\u00b3\u00b4\t\4\2\2\u00b4\u00b5\7\30\2\2\u00b5\25\3")
+        buf.write(u"\2\2\2\u00b6\u00b7\7\34\2\2\u00b7\u00b8\7\4\2\2\u00b8")
+        buf.write(u"\u00b9\7\35\2\2\u00b9\27\3\2\2\2\u00ba\u00bb\5\32\16")
+        buf.write(u"\2\u00bb\u00bc\7\'\2\2\u00bc\u00be\5\34\17\2\u00bd\u00bf")
+        buf.write(u"\5\36\20\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf")
+        buf.write(u"\31\3\2\2\2\u00c0\u00c1\t\5\2\2\u00c1\33\3\2\2\2\u00c2")
+        buf.write(u"\u00c3\t\6\2\2\u00c3\35\3\2\2\2\u00c4\u00c5\b\20\1\2")
+        buf.write(u"\u00c5\u00c6\7(\2\2\u00c6\u00cb\t\6\2\2\u00c7\u00c8\7")
+        buf.write(u"-\2\2\u00c8\u00c9\t\7\2\2\u00c9\u00cb\7,\2\2\u00ca\u00c4")
+        buf.write(u"\3\2\2\2\u00ca\u00c7\3\2\2\2\u00cb\u00d0\3\2\2\2\u00cc")
+        buf.write(u"\u00cd\f\5\2\2\u00cd\u00cf\5\36\20\6\u00ce\u00cc\3\2")
+        buf.write(u"\2\2\u00cf\u00d2\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d0\u00d1")
+        buf.write(u"\3\2\2\2\u00d1\37\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d3\u00d4")
+        buf.write(u"\7+\2\2\u00d4\u00e1\7*\2\2\u00d5\u00d6\7+\2\2\u00d6\u00db")
+        buf.write(u"\5\"\22\2\u00d7\u00d8\7)\2\2\u00d8\u00da\5\"\22\2\u00d9")
+        buf.write(u"\u00d7\3\2\2\2\u00da\u00dd\3\2\2\2\u00db\u00d9\3\2\2")
+        buf.write(u"\2\u00db\u00dc\3\2\2\2\u00dc\u00de\3\2\2\2\u00dd\u00db")
+        buf.write(u"\3\2\2\2\u00de\u00df\7*\2\2\u00df\u00e1\3\2\2\2\u00e0")
+        buf.write(u"\u00d3\3\2\2\2\u00e0\u00d5\3\2\2\2\u00e1!\3\2\2\2\u00e2")
+        buf.write(u"\u00e5\5$\23\2\u00e3\u00e5\7\n\2\2\u00e4\u00e2\3\2\2")
+        buf.write(u"\2\u00e4\u00e3\3\2\2\2\u00e5#\3\2\2\2\u00e6\u00e7\t\b")
+        buf.write(u"\2\2\u00e7%\3\2\2\2\30\61<GS[]hsx\177\u0086\u008d\u0094")
+        buf.write(u"\u009b\u00a2\u00ab\u00be\u00ca\u00d0\u00db\u00e0\u00e4")
         return buf.getvalue()
 
 
@@ -120,29 +117,28 @@ class STIXPatternParser ( Parser ):
 
     sharedContextCache = PredictionContextCache()
 
-    literalNames = [ u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>",
-                     u"'<'", u"'<='", u"'>'", u"'>='", u"'''", u"':'", u"'.'",
-                     u"','", u"')'", u"'('", u"']'", u"'['", u"'+'", u"<INVALID>",
-                     u"'-'", u"'^'", u"'/'", u"'*'" ]
-
-    symbolicNames = [ u"<INVALID>", u"IntNegLiteral", u"IntPosLiteral",
-                      u"FloatNegLiteral", u"FloatPosLiteral", u"HexLiteral",
-                      u"BinaryLiteral", u"StringLiteral", u"BoolLiteral",
-                      u"TimestampLiteral", u"AND", u"OR", u"NOT", u"FOLLOWEDBY",
-                      u"LIKE", u"MATCHES", u"ISSUPERSET", u"ISSUBSET", u"LAST",
-                      u"IN", u"START", u"STOP", u"SECONDS", u"TRUE", u"FALSE",
-                      u"WITHIN", u"REPEATS", u"TIMES", u"IdentifierWithoutHyphen",
-                      u"IdentifierWithHyphen", u"EQ", u"NEQ", u"LT", u"LE",
-                      u"GT", u"GE", u"QUOTE", u"COLON", u"DOT", u"COMMA",
-                      u"RPAREN", u"LPAREN", u"RBRACK", u"LBRACK", u"PLUS",
-                      u"HYPHEN", u"MINUS", u"POWER_OP", u"DIVIDE", u"ASTERISK",
+    literalNames = [ u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>", 
+                     u"<INVALID>", u"<INVALID>", u"<INVALID>", u"<INVALID>", 
+                     u"<INVALID>", u"<INVALID>", u"'AND'", u"'OR'", u"'NOT'", 
+                     u"'FOLLOWEDBY'", u"'LIKE'", u"'MATCHES'", u"'ISSUPERSET'", 
+                     u"'ISSUBSET'", u"'LAST'", u"'IN'", u"'START'", u"'STOP'", 
+                     u"'SECONDS'", u"'true'", u"'false'", u"'WITHIN'", u"'REPEATS'", 
+                     u"'TIMES'", u"<INVALID>", u"<INVALID>", u"<INVALID>", 
+                     u"<INVALID>", u"'<'", u"'<='", u"'>'", u"'>='", u"'''", 
+                     u"':'", u"'.'", u"','", u"')'", u"'('", u"']'", u"'['", 
+                     u"'+'", u"<INVALID>", u"'-'", u"'^'", u"'/'", u"'*'" ]
+
+    symbolicNames = [ u"<INVALID>", u"IntNegLiteral", u"IntPosLiteral", 
+                      u"FloatNegLiteral", u"FloatPosLiteral", u"HexLiteral", 
+                      u"BinaryLiteral", u"StringLiteral", u"BoolLiteral", 
+                      u"TimestampLiteral", u"AND", u"OR", u"NOT", u"FOLLOWEDBY", 
+                      u"LIKE", u"MATCHES", u"ISSUPERSET", u"ISSUBSET", u"LAST", 
+                      u"IN", u"START", u"STOP", u"SECONDS", u"TRUE", u"FALSE", 
+                      u"WITHIN", u"REPEATS", u"TIMES", u"IdentifierWithoutHyphen", 
+                      u"IdentifierWithHyphen", u"EQ", u"NEQ", u"LT", u"LE", 
+                      u"GT", u"GE", u"QUOTE", u"COLON", u"DOT", u"COMMA", 
+                      u"RPAREN", u"LPAREN", u"RBRACK", u"LBRACK", u"PLUS", 
+                      u"HYPHEN", u"MINUS", u"POWER_OP", u"DIVIDE", u"ASTERISK", 
                       u"WS", u"COMMENT", u"LINE_COMMENT", u"InvalidCharacter" ]
 
     RULE_pattern = 0
@@ -164,12 +160,12 @@ class STIXPatternParser ( Parser ):
     RULE_primitiveLiteral = 16
     RULE_orderableLiteral = 17
 
-    ruleNames =  [ u"pattern", u"observationExpressions", u"observationExpressionOr",
-                   u"observationExpressionAnd", u"observationExpression",
-                   u"comparisonExpression", u"comparisonExpressionAnd",
-                   u"propTest", u"startStopQualifier", u"withinQualifier",
-                   u"repeatedQualifier", u"objectPath", u"objectType", u"firstPathComponent",
-                   u"objectPathComponent", u"setLiteral", u"primitiveLiteral",
+    ruleNames =  [ u"pattern", u"observationExpressions", u"observationExpressionOr", 
+                   u"observationExpressionAnd", u"observationExpression", 
+                   u"comparisonExpression", u"comparisonExpressionAnd", 
+                   u"propTest", u"startStopQualifier", u"withinQualifier", 
+                   u"repeatedQualifier", u"objectPath", u"objectType", u"firstPathComponent", 
+                   u"objectPathComponent", u"setLiteral", u"primitiveLiteral", 
                    u"orderableLiteral" ]
 
     EOF = Token.EOF
@@ -245,6 +241,9 @@ class STIXPatternParser ( Parser ):
             return self.getTypedRuleContext(STIXPatternParser.ObservationExpressionsContext,0)
 
 
+        def EOF(self):
+            return self.getToken(STIXPatternParser.EOF, 0)
+
         def getRuleIndex(self):
             return STIXPatternParser.RULE_pattern
 
@@ -267,6 +266,8 @@ class STIXPatternParser ( Parser ):
             self.enterOuterAlt(localctx, 1)
             self.state = 36
             self.observationExpressions(0)
+            self.state = 37
+            self.match(STIXPatternParser.EOF)
         except RecognitionException as re:
             localctx.exception = re
             self._errHandler.reportError(self, re)
@@ -317,10 +318,10 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 2, self.RULE_observationExpressions, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 39
+            self.state = 40
             self.observationExpressionOr(0)
             self._ctx.stop = self._input.LT(-1)
-            self.state = 46
+            self.state = 47
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,0,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -330,15 +331,15 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.ObservationExpressionsContext(self, _parentctx, _parentState)
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpressions)
-                    self.state = 41
+                    self.state = 42
                     if not self.precpred(self._ctx, 2):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                    self.state = 42
-                    self.match(STIXPatternParser.FOLLOWEDBY)
                     self.state = 43
-                    self.observationExpressions(3)
-                self.state = 48
+                    self.match(STIXPatternParser.FOLLOWEDBY)
+                    self.state = 44
+                    self.observationExpressions(3) 
+                self.state = 49
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,0,self._ctx)
 
@@ -392,10 +393,10 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 4, self.RULE_observationExpressionOr, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 50
+            self.state = 51
             self.observationExpressionAnd(0)
             self._ctx.stop = self._input.LT(-1)
-            self.state = 57
+            self.state = 58
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,1,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -405,15 +406,15 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.ObservationExpressionOrContext(self, _parentctx, _parentState)
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpressionOr)
-                    self.state = 52
+                    self.state = 53
                     if not self.precpred(self._ctx, 2):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                    self.state = 53
-                    self.match(STIXPatternParser.OR)
                     self.state = 54
-                    self.observationExpressionOr(3)
-                self.state = 59
+                    self.match(STIXPatternParser.OR)
+                    self.state = 55
+                    self.observationExpressionOr(3) 
+                self.state = 60
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,1,self._ctx)
 
@@ -467,10 +468,10 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 6, self.RULE_observationExpressionAnd, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 61
+            self.state = 62
             self.observationExpression(0)
             self._ctx.stop = self._input.LT(-1)
-            self.state = 68
+            self.state = 69
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,2,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -480,15 +481,15 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.ObservationExpressionAndContext(self, _parentctx, _parentState)
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpressionAnd)
-                    self.state = 63
+                    self.state = 64
                     if not self.precpred(self._ctx, 2):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                    self.state = 64
-                    self.match(STIXPatternParser.AND)
                     self.state = 65
-                    self.observationExpressionAnd(3)
-                self.state = 70
+                    self.match(STIXPatternParser.AND)
+                    self.state = 66
+                    self.observationExpressionAnd(3) 
+                self.state = 71
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,2,self._ctx)
 
@@ -510,7 +511,7 @@ class STIXPatternParser ( Parser ):
         def getRuleIndex(self):
             return STIXPatternParser.RULE_observationExpression
 
-
+     
         def copyFrom(self, ctx):
             super(STIXPatternParser.ObservationExpressionContext, self).copyFrom(ctx)
 
@@ -637,7 +638,7 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 8, self.RULE_observationExpression, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 80
+            self.state = 81
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [STIXPatternParser.LBRACK]:
@@ -645,29 +646,29 @@ class STIXPatternParser ( Parser ):
                 self._ctx = localctx
                 _prevctx = localctx
 
-                self.state = 72
-                self.match(STIXPatternParser.LBRACK)
                 self.state = 73
-                self.comparisonExpression(0)
+                self.match(STIXPatternParser.LBRACK)
                 self.state = 74
+                self.comparisonExpression(0)
+                self.state = 75
                 self.match(STIXPatternParser.RBRACK)
                 pass
             elif token in [STIXPatternParser.LPAREN]:
                 localctx = STIXPatternParser.ObservationExpressionCompoundContext(self, localctx)
                 self._ctx = localctx
                 _prevctx = localctx
-                self.state = 76
-                self.match(STIXPatternParser.LPAREN)
                 self.state = 77
-                self.observationExpressions(0)
+                self.match(STIXPatternParser.LPAREN)
                 self.state = 78
+                self.observationExpressions(0)
+                self.state = 79
                 self.match(STIXPatternParser.RPAREN)
                 pass
             else:
                 raise NoViableAltException(self)
 
             self._ctx.stop = self._input.LT(-1)
-            self.state = 90
+            self.state = 91
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,5,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -675,44 +676,44 @@ class STIXPatternParser ( Parser ):
                     if self._parseListeners is not None:
                         self.triggerExitRuleEvent()
                     _prevctx = localctx
-                    self.state = 88
+                    self.state = 89
                     self._errHandler.sync(self)
                     la_ = self._interp.adaptivePredict(self._input,4,self._ctx)
                     if la_ == 1:
                         localctx = STIXPatternParser.ObservationExpressionStartStopContext(self, STIXPatternParser.ObservationExpressionContext(self, _parentctx, _parentState))
                         self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpression)
-                        self.state = 82
+                        self.state = 83
                         if not self.precpred(self._ctx, 3):
                             from antlr4.error.Errors import FailedPredicateException
                             raise FailedPredicateException(self, "self.precpred(self._ctx, 3)")
-                        self.state = 83
+                        self.state = 84
                         self.startStopQualifier()
                         pass
 
                     elif la_ == 2:
                         localctx = STIXPatternParser.ObservationExpressionWithinContext(self, STIXPatternParser.ObservationExpressionContext(self, _parentctx, _parentState))
                         self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpression)
-                        self.state = 84
+                        self.state = 85
                         if not self.precpred(self._ctx, 2):
                             from antlr4.error.Errors import FailedPredicateException
                             raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                        self.state = 85
+                        self.state = 86
                         self.withinQualifier()
                         pass
 
                     elif la_ == 3:
                         localctx = STIXPatternParser.ObservationExpressionRepeatedContext(self, STIXPatternParser.ObservationExpressionContext(self, _parentctx, _parentState))
                         self.pushNewRecursionContext(localctx, _startState, self.RULE_observationExpression)
-                        self.state = 86
+                        self.state = 87
                         if not self.precpred(self._ctx, 1):
                             from antlr4.error.Errors import FailedPredicateException
                             raise FailedPredicateException(self, "self.precpred(self._ctx, 1)")
-                        self.state = 87
+                        self.state = 88
                         self.repeatedQualifier()
                         pass
 
-
-                self.state = 92
+             
+                self.state = 93
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,5,self._ctx)
 
@@ -766,10 +767,10 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 10, self.RULE_comparisonExpression, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 94
+            self.state = 95
             self.comparisonExpressionAnd(0)
             self._ctx.stop = self._input.LT(-1)
-            self.state = 101
+            self.state = 102
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,6,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -779,15 +780,15 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.ComparisonExpressionContext(self, _parentctx, _parentState)
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_comparisonExpression)
-                    self.state = 96
+                    self.state = 97
                     if not self.precpred(self._ctx, 2):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                    self.state = 97
-                    self.match(STIXPatternParser.OR)
                     self.state = 98
-                    self.comparisonExpression(3)
-                self.state = 103
+                    self.match(STIXPatternParser.OR)
+                    self.state = 99
+                    self.comparisonExpression(3) 
+                self.state = 104
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,6,self._ctx)
 
@@ -841,10 +842,10 @@ class STIXPatternParser ( Parser ):
         self.enterRecursionRule(localctx, 12, self.RULE_comparisonExpressionAnd, _p)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 105
+            self.state = 106
             self.propTest()
             self._ctx.stop = self._input.LT(-1)
-            self.state = 112
+            self.state = 113
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,7,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -854,15 +855,15 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.ComparisonExpressionAndContext(self, _parentctx, _parentState)
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_comparisonExpressionAnd)
-                    self.state = 107
+                    self.state = 108
                     if not self.precpred(self._ctx, 2):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 2)")
-                    self.state = 108
-                    self.match(STIXPatternParser.AND)
                     self.state = 109
-                    self.comparisonExpressionAnd(3)
-                self.state = 114
+                    self.match(STIXPatternParser.AND)
+                    self.state = 110
+                    self.comparisonExpressionAnd(3) 
+                self.state = 115
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,7,self._ctx)
 
@@ -884,7 +885,7 @@ class STIXPatternParser ( Parser ):
         def getRuleIndex(self):
             return STIXPatternParser.RULE_propTest
 
-
+     
         def copyFrom(self, ctx):
             super(STIXPatternParser.PropTestContext, self).copyFrom(ctx)
 
@@ -1106,160 +1107,160 @@ class STIXPatternParser ( Parser ):
         self.enterRule(localctx, 14, self.RULE_propTest)
         self._la = 0 # Token type
         try:
-            self.state = 168
+            self.state = 169
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,15,self._ctx)
             if la_ == 1:
                 localctx = STIXPatternParser.PropTestEqualContext(self, localctx)
                 self.enterOuterAlt(localctx, 1)
-                self.state = 115
+                self.state = 116
                 self.objectPath()
-                self.state = 117
+                self.state = 118
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 116
+                    self.state = 117
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 119
+                self.state = 120
                 _la = self._input.LA(1)
                 if not(_la==STIXPatternParser.EQ or _la==STIXPatternParser.NEQ):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 120
+                self.state = 121
                 self.primitiveLiteral()
                 pass
 
             elif la_ == 2:
                 localctx = STIXPatternParser.PropTestOrderContext(self, localctx)
                 self.enterOuterAlt(localctx, 2)
-                self.state = 122
+                self.state = 123
                 self.objectPath()
-                self.state = 124
+                self.state = 125
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 123
+                    self.state = 124
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 126
+                self.state = 127
                 _la = self._input.LA(1)
                 if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << STIXPatternParser.LT) | (1 << STIXPatternParser.LE) | (1 << STIXPatternParser.GT) | (1 << STIXPatternParser.GE))) != 0)):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 127
+                self.state = 128
                 self.orderableLiteral()
                 pass
 
             elif la_ == 3:
                 localctx = STIXPatternParser.PropTestSetContext(self, localctx)
                 self.enterOuterAlt(localctx, 3)
-                self.state = 129
+                self.state = 130
                 self.objectPath()
-                self.state = 131
+                self.state = 132
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 130
+                    self.state = 131
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 133
-                self.match(STIXPatternParser.IN)
                 self.state = 134
+                self.match(STIXPatternParser.IN)
+                self.state = 135
                 self.setLiteral()
                 pass
 
             elif la_ == 4:
                 localctx = STIXPatternParser.PropTestLikeContext(self, localctx)
                 self.enterOuterAlt(localctx, 4)
-                self.state = 136
+                self.state = 137
                 self.objectPath()
-                self.state = 138
+                self.state = 139
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 137
+                    self.state = 138
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 140
-                self.match(STIXPatternParser.LIKE)
                 self.state = 141
+                self.match(STIXPatternParser.LIKE)
+                self.state = 142
                 self.match(STIXPatternParser.StringLiteral)
                 pass
 
             elif la_ == 5:
                 localctx = STIXPatternParser.PropTestRegexContext(self, localctx)
                 self.enterOuterAlt(localctx, 5)
-                self.state = 143
+                self.state = 144
                 self.objectPath()
-                self.state = 145
+                self.state = 146
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 144
+                    self.state = 145
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 147
-                self.match(STIXPatternParser.MATCHES)
                 self.state = 148
+                self.match(STIXPatternParser.MATCHES)
+                self.state = 149
                 self.match(STIXPatternParser.StringLiteral)
                 pass
 
             elif la_ == 6:
                 localctx = STIXPatternParser.PropTestIsSubsetContext(self, localctx)
                 self.enterOuterAlt(localctx, 6)
-                self.state = 150
+                self.state = 151
                 self.objectPath()
-                self.state = 152
+                self.state = 153
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 151
+                    self.state = 152
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 154
-                self.match(STIXPatternParser.ISSUBSET)
                 self.state = 155
+                self.match(STIXPatternParser.ISSUBSET)
+                self.state = 156
                 self.match(STIXPatternParser.StringLiteral)
                 pass
 
             elif la_ == 7:
                 localctx = STIXPatternParser.PropTestIsSupersetContext(self, localctx)
                 self.enterOuterAlt(localctx, 7)
-                self.state = 157
+                self.state = 158
                 self.objectPath()
-                self.state = 159
+                self.state = 160
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==STIXPatternParser.NOT:
-                    self.state = 158
+                    self.state = 159
                     self.match(STIXPatternParser.NOT)
 
 
-                self.state = 161
-                self.match(STIXPatternParser.ISSUPERSET)
                 self.state = 162
+                self.match(STIXPatternParser.ISSUPERSET)
+                self.state = 163
                 self.match(STIXPatternParser.StringLiteral)
                 pass
 
             elif la_ == 8:
                 localctx = STIXPatternParser.PropTestParenContext(self, localctx)
                 self.enterOuterAlt(localctx, 8)
-                self.state = 164
-                self.match(STIXPatternParser.LPAREN)
                 self.state = 165
-                self.comparisonExpression(0)
+                self.match(STIXPatternParser.LPAREN)
                 self.state = 166
+                self.comparisonExpression(0)
+                self.state = 167
                 self.match(STIXPatternParser.RPAREN)
                 pass
 
@@ -1310,13 +1311,13 @@ class STIXPatternParser ( Parser ):
         self.enterRule(localctx, 16, self.RULE_startStopQualifier)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 170
-            self.match(STIXPatternParser.START)
             self.state = 171
-            self.match(STIXPatternParser.StringLiteral)
+            self.match(STIXPatternParser.START)
             self.state = 172
-            self.match(STIXPatternParser.STOP)
+            self.match(STIXPatternParser.StringLiteral)
             self.state = 173
+            self.match(STIXPatternParser.STOP)
+            self.state = 174
             self.match(STIXPatternParser.StringLiteral)
         except RecognitionException as re:
             localctx.exception = re
@@ -1365,16 +1366,16 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 175
-            self.match(STIXPatternParser.WITHIN)
             self.state = 176
+            self.match(STIXPatternParser.WITHIN)
+            self.state = 177
             _la = self._input.LA(1)
             if not(_la==STIXPatternParser.IntPosLiteral or _la==STIXPatternParser.FloatPosLiteral):
                 self._errHandler.recoverInline(self)
             else:
                 self._errHandler.reportMatch(self)
                 self.consume()
-            self.state = 177
+            self.state = 178
             self.match(STIXPatternParser.SECONDS)
         except RecognitionException as re:
             localctx.exception = re
@@ -1419,11 +1420,11 @@ class STIXPatternParser ( Parser ):
         self.enterRule(localctx, 20, self.RULE_repeatedQualifier)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 179
-            self.match(STIXPatternParser.REPEATS)
             self.state = 180
-            self.match(STIXPatternParser.IntPosLiteral)
+            self.match(STIXPatternParser.REPEATS)
             self.state = 181
+            self.match(STIXPatternParser.IntPosLiteral)
+            self.state = 182
             self.match(STIXPatternParser.TIMES)
         except RecognitionException as re:
             localctx.exception = re
@@ -1475,17 +1476,17 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 183
-            self.objectType()
             self.state = 184
-            self.match(STIXPatternParser.COLON)
+            self.objectType()
             self.state = 185
+            self.match(STIXPatternParser.COLON)
+            self.state = 186
             self.firstPathComponent()
-            self.state = 187
+            self.state = 188
             self._errHandler.sync(self)
             _la = self._input.LA(1)
             if _la==STIXPatternParser.DOT or _la==STIXPatternParser.LBRACK:
-                self.state = 186
+                self.state = 187
                 self.objectPathComponent(0)
 
 
@@ -1530,7 +1531,7 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 189
+            self.state = 190
             _la = self._input.LA(1)
             if not(_la==STIXPatternParser.IdentifierWithoutHyphen or _la==STIXPatternParser.IdentifierWithHyphen):
                 self._errHandler.recoverInline(self)
@@ -1578,7 +1579,7 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 191
+            self.state = 192
             _la = self._input.LA(1)
             if not(_la==STIXPatternParser.StringLiteral or _la==STIXPatternParser.IdentifierWithoutHyphen):
                 self._errHandler.recoverInline(self)
@@ -1603,7 +1604,7 @@ class STIXPatternParser ( Parser ):
         def getRuleIndex(self):
             return STIXPatternParser.RULE_objectPathComponent
 
-
+     
         def copyFrom(self, ctx):
             super(STIXPatternParser.ObjectPathComponentContext, self).copyFrom(ctx)
 
@@ -1687,7 +1688,7 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 199
+            self.state = 200
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [STIXPatternParser.DOT]:
@@ -1695,9 +1696,9 @@ class STIXPatternParser ( Parser ):
                 self._ctx = localctx
                 _prevctx = localctx
 
-                self.state = 194
-                self.match(STIXPatternParser.DOT)
                 self.state = 195
+                self.match(STIXPatternParser.DOT)
+                self.state = 196
                 _la = self._input.LA(1)
                 if not(_la==STIXPatternParser.StringLiteral or _la==STIXPatternParser.IdentifierWithoutHyphen):
                     self._errHandler.recoverInline(self)
@@ -1709,23 +1710,23 @@ class STIXPatternParser ( Parser ):
                 localctx = STIXPatternParser.IndexPathStepContext(self, localctx)
                 self._ctx = localctx
                 _prevctx = localctx
-                self.state = 196
-                self.match(STIXPatternParser.LBRACK)
                 self.state = 197
+                self.match(STIXPatternParser.LBRACK)
+                self.state = 198
                 _la = self._input.LA(1)
                 if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << STIXPatternParser.IntNegLiteral) | (1 << STIXPatternParser.IntPosLiteral) | (1 << STIXPatternParser.ASTERISK))) != 0)):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 198
+                self.state = 199
                 self.match(STIXPatternParser.RBRACK)
                 pass
             else:
                 raise NoViableAltException(self)
 
             self._ctx.stop = self._input.LT(-1)
-            self.state = 205
+            self.state = 206
             self._errHandler.sync(self)
             _alt = self._interp.adaptivePredict(self._input,18,self._ctx)
             while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
@@ -1735,13 +1736,13 @@ class STIXPatternParser ( Parser ):
                     _prevctx = localctx
                     localctx = STIXPatternParser.PathStepContext(self, STIXPatternParser.ObjectPathComponentContext(self, _parentctx, _parentState))
                     self.pushNewRecursionContext(localctx, _startState, self.RULE_objectPathComponent)
-                    self.state = 201
+                    self.state = 202
                     if not self.precpred(self._ctx, 3):
                         from antlr4.error.Errors import FailedPredicateException
                         raise FailedPredicateException(self, "self.precpred(self._ctx, 3)")
-                    self.state = 202
-                    self.objectPathComponent(4)
-                self.state = 207
+                    self.state = 203
+                    self.objectPathComponent(4) 
+                self.state = 208
                 self._errHandler.sync(self)
                 _alt = self._interp.adaptivePredict(self._input,18,self._ctx)
 
@@ -1798,36 +1799,36 @@ class STIXPatternParser ( Parser ):
         self.enterRule(localctx, 30, self.RULE_setLiteral)
         self._la = 0 # Token type
         try:
-            self.state = 221
+            self.state = 222
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,20,self._ctx)
             if la_ == 1:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 208
-                self.match(STIXPatternParser.LPAREN)
                 self.state = 209
+                self.match(STIXPatternParser.LPAREN)
+                self.state = 210
                 self.match(STIXPatternParser.RPAREN)
                 pass
 
             elif la_ == 2:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 210
-                self.match(STIXPatternParser.LPAREN)
                 self.state = 211
+                self.match(STIXPatternParser.LPAREN)
+                self.state = 212
                 self.primitiveLiteral()
-                self.state = 216
+                self.state = 217
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 while _la==STIXPatternParser.COMMA:
-                    self.state = 212
-                    self.match(STIXPatternParser.COMMA)
                     self.state = 213
+                    self.match(STIXPatternParser.COMMA)
+                    self.state = 214
                     self.primitiveLiteral()
-                    self.state = 218
+                    self.state = 219
                     self._errHandler.sync(self)
                     _la = self._input.LA(1)
 
-                self.state = 219
+                self.state = 220
                 self.match(STIXPatternParser.RPAREN)
                 pass
 
@@ -1872,17 +1873,17 @@ class STIXPatternParser ( Parser ):
         localctx = STIXPatternParser.PrimitiveLiteralContext(self, self._ctx, self.state)
         self.enterRule(localctx, 32, self.RULE_primitiveLiteral)
         try:
-            self.state = 225
+            self.state = 226
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [STIXPatternParser.IntNegLiteral, STIXPatternParser.IntPosLiteral, STIXPatternParser.FloatNegLiteral, STIXPatternParser.FloatPosLiteral, STIXPatternParser.HexLiteral, STIXPatternParser.BinaryLiteral, STIXPatternParser.StringLiteral, STIXPatternParser.TimestampLiteral]:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 223
+                self.state = 224
                 self.orderableLiteral()
                 pass
             elif token in [STIXPatternParser.BoolLiteral]:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 224
+                self.state = 225
                 self.match(STIXPatternParser.BoolLiteral)
                 pass
             else:
@@ -1947,7 +1948,7 @@ class STIXPatternParser ( Parser ):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 227
+            self.state = 228
             _la = self._input.LA(1)
             if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << STIXPatternParser.IntNegLiteral) | (1 << STIXPatternParser.IntPosLiteral) | (1 << STIXPatternParser.FloatNegLiteral) | (1 << STIXPatternParser.FloatPosLiteral) | (1 << STIXPatternParser.HexLiteral) | (1 << STIXPatternParser.BinaryLiteral) | (1 << STIXPatternParser.StringLiteral) | (1 << STIXPatternParser.TimestampLiteral))) != 0)):
                 self._errHandler.recoverInline(self)
@@ -1983,41 +1984,46 @@ class STIXPatternParser ( Parser ):
     def observationExpressions_sempred(self, localctx, predIndex):
             if predIndex == 0:
                 return self.precpred(self._ctx, 2)
-
+         
 
     def observationExpressionOr_sempred(self, localctx, predIndex):
             if predIndex == 1:
                 return self.precpred(self._ctx, 2)
-
+         
 
     def observationExpressionAnd_sempred(self, localctx, predIndex):
             if predIndex == 2:
                 return self.precpred(self._ctx, 2)
-
+         
 
     def observationExpression_sempred(self, localctx, predIndex):
             if predIndex == 3:
                 return self.precpred(self._ctx, 3)
-
+         
 
             if predIndex == 4:
                 return self.precpred(self._ctx, 2)
-
+         
 
             if predIndex == 5:
                 return self.precpred(self._ctx, 1)
-
+         
 
     def comparisonExpression_sempred(self, localctx, predIndex):
             if predIndex == 6:
                 return self.precpred(self._ctx, 2)
-
+         
 
     def comparisonExpressionAnd_sempred(self, localctx, predIndex):
             if predIndex == 7:
                 return self.precpred(self._ctx, 2)
-
+         
 
     def objectPathComponent_sempred(self, localctx, predIndex):
             if predIndex == 8:
                 return self.precpred(self._ctx, 3)
+         
+
+
+
+

Validation fails on network-traffic:start
If I run the following STIX pattern
`"[network-traffic:start = '2018-04-20T12:36:24.558Z']"`
it fails validation and gives the following error
`"FAIL: Error found at line 1:17. no viable alternative at input 'network-traffic:start'"`

The pattern passes validation if I use the end attribute instead of start.
diff --git a/stix2patterns/test/test_inspector.py b/stix2patterns/test/test_inspector.py
index 612e812..bd251d8 100644
--- a/stix2patterns/test/test_inspector.py
+++ b/stix2patterns/test/test_inspector.py
@@ -5,17 +5,17 @@ from stix2patterns.pattern import Pattern
 
 @pytest.mark.parametrize(u"pattern,expected_qualifiers", [
     (u"[foo:bar = 1]", set()),
-    (u"[foo:bar = 1] repeats 5 times", set([u"REPEATS 5 TIMES"])),
-    (u"[foo:bar = 1] within 10.3 seconds", set([u"WITHIN 10.3 SECONDS"])),
-    (u"[foo:bar = 1] within 123 seconds", set([u"WITHIN 123 SECONDS"])),
-    (u"[foo:bar = 1] start '1932-11-12T15:42:15Z' stop '1964-10-53T21:12:26Z'",
+    (u"[foo:bar = 1] REPEATS 5 TIMES", set([u"REPEATS 5 TIMES"])),
+    (u"[foo:bar = 1] WITHIN 10.3 SECONDS", set([u"WITHIN 10.3 SECONDS"])),
+    (u"[foo:bar = 1] WITHIN 123 SECONDS", set([u"WITHIN 123 SECONDS"])),
+    (u"[foo:bar = 1] START '1932-11-12T15:42:15Z' STOP '1964-10-53T21:12:26Z'",
         set([u"START '1932-11-12T15:42:15Z' STOP '1964-10-53T21:12:26Z'"])),
-    (u"[foo:bar = 1] repeats 1 times repeats 2 times",
+    (u"[foo:bar = 1] REPEATS 1 TIMES REPEATS 2 TIMES",
         set([u"REPEATS 1 TIMES", u"REPEATS 2 TIMES"])),
-    (u"[foo:bar = 1] repeats 1 times and [foo:baz = 2] within 1.23 seconds",
+    (u"[foo:bar = 1] REPEATS 1 TIMES AND [foo:baz = 2] WITHIN 1.23 SECONDS",
         set([u"REPEATS 1 TIMES", u"WITHIN 1.23 SECONDS"])),
-    (u"([foo:bar = 1] start '1932-11-12T15:42:15Z' stop '1964-10-53T21:12:26Z' and [foo:abc < h'12ab']) within 22 seconds "
-     u"or [frob:baz not in (1,2,3)] repeats 31 times",
+    (u"([foo:bar = 1] START '1932-11-12T15:42:15Z' STOP '1964-10-53T21:12:26Z' AND [foo:abc < h'12ab']) WITHIN 22 SECONDS "
+     u"OR [frob:baz NOT IN (1,2,3)] REPEATS 31 TIMES",
         set([u"START '1932-11-12T15:42:15Z' STOP '1964-10-53T21:12:26Z'",
             u"WITHIN 22 SECONDS", u"REPEATS 31 TIMES"]))
 ])
@@ -28,11 +28,11 @@ def test_qualifiers(pattern, expected_qualifiers):
 
 @pytest.mark.parametrize(u"pattern,expected_obs_ops", [
     (u"[foo:bar = 1]", set()),
-    (u"[foo:bar = 1] and [foo:baz > 25.2]", set([u"AND"])),
-    (u"[foo:bar = 1] or [foo:baz != 'hello']", set([u"OR"])),
-    (u"[foo:bar = 1] followedby [foo:baz in (1,2,3)]", set([u"FOLLOWEDBY"])),
-    (u"[foo:bar = 1] and [foo:baz = 22] or [foo:abc = '123']", set([u"AND", u"OR"])),
-    (u"[foo:bar = 1] or ([foo:baz = false] followedby [frob:abc like '123']) within 46.1 seconds",
+    (u"[foo:bar = 1] AND [foo:baz > 25.2]", set([u"AND"])),
+    (u"[foo:bar = 1] OR [foo:baz != 'hello']", set([u"OR"])),
+    (u"[foo:bar = 1] FOLLOWEDBY [foo:baz IN (1,2,3)]", set([u"FOLLOWEDBY"])),
+    (u"[foo:bar = 1] AND [foo:baz = 22] OR [foo:abc = '123']", set([u"AND", u"OR"])),
+    (u"[foo:bar = 1] OR ([foo:baz = false] FOLLOWEDBY [frob:abc LIKE '123']) WITHIN 46.1 SECONDS",
         set([u"OR", u"FOLLOWEDBY"]))
 ])
 def test_observation_ops(pattern, expected_obs_ops):
@@ -44,22 +44,22 @@ def test_observation_ops(pattern, expected_obs_ops):
 
 @pytest.mark.parametrize(u"pattern,expected_comparisons", [
     (u"[foo:bar = 1]", {u"foo": [([u"bar"], u"=", u"1")]}),
-    (u"[foo:bar=1 and foo:baz=2]", {u"foo": [([u"bar"], u"=", u"1"), ([u"baz"], u"=", u"2")]}),
-    (u"[foo:bar not !=1 or bar:foo<12.3]", {
+    (u"[foo:bar=1 AND foo:baz=2]", {u"foo": [([u"bar"], u"=", u"1"), ([u"baz"], u"=", u"2")]}),
+    (u"[foo:bar NOT !=1 OR bar:foo<12.3]", {
         u"foo": [([u"bar"], u"NOT !=", u"1")],
         u"bar": [([u"foo"], u"<", u"12.3")]
     }),
-    (u"[foo:bar=1] or [foo:baz matches '123\\\\d+']", {
+    (u"[foo:bar=1] OR [foo:baz MATCHES '123\\\\d+']", {
         u"foo": [([u"bar"], u"=", u"1"), ([u"baz"], u"MATCHES", u"'123\\\\d+'")]
     }),
-    (u"[foo:bar=1 and bar:foo not >33] repeats 12 times or "
-     u"  ([baz:bar issubset '1234'] followedby [baz:quux not like 'a_cd'])",
+    (u"[foo:bar=1 AND bar:foo NOT >33] REPEATS 12 TIMES OR "
+     u"  ([baz:bar ISSUBSET '1234'] FOLLOWEDBY [baz:quux NOT LIKE 'a_cd'])",
      {
          u"foo": [([u"bar"], u"=", u"1")],
          u"bar": [([u"foo"], u"NOT >", u"33")],
          u"baz": [([u"bar"], u"ISSUBSET", u"'1234'"), ([u"quux"], u"NOT LIKE", u"'a_cd'")]
      }),
-    (u"[obj-type:a.b[*][1].'c-d' not issuperset '1.2.3.4/16']", {
+    (u"[obj-type:a.b[*][1].'c-d' NOT ISSUPERSET '1.2.3.4/16']", {
         u"obj-type": [([u"a", u"b", INDEX_STAR, 1, u"c-d"], u"NOT ISSUPERSET", u"'1.2.3.4/16'")]
     }),
 ])
diff --git a/stix2patterns/test/test_validator.py b/stix2patterns/test/test_validator.py
index f1fad90..5602fef 100644
--- a/stix2patterns/test/test_validator.py
+++ b/stix2patterns/test/test_validator.py
@@ -34,7 +34,7 @@ FAIL_CASES = [
     ("[win-registry-key:key = 'hkey_local_machine\\\\foo\\\\bar'] WITHIN ]",  # Missing Qualifier value
         "FAIL: Error found at line 1:63. mismatched input ']' expecting {IntPosLiteral, FloatPosLiteral}"),
     ("[win-registry-key:key = 'hkey_local_machine\\\\foo\\\\bar'] WITHIN 5 HOURS]",  # SECONDS is the only valid time unit
-        "FAIL: Error found at line 1:65. mismatched input 'HOURS' expecting SECONDS"),
+        "FAIL: Error found at line 1:65. mismatched input 'HOURS' expecting 'SECONDS'"),
     ("[win-registry-key:key = 'hkey_local_machine\\\\foo\\\\bar'] WITHIN -5 SECONDS]",  # Negative integer is invalid
         "FAIL: Error found at line 1:63. mismatched input '-5' expecting {IntPosLiteral, FloatPosLiteral}"),
     ("[network-traffic:dst_ref.value ISSUBSET ]",  # Missing second Comparison operand
@@ -45,6 +45,8 @@ FAIL_CASES = [
         "FAIL: Error found at line 1:24. extraneous input 't'"),
     ("[artifact:payload_bin = b'====']",  # Not valid Base64
         "FAIL: Error found at line 1:24. extraneous input 'b'"),
+    ("[foo:bar=1] within 2 seconds",  # keywords must be uppercase
+        "FAIL: Error found at line 1:12. mismatched input 'within' expecting <EOF>")
     # TODO: add more failing test cases.
 ]
 
@@ -80,6 +82,7 @@ PASS_CASES = [
     "[x_whatever:detected == t'2018-03-22T12:11:14.1Z']",
     "[artifact:payload_bin = b'dGhpcyBpcyBhIHRlc3Q=']",
     "[foo:bar=1] REPEATS 9 TIMES",
+    "[network-traffic:start = '2018-04-20T12:36:24.558Z']"
 ]
 
 

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov coverage
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
antlr4-python3-runtime==4.7
attrs==22.2.0
Babel==2.11.0
bump2version==1.0.1
bumpversion==0.6.0
certifi==2021.5.30
cfgv==3.3.1
charset-normalizer==2.0.12
coverage==6.2
distlib==0.3.9
docutils==0.18.1
filelock==3.4.1
identify==2.4.4
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
importlib-resources==5.2.3
iniconfig==1.1.1
Jinja2==3.0.3
MarkupSafe==2.0.1
nodeenv==1.6.0
packaging==21.3
platformdirs==2.4.0
pluggy==1.0.0
pre-commit==2.17.0
py==1.11.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
pytz==2025.2
PyYAML==6.0.1
requests==2.27.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinx-prompt==1.5.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
-e git+https://github.com/oasis-open/cti-pattern-validator.git@801c2364013d3cc5529f5e0b967def7f505a91e4#egg=stix2_patterns
toml==0.10.2
tomli==1.2.3
tox==3.28.0
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.16.2
zipp==3.6.0

name: cti-pattern-validator
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - antlr4-python3-runtime==4.7
      - attrs==22.2.0
      - babel==2.11.0
      - bump2version==1.0.1
      - bumpversion==0.6.0
      - cfgv==3.3.1
      - charset-normalizer==2.0.12
      - coverage==6.2
      - distlib==0.3.9
      - docutils==0.18.1
      - filelock==3.4.1
      - identify==2.4.4
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.2.3
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - nodeenv==1.6.0
      - packaging==21.3
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - pre-commit==2.17.0
      - py==1.11.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.27.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinx-prompt==1.5.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.16.2
      - zipp==3.6.0
prefix: /opt/conda/envs/cti-pattern-validator

stix2patterns/test/test_validator.py::test_fail_patterns[[win-registry-key:key stix2patterns/test/test_validator.py::test_fail_patterns[[foo:bar=1] stix2patterns/test/test_validator.py::test_pass_patterns[[network-traffic:start
stix2patterns/test/test_inspector.py::test_qualifiers[[foo:bar stix2patterns/test/test_inspector.py::test_qualifiers[([foo:bar stix2patterns/test/test_inspector.py::test_observation_ops[[foo:bar stix2patterns/test/test_inspector.py::test_comparisons[[foo:bar stix2patterns/test/test_inspector.py::test_comparisons[[foo:bar=1 stix2patterns/test/test_inspector.py::test_comparisons[[foo:bar=1] stix2patterns/test/test_inspector.py::test_comparisons[[obj-type:a.b[*][1].'c-d' stix2patterns/test/test_validator.py::test_spec_patterns[[file:hashes.'SHA-256' stix2patterns/test/test_validator.py::test_spec_patterns[[email-message:from_ref.value stix2patterns/test/test_validator.py::test_spec_patterns[([file:hashes.MD5 stix2patterns/test/test_validator.py::test_spec_patterns[[user-account:account_type stix2patterns/test/test_validator.py::test_spec_patterns[[artifact:mime_type stix2patterns/test/test_validator.py::test_spec_patterns[[file:name stix2patterns/test/test_validator.py::test_spec_patterns[[file:extensions.'windows-pebinary-ext'.sections[*].entropy stix2patterns/test/test_validator.py::test_spec_patterns[[file:mime_type stix2patterns/test/test_validator.py::test_spec_patterns[[network-traffic:dst_ref.type stix2patterns/test/test_validator.py::test_spec_patterns[[domain-name:value stix2patterns/test/test_validator.py::test_spec_patterns[[url:value stix2patterns/test/test_validator.py::test_spec_patterns[[x509-certificate:issuer stix2patterns/test/test_validator.py::test_spec_patterns[[windows-registry-key:key stix2patterns/test/test_validator.py::test_spec_patterns[[(file:name stix2patterns/test/test_validator.py::test_spec_patterns[[email-message:sender_ref.value stix2patterns/test/test_validator.py::test_spec_patterns[[x-usb-device:usbdrive.serial_number stix2patterns/test/test_validator.py::test_spec_patterns[[process:command_line stix2patterns/test/test_validator.py::test_spec_patterns[[network-traffic:dst_ref.value stix2patterns/test/test_validator.py::test_spec_patterns[([file:name stix2patterns/test/test_validator.py::test_fail_patterns[file:size stix2patterns/test/test_validator.py::test_fail_patterns[[file:size stix2patterns/test/test_validator.py::test_fail_patterns[[file:hashes.MD5 stix2patterns/test/test_validator.py::test_fail_patterns[[file.size stix2patterns/test/test_validator.py::test_fail_patterns[[file:name stix2patterns/test/test_validator.py::test_fail_patterns[[network-traffic:dst_ref.value stix2patterns/test/test_validator.py::test_fail_patterns[[x_whatever:detected stix2patterns/test/test_validator.py::test_fail_patterns[[artifact:payload_bin stix2patterns/test/test_validator.py::test_pass_patterns[[file:size stix2patterns/test/test_validator.py::test_pass_patterns[[file:file_name stix2patterns/test/test_validator.py::test_pass_patterns[[file:extended_properties.'ntfs-ext'.sid stix2patterns/test/test_validator.py::test_pass_patterns[[emailaddr:value stix2patterns/test/test_validator.py::test_pass_patterns[[ipv4addr:value stix2patterns/test/test_validator.py::test_pass_patterns[[user-account:value stix2patterns/test/test_validator.py::test_pass_patterns[[file:file_system_properties.file_name stix2patterns/test/test_validator.py::test_pass_patterns[[network-connection:extended_properties[0].source_payload stix2patterns/test/test_validator.py::test_pass_patterns[[win-registry-key:key stix2patterns/test/test_validator.py::test_pass_patterns[[x_whatever:detected stix2patterns/test/test_validator.py::test_pass_patterns[[artifact:payload_bin stix2patterns/test/test_validator.py::test_pass_patterns[[foo:bar=1]
stix2patterns/grammars/STIXPatternListener.py stix2patterns/grammars/STIXPatternParser.py .pre-commit-config.yaml stix2patterns/grammars/STIXPatternLexer.py
stix2patterns/grammars/STIXPatternListener.py stix2patterns/grammars/STIXPatternParser.py .pre-commit-config.yaml stix2patterns/grammars/STIXPatternLexer.py