chore: added grammer parity for frontend grammer with main grammer

This commit is contained in:
ahrefabhi 2025-06-27 11:46:10 +05:30
parent c783c5c7ee
commit bb8f6b9eb1
16 changed files with 1278 additions and 1380 deletions

View File

@ -32,7 +32,7 @@ import { getQueryContextAtCursor } from 'utils/queryContextUtils';
2. Context-aware autocompletion 2. Context-aware autocompletion
3. Support for various query operators (=, !=, IN, LIKE, etc.) 3. Support for various query operators (=, !=, IN, LIKE, etc.)
4. Support for complex conditions with AND/OR operators 4. Support for complex conditions with AND/OR operators
5. Support for functions (HAS, HASANY, HASALL, HASNONE) 5. Support for functions (HAS, HASANY, HASALL)
6. Support for parentheses and nested conditions 6. Support for parentheses and nested conditions
7. Query examples for common use cases 7. Query examples for common use cases

File diff suppressed because one or more lines are too long

View File

@ -11,31 +11,24 @@ LE=10
GT=11 GT=11
GE=12 GE=12
LIKE=13 LIKE=13
NOT_LIKE=14 ILIKE=14
ILIKE=15 BETWEEN=15
NOT_ILIKE=16 EXISTS=16
BETWEEN=17 REGEXP=17
NOT_BETWEEN=18 CONTAINS=18
EXISTS=19 IN=19
NOT_EXISTS=20 NOT=20
REGEXP=21 AND=21
NOT_REGEXP=22 OR=22
CONTAINS=23 HAS=23
NOT_CONTAINS=24 HASANY=24
IN=25 HASALL=25
NOT_IN=26 BOOL=26
NOT=27 NUMBER=27
AND=28 QUOTED_TEXT=28
OR=29 KEY=29
HAS=30 WS=30
HASANY=31 FREETEXT=31
HASALL=32
HASNONE=33
BOOL=34
NUMBER=35
QUOTED_TEXT=36
KEY=37
WS=38
'('=1 '('=1
')'=2 ')'=2
'['=3 '['=3

File diff suppressed because one or more lines are too long

View File

@ -11,31 +11,24 @@ LE=10
GT=11 GT=11
GE=12 GE=12
LIKE=13 LIKE=13
NOT_LIKE=14 ILIKE=14
ILIKE=15 BETWEEN=15
NOT_ILIKE=16 EXISTS=16
BETWEEN=17 REGEXP=17
NOT_BETWEEN=18 CONTAINS=18
EXISTS=19 IN=19
NOT_EXISTS=20 NOT=20
REGEXP=21 AND=21
NOT_REGEXP=22 OR=22
CONTAINS=23 HAS=23
NOT_CONTAINS=24 HASANY=24
IN=25 HASALL=25
NOT_IN=26 BOOL=26
NOT=27 NUMBER=27
AND=28 QUOTED_TEXT=28
OR=29 KEY=29
HAS=30 WS=30
HASANY=31 FREETEXT=31
HASALL=32
HASNONE=33
BOOL=34
NUMBER=35
QUOTED_TEXT=36
KEY=37
WS=38
'('=1 '('=1
')'=2 ')'=2
'['=3 '['=3

View File

