You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ce...@apache.org on 2017/02/24 20:53:25 UTC

[2/3] incubator-metron git commit: METRON-690: Create a DSL-based timestamp lookup for profiler to enable sparse windows closes apache/incubator-metron#450

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowLexer.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowLexer.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowLexer.java
new file mode 100644
index 0000000..c6ce964
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowLexer.java
@@ -0,0 +1,477 @@
+// Generated from org/apache/metron/profiler/client/window/generated/Window.g4 by ANTLR 4.5
+package org.apache.metron.profiler.client.window.generated;
+
+//CHECKSTYLE:OFF
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class WindowLexer extends Lexer {
+	static { RuntimeMetaData.checkVersion("4.5", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		COMMA=1, COLON=2, WINDOW=3, INCLUDE=4, EXCLUDE=5, NOW=6, FROM=7, EVERY=8, 
+		TO=9, AGO=10, NUMBER=11, IDENTIFIER=12, DAY_SPECIFIER=13, TIME_UNIT=14, 
+		WS=15;
+	public static String[] modeNames = {
+		"DEFAULT_MODE"
+	};
+
+	public static final String[] ruleNames = {
+		"COMMA", "COLON", "WINDOW", "INCLUDE", "EXCLUDE", "NOW", "FROM", "EVERY", 
+		"TO", "AGO", "NUMBER", "IDENTIFIER", "DAY_SPECIFIER", "TIME_UNIT", "WS", 
+		"SECOND_UNIT", "MINUTE_UNIT", "HOUR_UNIT", "DAY_UNIT", "MONDAY", "TUESDAY", 
+		"WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY", "CURRENT_DAY_OF_WEEK", 
+		"WEEKEND", "WEEKDAY", "HOLIDAYS", "DATE", "DIGIT", "FIRST_DIGIT"
+	};
+
+	private static final String[] _LITERAL_NAMES = {
+		null, "','", "':'"
+	};
+	private static final String[] _SYMBOLIC_NAMES = {
+		null, "COMMA", "COLON", "WINDOW", "INCLUDE", "EXCLUDE", "NOW", "FROM", 
+		"EVERY", "TO", "AGO", "NUMBER", "IDENTIFIER", "DAY_SPECIFIER", "TIME_UNIT", 
+		"WS"
+	};
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+
+	public WindowLexer(CharStream input) {
+		super(input);
+		_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	@Override
+	public String getGrammarFileName() { return "Window.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public String[] getModeNames() { return modeNames; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	public static final String _serializedATN =
+		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\21\u03d2\b\1\4\2"+
+		"\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\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\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
+		"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
+		"\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+
+		" \4!\t!\4\"\t\"\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+
+		"\4\3\4\3\4\3\4\5\4W\n\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+
+		"\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5"+
+		"\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+
+		"\5\3\5\5\5\u0089\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
+		"\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
+		"\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
+		"\6\5\6\u00bb\n\6\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u00c3\n\7\3\b\3\b\3\b\3\b"+
+		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
+		"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u00e7\n\b\3\t\3"+
+		"\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t"+
+		"\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0105\n\t\3\n\3\n\3\n\3\n\3\n"+
+		"\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u0115\n\n\3\13\3\13\3\13\3\13"+
+		"\3\13\3\13\5\13\u011d\n\13\3\f\3\f\7\f\u0121\n\f\f\f\16\f\u0124\13\f\3"+
+		"\r\3\r\3\r\7\r\u0129\n\r\f\r\16\r\u012c\13\r\3\16\3\16\3\16\3\16\3\16"+
+		"\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u013a\n\16\3\17\3\17\3\17\3\17"+
+		"\5\17\u0140\n\17\3\20\6\20\u0143\n\20\r\20\16\20\u0144\3\20\3\20\3\21"+
+		"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+		"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+		"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
+		"\3\21\5\21\u0175\n\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
+		"\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
+		"\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
+		"\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u01a3\n\22\3\23\3\23\3\23\3\23\3\23"+
+		"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
+		"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23"+
+		"\u01c5\n\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+
+		"\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+
+		"\5\24\u01e1\n\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
+		"\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
+		"\3\25\5\25\u01fd\n\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26"+
+		"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26"+
+		"\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u021d\n\26\3\27\3\27\3\27\3\27\3\27"+
+		"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+
+		"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+
+		"\3\27\3\27\3\27\3\27\3\27\5\27\u0245\n\27\3\30\3\30\3\30\3\30\3\30\3\30"+
+		"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
+		"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
+		"\5\30\u0269\n\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+
+		"\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+
+		"\3\31\5\31\u0285\n\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+
+		"\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+
+		"\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\5\32\u02a9\n\32\3\33"+
+		"\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+
+		"\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u02c5\n\33"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+		"\3\34\3\34\5\34\u0363\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
+		"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
+		"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0383\n\35\3\36\3\36\3\36\3\36"+
+		"\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+
+		"\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\5\36\u03a3"+
+		"\n\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37"+
+		"\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37"+
+		"\3\37\3\37\3\37\5\37\u03c3\n\37\3 \3 \3 \3 \3 \3 \3 \3 \5 \u03cd\n \3"+
+		"!\3!\3\"\3\"\2\2#\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
+		"\16\33\17\35\20\37\21!\2#\2%\2\'\2)\2+\2-\2/\2\61\2\63\2\65\2\67\29\2"+
+		";\2=\2?\2A\2C\2\3\2\6\3\2<<\5\2\62;C\\c|\7\2/;C\\^^aac|\5\2\13\f\16\17"+
+		"\"\"\u0420\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\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\2\2\2\2\25\3\2\2\2\2\27"+
+		"\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\3E\3\2\2"+
+		"\2\5G\3\2\2\2\7V\3\2\2\2\t\u0088\3\2\2\2\13\u00ba\3\2\2\2\r\u00c2\3\2"+
+		"\2\2\17\u00e6\3\2\2\2\21\u0104\3\2\2\2\23\u0114\3\2\2\2\25\u011c\3\2\2"+
+		"\2\27\u011e\3\2\2\2\31\u0125\3\2\2\2\33\u0139\3\2\2\2\35\u013f\3\2\2\2"+
+		"\37\u0142\3\2\2\2!\u0174\3\2\2\2#\u01a2\3\2\2\2%\u01c4\3\2\2\2\'\u01e0"+
+		"\3\2\2\2)\u01fc\3\2\2\2+\u021c\3\2\2\2-\u0244\3\2\2\2/\u0268\3\2\2\2\61"+
+		"\u0284\3\2\2\2\63\u02a8\3\2\2\2\65\u02c4\3\2\2\2\67\u0362\3\2\2\29\u0382"+
+		"\3\2\2\2;\u03a2\3\2\2\2=\u03c2\3\2\2\2?\u03cc\3\2\2\2A\u03ce\3\2\2\2C"+
+		"\u03d0\3\2\2\2EF\7.\2\2F\4\3\2\2\2GH\7<\2\2H\6\3\2\2\2IJ\7y\2\2JK\7k\2"+
+		"\2KL\7p\2\2LM\7f\2\2MN\7q\2\2NW\7y\2\2OP\7y\2\2PQ\7k\2\2QR\7p\2\2RS\7"+
+		"f\2\2ST\7q\2\2TU\7y\2\2UW\7u\2\2VI\3\2\2\2VO\3\2\2\2W\b\3\2\2\2XY\7k\2"+
+		"\2YZ\7p\2\2Z[\7e\2\2[\\\7n\2\2\\]\7w\2\2]^\7f\2\2^\u0089\7g\2\2_`\7K\2"+
+		"\2`a\7P\2\2ab\7E\2\2bc\7N\2\2cd\7W\2\2de\7F\2\2e\u0089\7G\2\2fg\7k\2\2"+
+		"gh\7p\2\2hi\7e\2\2ij\7n\2\2jk\7w\2\2kl\7f\2\2lm\7g\2\2m\u0089\7u\2\2n"+
+		"o\7K\2\2op\7P\2\2pq\7E\2\2qr\7N\2\2rs\7W\2\2st\7F\2\2tu\7G\2\2u\u0089"+
+		"\7U\2\2vw\7k\2\2wx\7p\2\2xy\7e\2\2yz\7n\2\2z{\7w\2\2{|\7f\2\2|}\7k\2\2"+
+		"}~\7p\2\2~\u0089\7i\2\2\177\u0080\7K\2\2\u0080\u0081\7P\2\2\u0081\u0082"+
+		"\7E\2\2\u0082\u0083\7N\2\2\u0083\u0084\7W\2\2\u0084\u0085\7F\2\2\u0085"+
+		"\u0086\7K\2\2\u0086\u0087\7P\2\2\u0087\u0089\7I\2\2\u0088X\3\2\2\2\u0088"+
+		"_\3\2\2\2\u0088f\3\2\2\2\u0088n\3\2\2\2\u0088v\3\2\2\2\u0088\177\3\2\2"+
+		"\2\u0089\n\3\2\2\2\u008a\u008b\7g\2\2\u008b\u008c\7z\2\2\u008c\u008d\7"+
+		"e\2\2\u008d\u008e\7n\2\2\u008e\u008f\7w\2\2\u008f\u0090\7f\2\2\u0090\u00bb"+
+		"\7g\2\2\u0091\u0092\7G\2\2\u0092\u0093\7Z\2\2\u0093\u0094\7E\2\2\u0094"+
+		"\u0095\7N\2\2\u0095\u0096\7W\2\2\u0096\u0097\7F\2\2\u0097\u00bb\7G\2\2"+
+		"\u0098\u0099\7g\2\2\u0099\u009a\7z\2\2\u009a\u009b\7e\2\2\u009b\u009c"+
+		"\7n\2\2\u009c\u009d\7w\2\2\u009d\u009e\7f\2\2\u009e\u009f\7g\2\2\u009f"+
+		"\u00bb\7u\2\2\u00a0\u00a1\7G\2\2\u00a1\u00a2\7Z\2\2\u00a2\u00a3\7E\2\2"+
+		"\u00a3\u00a4\7N\2\2\u00a4\u00a5\7W\2\2\u00a5\u00a6\7F\2\2\u00a6\u00a7"+
+		"\7G\2\2\u00a7\u00bb\7U\2\2\u00a8\u00a9\7g\2\2\u00a9\u00aa\7z\2\2\u00aa"+
+		"\u00ab\7e\2\2\u00ab\u00ac\7n\2\2\u00ac\u00ad\7w\2\2\u00ad\u00ae\7f\2\2"+
+		"\u00ae\u00af\7k\2\2\u00af\u00b0\7p\2\2\u00b0\u00bb\7i\2\2\u00b1\u00b2"+
+		"\7G\2\2\u00b2\u00b3\7Z\2\2\u00b3\u00b4\7E\2\2\u00b4\u00b5\7N\2\2\u00b5"+
+		"\u00b6\7W\2\2\u00b6\u00b7\7F\2\2\u00b7\u00b8\7K\2\2\u00b8\u00b9\7P\2\2"+
+		"\u00b9\u00bb\7I\2\2\u00ba\u008a\3\2\2\2\u00ba\u0091\3\2\2\2\u00ba\u0098"+
+		"\3\2\2\2\u00ba\u00a0\3\2\2\2\u00ba\u00a8\3\2\2\2\u00ba\u00b1\3\2\2\2\u00bb"+
+		"\f\3\2\2\2\u00bc\u00bd\7P\2\2\u00bd\u00be\7Q\2\2\u00be\u00c3\7Y\2\2\u00bf"+
+		"\u00c0\7p\2\2\u00c0\u00c1\7q\2\2\u00c1\u00c3\7y\2\2\u00c2\u00bc\3\2\2"+
+		"\2\u00c2\u00bf\3\2\2\2\u00c3\16\3\2\2\2\u00c4\u00c5\7H\2\2\u00c5\u00c6"+
+		"\7T\2\2\u00c6\u00c7\7Q\2\2\u00c7\u00e7\7O\2\2\u00c8\u00c9\7h\2\2\u00c9"+
+		"\u00ca\7t\2\2\u00ca\u00cb\7q\2\2\u00cb\u00e7\7o\2\2\u00cc\u00cd\7U\2\2"+
+		"\u00cd\u00ce\7V\2\2\u00ce\u00cf\7C\2\2\u00cf\u00d0\7T\2\2\u00d0\u00d1"+
+		"\7V\2\2\u00d1\u00d2\7K\2\2\u00d2\u00d3\7P\2\2\u00d3\u00d4\7I\2\2\u00d4"+
+		"\u00d5\7\"\2\2\u00d5\u00d6\7H\2\2\u00d6\u00d7\7T\2\2\u00d7\u00d8\7Q\2"+
+		"\2\u00d8\u00e7\7O\2\2\u00d9\u00da\7u\2\2\u00da\u00db\7v\2\2\u00db\u00dc"+
+		"\7c\2\2\u00dc\u00dd\7t\2\2\u00dd\u00de\7v\2\2\u00de\u00df\7k\2\2\u00df"+
+		"\u00e0\7p\2\2\u00e0\u00e1\7i\2\2\u00e1\u00e2\7\"\2\2\u00e2\u00e3\7h\2"+
+		"\2\u00e3\u00e4\7t\2\2\u00e4\u00e5\7q\2\2\u00e5\u00e7\7o\2\2\u00e6\u00c4"+
+		"\3\2\2\2\u00e6\u00c8\3\2\2\2\u00e6\u00cc\3\2\2\2\u00e6\u00d9\3\2\2\2\u00e7"+
+		"\20\3\2\2\2\u00e8\u00e9\7G\2\2\u00e9\u00ea\7X\2\2\u00ea\u00eb\7G\2\2\u00eb"+
+		"\u00ec\7T\2\2\u00ec\u0105\7[\2\2\u00ed\u00ee\7g\2\2\u00ee\u00ef\7x\2\2"+
+		"\u00ef\u00f0\7g\2\2\u00f0\u00f1\7t\2\2\u00f1\u0105\7{\2\2\u00f2\u00f3"+
+		"\7H\2\2\u00f3\u00f4\7Q\2\2\u00f4\u00f5\7T\2\2\u00f5\u00f6\7\"\2\2\u00f6"+
+		"\u00f7\7G\2\2\u00f7\u00f8\7X\2\2\u00f8\u00f9\7G\2\2\u00f9\u00fa\7T\2\2"+
+		"\u00fa\u0105\7[\2\2\u00fb\u00fc\7h\2\2\u00fc\u00fd\7q\2\2\u00fd\u00fe"+
+		"\7t\2\2\u00fe\u00ff\7\"\2\2\u00ff\u0100\7g\2\2\u0100\u0101\7x\2\2\u0101"+
+		"\u0102\7g\2\2\u0102\u0103\7t\2\2\u0103\u0105\7{\2\2\u0104\u00e8\3\2\2"+
+		"\2\u0104\u00ed\3\2\2\2\u0104\u00f2\3\2\2\2\u0104\u00fb\3\2\2\2\u0105\22"+
+		"\3\2\2\2\u0106\u0107\7V\2\2\u0107\u0115\7Q\2\2\u0108\u0109\7v\2\2\u0109"+
+		"\u0115\7q\2\2\u010a\u010b\7w\2\2\u010b\u010c\7p\2\2\u010c\u010d\7v\2\2"+
+		"\u010d\u010e\7k\2\2\u010e\u0115\7n\2\2\u010f\u0110\7W\2\2\u0110\u0111"+
+		"\7P\2\2\u0111\u0112\7V\2\2\u0112\u0113\7K\2\2\u0113\u0115\7N\2\2\u0114"+
+		"\u0106\3\2\2\2\u0114\u0108\3\2\2\2\u0114\u010a\3\2\2\2\u0114\u010f\3\2"+
+		"\2\2\u0115\24\3\2\2\2\u0116\u0117\7C\2\2\u0117\u0118\7I\2\2\u0118\u011d"+
+		"\7Q\2\2\u0119\u011a\7c\2\2\u011a\u011b\7i\2\2\u011b\u011d\7q\2\2\u011c"+
+		"\u0116\3\2\2\2\u011c\u0119\3\2\2\2\u011d\26\3\2\2\2\u011e\u0122\5C\"\2"+
+		"\u011f\u0121\5A!\2\u0120\u011f\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0120"+
+		"\3\2\2\2\u0122\u0123\3\2\2\2\u0123\30\3\2\2\2\u0124\u0122\3\2\2\2\u0125"+
+		"\u0126\t\2\2\2\u0126\u012a\t\3\2\2\u0127\u0129\t\4\2\2\u0128\u0127\3\2"+
+		"\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b"+
+		"\32\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u013a\5)\25\2\u012e\u013a\5+\26"+
+		"\2\u012f\u013a\5-\27\2\u0130\u013a\5/\30\2\u0131\u013a\5\61\31\2\u0132"+
+		"\u013a\5\63\32\2\u0133\u013a\5\65\33\2\u0134\u013a\5\67\34\2\u0135\u013a"+
+		"\59\35\2\u0136\u013a\5;\36\2\u0137\u013a\5=\37\2\u0138\u013a\5? \2\u0139"+
+		"\u012d\3\2\2\2\u0139\u012e\3\2\2\2\u0139\u012f\3\2\2\2\u0139\u0130\3\2"+
+		"\2\2\u0139\u0131\3\2\2\2\u0139\u0132\3\2\2\2\u0139\u0133\3\2\2\2\u0139"+
+		"\u0134\3\2\2\2\u0139\u0135\3\2\2\2\u0139\u0136\3\2\2\2\u0139\u0137\3\2"+
+		"\2\2\u0139\u0138\3\2\2\2\u013a\34\3\2\2\2\u013b\u0140\5!\21\2\u013c\u0140"+
+		"\5#\22\2\u013d\u0140\5%\23\2\u013e\u0140\5\'\24\2\u013f\u013b\3\2\2\2"+
+		"\u013f\u013c\3\2\2\2\u013f\u013d\3\2\2\2\u013f\u013e\3\2\2\2\u0140\36"+
+		"\3\2\2\2\u0141\u0143\t\5\2\2\u0142\u0141\3\2\2\2\u0143\u0144\3\2\2\2\u0144"+
+		"\u0142\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0147\b\20"+
+		"\2\2\u0147 \3\2\2\2\u0148\u0149\7U\2\2\u0149\u014a\7G\2\2\u014a\u014b"+
+		"\7E\2\2\u014b\u014c\7Q\2\2\u014c\u014d\7P\2\2\u014d\u0175\7F\2\2\u014e"+
+		"\u014f\7u\2\2\u014f\u0150\7g\2\2\u0150\u0151\7e\2\2\u0151\u0152\7q\2\2"+
+		"\u0152\u0153\7p\2\2\u0153\u0175\7f\2\2\u0154\u0155\7u\2\2\u0155\u0156"+
+		"\7g\2\2\u0156\u0157\7e\2\2\u0157\u0158\7q\2\2\u0158\u0159\7p\2\2\u0159"+
+		"\u015a\7f\2\2\u015a\u0175\7u\2\2\u015b\u015c\7U\2\2\u015c\u015d\7G\2\2"+
+		"\u015d\u015e\7E\2\2\u015e\u015f\7Q\2\2\u015f\u0160\7P\2\2\u0160\u0161"+
+		"\7F\2\2\u0161\u0175\7U\2\2\u0162\u0163\7u\2\2\u0163\u0164\7g\2\2\u0164"+
+		"\u0165\7e\2\2\u0165\u0166\7q\2\2\u0166\u0167\7p\2\2\u0167\u0168\7f\2\2"+
+		"\u0168\u0169\7*\2\2\u0169\u016a\7u\2\2\u016a\u0175\7+\2\2\u016b\u016c"+
+		"\7U\2\2\u016c\u016d\7G\2\2\u016d\u016e\7E\2\2\u016e\u016f\7Q\2\2\u016f"+
+		"\u0170\7P\2\2\u0170\u0171\7F\2\2\u0171\u0172\7*\2\2\u0172\u0173\7U\2\2"+
+		"\u0173\u0175\7+\2\2\u0174\u0148\3\2\2\2\u0174\u014e\3\2\2\2\u0174\u0154"+
+		"\3\2\2\2\u0174\u015b\3\2\2\2\u0174\u0162\3\2\2\2\u0174\u016b\3\2\2\2\u0175"+
+		"\"\3\2\2\2\u0176\u0177\7O\2\2\u0177\u0178\7K\2\2\u0178\u0179\7P\2\2\u0179"+
+		"\u017a\7W\2\2\u017a\u017b\7V\2\2\u017b\u01a3\7G\2\2\u017c\u017d\7o\2\2"+
+		"\u017d\u017e\7k\2\2\u017e\u017f\7p\2\2\u017f\u0180\7w\2\2\u0180\u0181"+
+		"\7v\2\2\u0181\u01a3\7g\2\2\u0182\u0183\7o\2\2\u0183\u0184\7k\2\2\u0184"+
+		"\u0185\7p\2\2\u0185\u0186\7w\2\2\u0186\u0187\7v\2\2\u0187\u0188\7g\2\2"+
+		"\u0188\u01a3\7u\2\2\u0189\u018a\7O\2\2\u018a\u018b\7K\2\2\u018b\u018c"+
+		"\7P\2\2\u018c\u018d\7W\2\2\u018d\u018e\7V\2\2\u018e\u018f\7G\2\2\u018f"+
+		"\u01a3\7U\2\2\u0190\u0191\7o\2\2\u0191\u0192\7k\2\2\u0192\u0193\7p\2\2"+
+		"\u0193\u0194\7w\2\2\u0194\u0195\7v\2\2\u0195\u0196\7g\2\2\u0196\u0197"+
+		"\7*\2\2\u0197\u0198\7u\2\2\u0198\u01a3\7+\2\2\u0199\u019a\7O\2\2\u019a"+
+		"\u019b\7K\2\2\u019b\u019c\7P\2\2\u019c\u019d\7W\2\2\u019d\u019e\7V\2\2"+
+		"\u019e\u019f\7G\2\2\u019f\u01a0\7*\2\2\u01a0\u01a1\7U\2\2\u01a1\u01a3"+
+		"\7+\2\2\u01a2\u0176\3\2\2\2\u01a2\u017c\3\2\2\2\u01a2\u0182\3\2\2\2\u01a2"+
+		"\u0189\3\2\2\2\u01a2\u0190\3\2\2\2\u01a2\u0199\3\2\2\2\u01a3$\3\2\2\2"+
+		"\u01a4\u01a5\7J\2\2\u01a5\u01a6\7Q\2\2\u01a6\u01a7\7W\2\2\u01a7\u01c5"+
+		"\7T\2\2\u01a8\u01a9\7j\2\2\u01a9\u01aa\7q\2\2\u01aa\u01ab\7w\2\2\u01ab"+
+		"\u01c5\7t\2\2\u01ac\u01ad\7j\2\2\u01ad\u01ae\7q\2\2\u01ae\u01af\7w\2\2"+
+		"\u01af\u01b0\7t\2\2\u01b0\u01c5\7u\2\2\u01b1\u01b2\7J\2\2\u01b2\u01b3"+
+		"\7Q\2\2\u01b3\u01b4\7W\2\2\u01b4\u01b5\7T\2\2\u01b5\u01c5\7U\2\2\u01b6"+
+		"\u01b7\7j\2\2\u01b7\u01b8\7q\2\2\u01b8\u01b9\7w\2\2\u01b9\u01ba\7t\2\2"+
+		"\u01ba\u01bb\7*\2\2\u01bb\u01bc\7u\2\2\u01bc\u01c5\7+\2\2\u01bd\u01be"+
+		"\7J\2\2\u01be\u01bf\7Q\2\2\u01bf\u01c0\7W\2\2\u01c0\u01c1\7T\2\2\u01c1"+
+		"\u01c2\7*\2\2\u01c2\u01c3\7U\2\2\u01c3\u01c5\7+\2\2\u01c4\u01a4\3\2\2"+
+		"\2\u01c4\u01a8\3\2\2\2\u01c4\u01ac\3\2\2\2\u01c4\u01b1\3\2\2\2\u01c4\u01b6"+
+		"\3\2\2\2\u01c4\u01bd\3\2\2\2\u01c5&\3\2\2\2\u01c6\u01c7\7F\2\2\u01c7\u01c8"+
+		"\7C\2\2\u01c8\u01e1\7[\2\2\u01c9\u01ca\7f\2\2\u01ca\u01cb\7c\2\2\u01cb"+
+		"\u01e1\7{\2\2\u01cc\u01cd\7f\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7{\2\2"+
+		"\u01cf\u01e1\7u\2\2\u01d0\u01d1\7F\2\2\u01d1\u01d2\7C\2\2\u01d2\u01d3"+
+		"\7[\2\2\u01d3\u01e1\7U\2\2\u01d4\u01d5\7f\2\2\u01d5\u01d6\7c\2\2\u01d6"+
+		"\u01d7\7{\2\2\u01d7\u01d8\7*\2\2\u01d8\u01d9\7u\2\2\u01d9\u01e1\7+\2\2"+
+		"\u01da\u01db\7F\2\2\u01db\u01dc\7C\2\2\u01dc\u01dd\7[\2\2\u01dd\u01de"+
+		"\7*\2\2\u01de\u01df\7U\2\2\u01df\u01e1\7+\2\2\u01e0\u01c6\3\2\2\2\u01e0"+
+		"\u01c9\3\2\2\2\u01e0\u01cc\3\2\2\2\u01e0\u01d0\3\2\2\2\u01e0\u01d4\3\2"+
+		"\2\2\u01e0\u01da\3\2\2\2\u01e1(\3\2\2\2\u01e2\u01e3\7O\2\2\u01e3\u01e4"+
+		"\7Q\2\2\u01e4\u01e5\7P\2\2\u01e5\u01e6\7F\2\2\u01e6\u01e7\7C\2\2\u01e7"+
+		"\u01fd\7[\2\2\u01e8\u01e9\7o\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb\7p\2\2"+
+		"\u01eb\u01ec\7f\2\2\u01ec\u01ed\7c\2\2\u01ed\u01fd\7{\2\2\u01ee\u01ef"+
+		"\7O\2\2\u01ef\u01f0\7Q\2\2\u01f0\u01f1\7P\2\2\u01f1\u01f2\7F\2\2\u01f2"+
+		"\u01f3\7C\2\2\u01f3\u01f4\7[\2\2\u01f4\u01fd\7U\2\2\u01f5\u01f6\7o\2\2"+
+		"\u01f6\u01f7\7q\2\2\u01f7\u01f8\7p\2\2\u01f8\u01f9\7f\2\2\u01f9\u01fa"+
+		"\7c\2\2\u01fa\u01fb\7{\2\2\u01fb\u01fd\7u\2\2\u01fc\u01e2\3\2\2\2\u01fc"+
+		"\u01e8\3\2\2\2\u01fc\u01ee\3\2\2\2\u01fc\u01f5\3\2\2\2\u01fd*\3\2\2\2"+
+		"\u01fe\u01ff\7V\2\2\u01ff\u0200\7W\2\2\u0200\u0201\7G\2\2\u0201\u0202"+
+		"\7U\2\2\u0202\u0203\7F\2\2\u0203\u0204\7C\2\2\u0204\u021d\7[\2\2\u0205"+
+		"\u0206\7v\2\2\u0206\u0207\7w\2\2\u0207\u0208\7g\2\2\u0208\u0209\7u\2\2"+
+		"\u0209\u020a\7f\2\2\u020a\u020b\7c\2\2\u020b\u021d\7{\2\2\u020c\u020d"+
+		"\7V\2\2\u020d\u020e\7W\2\2\u020e\u020f\7G\2\2\u020f\u0210\7U\2\2\u0210"+
+		"\u0211\7F\2\2\u0211\u0212\7C\2\2\u0212\u0213\7[\2\2\u0213\u021d\7U\2\2"+
+		"\u0214\u0215\7v\2\2\u0215\u0216\7w\2\2\u0216\u0217\7g\2\2\u0217\u0218"+
+		"\7u\2\2\u0218\u0219\7f\2\2\u0219\u021a\7c\2\2\u021a\u021b\7{\2\2\u021b"+
+		"\u021d\7u\2\2\u021c\u01fe\3\2\2\2\u021c\u0205\3\2\2\2\u021c\u020c\3\2"+
+		"\2\2\u021c\u0214\3\2\2\2\u021d,\3\2\2\2\u021e\u021f\7Y\2\2\u021f\u0220"+
+		"\7G\2\2\u0220\u0221\7F\2\2\u0221\u0222\7P\2\2\u0222\u0223\7G\2\2\u0223"+
+		"\u0224\7U\2\2\u0224\u0225\7F\2\2\u0225\u0226\7C\2\2\u0226\u0245\7[\2\2"+
+		"\u0227\u0228\7y\2\2\u0228\u0229\7g\2\2\u0229\u022a\7f\2\2\u022a\u022b"+
+		"\7p\2\2\u022b\u022c\7g\2\2\u022c\u022d\7u\2\2\u022d\u022e\7f\2\2\u022e"+
+		"\u022f\7c\2\2\u022f\u0245\7{\2\2\u0230\u0231\7Y\2\2\u0231\u0232\7G\2\2"+
+		"\u0232\u0233\7F\2\2\u0233\u0234\7P\2\2\u0234\u0235\7G\2\2\u0235\u0236"+
+		"\7U\2\2\u0236\u0237\7F\2\2\u0237\u0238\7C\2\2\u0238\u0239\7[\2\2\u0239"+
+		"\u0245\7U\2\2\u023a\u023b\7y\2\2\u023b\u023c\7g\2\2\u023c\u023d\7f\2\2"+
+		"\u023d\u023e\7p\2\2\u023e\u023f\7g\2\2\u023f\u0240\7u\2\2\u0240\u0241"+
+		"\7f\2\2\u0241\u0242\7c\2\2\u0242\u0243\7{\2\2\u0243\u0245\7u\2\2\u0244"+
+		"\u021e\3\2\2\2\u0244\u0227\3\2\2\2\u0244\u0230\3\2\2\2\u0244\u023a\3\2"+
+		"\2\2\u0245.\3\2\2\2\u0246\u0247\7V\2\2\u0247\u0248\7J\2\2\u0248\u0249"+
+		"\7W\2\2\u0249\u024a\7T\2\2\u024a\u024b\7U\2\2\u024b\u024c\7F\2\2\u024c"+
+		"\u024d\7C\2\2\u024d\u0269\7[\2\2\u024e\u024f\7v\2\2\u024f\u0250\7j\2\2"+
+		"\u0250\u0251\7w\2\2\u0251\u0252\7t\2\2\u0252\u0253\7u\2\2\u0253\u0254"+
+		"\7f\2\2\u0254\u0255\7c\2\2\u0255\u0269\7{\2\2\u0256\u0257\7V\2\2\u0257"+
+		"\u0258\7J\2\2\u0258\u0259\7W\2\2\u0259\u025a\7T\2\2\u025a\u025b\7U\2\2"+
+		"\u025b\u025c\7F\2\2\u025c\u025d\7C\2\2\u025d\u025e\7[\2\2\u025e\u0269"+
+		"\7U\2\2\u025f\u0260\7v\2\2\u0260\u0261\7j\2\2\u0261\u0262\7w\2\2\u0262"+
+		"\u0263\7t\2\2\u0263\u0264\7u\2\2\u0264\u0265\7f\2\2\u0265\u0266\7c\2\2"+
+		"\u0266\u0267\7{\2\2\u0267\u0269\7u\2\2\u0268\u0246\3\2\2\2\u0268\u024e"+
+		"\3\2\2\2\u0268\u0256\3\2\2\2\u0268\u025f\3\2\2\2\u0269\60\3\2\2\2\u026a"+
+		"\u026b\7H\2\2\u026b\u026c\7T\2\2\u026c\u026d\7K\2\2\u026d\u026e\7F\2\2"+
+		"\u026e\u026f\7C\2\2\u026f\u0285\7[\2\2\u0270\u0271\7h\2\2\u0271\u0272"+
+		"\7t\2\2\u0272\u0273\7k\2\2\u0273\u0274\7f\2\2\u0274\u0275\7c\2\2\u0275"+
+		"\u0285\7{\2\2\u0276\u0277\7H\2\2\u0277\u0278\7T\2\2\u0278\u0279\7K\2\2"+
+		"\u0279\u027a\7F\2\2\u027a\u027b\7C\2\2\u027b\u027c\7[\2\2\u027c\u0285"+
+		"\7U\2\2\u027d\u027e\7h\2\2\u027e\u027f\7t\2\2\u027f\u0280\7k\2\2\u0280"+
+		"\u0281\7f\2\2\u0281\u0282\7c\2\2\u0282\u0283\7{\2\2\u0283\u0285\7u\2\2"+
+		"\u0284\u026a\3\2\2\2\u0284\u0270\3\2\2\2\u0284\u0276\3\2\2\2\u0284\u027d"+
+		"\3\2\2\2\u0285\62\3\2\2\2\u0286\u0287\7U\2\2\u0287\u0288\7C\2\2\u0288"+
+		"\u0289\7V\2\2\u0289\u028a\7W\2\2\u028a\u028b\7T\2\2\u028b\u028c\7F\2\2"+
+		"\u028c\u028d\7C\2\2\u028d\u02a9\7[\2\2\u028e\u028f\7u\2\2\u028f\u0290"+
+		"\7c\2\2\u0290\u0291\7v\2\2\u0291\u0292\7w\2\2\u0292\u0293\7t\2\2\u0293"+
+		"\u0294\7f\2\2\u0294\u0295\7c\2\2\u0295\u02a9\7{\2\2\u0296\u0297\7U\2\2"+
+		"\u0297\u0298\7C\2\2\u0298\u0299\7V\2\2\u0299\u029a\7W\2\2\u029a\u029b"+
+		"\7T\2\2\u029b\u029c\7F\2\2\u029c\u029d\7C\2\2\u029d\u029e\7[\2\2\u029e"+
+		"\u02a9\7U\2\2\u029f\u02a0\7u\2\2\u02a0\u02a1\7c\2\2\u02a1\u02a2\7v\2\2"+
+		"\u02a2\u02a3\7w\2\2\u02a3\u02a4\7t\2\2\u02a4\u02a5\7f\2\2\u02a5\u02a6"+
+		"\7c\2\2\u02a6\u02a7\7{\2\2\u02a7\u02a9\7u\2\2\u02a8\u0286\3\2\2\2\u02a8"+
+		"\u028e\3\2\2\2\u02a8\u0296\3\2\2\2\u02a8\u029f\3\2\2\2\u02a9\64\3\2\2"+
+		"\2\u02aa\u02ab\7U\2\2\u02ab\u02ac\7W\2\2\u02ac\u02ad\7P\2\2\u02ad\u02ae"+
+		"\7F\2\2\u02ae\u02af\7C\2\2\u02af\u02c5\7[\2\2\u02b0\u02b1\7u\2\2\u02b1"+
+		"\u02b2\7w\2\2\u02b2\u02b3\7p\2\2\u02b3\u02b4\7f\2\2\u02b4\u02b5\7c\2\2"+
+		"\u02b5\u02c5\7{\2\2\u02b6\u02b7\7U\2\2\u02b7\u02b8\7W\2\2\u02b8\u02b9"+
+		"\7P\2\2\u02b9\u02ba\7F\2\2\u02ba\u02bb\7C\2\2\u02bb\u02bc\7[\2\2\u02bc"+
+		"\u02c5\7U\2\2\u02bd\u02be\7u\2\2\u02be\u02bf\7w\2\2\u02bf\u02c0\7p\2\2"+
+		"\u02c0\u02c1\7f\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7{\2\2\u02c3\u02c5"+
+		"\7u\2\2\u02c4\u02aa\3\2\2\2\u02c4\u02b0\3\2\2\2\u02c4\u02b6\3\2\2\2\u02c4"+
+		"\u02bd\3\2\2\2\u02c5\66\3\2\2\2\u02c6\u02c7\7v\2\2\u02c7\u02c8\7j\2\2"+
+		"\u02c8\u02c9\7k\2\2\u02c9\u02ca\7u\2\2\u02ca\u02cb\7\"\2\2\u02cb\u02cc"+
+		"\7f\2\2\u02cc\u02cd\7c\2\2\u02cd\u02ce\7{\2\2\u02ce\u02cf\7\"\2\2\u02cf"+
+		"\u02d0\7q\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\7\"\2\2\u02d2\u02d3\7y\2"+
+		"\2\u02d3\u02d4\7g\2\2\u02d4\u02d5\7g\2\2\u02d5\u0363\7m\2\2\u02d6\u02d7"+
+		"\7V\2\2\u02d7\u02d8\7J\2\2\u02d8\u02d9\7K\2\2\u02d9\u02da\7U\2\2\u02da"+
+		"\u02db\7\"\2\2\u02db\u02dc\7F\2\2\u02dc\u02dd\7C\2\2\u02dd\u02de\7[\2"+
+		"\2\u02de\u02df\7\"\2\2\u02df\u02e0\7Q\2\2\u02e0\u02e1\7H\2\2\u02e1\u02e2"+
+		"\7\"\2\2\u02e2\u02e3\7Y\2\2\u02e3\u02e4\7G\2\2\u02e4\u02e5\7G\2\2\u02e5"+
+		"\u0363\7M\2\2\u02e6\u02e7\7v\2\2\u02e7\u02e8\7j\2\2\u02e8\u02e9\7k\2\2"+
+		"\u02e9\u02ea\7u\2\2\u02ea\u02eb\7\"\2\2\u02eb\u02ec\7f\2\2\u02ec\u02ed"+
+		"\7c\2\2\u02ed\u02ee\7{\2\2\u02ee\u02ef\7\"\2\2\u02ef\u02f0\7q\2\2\u02f0"+
+		"\u02f1\7h\2\2\u02f1\u02f2\7\"\2\2\u02f2\u02f3\7v\2\2\u02f3\u02f4\7j\2"+
+		"\2\u02f4\u02f5\7g\2\2\u02f5\u02f6\7\"\2\2\u02f6\u02f7\7y\2\2\u02f7\u02f8"+
+		"\7g\2\2\u02f8\u02f9\7g\2\2\u02f9\u0363\7m\2\2\u02fa\u02fb\7V\2\2\u02fb"+
+		"\u02fc\7J\2\2\u02fc\u02fd\7K\2\2\u02fd\u02fe\7U\2\2\u02fe\u02ff\7\"\2"+
+		"\2\u02ff\u0300\7F\2\2\u0300\u0301\7C\2\2\u0301\u0302\7[\2\2\u0302\u0303"+
+		"\7\"\2\2\u0303\u0304\7Q\2\2\u0304\u0305\7H\2\2\u0305\u0306\7\"\2\2\u0306"+
+		"\u0307\7V\2\2\u0307\u0308\7J\2\2\u0308\u0309\7G\2\2\u0309\u030a\7\"\2"+
+		"\2\u030a\u030b\7Y\2\2\u030b\u030c\7G\2\2\u030c\u030d\7G\2\2\u030d\u0363"+
+		"\7M\2\2\u030e\u030f\7e\2\2\u030f\u0310\7w\2\2\u0310\u0311\7t\2\2\u0311"+
+		"\u0312\7t\2\2\u0312\u0313\7g\2\2\u0313\u0314\7p\2\2\u0314\u0315\7v\2\2"+
+		"\u0315\u0316\7\"\2\2\u0316\u0317\7f\2\2\u0317\u0318\7c\2\2\u0318\u0319"+
+		"\7{\2\2\u0319\u031a\7\"\2\2\u031a\u031b\7q\2\2\u031b\u031c\7h\2\2\u031c"+
+		"\u031d\7\"\2\2\u031d\u031e\7y\2\2\u031e\u031f\7g\2\2\u031f\u0320\7g\2"+
+		"\2\u0320\u0363\7m\2\2\u0321\u0322\7E\2\2\u0322\u0323\7W\2\2\u0323\u0324"+
+		"\7T\2\2\u0324\u0325\7T\2\2\u0325\u0326\7G\2\2\u0326\u0327\7P\2\2\u0327"+
+		"\u0328\7V\2\2\u0328\u0329\7\"\2\2\u0329\u032a\7F\2\2\u032a\u032b\7C\2"+
+		"\2\u032b\u032c\7[\2\2\u032c\u032d\7\"\2\2\u032d\u032e\7Q\2\2\u032e\u032f"+
+		"\7H\2\2\u032f\u0330\7\"\2\2\u0330\u0331\7Y\2\2\u0331\u0332\7G\2\2\u0332"+
+		"\u0333\7G\2\2\u0333\u0363\7M\2\2\u0334\u0335\7e\2\2\u0335\u0336\7w\2\2"+
+		"\u0336\u0337\7t\2\2\u0337\u0338\7t\2\2\u0338\u0339\7g\2\2\u0339\u033a"+
+		"\7p\2\2\u033a\u033b\7v\2\2\u033b\u033c\7\"\2\2\u033c\u033d\7f\2\2\u033d"+
+		"\u033e\7c\2\2\u033e\u033f\7{\2\2\u033f\u0340\7\"\2\2\u0340\u0341\7q\2"+
+		"\2\u0341\u0342\7h\2\2\u0342\u0343\7\"\2\2\u0343\u0344\7v\2\2\u0344\u0345"+
+		"\7j\2\2\u0345\u0346\7g\2\2\u0346\u0347\7\"\2\2\u0347\u0348\7y\2\2\u0348"+
+		"\u0349\7g\2\2\u0349\u034a\7g\2\2\u034a\u0363\7m\2\2\u034b\u034c\7E\2\2"+
+		"\u034c\u034d\7W\2\2\u034d\u034e\7T\2\2\u034e\u034f\7T\2\2\u034f\u0350"+
+		"\7G\2\2\u0350\u0351\7P\2\2\u0351\u0352\7V\2\2\u0352\u0353\7\"\2\2\u0353"+
+		"\u0354\7F\2\2\u0354\u0355\7C\2\2\u0355\u0356\7[\2\2\u0356\u0357\7\"\2"+
+		"\2\u0357\u0358\7Q\2\2\u0358\u0359\7H\2\2\u0359\u035a\7\"\2\2\u035a\u035b"+
+		"\7V\2\2\u035b\u035c\7J\2\2\u035c\u035d\7G\2\2\u035d\u035e\7\"\2\2\u035e"+
+		"\u035f\7Y\2\2\u035f\u0360\7G\2\2\u0360\u0361\7G\2\2\u0361\u0363\7M\2\2"+
+		"\u0362\u02c6\3\2\2\2\u0362\u02d6\3\2\2\2\u0362\u02e6\3\2\2\2\u0362\u02fa"+
+		"\3\2\2\2\u0362\u030e\3\2\2\2\u0362\u0321\3\2\2\2\u0362\u0334\3\2\2\2\u0362"+
+		"\u034b\3\2\2\2\u03638\3\2\2\2\u0364\u0365\7y\2\2\u0365\u0366\7g\2\2\u0366"+
+		"\u0367\7g\2\2\u0367\u0368\7m\2\2\u0368\u0369\7g\2\2\u0369\u036a\7p\2\2"+
+		"\u036a\u0383\7f\2\2\u036b\u036c\7Y\2\2\u036c\u036d\7G\2\2\u036d\u036e"+
+		"\7G\2\2\u036e\u036f\7M\2\2\u036f\u0370\7G\2\2\u0370\u0371\7P\2\2\u0371"+
+		"\u0383\7F\2\2\u0372\u0373\7y\2\2\u0373\u0374\7g\2\2\u0374\u0375\7g\2\2"+
+		"\u0375\u0376\7m\2\2\u0376\u0377\7g\2\2\u0377\u0378\7p\2\2\u0378\u0379"+
+		"\7f\2\2\u0379\u0383\7u\2\2\u037a\u037b\7Y\2\2\u037b\u037c\7G\2\2\u037c"+
+		"\u037d\7G\2\2\u037d\u037e\7M\2\2\u037e\u037f\7G\2\2\u037f\u0380\7P\2\2"+
+		"\u0380\u0381\7F\2\2\u0381\u0383\7U\2\2\u0382\u0364\3\2\2\2\u0382\u036b"+
+		"\3\2\2\2\u0382\u0372\3\2\2\2\u0382\u037a\3\2\2\2\u0383:\3\2\2\2\u0384"+
+		"\u0385\7y\2\2\u0385\u0386\7g\2\2\u0386\u0387\7g\2\2\u0387\u0388\7m\2\2"+
+		"\u0388\u0389\7f\2\2\u0389\u038a\7c\2\2\u038a\u03a3\7{\2\2\u038b\u038c"+
+		"\7Y\2\2\u038c\u038d\7G\2\2\u038d\u038e\7G\2\2\u038e\u038f\7M\2\2\u038f"+
+		"\u0390\7F\2\2\u0390\u0391\7C\2\2\u0391\u03a3\7[\2\2\u0392\u0393\7y\2\2"+
+		"\u0393\u0394\7g\2\2\u0394\u0395\7g\2\2\u0395\u0396\7m\2\2\u0396\u0397"+
+		"\7f\2\2\u0397\u0398\7c\2\2\u0398\u0399\7{\2\2\u0399\u03a3\7u\2\2\u039a"+
+		"\u039b\7Y\2\2\u039b\u039c\7G\2\2\u039c\u039d\7G\2\2\u039d\u039e\7M\2\2"+
+		"\u039e\u039f\7F\2\2\u039f\u03a0\7C\2\2\u03a0\u03a1\7[\2\2\u03a1\u03a3"+
+		"\7U\2\2\u03a2\u0384\3\2\2\2\u03a2\u038b\3\2\2\2\u03a2\u0392\3\2\2\2\u03a2"+
+		"\u039a\3\2\2\2\u03a3<\3\2\2\2\u03a4\u03a5\7j\2\2\u03a5\u03a6\7q\2\2\u03a6"+
+		"\u03a7\7n\2\2\u03a7\u03a8\7k\2\2\u03a8\u03a9\7f\2\2\u03a9\u03aa\7c\2\2"+
+		"\u03aa\u03c3\7{\2\2\u03ab\u03ac\7J\2\2\u03ac\u03ad\7Q\2\2\u03ad\u03ae"+
+		"\7N\2\2\u03ae\u03af\7K\2\2\u03af\u03b0\7F\2\2\u03b0\u03b1\7C\2\2\u03b1"+
+		"\u03c3\7[\2\2\u03b2\u03b3\7j\2\2\u03b3\u03b4\7q\2\2\u03b4\u03b5\7n\2\2"+
+		"\u03b5\u03b6\7k\2\2\u03b6\u03b7\7f\2\2\u03b7\u03b8\7c\2\2\u03b8\u03b9"+
+		"\7{\2\2\u03b9\u03c3\7u\2\2\u03ba\u03bb\7J\2\2\u03bb\u03bc\7Q\2\2\u03bc"+
+		"\u03bd\7N\2\2\u03bd\u03be\7K\2\2\u03be\u03bf\7F\2\2\u03bf\u03c0\7C\2\2"+
+		"\u03c0\u03c1\7[\2\2\u03c1\u03c3\7U\2\2\u03c2\u03a4\3\2\2\2\u03c2\u03ab"+
+		"\3\2\2\2\u03c2\u03b2\3\2\2\2\u03c2\u03ba\3\2\2\2\u03c3>\3\2\2\2\u03c4"+
+		"\u03c5\7f\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7v\2\2\u03c7\u03cd\7g\2\2"+
+		"\u03c8\u03c9\7F\2\2\u03c9\u03ca\7C\2\2\u03ca\u03cb\7V\2\2\u03cb\u03cd"+
+		"\7G\2\2\u03cc\u03c4\3\2\2\2\u03cc\u03c8\3\2\2\2\u03cd@\3\2\2\2\u03ce\u03cf"+
+		"\4\62;\2\u03cfB\3\2\2\2\u03d0\u03d1\4\63;\2\u03d1D\3\2\2\2 \2V\u0088\u00ba"+
+		"\u00c2\u00e6\u0104\u0114\u011c\u0122\u012a\u0139\u013f\u0144\u0174\u01a2"+
+		"\u01c4\u01e0\u01fc\u021c\u0244\u0268\u0284\u02a8\u02c4\u0362\u0382\u03a2"+
+		"\u03c2\u03cc\3\b\2\2";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowListener.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowListener.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowListener.java
new file mode 100644
index 0000000..0cd8f5d
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowListener.java
@@ -0,0 +1,231 @@
+// Generated from org/apache/metron/profiler/client/window/generated/Window.g4 by ANTLR 4.5
+package org.apache.metron.profiler.client.window.generated;
+
+//CHECKSTYLE:OFF
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.antlr.v4.runtime.misc.NotNull;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a process tree produced by
+ * {@link WindowParser}.
+ */
+public interface WindowListener extends ParseTreeListener {
+	/**
+	 * Enter a process tree produced by {@link WindowParser#window}.
+	 * @param ctx the process tree
+	 */
+	void enterWindow(WindowParser.WindowContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#window}.
+	 * @param ctx the process tree
+	 */
+	void exitWindow(WindowParser.WindowContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code NonRepeatingWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void enterNonRepeatingWindow(WindowParser.NonRepeatingWindowContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code NonRepeatingWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void exitNonRepeatingWindow(WindowParser.NonRepeatingWindowContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code RepeatingWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void enterRepeatingWindow(WindowParser.RepeatingWindowContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code RepeatingWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void exitRepeatingWindow(WindowParser.RepeatingWindowContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code DenseWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void enterDenseWindow(WindowParser.DenseWindowContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code DenseWindow}
+	 * labeled alternative in {@link WindowParser#window_expression}.
+	 * @param ctx the process tree
+	 */
+	void exitDenseWindow(WindowParser.DenseWindowContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#excluding_specifier}.
+	 * @param ctx the process tree
+	 */
+	void enterExcluding_specifier(WindowParser.Excluding_specifierContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#excluding_specifier}.
+	 * @param ctx the process tree
+	 */
+	void exitExcluding_specifier(WindowParser.Excluding_specifierContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#including_specifier}.
+	 * @param ctx the process tree
+	 */
+	void enterIncluding_specifier(WindowParser.Including_specifierContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#including_specifier}.
+	 * @param ctx the process tree
+	 */
+	void exitIncluding_specifier(WindowParser.Including_specifierContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#specifier}.
+	 * @param ctx the process tree
+	 */
+	void enterSpecifier(WindowParser.SpecifierContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#specifier}.
+	 * @param ctx the process tree
+	 */
+	void exitSpecifier(WindowParser.SpecifierContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#specifier_arg_list}.
+	 * @param ctx the process tree
+	 */
+	void enterSpecifier_arg_list(WindowParser.Specifier_arg_listContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#specifier_arg_list}.
+	 * @param ctx the process tree
+	 */
+	void exitSpecifier_arg_list(WindowParser.Specifier_arg_listContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#day_specifier}.
+	 * @param ctx the process tree
+	 */
+	void enterDay_specifier(WindowParser.Day_specifierContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#day_specifier}.
+	 * @param ctx the process tree
+	 */
+	void exitDay_specifier(WindowParser.Day_specifierContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#identifier}.
+	 * @param ctx the process tree
+	 */
+	void enterIdentifier(WindowParser.IdentifierContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#identifier}.
+	 * @param ctx the process tree
+	 */
+	void exitIdentifier(WindowParser.IdentifierContext ctx);
+	/**
+	 * Enter a process tree produced by {@link WindowParser#specifier_list}.
+	 * @param ctx the process tree
+	 */
+	void enterSpecifier_list(WindowParser.Specifier_listContext ctx);
+	/**
+	 * Exit a process tree produced by {@link WindowParser#specifier_list}.
+	 * @param ctx the process tree
+	 */
+	void exitSpecifier_list(WindowParser.Specifier_listContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code FromToDuration}
+	 * labeled alternative in {@link WindowParser#duration}.
+	 * @param ctx the process tree
+	 */
+	void enterFromToDuration(WindowParser.FromToDurationContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code FromToDuration}
+	 * labeled alternative in {@link WindowParser#duration}.
+	 * @param ctx the process tree
+	 */
+	void exitFromToDuration(WindowParser.FromToDurationContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code FromDuration}
+	 * labeled alternative in {@link WindowParser#duration}.
+	 * @param ctx the process tree
+	 */
+	void enterFromDuration(WindowParser.FromDurationContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code FromDuration}
+	 * labeled alternative in {@link WindowParser#duration}.
+	 * @param ctx the process tree
+	 */
+	void exitFromDuration(WindowParser.FromDurationContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code SkipDistance}
+	 * labeled alternative in {@link WindowParser#skip_distance}.
+	 * @param ctx the process tree
+	 */
+	void enterSkipDistance(WindowParser.SkipDistanceContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code SkipDistance}
+	 * labeled alternative in {@link WindowParser#skip_distance}.
+	 * @param ctx the process tree
+	 */
+	void exitSkipDistance(WindowParser.SkipDistanceContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code WindowWidth}
+	 * labeled alternative in {@link WindowParser#window_width}.
+	 * @param ctx the process tree
+	 */
+	void enterWindowWidth(WindowParser.WindowWidthContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code WindowWidth}
+	 * labeled alternative in {@link WindowParser#window_width}.
+	 * @param ctx the process tree
+	 */
+	void exitWindowWidth(WindowParser.WindowWidthContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code TimeInterval}
+	 * labeled alternative in {@link WindowParser#time_interval}.
+	 * @param ctx the process tree
+	 */
+	void enterTimeInterval(WindowParser.TimeIntervalContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code TimeInterval}
+	 * labeled alternative in {@link WindowParser#time_interval}.
+	 * @param ctx the process tree
+	 */
+	void exitTimeInterval(WindowParser.TimeIntervalContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code TimeAmount}
+	 * labeled alternative in {@link WindowParser#time_amount}.
+	 * @param ctx the process tree
+	 */
+	void enterTimeAmount(WindowParser.TimeAmountContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code TimeAmount}
+	 * labeled alternative in {@link WindowParser#time_amount}.
+	 * @param ctx the process tree
+	 */
+	void exitTimeAmount(WindowParser.TimeAmountContext ctx);
+	/**
+	 * Enter a process tree produced by the {@code TimeUnit}
+	 * labeled alternative in {@link WindowParser#time_unit}.
+	 * @param ctx the process tree
+	 */
+	void enterTimeUnit(WindowParser.TimeUnitContext ctx);
+	/**
+	 * Exit a process tree produced by the {@code TimeUnit}
+	 * labeled alternative in {@link WindowParser#time_unit}.
+	 * @param ctx the process tree
+	 */
+	void exitTimeUnit(WindowParser.TimeUnitContext ctx);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowParser.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowParser.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowParser.java
new file mode 100644
index 0000000..a762644
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/generated/WindowParser.java
@@ -0,0 +1,1096 @@
+// Generated from org/apache/metron/profiler/client/window/generated/Window.g4 by ANTLR 4.5
+package org.apache.metron.profiler.client.window.generated;
+
+//CHECKSTYLE:OFF
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class WindowParser extends Parser {
+	static { RuntimeMetaData.checkVersion("4.5", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		COMMA=1, COLON=2, WINDOW=3, INCLUDE=4, EXCLUDE=5, NOW=6, FROM=7, EVERY=8, 
+		TO=9, AGO=10, NUMBER=11, IDENTIFIER=12, DAY_SPECIFIER=13, TIME_UNIT=14, 
+		WS=15;
+	public static final int
+		RULE_window = 0, RULE_window_expression = 1, RULE_excluding_specifier = 2, 
+		RULE_including_specifier = 3, RULE_specifier = 4, RULE_specifier_arg_list = 5, 
+		RULE_day_specifier = 6, RULE_identifier = 7, RULE_specifier_list = 8, 
+		RULE_duration = 9, RULE_skip_distance = 10, RULE_window_width = 11, RULE_time_interval = 12, 
+		RULE_time_amount = 13, RULE_time_unit = 14;
+	public static final String[] ruleNames = {
+		"window", "window_expression", "excluding_specifier", "including_specifier", 
+		"specifier", "specifier_arg_list", "day_specifier", "identifier", "specifier_list", 
+		"duration", "skip_distance", "window_width", "time_interval", "time_amount", 
+		"time_unit"
+	};
+
+	private static final String[] _LITERAL_NAMES = {
+		null, "','", "':'"
+	};
+	private static final String[] _SYMBOLIC_NAMES = {
+		null, "COMMA", "COLON", "WINDOW", "INCLUDE", "EXCLUDE", "NOW", "FROM", 
+		"EVERY", "TO", "AGO", "NUMBER", "IDENTIFIER", "DAY_SPECIFIER", "TIME_UNIT", 
+		"WS"
+	};
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+	@Override
+	public String getGrammarFileName() { return "Window.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	public WindowParser(TokenStream input) {
+		super(input);
+		_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+	public static class WindowContext extends ParserRuleContext {
+		public Window_expressionContext window_expression() {
+			return getRuleContext(Window_expressionContext.class,0);
+		}
+		public TerminalNode EOF() { return getToken(WindowParser.EOF, 0); }
+		public WindowContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_window; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterWindow(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitWindow(this);
+		}
+	}
+
+	public final WindowContext window() throws RecognitionException {
+		WindowContext _localctx = new WindowContext(_ctx, getState());
+		enterRule(_localctx, 0, RULE_window);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(30);
+			window_expression();
+			setState(31);
+			match(EOF);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Window_expressionContext extends ParserRuleContext {
+		public Window_expressionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_window_expression; }
+	 
+		public Window_expressionContext() { }
+		public void copyFrom(Window_expressionContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class RepeatingWindowContext extends Window_expressionContext {
+		public Window_widthContext window_width() {
+			return getRuleContext(Window_widthContext.class,0);
+		}
+		public Skip_distanceContext skip_distance() {
+			return getRuleContext(Skip_distanceContext.class,0);
+		}
+		public DurationContext duration() {
+			return getRuleContext(DurationContext.class,0);
+		}
+		public Including_specifierContext including_specifier() {
+			return getRuleContext(Including_specifierContext.class,0);
+		}
+		public Excluding_specifierContext excluding_specifier() {
+			return getRuleContext(Excluding_specifierContext.class,0);
+		}
+		public RepeatingWindowContext(Window_expressionContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterRepeatingWindow(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitRepeatingWindow(this);
+		}
+	}
+	public static class DenseWindowContext extends Window_expressionContext {
+		public DurationContext duration() {
+			return getRuleContext(DurationContext.class,0);
+		}
+		public DenseWindowContext(Window_expressionContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterDenseWindow(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitDenseWindow(this);
+		}
+	}
+	public static class NonRepeatingWindowContext extends Window_expressionContext {
+		public Window_widthContext window_width() {
+			return getRuleContext(Window_widthContext.class,0);
+		}
+		public Including_specifierContext including_specifier() {
+			return getRuleContext(Including_specifierContext.class,0);
+		}
+		public Excluding_specifierContext excluding_specifier() {
+			return getRuleContext(Excluding_specifierContext.class,0);
+		}
+		public NonRepeatingWindowContext(Window_expressionContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterNonRepeatingWindow(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitNonRepeatingWindow(this);
+		}
+	}
+
+	public final Window_expressionContext window_expression() throws RecognitionException {
+		Window_expressionContext _localctx = new Window_expressionContext(_ctx, getState());
+		enterRule(_localctx, 2, RULE_window_expression);
+		int _la;
+		try {
+			setState(50);
+			switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
+			case 1:
+				_localctx = new NonRepeatingWindowContext(_localctx);
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(33);
+				window_width();
+				setState(35);
+				_la = _input.LA(1);
+				if (_la==INCLUDE) {
+					{
+					setState(34);
+					including_specifier();
+					}
+				}
+
+				setState(38);
+				_la = _input.LA(1);
+				if (_la==EXCLUDE) {
+					{
+					setState(37);
+					excluding_specifier();
+					}
+				}
+
+				}
+				break;
+			case 2:
+				_localctx = new RepeatingWindowContext(_localctx);
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(40);
+				window_width();
+				setState(41);
+				skip_distance();
+				setState(42);
+				duration();
+				setState(44);
+				_la = _input.LA(1);
+				if (_la==INCLUDE) {
+					{
+					setState(43);
+					including_specifier();
+					}
+				}
+
+				setState(47);
+				_la = _input.LA(1);
+				if (_la==EXCLUDE) {
+					{
+					setState(46);
+					excluding_specifier();
+					}
+				}
+
+				}
+				break;
+			case 3:
+				_localctx = new DenseWindowContext(_localctx);
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(49);
+				duration();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Excluding_specifierContext extends ParserRuleContext {
+		public TerminalNode EXCLUDE() { return getToken(WindowParser.EXCLUDE, 0); }
+		public Specifier_listContext specifier_list() {
+			return getRuleContext(Specifier_listContext.class,0);
+		}
+		public Excluding_specifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_excluding_specifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterExcluding_specifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitExcluding_specifier(this);
+		}
+	}
+
+	public final Excluding_specifierContext excluding_specifier() throws RecognitionException {
+		Excluding_specifierContext _localctx = new Excluding_specifierContext(_ctx, getState());
+		enterRule(_localctx, 4, RULE_excluding_specifier);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(52);
+			match(EXCLUDE);
+			setState(53);
+			specifier_list(0);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Including_specifierContext extends ParserRuleContext {
+		public TerminalNode INCLUDE() { return getToken(WindowParser.INCLUDE, 0); }
+		public Specifier_listContext specifier_list() {
+			return getRuleContext(Specifier_listContext.class,0);
+		}
+		public Including_specifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_including_specifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterIncluding_specifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitIncluding_specifier(this);
+		}
+	}
+
+	public final Including_specifierContext including_specifier() throws RecognitionException {
+		Including_specifierContext _localctx = new Including_specifierContext(_ctx, getState());
+		enterRule(_localctx, 6, RULE_including_specifier);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(55);
+			match(INCLUDE);
+			setState(56);
+			specifier_list(0);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class SpecifierContext extends ParserRuleContext {
+		public Day_specifierContext day_specifier() {
+			return getRuleContext(Day_specifierContext.class,0);
+		}
+		public Specifier_arg_listContext specifier_arg_list() {
+			return getRuleContext(Specifier_arg_listContext.class,0);
+		}
+		public SpecifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_specifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterSpecifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitSpecifier(this);
+		}
+	}
+
+	public final SpecifierContext specifier() throws RecognitionException {
+		SpecifierContext _localctx = new SpecifierContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_specifier);
+		try {
+			setState(62);
+			switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(58);
+				day_specifier();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(59);
+				day_specifier();
+				setState(60);
+				specifier_arg_list();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Specifier_arg_listContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public Specifier_arg_listContext specifier_arg_list() {
+			return getRuleContext(Specifier_arg_listContext.class,0);
+		}
+		public Specifier_arg_listContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_specifier_arg_list; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterSpecifier_arg_list(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitSpecifier_arg_list(this);
+		}
+	}
+
+	public final Specifier_arg_listContext specifier_arg_list() throws RecognitionException {
+		Specifier_arg_listContext _localctx = new Specifier_arg_listContext(_ctx, getState());
+		enterRule(_localctx, 10, RULE_specifier_arg_list);
+		try {
+			setState(68);
+			switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(64);
+				identifier();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(65);
+				identifier();
+				setState(66);
+				specifier_arg_list();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Day_specifierContext extends ParserRuleContext {
+		public TerminalNode DAY_SPECIFIER() { return getToken(WindowParser.DAY_SPECIFIER, 0); }
+		public Day_specifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_day_specifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterDay_specifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitDay_specifier(this);
+		}
+	}
+
+	public final Day_specifierContext day_specifier() throws RecognitionException {
+		Day_specifierContext _localctx = new Day_specifierContext(_ctx, getState());
+		enterRule(_localctx, 12, RULE_day_specifier);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(70);
+			match(DAY_SPECIFIER);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class IdentifierContext extends ParserRuleContext {
+		public TerminalNode NUMBER() { return getToken(WindowParser.NUMBER, 0); }
+		public TerminalNode IDENTIFIER() { return getToken(WindowParser.IDENTIFIER, 0); }
+		public IdentifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_identifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterIdentifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitIdentifier(this);
+		}
+	}
+
+	public final IdentifierContext identifier() throws RecognitionException {
+		IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
+		enterRule(_localctx, 14, RULE_identifier);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(72);
+			_la = _input.LA(1);
+			if ( !(_la==NUMBER || _la==IDENTIFIER) ) {
+			_errHandler.recoverInline(this);
+			} else {
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Specifier_listContext extends ParserRuleContext {
+		public SpecifierContext specifier() {
+			return getRuleContext(SpecifierContext.class,0);
+		}
+		public Specifier_listContext specifier_list() {
+			return getRuleContext(Specifier_listContext.class,0);
+		}
+		public TerminalNode COMMA() { return getToken(WindowParser.COMMA, 0); }
+		public Specifier_listContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_specifier_list; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterSpecifier_list(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitSpecifier_list(this);
+		}
+	}
+
+	public final Specifier_listContext specifier_list() throws RecognitionException {
+		return specifier_list(0);
+	}
+
+	private Specifier_listContext specifier_list(int _p) throws RecognitionException {
+		ParserRuleContext _parentctx = _ctx;
+		int _parentState = getState();
+		Specifier_listContext _localctx = new Specifier_listContext(_ctx, _parentState);
+		Specifier_listContext _prevctx = _localctx;
+		int _startState = 16;
+		enterRecursionRule(_localctx, 16, RULE_specifier_list, _p);
+		try {
+			int _alt;
+			enterOuterAlt(_localctx, 1);
+			{
+			{
+			setState(75);
+			specifier();
+			}
+			_ctx.stop = _input.LT(-1);
+			setState(82);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					if ( _parseListeners!=null ) triggerExitRuleEvent();
+					_prevctx = _localctx;
+					{
+					{
+					_localctx = new Specifier_listContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_specifier_list);
+					setState(77);
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(78);
+					match(COMMA);
+					setState(79);
+					specifier();
+					}
+					} 
+				}
+				setState(84);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			unrollRecursionContexts(_parentctx);
+		}
+		return _localctx;
+	}
+
+	public static class DurationContext extends ParserRuleContext {
+		public DurationContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_duration; }
+	 
+		public DurationContext() { }
+		public void copyFrom(DurationContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class FromToDurationContext extends DurationContext {
+		public TerminalNode FROM() { return getToken(WindowParser.FROM, 0); }
+		public List<Time_intervalContext> time_interval() {
+			return getRuleContexts(Time_intervalContext.class);
+		}
+		public Time_intervalContext time_interval(int i) {
+			return getRuleContext(Time_intervalContext.class,i);
+		}
+		public TerminalNode TO() { return getToken(WindowParser.TO, 0); }
+		public List<TerminalNode> AGO() { return getTokens(WindowParser.AGO); }
+		public TerminalNode AGO(int i) {
+			return getToken(WindowParser.AGO, i);
+		}
+		public FromToDurationContext(DurationContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterFromToDuration(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitFromToDuration(this);
+		}
+	}
+	public static class FromDurationContext extends DurationContext {
+		public TerminalNode FROM() { return getToken(WindowParser.FROM, 0); }
+		public Time_intervalContext time_interval() {
+			return getRuleContext(Time_intervalContext.class,0);
+		}
+		public TerminalNode AGO() { return getToken(WindowParser.AGO, 0); }
+		public FromDurationContext(DurationContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterFromDuration(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitFromDuration(this);
+		}
+	}
+
+	public final DurationContext duration() throws RecognitionException {
+		DurationContext _localctx = new DurationContext(_ctx, getState());
+		enterRule(_localctx, 18, RULE_duration);
+		int _la;
+		try {
+			setState(100);
+			switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
+			case 1:
+				_localctx = new FromToDurationContext(_localctx);
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(85);
+				match(FROM);
+				setState(86);
+				time_interval();
+				setState(88);
+				_la = _input.LA(1);
+				if (_la==AGO) {
+					{
+					setState(87);
+					match(AGO);
+					}
+				}
+
+				setState(90);
+				match(TO);
+				setState(91);
+				time_interval();
+				setState(93);
+				_la = _input.LA(1);
+				if (_la==AGO) {
+					{
+					setState(92);
+					match(AGO);
+					}
+				}
+
+				}
+				break;
+			case 2:
+				_localctx = new FromDurationContext(_localctx);
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(95);
+				match(FROM);
+				setState(96);
+				time_interval();
+				setState(98);
+				_la = _input.LA(1);
+				if (_la==AGO) {
+					{
+					setState(97);
+					match(AGO);
+					}
+				}
+
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Skip_distanceContext extends ParserRuleContext {
+		public Skip_distanceContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_skip_distance; }
+	 
+		public Skip_distanceContext() { }
+		public void copyFrom(Skip_distanceContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class SkipDistanceContext extends Skip_distanceContext {
+		public TerminalNode EVERY() { return getToken(WindowParser.EVERY, 0); }
+		public Time_intervalContext time_interval() {
+			return getRuleContext(Time_intervalContext.class,0);
+		}
+		public SkipDistanceContext(Skip_distanceContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterSkipDistance(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitSkipDistance(this);
+		}
+	}
+
+	public final Skip_distanceContext skip_distance() throws RecognitionException {
+		Skip_distanceContext _localctx = new Skip_distanceContext(_ctx, getState());
+		enterRule(_localctx, 20, RULE_skip_distance);
+		try {
+			_localctx = new SkipDistanceContext(_localctx);
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(102);
+			match(EVERY);
+			setState(103);
+			time_interval();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Window_widthContext extends ParserRuleContext {
+		public Window_widthContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_window_width; }
+	 
+		public Window_widthContext() { }
+		public void copyFrom(Window_widthContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class WindowWidthContext extends Window_widthContext {
+		public Time_intervalContext time_interval() {
+			return getRuleContext(Time_intervalContext.class,0);
+		}
+		public TerminalNode WINDOW() { return getToken(WindowParser.WINDOW, 0); }
+		public WindowWidthContext(Window_widthContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterWindowWidth(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitWindowWidth(this);
+		}
+	}
+
+	public final Window_widthContext window_width() throws RecognitionException {
+		Window_widthContext _localctx = new Window_widthContext(_ctx, getState());
+		enterRule(_localctx, 22, RULE_window_width);
+		int _la;
+		try {
+			_localctx = new WindowWidthContext(_localctx);
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(105);
+			time_interval();
+			setState(107);
+			_la = _input.LA(1);
+			if (_la==WINDOW) {
+				{
+				setState(106);
+				match(WINDOW);
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Time_intervalContext extends ParserRuleContext {
+		public Time_intervalContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_time_interval; }
+	 
+		public Time_intervalContext() { }
+		public void copyFrom(Time_intervalContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class TimeIntervalContext extends Time_intervalContext {
+		public Time_amountContext time_amount() {
+			return getRuleContext(Time_amountContext.class,0);
+		}
+		public Time_unitContext time_unit() {
+			return getRuleContext(Time_unitContext.class,0);
+		}
+		public TimeIntervalContext(Time_intervalContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterTimeInterval(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitTimeInterval(this);
+		}
+	}
+
+	public final Time_intervalContext time_interval() throws RecognitionException {
+		Time_intervalContext _localctx = new Time_intervalContext(_ctx, getState());
+		enterRule(_localctx, 24, RULE_time_interval);
+		try {
+			_localctx = new TimeIntervalContext(_localctx);
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(109);
+			time_amount();
+			setState(110);
+			time_unit();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Time_amountContext extends ParserRuleContext {
+		public Time_amountContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_time_amount; }
+	 
+		public Time_amountContext() { }
+		public void copyFrom(Time_amountContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class TimeAmountContext extends Time_amountContext {
+		public TerminalNode NUMBER() { return getToken(WindowParser.NUMBER, 0); }
+		public TimeAmountContext(Time_amountContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterTimeAmount(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitTimeAmount(this);
+		}
+	}
+
+	public final Time_amountContext time_amount() throws RecognitionException {
+		Time_amountContext _localctx = new Time_amountContext(_ctx, getState());
+		enterRule(_localctx, 26, RULE_time_amount);
+		try {
+			_localctx = new TimeAmountContext(_localctx);
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(112);
+			match(NUMBER);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Time_unitContext extends ParserRuleContext {
+		public Time_unitContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_time_unit; }
+	 
+		public Time_unitContext() { }
+		public void copyFrom(Time_unitContext ctx) {
+			super.copyFrom(ctx);
+		}
+	}
+	public static class TimeUnitContext extends Time_unitContext {
+		public TerminalNode TIME_UNIT() { return getToken(WindowParser.TIME_UNIT, 0); }
+		public TimeUnitContext(Time_unitContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).enterTimeUnit(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof WindowListener ) ((WindowListener)listener).exitTimeUnit(this);
+		}
+	}
+
+	public final Time_unitContext time_unit() throws RecognitionException {
+		Time_unitContext _localctx = new Time_unitContext(_ctx, getState());
+		enterRule(_localctx, 28, RULE_time_unit);
+		try {
+			_localctx = new TimeUnitContext(_localctx);
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(114);
+			match(TIME_UNIT);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
+		switch (ruleIndex) {
+		case 8:
+			return specifier_list_sempred((Specifier_listContext)_localctx, predIndex);
+		}
+		return true;
+	}
+	private boolean specifier_list_sempred(Specifier_listContext _localctx, int predIndex) {
+		switch (predIndex) {
+		case 0:
+			return precpred(_ctx, 1);
+		}
+		return true;
+	}
+
+	public static final String _serializedATN =
+		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\21w\4\2\t\2\4\3\t"+
+		"\3\4\4\t\4\4\5\t\5\4\6\t\6\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\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\3\2\3\2\3\2\3\3\3\3\5\3&"+
+		"\n\3\3\3\5\3)\n\3\3\3\3\3\3\3\3\3\5\3/\n\3\3\3\5\3\62\n\3\3\3\5\3\65\n"+
+		"\3\3\4\3\4\3\4\3\5\3\5\3\5\3\6\3\6\3\6\3\6\5\6A\n\6\3\7\3\7\3\7\3\7\5"+
+		"\7G\n\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\7\nS\n\n\f\n\16\nV\13"+
+		"\n\3\13\3\13\3\13\5\13[\n\13\3\13\3\13\3\13\5\13`\n\13\3\13\3\13\3\13"+
+		"\5\13e\n\13\5\13g\n\13\3\f\3\f\3\f\3\r\3\r\5\rn\n\r\3\16\3\16\3\16\3\17"+
+		"\3\17\3\20\3\20\3\20\2\3\22\21\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+
+		"\2\3\3\2\r\16u\2 \3\2\2\2\4\64\3\2\2\2\6\66\3\2\2\2\b9\3\2\2\2\n@\3\2"+
+		"\2\2\fF\3\2\2\2\16H\3\2\2\2\20J\3\2\2\2\22L\3\2\2\2\24f\3\2\2\2\26h\3"+
+		"\2\2\2\30k\3\2\2\2\32o\3\2\2\2\34r\3\2\2\2\36t\3\2\2\2 !\5\4\3\2!\"\7"+
+		"\2\2\3\"\3\3\2\2\2#%\5\30\r\2$&\5\b\5\2%$\3\2\2\2%&\3\2\2\2&(\3\2\2\2"+
+		"\')\5\6\4\2(\'\3\2\2\2()\3\2\2\2)\65\3\2\2\2*+\5\30\r\2+,\5\26\f\2,.\5"+
+		"\24\13\2-/\5\b\5\2.-\3\2\2\2./\3\2\2\2/\61\3\2\2\2\60\62\5\6\4\2\61\60"+
+		"\3\2\2\2\61\62\3\2\2\2\62\65\3\2\2\2\63\65\5\24\13\2\64#\3\2\2\2\64*\3"+
+		"\2\2\2\64\63\3\2\2\2\65\5\3\2\2\2\66\67\7\7\2\2\678\5\22\n\28\7\3\2\2"+
+		"\29:\7\6\2\2:;\5\22\n\2;\t\3\2\2\2<A\5\16\b\2=>\5\16\b\2>?\5\f\7\2?A\3"+
+		"\2\2\2@<\3\2\2\2@=\3\2\2\2A\13\3\2\2\2BG\5\20\t\2CD\5\20\t\2DE\5\f\7\2"+
+		"EG\3\2\2\2FB\3\2\2\2FC\3\2\2\2G\r\3\2\2\2HI\7\17\2\2I\17\3\2\2\2JK\t\2"+
+		"\2\2K\21\3\2\2\2LM\b\n\1\2MN\5\n\6\2NT\3\2\2\2OP\f\3\2\2PQ\7\3\2\2QS\5"+
+		"\n\6\2RO\3\2\2\2SV\3\2\2\2TR\3\2\2\2TU\3\2\2\2U\23\3\2\2\2VT\3\2\2\2W"+
+		"X\7\t\2\2XZ\5\32\16\2Y[\7\f\2\2ZY\3\2\2\2Z[\3\2\2\2[\\\3\2\2\2\\]\7\13"+
+		"\2\2]_\5\32\16\2^`\7\f\2\2_^\3\2\2\2_`\3\2\2\2`g\3\2\2\2ab\7\t\2\2bd\5"+
+		"\32\16\2ce\7\f\2\2dc\3\2\2\2de\3\2\2\2eg\3\2\2\2fW\3\2\2\2fa\3\2\2\2g"+
+		"\25\3\2\2\2hi\7\n\2\2ij\5\32\16\2j\27\3\2\2\2km\5\32\16\2ln\7\5\2\2ml"+
+		"\3\2\2\2mn\3\2\2\2n\31\3\2\2\2op\5\34\17\2pq\5\36\20\2q\33\3\2\2\2rs\7"+
+		"\r\2\2s\35\3\2\2\2tu\7\20\2\2u\37\3\2\2\2\17%(.\61\64@FTZ_dfm";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DateSpecifierPredicate.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DateSpecifierPredicate.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DateSpecifierPredicate.java
new file mode 100644
index 0000000..5086719
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DateSpecifierPredicate.java
@@ -0,0 +1,82 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.metron.profiler.client.window.predicates;
+
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+/**
+ * An inclusion/exclusion specifier which matches against a specific date.
+ * The default format is yyyy/MM/dd
+ */
+public class DateSpecifierPredicate implements Predicate<Long> {
+  final static ThreadLocal<SimpleDateFormat> FORMAT = new ThreadLocal<SimpleDateFormat>() {
+
+    @Override
+    protected SimpleDateFormat initialValue() {
+      return new SimpleDateFormat("yyyy/MM/dd");
+    }
+  };
+  Date date;
+
+  /**
+   * Create a predicate given a date and (optionally) a format.  If no format is specified, it is assumed to be
+   * yyyy/MM/dd
+   * @param args
+   */
+  public DateSpecifierPredicate(List<String> args) {
+    if(args.size() == 1) {
+      //just the date, use the default.
+      try {
+        date = FORMAT.get().parse(args.get(0));
+      } catch (ParseException e) {
+        throw new IllegalStateException("Unable to process " + args.get(0) + " as a date using " + FORMAT.get().toPattern());
+      }
+    }
+    else if(args.size() == 0){
+      throw new IllegalStateException("You must specify at least a date and optionally a format");
+    }
+    else {
+      String dateStr = args.get(0);
+      String format =  args.get(1);
+      try {
+        date = new SimpleDateFormat(format).parse(dateStr);
+      } catch (ParseException e) {
+        throw new IllegalStateException("Unable to process " + dateStr + " as a date using " + format);
+      }
+    }
+  }
+
+  /**
+   * Returns true if the timestamp happens on the specified day and false otherwise.
+   * @param ts
+   * @return
+   */
+  @Override
+  public boolean test(Long ts) {
+    return DateUtils.isSameDay(new Date(ts), date);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DayPredicates.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DayPredicates.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DayPredicates.java
new file mode 100644
index 0000000..8025371
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/DayPredicates.java
@@ -0,0 +1,113 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.metron.profiler.client.window.predicates;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * The inclusion/exclusion selector predicates.  The enum name is intended to match the inclusion/exclusion selector
+ * name in the window selector grammar.
+ */
+public enum DayPredicates {
+  /**
+   * True if the day is sunday, false otherwise.
+   */
+  SUNDAY( x -> dayOfWeekPredicate(1)),
+  /**
+   * True if the day is monday, false otherwise.
+   */
+  MONDAY( x -> dayOfWeekPredicate(2)),
+  /**
+   * True if the day is tuesday, false otherwise.
+   */
+  TUESDAY( x -> dayOfWeekPredicate(3)),
+  /**
+   * True if the day is wednesday, false otherwise.
+   */
+  WEDNESDAY( x -> dayOfWeekPredicate(4)),
+  /**
+   * True if the day is thursday, false otherwise.
+   */
+  THURSDAY( x -> dayOfWeekPredicate(5)),
+  /**
+   * True if the day is friday, false otherwise.
+   */
+  FRIDAY( x -> dayOfWeekPredicate(6)),
+  /**
+   * True if the day is saturday, false otherwise.
+   */
+  SATURDAY( x -> dayOfWeekPredicate(7)),
+  /**
+   * True if the day is a weekday, false otherwise.
+   */
+  WEEKDAY( x -> (ts -> {
+    int dow = toCalendar(ts).get(Calendar.DAY_OF_WEEK);
+    return dow > 1 && dow < 7;
+  })),
+  /**
+   * True if the day is a weekend, false otherwise.
+   */
+  WEEKEND( x -> (ts -> {
+    int dow = toCalendar(ts).get(Calendar.DAY_OF_WEEK);
+    return dow == 1 || dow == 7;
+  })),
+  /**
+   * True if the day is a holiday, false otherwise.
+   */
+  HOLIDAY(x -> new HolidaysPredicate(x)),
+  /**
+   * True if the day is a specifie ddate, false otherwise.
+   */
+  DATE( x -> new DateSpecifierPredicate(x))
+  ;
+  Function<List<String>, Predicate<Long>> predicateCreator;
+  DayPredicates(Function<List<String>, Predicate<Long>> predicate) {
+    this.predicateCreator = predicate;
+  }
+
+  private static Calendar toCalendar(Long ts) {
+    Calendar c = Calendar.getInstance();
+    c.setTime(new Date(ts));
+    return c;
+  }
+
+  public static int getDayOfWeek(Long ts) {
+    return toCalendar(ts).get(Calendar.DAY_OF_WEEK);
+  }
+
+  public static Predicate<Long> dayOfWeekPredicate(int dayOfWeek) {
+    return ts -> getDayOfWeek(ts) == dayOfWeek;
+  }
+
+  /**
+   * Create a Predicate given a set of arguments.
+   * @param name
+   * @param arg
+   * @return
+   */
+  public static Predicate<Long> create(String name, List<String> arg) {
+    return DayPredicates.valueOf(name).predicateCreator.apply(arg);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/84d34719/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/HolidaysPredicate.java
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/HolidaysPredicate.java b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/HolidaysPredicate.java
new file mode 100644
index 0000000..4705d42
--- /dev/null
+++ b/metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/window/predicates/HolidaysPredicate.java
@@ -0,0 +1,87 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.metron.profiler.client.window.predicates;
+
+import de.jollyday.HolidayCalendar;
+import de.jollyday.HolidayManager;
+import de.jollyday.ManagerParameters;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+
+/**
+ * A inclusion/exclusion selector predicate that returns true if a timestamp falls on a holiday and
+ * false otherwise.
+ */
+public class HolidaysPredicate implements Predicate<Long> {
+  HolidayManager manager;
+  String[] args;
+
+  /**
+   * Create a holidays predicate.  The arguments are the hierarchical specifier for the holidays
+   * (see https://github.com/svendiedrichsen/jollyday/tree/master/src/main/resources/holidays for the hierarchies for your
+   * supported locales).  The first param is the locale.
+   * @param args
+   */
+  public HolidaysPredicate(List<String> args) {
+    if(args == null || args.size() == 0) {
+      this.manager = HolidayManager.getInstance();
+      this.args = new String[]{};
+    }
+    else {
+      String code = args.get(0);
+      this.args = args.size() == 1 ? new String[]{} : new String[args.size() - 1];
+      Optional<HolidayCalendar> calendar = getCalendar(code);
+      if(calendar.isPresent()) {
+        this.manager = HolidayManager.getInstance(ManagerParameters.create(calendar.get()));
+      }
+      else {
+        this.manager = HolidayManager.getInstance(ManagerParameters.create(code));
+      }
+      for (int i = 1; i < args.size(); ++i) {
+        this.args[i - 1] = args.get(i);
+      }
+    }
+  }
+
+  private static Optional<HolidayCalendar> getCalendar(String code) {
+    for(HolidayCalendar cal : HolidayCalendar.values()) {
+      if(cal.getId().equalsIgnoreCase(code) || cal.name().equalsIgnoreCase(code)) {
+        return Optional.of(cal);
+      }
+    }
+    return Optional.empty();
+  }
+
+  /**
+   * True if the timestamp falls on a holiday as specified or false otherwise.
+   * @param ts
+   * @return
+   */
+  @Override
+  public boolean test(Long ts) {
+    Calendar c = Calendar.getInstance();
+    c.setTime(new Date(ts));
+    return manager.isHoliday(c, args);
+  }
+}