SQL: Introduce the catalog concept inside the grammar (elastic/x-pack-elasticsearch#3911)

Indices can now specify the catalog (the cluster) in which they belong.
This is a first step in supporting both CCS and BI tools which tend to
be explicit

Original commit: elastic/x-pack-elasticsearch@0b4633facc
This commit is contained in:
Costin Leau 2018-02-14 12:30:32 +02:00 committed by GitHub
parent 742c7001c9
commit a5b129c10c
12 changed files with 965 additions and 883 deletions

View File

@ -233,8 +233,8 @@ identifier
;
tableIdentifier
: TABLE_IDENTIFIER
| identifier
: (catalog=identifier ':')? TABLE_IDENTIFIER
| (catalog=identifier ':')? name=identifier
;
quoteIdentifier

View File

@ -1,170 +1,172 @@
T__0=1
T__1=2
T__2=3
ALL=4
ANALYZE=5
ANALYZED=6
AND=7
ANY=8
AS=9
ASC=10
BETWEEN=11
BY=12
CAST=13
COLUMNS=14
DEBUG=15
DESC=16
DESCRIBE=17
DISTINCT=18
ESCAPE=19
EXECUTABLE=20
EXISTS=21
EXPLAIN=22
EXTRACT=23
FALSE=24
FORMAT=25
FROM=26
FULL=27
FUNCTIONS=28
GRAPHVIZ=29
GROUP=30
HAVING=31
IN=32
INNER=33
IS=34
JOIN=35
LEFT=36
LIKE=37
LIMIT=38
MAPPED=39
MATCH=40
NATURAL=41
NOT=42
NULL=43
ON=44
OPTIMIZED=45
OR=46
ORDER=47
OUTER=48
PARSED=49
PHYSICAL=50
PLAN=51
RIGHT=52
RLIKE=53
QUERY=54
SCHEMAS=55
SELECT=56
SHOW=57
SYS=58
TABLES=59
TEXT=60
TRUE=61
TYPES=62
USING=63
VERIFY=64
WHERE=65
WITH=66
EQ=67
NEQ=68
LT=69
LTE=70
GT=71
GTE=72
PLUS=73
MINUS=74
ASTERISK=75
SLASH=76
PERCENT=77
CONCAT=78
DOT=79
STRING=80
INTEGER_VALUE=81
DECIMAL_VALUE=82
IDENTIFIER=83
DIGIT_IDENTIFIER=84
TABLE_IDENTIFIER=85
QUOTED_IDENTIFIER=86
BACKQUOTED_IDENTIFIER=87
SIMPLE_COMMENT=88
BRACKETED_COMMENT=89
WS=90
UNRECOGNIZED=91
DELIMITER=92
T__3=4
ALL=5
ANALYZE=6
ANALYZED=7
AND=8
ANY=9
AS=10
ASC=11
BETWEEN=12
BY=13
CAST=14
COLUMNS=15
DEBUG=16
DESC=17
DESCRIBE=18
DISTINCT=19
ESCAPE=20
EXECUTABLE=21
EXISTS=22
EXPLAIN=23
EXTRACT=24
FALSE=25
FORMAT=26
FROM=27
FULL=28
FUNCTIONS=29
GRAPHVIZ=30
GROUP=31
HAVING=32
IN=33
INNER=34
IS=35
JOIN=36
LEFT=37
LIKE=38
LIMIT=39
MAPPED=40
MATCH=41
NATURAL=42
NOT=43
NULL=44
ON=45
OPTIMIZED=46
OR=47
ORDER=48
OUTER=49
PARSED=50
PHYSICAL=51
PLAN=52
RIGHT=53
RLIKE=54
QUERY=55
SCHEMAS=56
SELECT=57
SHOW=58
SYS=59
TABLES=60
TEXT=61
TRUE=62
TYPES=63
USING=64
VERIFY=65
WHERE=66
WITH=67
EQ=68
NEQ=69
LT=70
LTE=71
GT=72
GTE=73
PLUS=74
MINUS=75
ASTERISK=76
SLASH=77
PERCENT=78
CONCAT=79
DOT=80
STRING=81
INTEGER_VALUE=82
DECIMAL_VALUE=83
IDENTIFIER=84
DIGIT_IDENTIFIER=85
TABLE_IDENTIFIER=86
QUOTED_IDENTIFIER=87
BACKQUOTED_IDENTIFIER=88
SIMPLE_COMMENT=89
BRACKETED_COMMENT=90
WS=91
UNRECOGNIZED=92
DELIMITER=93
'('=1
')'=2
','=3
'ALL'=4
'ANALYZE'=5
'ANALYZED'=6
'AND'=7
'ANY'=8
'AS'=9
'ASC'=10
'BETWEEN'=11
'BY'=12
'CAST'=13
'COLUMNS'=14
'DEBUG'=15
'DESC'=16
'DESCRIBE'=17
'DISTINCT'=18
'ESCAPE'=19
'EXECUTABLE'=20
'EXISTS'=21
'EXPLAIN'=22
'EXTRACT'=23
'FALSE'=24
'FORMAT'=25
'FROM'=26
'FULL'=27
'FUNCTIONS'=28
'GRAPHVIZ'=29
'GROUP'=30
'HAVING'=31
'IN'=32
'INNER'=33
'IS'=34
'JOIN'=35
'LEFT'=36
'LIKE'=37
'LIMIT'=38
'MAPPED'=39
'MATCH'=40
'NATURAL'=41
'NOT'=42
'NULL'=43
'ON'=44
'OPTIMIZED'=45
'OR'=46
'ORDER'=47
'OUTER'=48
'PARSED'=49
'PHYSICAL'=50
'PLAN'=51
'RIGHT'=52
'RLIKE'=53
'QUERY'=54
'SCHEMAS'=55
'SELECT'=56
'SHOW'=57
'SYS'=58
'TABLES'=59
'TEXT'=60
'TRUE'=61
'TYPES'=62
'USING'=63
'VERIFY'=64
'WHERE'=65
'WITH'=66
'='=67
'<'=69
'<='=70
'>'=71
'>='=72
'+'=73
'-'=74
'*'=75
'/'=76
'%'=77
'||'=78
'.'=79
':'=4
'ALL'=5
'ANALYZE'=6
'ANALYZED'=7
'AND'=8
'ANY'=9
'AS'=10
'ASC'=11
'BETWEEN'=12
'BY'=13
'CAST'=14
'COLUMNS'=15
'DEBUG'=16
'DESC'=17
'DESCRIBE'=18
'DISTINCT'=19
'ESCAPE'=20
'EXECUTABLE'=21
'EXISTS'=22
'EXPLAIN'=23
'EXTRACT'=24
'FALSE'=25
'FORMAT'=26
'FROM'=27
'FULL'=28
'FUNCTIONS'=29
'GRAPHVIZ'=30
'GROUP'=31
'HAVING'=32
'IN'=33
'INNER'=34
'IS'=35
'JOIN'=36
'LEFT'=37
'LIKE'=38
'LIMIT'=39
'MAPPED'=40
'MATCH'=41
'NATURAL'=42
'NOT'=43
'NULL'=44
'ON'=45
'OPTIMIZED'=46
'OR'=47
'ORDER'=48
'OUTER'=49
'PARSED'=50
'PHYSICAL'=51
'PLAN'=52
'RIGHT'=53
'RLIKE'=54
'QUERY'=55
'SCHEMAS'=56
'SELECT'=57
'SHOW'=58
'SYS'=59
'TABLES'=60
'TEXT'=61
'TRUE'=62
'TYPES'=63
'USING'=64
'VERIFY'=65
'WHERE'=66
'WITH'=67
'='=68
'<'=70
'<='=71
'>'=72
'>='=73
'+'=74
'-'=75
'*'=76
'/'=77
'%'=78
'||'=79
'.'=80

View File

@ -1,169 +1,171 @@
T__0=1
T__1=2
T__2=3
ALL=4
ANALYZE=5
ANALYZED=6
AND=7
ANY=8
AS=9
ASC=10
BETWEEN=11
BY=12
CAST=13
COLUMNS=14
DEBUG=15
DESC=16
DESCRIBE=17
DISTINCT=18
ESCAPE=19
EXECUTABLE=20
EXISTS=21
EXPLAIN=22
EXTRACT=23
FALSE=24
FORMAT=25
FROM=26
FULL=27
FUNCTIONS=28
GRAPHVIZ=29
GROUP=30
HAVING=31
IN=32
INNER=33
IS=34
JOIN=35
LEFT=36
LIKE=37
LIMIT=38
MAPPED=39
MATCH=40
NATURAL=41
NOT=42
NULL=43
ON=44
OPTIMIZED=45
OR=46
ORDER=47
OUTER=48
PARSED=49
PHYSICAL=50
PLAN=51
RIGHT=52
RLIKE=53
QUERY=54
SCHEMAS=55
SELECT=56
SHOW=57
SYS=58
TABLES=59
TEXT=60
TRUE=61
TYPES=62
USING=63
VERIFY=64
WHERE=65
WITH=66
EQ=67
NEQ=68
LT=69
LTE=70
GT=71
GTE=72
PLUS=73
MINUS=74
ASTERISK=75
SLASH=76
PERCENT=77
CONCAT=78
DOT=79
STRING=80
INTEGER_VALUE=81
DECIMAL_VALUE=82
IDENTIFIER=83
DIGIT_IDENTIFIER=84
TABLE_IDENTIFIER=85
QUOTED_IDENTIFIER=86
BACKQUOTED_IDENTIFIER=87
SIMPLE_COMMENT=88
BRACKETED_COMMENT=89
WS=90
UNRECOGNIZED=91
T__3=4
ALL=5
ANALYZE=6
ANALYZED=7
AND=8
ANY=9
AS=10
ASC=11
BETWEEN=12
BY=13
CAST=14
COLUMNS=15
DEBUG=16
DESC=17
DESCRIBE=18
DISTINCT=19
ESCAPE=20
EXECUTABLE=21
EXISTS=22
EXPLAIN=23
EXTRACT=24
FALSE=25
FORMAT=26
FROM=27
FULL=28
FUNCTIONS=29
GRAPHVIZ=30
GROUP=31
HAVING=32
IN=33
INNER=34
IS=35
JOIN=36
LEFT=37
LIKE=38
LIMIT=39
MAPPED=40
MATCH=41
NATURAL=42
NOT=43
NULL=44
ON=45
OPTIMIZED=46
OR=47
ORDER=48
OUTER=49
PARSED=50
PHYSICAL=51
PLAN=52
RIGHT=53
RLIKE=54
QUERY=55
SCHEMAS=56
SELECT=57
SHOW=58
SYS=59
TABLES=60
TEXT=61
TRUE=62
TYPES=63
USING=64
VERIFY=65
WHERE=66
WITH=67
EQ=68
NEQ=69
LT=70
LTE=71
GT=72
GTE=73
PLUS=74
MINUS=75
ASTERISK=76
SLASH=77
PERCENT=78
CONCAT=79
DOT=80
STRING=81
INTEGER_VALUE=82
DECIMAL_VALUE=83
IDENTIFIER=84
DIGIT_IDENTIFIER=85
TABLE_IDENTIFIER=86
QUOTED_IDENTIFIER=87
BACKQUOTED_IDENTIFIER=88
SIMPLE_COMMENT=89
BRACKETED_COMMENT=90
WS=91
UNRECOGNIZED=92
'('=1
')'=2
','=3
'ALL'=4
'ANALYZE'=5
'ANALYZED'=6
'AND'=7
'ANY'=8
'AS'=9
'ASC'=10
'BETWEEN'=11
'BY'=12
'CAST'=13
'COLUMNS'=14
'DEBUG'=15
'DESC'=16
'DESCRIBE'=17
'DISTINCT'=18
'ESCAPE'=19
'EXECUTABLE'=20
'EXISTS'=21
'EXPLAIN'=22
'EXTRACT'=23
'FALSE'=24
'FORMAT'=25
'FROM'=26
'FULL'=27
'FUNCTIONS'=28
'GRAPHVIZ'=29
'GROUP'=30
'HAVING'=31
'IN'=32
'INNER'=33
'IS'=34
'JOIN'=35
'LEFT'=36
'LIKE'=37
'LIMIT'=38
'MAPPED'=39
'MATCH'=40
'NATURAL'=41
'NOT'=42
'NULL'=43
'ON'=44
'OPTIMIZED'=45
'OR'=46
'ORDER'=47
'OUTER'=48
'PARSED'=49
'PHYSICAL'=50
'PLAN'=51
'RIGHT'=52
'RLIKE'=53
'QUERY'=54
'SCHEMAS'=55
'SELECT'=56
'SHOW'=57
'SYS'=58
'TABLES'=59
'TEXT'=60
'TRUE'=61
'TYPES'=62
'USING'=63
'VERIFY'=64
'WHERE'=65
'WITH'=66
'='=67
'<'=69
'<='=70
'>'=71
'>='=72
'+'=73
'-'=74
'*'=75
'/'=76
'%'=77
'||'=78
'.'=79
':'=4
'ALL'=5
'ANALYZE'=6
'ANALYZED'=7
'AND'=8
'ANY'=9
'AS'=10
'ASC'=11
'BETWEEN'=12
'BY'=13
'CAST'=14
'COLUMNS'=15
'DEBUG'=16
'DESC'=17
'DESCRIBE'=18
'DISTINCT'=19
'ESCAPE'=20
'EXECUTABLE'=21
'EXISTS'=22
'EXPLAIN'=23
'EXTRACT'=24
'FALSE'=25
'FORMAT'=26
'FROM'=27
'FULL'=28
'FUNCTIONS'=29
'GRAPHVIZ'=30
'GROUP'=31
'HAVING'=32
'IN'=33
'INNER'=34
'IS'=35
'JOIN'=36
'LEFT'=37
'LIKE'=38
'LIMIT'=39
'MAPPED'=40
'MATCH'=41
'NATURAL'=42
'NOT'=43
'NULL'=44
'ON'=45
'OPTIMIZED'=46
'OR'=47
'ORDER'=48
'OUTER'=49
'PARSED'=50
'PHYSICAL'=51
'PLAN'=52
'RIGHT'=53
'RLIKE'=54
'QUERY'=55
'SCHEMAS'=56
'SELECT'=57
'SHOW'=58
'SYS'=59
'TABLES'=60
'TEXT'=61
'TRUE'=62
'TYPES'=63
'USING'=64
'VERIFY'=65
'WHERE'=66
'WITH'=67
'='=68
'<'=70
'<='=71
'>'=72
'>='=73
'+'=74
'-'=75
'*'=76
'/'=77
'%'=78
'||'=79
'.'=80

View File

@ -5,6 +5,7 @@
*/
package org.elasticsearch.xpack.sql.analysis.analyzer;
import org.elasticsearch.xpack.sql.plan.TableIdentifier;
import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan;
import org.elasticsearch.xpack.sql.plan.logical.UnresolvedRelation;
@ -22,9 +23,9 @@ public class PreAnalyzer {
public static class PreAnalysis {
public static final PreAnalysis EMPTY = new PreAnalysis(emptyList());
public final List<String> indices;
public final List<TableIdentifier> indices;
PreAnalysis(List<String> indices) {
PreAnalysis(List<TableIdentifier> indices) {
this.indices = indices;
}
}
@ -38,9 +39,9 @@ public class PreAnalyzer {
}
private PreAnalysis doPreAnalyze(LogicalPlan plan) {
List<String> indices = new ArrayList<>();
List<TableIdentifier> indices = new ArrayList<>();
plan.forEachUp(p -> indices.add(p.table().index()), UnresolvedRelation.class);
plan.forEachUp(p -> indices.add(p.table()), UnresolvedRelation.class);
// mark plan as preAnalyzed (if it were marked, there would be no analysis)
plan.forEachUp(LogicalPlan::setPreAnalyzed);

View File

@ -5,6 +5,7 @@
*/
package org.elasticsearch.xpack.sql.parser;
import org.antlr.v4.runtime.tree.ParseTree;
import org.elasticsearch.common.Strings;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.IdentifierContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.QualifiedNameContext;
@ -16,11 +17,12 @@ abstract class IdentifierBuilder extends AbstractBuilder {
@Override
public TableIdentifier visitTableIdentifier(TableIdentifierContext ctx) {
String index = ctx.getText();
Location source = source(ctx);
ParseTree tree = ctx.name != null ? ctx.name : ctx.TABLE_IDENTIFIER();
String index = tree.getText();
validateIndex(ctx.getText(), source);
return new TableIdentifier(source, index);
validateIndex(index, source);
return new TableIdentifier(source, visitIdentifier(ctx.catalog), index);
}
// see https://github.com/elastic/elasticsearch/issues/6736

View File

@ -22,27 +22,27 @@ class SqlBaseLexer extends Lexer {
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
T__0=1, T__1=2, T__2=3, ALL=4, ANALYZE=5, ANALYZED=6, AND=7, ANY=8, AS=9,
ASC=10, BETWEEN=11, BY=12, CAST=13, COLUMNS=14, DEBUG=15, DESC=16, DESCRIBE=17,
DISTINCT=18, ESCAPE=19, EXECUTABLE=20, EXISTS=21, EXPLAIN=22, EXTRACT=23,
FALSE=24, FORMAT=25, FROM=26, FULL=27, FUNCTIONS=28, GRAPHVIZ=29, GROUP=30,
HAVING=31, IN=32, INNER=33, IS=34, JOIN=35, LEFT=36, LIKE=37, LIMIT=38,
MAPPED=39, MATCH=40, NATURAL=41, NOT=42, NULL=43, ON=44, OPTIMIZED=45,
OR=46, ORDER=47, OUTER=48, PARSED=49, PHYSICAL=50, PLAN=51, RIGHT=52,
RLIKE=53, QUERY=54, SCHEMAS=55, SELECT=56, SHOW=57, SYS=58, TABLES=59,
TEXT=60, TRUE=61, TYPES=62, USING=63, VERIFY=64, WHERE=65, WITH=66, EQ=67,
NEQ=68, LT=69, LTE=70, GT=71, GTE=72, PLUS=73, MINUS=74, ASTERISK=75,
SLASH=76, PERCENT=77, CONCAT=78, DOT=79, STRING=80, INTEGER_VALUE=81,
DECIMAL_VALUE=82, IDENTIFIER=83, DIGIT_IDENTIFIER=84, TABLE_IDENTIFIER=85,
QUOTED_IDENTIFIER=86, BACKQUOTED_IDENTIFIER=87, SIMPLE_COMMENT=88, BRACKETED_COMMENT=89,
WS=90, UNRECOGNIZED=91;
T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9,
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, COLUMNS=15, DEBUG=16, DESC=17,
DESCRIBE=18, DISTINCT=19, ESCAPE=20, EXECUTABLE=21, EXISTS=22, EXPLAIN=23,
EXTRACT=24, FALSE=25, FORMAT=26, FROM=27, FULL=28, FUNCTIONS=29, GRAPHVIZ=30,
GROUP=31, HAVING=32, IN=33, INNER=34, IS=35, JOIN=36, LEFT=37, LIKE=38,
LIMIT=39, MAPPED=40, MATCH=41, NATURAL=42, NOT=43, NULL=44, ON=45, OPTIMIZED=46,
OR=47, ORDER=48, OUTER=49, PARSED=50, PHYSICAL=51, PLAN=52, RIGHT=53,
RLIKE=54, QUERY=55, SCHEMAS=56, SELECT=57, SHOW=58, SYS=59, TABLES=60,
TEXT=61, TRUE=62, TYPES=63, USING=64, VERIFY=65, WHERE=66, WITH=67, EQ=68,
NEQ=69, LT=70, LTE=71, GT=72, GTE=73, PLUS=74, MINUS=75, ASTERISK=76,
SLASH=77, PERCENT=78, CONCAT=79, DOT=80, STRING=81, INTEGER_VALUE=82,
DECIMAL_VALUE=83, IDENTIFIER=84, DIGIT_IDENTIFIER=85, TABLE_IDENTIFIER=86,
QUOTED_IDENTIFIER=87, BACKQUOTED_IDENTIFIER=88, SIMPLE_COMMENT=89, BRACKETED_COMMENT=90,
WS=91, UNRECOGNIZED=92;
public static String[] modeNames = {
"DEFAULT_MODE"
};
public static final String[] ruleNames = {
"T__0", "T__1", "T__2", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS",
"ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE",
"FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING",
"IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
@ -57,8 +57,8 @@ class SqlBaseLexer extends Lexer {
};
private static final String[] _LITERAL_NAMES = {
null, "'('", "')'", "','", "'ALL'", "'ANALYZE'", "'ANALYZED'", "'AND'",
"'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'",
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'",
"'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'",
"'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'", "'FROM'",
"'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'", "'IN'",
@ -71,8 +71,8 @@ class SqlBaseLexer extends Lexer {
"'||'", "'.'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS",
"ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE",
"FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING",
"IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
@ -140,7 +140,7 @@ class SqlBaseLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2]\u030f\b\1\4\2\t"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2^\u0313\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"+
@ -150,263 +150,264 @@ class SqlBaseLexer extends Lexer {
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\3"+
"\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+
"\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r"+
"\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
"\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22"+
"\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
"\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+
"\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+
"\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
"\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33"+
"\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35"+
"\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+
"\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"\3"+
"\"\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3"+
"\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3"+
"*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3.\3"+
".\3.\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3"+
"\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3"+
"\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3"+
"\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3"+
"8\38\38\38\38\38\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3;\3;\3;\3"+
";\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3"+
"?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3C\3C\3C\3"+
"C\3C\3D\3D\3E\3E\3E\3E\3E\3E\3E\5E\u0251\nE\3F\3F\3G\3G\3G\3H\3H\3I\3"+
"I\3I\3J\3J\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3O\3P\3P\3Q\3Q\3Q\3Q\7Q\u0270"+
"\nQ\fQ\16Q\u0273\13Q\3Q\3Q\3R\6R\u0278\nR\rR\16R\u0279\3S\6S\u027d\nS"+
"\rS\16S\u027e\3S\3S\7S\u0283\nS\fS\16S\u0286\13S\3S\3S\6S\u028a\nS\rS"+
"\16S\u028b\3S\6S\u028f\nS\rS\16S\u0290\3S\3S\7S\u0295\nS\fS\16S\u0298"+
"\13S\5S\u029a\nS\3S\3S\3S\3S\6S\u02a0\nS\rS\16S\u02a1\3S\3S\5S\u02a6\n"+
"S\3T\3T\5T\u02aa\nT\3T\3T\3T\7T\u02af\nT\fT\16T\u02b2\13T\3U\3U\3U\3U"+
"\6U\u02b8\nU\rU\16U\u02b9\3V\3V\3V\3V\6V\u02c0\nV\rV\16V\u02c1\3W\3W\3"+
"W\3W\7W\u02c8\nW\fW\16W\u02cb\13W\3W\3W\3X\3X\3X\3X\7X\u02d3\nX\fX\16"+
"X\u02d6\13X\3X\3X\3Y\3Y\5Y\u02dc\nY\3Y\6Y\u02df\nY\rY\16Y\u02e0\3Z\3Z"+
"\3[\3[\3\\\3\\\3\\\3\\\7\\\u02eb\n\\\f\\\16\\\u02ee\13\\\3\\\5\\\u02f1"+
"\n\\\3\\\5\\\u02f4\n\\\3\\\3\\\3]\3]\3]\3]\3]\7]\u02fd\n]\f]\16]\u0300"+
"\13]\3]\3]\3]\3]\3]\3^\6^\u0308\n^\r^\16^\u0309\3^\3^\3_\3_\3\u02fe\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!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
"= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+
"9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+
"\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
"R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1\2\u00b3\2\u00b5"+
"\2\u00b7Z\u00b9[\u00bb\\\u00bd]\3\2\f\3\2))\4\2BBaa\5\2<<BBaa\3\2$$\3"+
"\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u0331\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\2!\3\2\2\2\2#\3\2\2\2"+
"\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2"+
"\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2"+
"\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2"+
"I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3"+
"\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2"+
"\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2"+
"o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3"+
"\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085"+
"\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2"+
"\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
"\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b7\3\2\2"+
"\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\3\u00bf\3\2\2\2\5\u00c1"+
"\3\2\2\2\7\u00c3\3\2\2\2\t\u00c5\3\2\2\2\13\u00c9\3\2\2\2\r\u00d1\3\2"+
"\2\2\17\u00da\3\2\2\2\21\u00de\3\2\2\2\23\u00e2\3\2\2\2\25\u00e5\3\2\2"+
"\2\27\u00e9\3\2\2\2\31\u00f1\3\2\2\2\33\u00f4\3\2\2\2\35\u00f9\3\2\2\2"+
"\37\u0101\3\2\2\2!\u0107\3\2\2\2#\u010c\3\2\2\2%\u0115\3\2\2\2\'\u011e"+
"\3\2\2\2)\u0125\3\2\2\2+\u0130\3\2\2\2-\u0137\3\2\2\2/\u013f\3\2\2\2\61"+
"\u0147\3\2\2\2\63\u014d\3\2\2\2\65\u0154\3\2\2\2\67\u0159\3\2\2\29\u015e"+
"\3\2\2\2;\u0168\3\2\2\2=\u0171\3\2\2\2?\u0177\3\2\2\2A\u017e\3\2\2\2C"+
"\u0181\3\2\2\2E\u0187\3\2\2\2G\u018a\3\2\2\2I\u018f\3\2\2\2K\u0194\3\2"+
"\2\2M\u0199\3\2\2\2O\u019f\3\2\2\2Q\u01a6\3\2\2\2S\u01ac\3\2\2\2U\u01b4"+
"\3\2\2\2W\u01b8\3\2\2\2Y\u01bd\3\2\2\2[\u01c0\3\2\2\2]\u01ca\3\2\2\2_"+
"\u01cd\3\2\2\2a\u01d3\3\2\2\2c\u01d9\3\2\2\2e\u01e0\3\2\2\2g\u01e9\3\2"+
"\2\2i\u01ee\3\2\2\2k\u01f4\3\2\2\2m\u01fa\3\2\2\2o\u0200\3\2\2\2q\u0208"+
"\3\2\2\2s\u020f\3\2\2\2u\u0214\3\2\2\2w\u0218\3\2\2\2y\u021f\3\2\2\2{"+
"\u0224\3\2\2\2}\u0229\3\2\2\2\177\u022f\3\2\2\2\u0081\u0235\3\2\2\2\u0083"+
"\u023c\3\2\2\2\u0085\u0242\3\2\2\2\u0087\u0247\3\2\2\2\u0089\u0250\3\2"+
"\2\2\u008b\u0252\3\2\2\2\u008d\u0254\3\2\2\2\u008f\u0257\3\2\2\2\u0091"+
"\u0259\3\2\2\2\u0093\u025c\3\2\2\2\u0095\u025e\3\2\2\2\u0097\u0260\3\2"+
"\2\2\u0099\u0262\3\2\2\2\u009b\u0264\3\2\2\2\u009d\u0266\3\2\2\2\u009f"+
"\u0269\3\2\2\2\u00a1\u026b\3\2\2\2\u00a3\u0277\3\2\2\2\u00a5\u02a5\3\2"+
"\2\2\u00a7\u02a9\3\2\2\2\u00a9\u02b3\3\2\2\2\u00ab\u02bf\3\2\2\2\u00ad"+
"\u02c3\3\2\2\2\u00af\u02ce\3\2\2\2\u00b1\u02d9\3\2\2\2\u00b3\u02e2\3\2"+
"\2\2\u00b5\u02e4\3\2\2\2\u00b7\u02e6\3\2\2\2\u00b9\u02f7\3\2\2\2\u00bb"+
"\u0307\3\2\2\2\u00bd\u030d\3\2\2\2\u00bf\u00c0\7*\2\2\u00c0\4\3\2\2\2"+
"\u00c1\u00c2\7+\2\2\u00c2\6\3\2\2\2\u00c3\u00c4\7.\2\2\u00c4\b\3\2\2\2"+
"\u00c5\u00c6\7C\2\2\u00c6\u00c7\7N\2\2\u00c7\u00c8\7N\2\2\u00c8\n\3\2"+
"\2\2\u00c9\u00ca\7C\2\2\u00ca\u00cb\7P\2\2\u00cb\u00cc\7C\2\2\u00cc\u00cd"+
"\7N\2\2\u00cd\u00ce\7[\2\2\u00ce\u00cf\7\\\2\2\u00cf\u00d0\7G\2\2\u00d0"+
"\f\3\2\2\2\u00d1\u00d2\7C\2\2\u00d2\u00d3\7P\2\2\u00d3\u00d4\7C\2\2\u00d4"+
"\u00d5\7N\2\2\u00d5\u00d6\7[\2\2\u00d6\u00d7\7\\\2\2\u00d7\u00d8\7G\2"+
"\2\u00d8\u00d9\7F\2\2\u00d9\16\3\2\2\2\u00da\u00db\7C\2\2\u00db\u00dc"+
"\7P\2\2\u00dc\u00dd\7F\2\2\u00dd\20\3\2\2\2\u00de\u00df\7C\2\2\u00df\u00e0"+
"\7P\2\2\u00e0\u00e1\7[\2\2\u00e1\22\3\2\2\2\u00e2\u00e3\7C\2\2\u00e3\u00e4"+
"\7U\2\2\u00e4\24\3\2\2\2\u00e5\u00e6\7C\2\2\u00e6\u00e7\7U\2\2\u00e7\u00e8"+
"\7E\2\2\u00e8\26\3\2\2\2\u00e9\u00ea\7D\2\2\u00ea\u00eb\7G\2\2\u00eb\u00ec"+
"\7V\2\2\u00ec\u00ed\7Y\2\2\u00ed\u00ee\7G\2\2\u00ee\u00ef\7G\2\2\u00ef"+
"\u00f0\7P\2\2\u00f0\30\3\2\2\2\u00f1\u00f2\7D\2\2\u00f2\u00f3\7[\2\2\u00f3"+
"\32\3\2\2\2\u00f4\u00f5\7E\2\2\u00f5\u00f6\7C\2\2\u00f6\u00f7\7U\2\2\u00f7"+
"\u00f8\7V\2\2\u00f8\34\3\2\2\2\u00f9\u00fa\7E\2\2\u00fa\u00fb\7Q\2\2\u00fb"+
"\u00fc\7N\2\2\u00fc\u00fd\7W\2\2\u00fd\u00fe\7O\2\2\u00fe\u00ff\7P\2\2"+
"\u00ff\u0100\7U\2\2\u0100\36\3\2\2\2\u0101\u0102\7F\2\2\u0102\u0103\7"+
"G\2\2\u0103\u0104\7D\2\2\u0104\u0105\7W\2\2\u0105\u0106\7I\2\2\u0106 "+
"\3\2\2\2\u0107\u0108\7F\2\2\u0108\u0109\7G\2\2\u0109\u010a\7U\2\2\u010a"+
"\u010b\7E\2\2\u010b\"\3\2\2\2\u010c\u010d\7F\2\2\u010d\u010e\7G\2\2\u010e"+
"\u010f\7U\2\2\u010f\u0110\7E\2\2\u0110\u0111\7T\2\2\u0111\u0112\7K\2\2"+
"\u0112\u0113\7D\2\2\u0113\u0114\7G\2\2\u0114$\3\2\2\2\u0115\u0116\7F\2"+
"\2\u0116\u0117\7K\2\2\u0117\u0118\7U\2\2\u0118\u0119\7V\2\2\u0119\u011a"+
"\7K\2\2\u011a\u011b\7P\2\2\u011b\u011c\7E\2\2\u011c\u011d\7V\2\2\u011d"+
"&\3\2\2\2\u011e\u011f\7G\2\2\u011f\u0120\7U\2\2\u0120\u0121\7E\2\2\u0121"+
"\u0122\7C\2\2\u0122\u0123\7R\2\2\u0123\u0124\7G\2\2\u0124(\3\2\2\2\u0125"+
"\u0126\7G\2\2\u0126\u0127\7Z\2\2\u0127\u0128\7G\2\2\u0128\u0129\7E\2\2"+
"\u0129\u012a\7W\2\2\u012a\u012b\7V\2\2\u012b\u012c\7C\2\2\u012c\u012d"+
"\7D\2\2\u012d\u012e\7N\2\2\u012e\u012f\7G\2\2\u012f*\3\2\2\2\u0130\u0131"+
"\7G\2\2\u0131\u0132\7Z\2\2\u0132\u0133\7K\2\2\u0133\u0134\7U\2\2\u0134"+
"\u0135\7V\2\2\u0135\u0136\7U\2\2\u0136,\3\2\2\2\u0137\u0138\7G\2\2\u0138"+
"\u0139\7Z\2\2\u0139\u013a\7R\2\2\u013a\u013b\7N\2\2\u013b\u013c\7C\2\2"+
"\u013c\u013d\7K\2\2\u013d\u013e\7P\2\2\u013e.\3\2\2\2\u013f\u0140\7G\2"+
"\2\u0140\u0141\7Z\2\2\u0141\u0142\7V\2\2\u0142\u0143\7T\2\2\u0143\u0144"+
"\7C\2\2\u0144\u0145\7E\2\2\u0145\u0146\7V\2\2\u0146\60\3\2\2\2\u0147\u0148"+
"\7H\2\2\u0148\u0149\7C\2\2\u0149\u014a\7N\2\2\u014a\u014b\7U\2\2\u014b"+
"\u014c\7G\2\2\u014c\62\3\2\2\2\u014d\u014e\7H\2\2\u014e\u014f\7Q\2\2\u014f"+
"\u0150\7T\2\2\u0150\u0151\7O\2\2\u0151\u0152\7C\2\2\u0152\u0153\7V\2\2"+
"\u0153\64\3\2\2\2\u0154\u0155\7H\2\2\u0155\u0156\7T\2\2\u0156\u0157\7"+
"Q\2\2\u0157\u0158\7O\2\2\u0158\66\3\2\2\2\u0159\u015a\7H\2\2\u015a\u015b"+
"\7W\2\2\u015b\u015c\7N\2\2\u015c\u015d\7N\2\2\u015d8\3\2\2\2\u015e\u015f"+
"\7H\2\2\u015f\u0160\7W\2\2\u0160\u0161\7P\2\2\u0161\u0162\7E\2\2\u0162"+
"\u0163\7V\2\2\u0163\u0164\7K\2\2\u0164\u0165\7Q\2\2\u0165\u0166\7P\2\2"+
"\u0166\u0167\7U\2\2\u0167:\3\2\2\2\u0168\u0169\7I\2\2\u0169\u016a\7T\2"+
"\2\u016a\u016b\7C\2\2\u016b\u016c\7R\2\2\u016c\u016d\7J\2\2\u016d\u016e"+
"\7X\2\2\u016e\u016f\7K\2\2\u016f\u0170\7\\\2\2\u0170<\3\2\2\2\u0171\u0172"+
"\7I\2\2\u0172\u0173\7T\2\2\u0173\u0174\7Q\2\2\u0174\u0175\7W\2\2\u0175"+
"\u0176\7R\2\2\u0176>\3\2\2\2\u0177\u0178\7J\2\2\u0178\u0179\7C\2\2\u0179"+
"\u017a\7X\2\2\u017a\u017b\7K\2\2\u017b\u017c\7P\2\2\u017c\u017d\7I\2\2"+
"\u017d@\3\2\2\2\u017e\u017f\7K\2\2\u017f\u0180\7P\2\2\u0180B\3\2\2\2\u0181"+
"\u0182\7K\2\2\u0182\u0183\7P\2\2\u0183\u0184\7P\2\2\u0184\u0185\7G\2\2"+
"\u0185\u0186\7T\2\2\u0186D\3\2\2\2\u0187\u0188\7K\2\2\u0188\u0189\7U\2"+
"\2\u0189F\3\2\2\2\u018a\u018b\7L\2\2\u018b\u018c\7Q\2\2\u018c\u018d\7"+
"K\2\2\u018d\u018e\7P\2\2\u018eH\3\2\2\2\u018f\u0190\7N\2\2\u0190\u0191"+
"\7G\2\2\u0191\u0192\7H\2\2\u0192\u0193\7V\2\2\u0193J\3\2\2\2\u0194\u0195"+
"\7N\2\2\u0195\u0196\7K\2\2\u0196\u0197\7M\2\2\u0197\u0198\7G\2\2\u0198"+
"L\3\2\2\2\u0199\u019a\7N\2\2\u019a\u019b\7K\2\2\u019b\u019c\7O\2\2\u019c"+
"\u019d\7K\2\2\u019d\u019e\7V\2\2\u019eN\3\2\2\2\u019f\u01a0\7O\2\2\u01a0"+
"\u01a1\7C\2\2\u01a1\u01a2\7R\2\2\u01a2\u01a3\7R\2\2\u01a3\u01a4\7G\2\2"+
"\u01a4\u01a5\7F\2\2\u01a5P\3\2\2\2\u01a6\u01a7\7O\2\2\u01a7\u01a8\7C\2"+
"\2\u01a8\u01a9\7V\2\2\u01a9\u01aa\7E\2\2\u01aa\u01ab\7J\2\2\u01abR\3\2"+
"\2\2\u01ac\u01ad\7P\2\2\u01ad\u01ae\7C\2\2\u01ae\u01af\7V\2\2\u01af\u01b0"+
"\7W\2\2\u01b0\u01b1\7T\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7N\2\2\u01b3"+
"T\3\2\2\2\u01b4\u01b5\7P\2\2\u01b5\u01b6\7Q\2\2\u01b6\u01b7\7V\2\2\u01b7"+
"V\3\2\2\2\u01b8\u01b9\7P\2\2\u01b9\u01ba\7W\2\2\u01ba\u01bb\7N\2\2\u01bb"+
"\u01bc\7N\2\2\u01bcX\3\2\2\2\u01bd\u01be\7Q\2\2\u01be\u01bf\7P\2\2\u01bf"+
"Z\3\2\2\2\u01c0\u01c1\7Q\2\2\u01c1\u01c2\7R\2\2\u01c2\u01c3\7V\2\2\u01c3"+
"\u01c4\7K\2\2\u01c4\u01c5\7O\2\2\u01c5\u01c6\7K\2\2\u01c6\u01c7\7\\\2"+
"\2\u01c7\u01c8\7G\2\2\u01c8\u01c9\7F\2\2\u01c9\\\3\2\2\2\u01ca\u01cb\7"+
"Q\2\2\u01cb\u01cc\7T\2\2\u01cc^\3\2\2\2\u01cd\u01ce\7Q\2\2\u01ce\u01cf"+
"\7T\2\2\u01cf\u01d0\7F\2\2\u01d0\u01d1\7G\2\2\u01d1\u01d2\7T\2\2\u01d2"+
"`\3\2\2\2\u01d3\u01d4\7Q\2\2\u01d4\u01d5\7W\2\2\u01d5\u01d6\7V\2\2\u01d6"+
"\u01d7\7G\2\2\u01d7\u01d8\7T\2\2\u01d8b\3\2\2\2\u01d9\u01da\7R\2\2\u01da"+
"\u01db\7C\2\2\u01db\u01dc\7T\2\2\u01dc\u01dd\7U\2\2\u01dd\u01de\7G\2\2"+
"\u01de\u01df\7F\2\2\u01dfd\3\2\2\2\u01e0\u01e1\7R\2\2\u01e1\u01e2\7J\2"+
"\2\u01e2\u01e3\7[\2\2\u01e3\u01e4\7U\2\2\u01e4\u01e5\7K\2\2\u01e5\u01e6"+
"\7E\2\2\u01e6\u01e7\7C\2\2\u01e7\u01e8\7N\2\2\u01e8f\3\2\2\2\u01e9\u01ea"+
"\7R\2\2\u01ea\u01eb\7N\2\2\u01eb\u01ec\7C\2\2\u01ec\u01ed\7P\2\2\u01ed"+
"h\3\2\2\2\u01ee\u01ef\7T\2\2\u01ef\u01f0\7K\2\2\u01f0\u01f1\7I\2\2\u01f1"+
"\u01f2\7J\2\2\u01f2\u01f3\7V\2\2\u01f3j\3\2\2\2\u01f4\u01f5\7T\2\2\u01f5"+
"\u01f6\7N\2\2\u01f6\u01f7\7K\2\2\u01f7\u01f8\7M\2\2\u01f8\u01f9\7G\2\2"+
"\u01f9l\3\2\2\2\u01fa\u01fb\7S\2\2\u01fb\u01fc\7W\2\2\u01fc\u01fd\7G\2"+
"\2\u01fd\u01fe\7T\2\2\u01fe\u01ff\7[\2\2\u01ffn\3\2\2\2\u0200\u0201\7"+
"U\2\2\u0201\u0202\7E\2\2\u0202\u0203\7J\2\2\u0203\u0204\7G\2\2\u0204\u0205"+
"\7O\2\2\u0205\u0206\7C\2\2\u0206\u0207\7U\2\2\u0207p\3\2\2\2\u0208\u0209"+
"\7U\2\2\u0209\u020a\7G\2\2\u020a\u020b\7N\2\2\u020b\u020c\7G\2\2\u020c"+
"\u020d\7E\2\2\u020d\u020e\7V\2\2\u020er\3\2\2\2\u020f\u0210\7U\2\2\u0210"+
"\u0211\7J\2\2\u0211\u0212\7Q\2\2\u0212\u0213\7Y\2\2\u0213t\3\2\2\2\u0214"+
"\u0215\7U\2\2\u0215\u0216\7[\2\2\u0216\u0217\7U\2\2\u0217v\3\2\2\2\u0218"+
"\u0219\7V\2\2\u0219\u021a\7C\2\2\u021a\u021b\7D\2\2\u021b\u021c\7N\2\2"+
"\u021c\u021d\7G\2\2\u021d\u021e\7U\2\2\u021ex\3\2\2\2\u021f\u0220\7V\2"+
"\2\u0220\u0221\7G\2\2\u0221\u0222\7Z\2\2\u0222\u0223\7V\2\2\u0223z\3\2"+
"\2\2\u0224\u0225\7V\2\2\u0225\u0226\7T\2\2\u0226\u0227\7W\2\2\u0227\u0228"+
"\7G\2\2\u0228|\3\2\2\2\u0229\u022a\7V\2\2\u022a\u022b\7[\2\2\u022b\u022c"+
"\7R\2\2\u022c\u022d\7G\2\2\u022d\u022e\7U\2\2\u022e~\3\2\2\2\u022f\u0230"+
"\7W\2\2\u0230\u0231\7U\2\2\u0231\u0232\7K\2\2\u0232\u0233\7P\2\2\u0233"+
"\u0234\7I\2\2\u0234\u0080\3\2\2\2\u0235\u0236\7X\2\2\u0236\u0237\7G\2"+
"\2\u0237\u0238\7T\2\2\u0238\u0239\7K\2\2\u0239\u023a\7H\2\2\u023a\u023b"+
"\7[\2\2\u023b\u0082\3\2\2\2\u023c\u023d\7Y\2\2\u023d\u023e\7J\2\2\u023e"+
"\u023f\7G\2\2\u023f\u0240\7T\2\2\u0240\u0241\7G\2\2\u0241\u0084\3\2\2"+
"\2\u0242\u0243\7Y\2\2\u0243\u0244\7K\2\2\u0244\u0245\7V\2\2\u0245\u0246"+
"\7J\2\2\u0246\u0086\3\2\2\2\u0247\u0248\7?\2\2\u0248\u0088\3\2\2\2\u0249"+
"\u024a\7>\2\2\u024a\u0251\7@\2\2\u024b\u024c\7#\2\2\u024c\u0251\7?\2\2"+
"\u024d\u024e\7>\2\2\u024e\u024f\7?\2\2\u024f\u0251\7@\2\2\u0250\u0249"+
"\3\2\2\2\u0250\u024b\3\2\2\2\u0250\u024d\3\2\2\2\u0251\u008a\3\2\2\2\u0252"+
"\u0253\7>\2\2\u0253\u008c\3\2\2\2\u0254\u0255\7>\2\2\u0255\u0256\7?\2"+
"\2\u0256\u008e\3\2\2\2\u0257\u0258\7@\2\2\u0258\u0090\3\2\2\2\u0259\u025a"+
"\7@\2\2\u025a\u025b\7?\2\2\u025b\u0092\3\2\2\2\u025c\u025d\7-\2\2\u025d"+
"\u0094\3\2\2\2\u025e\u025f\7/\2\2\u025f\u0096\3\2\2\2\u0260\u0261\7,\2"+
"\2\u0261\u0098\3\2\2\2\u0262\u0263\7\61\2\2\u0263\u009a\3\2\2\2\u0264"+
"\u0265\7\'\2\2\u0265\u009c\3\2\2\2\u0266\u0267\7~\2\2\u0267\u0268\7~\2"+
"\2\u0268\u009e\3\2\2\2\u0269\u026a\7\60\2\2\u026a\u00a0\3\2\2\2\u026b"+
"\u0271\7)\2\2\u026c\u0270\n\2\2\2\u026d\u026e\7)\2\2\u026e\u0270\7)\2"+
"\2\u026f\u026c\3\2\2\2\u026f\u026d\3\2\2\2\u0270\u0273\3\2\2\2\u0271\u026f"+
"\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0274\3\2\2\2\u0273\u0271\3\2\2\2\u0274"+
"\u0275\7)\2\2\u0275\u00a2\3\2\2\2\u0276\u0278\5\u00b3Z\2\u0277\u0276\3"+
"\2\2\2\u0278\u0279\3\2\2\2\u0279\u0277\3\2\2\2\u0279\u027a\3\2\2\2\u027a"+
"\u00a4\3\2\2\2\u027b\u027d\5\u00b3Z\2\u027c\u027b\3\2\2\2\u027d\u027e"+
"\3\2\2\2\u027e\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u0280\3\2\2\2\u0280"+
"\u0284\5\u009fP\2\u0281\u0283\5\u00b3Z\2\u0282\u0281\3\2\2\2\u0283\u0286"+
"\3\2\2\2\u0284\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u02a6\3\2\2\2\u0286"+
"\u0284\3\2\2\2\u0287\u0289\5\u009fP\2\u0288\u028a\5\u00b3Z\2\u0289\u0288"+
"\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c"+
"\u02a6\3\2\2\2\u028d\u028f\5\u00b3Z\2\u028e\u028d\3\2\2\2\u028f\u0290"+
"\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0299\3\2\2\2\u0292"+
"\u0296\5\u009fP\2\u0293\u0295\5\u00b3Z\2\u0294\u0293\3\2\2\2\u0295\u0298"+
"\3\2\2\2\u0296\u0294\3\2\2\2\u0296\u0297\3\2\2\2\u0297\u029a\3\2\2\2\u0298"+
"\u0296\3\2\2\2\u0299\u0292\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029b\3\2"+
"\2\2\u029b\u029c\5\u00b1Y\2\u029c\u02a6\3\2\2\2\u029d\u029f\5\u009fP\2"+
"\u029e\u02a0\5\u00b3Z\2\u029f\u029e\3\2\2\2\u02a0\u02a1\3\2\2\2\u02a1"+
"\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\5\u00b1"+
"Y\2\u02a4\u02a6\3\2\2\2\u02a5\u027c\3\2\2\2\u02a5\u0287\3\2\2\2\u02a5"+
"\u028e\3\2\2\2\u02a5\u029d\3\2\2\2\u02a6\u00a6\3\2\2\2\u02a7\u02aa\5\u00b5"+
"[\2\u02a8\u02aa\7a\2\2\u02a9\u02a7\3\2\2\2\u02a9\u02a8\3\2\2\2\u02aa\u02b0"+
"\3\2\2\2\u02ab\u02af\5\u00b5[\2\u02ac\u02af\5\u00b3Z\2\u02ad\u02af\t\3"+
"\2\2\u02ae\u02ab\3\2\2\2\u02ae\u02ac\3\2\2\2\u02ae\u02ad\3\2\2\2\u02af"+
"\u02b2\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u00a8\3\2"+
"\2\2\u02b2\u02b0\3\2\2\2\u02b3\u02b7\5\u00b3Z\2\u02b4\u02b8\5\u00b5[\2"+
"\u02b5\u02b8\5\u00b3Z\2\u02b6\u02b8\t\4\2\2\u02b7\u02b4\3\2\2\2\u02b7"+
"\u02b5\3\2\2\2\u02b7\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02b7\3\2"+
"\2\2\u02b9\u02ba\3\2\2\2\u02ba\u00aa\3\2\2\2\u02bb\u02c0\5\u00b5[\2\u02bc"+
"\u02c0\5\u00b3Z\2\u02bd\u02c0\t\3\2\2\u02be\u02c0\5\u0097L\2\u02bf\u02bb"+
"\3\2\2\2\u02bf\u02bc\3\2\2\2\u02bf\u02bd\3\2\2\2\u02bf\u02be\3\2\2\2\u02c0"+
"\u02c1\3\2\2\2\u02c1\u02bf\3\2\2\2\u02c1\u02c2\3\2\2\2\u02c2\u00ac\3\2"+
"\2\2\u02c3\u02c9\7$\2\2\u02c4\u02c8\n\5\2\2\u02c5\u02c6\7$\2\2\u02c6\u02c8"+
"\7$\2\2\u02c7\u02c4\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9"+
"\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2"+
"\2\2\u02cc\u02cd\7$\2\2\u02cd\u00ae\3\2\2\2\u02ce\u02d4\7b\2\2\u02cf\u02d3"+
"\n\6\2\2\u02d0\u02d1\7b\2\2\u02d1\u02d3\7b\2\2\u02d2\u02cf\3\2\2\2\u02d2"+
"\u02d0\3\2\2\2\u02d3\u02d6\3\2\2\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2"+
"\2\2\u02d5\u02d7\3\2\2\2\u02d6\u02d4\3\2\2\2\u02d7\u02d8\7b\2\2\u02d8"+
"\u00b0\3\2\2\2\u02d9\u02db\7G\2\2\u02da\u02dc\t\7\2\2\u02db\u02da\3\2"+
"\2\2\u02db\u02dc\3\2\2\2\u02dc\u02de\3\2\2\2\u02dd\u02df\5\u00b3Z\2\u02de"+
"\u02dd\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02de\3\2\2\2\u02e0\u02e1\3\2"+
"\2\2\u02e1\u00b2\3\2\2\2\u02e2\u02e3\t\b\2\2\u02e3\u00b4\3\2\2\2\u02e4"+
"\u02e5\t\t\2\2\u02e5\u00b6\3\2\2\2\u02e6\u02e7\7/\2\2\u02e7\u02e8\7/\2"+
"\2\u02e8\u02ec\3\2\2\2\u02e9\u02eb\n\n\2\2\u02ea\u02e9\3\2\2\2\u02eb\u02ee"+
"\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee"+
"\u02ec\3\2\2\2\u02ef\u02f1\7\17\2\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3"+
"\2\2\2\u02f1\u02f3\3\2\2\2\u02f2\u02f4\7\f\2\2\u02f3\u02f2\3\2\2\2\u02f3"+
"\u02f4\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b\\\2\2\u02f6\u00b8\3\2"+
"\2\2\u02f7\u02f8\7\61\2\2\u02f8\u02f9\7,\2\2\u02f9\u02fe\3\2\2\2\u02fa"+
"\u02fd\5\u00b9]\2\u02fb\u02fd\13\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fb"+
"\3\2\2\2\u02fd\u0300\3\2\2\2\u02fe\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff"+
"\u0301\3\2\2\2\u0300\u02fe\3\2\2\2\u0301\u0302\7,\2\2\u0302\u0303\7\61"+
"\2\2\u0303\u0304\3\2\2\2\u0304\u0305\b]\2\2\u0305\u00ba\3\2\2\2\u0306"+
"\u0308\t\13\2\2\u0307\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3"+
"\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\b^\2\2\u030c"+
"\u00bc\3\2\2\2\u030d\u030e\13\2\2\2\u030e\u00be\3\2\2\2\"\2\u0250\u026f"+
"\u0271\u0279\u027e\u0284\u028b\u0290\u0296\u0299\u02a1\u02a5\u02a9\u02ae"+
"\u02b0\u02b7\u02b9\u02bf\u02c1\u02c7\u02c9\u02d2\u02d4\u02db\u02e0\u02ec"+
"\u02f0\u02f3\u02fc\u02fe\u0309\3\2\3\2";
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
"`\t`\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n"+
"\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+
"\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22"+
"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+
"\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+
"\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
"\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33"+
"\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36"+
"\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37"+
"\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#"+
"\3#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'"+
"\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3"+
"+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3/\3/\3/\3/\3/\3"+
"/\3/\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+
"\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+
"\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+
"\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\39\39\3"+
"9\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3"+
"=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3"+
"A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3"+
"E\3E\3F\3F\3F\3F\3F\3F\3F\5F\u0255\nF\3G\3G\3H\3H\3H\3I\3I\3J\3J\3J\3"+
"K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3R\3R\3R\3R\7R\u0274\nR\f"+
"R\16R\u0277\13R\3R\3R\3S\6S\u027c\nS\rS\16S\u027d\3T\6T\u0281\nT\rT\16"+
"T\u0282\3T\3T\7T\u0287\nT\fT\16T\u028a\13T\3T\3T\6T\u028e\nT\rT\16T\u028f"+
"\3T\6T\u0293\nT\rT\16T\u0294\3T\3T\7T\u0299\nT\fT\16T\u029c\13T\5T\u029e"+
"\nT\3T\3T\3T\3T\6T\u02a4\nT\rT\16T\u02a5\3T\3T\5T\u02aa\nT\3U\3U\5U\u02ae"+
"\nU\3U\3U\3U\7U\u02b3\nU\fU\16U\u02b6\13U\3V\3V\3V\3V\6V\u02bc\nV\rV\16"+
"V\u02bd\3W\3W\3W\3W\6W\u02c4\nW\rW\16W\u02c5\3X\3X\3X\3X\7X\u02cc\nX\f"+
"X\16X\u02cf\13X\3X\3X\3Y\3Y\3Y\3Y\7Y\u02d7\nY\fY\16Y\u02da\13Y\3Y\3Y\3"+
"Z\3Z\5Z\u02e0\nZ\3Z\6Z\u02e3\nZ\rZ\16Z\u02e4\3[\3[\3\\\3\\\3]\3]\3]\3"+
"]\7]\u02ef\n]\f]\16]\u02f2\13]\3]\5]\u02f5\n]\3]\5]\u02f8\n]\3]\3]\3^"+
"\3^\3^\3^\3^\7^\u0301\n^\f^\16^\u0304\13^\3^\3^\3^\3^\3^\3_\6_\u030c\n"+
"_\r_\16_\u030d\3_\3_\3`\3`\3\u0302\2a\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!\22#\23%\24\'\25)\26+\27-\30"+
"/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+
"/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083"+
"C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+
"M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+
"W\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7\2\u00b9[\u00bb\\\u00bd]\u00bf"+
"^\3\2\f\3\2))\4\2BBaa\5\2<<BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2"+
"\f\f\17\17\5\2\13\f\17\17\"\"\u0335\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\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+
"\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+
"\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+
"\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+
"\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2["+
"\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+
"\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2"+
"\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2"+
"\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089"+
"\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+
"\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b"+
"\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2"+
"\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad"+
"\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2"+
"\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\3\u00c1\3\2\2\2\5\u00c3\3\2\2\2\7\u00c5"+
"\3\2\2\2\t\u00c7\3\2\2\2\13\u00c9\3\2\2\2\r\u00cd\3\2\2\2\17\u00d5\3\2"+
"\2\2\21\u00de\3\2\2\2\23\u00e2\3\2\2\2\25\u00e6\3\2\2\2\27\u00e9\3\2\2"+
"\2\31\u00ed\3\2\2\2\33\u00f5\3\2\2\2\35\u00f8\3\2\2\2\37\u00fd\3\2\2\2"+
"!\u0105\3\2\2\2#\u010b\3\2\2\2%\u0110\3\2\2\2\'\u0119\3\2\2\2)\u0122\3"+
"\2\2\2+\u0129\3\2\2\2-\u0134\3\2\2\2/\u013b\3\2\2\2\61\u0143\3\2\2\2\63"+
"\u014b\3\2\2\2\65\u0151\3\2\2\2\67\u0158\3\2\2\29\u015d\3\2\2\2;\u0162"+
"\3\2\2\2=\u016c\3\2\2\2?\u0175\3\2\2\2A\u017b\3\2\2\2C\u0182\3\2\2\2E"+
"\u0185\3\2\2\2G\u018b\3\2\2\2I\u018e\3\2\2\2K\u0193\3\2\2\2M\u0198\3\2"+
"\2\2O\u019d\3\2\2\2Q\u01a3\3\2\2\2S\u01aa\3\2\2\2U\u01b0\3\2\2\2W\u01b8"+
"\3\2\2\2Y\u01bc\3\2\2\2[\u01c1\3\2\2\2]\u01c4\3\2\2\2_\u01ce\3\2\2\2a"+
"\u01d1\3\2\2\2c\u01d7\3\2\2\2e\u01dd\3\2\2\2g\u01e4\3\2\2\2i\u01ed\3\2"+
"\2\2k\u01f2\3\2\2\2m\u01f8\3\2\2\2o\u01fe\3\2\2\2q\u0204\3\2\2\2s\u020c"+
"\3\2\2\2u\u0213\3\2\2\2w\u0218\3\2\2\2y\u021c\3\2\2\2{\u0223\3\2\2\2}"+
"\u0228\3\2\2\2\177\u022d\3\2\2\2\u0081\u0233\3\2\2\2\u0083\u0239\3\2\2"+
"\2\u0085\u0240\3\2\2\2\u0087\u0246\3\2\2\2\u0089\u024b\3\2\2\2\u008b\u0254"+
"\3\2\2\2\u008d\u0256\3\2\2\2\u008f\u0258\3\2\2\2\u0091\u025b\3\2\2\2\u0093"+
"\u025d\3\2\2\2\u0095\u0260\3\2\2\2\u0097\u0262\3\2\2\2\u0099\u0264\3\2"+
"\2\2\u009b\u0266\3\2\2\2\u009d\u0268\3\2\2\2\u009f\u026a\3\2\2\2\u00a1"+
"\u026d\3\2\2\2\u00a3\u026f\3\2\2\2\u00a5\u027b\3\2\2\2\u00a7\u02a9\3\2"+
"\2\2\u00a9\u02ad\3\2\2\2\u00ab\u02b7\3\2\2\2\u00ad\u02c3\3\2\2\2\u00af"+
"\u02c7\3\2\2\2\u00b1\u02d2\3\2\2\2\u00b3\u02dd\3\2\2\2\u00b5\u02e6\3\2"+
"\2\2\u00b7\u02e8\3\2\2\2\u00b9\u02ea\3\2\2\2\u00bb\u02fb\3\2\2\2\u00bd"+
"\u030b\3\2\2\2\u00bf\u0311\3\2\2\2\u00c1\u00c2\7*\2\2\u00c2\4\3\2\2\2"+
"\u00c3\u00c4\7+\2\2\u00c4\6\3\2\2\2\u00c5\u00c6\7.\2\2\u00c6\b\3\2\2\2"+
"\u00c7\u00c8\7<\2\2\u00c8\n\3\2\2\2\u00c9\u00ca\7C\2\2\u00ca\u00cb\7N"+
"\2\2\u00cb\u00cc\7N\2\2\u00cc\f\3\2\2\2\u00cd\u00ce\7C\2\2\u00ce\u00cf"+
"\7P\2\2\u00cf\u00d0\7C\2\2\u00d0\u00d1\7N\2\2\u00d1\u00d2\7[\2\2\u00d2"+
"\u00d3\7\\\2\2\u00d3\u00d4\7G\2\2\u00d4\16\3\2\2\2\u00d5\u00d6\7C\2\2"+
"\u00d6\u00d7\7P\2\2\u00d7\u00d8\7C\2\2\u00d8\u00d9\7N\2\2\u00d9\u00da"+
"\7[\2\2\u00da\u00db\7\\\2\2\u00db\u00dc\7G\2\2\u00dc\u00dd\7F\2\2\u00dd"+
"\20\3\2\2\2\u00de\u00df\7C\2\2\u00df\u00e0\7P\2\2\u00e0\u00e1\7F\2\2\u00e1"+
"\22\3\2\2\2\u00e2\u00e3\7C\2\2\u00e3\u00e4\7P\2\2\u00e4\u00e5\7[\2\2\u00e5"+
"\24\3\2\2\2\u00e6\u00e7\7C\2\2\u00e7\u00e8\7U\2\2\u00e8\26\3\2\2\2\u00e9"+
"\u00ea\7C\2\2\u00ea\u00eb\7U\2\2\u00eb\u00ec\7E\2\2\u00ec\30\3\2\2\2\u00ed"+
"\u00ee\7D\2\2\u00ee\u00ef\7G\2\2\u00ef\u00f0\7V\2\2\u00f0\u00f1\7Y\2\2"+
"\u00f1\u00f2\7G\2\2\u00f2\u00f3\7G\2\2\u00f3\u00f4\7P\2\2\u00f4\32\3\2"+
"\2\2\u00f5\u00f6\7D\2\2\u00f6\u00f7\7[\2\2\u00f7\34\3\2\2\2\u00f8\u00f9"+
"\7E\2\2\u00f9\u00fa\7C\2\2\u00fa\u00fb\7U\2\2\u00fb\u00fc\7V\2\2\u00fc"+
"\36\3\2\2\2\u00fd\u00fe\7E\2\2\u00fe\u00ff\7Q\2\2\u00ff\u0100\7N\2\2\u0100"+
"\u0101\7W\2\2\u0101\u0102\7O\2\2\u0102\u0103\7P\2\2\u0103\u0104\7U\2\2"+
"\u0104 \3\2\2\2\u0105\u0106\7F\2\2\u0106\u0107\7G\2\2\u0107\u0108\7D\2"+
"\2\u0108\u0109\7W\2\2\u0109\u010a\7I\2\2\u010a\"\3\2\2\2\u010b\u010c\7"+
"F\2\2\u010c\u010d\7G\2\2\u010d\u010e\7U\2\2\u010e\u010f\7E\2\2\u010f$"+
"\3\2\2\2\u0110\u0111\7F\2\2\u0111\u0112\7G\2\2\u0112\u0113\7U\2\2\u0113"+
"\u0114\7E\2\2\u0114\u0115\7T\2\2\u0115\u0116\7K\2\2\u0116\u0117\7D\2\2"+
"\u0117\u0118\7G\2\2\u0118&\3\2\2\2\u0119\u011a\7F\2\2\u011a\u011b\7K\2"+
"\2\u011b\u011c\7U\2\2\u011c\u011d\7V\2\2\u011d\u011e\7K\2\2\u011e\u011f"+
"\7P\2\2\u011f\u0120\7E\2\2\u0120\u0121\7V\2\2\u0121(\3\2\2\2\u0122\u0123"+
"\7G\2\2\u0123\u0124\7U\2\2\u0124\u0125\7E\2\2\u0125\u0126\7C\2\2\u0126"+
"\u0127\7R\2\2\u0127\u0128\7G\2\2\u0128*\3\2\2\2\u0129\u012a\7G\2\2\u012a"+
"\u012b\7Z\2\2\u012b\u012c\7G\2\2\u012c\u012d\7E\2\2\u012d\u012e\7W\2\2"+
"\u012e\u012f\7V\2\2\u012f\u0130\7C\2\2\u0130\u0131\7D\2\2\u0131\u0132"+
"\7N\2\2\u0132\u0133\7G\2\2\u0133,\3\2\2\2\u0134\u0135\7G\2\2\u0135\u0136"+
"\7Z\2\2\u0136\u0137\7K\2\2\u0137\u0138\7U\2\2\u0138\u0139\7V\2\2\u0139"+
"\u013a\7U\2\2\u013a.\3\2\2\2\u013b\u013c\7G\2\2\u013c\u013d\7Z\2\2\u013d"+
"\u013e\7R\2\2\u013e\u013f\7N\2\2\u013f\u0140\7C\2\2\u0140\u0141\7K\2\2"+
"\u0141\u0142\7P\2\2\u0142\60\3\2\2\2\u0143\u0144\7G\2\2\u0144\u0145\7"+
"Z\2\2\u0145\u0146\7V\2\2\u0146\u0147\7T\2\2\u0147\u0148\7C\2\2\u0148\u0149"+
"\7E\2\2\u0149\u014a\7V\2\2\u014a\62\3\2\2\2\u014b\u014c\7H\2\2\u014c\u014d"+
"\7C\2\2\u014d\u014e\7N\2\2\u014e\u014f\7U\2\2\u014f\u0150\7G\2\2\u0150"+
"\64\3\2\2\2\u0151\u0152\7H\2\2\u0152\u0153\7Q\2\2\u0153\u0154\7T\2\2\u0154"+
"\u0155\7O\2\2\u0155\u0156\7C\2\2\u0156\u0157\7V\2\2\u0157\66\3\2\2\2\u0158"+
"\u0159\7H\2\2\u0159\u015a\7T\2\2\u015a\u015b\7Q\2\2\u015b\u015c\7O\2\2"+
"\u015c8\3\2\2\2\u015d\u015e\7H\2\2\u015e\u015f\7W\2\2\u015f\u0160\7N\2"+
"\2\u0160\u0161\7N\2\2\u0161:\3\2\2\2\u0162\u0163\7H\2\2\u0163\u0164\7"+
"W\2\2\u0164\u0165\7P\2\2\u0165\u0166\7E\2\2\u0166\u0167\7V\2\2\u0167\u0168"+
"\7K\2\2\u0168\u0169\7Q\2\2\u0169\u016a\7P\2\2\u016a\u016b\7U\2\2\u016b"+
"<\3\2\2\2\u016c\u016d\7I\2\2\u016d\u016e\7T\2\2\u016e\u016f\7C\2\2\u016f"+
"\u0170\7R\2\2\u0170\u0171\7J\2\2\u0171\u0172\7X\2\2\u0172\u0173\7K\2\2"+
"\u0173\u0174\7\\\2\2\u0174>\3\2\2\2\u0175\u0176\7I\2\2\u0176\u0177\7T"+
"\2\2\u0177\u0178\7Q\2\2\u0178\u0179\7W\2\2\u0179\u017a\7R\2\2\u017a@\3"+
"\2\2\2\u017b\u017c\7J\2\2\u017c\u017d\7C\2\2\u017d\u017e\7X\2\2\u017e"+
"\u017f\7K\2\2\u017f\u0180\7P\2\2\u0180\u0181\7I\2\2\u0181B\3\2\2\2\u0182"+
"\u0183\7K\2\2\u0183\u0184\7P\2\2\u0184D\3\2\2\2\u0185\u0186\7K\2\2\u0186"+
"\u0187\7P\2\2\u0187\u0188\7P\2\2\u0188\u0189\7G\2\2\u0189\u018a\7T\2\2"+
"\u018aF\3\2\2\2\u018b\u018c\7K\2\2\u018c\u018d\7U\2\2\u018dH\3\2\2\2\u018e"+
"\u018f\7L\2\2\u018f\u0190\7Q\2\2\u0190\u0191\7K\2\2\u0191\u0192\7P\2\2"+
"\u0192J\3\2\2\2\u0193\u0194\7N\2\2\u0194\u0195\7G\2\2\u0195\u0196\7H\2"+
"\2\u0196\u0197\7V\2\2\u0197L\3\2\2\2\u0198\u0199\7N\2\2\u0199\u019a\7"+
"K\2\2\u019a\u019b\7M\2\2\u019b\u019c\7G\2\2\u019cN\3\2\2\2\u019d\u019e"+
"\7N\2\2\u019e\u019f\7K\2\2\u019f\u01a0\7O\2\2\u01a0\u01a1\7K\2\2\u01a1"+
"\u01a2\7V\2\2\u01a2P\3\2\2\2\u01a3\u01a4\7O\2\2\u01a4\u01a5\7C\2\2\u01a5"+
"\u01a6\7R\2\2\u01a6\u01a7\7R\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9\7F\2\2"+
"\u01a9R\3\2\2\2\u01aa\u01ab\7O\2\2\u01ab\u01ac\7C\2\2\u01ac\u01ad\7V\2"+
"\2\u01ad\u01ae\7E\2\2\u01ae\u01af\7J\2\2\u01afT\3\2\2\2\u01b0\u01b1\7"+
"P\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7V\2\2\u01b3\u01b4\7W\2\2\u01b4\u01b5"+
"\7T\2\2\u01b5\u01b6\7C\2\2\u01b6\u01b7\7N\2\2\u01b7V\3\2\2\2\u01b8\u01b9"+
"\7P\2\2\u01b9\u01ba\7Q\2\2\u01ba\u01bb\7V\2\2\u01bbX\3\2\2\2\u01bc\u01bd"+
"\7P\2\2\u01bd\u01be\7W\2\2\u01be\u01bf\7N\2\2\u01bf\u01c0\7N\2\2\u01c0"+
"Z\3\2\2\2\u01c1\u01c2\7Q\2\2\u01c2\u01c3\7P\2\2\u01c3\\\3\2\2\2\u01c4"+
"\u01c5\7Q\2\2\u01c5\u01c6\7R\2\2\u01c6\u01c7\7V\2\2\u01c7\u01c8\7K\2\2"+
"\u01c8\u01c9\7O\2\2\u01c9\u01ca\7K\2\2\u01ca\u01cb\7\\\2\2\u01cb\u01cc"+
"\7G\2\2\u01cc\u01cd\7F\2\2\u01cd^\3\2\2\2\u01ce\u01cf\7Q\2\2\u01cf\u01d0"+
"\7T\2\2\u01d0`\3\2\2\2\u01d1\u01d2\7Q\2\2\u01d2\u01d3\7T\2\2\u01d3\u01d4"+
"\7F\2\2\u01d4\u01d5\7G\2\2\u01d5\u01d6\7T\2\2\u01d6b\3\2\2\2\u01d7\u01d8"+
"\7Q\2\2\u01d8\u01d9\7W\2\2\u01d9\u01da\7V\2\2\u01da\u01db\7G\2\2\u01db"+
"\u01dc\7T\2\2\u01dcd\3\2\2\2\u01dd\u01de\7R\2\2\u01de\u01df\7C\2\2\u01df"+
"\u01e0\7T\2\2\u01e0\u01e1\7U\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7F\2\2"+
"\u01e3f\3\2\2\2\u01e4\u01e5\7R\2\2\u01e5\u01e6\7J\2\2\u01e6\u01e7\7[\2"+
"\2\u01e7\u01e8\7U\2\2\u01e8\u01e9\7K\2\2\u01e9\u01ea\7E\2\2\u01ea\u01eb"+
"\7C\2\2\u01eb\u01ec\7N\2\2\u01ech\3\2\2\2\u01ed\u01ee\7R\2\2\u01ee\u01ef"+
"\7N\2\2\u01ef\u01f0\7C\2\2\u01f0\u01f1\7P\2\2\u01f1j\3\2\2\2\u01f2\u01f3"+
"\7T\2\2\u01f3\u01f4\7K\2\2\u01f4\u01f5\7I\2\2\u01f5\u01f6\7J\2\2\u01f6"+
"\u01f7\7V\2\2\u01f7l\3\2\2\2\u01f8\u01f9\7T\2\2\u01f9\u01fa\7N\2\2\u01fa"+
"\u01fb\7K\2\2\u01fb\u01fc\7M\2\2\u01fc\u01fd\7G\2\2\u01fdn\3\2\2\2\u01fe"+
"\u01ff\7S\2\2\u01ff\u0200\7W\2\2\u0200\u0201\7G\2\2\u0201\u0202\7T\2\2"+
"\u0202\u0203\7[\2\2\u0203p\3\2\2\2\u0204\u0205\7U\2\2\u0205\u0206\7E\2"+
"\2\u0206\u0207\7J\2\2\u0207\u0208\7G\2\2\u0208\u0209\7O\2\2\u0209\u020a"+
"\7C\2\2\u020a\u020b\7U\2\2\u020br\3\2\2\2\u020c\u020d\7U\2\2\u020d\u020e"+
"\7G\2\2\u020e\u020f\7N\2\2\u020f\u0210\7G\2\2\u0210\u0211\7E\2\2\u0211"+
"\u0212\7V\2\2\u0212t\3\2\2\2\u0213\u0214\7U\2\2\u0214\u0215\7J\2\2\u0215"+
"\u0216\7Q\2\2\u0216\u0217\7Y\2\2\u0217v\3\2\2\2\u0218\u0219\7U\2\2\u0219"+
"\u021a\7[\2\2\u021a\u021b\7U\2\2\u021bx\3\2\2\2\u021c\u021d\7V\2\2\u021d"+
"\u021e\7C\2\2\u021e\u021f\7D\2\2\u021f\u0220\7N\2\2\u0220\u0221\7G\2\2"+
"\u0221\u0222\7U\2\2\u0222z\3\2\2\2\u0223\u0224\7V\2\2\u0224\u0225\7G\2"+
"\2\u0225\u0226\7Z\2\2\u0226\u0227\7V\2\2\u0227|\3\2\2\2\u0228\u0229\7"+
"V\2\2\u0229\u022a\7T\2\2\u022a\u022b\7W\2\2\u022b\u022c\7G\2\2\u022c~"+
"\3\2\2\2\u022d\u022e\7V\2\2\u022e\u022f\7[\2\2\u022f\u0230\7R\2\2\u0230"+
"\u0231\7G\2\2\u0231\u0232\7U\2\2\u0232\u0080\3\2\2\2\u0233\u0234\7W\2"+
"\2\u0234\u0235\7U\2\2\u0235\u0236\7K\2\2\u0236\u0237\7P\2\2\u0237\u0238"+
"\7I\2\2\u0238\u0082\3\2\2\2\u0239\u023a\7X\2\2\u023a\u023b\7G\2\2\u023b"+
"\u023c\7T\2\2\u023c\u023d\7K\2\2\u023d\u023e\7H\2\2\u023e\u023f\7[\2\2"+
"\u023f\u0084\3\2\2\2\u0240\u0241\7Y\2\2\u0241\u0242\7J\2\2\u0242\u0243"+
"\7G\2\2\u0243\u0244\7T\2\2\u0244\u0245\7G\2\2\u0245\u0086\3\2\2\2\u0246"+
"\u0247\7Y\2\2\u0247\u0248\7K\2\2\u0248\u0249\7V\2\2\u0249\u024a\7J\2\2"+
"\u024a\u0088\3\2\2\2\u024b\u024c\7?\2\2\u024c\u008a\3\2\2\2\u024d\u024e"+
"\7>\2\2\u024e\u0255\7@\2\2\u024f\u0250\7#\2\2\u0250\u0255\7?\2\2\u0251"+
"\u0252\7>\2\2\u0252\u0253\7?\2\2\u0253\u0255\7@\2\2\u0254\u024d\3\2\2"+
"\2\u0254\u024f\3\2\2\2\u0254\u0251\3\2\2\2\u0255\u008c\3\2\2\2\u0256\u0257"+
"\7>\2\2\u0257\u008e\3\2\2\2\u0258\u0259\7>\2\2\u0259\u025a\7?\2\2\u025a"+
"\u0090\3\2\2\2\u025b\u025c\7@\2\2\u025c\u0092\3\2\2\2\u025d\u025e\7@\2"+
"\2\u025e\u025f\7?\2\2\u025f\u0094\3\2\2\2\u0260\u0261\7-\2\2\u0261\u0096"+
"\3\2\2\2\u0262\u0263\7/\2\2\u0263\u0098\3\2\2\2\u0264\u0265\7,\2\2\u0265"+
"\u009a\3\2\2\2\u0266\u0267\7\61\2\2\u0267\u009c\3\2\2\2\u0268\u0269\7"+
"\'\2\2\u0269\u009e\3\2\2\2\u026a\u026b\7~\2\2\u026b\u026c\7~\2\2\u026c"+
"\u00a0\3\2\2\2\u026d\u026e\7\60\2\2\u026e\u00a2\3\2\2\2\u026f\u0275\7"+
")\2\2\u0270\u0274\n\2\2\2\u0271\u0272\7)\2\2\u0272\u0274\7)\2\2\u0273"+
"\u0270\3\2\2\2\u0273\u0271\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2"+
"\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278"+
"\u0279\7)\2\2\u0279\u00a4\3\2\2\2\u027a\u027c\5\u00b5[\2\u027b\u027a\3"+
"\2\2\2\u027c\u027d\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2\2\2\u027e"+
"\u00a6\3\2\2\2\u027f\u0281\5\u00b5[\2\u0280\u027f\3\2\2\2\u0281\u0282"+
"\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u0284\3\2\2\2\u0284"+
"\u0288\5\u00a1Q\2\u0285\u0287\5\u00b5[\2\u0286\u0285\3\2\2\2\u0287\u028a"+
"\3\2\2\2\u0288\u0286\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u02aa\3\2\2\2\u028a"+
"\u0288\3\2\2\2\u028b\u028d\5\u00a1Q\2\u028c\u028e\5\u00b5[\2\u028d\u028c"+
"\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u028d\3\2\2\2\u028f\u0290\3\2\2\2\u0290"+
"\u02aa\3\2\2\2\u0291\u0293\5\u00b5[\2\u0292\u0291\3\2\2\2\u0293\u0294"+
"\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u029d\3\2\2\2\u0296"+
"\u029a\5\u00a1Q\2\u0297\u0299\5\u00b5[\2\u0298\u0297\3\2\2\2\u0299\u029c"+
"\3\2\2\2\u029a\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029e\3\2\2\2\u029c"+
"\u029a\3\2\2\2\u029d\u0296\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u029f\3\2"+
"\2\2\u029f\u02a0\5\u00b3Z\2\u02a0\u02aa\3\2\2\2\u02a1\u02a3\5\u00a1Q\2"+
"\u02a2\u02a4\5\u00b5[\2\u02a3\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2\u02a5"+
"\u02a3\3\2\2\2\u02a5\u02a6\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7\u02a8\5\u00b3"+
"Z\2\u02a8\u02aa\3\2\2\2\u02a9\u0280\3\2\2\2\u02a9\u028b\3\2\2\2\u02a9"+
"\u0292\3\2\2\2\u02a9\u02a1\3\2\2\2\u02aa\u00a8\3\2\2\2\u02ab\u02ae\5\u00b7"+
"\\\2\u02ac\u02ae\7a\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ac\3\2\2\2\u02ae"+
"\u02b4\3\2\2\2\u02af\u02b3\5\u00b7\\\2\u02b0\u02b3\5\u00b5[\2\u02b1\u02b3"+
"\t\3\2\2\u02b2\u02af\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2\u02b1\3\2\2\2\u02b3"+
"\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u00aa\3\2"+
"\2\2\u02b6\u02b4\3\2\2\2\u02b7\u02bb\5\u00b5[\2\u02b8\u02bc\5\u00b7\\"+
"\2\u02b9\u02bc\5\u00b5[\2\u02ba\u02bc\t\4\2\2\u02bb\u02b8\3\2\2\2\u02bb"+
"\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02bb\3\2"+
"\2\2\u02bd\u02be\3\2\2\2\u02be\u00ac\3\2\2\2\u02bf\u02c4\5\u00b7\\\2\u02c0"+
"\u02c4\5\u00b5[\2\u02c1\u02c4\t\3\2\2\u02c2\u02c4\5\u0099M\2\u02c3\u02bf"+
"\3\2\2\2\u02c3\u02c0\3\2\2\2\u02c3\u02c1\3\2\2\2\u02c3\u02c2\3\2\2\2\u02c4"+
"\u02c5\3\2\2\2\u02c5\u02c3\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u00ae\3\2"+
"\2\2\u02c7\u02cd\7$\2\2\u02c8\u02cc\n\5\2\2\u02c9\u02ca\7$\2\2\u02ca\u02cc"+
"\7$\2\2\u02cb\u02c8\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cf\3\2\2\2\u02cd"+
"\u02cb\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d0\3\2\2\2\u02cf\u02cd\3\2"+
"\2\2\u02d0\u02d1\7$\2\2\u02d1\u00b0\3\2\2\2\u02d2\u02d8\7b\2\2\u02d3\u02d7"+
"\n\6\2\2\u02d4\u02d5\7b\2\2\u02d5\u02d7\7b\2\2\u02d6\u02d3\3\2\2\2\u02d6"+
"\u02d4\3\2\2\2\u02d7\u02da\3\2\2\2\u02d8\u02d6\3\2\2\2\u02d8\u02d9\3\2"+
"\2\2\u02d9\u02db\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\7b\2\2\u02dc"+
"\u00b2\3\2\2\2\u02dd\u02df\7G\2\2\u02de\u02e0\t\7\2\2\u02df\u02de\3\2"+
"\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e2\3\2\2\2\u02e1\u02e3\5\u00b5[\2\u02e2"+
"\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e4\u02e5\3\2"+
"\2\2\u02e5\u00b4\3\2\2\2\u02e6\u02e7\t\b\2\2\u02e7\u00b6\3\2\2\2\u02e8"+
"\u02e9\t\t\2\2\u02e9\u00b8\3\2\2\2\u02ea\u02eb\7/\2\2\u02eb\u02ec\7/\2"+
"\2\u02ec\u02f0\3\2\2\2\u02ed\u02ef\n\n\2\2\u02ee\u02ed\3\2\2\2\u02ef\u02f2"+
"\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2"+
"\u02f0\3\2\2\2\u02f3\u02f5\7\17\2\2\u02f4\u02f3\3\2\2\2\u02f4\u02f5\3"+
"\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f8\7\f\2\2\u02f7\u02f6\3\2\2\2\u02f7"+
"\u02f8\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9\u02fa\b]\2\2\u02fa\u00ba\3\2"+
"\2\2\u02fb\u02fc\7\61\2\2\u02fc\u02fd\7,\2\2\u02fd\u0302\3\2\2\2\u02fe"+
"\u0301\5\u00bb^\2\u02ff\u0301\13\2\2\2\u0300\u02fe\3\2\2\2\u0300\u02ff"+
"\3\2\2\2\u0301\u0304\3\2\2\2\u0302\u0303\3\2\2\2\u0302\u0300\3\2\2\2\u0303"+
"\u0305\3\2\2\2\u0304\u0302\3\2\2\2\u0305\u0306\7,\2\2\u0306\u0307\7\61"+
"\2\2\u0307\u0308\3\2\2\2\u0308\u0309\b^\2\2\u0309\u00bc\3\2\2\2\u030a"+
"\u030c\t\13\2\2\u030b\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d\u030b\3"+
"\2\2\2\u030d\u030e\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0310\b_\2\2\u0310"+
"\u00be\3\2\2\2\u0311\u0312\13\2\2\2\u0312\u00c0\3\2\2\2\"\2\u0254\u0273"+
"\u0275\u027d\u0282\u0288\u028f\u0294\u029a\u029d\u02a5\u02a9\u02ad\u02b2"+
"\u02b4\u02bb\u02bd\u02c3\u02c5\u02cb\u02cd\u02d6\u02d8\u02df\u02e4\u02f0"+
"\u02f4\u02f7\u0300\u0302\u030d\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -22,20 +22,20 @@ class SqlBaseParser extends Parser {
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
T__0=1, T__1=2, T__2=3, ALL=4, ANALYZE=5, ANALYZED=6, AND=7, ANY=8, AS=9,
ASC=10, BETWEEN=11, BY=12, CAST=13, COLUMNS=14, DEBUG=15, DESC=16, DESCRIBE=17,
DISTINCT=18, ESCAPE=19, EXECUTABLE=20, EXISTS=21, EXPLAIN=22, EXTRACT=23,
FALSE=24, FORMAT=25, FROM=26, FULL=27, FUNCTIONS=28, GRAPHVIZ=29, GROUP=30,
HAVING=31, IN=32, INNER=33, IS=34, JOIN=35, LEFT=36, LIKE=37, LIMIT=38,
MAPPED=39, MATCH=40, NATURAL=41, NOT=42, NULL=43, ON=44, OPTIMIZED=45,
OR=46, ORDER=47, OUTER=48, PARSED=49, PHYSICAL=50, PLAN=51, RIGHT=52,
RLIKE=53, QUERY=54, SCHEMAS=55, SELECT=56, SHOW=57, SYS=58, TABLES=59,
TEXT=60, TRUE=61, TYPES=62, USING=63, VERIFY=64, WHERE=65, WITH=66, EQ=67,
NEQ=68, LT=69, LTE=70, GT=71, GTE=72, PLUS=73, MINUS=74, ASTERISK=75,
SLASH=76, PERCENT=77, CONCAT=78, DOT=79, STRING=80, INTEGER_VALUE=81,
DECIMAL_VALUE=82, IDENTIFIER=83, DIGIT_IDENTIFIER=84, TABLE_IDENTIFIER=85,
QUOTED_IDENTIFIER=86, BACKQUOTED_IDENTIFIER=87, SIMPLE_COMMENT=88, BRACKETED_COMMENT=89,
WS=90, UNRECOGNIZED=91, DELIMITER=92;
T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9,
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, COLUMNS=15, DEBUG=16, DESC=17,
DESCRIBE=18, DISTINCT=19, ESCAPE=20, EXECUTABLE=21, EXISTS=22, EXPLAIN=23,
EXTRACT=24, FALSE=25, FORMAT=26, FROM=27, FULL=28, FUNCTIONS=29, GRAPHVIZ=30,
GROUP=31, HAVING=32, IN=33, INNER=34, IS=35, JOIN=36, LEFT=37, LIKE=38,
LIMIT=39, MAPPED=40, MATCH=41, NATURAL=42, NOT=43, NULL=44, ON=45, OPTIMIZED=46,
OR=47, ORDER=48, OUTER=49, PARSED=50, PHYSICAL=51, PLAN=52, RIGHT=53,
RLIKE=54, QUERY=55, SCHEMAS=56, SELECT=57, SHOW=58, SYS=59, TABLES=60,
TEXT=61, TRUE=62, TYPES=63, USING=64, VERIFY=65, WHERE=66, WITH=67, EQ=68,
NEQ=69, LT=70, LTE=71, GT=72, GTE=73, PLUS=74, MINUS=75, ASTERISK=76,
SLASH=77, PERCENT=78, CONCAT=79, DOT=80, STRING=81, INTEGER_VALUE=82,
DECIMAL_VALUE=83, IDENTIFIER=84, DIGIT_IDENTIFIER=85, TABLE_IDENTIFIER=86,
QUOTED_IDENTIFIER=87, BACKQUOTED_IDENTIFIER=88, SIMPLE_COMMENT=89, BRACKETED_COMMENT=90,
WS=91, UNRECOGNIZED=92, DELIMITER=93;
public static final int
RULE_singleStatement = 0, RULE_singleExpression = 1, RULE_statement = 2,
RULE_query = 3, RULE_queryNoWith = 4, RULE_queryTerm = 5, RULE_orderBy = 6,
@ -61,8 +61,8 @@ class SqlBaseParser extends Parser {
};
private static final String[] _LITERAL_NAMES = {
null, "'('", "')'", "','", "'ALL'", "'ANALYZE'", "'ANALYZED'", "'AND'",
"'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'",
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'",
"'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'",
"'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'", "'FROM'",
"'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'", "'IN'",
@ -75,8 +75,8 @@ class SqlBaseParser extends Parser {
"'||'", "'.'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS",
"ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE",
"FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING",
"IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
@ -572,7 +572,7 @@ class SqlBaseParser extends Parser {
setState(93);
_errHandler.sync(this);
_la = _input.LA(1);
while (((((_la - 25)) & ~0x3f) == 0 && ((1L << (_la - 25)) & ((1L << (FORMAT - 25)) | (1L << (PLAN - 25)) | (1L << (VERIFY - 25)))) != 0)) {
while (((((_la - 26)) & ~0x3f) == 0 && ((1L << (_la - 26)) & ((1L << (FORMAT - 26)) | (1L << (PLAN - 26)) | (1L << (VERIFY - 26)))) != 0)) {
{
setState(91);
switch (_input.LA(1)) {
@ -1607,7 +1607,7 @@ class SqlBaseParser extends Parser {
match(T__0);
setState(266);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (PLUS - 65)) | (1L << (MINUS - 65)) | (1L << (ASTERISK - 65)) | (1L << (STRING - 65)) | (1L << (INTEGER_VALUE - 65)) | (1L << (DECIMAL_VALUE - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(258);
expression();
@ -1807,7 +1807,7 @@ class SqlBaseParser extends Parser {
expression();
setState(285);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(282);
_la = _input.LA(1);
@ -2292,7 +2292,7 @@ class SqlBaseParser extends Parser {
tableIdentifier();
setState(345);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(342);
_la = _input.LA(1);
@ -2322,7 +2322,7 @@ class SqlBaseParser extends Parser {
match(T__1);
setState(354);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(351);
_la = _input.LA(1);
@ -2352,7 +2352,7 @@ class SqlBaseParser extends Parser {
match(T__1);
setState(363);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(360);
_la = _input.LA(1);
@ -3288,6 +3288,9 @@ class SqlBaseParser extends Parser {
case PLAN:
case RLIKE:
case QUERY:
case SCHEMAS:
case SHOW:
case SYS:
case TABLES:
case TEXT:
case TRUE:
@ -3353,7 +3356,7 @@ class SqlBaseParser extends Parser {
setState(493);
((ArithmeticBinaryContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (ASTERISK - 75)) | (1L << (SLASH - 75)) | (1L << (PERCENT - 75)))) != 0)) ) {
if ( !(((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (ASTERISK - 76)) | (1L << (SLASH - 76)) | (1L << (PERCENT - 76)))) != 0)) ) {
((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
} else {
consume();
@ -3685,7 +3688,7 @@ class SqlBaseParser extends Parser {
{
setState(526);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(523);
qualifiedName();
@ -3708,7 +3711,7 @@ class SqlBaseParser extends Parser {
match(T__0);
setState(542);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (PLUS - 65)) | (1L << (MINUS - 65)) | (1L << (ASTERISK - 65)) | (1L << (STRING - 65)) | (1L << (INTEGER_VALUE - 65)) | (1L << (DECIMAL_VALUE - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(532);
_la = _input.LA(1);
@ -3993,7 +3996,7 @@ class SqlBaseParser extends Parser {
{
setState(568);
_la = _input.LA(1);
if ( !(((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (EQ - 67)) | (1L << (NEQ - 67)) | (1L << (LT - 67)) | (1L << (LTE - 67)) | (1L << (GT - 67)) | (1L << (GTE - 67)))) != 0)) ) {
if ( !(((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (EQ - 68)) | (1L << (NEQ - 68)) | (1L << (LT - 68)) | (1L << (LTE - 68)) | (1L << (GT - 68)) | (1L << (GTE - 68)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
@ -4239,6 +4242,9 @@ class SqlBaseParser extends Parser {
case PLAN:
case RLIKE:
case QUERY:
case SCHEMAS:
case SHOW:
case SYS:
case TABLES:
case TEXT:
case TYPES:
@ -4267,9 +4273,14 @@ class SqlBaseParser extends Parser {
}
public static class TableIdentifierContext extends ParserRuleContext {
public IdentifierContext catalog;
public IdentifierContext name;
public TerminalNode TABLE_IDENTIFIER() { return getToken(SqlBaseParser.TABLE_IDENTIFIER, 0); }
public IdentifierContext identifier() {
return getRuleContext(IdentifierContext.class,0);
public List<IdentifierContext> identifier() {
return getRuleContexts(IdentifierContext.class);
}
public IdentifierContext identifier(int i) {
return getRuleContext(IdentifierContext.class,i);
}
public TableIdentifierContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@ -4293,48 +4304,48 @@ class SqlBaseParser extends Parser {
public final TableIdentifierContext tableIdentifier() throws RecognitionException {
TableIdentifierContext _localctx = new TableIdentifierContext(_ctx, getState());
enterRule(_localctx, 66, RULE_tableIdentifier);
int _la;
try {
setState(590);
switch (_input.LA(1)) {
case TABLE_IDENTIFIER:
setState(600);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
setState(588);
setState(591);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) {
{
setState(588);
((TableIdentifierContext)_localctx).catalog = identifier();
setState(589);
match(T__3);
}
}
setState(593);
match(TABLE_IDENTIFIER);
}
break;
case ANALYZE:
case ANALYZED:
case COLUMNS:
case DEBUG:
case EXECUTABLE:
case EXPLAIN:
case FORMAT:
case FUNCTIONS:
case GRAPHVIZ:
case MAPPED:
case OPTIMIZED:
case PARSED:
case PHYSICAL:
case PLAN:
case RLIKE:
case QUERY:
case TABLES:
case TEXT:
case TYPES:
case VERIFY:
case IDENTIFIER:
case DIGIT_IDENTIFIER:
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
case 2:
enterOuterAlt(_localctx, 2);
{
setState(589);
identifier();
setState(597);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) {
case 1:
{
setState(594);
((TableIdentifierContext)_localctx).catalog = identifier();
setState(595);
match(T__3);
}
break;
}
setState(599);
((TableIdentifierContext)_localctx).name = identifier();
}
break;
default:
throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@ -4398,13 +4409,13 @@ class SqlBaseParser extends Parser {
QuoteIdentifierContext _localctx = new QuoteIdentifierContext(_ctx, getState());
enterRule(_localctx, 68, RULE_quoteIdentifier);
try {
setState(594);
setState(604);
switch (_input.LA(1)) {
case QUOTED_IDENTIFIER:
_localctx = new QuotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 1);
{
setState(592);
setState(602);
match(QUOTED_IDENTIFIER);
}
break;
@ -4412,7 +4423,7 @@ class SqlBaseParser extends Parser {
_localctx = new BackQuotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 2);
{
setState(593);
setState(603);
match(BACKQUOTED_IDENTIFIER);
}
break;
@ -4484,13 +4495,13 @@ class SqlBaseParser extends Parser {
UnquoteIdentifierContext _localctx = new UnquoteIdentifierContext(_ctx, getState());
enterRule(_localctx, 70, RULE_unquoteIdentifier);
try {
setState(599);
setState(609);
switch (_input.LA(1)) {
case IDENTIFIER:
_localctx = new UnquotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 1);
{
setState(596);
setState(606);
match(IDENTIFIER);
}
break;
@ -4510,6 +4521,9 @@ class SqlBaseParser extends Parser {
case PLAN:
case RLIKE:
case QUERY:
case SCHEMAS:
case SHOW:
case SYS:
case TABLES:
case TEXT:
case TYPES:
@ -4517,7 +4531,7 @@ class SqlBaseParser extends Parser {
_localctx = new UnquotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 2);
{
setState(597);
setState(607);
nonReserved();
}
break;
@ -4525,7 +4539,7 @@ class SqlBaseParser extends Parser {
_localctx = new DigitIdentifierContext(_localctx);
enterOuterAlt(_localctx, 3);
{
setState(598);
setState(608);
match(DIGIT_IDENTIFIER);
}
break;
@ -4594,13 +4608,13 @@ class SqlBaseParser extends Parser {
NumberContext _localctx = new NumberContext(_ctx, getState());
enterRule(_localctx, 72, RULE_number);
try {
setState(603);
setState(613);
switch (_input.LA(1)) {
case DECIMAL_VALUE:
_localctx = new DecimalLiteralContext(_localctx);
enterOuterAlt(_localctx, 1);
{
setState(601);
setState(611);
match(DECIMAL_VALUE);
}
break;
@ -4608,7 +4622,7 @@ class SqlBaseParser extends Parser {
_localctx = new IntegerLiteralContext(_localctx);
enterOuterAlt(_localctx, 2);
{
setState(602);
setState(612);
match(INTEGER_VALUE);
}
break;
@ -4644,6 +4658,9 @@ class SqlBaseParser extends Parser {
public TerminalNode PLAN() { return getToken(SqlBaseParser.PLAN, 0); }
public TerminalNode QUERY() { return getToken(SqlBaseParser.QUERY, 0); }
public TerminalNode RLIKE() { return getToken(SqlBaseParser.RLIKE, 0); }
public TerminalNode SCHEMAS() { return getToken(SqlBaseParser.SCHEMAS, 0); }
public TerminalNode SHOW() { return getToken(SqlBaseParser.SHOW, 0); }
public TerminalNode SYS() { return getToken(SqlBaseParser.SYS, 0); }
public TerminalNode TABLES() { return getToken(SqlBaseParser.TABLES, 0); }
public TerminalNode TEXT() { return getToken(SqlBaseParser.TEXT, 0); }
public TerminalNode TYPES() { return getToken(SqlBaseParser.TYPES, 0); }
@ -4674,9 +4691,9 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
setState(605);
setState(615);
_la = _input.LA(1);
if ( !(((((_la - 5)) & ~0x3f) == 0 && ((1L << (_la - 5)) & ((1L << (ANALYZE - 5)) | (1L << (ANALYZED - 5)) | (1L << (COLUMNS - 5)) | (1L << (DEBUG - 5)) | (1L << (EXECUTABLE - 5)) | (1L << (EXPLAIN - 5)) | (1L << (FORMAT - 5)) | (1L << (FUNCTIONS - 5)) | (1L << (GRAPHVIZ - 5)) | (1L << (MAPPED - 5)) | (1L << (OPTIMIZED - 5)) | (1L << (PARSED - 5)) | (1L << (PHYSICAL - 5)) | (1L << (PLAN - 5)) | (1L << (RLIKE - 5)) | (1L << (QUERY - 5)) | (1L << (TABLES - 5)) | (1L << (TEXT - 5)) | (1L << (TYPES - 5)) | (1L << (VERIFY - 5)))) != 0)) ) {
if ( !(((((_la - 6)) & ~0x3f) == 0 && ((1L << (_la - 6)) & ((1L << (ANALYZE - 6)) | (1L << (ANALYZED - 6)) | (1L << (COLUMNS - 6)) | (1L << (DEBUG - 6)) | (1L << (EXECUTABLE - 6)) | (1L << (EXPLAIN - 6)) | (1L << (FORMAT - 6)) | (1L << (FUNCTIONS - 6)) | (1L << (GRAPHVIZ - 6)) | (1L << (MAPPED - 6)) | (1L << (OPTIMIZED - 6)) | (1L << (PARSED - 6)) | (1L << (PHYSICAL - 6)) | (1L << (PLAN - 6)) | (1L << (RLIKE - 6)) | (1L << (QUERY - 6)) | (1L << (SCHEMAS - 6)) | (1L << (SHOW - 6)) | (1L << (SYS - 6)) | (1L << (TABLES - 6)) | (1L << (TEXT - 6)) | (1L << (TYPES - 6)) | (1L << (VERIFY - 6)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
@ -4725,7 +4742,7 @@ class SqlBaseParser extends Parser {
}
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3^\u0262\4\2\t\2\4"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3_\u026c\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"+
@ -4772,201 +4789,204 @@ class SqlBaseParser extends Parser {
"\u0221\n\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\u022f\n\34\3\35\3\35\3\35\3\35\6\35\u0235\n\35\r\35\16\35\u0236"+
"\5\35\u0239\n\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3!\7!\u0244\n!\f!\16"+
"!\u0247\13!\3!\3!\3\"\3\"\5\"\u024d\n\"\3#\3#\5#\u0251\n#\3$\3$\5$\u0255"+
"\n$\3%\3%\3%\5%\u025a\n%\3&\3&\5&\u025e\n&\3\'\3\'\3\'\2\4,\64(\2\4\6"+
"\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL\2\17"+
"\b\2\6\6\b\b\26\26))//\63\63\4\2\37\37>>\4\2\b\b//\4\2\34\34\"\"\3\2\22"+
"\23\4\2\6\6SS\4\2\f\f\22\22\4\2\6\6\24\24\3\2KL\3\2MO\3\2EJ\4\2\32\32"+
"??\17\2\7\b\20\21\26\26\30\30\33\33\36\37))//\63\65\678=>@@BB\u02b3\2"+
"N\3\2\2\2\4Q\3\2\2\2\6\u00a6\3\2\2\2\b\u00b1\3\2\2\2\n\u00b5\3\2\2\2\f"+
"\u00cb\3\2\2\2\16\u00cd\3\2\2\2\20\u00d1\3\2\2\2\22\u00ed\3\2\2\2\24\u00f7"+
"\3\2\2\2\26\u0101\3\2\2\2\30\u0110\3\2\2\2\32\u0112\3\2\2\2\34\u0118\3"+
"\2\2\2\36\u011a\3\2\2\2 \u0121\3\2\2\2\"\u0133\3\2\2\2$\u0144\3\2\2\2"+
"&\u0154\3\2\2\2(\u016f\3\2\2\2*\u0171\3\2\2\2,\u01a2\3\2\2\2.\u01af\3"+
"\2\2\2\60\u01e1\3\2\2\2\62\u01e3\3\2\2\2\64\u01ec\3\2\2\2\66\u022e\3\2"+
"\2\28\u0238\3\2\2\2:\u023a\3\2\2\2<\u023c\3\2\2\2>\u023e\3\2\2\2@\u0245"+
"\3\2\2\2B\u024c\3\2\2\2D\u0250\3\2\2\2F\u0254\3\2\2\2H\u0259\3\2\2\2J"+
"\u025d\3\2\2\2L\u025f\3\2\2\2NO\5\6\4\2OP\7\2\2\3P\3\3\2\2\2QR\5*\26\2"+
"RS\7\2\2\3S\5\3\2\2\2T\u00a7\5\b\5\2Uc\7\30\2\2V_\7\3\2\2WX\7\65\2\2X"+
"^\t\2\2\2YZ\7\33\2\2Z^\t\3\2\2[\\\7B\2\2\\^\5<\37\2]W\3\2\2\2]Y\3\2\2"+
"\2][\3\2\2\2^a\3\2\2\2_]\3\2\2\2_`\3\2\2\2`b\3\2\2\2a_\3\2\2\2bd\7\4\2"+
"\2cV\3\2\2\2cd\3\2\2\2de\3\2\2\2e\u00a7\5\6\4\2fr\7\21\2\2gn\7\3\2\2h"+
"i\7\65\2\2im\t\4\2\2jk\7\33\2\2km\t\3\2\2lh\3\2\2\2lj\3\2\2\2mp\3\2\2"+
"\2nl\3\2\2\2no\3\2\2\2oq\3\2\2\2pn\3\2\2\2qs\7\4\2\2rg\3\2\2\2rs\3\2\2"+
"\2st\3\2\2\2t\u00a7\5\6\4\2uv\7;\2\2v{\7=\2\2wy\7\'\2\2xw\3\2\2\2xy\3"+
"\2\2\2yz\3\2\2\2z|\5\62\32\2{x\3\2\2\2{|\3\2\2\2|\u00a7\3\2\2\2}~\7;\2"+
"\2~\177\7\20\2\2\177\u0080\t\5\2\2\u0080\u00a7\5D#\2\u0081\u0082\t\6\2"+
"\2\u0082\u00a7\5D#\2\u0083\u0084\7;\2\2\u0084\u0089\7\36\2\2\u0085\u0087"+
"\7\'\2\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088"+
"\u008a\5\62\32\2\u0089\u0086\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u00a7\3"+
"\2\2\2\u008b\u008c\7;\2\2\u008c\u00a7\79\2\2\u008d\u008e\7<\2\2\u008e"+
"\u0093\7=\2\2\u008f\u0091\7\'\2\2\u0090\u008f\3\2\2\2\u0090\u0091\3\2"+
"\2\2\u0091\u0092\3\2\2\2\u0092\u0094\5\62\32\2\u0093\u0090\3\2\2\2\u0093"+
"\u0094\3\2\2\2\u0094\u00a7\3\2\2\2\u0095\u0096\7<\2\2\u0096\u009c\7\20"+
"\2\2\u0097\u0099\7=\2\2\u0098\u009a\7\'\2\2\u0099\u0098\3\2\2\2\u0099"+
"\u009a\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u009d\5\62\32\2\u009c\u0097\3"+
"\2\2\2\u009c\u009d\3\2\2\2\u009d\u00a2\3\2\2\2\u009e\u00a0\7\'\2\2\u009f"+
"\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\u00a3\5\62"+
"\32\2\u00a2\u009f\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a7\3\2\2\2\u00a4"+
"\u00a5\7<\2\2\u00a5\u00a7\7@\2\2\u00a6T\3\2\2\2\u00a6U\3\2\2\2\u00a6f"+
"\3\2\2\2\u00a6u\3\2\2\2\u00a6}\3\2\2\2\u00a6\u0081\3\2\2\2\u00a6\u0083"+
"\3\2\2\2\u00a6\u008b\3\2\2\2\u00a6\u008d\3\2\2\2\u00a6\u0095\3\2\2\2\u00a6"+
"\u00a4\3\2\2\2\u00a7\7\3\2\2\2\u00a8\u00a9\7D\2\2\u00a9\u00ae\5\32\16"+
"\2\u00aa\u00ab\7\5\2\2\u00ab\u00ad\5\32\16\2\u00ac\u00aa\3\2\2\2\u00ad"+
"\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b2\3\2"+
"\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00a8\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2"+
"\u00b3\3\2\2\2\u00b3\u00b4\5\n\6\2\u00b4\t\3\2\2\2\u00b5\u00c0\5\f\7\2"+
"\u00b6\u00b7\7\61\2\2\u00b7\u00b8\7\16\2\2\u00b8\u00bd\5\16\b\2\u00b9"+
"\u00ba\7\5\2\2\u00ba\u00bc\5\16\b\2\u00bb\u00b9\3\2\2\2\u00bc\u00bf\3"+
"\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00c1\3\2\2\2\u00bf"+
"\u00bd\3\2\2\2\u00c0\u00b6\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c4\3\2"+
"\2\2\u00c2\u00c3\7(\2\2\u00c3\u00c5\t\7\2\2\u00c4\u00c2\3\2\2\2\u00c4"+
"\u00c5\3\2\2\2\u00c5\13\3\2\2\2\u00c6\u00cc\5\20\t\2\u00c7\u00c8\7\3\2"+
"\2\u00c8\u00c9\5\n\6\2\u00c9\u00ca\7\4\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00c6"+
"\3\2\2\2\u00cb\u00c7\3\2\2\2\u00cc\r\3\2\2\2\u00cd\u00cf\5*\26\2\u00ce"+
"\u00d0\t\b\2\2\u00cf\u00ce\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\17\3\2\2"+
"\2\u00d1\u00d3\7:\2\2\u00d2\u00d4\5\34\17\2\u00d3\u00d2\3\2\2\2\u00d3"+
"\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00da\5\36\20\2\u00d6\u00d7\7"+
"\5\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d6\3\2\2\2\u00d9\u00dc\3\2\2\2\u00da"+
"\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00de\3\2\2\2\u00dc\u00da\3\2"+
"\2\2\u00dd\u00df\5\22\n\2\u00de\u00dd\3\2\2\2\u00de\u00df\3\2\2\2\u00df"+
"\u00e2\3\2\2\2\u00e0\u00e1\7C\2\2\u00e1\u00e3\5,\27\2\u00e2\u00e0\3\2"+
"\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e7\3\2\2\2\u00e4\u00e5\7 \2\2\u00e5"+
"\u00e6\7\16\2\2\u00e6\u00e8\5\24\13\2\u00e7\u00e4\3\2\2\2\u00e7\u00e8"+
"\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00ea\7!\2\2\u00ea\u00ec\5,\27\2\u00eb"+
"\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\21\3\2\2\2\u00ed\u00ee\7\34\2"+
"\2\u00ee\u00f3\5 \21\2\u00ef\u00f0\7\5\2\2\u00f0\u00f2\5 \21\2\u00f1\u00ef"+
"\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4"+
"\23\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f8\5\34\17\2\u00f7\u00f6\3\2"+
"\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fe\5\26\f\2\u00fa"+
"\u00fb\7\5\2\2\u00fb\u00fd\5\26\f\2\u00fc\u00fa\3\2\2\2\u00fd\u0100\3"+
"\2\2\2\u00fe\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\25\3\2\2\2\u0100"+
"\u00fe\3\2\2\2\u0101\u0102\5\30\r\2\u0102\27\3\2\2\2\u0103\u010c\7\3\2"+
"\2\u0104\u0109\5*\26\2\u0105\u0106\7\5\2\2\u0106\u0108\5*\26\2\u0107\u0105"+
"\3\2\2\2\u0108\u010b\3\2\2\2\u0109\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a"+
"\u010d\3\2\2\2\u010b\u0109\3\2\2\2\u010c\u0104\3\2\2\2\u010c\u010d\3\2"+
"\2\2\u010d\u010e\3\2\2\2\u010e\u0111\7\4\2\2\u010f\u0111\5*\26\2\u0110"+
"\u0103\3\2\2\2\u0110\u010f\3\2\2\2\u0111\31\3\2\2\2\u0112\u0113\5B\"\2"+
"\u0113\u0114\7\13\2\2\u0114\u0115\7\3\2\2\u0115\u0116\5\n\6\2\u0116\u0117"+
"\7\4\2\2\u0117\33\3\2\2\2\u0118\u0119\t\t\2\2\u0119\35\3\2\2\2\u011a\u011f"+
"\5*\26\2\u011b\u011d\7\13\2\2\u011c\u011b\3\2\2\2\u011c\u011d\3\2\2\2"+
"\u011d\u011e\3\2\2\2\u011e\u0120\5B\"\2\u011f\u011c\3\2\2\2\u011f\u0120"+
"\3\2\2\2\u0120\37\3\2\2\2\u0121\u0125\5(\25\2\u0122\u0124\5\"\22\2\u0123"+
"\u0122\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2"+
"\2\2\u0126!\3\2\2\2\u0127\u0125\3\2\2\2\u0128\u0129\5$\23\2\u0129\u012a"+
"\7%\2\2\u012a\u012c\5(\25\2\u012b\u012d\5&\24\2\u012c\u012b\3\2\2\2\u012c"+
"\u012d\3\2\2\2\u012d\u0134\3\2\2\2\u012e\u012f\7+\2\2\u012f\u0130\5$\23"+
"\2\u0130\u0131\7%\2\2\u0131\u0132\5(\25\2\u0132\u0134\3\2\2\2\u0133\u0128"+
"\3\2\2\2\u0133\u012e\3\2\2\2\u0134#\3\2\2\2\u0135\u0137\7#\2\2\u0136\u0135"+
"\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0145\3\2\2\2\u0138\u013a\7&\2\2\u0139"+
"\u013b\7\62\2\2\u013a\u0139\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u0145\3"+
"\2\2\2\u013c\u013e\7\66\2\2\u013d\u013f\7\62\2\2\u013e\u013d\3\2\2\2\u013e"+
"\u013f\3\2\2\2\u013f\u0145\3\2\2\2\u0140\u0142\7\35\2\2\u0141\u0143\7"+
"\62\2\2\u0142\u0141\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145\3\2\2\2\u0144"+
"\u0136\3\2\2\2\u0144\u0138\3\2\2\2\u0144\u013c\3\2\2\2\u0144\u0140\3\2"+
"\2\2\u0145%\3\2\2\2\u0146\u0147\7.\2\2\u0147\u0155\5,\27\2\u0148\u0149"+
"\7A\2\2\u0149\u014a\7\3\2\2\u014a\u014f\5B\"\2\u014b\u014c\7\5\2\2\u014c"+
"\u014e\5B\"\2\u014d\u014b\3\2\2\2\u014e\u0151\3\2\2\2\u014f\u014d\3\2"+
"\2\2\u014f\u0150\3\2\2\2\u0150\u0152\3\2\2\2\u0151\u014f\3\2\2\2\u0152"+
"\u0153\7\4\2\2\u0153\u0155\3\2\2\2\u0154\u0146\3\2\2\2\u0154\u0148\3\2"+
"\2\2\u0155\'\3\2\2\2\u0156\u015b\5D#\2\u0157\u0159\7\13\2\2\u0158\u0157"+
"\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u015c\5@!\2\u015b"+
"\u0158\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u0170\3\2\2\2\u015d\u015e\7\3"+
"\2\2\u015e\u015f\5\n\6\2\u015f\u0164\7\4\2\2\u0160\u0162\7\13\2\2\u0161"+
"\u0160\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163\3\2\2\2\u0163\u0165\5@"+
"!\2\u0164\u0161\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0170\3\2\2\2\u0166"+
"\u0167\7\3\2\2\u0167\u0168\5 \21\2\u0168\u016d\7\4\2\2\u0169\u016b\7\13"+
"\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+
"!\u0247\13!\3!\3!\3\"\3\"\5\"\u024d\n\"\3#\3#\3#\5#\u0252\n#\3#\3#\3#"+
"\3#\5#\u0258\n#\3#\5#\u025b\n#\3$\3$\5$\u025f\n$\3%\3%\3%\5%\u0264\n%"+
"\3&\3&\5&\u0268\n&\3\'\3\'\3\'\2\4,\64(\2\4\6\b\n\f\16\20\22\24\26\30"+
"\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL\2\17\b\2\7\7\t\t\27\27**\60"+
"\60\64\64\4\2 ??\4\2\t\t\60\60\4\2\35\35##\3\2\23\24\4\2\7\7TT\4\2\r"+
"\r\23\23\4\2\7\7\25\25\3\2LM\3\2NP\3\2FK\4\2\33\33@@\17\2\b\t\21\22\27"+
"\27\31\31\34\34\37 **\60\60\64\668:<?AACC\u02bf\2N\3\2\2\2\4Q\3\2\2\2"+
"\6\u00a6\3\2\2\2\b\u00b1\3\2\2\2\n\u00b5\3\2\2\2\f\u00cb\3\2\2\2\16\u00cd"+
"\3\2\2\2\20\u00d1\3\2\2\2\22\u00ed\3\2\2\2\24\u00f7\3\2\2\2\26\u0101\3"+
"\2\2\2\30\u0110\3\2\2\2\32\u0112\3\2\2\2\34\u0118\3\2\2\2\36\u011a\3\2"+
"\2\2 \u0121\3\2\2\2\"\u0133\3\2\2\2$\u0144\3\2\2\2&\u0154\3\2\2\2(\u016f"+
"\3\2\2\2*\u0171\3\2\2\2,\u01a2\3\2\2\2.\u01af\3\2\2\2\60\u01e1\3\2\2\2"+
"\62\u01e3\3\2\2\2\64\u01ec\3\2\2\2\66\u022e\3\2\2\28\u0238\3\2\2\2:\u023a"+
"\3\2\2\2<\u023c\3\2\2\2>\u023e\3\2\2\2@\u0245\3\2\2\2B\u024c\3\2\2\2D"+
"\u025a\3\2\2\2F\u025e\3\2\2\2H\u0263\3\2\2\2J\u0267\3\2\2\2L\u0269\3\2"+
"\2\2NO\5\6\4\2OP\7\2\2\3P\3\3\2\2\2QR\5*\26\2RS\7\2\2\3S\5\3\2\2\2T\u00a7"+
"\5\b\5\2Uc\7\31\2\2V_\7\3\2\2WX\7\66\2\2X^\t\2\2\2YZ\7\34\2\2Z^\t\3\2"+
"\2[\\\7C\2\2\\^\5<\37\2]W\3\2\2\2]Y\3\2\2\2][\3\2\2\2^a\3\2\2\2_]\3\2"+
"\2\2_`\3\2\2\2`b\3\2\2\2a_\3\2\2\2bd\7\4\2\2cV\3\2\2\2cd\3\2\2\2de\3\2"+
"\2\2e\u00a7\5\6\4\2fr\7\22\2\2gn\7\3\2\2hi\7\66\2\2im\t\4\2\2jk\7\34\2"+
"\2km\t\3\2\2lh\3\2\2\2lj\3\2\2\2mp\3\2\2\2nl\3\2\2\2no\3\2\2\2oq\3\2\2"+
"\2pn\3\2\2\2qs\7\4\2\2rg\3\2\2\2rs\3\2\2\2st\3\2\2\2t\u00a7\5\6\4\2uv"+
"\7<\2\2v{\7>\2\2wy\7(\2\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2z|\5\62\32\2{x"+
"\3\2\2\2{|\3\2\2\2|\u00a7\3\2\2\2}~\7<\2\2~\177\7\21\2\2\177\u0080\t\5"+
"\2\2\u0080\u00a7\5D#\2\u0081\u0082\t\6\2\2\u0082\u00a7\5D#\2\u0083\u0084"+
"\7<\2\2\u0084\u0089\7\37\2\2\u0085\u0087\7(\2\2\u0086\u0085\3\2\2\2\u0086"+
"\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u008a\5\62\32\2\u0089\u0086\3"+
"\2\2\2\u0089\u008a\3\2\2\2\u008a\u00a7\3\2\2\2\u008b\u008c\7<\2\2\u008c"+
"\u00a7\7:\2\2\u008d\u008e\7=\2\2\u008e\u0093\7>\2\2\u008f\u0091\7(\2\2"+
"\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u0094"+
"\5\62\32\2\u0093\u0090\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u00a7\3\2\2\2"+
"\u0095\u0096\7=\2\2\u0096\u009c\7\21\2\2\u0097\u0099\7>\2\2\u0098\u009a"+
"\7(\2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009b\3\2\2\2\u009b"+
"\u009d\5\62\32\2\u009c\u0097\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u00a2\3"+
"\2\2\2\u009e\u00a0\7(\2\2\u009f\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0"+
"\u00a1\3\2\2\2\u00a1\u00a3\5\62\32\2\u00a2\u009f\3\2\2\2\u00a2\u00a3\3"+
"\2\2\2\u00a3\u00a7\3\2\2\2\u00a4\u00a5\7=\2\2\u00a5\u00a7\7A\2\2\u00a6"+
"T\3\2\2\2\u00a6U\3\2\2\2\u00a6f\3\2\2\2\u00a6u\3\2\2\2\u00a6}\3\2\2\2"+
"\u00a6\u0081\3\2\2\2\u00a6\u0083\3\2\2\2\u00a6\u008b\3\2\2\2\u00a6\u008d"+
"\3\2\2\2\u00a6\u0095\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\7\3\2\2\2\u00a8"+
"\u00a9\7E\2\2\u00a9\u00ae\5\32\16\2\u00aa\u00ab\7\5\2\2\u00ab\u00ad\5"+
"\32\16\2\u00ac\u00aa\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae"+
"\u00af\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00a8\3\2"+
"\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\5\n\6\2\u00b4"+
"\t\3\2\2\2\u00b5\u00c0\5\f\7\2\u00b6\u00b7\7\62\2\2\u00b7\u00b8\7\17\2"+
"\2\u00b8\u00bd\5\16\b\2\u00b9\u00ba\7\5\2\2\u00ba\u00bc\5\16\b\2\u00bb"+
"\u00b9\3\2\2\2\u00bc\u00bf\3\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2"+
"\2\2\u00be\u00c1\3\2\2\2\u00bf\u00bd\3\2\2\2\u00c0\u00b6\3\2\2\2\u00c0"+
"\u00c1\3\2\2\2\u00c1\u00c4\3\2\2\2\u00c2\u00c3\7)\2\2\u00c3\u00c5\t\7"+
"\2\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\13\3\2\2\2\u00c6\u00cc"+
"\5\20\t\2\u00c7\u00c8\7\3\2\2\u00c8\u00c9\5\n\6\2\u00c9\u00ca\7\4\2\2"+
"\u00ca\u00cc\3\2\2\2\u00cb\u00c6\3\2\2\2\u00cb\u00c7\3\2\2\2\u00cc\r\3"+
"\2\2\2\u00cd\u00cf\5*\26\2\u00ce\u00d0\t\b\2\2\u00cf\u00ce\3\2\2\2\u00cf"+
"\u00d0\3\2\2\2\u00d0\17\3\2\2\2\u00d1\u00d3\7;\2\2\u00d2\u00d4\5\34\17"+
"\2\u00d3\u00d2\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00da"+
"\5\36\20\2\u00d6\u00d7\7\5\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d6\3\2\2"+
"\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00de"+
"\3\2\2\2\u00dc\u00da\3\2\2\2\u00dd\u00df\5\22\n\2\u00de\u00dd\3\2\2\2"+
"\u00de\u00df\3\2\2\2\u00df\u00e2\3\2\2\2\u00e0\u00e1\7D\2\2\u00e1\u00e3"+
"\5,\27\2\u00e2\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e7\3\2\2\2\u00e4"+
"\u00e5\7!\2\2\u00e5\u00e6\7\17\2\2\u00e6\u00e8\5\24\13\2\u00e7\u00e4\3"+
"\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00ea\7\"\2\2\u00ea"+
"\u00ec\5,\27\2\u00eb\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\21\3\2\2"+
"\2\u00ed\u00ee\7\35\2\2\u00ee\u00f3\5 \21\2\u00ef\u00f0\7\5\2\2\u00f0"+
"\u00f2\5 \21\2\u00f1\u00ef\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2"+
"\2\2\u00f3\u00f4\3\2\2\2\u00f4\23\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f8"+
"\5\34\17\2\u00f7\u00f6\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2"+
"\u00f9\u00fe\5\26\f\2\u00fa\u00fb\7\5\2\2\u00fb\u00fd\5\26\f\2\u00fc\u00fa"+
"\3\2\2\2\u00fd\u0100\3\2\2\2\u00fe\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff"+
"\25\3\2\2\2\u0100\u00fe\3\2\2\2\u0101\u0102\5\30\r\2\u0102\27\3\2\2\2"+
"\u0103\u010c\7\3\2\2\u0104\u0109\5*\26\2\u0105\u0106\7\5\2\2\u0106\u0108"+
"\5*\26\2\u0107\u0105\3\2\2\2\u0108\u010b\3\2\2\2\u0109\u0107\3\2\2\2\u0109"+
"\u010a\3\2\2\2\u010a\u010d\3\2\2\2\u010b\u0109\3\2\2\2\u010c\u0104\3\2"+
"\2\2\u010c\u010d\3\2\2\2\u010d\u010e\3\2\2\2\u010e\u0111\7\4\2\2\u010f"+
"\u0111\5*\26\2\u0110\u0103\3\2\2\2\u0110\u010f\3\2\2\2\u0111\31\3\2\2"+
"\2\u0112\u0113\5B\"\2\u0113\u0114\7\f\2\2\u0114\u0115\7\3\2\2\u0115\u0116"+
"\5\n\6\2\u0116\u0117\7\4\2\2\u0117\33\3\2\2\2\u0118\u0119\t\t\2\2\u0119"+
"\35\3\2\2\2\u011a\u011f\5*\26\2\u011b\u011d\7\f\2\2\u011c\u011b\3\2\2"+
"\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u0120\5B\"\2\u011f\u011c"+
"\3\2\2\2\u011f\u0120\3\2\2\2\u0120\37\3\2\2\2\u0121\u0125\5(\25\2\u0122"+
"\u0124\5\"\22\2\u0123\u0122\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3"+
"\2\2\2\u0125\u0126\3\2\2\2\u0126!\3\2\2\2\u0127\u0125\3\2\2\2\u0128\u0129"+
"\5$\23\2\u0129\u012a\7&\2\2\u012a\u012c\5(\25\2\u012b\u012d\5&\24\2\u012c"+
"\u012b\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u0134\3\2\2\2\u012e\u012f\7,"+
"\2\2\u012f\u0130\5$\23\2\u0130\u0131\7&\2\2\u0131\u0132\5(\25\2\u0132"+
"\u0134\3\2\2\2\u0133\u0128\3\2\2\2\u0133\u012e\3\2\2\2\u0134#\3\2\2\2"+
"\u0135\u0137\7$\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0145"+
"\3\2\2\2\u0138\u013a\7\'\2\2\u0139\u013b\7\63\2\2\u013a\u0139\3\2\2\2"+
"\u013a\u013b\3\2\2\2\u013b\u0145\3\2\2\2\u013c\u013e\7\67\2\2\u013d\u013f"+
"\7\63\2\2\u013e\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0145\3\2\2\2"+
"\u0140\u0142\7\36\2\2\u0141\u0143\7\63\2\2\u0142\u0141\3\2\2\2\u0142\u0143"+
"\3\2\2\2\u0143\u0145\3\2\2\2\u0144\u0136\3\2\2\2\u0144\u0138\3\2\2\2\u0144"+
"\u013c\3\2\2\2\u0144\u0140\3\2\2\2\u0145%\3\2\2\2\u0146\u0147\7/\2\2\u0147"+
"\u0155\5,\27\2\u0148\u0149\7B\2\2\u0149\u014a\7\3\2\2\u014a\u014f\5B\""+
"\2\u014b\u014c\7\5\2\2\u014c\u014e\5B\"\2\u014d\u014b\3\2\2\2\u014e\u0151"+
"\3\2\2\2\u014f\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u0152\3\2\2\2\u0151"+
"\u014f\3\2\2\2\u0152\u0153\7\4\2\2\u0153\u0155\3\2\2\2\u0154\u0146\3\2"+
"\2\2\u0154\u0148\3\2\2\2\u0155\'\3\2\2\2\u0156\u015b\5D#\2\u0157\u0159"+
"\7\f\2\2\u0158\u0157\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a"+
"\u015c\5@!\2\u015b\u0158\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u0170\3\2\2"+
"\2\u015d\u015e\7\3\2\2\u015e\u015f\5\n\6\2\u015f\u0164\7\4\2\2\u0160\u0162"+
"\7\f\2\2\u0161\u0160\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163\3\2\2\2\u0163"+
"\u0165\5@!\2\u0164\u0161\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0170\3\2\2"+
"\2\u0166\u0167\7\3\2\2\u0167\u0168\5 \21\2\u0168\u016d\7\4\2\2\u0169\u016b"+
"\7\f\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+
"\u016e\5@!\2\u016d\u016a\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\3\2\2"+
"\2\u016f\u0156\3\2\2\2\u016f\u015d\3\2\2\2\u016f\u0166\3\2\2\2\u0170)"+
"\3\2\2\2\u0171\u0172\5,\27\2\u0172+\3\2\2\2\u0173\u0174\b\27\1\2\u0174"+
"\u0175\7,\2\2\u0175\u01a3\5,\27\n\u0176\u0177\7\27\2\2\u0177\u0178\7\3"+
"\u0175\7-\2\2\u0175\u01a3\5,\27\n\u0176\u0177\7\30\2\2\u0177\u0178\7\3"+
"\2\2\u0178\u0179\5\b\5\2\u0179\u017a\7\4\2\2\u017a\u01a3\3\2\2\2\u017b"+
"\u017c\78\2\2\u017c\u017d\7\3\2\2\u017d\u0182\7R\2\2\u017e\u017f\7\5\2"+
"\2\u017f\u0181\7R\2\2\u0180\u017e\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180"+
"\u017c\79\2\2\u017c\u017d\7\3\2\2\u017d\u0182\7S\2\2\u017e\u017f\7\5\2"+
"\2\u017f\u0181\7S\2\2\u0180\u017e\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180"+
"\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0185\3\2\2\2\u0184\u0182\3\2\2\2\u0185"+
"\u01a3\7\4\2\2\u0186\u0187\7*\2\2\u0187\u0188\7\3\2\2\u0188\u0189\5@!"+
"\2\u0189\u018a\7\5\2\2\u018a\u018f\7R\2\2\u018b\u018c\7\5\2\2\u018c\u018e"+
"\7R\2\2\u018d\u018b\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u018d\3\2\2\2\u018f"+
"\u01a3\7\4\2\2\u0186\u0187\7+\2\2\u0187\u0188\7\3\2\2\u0188\u0189\5@!"+
"\2\u0189\u018a\7\5\2\2\u018a\u018f\7S\2\2\u018b\u018c\7\5\2\2\u018c\u018e"+
"\7S\2\2\u018d\u018b\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u018d\3\2\2\2\u018f"+
"\u0190\3\2\2\2\u0190\u0192\3\2\2\2\u0191\u018f\3\2\2\2\u0192\u0193\7\4"+
"\2\2\u0193\u01a3\3\2\2\2\u0194\u0195\7*\2\2\u0195\u0196\7\3\2\2\u0196"+
"\u0197\7R\2\2\u0197\u0198\7\5\2\2\u0198\u019d\7R\2\2\u0199\u019a\7\5\2"+
"\2\u019a\u019c\7R\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u019b"+
"\2\2\u0193\u01a3\3\2\2\2\u0194\u0195\7+\2\2\u0195\u0196\7\3\2\2\u0196"+
"\u0197\7S\2\2\u0197\u0198\7\5\2\2\u0198\u019d\7S\2\2\u0199\u019a\7\5\2"+
"\2\u019a\u019c\7S\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u019b"+
"\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01a0\3\2\2\2\u019f\u019d\3\2\2\2\u01a0"+
"\u01a3\7\4\2\2\u01a1\u01a3\5.\30\2\u01a2\u0173\3\2\2\2\u01a2\u0176\3\2"+
"\2\2\u01a2\u017b\3\2\2\2\u01a2\u0186\3\2\2\2\u01a2\u0194\3\2\2\2\u01a2"+
"\u01a1\3\2\2\2\u01a3\u01ac\3\2\2\2\u01a4\u01a5\f\4\2\2\u01a5\u01a6\7\t"+
"\2\2\u01a6\u01ab\5,\27\5\u01a7\u01a8\f\3\2\2\u01a8\u01a9\7\60\2\2\u01a9"+
"\u01a1\3\2\2\2\u01a3\u01ac\3\2\2\2\u01a4\u01a5\f\4\2\2\u01a5\u01a6\7\n"+
"\2\2\u01a6\u01ab\5,\27\5\u01a7\u01a8\f\3\2\2\u01a8\u01a9\7\61\2\2\u01a9"+
"\u01ab\5,\27\4\u01aa\u01a4\3\2\2\2\u01aa\u01a7\3\2\2\2\u01ab\u01ae\3\2"+
"\2\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad-\3\2\2\2\u01ae\u01ac"+
"\3\2\2\2\u01af\u01b1\5\64\33\2\u01b0\u01b2\5\60\31\2\u01b1\u01b0\3\2\2"+
"\2\u01b1\u01b2\3\2\2\2\u01b2/\3\2\2\2\u01b3\u01b5\7,\2\2\u01b4\u01b3\3"+
"\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\7\r\2\2\u01b7"+
"\u01b8\5\64\33\2\u01b8\u01b9\7\t\2\2\u01b9\u01ba\5\64\33\2\u01ba\u01e2"+
"\3\2\2\2\u01bb\u01bd\7,\2\2\u01bc\u01bb\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd"+
"\u01be\3\2\2\2\u01be\u01bf\7\"\2\2\u01bf\u01c0\7\3\2\2\u01c0\u01c5\5*"+
"\26\2\u01c1\u01c2\7\5\2\2\u01c2\u01c4\5*\26\2\u01c3\u01c1\3\2\2\2\u01c4"+
"\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2"+
"\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01c9\7\4\2\2\u01c9\u01e2\3\2\2\2\u01ca"+
"\u01cc\7,\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\3\2"+
"\2\2\u01cd\u01ce\7\"\2\2\u01ce\u01cf\7\3\2\2\u01cf\u01d0\5\b\5\2\u01d0"+
"\u01d1\7\4\2\2\u01d1\u01e2\3\2\2\2\u01d2\u01d4\7,\2\2\u01d3\u01d2\3\2"+
"\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\7\'\2\2\u01d6"+
"\u01e2\5\62\32\2\u01d7\u01d9\7,\2\2\u01d8\u01d7\3\2\2\2\u01d8\u01d9\3"+
"\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\7\67\2\2\u01db\u01e2\7R\2\2\u01dc"+
"\u01de\7$\2\2\u01dd\u01df\7,\2\2\u01de\u01dd\3\2\2\2\u01de\u01df\3\2\2"+
"\2\u01df\u01e0\3\2\2\2\u01e0\u01e2\7-\2\2\u01e1\u01b4\3\2\2\2\u01e1\u01bc"+
"\3\2\2\2\u01e1\u01cb\3\2\2\2\u01e1\u01d3\3\2\2\2\u01e1\u01d8\3\2\2\2\u01e1"+
"\u01dc\3\2\2\2\u01e2\61\3\2\2\2\u01e3\u01e6\7R\2\2\u01e4\u01e5\7\25\2"+
"\2\u01e5\u01e7\7R\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\63"+
"\3\2\2\2\u01e8\u01e9\b\33\1\2\u01e9\u01ed\5\66\34\2\u01ea\u01eb\t\n\2"+
"\2\u01eb\u01ed\5\64\33\6\u01ec\u01e8\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed"+
"\u01fa\3\2\2\2\u01ee\u01ef\f\5\2\2\u01ef\u01f0\t\13\2\2\u01f0\u01f9\5"+
"\64\33\6\u01f1\u01f2\f\4\2\2\u01f2\u01f3\t\n\2\2\u01f3\u01f9\5\64\33\5"+
"\u01f4\u01f5\f\3\2\2\u01f5\u01f6\5:\36\2\u01f6\u01f7\5\64\33\4\u01f7\u01f9"+
"\3\2\2\2\u01f8\u01ee\3\2\2\2\u01f8\u01f1\3\2\2\2\u01f8\u01f4\3\2\2\2\u01f9"+
"\u01fc\3\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\65\3\2\2"+
"\2\u01fc\u01fa\3\2\2\2\u01fd\u01fe\7\17\2\2\u01fe\u01ff\7\3\2\2\u01ff"+
"\u0200\5*\26\2\u0200\u0201\7\13\2\2\u0201\u0202\5> \2\u0202\u0203\7\4"+
"\2\2\u0203\u022f\3\2\2\2\u0204\u0205\7\31\2\2\u0205\u0206\7\3\2\2\u0206"+
"\u0207\5B\"\2\u0207\u0208\7\34\2\2\u0208\u0209\5\64\33\2\u0209\u020a\7"+
"\4\2\2\u020a\u022f\3\2\2\2\u020b\u022f\58\35\2\u020c\u022f\7M\2\2\u020d"+
"\u020e\5@!\2\u020e\u020f\7Q\2\2\u020f\u0211\3\2\2\2\u0210\u020d\3\2\2"+
"\2\u0210\u0211\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u022f\7M\2\2\u0213\u0214"+
"\5B\"\2\u0214\u0220\7\3\2\2\u0215\u0217\5\34\17\2\u0216\u0215\3\2\2\2"+
"\u0216\u0217\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u021d\5*\26\2\u0219\u021a"+
"\7\5\2\2\u021a\u021c\5*\26\2\u021b\u0219\3\2\2\2\u021c\u021f\3\2\2\2\u021d"+
"\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d\3\2"+
"\2\2\u0220\u0216\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u0222\3\2\2\2\u0222"+
"\u0223\7\4\2\2\u0223\u022f\3\2\2\2\u0224\u0225\7\3\2\2\u0225\u0226\5\b"+
"\5\2\u0226\u0227\7\4\2\2\u0227\u022f\3\2\2\2\u0228\u022f\5B\"\2\u0229"+
"\u022f\5@!\2\u022a\u022b\7\3\2\2\u022b\u022c\5*\26\2\u022c\u022d\7\4\2"+
"\2\u022d\u022f\3\2\2\2\u022e\u01fd\3\2\2\2\u022e\u0204\3\2\2\2\u022e\u020b"+
"\3\2\2\2\u022e\u020c\3\2\2\2\u022e\u0210\3\2\2\2\u022e\u0213\3\2\2\2\u022e"+
"\u0224\3\2\2\2\u022e\u0228\3\2\2\2\u022e\u0229\3\2\2\2\u022e\u022a\3\2"+
"\2\2\u022f\67\3\2\2\2\u0230\u0239\7-\2\2\u0231\u0239\5J&\2\u0232\u0239"+
"\5<\37\2\u0233\u0235\7R\2\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236"+
"\u0234\3\2\2\2\u0236\u0237\3\2\2\2\u0237\u0239\3\2\2\2\u0238\u0230\3\2"+
"\2\2\u0238\u0231\3\2\2\2\u0238\u0232\3\2\2\2\u0238\u0234\3\2\2\2\u0239"+
"9\3\2\2\2\u023a\u023b\t\f\2\2\u023b;\3\2\2\2\u023c\u023d\t\r\2\2\u023d"+
"=\3\2\2\2\u023e\u023f\5B\"\2\u023f?\3\2\2\2\u0240\u0241\5B\"\2\u0241\u0242"+
"\7Q\2\2\u0242\u0244\3\2\2\2\u0243\u0240\3\2\2\2\u0244\u0247\3\2\2\2\u0245"+
"\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0248\3\2\2\2\u0247\u0245\3\2"+
"\2\2\u0248\u0249\5B\"\2\u0249A\3\2\2\2\u024a\u024d\5F$\2\u024b\u024d\5"+
"H%\2\u024c\u024a\3\2\2\2\u024c\u024b\3\2\2\2\u024dC\3\2\2\2\u024e\u0251"+
"\7W\2\2\u024f\u0251\5B\"\2\u0250\u024e\3\2\2\2\u0250\u024f\3\2\2\2\u0251"+
"E\3\2\2\2\u0252\u0255\7X\2\2\u0253\u0255\7Y\2\2\u0254\u0252\3\2\2\2\u0254"+
"\u0253\3\2\2\2\u0255G\3\2\2\2\u0256\u025a\7U\2\2\u0257\u025a\5L\'\2\u0258"+
"\u025a\7V\2\2\u0259\u0256\3\2\2\2\u0259\u0257\3\2\2\2\u0259\u0258\3\2"+
"\2\2\u025aI\3\2\2\2\u025b\u025e\7T\2\2\u025c\u025e\7S\2\2\u025d\u025b"+
"\3\2\2\2\u025d\u025c\3\2\2\2\u025eK\3\2\2\2\u025f\u0260\t\16\2\2\u0260"+
"M\3\2\2\2Y]_clnrx{\u0086\u0089\u0090\u0093\u0099\u009c\u009f\u00a2\u00a6"+
"\2\u01b1\u01b2\3\2\2\2\u01b2/\3\2\2\2\u01b3\u01b5\7-\2\2\u01b4\u01b3\3"+
"\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\7\16\2\2\u01b7"+
"\u01b8\5\64\33\2\u01b8\u01b9\7\n\2\2\u01b9\u01ba\5\64\33\2\u01ba\u01e2"+
"\3\2\2\2\u01bb\u01bd\7-\2\2\u01bc\u01bb\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd"+
"\u01be\3\2\2\2\u01be\u01bf\7#\2\2\u01bf\u01c0\7\3\2\2\u01c0\u01c5\5*\26"+
"\2\u01c1\u01c2\7\5\2\2\u01c2\u01c4\5*\26\2\u01c3\u01c1\3\2\2\2\u01c4\u01c7"+
"\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2\2\2\u01c7"+
"\u01c5\3\2\2\2\u01c8\u01c9\7\4\2\2\u01c9\u01e2\3\2\2\2\u01ca\u01cc\7-"+
"\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd"+
"\u01ce\7#\2\2\u01ce\u01cf\7\3\2\2\u01cf\u01d0\5\b\5\2\u01d0\u01d1\7\4"+
"\2\2\u01d1\u01e2\3\2\2\2\u01d2\u01d4\7-\2\2\u01d3\u01d2\3\2\2\2\u01d3"+
"\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\7(\2\2\u01d6\u01e2\5\62"+
"\32\2\u01d7\u01d9\7-\2\2\u01d8\u01d7\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9"+
"\u01da\3\2\2\2\u01da\u01db\78\2\2\u01db\u01e2\7S\2\2\u01dc\u01de\7%\2"+
"\2\u01dd\u01df\7-\2\2\u01de\u01dd\3\2\2\2\u01de\u01df\3\2\2\2\u01df\u01e0"+
"\3\2\2\2\u01e0\u01e2\7.\2\2\u01e1\u01b4\3\2\2\2\u01e1\u01bc\3\2\2\2\u01e1"+
"\u01cb\3\2\2\2\u01e1\u01d3\3\2\2\2\u01e1\u01d8\3\2\2\2\u01e1\u01dc\3\2"+
"\2\2\u01e2\61\3\2\2\2\u01e3\u01e6\7S\2\2\u01e4\u01e5\7\26\2\2\u01e5\u01e7"+
"\7S\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\63\3\2\2\2\u01e8"+
"\u01e9\b\33\1\2\u01e9\u01ed\5\66\34\2\u01ea\u01eb\t\n\2\2\u01eb\u01ed"+
"\5\64\33\6\u01ec\u01e8\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed\u01fa\3\2\2\2"+
"\u01ee\u01ef\f\5\2\2\u01ef\u01f0\t\13\2\2\u01f0\u01f9\5\64\33\6\u01f1"+
"\u01f2\f\4\2\2\u01f2\u01f3\t\n\2\2\u01f3\u01f9\5\64\33\5\u01f4\u01f5\f"+
"\3\2\2\u01f5\u01f6\5:\36\2\u01f6\u01f7\5\64\33\4\u01f7\u01f9\3\2\2\2\u01f8"+
"\u01ee\3\2\2\2\u01f8\u01f1\3\2\2\2\u01f8\u01f4\3\2\2\2\u01f9\u01fc\3\2"+
"\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\65\3\2\2\2\u01fc\u01fa"+
"\3\2\2\2\u01fd\u01fe\7\20\2\2\u01fe\u01ff\7\3\2\2\u01ff\u0200\5*\26\2"+
"\u0200\u0201\7\f\2\2\u0201\u0202\5> \2\u0202\u0203\7\4\2\2\u0203\u022f"+
"\3\2\2\2\u0204\u0205\7\32\2\2\u0205\u0206\7\3\2\2\u0206\u0207\5B\"\2\u0207"+
"\u0208\7\35\2\2\u0208\u0209\5\64\33\2\u0209\u020a\7\4\2\2\u020a\u022f"+
"\3\2\2\2\u020b\u022f\58\35\2\u020c\u022f\7N\2\2\u020d\u020e\5@!\2\u020e"+
"\u020f\7R\2\2\u020f\u0211\3\2\2\2\u0210\u020d\3\2\2\2\u0210\u0211\3\2"+
"\2\2\u0211\u0212\3\2\2\2\u0212\u022f\7N\2\2\u0213\u0214\5B\"\2\u0214\u0220"+
"\7\3\2\2\u0215\u0217\5\34\17\2\u0216\u0215\3\2\2\2\u0216\u0217\3\2\2\2"+
"\u0217\u0218\3\2\2\2\u0218\u021d\5*\26\2\u0219\u021a\7\5\2\2\u021a\u021c"+
"\5*\26\2\u021b\u0219\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d"+
"\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0216\3\2"+
"\2\2\u0220\u0221\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\7\4\2\2\u0223"+
"\u022f\3\2\2\2\u0224\u0225\7\3\2\2\u0225\u0226\5\b\5\2\u0226\u0227\7\4"+
"\2\2\u0227\u022f\3\2\2\2\u0228\u022f\5B\"\2\u0229\u022f\5@!\2\u022a\u022b"+
"\7\3\2\2\u022b\u022c\5*\26\2\u022c\u022d\7\4\2\2\u022d\u022f\3\2\2\2\u022e"+
"\u01fd\3\2\2\2\u022e\u0204\3\2\2\2\u022e\u020b\3\2\2\2\u022e\u020c\3\2"+
"\2\2\u022e\u0210\3\2\2\2\u022e\u0213\3\2\2\2\u022e\u0224\3\2\2\2\u022e"+
"\u0228\3\2\2\2\u022e\u0229\3\2\2\2\u022e\u022a\3\2\2\2\u022f\67\3\2\2"+
"\2\u0230\u0239\7.\2\2\u0231\u0239\5J&\2\u0232\u0239\5<\37\2\u0233\u0235"+
"\7S\2\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0234\3\2\2\2\u0236"+
"\u0237\3\2\2\2\u0237\u0239\3\2\2\2\u0238\u0230\3\2\2\2\u0238\u0231\3\2"+
"\2\2\u0238\u0232\3\2\2\2\u0238\u0234\3\2\2\2\u02399\3\2\2\2\u023a\u023b"+
"\t\f\2\2\u023b;\3\2\2\2\u023c\u023d\t\r\2\2\u023d=\3\2\2\2\u023e\u023f"+
"\5B\"\2\u023f?\3\2\2\2\u0240\u0241\5B\"\2\u0241\u0242\7R\2\2\u0242\u0244"+
"\3\2\2\2\u0243\u0240\3\2\2\2\u0244\u0247\3\2\2\2\u0245\u0243\3\2\2\2\u0245"+
"\u0246\3\2\2\2\u0246\u0248\3\2\2\2\u0247\u0245\3\2\2\2\u0248\u0249\5B"+
"\"\2\u0249A\3\2\2\2\u024a\u024d\5F$\2\u024b\u024d\5H%\2\u024c\u024a\3"+
"\2\2\2\u024c\u024b\3\2\2\2\u024dC\3\2\2\2\u024e\u024f\5B\"\2\u024f\u0250"+
"\7\6\2\2\u0250\u0252\3\2\2\2\u0251\u024e\3\2\2\2\u0251\u0252\3\2\2\2\u0252"+
"\u0253\3\2\2\2\u0253\u025b\7X\2\2\u0254\u0255\5B\"\2\u0255\u0256\7\6\2"+
"\2\u0256\u0258\3\2\2\2\u0257\u0254\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259"+
"\3\2\2\2\u0259\u025b\5B\"\2\u025a\u0251\3\2\2\2\u025a\u0257\3\2\2\2\u025b"+
"E\3\2\2\2\u025c\u025f\7Y\2\2\u025d\u025f\7Z\2\2\u025e\u025c\3\2\2\2\u025e"+
"\u025d\3\2\2\2\u025fG\3\2\2\2\u0260\u0264\7V\2\2\u0261\u0264\5L\'\2\u0262"+
"\u0264\7W\2\2\u0263\u0260\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0262\3\2"+
"\2\2\u0264I\3\2\2\2\u0265\u0268\7U\2\2\u0266\u0268\7T\2\2\u0267\u0265"+
"\3\2\2\2\u0267\u0266\3\2\2\2\u0268K\3\2\2\2\u0269\u026a\t\16\2\2\u026a"+
"M\3\2\2\2[]_clnrx{\u0086\u0089\u0090\u0093\u0099\u009c\u009f\u00a2\u00a6"+
"\u00ae\u00b1\u00bd\u00c0\u00c4\u00cb\u00cf\u00d3\u00da\u00de\u00e2\u00e7"+
"\u00eb\u00f3\u00f7\u00fe\u0109\u010c\u0110\u011c\u011f\u0125\u012c\u0133"+
"\u0136\u013a\u013e\u0142\u0144\u014f\u0154\u0158\u015b\u0161\u0164\u016a"+
"\u016d\u016f\u0182\u018f\u019d\u01a2\u01aa\u01ac\u01b1\u01b4\u01bc\u01c5"+
"\u01cb\u01d3\u01d8\u01de\u01e1\u01e6\u01ec\u01f8\u01fa\u0210\u0216\u021d"+
"\u0220\u022e\u0236\u0238\u0245\u024c\u0250\u0254\u0259\u025d";
"\u0220\u022e\u0236\u0238\u0245\u024c\u0251\u0257\u025a\u025e\u0263\u0267";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -11,21 +11,28 @@ import java.util.Objects;
public class TableIdentifier {
private final String index;
private final Location location;
public TableIdentifier(Location location, String index) {
private final String cluster;
private final String index;
public TableIdentifier(Location location, String catalog, String index) {
this.location = location;
this.cluster = catalog;
this.index = index;
}
public String cluster() {
return cluster;
}
public String index() {
return index;
}
@Override
public int hashCode() {
return Objects.hash(index);
return Objects.hash(cluster, index);
}
@Override
@ -39,7 +46,7 @@ public class TableIdentifier {
}
TableIdentifier other = (TableIdentifier) obj;
return Objects.equals(index, other.index);
return Objects.equals(index, other.index) && Objects.equals(cluster, other.cluster);
}
public Location location() {
@ -49,7 +56,11 @@ public class TableIdentifier {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[index=");
builder.append("[");
if (cluster != null) {
builder.append(cluster);
}
builder.append("][index=");
builder.append(index);
builder.append("]");
return builder.toString();

View File

@ -7,6 +7,7 @@ package org.elasticsearch.xpack.sql.session;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Strings;
import org.elasticsearch.xpack.sql.analysis.analyzer.Analyzer;
import org.elasticsearch.xpack.sql.analysis.analyzer.PreAnalyzer;
import org.elasticsearch.xpack.sql.analysis.analyzer.PreAnalyzer.PreAnalysis;
@ -16,6 +17,7 @@ import org.elasticsearch.xpack.sql.analysis.index.MappingException;
import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry;
import org.elasticsearch.xpack.sql.optimizer.Optimizer;
import org.elasticsearch.xpack.sql.parser.SqlParser;
import org.elasticsearch.xpack.sql.plan.TableIdentifier;
import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan;
import org.elasticsearch.xpack.sql.plan.physical.PhysicalPlan;
import org.elasticsearch.xpack.sql.planner.Planner;
@ -115,8 +117,15 @@ public class SqlSession {
// Note: JOINs are not supported but we detect them when
listener.onFailure(new MappingException("Queries with multiple indices are not supported"));
} else if (preAnalysis.indices.size() == 1) {
String indexName = preAnalysis.indices.get(0);
indexResolver.resolveWithSameMapping(indexName, null,
TableIdentifier table = preAnalysis.indices.get(0);
String cluster = table.cluster();
if (Strings.hasText(cluster) && !indexResolver.clusterName().equals(cluster)) {
listener.onFailure(new MappingException("Cannot inspect indices in cluster/catalog [{}]", cluster));
}
indexResolver.resolveWithSameMapping(table.index(), null,
wrap(indexResult -> listener.onResponse(action.apply(indexResult)), listener::onFailure));
} else {
try {

View File

@ -11,7 +11,8 @@ import org.elasticsearch.xpack.sql.parser.SqlParser;
import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan;
import org.joda.time.DateTimeZone;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
public class PreAnalyzerTests extends ESTestCase {
@ -23,20 +24,53 @@ public class PreAnalyzerTests extends ESTestCase {
LogicalPlan plan = parser.createStatement("SELECT * FROM index");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, contains("index"));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), nullValue());
assertThat(result.indices.get(0).index(), is("index"));
}
public void testBasicIndexWithCatalog() {
LogicalPlan plan = parser.createStatement("SELECT * FROM elastic:index");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), is("elastic"));
assertThat(result.indices.get(0).index(), is("index"));
}
public void testWildIndexWithCatalog() {
LogicalPlan plan = parser.createStatement("SELECT * FROM elastic:index*");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), is("elastic"));
assertThat(result.indices.get(0).index(), is("index*"));
}
public void testQuotedIndex() {
LogicalPlan plan = parser.createStatement("SELECT * FROM \"aaa\"");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, contains("aaa"));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), nullValue());
assertThat(result.indices.get(0).index(), is("aaa"));
}
public void testQuotedCatalog() {
LogicalPlan plan = parser.createStatement("SELECT * FROM \"elastic\":\"aaa\"");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), is("elastic"));
assertThat(result.indices.get(0).index(), is("aaa"));
}
public void testComplicatedQuery() {
LogicalPlan plan = parser.createStatement("SELECT MAX(a) FROM aaa WHERE d > 10 GROUP BY b HAVING AVG(c) ORDER BY e ASC");
PreAnalysis result = preAnalyzer.preAnalyze(plan);
assertThat(plan.preAnalyzed(), is(true));
assertThat(result.indices, contains("aaa"));
assertThat(result.indices, hasSize(1));
assertThat(result.indices.get(0).cluster(), nullValue());
assertThat(result.indices.get(0).index(), is("aaa"));
}
}

View File

@ -20,7 +20,7 @@ import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashC
public class UnresolvedRelationTests extends ESTestCase {
public void testEqualsAndHashCode() {
Location location = new Location(between(1, 1000), between(1, 1000));
TableIdentifier table = new TableIdentifier(location, randomAlphaOfLength(5));
TableIdentifier table = new TableIdentifier(location, randomAlphaOfLength(5), randomAlphaOfLength(5));
String alias = randomBoolean() ? null : randomAlphaOfLength(5);
String unresolvedMessage = randomAlphaOfLength(5);
UnresolvedRelation relation = new UnresolvedRelation(location, table, alias, unresolvedMessage);
@ -32,7 +32,7 @@ public class UnresolvedRelationTests extends ESTestCase {
r.unresolvedMessage()));
mutators.add(r -> new UnresolvedRelation(
r.location(),
new TableIdentifier(r.location(), r.table().index() + "m"),
new TableIdentifier(r.location(), r.table().cluster(), r.table().index() + "m"),
r.alias(),
r.unresolvedMessage()));
mutators.add(r -> new UnresolvedRelation(

View File

@ -20,7 +20,7 @@ public class CliExplainIT extends CliIntegrationTestCase {
assertThat(readLine(), startsWith("----------"));
assertThat(readLine(), startsWith("With[{}]"));
assertThat(readLine(), startsWith("\\_Project[[?*]]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]"));
assertEquals("", readLine());
assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT * FROM test"), containsString("plan"));
@ -66,7 +66,7 @@ public class CliExplainIT extends CliIntegrationTestCase {
assertThat(readLine(), startsWith("With[{}]"));
assertThat(readLine(), startsWith("\\_Project[[?*]]"));
assertThat(readLine(), startsWith(" \\_Filter[?i = 2]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]"));
assertEquals("", readLine());
assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT * FROM test WHERE i = 2"),
@ -124,7 +124,7 @@ public class CliExplainIT extends CliIntegrationTestCase {
assertThat(readLine(), startsWith("----------"));
assertThat(readLine(), startsWith("With[{}]"));
assertThat(readLine(), startsWith("\\_Project[[?COUNT(?*)]]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]"));
assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]"));
assertEquals("", readLine());
assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT COUNT(*) FROM test"),