@ -25,31 +25,24 @@ export default class FilterQueryLexer extends Lexer {
public static readonly GT = 11; public static readonly GT = 11;
public static readonly GE = 12; public static readonly GE = 12;
public static readonly LIKE = 13; public static readonly LIKE = 13;
public static readonly NOT_LIKE = 14; public static readonly ILIKE = 14;
public static readonly ILIKE = 15; public static readonly BETWEEN = 15;
public static readonly NOT_ILIKE = 16; public static readonly EXISTS = 16;
public static readonly BETWEEN = 17; public static readonly REGEXP = 17;
public static readonly NOT_BETWEEN = 18; public static readonly CONTAINS = 18;
public static readonly EXISTS = 19; public static readonly IN = 19;
public static readonly NOT_EXISTS = 20; public static readonly NOT = 20;
public static readonly REGEXP = 21; public static readonly AND = 21;
public static readonly NOT_REGEXP = 22; public static readonly OR = 22;
public static readonly CONTAINS = 23; public static readonly HAS = 23;
public static readonly NOT_CONTAINS = 24; public static readonly HASANY = 24;
public static readonly IN = 25; public static readonly HASALL = 25;
public static readonly NOT_IN = 26; public static readonly BOOL = 26;
public static readonly NOT = 27; public static readonly NUMBER = 27;
public static readonly AND = 28; public static readonly QUOTED_TEXT = 28;
public static readonly OR = 29; public static readonly KEY = 29;
public static readonly HAS = 30; public static readonly WS = 30;
public static readonly HASANY = 31; public static readonly FREETEXT = 31;
public static readonly HASALL = 32;
public static readonly HASNONE = 33;
public static readonly BOOL = 34;
public static readonly NUMBER = 35;
public static readonly QUOTED_TEXT = 36;
public static readonly KEY = 37;
public static readonly WS = 38;
public static readonly EOF = Token.EOF; public static readonly EOF = Token.EOF;
public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ];
@ -67,31 +60,24 @@ export default class FilterQueryLexer extends Lexer {
"NEQ", "LT", "NEQ", "LT",
"LE", "GT", "LE", "GT",
"GE", "LIKE", "GE", "LIKE",
"NOT_LIKE", "ILIKE", "BETWEEN",
"ILIKE", "NOT_ILIKE", "EXISTS", "REGEXP",
"BETWEEN",
"NOT_BETWEEN",
"EXISTS", "NOT_EXISTS",
"REGEXP", "NOT_REGEXP",
"CONTAINS", "CONTAINS",
"NOT_CONTAINS", "IN", "NOT",
"IN", "NOT_IN", "AND", "OR",
"NOT", "AND", "HAS", "HASANY",
"OR", "HAS", "HASALL", "BOOL",
"HASANY", "HASALL", "NUMBER", "QUOTED_TEXT",
"HASNONE", "KEY", "WS",
"BOOL", "NUMBER", "FREETEXT" ];
"QUOTED_TEXT",
"KEY", "WS" ];
public static readonly modeNames: string[] = [ "DEFAULT_MODE", ]; public static readonly modeNames: string[] = [ "DEFAULT_MODE", ];
public static readonly ruleNames: string[] = [ public static readonly ruleNames: string[] = [
"LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS",
"NEQ", "LT", "LE", "GT", "GE", "LIKE", "NOT_LIKE", "ILIKE", "NOT_ILIKE", "NEQ", "LT", "LE", "GT", "GE", "LIKE", "ILIKE", "BETWEEN", "EXISTS", "REGEXP",
"BETWEEN", "NOT_BETWEEN", "EXISTS", "NOT_EXISTS", "REGEXP", "NOT_REGEXP", "CONTAINS", "IN", "NOT", "AND", "OR", "HAS", "HASANY", "HASALL", "BOOL",
"CONTAINS", "NOT_CONTAINS", "IN", "NOT_IN", "NOT", "AND", "OR", "HAS", "SIGN", "NUMBER", "QUOTED_TEXT", "SEGMENT", "EMPTY_BRACKS", "OLD_JSON_BRACKS",
"HASANY", "HASALL", "HASNONE", "BOOL", "NUMBER", "QUOTED_TEXT", "KEY", "KEY", "WS", "DIGIT", "FREETEXT",
"WS", "DIGIT",
]; ];
@ -112,117 +98,113 @@ export default class FilterQueryLexer extends Lexer {
public get modeNames(): string[] { return FilterQueryLexer.modeNames; } public get modeNames(): string[] { return FilterQueryLexer.modeNames; }
public static readonly _serializedATN: number[] = [4,0,38,331,6,-1,2,0, public static readonly _serializedATN: number[] = [4,0,31,303,6,-1,2,0,
7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9, 7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,
7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7, 7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,
16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23, 16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,
2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2, 2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,
31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38, 31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,1,0,1,0,1,1,1,1,1,2,1,2,
7,38,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,5,3,5,93,8,5,1,6, 1,3,1,3,1,4,1,4,1,5,1,5,1,5,3,5,87,8,5,1,6,1,6,1,6,1,7,1,7,1,7,1,8,1,8,
1,6,1,6,1,7,1,7,1,7,1,8,1,8,1,9,1,9,1,9,1,10,1,10,1,11,1,11,1,11,1,12,1, 1,9,1,9,1,9,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1,13,
12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14, 1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,
1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1, 15,1,15,1,15,1,15,3,15,130,8,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,
16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17, 1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,147,8,17,1,18,1,18,1,18,1,19,1,
1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,3,18,167,8,18,1, 19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,23,
19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,179,8,19,1,20,1,20, 1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,
1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1, 25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,190,8,25,1,26,1,26,1,27,3,27,
21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,207,8,22,1,23,1,23, 195,8,27,1,27,4,27,198,8,27,11,27,12,27,199,1,27,1,27,5,27,204,8,27,10,
1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,221,8,23,1,24,1, 27,12,27,207,9,27,3,27,209,8,27,1,27,1,27,3,27,213,8,27,1,27,4,27,216,8,
24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27, 27,11,27,12,27,217,3,27,220,8,27,1,27,3,27,223,8,27,1,27,1,27,4,27,227,
1,27,1,27,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1, 8,27,11,27,12,27,228,1,27,1,27,3,27,233,8,27,1,27,4,27,236,8,27,11,27,12,
30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32, 27,237,3,27,240,8,27,3,27,242,8,27,1,28,1,28,1,28,1,28,5,28,248,8,28,10,
1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,279,8,33,1, 28,12,28,251,9,28,1,28,1,28,1,28,1,28,1,28,5,28,258,8,28,10,28,12,28,261,
34,4,34,282,8,34,11,34,12,34,283,1,34,1,34,4,34,288,8,34,11,34,12,34,289, 9,28,1,28,3,28,264,8,28,1,29,1,29,5,29,268,8,29,10,29,12,29,271,9,29,1,
3,34,292,8,34,1,35,1,35,1,35,1,35,5,35,298,8,35,10,35,12,35,301,9,35,1, 30,1,30,1,30,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,5,32,285,8,32,
35,1,35,1,35,1,35,1,35,5,35,308,8,35,10,35,12,35,311,9,35,1,35,3,35,314, 10,32,12,32,288,9,32,1,33,4,33,291,8,33,11,33,12,33,292,1,33,1,33,1,34,
8,35,1,36,1,36,5,36,318,8,36,10,36,12,36,321,9,36,1,37,4,37,324,8,37,11, 1,34,1,35,4,35,300,8,35,11,35,12,35,301,0,0,36,1,1,3,2,5,3,7,4,9,5,11,6,
37,12,37,325,1,37,1,37,1,38,1,38,0,0,39,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15, 13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,
8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20, 19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,0,55,27,57,28,59,0,61,0,
41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, 63,0,65,29,67,30,69,0,71,31,1,0,29,2,0,76,76,108,108,2,0,73,73,105,105,
65,33,67,34,69,35,71,36,73,37,75,38,77,0,1,0,27,2,0,76,76,108,108,2,0,73, 2,0,75,75,107,107,2,0,69,69,101,101,2,0,66,66,98,98,2,0,84,84,116,116,2,
73,105,105,2,0,75,75,107,107,2,0,69,69,101,101,2,0,78,78,110,110,2,0,79, 0,87,87,119,119,2,0,78,78,110,110,2,0,88,88,120,120,2,0,83,83,115,115,2,
79,111,111,2,0,84,84,116,116,2,0,66,66,98,98,2,0,87,87,119,119,2,0,88,88, 0,82,82,114,114,2,0,71,71,103,103,2,0,80,80,112,112,2,0,67,67,99,99,2,0,
120,120,2,0,83,83,115,115,2,0,82,82,114,114,2,0,71,71,103,103,2,0,80,80, 79,79,111,111,2,0,65,65,97,97,2,0,68,68,100,100,2,0,72,72,104,104,2,0,89,
112,112,2,0,67,67,99,99,2,0,65,65,97,97,2,0,68,68,100,100,2,0,72,72,104, 89,121,121,2,0,85,85,117,117,2,0,70,70,102,102,2,0,43,43,45,45,2,0,34,34,
104,2,0,89,89,121,121,2,0,85,85,117,117,2,0,70,70,102,102,2,0,34,34,92, 92,92,2,0,39,39,92,92,3,0,36,36,65,90,97,122,6,0,36,36,45,45,48,58,65,90,
92,2,0,39,39,92,92,4,0,48,57,65,90,95,95,97,122,6,0,46,46,48,57,65,91,93, 95,95,97,122,3,0,9,10,13,13,32,32,1,0,48,57,8,0,9,10,13,13,32,34,39,41,
93,95,95,97,122,3,0,9,10,13,13,32,32,1,0,48,57,345,0,1,1,0,0,0,0,3,1,0, 44,44,60,62,91,91,93,93,325,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,
0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15, 0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,
1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0, 1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,
0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37, 0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,
1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0, 1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,
0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59, 0,0,55,1,0,0,0,0,57,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,71,1,0,0,0,1,73,
1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0, 1,0,0,0,3,75,1,0,0,0,5,77,1,0,0,0,7,79,1,0,0,0,9,81,1,0,0,0,11,86,1,0,0,
0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,1,79,1,0,0,0,3,81,1,0,0,0,5,83, 0,13,88,1,0,0,0,15,91,1,0,0,0,17,94,1,0,0,0,19,96,1,0,0,0,21,99,1,0,0,0,
1,0,0,0,7,85,1,0,0,0,9,87,1,0,0,0,11,92,1,0,0,0,13,94,1,0,0,0,15,97,1,0, 23,101,1,0,0,0,25,104,1,0,0,0,27,109,1,0,0,0,29,115,1,0,0,0,31,123,1,0,
0,0,17,100,1,0,0,0,19,102,1,0,0,0,21,105,1,0,0,0,23,107,1,0,0,0,25,110, 0,0,33,131,1,0,0,0,35,138,1,0,0,0,37,148,1,0,0,0,39,151,1,0,0,0,41,155,
1,0,0,0,27,115,1,0,0,0,29,124,1,0,0,0,31,130,1,0,0,0,33,140,1,0,0,0,35, 1,0,0,0,43,159,1,0,0,0,45,162,1,0,0,0,47,166,1,0,0,0,49,173,1,0,0,0,51,
148,1,0,0,0,37,160,1,0,0,0,39,168,1,0,0,0,41,180,1,0,0,0,43,187,1,0,0,0, 189,1,0,0,0,53,191,1,0,0,0,55,241,1,0,0,0,57,263,1,0,0,0,59,265,1,0,0,0,
45,198,1,0,0,0,47,208,1,0,0,0,49,222,1,0,0,0,51,225,1,0,0,0,53,232,1,0, 61,272,1,0,0,0,63,275,1,0,0,0,65,279,1,0,0,0,67,290,1,0,0,0,69,296,1,0,
0,0,55,236,1,0,0,0,57,240,1,0,0,0,59,243,1,0,0,0,61,247,1,0,0,0,63,254, 0,0,71,299,1,0,0,0,73,74,5,40,0,0,74,2,1,0,0,0,75,76,5,41,0,0,76,4,1,0,
1,0,0,0,65,261,1,0,0,0,67,278,1,0,0,0,69,281,1,0,0,0,71,313,1,0,0,0,73, 0,0,77,78,5,91,0,0,78,6,1,0,0,0,79,80,5,93,0,0,80,8,1,0,0,0,81,82,5,44,
315,1,0,0,0,75,323,1,0,0,0,77,329,1,0,0,0,79,80,5,40,0,0,80,2,1,0,0,0,81, 0,0,82,10,1,0,0,0,83,87,5,61,0,0,84,85,5,61,0,0,85,87,5,61,0,0,86,83,1,
82,5,41,0,0,82,4,1,0,0,0,83,84,5,91,0,0,84,6,1,0,0,0,85,86,5,93,0,0,86, 0,0,0,86,84,1,0,0,0,87,12,1,0,0,0,88,89,5,33,0,0,89,90,5,61,0,0,90,14,1,
8,1,0,0,0,87,88,5,44,0,0,88,10,1,0,0,0,89,93,5,61,0,0,90,91,5,61,0,0,91, 0,0,0,91,92,5,60,0,0,92,93,5,62,0,0,93,16,1,0,0,0,94,95,5,60,0,0,95,18,
93,5,61,0,0,92,89,1,0,0,0,92,90,1,0,0,0,93,12,1,0,0,0,94,95,5,33,0,0,95, 1,0,0,0,96,97,5,60,0,0,97,98,5,61,0,0,98,20,1,0,0,0,99,100,5,62,0,0,100,
96,5,61,0,0,96,14,1,0,0,0,97,98,5,60,0,0,98,99,5,62,0,0,99,16,1,0,0,0,100, 22,1,0,0,0,101,102,5,62,0,0,102,103,5,61,0,0,103,24,1,0,0,0,104,105,7,0,
101,5,60,0,0,101,18,1,0,0,0,102,103,5,60,0,0,103,104,5,61,0,0,104,20,1, 0,0,105,106,7,1,0,0,106,107,7,2,0,0,107,108,7,3,0,0,108,26,1,0,0,0,109,
0,0,0,105,106,5,62,0,0,106,22,1,0,0,0,107,108,5,62,0,0,108,109,5,61,0,0, 110,7,1,0,0,110,111,7,0,0,0,111,112,7,1,0,0,112,113,7,2,0,0,113,114,7,3,
109,24,1,0,0,0,110,111,7,0,0,0,111,112,7,1,0,0,112,113,7,2,0,0,113,114, 0,0,114,28,1,0,0,0,115,116,7,4,0,0,116,117,7,3,0,0,117,118,7,5,0,0,118,
7,3,0,0,114,26,1,0,0,0,115,116,7,4,0,0,116,117,7,5,0,0,117,118,7,6,0,0, 119,7,6,0,0,119,120,7,3,0,0,120,121,7,3,0,0,121,122,7,7,0,0,122,30,1,0,
118,119,5,95,0,0,119,120,7,0,0,0,120,121,7,1,0,0,121,122,7,2,0,0,122,123, 0,0,123,124,7,3,0,0,124,125,7,8,0,0,125,126,7,1,0,0,126,127,7,9,0,0,127,
7,3,0,0,123,28,1,0,0,0,124,125,7,1,0,0,125,126,7,0,0,0,126,127,7,1,0,0, 129,7,5,0,0,128,130,7,9,0,0,129,128,1,0,0,0,129,130,1,0,0,0,130,32,1,0,
127,128,7,2,0,0,128,129,7,3,0,0,129,30,1,0,0,0,130,131,7,4,0,0,131,132, 0,0,131,132,7,10,0,0,132,133,7,3,0,0,133,134,7,11,0,0,134,135,7,3,0,0,135,
7,5,0,0,132,133,7,6,0,0,133,134,5,95,0,0,134,135,7,1,0,0,135,136,7,0,0, 136,7,8,0,0,136,137,7,12,0,0,137,34,1,0,0,0,138,139,7,13,0,0,139,140,7,
0,136,137,7,1,0,0,137,138,7,2,0,0,138,139,7,3,0,0,139,32,1,0,0,0,140,141, 14,0,0,140,141,7,7,0,0,141,142,7,5,0,0,142,143,7,15,0,0,143,144,7,1,0,0,
7,7,0,0,141,142,7,3,0,0,142,143,7,6,0,0,143,144,7,8,0,0,144,145,7,3,0,0, 144,146,7,7,0,0,145,147,7,9,0,0,146,145,1,0,0,0,146,147,1,0,0,0,147,36,
145,146,7,3,0,0,146,147,7,4,0,0,147,34,1,0,0,0,148,149,7,4,0,0,149,150, 1,0,0,0,148,149,7,1,0,0,149,150,7,7,0,0,150,38,1,0,0,0,151,152,7,7,0,0,
7,5,0,0,150,151,7,6,0,0,151,152,5,95,0,0,152,153,7,7,0,0,153,154,7,3,0, 152,153,7,14,0,0,153,154,7,5,0,0,154,40,1,0,0,0,155,156,7,15,0,0,156,157,
0,154,155,7,6,0,0,155,156,7,8,0,0,156,157,7,3,0,0,157,158,7,3,0,0,158,159, 7,7,0,0,157,158,7,16,0,0,158,42,1,0,0,0,159,160,7,14,0,0,160,161,7,10,0,
7,4,0,0,159,36,1,0,0,0,160,161,7,3,0,0,161,162,7,9,0,0,162,163,7,1,0,0, 0,161,44,1,0,0,0,162,163,7,17,0,0,163,164,7,15,0,0,164,165,7,9,0,0,165,
163,164,7,10,0,0,164,166,7,6,0,0,165,167,7,10,0,0,166,165,1,0,0,0,166,167, 46,1,0,0,0,166,167,7,17,0,0,167,168,7,15,0,0,168,169,7,9,0,0,169,170,7,
1,0,0,0,167,38,1,0,0,0,168,169,7,4,0,0,169,170,7,5,0,0,170,171,7,6,0,0, 15,0,0,170,171,7,7,0,0,171,172,7,18,0,0,172,48,1,0,0,0,173,174,7,17,0,0,
171,172,5,45,0,0,172,173,7,3,0,0,173,174,7,9,0,0,174,175,7,1,0,0,175,176, 174,175,7,15,0,0,175,176,7,9,0,0,176,177,7,15,0,0,177,178,7,0,0,0,178,179,
7,10,0,0,176,178,7,6,0,0,177,179,7,10,0,0,178,177,1,0,0,0,178,179,1,0,0, 7,0,0,0,179,50,1,0,0,0,180,181,7,5,0,0,181,182,7,10,0,0,182,183,7,19,0,
0,179,40,1,0,0,0,180,181,7,11,0,0,181,182,7,3,0,0,182,183,7,12,0,0,183, 0,183,190,7,3,0,0,184,185,7,20,0,0,185,186,7,15,0,0,186,187,7,0,0,0,187,
184,7,3,0,0,184,185,7,9,0,0,185,186,7,13,0,0,186,42,1,0,0,0,187,188,7,4, 188,7,9,0,0,188,190,7,3,0,0,189,180,1,0,0,0,189,184,1,0,0,0,190,52,1,0,
0,0,188,189,7,5,0,0,189,190,7,6,0,0,190,191,5,95,0,0,191,192,7,11,0,0,192, 0,0,191,192,7,21,0,0,192,54,1,0,0,0,193,195,3,53,26,0,194,193,1,0,0,0,194,
193,7,3,0,0,193,194,7,12,0,0,194,195,7,3,0,0,195,196,7,9,0,0,196,197,7, 195,1,0,0,0,195,197,1,0,0,0,196,198,3,69,34,0,197,196,1,0,0,0,198,199,1,
13,0,0,197,44,1,0,0,0,198,199,7,14,0,0,199,200,7,5,0,0,200,201,7,4,0,0, 0,0,0,199,197,1,0,0,0,199,200,1,0,0,0,200,208,1,0,0,0,201,205,5,46,0,0,
201,202,7,6,0,0,202,203,7,15,0,0,203,204,7,1,0,0,204,206,7,4,0,0,205,207, 202,204,3,69,34,0,203,202,1,0,0,0,204,207,1,0,0,0,205,203,1,0,0,0,205,206,
7,10,0,0,206,205,1,0,0,0,206,207,1,0,0,0,207,46,1,0,0,0,208,209,7,4,0,0, 1,0,0,0,206,209,1,0,0,0,207,205,1,0,0,0,208,201,1,0,0,0,208,209,1,0,0,0,
209,210,7,5,0,0,210,211,7,6,0,0,211,212,5,95,0,0,212,213,7,14,0,0,213,214, 209,219,1,0,0,0,210,212,7,3,0,0,211,213,3,53,26,0,212,211,1,0,0,0,212,213,
7,5,0,0,214,215,7,4,0,0,215,216,7,6,0,0,216,217,7,15,0,0,217,218,7,1,0, 1,0,0,0,213,215,1,0,0,0,214,216,3,69,34,0,215,214,1,0,0,0,216,217,1,0,0,
0,218,220,7,4,0,0,219,221,7,10,0,0,220,219,1,0,0,0,220,221,1,0,0,0,221, 0,217,215,1,0,0,0,217,218,1,0,0,0,218,220,1,0,0,0,219,210,1,0,0,0,219,220,
48,1,0,0,0,222,223,7,1,0,0,223,224,7,4,0,0,224,50,1,0,0,0,225,226,7,4,0, 1,0,0,0,220,242,1,0,0,0,221,223,3,53,26,0,222,221,1,0,0,0,222,223,1,0,0,
0,226,227,7,5,0,0,227,228,7,6,0,0,228,229,5,95,0,0,229,230,7,1,0,0,230, 0,223,224,1,0,0,0,224,226,5,46,0,0,225,227,3,69,34,0,226,225,1,0,0,0,227,
231,7,4,0,0,231,52,1,0,0,0,232,233,7,4,0,0,233,234,7,5,0,0,234,235,7,6, 228,1,0,0,0,228,226,1,0,0,0,228,229,1,0,0,0,229,239,1,0,0,0,230,232,7,3,
0,0,235,54,1,0,0,0,236,237,7,15,0,0,237,238,7,4,0,0,238,239,7,16,0,0,239, 0,0,231,233,3,53,26,0,232,231,1,0,0,0,232,233,1,0,0,0,233,235,1,0,0,0,234,
56,1,0,0,0,240,241,7,5,0,0,241,242,7,11,0,0,242,58,1,0,0,0,243,244,7,17, 236,3,69,34,0,235,234,1,0,0,0,236,237,1,0,0,0,237,235,1,0,0,0,237,238,1,
0,0,244,245,7,15,0,0,245,246,7,10,0,0,246,60,1,0,0,0,247,248,7,17,0,0,248, 0,0,0,238,240,1,0,0,0,239,230,1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,
249,7,15,0,0,249,250,7,10,0,0,250,251,7,15,0,0,251,252,7,4,0,0,252,253, 194,1,0,0,0,241,222,1,0,0,0,242,56,1,0,0,0,243,249,5,34,0,0,244,248,8,22,
7,18,0,0,253,62,1,0,0,0,254,255,7,17,0,0,255,256,7,15,0,0,256,257,7,10, 0,0,245,246,5,92,0,0,246,248,9,0,0,0,247,244,1,0,0,0,247,245,1,0,0,0,248,
0,0,257,258,7,15,0,0,258,259,7,0,0,0,259,260,7,0,0,0,260,64,1,0,0,0,261, 251,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0,0,250,252,1,0,0,0,251,249,1,0,
262,7,17,0,0,262,263,7,15,0,0,263,264,7,10,0,0,264,265,7,4,0,0,265,266, 0,0,252,264,5,34,0,0,253,259,5,39,0,0,254,258,8,23,0,0,255,256,5,92,0,0,
7,5,0,0,266,267,7,4,0,0,267,268,7,3,0,0,268,66,1,0,0,0,269,270,7,6,0,0, 256,258,9,0,0,0,257,254,1,0,0,0,257,255,1,0,0,0,258,261,1,0,0,0,259,257,
270,271,7,11,0,0,271,272,7,19,0,0,272,279,7,3,0,0,273,274,7,20,0,0,274, 1,0,0,0,259,260,1,0,0,0,260,262,1,0,0,0,261,259,1,0,0,0,262,264,5,39,0,
275,7,15,0,0,275,276,7,0,0,0,276,277,7,10,0,0,277,279,7,3,0,0,278,269,1, 0,263,243,1,0,0,0,263,253,1,0,0,0,264,58,1,0,0,0,265,269,7,24,0,0,266,268,
0,0,0,278,273,1,0,0,0,279,68,1,0,0,0,280,282,3,77,38,0,281,280,1,0,0,0, 7,25,0,0,267,266,1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,269,270,1,0,0,
282,283,1,0,0,0,283,281,1,0,0,0,283,284,1,0,0,0,284,291,1,0,0,0,285,287, 0,270,60,1,0,0,0,271,269,1,0,0,0,272,273,5,91,0,0,273,274,5,93,0,0,274,
5,46,0,0,286,288,3,77,38,0,287,286,1,0,0,0,288,289,1,0,0,0,289,287,1,0, 62,1,0,0,0,275,276,5,91,0,0,276,277,5,42,0,0,277,278,5,93,0,0,278,64,1,
0,0,289,290,1,0,0,0,290,292,1,0,0,0,291,285,1,0,0,0,291,292,1,0,0,0,292, 0,0,0,279,286,3,59,29,0,280,281,5,46,0,0,281,285,3,59,29,0,282,285,3,61,
70,1,0,0,0,293,299,5,34,0,0,294,298,8,21,0,0,295,296,5,92,0,0,296,298,9, 30,0,283,285,3,63,31,0,284,280,1,0,0,0,284,282,1,0,0,0,284,283,1,0,0,0,
0,0,0,297,294,1,0,0,0,297,295,1,0,0,0,298,301,1,0,0,0,299,297,1,0,0,0,299, 285,288,1,0,0,0,286,284,1,0,0,0,286,287,1,0,0,0,287,66,1,0,0,0,288,286,
300,1,0,0,0,300,302,1,0,0,0,301,299,1,0,0,0,302,314,5,34,0,0,303,309,5, 1,0,0,0,289,291,7,26,0,0,290,289,1,0,0,0,291,292,1,0,0,0,292,290,1,0,0,
39,0,0,304,308,8,22,0,0,305,306,5,92,0,0,306,308,9,0,0,0,307,304,1,0,0, 0,292,293,1,0,0,0,293,294,1,0,0,0,294,295,6,33,0,0,295,68,1,0,0,0,296,297,
0,307,305,1,0,0,0,308,311,1,0,0,0,309,307,1,0,0,0,309,310,1,0,0,0,310,312, 7,27,0,0,297,70,1,0,0,0,298,300,8,28,0,0,299,298,1,0,0,0,300,301,1,0,0,
1,0,0,0,311,309,1,0,0,0,312,314,5,39,0,0,313,293,1,0,0,0,313,303,1,0,0, 0,301,299,1,0,0,0,301,302,1,0,0,0,302,72,1,0,0,0,28,0,86,129,146,189,194,
0,314,72,1,0,0,0,315,319,7,23,0,0,316,318,7,24,0,0,317,316,1,0,0,0,318, 199,205,208,212,217,219,222,228,232,237,239,241,247,249,257,259,263,269,
321,1,0,0,0,319,317,1,0,0,0,319,320,1,0,0,0,320,74,1,0,0,0,321,319,1,0, 284,286,292,301,1,6,0,0];
0,0,322,324,7,25,0,0,323,322,1,0,0,0,324,325,1,0,0,0,325,323,1,0,0,0,325,
326,1,0,0,0,326,327,1,0,0,0,327,328,6,37,0,0,328,76,1,0,0,0,329,330,7,26,
0,0,330,78,1,0,0,0,17,0,92,166,178,206,220,278,283,289,291,297,299,307,
309,313,319,325,1,6,0,0];
private static __ATN: ATN; private static __ATN: ATN;
public static get _ATN(): ATN { public static get _ATN(): ATN {

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -11,31 +11,24 @@ LE=10
GT=11 GT=11
GE=12 GE=12
LIKE=13 LIKE=13
NOT_LIKE=14 ILIKE=14
ILIKE=15 BETWEEN=15
NOT_ILIKE=16 EXISTS=16
BETWEEN=17 REGEXP=17
NOT_BETWEEN=18 CONTAINS=18
EXISTS=19 IN=19
NOT_EXISTS=20 NOT=20
REGEXP=21 AND=21
NOT_REGEXP=22 OR=22
CONTAINS=23 HAS=23
NOT_CONTAINS=24 HASANY=24
IN=25 HASALL=25
NOT_IN=26 BOOL=26
NOT=27 NUMBER=27
AND=28 QUOTED_TEXT=28
OR=29 KEY=29
HAS=30 WS=30
HASANY=31 FREETEXT=31
HASALL=32
HASNONE=33
BOOL=34
NUMBER=35
QUOTED_TEXT=36
KEY=37
WS=38
'('=1 '('=1
')'=2 ')'=2
'['=3 '['=3

File diff suppressed because one or more lines are too long

View File

@ -17,11 +17,9 @@ public class FilterQueryLexer extends Lexer {
new PredictionContextCache(); new PredictionContextCache();
public static final int public static final int
LPAREN=1, RPAREN=2, LBRACK=3, RBRACK=4, COMMA=5, EQUALS=6, NOT_EQUALS=7, LPAREN=1, RPAREN=2, LBRACK=3, RBRACK=4, COMMA=5, EQUALS=6, NOT_EQUALS=7,
NEQ=8, LT=9, LE=10, GT=11, GE=12, LIKE=13, NOT_LIKE=14, ILIKE=15, NOT_ILIKE=16, NEQ=8, LT=9, LE=10, GT=11, GE=12, LIKE=13, ILIKE=14, BETWEEN=15, EXISTS=16,
BETWEEN=17, NOT_BETWEEN=18, EXISTS=19, NOT_EXISTS=20, REGEXP=21, NOT_REGEXP=22, REGEXP=17, CONTAINS=18, IN=19, NOT=20, AND=21, OR=22, HAS=23, HASANY=24,
CONTAINS=23, NOT_CONTAINS=24, IN=25, NOT_IN=26, NOT=27, AND=28, OR=29, HASALL=25, BOOL=26, NUMBER=27, QUOTED_TEXT=28, KEY=29, WS=30, FREETEXT=31;
HAS=30, HASANY=31, HASALL=32, HASNONE=33, BOOL=34, NUMBER=35, QUOTED_TEXT=36,
KEY=37, WS=38;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@ -33,11 +31,10 @@ public class FilterQueryLexer extends Lexer {
private static String[] makeRuleNames() { private static String[] makeRuleNames() {
return new String[] { return new String[] {
"LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS",
"NEQ", "LT", "LE", "GT", "GE", "LIKE", "NOT_LIKE", "ILIKE", "NOT_ILIKE", "NEQ", "LT", "LE", "GT", "GE", "LIKE", "ILIKE", "BETWEEN", "EXISTS",
"BETWEEN", "NOT_BETWEEN", "EXISTS", "NOT_EXISTS", "REGEXP", "NOT_REGEXP", "REGEXP", "CONTAINS", "IN", "NOT", "AND", "OR", "HAS", "HASANY", "HASALL",
"CONTAINS", "NOT_CONTAINS", "IN", "NOT_IN", "NOT", "AND", "OR", "HAS", "BOOL", "SIGN", "NUMBER", "QUOTED_TEXT", "SEGMENT", "EMPTY_BRACKS", "OLD_JSON_BRACKS",
"HASANY", "HASALL", "HASNONE", "BOOL", "NUMBER", "QUOTED_TEXT", "KEY", "KEY", "WS", "DIGIT", "FREETEXT"
"WS", "DIGIT"
}; };
} }
public static final String[] ruleNames = makeRuleNames(); public static final String[] ruleNames = makeRuleNames();
@ -52,11 +49,9 @@ public class FilterQueryLexer extends Lexer {
private static String[] makeSymbolicNames() { private static String[] makeSymbolicNames() {
return new String[] { return new String[] {
null, "LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS", null, "LPAREN", "RPAREN", "LBRACK", "RBRACK", "COMMA", "EQUALS", "NOT_EQUALS",
"NEQ", "LT", "LE", "GT", "GE", "LIKE", "NOT_LIKE", "ILIKE", "NOT_ILIKE", "NEQ", "LT", "LE", "GT", "GE", "LIKE", "ILIKE", "BETWEEN", "EXISTS",
"BETWEEN", "NOT_BETWEEN", "EXISTS", "NOT_EXISTS", "REGEXP", "NOT_REGEXP", "REGEXP", "CONTAINS", "IN", "NOT", "AND", "OR", "HAS", "HASANY", "HASALL",
"CONTAINS", "NOT_CONTAINS", "IN", "NOT_IN", "NOT", "AND", "OR", "HAS", "BOOL", "NUMBER", "QUOTED_TEXT", "KEY", "WS", "FREETEXT"
"HASANY", "HASALL", "HASNONE", "BOOL", "NUMBER", "QUOTED_TEXT", "KEY",
"WS"
}; };
} }
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@ -118,223 +113,215 @@ public class FilterQueryLexer extends Lexer {
public ATN getATN() { return _ATN; } public ATN getATN() { return _ATN; }
public static final String _serializedATN = public static final String _serializedATN =
"\u0004\u0000&\u014b\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ "\u0004\u0000\u001f\u012f\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+
"\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+
"\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+
"\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+
"\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ "\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+
"\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+
"\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+
"\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+
"\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a"+
"\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ "\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d"+
"\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ "\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!"+
"!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ "\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0001\u0000\u0001\u0000\u0001\u0001"+
"&\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002"+ "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004"+
"\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005W\b\u0005"+
"\u0001\u0005\u0003\u0005]\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+
"\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ "\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001"+
"\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+
"\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+
"\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f"+
"\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+
"\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0082\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
"\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
"\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+
"\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u0093\b\u0011"+
"\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+
"\u0001\u0012\u0001\u0012\u0003\u0012\u00a7\b\u0012\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+
"\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
"\u0001\u0013\u0001\u0013\u0003\u0013\u00b3\b\u0013\u0001\u0014\u0001\u0014"+
"\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+
"\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
"\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+
"\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
"\u0003\u0016\u00cf\b\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+
"\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+
"\u0001\u0017\u0001\u0017\u0003\u0017\u00dd\b\u0017\u0001\u0018\u0001\u0018"+ "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+
"\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
"\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019"+
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ "\u00be\b\u0019\u0001\u001a\u0001\u001a\u0001\u001b\u0003\u001b\u00c3\b"+
"\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e"+ "\u001b\u0001\u001b\u0004\u001b\u00c6\b\u001b\u000b\u001b\f\u001b\u00c7"+
"\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ "\u0001\u001b\u0001\u001b\u0005\u001b\u00cc\b\u001b\n\u001b\f\u001b\u00cf"+
"\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ "\t\u001b\u0003\u001b\u00d1\b\u001b\u0001\u001b\u0001\u001b\u0003\u001b"+
"\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ "\u00d5\b\u001b\u0001\u001b\u0004\u001b\u00d8\b\u001b\u000b\u001b\f\u001b"+
"!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0117"+ "\u00d9\u0003\u001b\u00dc\b\u001b\u0001\u001b\u0003\u001b\u00df\b\u001b"+
"\b!\u0001\"\u0004\"\u011a\b\"\u000b\"\f\"\u011b\u0001\"\u0001\"\u0004"+ "\u0001\u001b\u0001\u001b\u0004\u001b\u00e3\b\u001b\u000b\u001b\f\u001b"+
"\"\u0120\b\"\u000b\"\f\"\u0121\u0003\"\u0124\b\"\u0001#\u0001#\u0001#"+ "\u00e4\u0001\u001b\u0001\u001b\u0003\u001b\u00e9\b\u001b\u0001\u001b\u0004"+
"\u0001#\u0005#\u012a\b#\n#\f#\u012d\t#\u0001#\u0001#\u0001#\u0001#\u0001"+ "\u001b\u00ec\b\u001b\u000b\u001b\f\u001b\u00ed\u0003\u001b\u00f0\b\u001b"+
"#\u0005#\u0134\b#\n#\f#\u0137\t#\u0001#\u0003#\u013a\b#\u0001$\u0001$"+ "\u0003\u001b\u00f2\b\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+
"\u0005$\u013e\b$\n$\f$\u0141\t$\u0001%\u0004%\u0144\b%\u000b%\f%\u0145"+ "\u0005\u001c\u00f8\b\u001c\n\u001c\f\u001c\u00fb\t\u001c\u0001\u001c\u0001"+
"\u0001%\u0001%\u0001&\u0001&\u0000\u0000\'\u0001\u0001\u0003\u0002\u0005"+ "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c\u0102\b\u001c\n"+
"\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n"+ "\u001c\f\u001c\u0105\t\u001c\u0001\u001c\u0003\u001c\u0108\b\u001c\u0001"+
"\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011"+ "\u001d\u0001\u001d\u0005\u001d\u010c\b\u001d\n\u001d\f\u001d\u010f\t\u001d"+
"#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b"+ "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f"+
"7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\u0000\u0001\u0000\u001b\u0002"+ "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u011d\b \n \f "+
"\u0000LLll\u0002\u0000IIii\u0002\u0000KKkk\u0002\u0000EEee\u0002\u0000"+ "\u0120\t \u0001!\u0004!\u0123\b!\u000b!\f!\u0124\u0001!\u0001!\u0001\""+
"NNnn\u0002\u0000OOoo\u0002\u0000TTtt\u0002\u0000BBbb\u0002\u0000WWww\u0002"+ "\u0001\"\u0001#\u0004#\u012c\b#\u000b#\f#\u012d\u0000\u0000$\u0001\u0001"+
"\u0000XXxx\u0002\u0000SSss\u0002\u0000RRrr\u0002\u0000GGgg\u0002\u0000"+ "\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f"+
"PPpp\u0002\u0000CCcc\u0002\u0000AAaa\u0002\u0000DDdd\u0002\u0000HHhh\u0002"+ "\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f"+
"\u0000YYyy\u0002\u0000UUuu\u0002\u0000FFff\u0002\u0000\"\"\\\\\u0002\u0000"+ "\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u0018"+
"\'\'\\\\\u0004\u000009AZ__az\u0006\u0000..09A[]]__az\u0003\u0000\t\n\r"+ "1\u00193\u001a5\u00007\u001b9\u001c;\u0000=\u0000?\u0000A\u001dC\u001e"+
"\r \u0001\u000009\u0159\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003"+ "E\u0000G\u001f\u0001\u0000\u001d\u0002\u0000LLll\u0002\u0000IIii\u0002"+
"\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007"+ "\u0000KKkk\u0002\u0000EEee\u0002\u0000BBbb\u0002\u0000TTtt\u0002\u0000"+
"\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001"+ "WWww\u0002\u0000NNnn\u0002\u0000XXxx\u0002\u0000SSss\u0002\u0000RRrr\u0002"+
"\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000"+ "\u0000GGgg\u0002\u0000PPpp\u0002\u0000CCcc\u0002\u0000OOoo\u0002\u0000"+
"\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000"+ "AAaa\u0002\u0000DDdd\u0002\u0000HHhh\u0002\u0000YYyy\u0002\u0000UUuu\u0002"+
"\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000"+ "\u0000FFff\u0002\u0000++--\u0002\u0000\"\"\\\\\u0002\u0000\'\'\\\\\u0003"+
"\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000"+ "\u0000$$AZaz\u0006\u0000$$--0:AZ__az\u0003\u0000\t\n\r\r \u0001\u0000"+
"\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000"+ "09\b\u0000\t\n\r\r \"\'),,<>[[]]\u0145\u0000\u0001\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000"+ "\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000"+
"\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000"+ "\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000"+
")\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001"+ "\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f"+
"\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000"+ "\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013"+
"\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u0000"+ "\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017"+
"7\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001"+ "\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b"+
"\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000"+ "\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f"+
"\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000"+ "\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000"+
"E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001"+ "\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000"+
"\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0001O\u0001\u0000\u0000"+ "\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000"+
"\u0000\u0003Q\u0001\u0000\u0000\u0000\u0005S\u0001\u0000\u0000\u0000\u0007"+ "-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001"+
"U\u0001\u0000\u0000\u0000\tW\u0001\u0000\u0000\u0000\u000b\\\u0001\u0000"+ "\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000"+
"\u0000\u0000\r^\u0001\u0000\u0000\u0000\u000fa\u0001\u0000\u0000\u0000"+ "\u0000\u00009\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000"+
"\u0011d\u0001\u0000\u0000\u0000\u0013f\u0001\u0000\u0000\u0000\u0015i"+ "C\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0001I\u0001"+
"\u0001\u0000\u0000\u0000\u0017k\u0001\u0000\u0000\u0000\u0019n\u0001\u0000"+ "\u0000\u0000\u0000\u0003K\u0001\u0000\u0000\u0000\u0005M\u0001\u0000\u0000"+
"\u0000\u0000\u001bs\u0001\u0000\u0000\u0000\u001d|\u0001\u0000\u0000\u0000"+ "\u0000\u0007O\u0001\u0000\u0000\u0000\tQ\u0001\u0000\u0000\u0000\u000b"+
"\u001f\u0082\u0001\u0000\u0000\u0000!\u008c\u0001\u0000\u0000\u0000#\u0094"+ "V\u0001\u0000\u0000\u0000\rX\u0001\u0000\u0000\u0000\u000f[\u0001\u0000"+
"\u0001\u0000\u0000\u0000%\u00a0\u0001\u0000\u0000\u0000\'\u00a8\u0001"+ "\u0000\u0000\u0011^\u0001\u0000\u0000\u0000\u0013`\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u0000)\u00b4\u0001\u0000\u0000\u0000+\u00bb\u0001\u0000\u0000"+ "\u0015c\u0001\u0000\u0000\u0000\u0017e\u0001\u0000\u0000\u0000\u0019h"+
"\u0000-\u00c6\u0001\u0000\u0000\u0000/\u00d0\u0001\u0000\u0000\u00001"+ "\u0001\u0000\u0000\u0000\u001bm\u0001\u0000\u0000\u0000\u001ds\u0001\u0000"+
"\u00de\u0001\u0000\u0000\u00003\u00e1\u0001\u0000\u0000\u00005\u00e8\u0001"+ "\u0000\u0000\u001f{\u0001\u0000\u0000\u0000!\u0083\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u00007\u00ec\u0001\u0000\u0000\u00009\u00f0\u0001\u0000\u0000"+ "#\u008a\u0001\u0000\u0000\u0000%\u0094\u0001\u0000\u0000\u0000\'\u0097"+
"\u0000;\u00f3\u0001\u0000\u0000\u0000=\u00f7\u0001\u0000\u0000\u0000?"+ "\u0001\u0000\u0000\u0000)\u009b\u0001\u0000\u0000\u0000+\u009f\u0001\u0000"+
"\u00fe\u0001\u0000\u0000\u0000A\u0105\u0001\u0000\u0000\u0000C\u0116\u0001"+ "\u0000\u0000-\u00a2\u0001\u0000\u0000\u0000/\u00a6\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u0000E\u0119\u0001\u0000\u0000\u0000G\u0139\u0001\u0000\u0000"+ "1\u00ad\u0001\u0000\u0000\u00003\u00bd\u0001\u0000\u0000\u00005\u00bf"+
"\u0000I\u013b\u0001\u0000\u0000\u0000K\u0143\u0001\u0000\u0000\u0000M"+ "\u0001\u0000\u0000\u00007\u00f1\u0001\u0000\u0000\u00009\u0107\u0001\u0000"+
"\u0149\u0001\u0000\u0000\u0000OP\u0005(\u0000\u0000P\u0002\u0001\u0000"+ "\u0000\u0000;\u0109\u0001\u0000\u0000\u0000=\u0110\u0001\u0000\u0000\u0000"+
"\u0000\u0000QR\u0005)\u0000\u0000R\u0004\u0001\u0000\u0000\u0000ST\u0005"+ "?\u0113\u0001\u0000\u0000\u0000A\u0117\u0001\u0000\u0000\u0000C\u0122"+
"[\u0000\u0000T\u0006\u0001\u0000\u0000\u0000UV\u0005]\u0000\u0000V\b\u0001"+ "\u0001\u0000\u0000\u0000E\u0128\u0001\u0000\u0000\u0000G\u012b\u0001\u0000"+
"\u0000\u0000\u0000WX\u0005,\u0000\u0000X\n\u0001\u0000\u0000\u0000Y]\u0005"+ "\u0000\u0000IJ\u0005(\u0000\u0000J\u0002\u0001\u0000\u0000\u0000KL\u0005"+
"=\u0000\u0000Z[\u0005=\u0000\u0000[]\u0005=\u0000\u0000\\Y\u0001\u0000"+ ")\u0000\u0000L\u0004\u0001\u0000\u0000\u0000MN\u0005[\u0000\u0000N\u0006"+
"\u0000\u0000\\Z\u0001\u0000\u0000\u0000]\f\u0001\u0000\u0000\u0000^_\u0005"+ "\u0001\u0000\u0000\u0000OP\u0005]\u0000\u0000P\b\u0001\u0000\u0000\u0000"+
"!\u0000\u0000_`\u0005=\u0000\u0000`\u000e\u0001\u0000\u0000\u0000ab\u0005"+ "QR\u0005,\u0000\u0000R\n\u0001\u0000\u0000\u0000SW\u0005=\u0000\u0000"+
"<\u0000\u0000bc\u0005>\u0000\u0000c\u0010\u0001\u0000\u0000\u0000de\u0005"+ "TU\u0005=\u0000\u0000UW\u0005=\u0000\u0000VS\u0001\u0000\u0000\u0000V"+
"<\u0000\u0000e\u0012\u0001\u0000\u0000\u0000fg\u0005<\u0000\u0000gh\u0005"+ "T\u0001\u0000\u0000\u0000W\f\u0001\u0000\u0000\u0000XY\u0005!\u0000\u0000"+
"=\u0000\u0000h\u0014\u0001\u0000\u0000\u0000ij\u0005>\u0000\u0000j\u0016"+ "YZ\u0005=\u0000\u0000Z\u000e\u0001\u0000\u0000\u0000[\\\u0005<\u0000\u0000"+
"\u0001\u0000\u0000\u0000kl\u0005>\u0000\u0000lm\u0005=\u0000\u0000m\u0018"+ "\\]\u0005>\u0000\u0000]\u0010\u0001\u0000\u0000\u0000^_\u0005<\u0000\u0000"+
"\u0001\u0000\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001\u0000"+ "_\u0012\u0001\u0000\u0000\u0000`a\u0005<\u0000\u0000ab\u0005=\u0000\u0000"+
"\u0000pq\u0007\u0002\u0000\u0000qr\u0007\u0003\u0000\u0000r\u001a\u0001"+ "b\u0014\u0001\u0000\u0000\u0000cd\u0005>\u0000\u0000d\u0016\u0001\u0000"+
"\u0000\u0000\u0000st\u0007\u0004\u0000\u0000tu\u0007\u0005\u0000\u0000"+ "\u0000\u0000ef\u0005>\u0000\u0000fg\u0005=\u0000\u0000g\u0018\u0001\u0000"+
"uv\u0007\u0006\u0000\u0000vw\u0005_\u0000\u0000wx\u0007\u0000\u0000\u0000"+ "\u0000\u0000hi\u0007\u0000\u0000\u0000ij\u0007\u0001\u0000\u0000jk\u0007"+
"xy\u0007\u0001\u0000\u0000yz\u0007\u0002\u0000\u0000z{\u0007\u0003\u0000"+ "\u0002\u0000\u0000kl\u0007\u0003\u0000\u0000l\u001a\u0001\u0000\u0000"+
"\u0000{\u001c\u0001\u0000\u0000\u0000|}\u0007\u0001\u0000\u0000}~\u0007"+ "\u0000mn\u0007\u0001\u0000\u0000no\u0007\u0000\u0000\u0000op\u0007\u0001"+
"\u0000\u0000\u0000~\u007f\u0007\u0001\u0000\u0000\u007f\u0080\u0007\u0002"+ "\u0000\u0000pq\u0007\u0002\u0000\u0000qr\u0007\u0003\u0000\u0000r\u001c"+
"\u0000\u0000\u0080\u0081\u0007\u0003\u0000\u0000\u0081\u001e\u0001\u0000"+ "\u0001\u0000\u0000\u0000st\u0007\u0004\u0000\u0000tu\u0007\u0003\u0000"+
"\u0000\u0000\u0082\u0083\u0007\u0004\u0000\u0000\u0083\u0084\u0007\u0005"+ "\u0000uv\u0007\u0005\u0000\u0000vw\u0007\u0006\u0000\u0000wx\u0007\u0003"+
"\u0000\u0000\u0084\u0085\u0007\u0006\u0000\u0000\u0085\u0086\u0005_\u0000"+ "\u0000\u0000xy\u0007\u0003\u0000\u0000yz\u0007\u0007\u0000\u0000z\u001e"+
"\u0000\u0086\u0087\u0007\u0001\u0000\u0000\u0087\u0088\u0007\u0000\u0000"+ "\u0001\u0000\u0000\u0000{|\u0007\u0003\u0000\u0000|}\u0007\b\u0000\u0000"+
"\u0000\u0088\u0089\u0007\u0001\u0000\u0000\u0089\u008a\u0007\u0002\u0000"+ "}~\u0007\u0001\u0000\u0000~\u007f\u0007\t\u0000\u0000\u007f\u0081\u0007"+
"\u0000\u008a\u008b\u0007\u0003\u0000\u0000\u008b \u0001\u0000\u0000\u0000"+ "\u0005\u0000\u0000\u0080\u0082\u0007\t\u0000\u0000\u0081\u0080\u0001\u0000"+
"\u008c\u008d\u0007\u0007\u0000\u0000\u008d\u008e\u0007\u0003\u0000\u0000"+ "\u0000\u0000\u0081\u0082\u0001\u0000\u0000\u0000\u0082 \u0001\u0000\u0000"+
"\u008e\u008f\u0007\u0006\u0000\u0000\u008f\u0090\u0007\b\u0000\u0000\u0090"+ "\u0000\u0083\u0084\u0007\n\u0000\u0000\u0084\u0085\u0007\u0003\u0000\u0000"+
"\u0091\u0007\u0003\u0000\u0000\u0091\u0092\u0007\u0003\u0000\u0000\u0092"+ "\u0085\u0086\u0007\u000b\u0000\u0000\u0086\u0087\u0007\u0003\u0000\u0000"+
"\u0093\u0007\u0004\u0000\u0000\u0093\"\u0001\u0000\u0000\u0000\u0094\u0095"+ "\u0087\u0088\u0007\b\u0000\u0000\u0088\u0089\u0007\f\u0000\u0000\u0089"+
"\u0007\u0004\u0000\u0000\u0095\u0096\u0007\u0005\u0000\u0000\u0096\u0097"+ "\"\u0001\u0000\u0000\u0000\u008a\u008b\u0007\r\u0000\u0000\u008b\u008c"+
"\u0007\u0006\u0000\u0000\u0097\u0098\u0005_\u0000\u0000\u0098\u0099\u0007"+ "\u0007\u000e\u0000\u0000\u008c\u008d\u0007\u0007\u0000\u0000\u008d\u008e"+
"\u0007\u0000\u0000\u0099\u009a\u0007\u0003\u0000\u0000\u009a\u009b\u0007"+ "\u0007\u0005\u0000\u0000\u008e\u008f\u0007\u000f\u0000\u0000\u008f\u0090"+
"\u0006\u0000\u0000\u009b\u009c\u0007\b\u0000\u0000\u009c\u009d\u0007\u0003"+ "\u0007\u0001\u0000\u0000\u0090\u0092\u0007\u0007\u0000\u0000\u0091\u0093"+
"\u0000\u0000\u009d\u009e\u0007\u0003\u0000\u0000\u009e\u009f\u0007\u0004"+ "\u0007\t\u0000\u0000\u0092\u0091\u0001\u0000\u0000\u0000\u0092\u0093\u0001"+
"\u0000\u0000\u009f$\u0001\u0000\u0000\u0000\u00a0\u00a1\u0007\u0003\u0000"+ "\u0000\u0000\u0000\u0093$\u0001\u0000\u0000\u0000\u0094\u0095\u0007\u0001"+
"\u0000\u00a1\u00a2\u0007\t\u0000\u0000\u00a2\u00a3\u0007\u0001\u0000\u0000"+ "\u0000\u0000\u0095\u0096\u0007\u0007\u0000\u0000\u0096&\u0001\u0000\u0000"+
"\u00a3\u00a4\u0007\n\u0000\u0000\u00a4\u00a6\u0007\u0006\u0000\u0000\u00a5"+ "\u0000\u0097\u0098\u0007\u0007\u0000\u0000\u0098\u0099\u0007\u000e\u0000"+
"\u00a7\u0007\n\u0000\u0000\u00a6\u00a5\u0001\u0000\u0000\u0000\u00a6\u00a7"+ "\u0000\u0099\u009a\u0007\u0005\u0000\u0000\u009a(\u0001\u0000\u0000\u0000"+
"\u0001\u0000\u0000\u0000\u00a7&\u0001\u0000\u0000\u0000\u00a8\u00a9\u0007"+ "\u009b\u009c\u0007\u000f\u0000\u0000\u009c\u009d\u0007\u0007\u0000\u0000"+
"\u0004\u0000\u0000\u00a9\u00aa\u0007\u0005\u0000\u0000\u00aa\u00ab\u0007"+ "\u009d\u009e\u0007\u0010\u0000\u0000\u009e*\u0001\u0000\u0000\u0000\u009f"+
"\u0006\u0000\u0000\u00ab\u00ac\u0005-\u0000\u0000\u00ac\u00ad\u0007\u0003"+ "\u00a0\u0007\u000e\u0000\u0000\u00a0\u00a1\u0007\n\u0000\u0000\u00a1,"+
"\u0000\u0000\u00ad\u00ae\u0007\t\u0000\u0000\u00ae\u00af\u0007\u0001\u0000"+ "\u0001\u0000\u0000\u0000\u00a2\u00a3\u0007\u0011\u0000\u0000\u00a3\u00a4"+
"\u0000\u00af\u00b0\u0007\n\u0000\u0000\u00b0\u00b2\u0007\u0006\u0000\u0000"+ "\u0007\u000f\u0000\u0000\u00a4\u00a5\u0007\t\u0000\u0000\u00a5.\u0001"+
"\u00b1\u00b3\u0007\n\u0000\u0000\u00b2\u00b1\u0001\u0000\u0000\u0000\u00b2"+ "\u0000\u0000\u0000\u00a6\u00a7\u0007\u0011\u0000\u0000\u00a7\u00a8\u0007"+
"\u00b3\u0001\u0000\u0000\u0000\u00b3(\u0001\u0000\u0000\u0000\u00b4\u00b5"+ "\u000f\u0000\u0000\u00a8\u00a9\u0007\t\u0000\u0000\u00a9\u00aa\u0007\u000f"+
"\u0007\u000b\u0000\u0000\u00b5\u00b6\u0007\u0003\u0000\u0000\u00b6\u00b7"+ "\u0000\u0000\u00aa\u00ab\u0007\u0007\u0000\u0000\u00ab\u00ac\u0007\u0012"+
"\u0007\f\u0000\u0000\u00b7\u00b8\u0007\u0003\u0000\u0000\u00b8\u00b9\u0007"+ "\u0000\u0000\u00ac0\u0001\u0000\u0000\u0000\u00ad\u00ae\u0007\u0011\u0000"+
"\t\u0000\u0000\u00b9\u00ba\u0007\r\u0000\u0000\u00ba*\u0001\u0000\u0000"+ "\u0000\u00ae\u00af\u0007\u000f\u0000\u0000\u00af\u00b0\u0007\t\u0000\u0000"+
"\u0000\u00bb\u00bc\u0007\u0004\u0000\u0000\u00bc\u00bd\u0007\u0005\u0000"+ "\u00b0\u00b1\u0007\u000f\u0000\u0000\u00b1\u00b2\u0007\u0000\u0000\u0000"+
"\u0000\u00bd\u00be\u0007\u0006\u0000\u0000\u00be\u00bf\u0005_\u0000\u0000"+ "\u00b2\u00b3\u0007\u0000\u0000\u0000\u00b32\u0001\u0000\u0000\u0000\u00b4"+
"\u00bf\u00c0\u0007\u000b\u0000\u0000\u00c0\u00c1\u0007\u0003\u0000\u0000"+ "\u00b5\u0007\u0005\u0000\u0000\u00b5\u00b6\u0007\n\u0000\u0000\u00b6\u00b7"+
"\u00c1\u00c2\u0007\f\u0000\u0000\u00c2\u00c3\u0007\u0003\u0000\u0000\u00c3"+ "\u0007\u0013\u0000\u0000\u00b7\u00be\u0007\u0003\u0000\u0000\u00b8\u00b9"+
"\u00c4\u0007\t\u0000\u0000\u00c4\u00c5\u0007\r\u0000\u0000\u00c5,\u0001"+ "\u0007\u0014\u0000\u0000\u00b9\u00ba\u0007\u000f\u0000\u0000\u00ba\u00bb"+
"\u0000\u0000\u0000\u00c6\u00c7\u0007\u000e\u0000\u0000\u00c7\u00c8\u0007"+ "\u0007\u0000\u0000\u0000\u00bb\u00bc\u0007\t\u0000\u0000\u00bc\u00be\u0007"+
"\u0005\u0000\u0000\u00c8\u00c9\u0007\u0004\u0000\u0000\u00c9\u00ca\u0007"+ "\u0003\u0000\u0000\u00bd\u00b4\u0001\u0000\u0000\u0000\u00bd\u00b8\u0001"+
"\u0006\u0000\u0000\u00ca\u00cb\u0007\u000f\u0000\u0000\u00cb\u00cc\u0007"+ "\u0000\u0000\u0000\u00be4\u0001\u0000\u0000\u0000\u00bf\u00c0\u0007\u0015"+
"\u0001\u0000\u0000\u00cc\u00ce\u0007\u0004\u0000\u0000\u00cd\u00cf\u0007"+ "\u0000\u0000\u00c06\u0001\u0000\u0000\u0000\u00c1\u00c3\u00035\u001a\u0000"+
"\n\u0000\u0000\u00ce\u00cd\u0001\u0000\u0000\u0000\u00ce\u00cf\u0001\u0000"+ "\u00c2\u00c1\u0001\u0000\u0000\u0000\u00c2\u00c3\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u00cf.\u0001\u0000\u0000\u0000\u00d0\u00d1\u0007\u0004\u0000"+ "\u00c3\u00c5\u0001\u0000\u0000\u0000\u00c4\u00c6\u0003E\"\u0000\u00c5"+
"\u0000\u00d1\u00d2\u0007\u0005\u0000\u0000\u00d2\u00d3\u0007\u0006\u0000"+ "\u00c4\u0001\u0000\u0000\u0000\u00c6\u00c7\u0001\u0000\u0000\u0000\u00c7"+
"\u0000\u00d3\u00d4\u0005_\u0000\u0000\u00d4\u00d5\u0007\u000e\u0000\u0000"+ "\u00c5\u0001\u0000\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8"+
"\u00d5\u00d6\u0007\u0005\u0000\u0000\u00d6\u00d7\u0007\u0004\u0000\u0000"+ "\u00d0\u0001\u0000\u0000\u0000\u00c9\u00cd\u0005.\u0000\u0000\u00ca\u00cc"+
"\u00d7\u00d8\u0007\u0006\u0000\u0000\u00d8\u00d9\u0007\u000f\u0000\u0000"+ "\u0003E\"\u0000\u00cb\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cf\u0001"+
"\u00d9\u00da\u0007\u0001\u0000\u0000\u00da\u00dc\u0007\u0004\u0000\u0000"+ "\u0000\u0000\u0000\u00cd\u00cb\u0001\u0000\u0000\u0000\u00cd\u00ce\u0001"+
"\u00db\u00dd\u0007\n\u0000\u0000\u00dc\u00db\u0001\u0000\u0000\u0000\u00dc"+ "\u0000\u0000\u0000\u00ce\u00d1\u0001\u0000\u0000\u0000\u00cf\u00cd\u0001"+
"\u00dd\u0001\u0000\u0000\u0000\u00dd0\u0001\u0000\u0000\u0000\u00de\u00df"+ "\u0000\u0000\u0000\u00d0\u00c9\u0001\u0000\u0000\u0000\u00d0\u00d1\u0001"+
"\u0007\u0001\u0000\u0000\u00df\u00e0\u0007\u0004\u0000\u0000\u00e02\u0001"+ "\u0000\u0000\u0000\u00d1\u00db\u0001\u0000\u0000\u0000\u00d2\u00d4\u0007"+
"\u0000\u0000\u0000\u00e1\u00e2\u0007\u0004\u0000\u0000\u00e2\u00e3\u0007"+ "\u0003\u0000\u0000\u00d3\u00d5\u00035\u001a\u0000\u00d4\u00d3\u0001\u0000"+
"\u0005\u0000\u0000\u00e3\u00e4\u0007\u0006\u0000\u0000\u00e4\u00e5\u0005"+ "\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5\u00d7\u0001\u0000"+
"_\u0000\u0000\u00e5\u00e6\u0007\u0001\u0000\u0000\u00e6\u00e7\u0007\u0004"+ "\u0000\u0000\u00d6\u00d8\u0003E\"\u0000\u00d7\u00d6\u0001\u0000\u0000"+
"\u0000\u0000\u00e74\u0001\u0000\u0000\u0000\u00e8\u00e9\u0007\u0004\u0000"+ "\u0000\u00d8\u00d9\u0001\u0000\u0000\u0000\u00d9\u00d7\u0001\u0000\u0000"+
"\u0000\u00e9\u00ea\u0007\u0005\u0000\u0000\u00ea\u00eb\u0007\u0006\u0000"+ "\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00dc\u0001\u0000\u0000"+
"\u0000\u00eb6\u0001\u0000\u0000\u0000\u00ec\u00ed\u0007\u000f\u0000\u0000"+ "\u0000\u00db\u00d2\u0001\u0000\u0000\u0000\u00db\u00dc\u0001\u0000\u0000"+
"\u00ed\u00ee\u0007\u0004\u0000\u0000\u00ee\u00ef\u0007\u0010\u0000\u0000"+ "\u0000\u00dc\u00f2\u0001\u0000\u0000\u0000\u00dd\u00df\u00035\u001a\u0000"+
"\u00ef8\u0001\u0000\u0000\u0000\u00f0\u00f1\u0007\u0005\u0000\u0000\u00f1"+ "\u00de\u00dd\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000\u0000\u0000"+
"\u00f2\u0007\u000b\u0000\u0000\u00f2:\u0001\u0000\u0000\u0000\u00f3\u00f4"+ "\u00df\u00e0\u0001\u0000\u0000\u0000\u00e0\u00e2\u0005.\u0000\u0000\u00e1"+
"\u0007\u0011\u0000\u0000\u00f4\u00f5\u0007\u000f\u0000\u0000\u00f5\u00f6"+ "\u00e3\u0003E\"\u0000\u00e2\u00e1\u0001\u0000\u0000\u0000\u00e3\u00e4"+
"\u0007\n\u0000\u0000\u00f6<\u0001\u0000\u0000\u0000\u00f7\u00f8\u0007"+ "\u0001\u0000\u0000\u0000\u00e4\u00e2\u0001\u0000\u0000\u0000\u00e4\u00e5"+
"\u0011\u0000\u0000\u00f8\u00f9\u0007\u000f\u0000\u0000\u00f9\u00fa\u0007"+ "\u0001\u0000\u0000\u0000\u00e5\u00ef\u0001\u0000\u0000\u0000\u00e6\u00e8"+
"\n\u0000\u0000\u00fa\u00fb\u0007\u000f\u0000\u0000\u00fb\u00fc\u0007\u0004"+ "\u0007\u0003\u0000\u0000\u00e7\u00e9\u00035\u001a\u0000\u00e8\u00e7\u0001"+
"\u0000\u0000\u00fc\u00fd\u0007\u0012\u0000\u0000\u00fd>\u0001\u0000\u0000"+ "\u0000\u0000\u0000\u00e8\u00e9\u0001\u0000\u0000\u0000\u00e9\u00eb\u0001"+
"\u0000\u00fe\u00ff\u0007\u0011\u0000\u0000\u00ff\u0100\u0007\u000f\u0000"+ "\u0000\u0000\u0000\u00ea\u00ec\u0003E\"\u0000\u00eb\u00ea\u0001\u0000"+
"\u0000\u0100\u0101\u0007\n\u0000\u0000\u0101\u0102\u0007\u000f\u0000\u0000"+ "\u0000\u0000\u00ec\u00ed\u0001\u0000\u0000\u0000\u00ed\u00eb\u0001\u0000"+
"\u0102\u0103\u0007\u0000\u0000\u0000\u0103\u0104\u0007\u0000\u0000\u0000"+ "\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u00f0\u0001\u0000"+
"\u0104@\u0001\u0000\u0000\u0000\u0105\u0106\u0007\u0011\u0000\u0000\u0106"+ "\u0000\u0000\u00ef\u00e6\u0001\u0000\u0000\u0000\u00ef\u00f0\u0001\u0000"+
"\u0107\u0007\u000f\u0000\u0000\u0107\u0108\u0007\n\u0000\u0000\u0108\u0109"+ "\u0000\u0000\u00f0\u00f2\u0001\u0000\u0000\u0000\u00f1\u00c2\u0001\u0000"+
"\u0007\u0004\u0000\u0000\u0109\u010a\u0007\u0005\u0000\u0000\u010a\u010b"+ "\u0000\u0000\u00f1\u00de\u0001\u0000\u0000\u0000\u00f28\u0001\u0000\u0000"+
"\u0007\u0004\u0000\u0000\u010b\u010c\u0007\u0003\u0000\u0000\u010cB\u0001"+ "\u0000\u00f3\u00f9\u0005\"\u0000\u0000\u00f4\u00f8\b\u0016\u0000\u0000"+
"\u0000\u0000\u0000\u010d\u010e\u0007\u0006\u0000\u0000\u010e\u010f\u0007"+ "\u00f5\u00f6\u0005\\\u0000\u0000\u00f6\u00f8\t\u0000\u0000\u0000\u00f7"+
"\u000b\u0000\u0000\u010f\u0110\u0007\u0013\u0000\u0000\u0110\u0117\u0007"+ "\u00f4\u0001\u0000\u0000\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f8"+
"\u0003\u0000\u0000\u0111\u0112\u0007\u0014\u0000\u0000\u0112\u0113\u0007"+ "\u00fb\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00f9"+
"\u000f\u0000\u0000\u0113\u0114\u0007\u0000\u0000\u0000\u0114\u0115\u0007"+ "\u00fa\u0001\u0000\u0000\u0000\u00fa\u00fc\u0001\u0000\u0000\u0000\u00fb"+
"\n\u0000\u0000\u0115\u0117\u0007\u0003\u0000\u0000\u0116\u010d\u0001\u0000"+ "\u00f9\u0001\u0000\u0000\u0000\u00fc\u0108\u0005\"\u0000\u0000\u00fd\u0103"+
"\u0000\u0000\u0116\u0111\u0001\u0000\u0000\u0000\u0117D\u0001\u0000\u0000"+ "\u0005\'\u0000\u0000\u00fe\u0102\b\u0017\u0000\u0000\u00ff\u0100\u0005"+
"\u0000\u0118\u011a\u0003M&\u0000\u0119\u0118\u0001\u0000\u0000\u0000\u011a"+ "\\\u0000\u0000\u0100\u0102\t\u0000\u0000\u0000\u0101\u00fe\u0001\u0000"+
"\u011b\u0001\u0000\u0000\u0000\u011b\u0119\u0001\u0000\u0000\u0000\u011b"+ "\u0000\u0000\u0101\u00ff\u0001\u0000\u0000\u0000\u0102\u0105\u0001\u0000"+
"\u011c\u0001\u0000\u0000\u0000\u011c\u0123\u0001\u0000\u0000\u0000\u011d"+ "\u0000\u0000\u0103\u0101\u0001\u0000\u0000\u0000\u0103\u0104\u0001\u0000"+
"\u011f\u0005.\u0000\u0000\u011e\u0120\u0003M&\u0000\u011f\u011e\u0001"+ "\u0000\u0000\u0104\u0106\u0001\u0000\u0000\u0000\u0105\u0103\u0001\u0000"+
"\u0000\u0000\u0000\u0120\u0121\u0001\u0000\u0000\u0000\u0121\u011f\u0001"+ "\u0000\u0000\u0106\u0108\u0005\'\u0000\u0000\u0107\u00f3\u0001\u0000\u0000"+
"\u0000\u0000\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u0124\u0001"+ "\u0000\u0107\u00fd\u0001\u0000\u0000\u0000\u0108:\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u0000\u0123\u011d\u0001\u0000\u0000\u0000\u0123\u0124\u0001"+ "\u0109\u010d\u0007\u0018\u0000\u0000\u010a\u010c\u0007\u0019\u0000\u0000"+
"\u0000\u0000\u0000\u0124F\u0001\u0000\u0000\u0000\u0125\u012b\u0005\""+ "\u010b\u010a\u0001\u0000\u0000\u0000\u010c\u010f\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u0126\u012a\b\u0015\u0000\u0000\u0127\u0128\u0005\\\u0000"+ "\u010d\u010b\u0001\u0000\u0000\u0000\u010d\u010e\u0001\u0000\u0000\u0000"+
"\u0000\u0128\u012a\t\u0000\u0000\u0000\u0129\u0126\u0001\u0000\u0000\u0000"+ "\u010e<\u0001\u0000\u0000\u0000\u010f\u010d\u0001\u0000\u0000\u0000\u0110"+
"\u0129\u0127\u0001\u0000\u0000\u0000\u012a\u012d\u0001\u0000\u0000\u0000"+ "\u0111\u0005[\u0000\u0000\u0111\u0112\u0005]\u0000\u0000\u0112>\u0001"+
"\u012b\u0129\u0001\u0000\u0000\u0000\u012b\u012c\u0001\u0000\u0000\u0000"+ "\u0000\u0000\u0000\u0113\u0114\u0005[\u0000\u0000\u0114\u0115\u0005*\u0000"+
"\u012c\u012e\u0001\u0000\u0000\u0000\u012d\u012b\u0001\u0000\u0000\u0000"+ "\u0000\u0115\u0116\u0005]\u0000\u0000\u0116@\u0001\u0000\u0000\u0000\u0117"+
"\u012e\u013a\u0005\"\u0000\u0000\u012f\u0135\u0005\'\u0000\u0000\u0130"+ "\u011e\u0003;\u001d\u0000\u0118\u0119\u0005.\u0000\u0000\u0119\u011d\u0003"+
"\u0134\b\u0016\u0000\u0000\u0131\u0132\u0005\\\u0000\u0000\u0132\u0134"+ ";\u001d\u0000\u011a\u011d\u0003=\u001e\u0000\u011b\u011d\u0003?\u001f"+
"\t\u0000\u0000\u0000\u0133\u0130\u0001\u0000\u0000\u0000\u0133\u0131\u0001"+ "\u0000\u011c\u0118\u0001\u0000\u0000\u0000\u011c\u011a\u0001\u0000\u0000"+
"\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000\u0135\u0133\u0001"+ "\u0000\u011c\u011b\u0001\u0000\u0000\u0000\u011d\u0120\u0001\u0000\u0000"+
"\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000\u0136\u0138\u0001"+ "\u0000\u011e\u011c\u0001\u0000\u0000\u0000\u011e\u011f\u0001\u0000\u0000"+
"\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000\u0138\u013a\u0005"+ "\u0000\u011fB\u0001\u0000\u0000\u0000\u0120\u011e\u0001\u0000\u0000\u0000"+
"\'\u0000\u0000\u0139\u0125\u0001\u0000\u0000\u0000\u0139\u012f\u0001\u0000"+ "\u0121\u0123\u0007\u001a\u0000\u0000\u0122\u0121\u0001\u0000\u0000\u0000"+
"\u0000\u0000\u013aH\u0001\u0000\u0000\u0000\u013b\u013f\u0007\u0017\u0000"+ "\u0123\u0124\u0001\u0000\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000"+
"\u0000\u013c\u013e\u0007\u0018\u0000\u0000\u013d\u013c\u0001\u0000\u0000"+ "\u0124\u0125\u0001\u0000\u0000\u0000\u0125\u0126\u0001\u0000\u0000\u0000"+
"\u0000\u013e\u0141\u0001\u0000\u0000\u0000\u013f\u013d\u0001\u0000\u0000"+ "\u0126\u0127\u0006!\u0000\u0000\u0127D\u0001\u0000\u0000\u0000\u0128\u0129"+
"\u0000\u013f\u0140\u0001\u0000\u0000\u0000\u0140J\u0001\u0000\u0000\u0000"+ "\u0007\u001b\u0000\u0000\u0129F\u0001\u0000\u0000\u0000\u012a\u012c\b"+
"\u0141\u013f\u0001\u0000\u0000\u0000\u0142\u0144\u0007\u0019\u0000\u0000"+ "\u001c\u0000\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012c\u012d\u0001"+
"\u0143\u0142\u0001\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000\u0000"+ "\u0000\u0000\u0000\u012d\u012b\u0001\u0000\u0000\u0000\u012d\u012e\u0001"+
"\u0145\u0143\u0001\u0000\u0000\u0000\u0145\u0146\u0001\u0000\u0000\u0000"+ "\u0000\u0000\u0000\u012eH\u0001\u0000\u0000\u0000\u001c\u0000V\u0081\u0092"+
"\u0146\u0147\u0001\u0000\u0000\u0000\u0147\u0148\u0006%\u0000\u0000\u0148"+ "\u00bd\u00c2\u00c7\u00cd\u00d0\u00d4\u00d9\u00db\u00de\u00e4\u00e8\u00ed"+
"L\u0001\u0000\u0000\u0000\u0149\u014a\u0007\u001a\u0000\u0000\u014aN\u0001"+ "\u00ef\u00f1\u00f7\u00f9\u0101\u0103\u0107\u010d\u011c\u011e\u0124\u012d"+
"\u0000\u0000\u0000\u0011\u0000\\\u00a6\u00b2\u00ce\u00dc\u0116\u011b\u0121"+ "\u0001\u0006\u0000\u0000";
"\u0123\u0129\u012b\u0133\u0135\u0139\u013f\u0145\u0001\u0006\u0000\u0000";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -11,31 +11,24 @@ LE=10
GT=11 GT=11
GE=12 GE=12
LIKE=13 LIKE=13
NOT_LIKE=14 ILIKE=14
ILIKE=15 BETWEEN=15
NOT_ILIKE=16 EXISTS=16
BETWEEN=17 REGEXP=17
NOT_BETWEEN=18 CONTAINS=18
EXISTS=19 IN=19
NOT_EXISTS=20 NOT=20
REGEXP=21 AND=21
NOT_REGEXP=22 OR=22
CONTAINS=23 HAS=23
NOT_CONTAINS=24 HASANY=24
IN=25 HASALL=25
NOT_IN=26 BOOL=26
NOT=27 NUMBER=27
AND=28 QUOTED_TEXT=28
OR=29 KEY=29
HAS=30 WS=30
HASANY=31 FREETEXT=31
HASALL=32
HASNONE=33
BOOL=34
NUMBER=35
QUOTED_TEXT=36
KEY=37
WS=38
'('=1 '('=1
')'=2 ')'=2
'['=3 '['=3

File diff suppressed because it is too large Load Diff

View File

@ -5,33 +5,49 @@ grammar FilterQuery;
*/ */
query query
: expression ( (AND | OR) expression | expression )* : expression
EOF EOF
; ;
// Expression with standard boolean precedence:
// - parentheses > NOT > AND > OR
// - consecutive expressions with no AND/OR => implicit AND
expression expression
: orExpression : orExpression
; ;
// OR expressions
orExpression orExpression
: andExpression ( OR andExpression )* : andExpression ( OR andExpression )*
; ;
// AND expressions + optional chaining with implicit AND if no OR is present
andExpression andExpression
: unaryExpression ( AND unaryExpression | unaryExpression )* : unaryExpression ( AND unaryExpression | unaryExpression )*
; ;
// A unary expression handles optional NOT
unaryExpression unaryExpression
: NOT? primary : NOT? primary
; ;
// Primary constructs: grouped expressions, a comparison (key op value),
// a function call, or a full-text string
primary primary
: LPAREN orExpression RPAREN : LPAREN orExpression RPAREN
| comparison | comparison
| functionCall | functionCall
| fullText | fullText
| key
| value
; ;
/*
* Comparison-like filters
*
* Includes all operators: =, !=, <>, <, <=, >, >=, [NOT] LIKE, [NOT] ILIKE,
* [NOT] BETWEEN, [NOT] IN, [NOT] EXISTS, [NOT] REGEXP, [NOT] CONTAINS, etc.
*/
comparison comparison
: key EQUALS value : key EQUALS value
| key (NOT_EQUALS | NEQ) value | key (NOT_EQUALS | NEQ) value
@ -39,42 +55,62 @@ comparison
| key LE value | key LE value
| key GT value | key GT value
| key GE value | key GE value
| key (LIKE | ILIKE) value | key (LIKE | ILIKE) value
| key (NOT_LIKE | NOT_ILIKE) value | key NOT (LIKE | ILIKE) value
| key BETWEEN value AND value | key BETWEEN value AND value
| key NOT_BETWEEN value AND value | key NOT BETWEEN value AND value
| key inClause | key inClause
| key notInClause | key notInClause
| key EXISTS | key EXISTS
| key NOT_EXISTS | key NOT EXISTS
| key REGEXP value | key REGEXP value
| key NOT_REGEXP value | key NOT REGEXP value
| key CONTAINS value | key CONTAINS value
| key NOT_CONTAINS value | key NOT CONTAINS value
; ;
// in(...) or in[...]
inClause inClause
: IN LPAREN valueList RPAREN : IN LPAREN valueList RPAREN
| IN LBRACK valueList RBRACK | IN LBRACK valueList RBRACK
| IN value
; ;
notInClause notInClause
: NOT_IN LPAREN valueList RPAREN : NOT IN LPAREN valueList RPAREN
| NOT_IN LBRACK valueList RBRACK | NOT IN LBRACK valueList RBRACK
| NOT IN value
; ;
// List of values for in(...) or in[...]
valueList valueList
: value ( COMMA value )* : value ( COMMA value )*
; ;
// Full-text search: a standalone quoted string is allowed as a "primary"
// e.g. `"Waiting for response" http.status_code=200`
fullText fullText
: QUOTED_TEXT : QUOTED_TEXT
| FREETEXT
; ;
/*
* Function calls like:
* has(payload.user_ids, 123)
* hasAny(payload.user_ids, [123, 456])
* ...
*/
functionCall functionCall
: (HAS | HASANY | HASALL | HASNONE) LPAREN functionParamList RPAREN : (HAS | HASANY | HASALL) LPAREN functionParamList RPAREN
; ;
// Function parameters can be keys, single scalar values, or arrays
functionParamList functionParamList
: functionParam ( COMMA functionParam )* : functionParam ( COMMA functionParam )*
; ;
@ -85,10 +121,15 @@ functionParam
| array | array
; ;
// An array: [ item1, item2, item3 ]
array array
: LBRACK valueList RBRACK : LBRACK valueList RBRACK
; ;
/*
* A 'value' can be a string literal (double or single-quoted),
// a numeric literal, boolean, or a "bare" token as needed.
*/
value value
: QUOTED_TEXT : QUOTED_TEXT
| NUMBER | NUMBER
@ -96,10 +137,15 @@ value
| KEY | KEY
; ;
/*
* A key can include letters, digits, underscores, dots, brackets
* E.g. service.name, query_log.query_duration_ms, proto.user_objects[].name
*/
key key
: KEY : KEY
; ;
/* /*
* Lexer Rules * Lexer Rules
*/ */
@ -113,72 +159,69 @@ COMMA : ',' ;
EQUALS : '=' | '==' ; EQUALS : '=' | '==' ;
NOT_EQUALS : '!=' ; NOT_EQUALS : '!=' ;
NEQ : '<>' ; NEQ : '<>' ; // alternate not-equals operator
LT : '<' ; LT : '<' ;
LE : '<=' ; LE : '<=' ;
GT : '>' ; GT : '>' ;
GE : '>=' ; GE : '>=' ;
// Multi-keyword operators // Operators that are made of multiple keywords
LIKE : [Ll][Ii][Kk][Ee] ; LIKE : [Ll][Ii][Kk][Ee] ;
NOT_LIKE : [Nn][Oo][Tt] '_' [Ll][Ii][Kk][Ee] ;
ILIKE : [Ii][Ll][Ii][Kk][Ee] ; ILIKE : [Ii][Ll][Ii][Kk][Ee] ;
NOT_ILIKE : [Nn][Oo][Tt] '_' [Ii][Ll][Ii][Kk][Ee] ;
BETWEEN : [Bb][Ee][Tt][Ww][Ee][Ee][Nn] ; BETWEEN : [Bb][Ee][Tt][Ww][Ee][Ee][Nn] ;
NOT_BETWEEN : [Nn][Oo][Tt] '_' [Bb][Ee][Tt][Ww][Ee][Ee][Nn] ;
EXISTS : [Ee][Xx][Ii][Ss][Tt][Ss]? ; EXISTS : [Ee][Xx][Ii][Ss][Tt][Ss]? ;
NOT_EXISTS : [Nn][Oo][Tt] '-' [Ee][Xx][Ii][Ss][Tt][Ss]? ;
REGEXP : [Rr][Ee][Gg][Ee][Xx][Pp] ; REGEXP : [Rr][Ee][Gg][Ee][Xx][Pp] ;
NOT_REGEXP : [Nn][Oo][Tt] '_' [Rr][Ee][Gg][Ee][Xx][Pp] ;
CONTAINS : [Cc][Oo][Nn][Tt][Aa][Ii][Nn][Ss]? ; CONTAINS : [Cc][Oo][Nn][Tt][Aa][Ii][Nn][Ss]? ;
NOT_CONTAINS: [Nn][Oo][Tt] '_' [Cc][Oo][Nn][Tt][Aa][Ii][Nn][Ss]? ;
IN : [Ii][Nn] ; IN : [Ii][Nn] ;
NOT_IN : [Nn][Oo][Tt] '_' [Ii][Nn] ;
// Boolean logic // Boolean logic
NOT : [Nn][Oo][Tt] ; NOT : [Nn][Oo][Tt] ;
AND : [Aa][Nn][Dd] ; AND : [Aa][Nn][Dd] ;
OR : [Oo][Rr] ; OR : [Oo][Rr] ;
// Functions // For easy referencing in function calls
HAS : [Hh][Aa][Ss] ; HAS : [Hh][Aa][Ss] ;
HASANY : [Hh][Aa][Ss][Aa][Nn][Yy] ; HASANY : [Hh][Aa][Ss][Aa][Nn][Yy] ;
HASALL : [Hh][Aa][Ss][Aa][Ll][Ll] ; HASALL : [Hh][Aa][Ss][Aa][Ll][Ll] ;
HASNONE : [Hh][Aa][Ss][Nn][Oo][Nn][Ee] ;
// Boolean values // Potential boolean constants
BOOL BOOL
: [Tt][Rr][Uu][Ee] : [Tt][Rr][Uu][Ee]
| [Ff][Aa][Ll][Ss][Ee] | [Ff][Aa][Ll][Ss][Ee]
; ;
// Numbers fragment SIGN : [+-] ;
// Numbers: optional sign, then digits, optional fractional part,
// optional scientific notation (handy for future use)
NUMBER NUMBER
: DIGIT+ ( '.' DIGIT+ )? : SIGN? DIGIT+ ('.' DIGIT*)? ([eE] SIGN? DIGIT+)? // -10.25 42 +3.14 6.02e23
| SIGN? '.' DIGIT+ ([eE] SIGN? DIGIT+)? // -.75 .5 -.5e-3
; ;
// Quoted text // Double/single-quoted text, capturing full text search strings, values, etc.
QUOTED_TEXT QUOTED_TEXT
: ( '"' ( ~["\\] | '\\' . )* '"' // double-quoted : ( '"' ( ~["\\] | '\\' . )* '"' // double-quoted
| '\'' ( ~['\\] | '\\' . )* '\'' // single-quoted | '\'' ( ~['\\] | '\\' . )* '\'' // single-quoted
) )
; ;
// Keys fragment SEGMENT : [a-zA-Z$] [a-zA-Z0-9$_:\-]* ;
fragment EMPTY_BRACKS : '[' ']' ;
fragment OLD_JSON_BRACKS: '[' '*' ']';
KEY KEY
: [a-zA-Z0-9_] [a-zA-Z0-9_.[\]]* : SEGMENT ( '.' SEGMENT | EMPTY_BRACKS | OLD_JSON_BRACKS)*
; ;
// Whitespace // Ignore whitespace
WS WS
: [ \t\r\n]+ -> skip : [ \t\r\n]+ -> skip
; ;
// Digits fragment // Digits used by NUMBER
fragment DIGIT fragment DIGIT
: [0-9] : [0-9]
; ;
FREETEXT : (~[ \t\r\n=()'"<>!,[\]])+ ;

View File

@ -16,6 +16,7 @@ export interface IQueryPair {
key: string; key: string;
operator: string; operator: string;
value?: string; value?: string;
hasNegation?: boolean;
position: { position: {
keyStart: number; keyStart: number;
keyEnd: number; keyEnd: number;
@ -23,6 +24,8 @@ export interface IQueryPair {
operatorEnd: number; operatorEnd: number;
valueStart?: number; valueStart?: number;
valueEnd?: number; valueEnd?: number;
negationStart?: number;
negationEnd?: number;
}; };
isComplete: boolean; // true if the pair has all three components isComplete: boolean; // true if the pair has all three components
} }
@ -35,6 +38,7 @@ export interface IQueryContext {
currentToken: string; currentToken: string;
isInValue: boolean; isInValue: boolean;
isInKey: boolean; isInKey: boolean;
isInNegation: boolean;
isInOperator: boolean; isInOperator: boolean;
isInFunction: boolean; isInFunction: boolean;
isInConjunction?: boolean; isInConjunction?: boolean;

View File

@ -15,9 +15,7 @@ export function isOperatorToken(tokenType: number): boolean {
FilterQueryLexer.GT, FilterQueryLexer.GT,
FilterQueryLexer.GE, FilterQueryLexer.GE,
FilterQueryLexer.LIKE, FilterQueryLexer.LIKE,
FilterQueryLexer.NOT_LIKE,
FilterQueryLexer.ILIKE, FilterQueryLexer.ILIKE,
FilterQueryLexer.NOT_ILIKE,
FilterQueryLexer.BETWEEN, FilterQueryLexer.BETWEEN,
FilterQueryLexer.EXISTS, FilterQueryLexer.EXISTS,
FilterQueryLexer.REGEXP, FilterQueryLexer.REGEXP,
@ -29,9 +27,7 @@ export function isOperatorToken(tokenType: number): boolean {
// Helper function to check if a token is an operator which doesn't require a value // Helper function to check if a token is an operator which doesn't require a value
export function isNonValueOperatorToken(tokenType: number): boolean { export function isNonValueOperatorToken(tokenType: number): boolean {
return [FilterQueryLexer.NOT_EXISTS, FilterQueryLexer.EXISTS].includes( return [FilterQueryLexer.EXISTS].includes(tokenType);
tokenType,
);
} }
// Helper function to check if a token is a value // Helper function to check if a token is a value
@ -72,7 +68,6 @@ export function isFunctionToken(tokenType: number): boolean {
FilterQueryLexer.HAS, FilterQueryLexer.HAS,
FilterQueryLexer.HASANY, FilterQueryLexer.HASANY,
FilterQueryLexer.HASALL, FilterQueryLexer.HASALL,
FilterQueryLexer.HASNONE,
].includes(tokenType); ].includes(tokenType);
} }