From ee67e403f7bef9cad2262b76138adaa6b36e59dd Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 18:52:49 +0200 Subject: [PATCH 001/118] Add Antl4r as optional dev dependency --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 262d7a714..bb5832071 100644 --- a/setup.py +++ b/setup.py @@ -21,8 +21,10 @@ ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], + 'pandas': ['pandas>=0.23.2'], 'performance': ['matplotlib>=1.5.3'], 'streaming': ['tornado>=4.3'], + 'dev': ['antlr4-python3-runtime>=4.8,<5.0'], 'sql': [ 'numpy', 'pandas>=0.23.2', @@ -31,7 +33,7 @@ 'backports.tempfile==1.0rc1', 'cloudpickle>=0.1.0', 'futures>=3.0.1', - 'pylint', + 'pylint>=2.3,<2.6', 'pylzma', 'memory-profiler>=0.47', 'pycodestyle', From 644c34173753cd84d0d1c0ac9c385c86a02bef96 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 18:54:13 +0200 Subject: [PATCH 002/118] Add grammar files to repository --- pysparkling/sql/ast/generated/SqlBase.interp | 742 + pysparkling/sql/ast/generated/SqlBase.tokens | 572 + .../sql/ast/generated/SqlBaseLexer.interp | 912 + pysparkling/sql/ast/generated/SqlBaseLexer.py | 1878 ++ .../sql/ast/generated/SqlBaseLexer.tokens | 572 + .../sql/ast/generated/SqlBaseListener.py | 2404 ++ .../sql/ast/generated/SqlBaseParser.py | 22167 ++++++++++++++++ pysparkling/sql/ast/generated/__init__.py | 0 8 files changed, 29247 insertions(+) create mode 100644 pysparkling/sql/ast/generated/SqlBase.interp create mode 100644 pysparkling/sql/ast/generated/SqlBase.tokens create mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.interp create mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.py create mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.tokens create mode 100644 pysparkling/sql/ast/generated/SqlBaseListener.py create mode 100644 pysparkling/sql/ast/generated/SqlBaseParser.py create mode 100644 pysparkling/sql/ast/generated/__init__.py diff --git a/pysparkling/sql/ast/generated/SqlBase.interp b/pysparkling/sql/ast/generated/SqlBase.interp new file mode 100644 index 000000000..216d07eac --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBase.interp @@ -0,0 +1,742 @@ +token literal names: +null +';' +'(' +')' +',' +'.' +'/*+' +'*/' +'->' +'[' +']' +':' +'ADD' +'AFTER' +'ALL' +'ALTER' +'ANALYZE' +'AND' +'ANTI' +'ANY' +'ARCHIVE' +'ARRAY' +'AS' +'ASC' +'AT' +'AUTHORIZATION' +'BETWEEN' +'BOTH' +'BUCKET' +'BUCKETS' +'BY' +'CACHE' +'CASCADE' +'CASE' +'CAST' +'CHANGE' +'CHECK' +'CLEAR' +'CLUSTER' +'CLUSTERED' +'CODEGEN' +'COLLATE' +'COLLECTION' +'COLUMN' +'COLUMNS' +'COMMENT' +'COMMIT' +'COMPACT' +'COMPACTIONS' +'COMPUTE' +'CONCATENATE' +'CONSTRAINT' +'COST' +'CREATE' +'CROSS' +'CUBE' +'CURRENT' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'CURRENT_USER' +'DATA' +'DATABASE' +null +'DAY' +'DBPROPERTIES' +'DEFINED' +'DELETE' +'DELIMITED' +'DESC' +'DESCRIBE' +'DFS' +'DIRECTORIES' +'DIRECTORY' +'DISTINCT' +'DISTRIBUTE' +'DROP' +'ELSE' +'END' +'ESCAPE' +'ESCAPED' +'EXCEPT' +'EXCHANGE' +'EXISTS' +'EXPLAIN' +'EXPORT' +'EXTENDED' +'EXTERNAL' +'EXTRACT' +'FALSE' +'FETCH' +'FIELDS' +'FILTER' +'FILEFORMAT' +'FIRST' +'FOLLOWING' +'FOR' +'FOREIGN' +'FORMAT' +'FORMATTED' +'FROM' +'FULL' +'FUNCTION' +'FUNCTIONS' +'GLOBAL' +'GRANT' +'GROUP' +'GROUPING' +'HAVING' +'HOUR' +'IF' +'IGNORE' +'IMPORT' +'IN' +'INDEX' +'INDEXES' +'INNER' +'INPATH' +'INPUTFORMAT' +'INSERT' +'INTERSECT' +'INTERVAL' +'INTO' +'IS' +'ITEMS' +'JOIN' +'KEYS' +'LAST' +'LATERAL' +'LAZY' +'LEADING' +'LEFT' +'LIKE' +'LIMIT' +'LINES' +'LIST' +'LOAD' +'LOCAL' +'LOCATION' +'LOCK' +'LOCKS' +'LOGICAL' +'MACRO' +'MAP' +'MATCHED' +'MERGE' +'MINUTE' +'MONTH' +'MSCK' +'NAMESPACE' +'NAMESPACES' +'NATURAL' +'NO' +null +'NULL' +'NULLS' +'OF' +'ON' +'ONLY' +'OPTION' +'OPTIONS' +'OR' +'ORDER' +'OUT' +'OUTER' +'OUTPUTFORMAT' +'OVER' +'OVERLAPS' +'OVERLAY' +'OVERWRITE' +'PARTITION' +'PARTITIONED' +'PARTITIONS' +'PERCENT' +'PIVOT' +'PLACING' +'POSITION' +'PRECEDING' +'PRIMARY' +'PRINCIPALS' +'PROPERTIES' +'PURGE' +'QUERY' +'RANGE' +'RECORDREADER' +'RECORDWRITER' +'RECOVER' +'REDUCE' +'REFERENCES' +'REFRESH' +'RENAME' +'REPAIR' +'REPLACE' +'RESET' +'RESTRICT' +'REVOKE' +'RIGHT' +null +'ROLE' +'ROLES' +'ROLLBACK' +'ROLLUP' +'ROW' +'ROWS' +'SCHEMA' +'SECOND' +'SELECT' +'SEMI' +'SEPARATED' +'SERDE' +'SERDEPROPERTIES' +'SESSION_USER' +'SET' +'MINUS' +'SETS' +'SHOW' +'SKEWED' +'SOME' +'SORT' +'SORTED' +'START' +'STATISTICS' +'STORED' +'STRATIFY' +'STRUCT' +'SUBSTR' +'SUBSTRING' +'TABLE' +'TABLES' +'TABLESAMPLE' +'TBLPROPERTIES' +null +'TERMINATED' +'THEN' +'TO' +'TOUCH' +'TRAILING' +'TRANSACTION' +'TRANSACTIONS' +'TRANSFORM' +'TRIM' +'TRUE' +'TRUNCATE' +'TYPE' +'UNARCHIVE' +'UNBOUNDED' +'UNCACHE' +'UNION' +'UNIQUE' +'UNKNOWN' +'UNLOCK' +'UNSET' +'UPDATE' +'USE' +'USER' +'USING' +'VALUES' +'VIEW' +'VIEWS' +'WHEN' +'WHERE' +'WINDOW' +'WITH' +'YEAR' +null +'<=>' +'<>' +'!=' +'<' +null +'>' +null +'+' +'-' +'*' +'/' +'%' +'DIV' +'~' +'&' +'|' +'||' +'^' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DATA +DATABASE +DATABASES +DAY +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SCHEMA +SECOND +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +DIV +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +rule names: +singleStatement +singleExpression +singleTableIdentifier +singleMultipartIdentifier +singleFunctionIdentifier +singleDataType +singleTableSchema +statement +unsupportedHiveNativeCommands +createTableHeader +replaceTableHeader +bucketSpec +skewSpec +locationSpec +commentSpec +query +insertInto +partitionSpecLocation +partitionSpec +partitionVal +namespace +describeFuncName +describeColName +ctes +namedQuery +tableProvider +createTableClauses +tablePropertyList +tableProperty +tablePropertyKey +tablePropertyValue +constantList +nestedConstantList +createFileFormat +fileFormat +storageHandler +resource +dmlStatementNoWith +queryOrganization +multiInsertQueryBody +queryTerm +queryPrimary +sortItem +fromStatement +fromStatementBody +querySpecification +transformClause +selectClause +setClause +matchedClause +notMatchedClause +matchedAction +notMatchedAction +assignmentList +assignment +whereClause +havingClause +hint +hintStatement +fromClause +aggregationClause +groupingSet +pivotClause +pivotColumn +pivotValue +lateralView +setQuantifier +relation +joinRelation +joinType +joinCriteria +sample +sampleMethod +identifierList +identifierSeq +orderedIdentifierList +orderedIdentifier +identifierCommentList +identifierComment +relationPrimary +inlineTable +functionTable +tableAlias +rowFormat +multipartIdentifierList +multipartIdentifier +tableIdentifier +functionIdentifier +namedExpression +namedExpressionSeq +transformList +transform +transformArgument +expression +booleanExpression +predicate +valueExpression +primaryExpression +constant +comparisonOperator +arithmeticOperator +predicateOperator +booleanValue +interval +errorCapturingMultiUnitsInterval +multiUnitsInterval +errorCapturingUnitToUnitInterval +unitToUnitInterval +intervalValue +intervalUnit +colPosition +dataType +qualifiedColTypeWithPositionList +qualifiedColTypeWithPosition +colTypeList +colType +complexColTypeList +complexColType +whenClause +windowClause +namedWindow +windowSpec +windowFrame +frameBound +qualifiedNameList +functionName +qualifiedName +errorCapturingIdentifier +errorCapturingIdentifierExtra +identifier +strictIdentifier +quotedIdentifier +number +alterColumnAction +ansiNonReserved +strictNonReserved +nonReserved + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 299, 3020, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 3, 2, 3, 2, 7, 2, 279, 10, 2, 12, 2, 14, 2, 282, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 5, 9, 306, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 311, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 319, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 327, 10, 9, 12, 9, 14, 9, 330, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 349, 10, 9, 3, 9, 3, 9, 5, 9, 353, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 359, 10, 9, 3, 9, 5, 9, 362, 10, 9, 3, 9, 5, 9, 365, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 373, 10, 9, 3, 9, 5, 9, 376, 10, 9, 3, 9, 3, 9, 5, 9, 380, 10, 9, 3, 9, 5, 9, 383, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 391, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 396, 10, 9, 3, 9, 5, 9, 399, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 406, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 418, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 427, 10, 9, 12, 9, 14, 9, 430, 11, 9, 3, 9, 5, 9, 433, 10, 9, 3, 9, 5, 9, 436, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 443, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 454, 10, 9, 12, 9, 14, 9, 457, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 464, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 469, 10, 9, 3, 9, 5, 9, 472, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 478, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 489, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 553, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 562, 10, 9, 3, 9, 3, 9, 5, 9, 566, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 572, 10, 9, 3, 9, 3, 9, 5, 9, 576, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 581, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 587, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 599, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 607, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 613, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 626, 10, 9, 3, 9, 6, 9, 629, 10, 9, 13, 9, 14, 9, 630, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 647, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 652, 10, 9, 12, 9, 14, 9, 655, 11, 9, 3, 9, 5, 9, 658, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 664, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 679, 10, 9, 3, 9, 3, 9, 5, 9, 683, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 689, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 695, 10, 9, 3, 9, 5, 9, 698, 10, 9, 3, 9, 5, 9, 701, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 707, 10, 9, 3, 9, 3, 9, 5, 9, 711, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 719, 10, 9, 12, 9, 14, 9, 722, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 730, 10, 9, 3, 9, 5, 9, 733, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 742, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 747, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 753, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 760, 10, 9, 3, 9, 5, 9, 763, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 769, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 778, 10, 9, 12, 9, 14, 9, 781, 11, 9, 5, 9, 783, 10, 9, 3, 9, 3, 9, 5, 9, 787, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 792, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 797, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 804, 10, 9, 3, 9, 5, 9, 807, 10, 9, 3, 9, 5, 9, 810, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 817, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 822, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 831, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 839, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 845, 10, 9, 3, 9, 5, 9, 848, 10, 9, 3, 9, 5, 9, 851, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 857, 10, 9, 3, 9, 3, 9, 5, 9, 861, 10, 9, 3, 9, 3, 9, 5, 9, 865, 10, 9, 3, 9, 3, 9, 5, 9, 869, 10, 9, 5, 9, 871, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 879, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 887, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 893, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 899, 10, 9, 3, 9, 5, 9, 902, 10, 9, 3, 9, 3, 9, 5, 9, 906, 10, 9, 3, 9, 5, 9, 909, 10, 9, 3, 9, 3, 9, 5, 9, 913, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 936, 10, 9, 12, 9, 14, 9, 939, 11, 9, 5, 9, 941, 10, 9, 3, 9, 3, 9, 5, 9, 945, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 951, 10, 9, 3, 9, 5, 9, 954, 10, 9, 3, 9, 5, 9, 957, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 963, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 971, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 976, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 982, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 988, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 998, 10, 9, 12, 9, 14, 9, 1001, 11, 9, 5, 9, 1003, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1008, 10, 9, 12, 9, 14, 9, 1011, 11, 9, 3, 9, 3, 9, 7, 9, 1015, 10, 9, 12, 9, 14, 9, 1018, 11, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1023, 10, 9, 12, 9, 14, 9, 1026, 11, 9, 5, 9, 1028, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1036, 10, 10, 3, 10, 3, 10, 5, 10, 1040, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1047, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1163, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1171, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1179, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1188, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1198, 10, 10, 3, 11, 3, 11, 5, 11, 1202, 10, 11, 3, 11, 5, 11, 1205, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 1211, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 1217, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 1229, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 1241, 10, 14, 3, 14, 3, 14, 3, 14, 5, 14, 1246, 10, 14, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 5, 17, 1255, 10, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 5, 18, 1263, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1270, 10, 18, 5, 18, 1272, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1277, 10, 18, 3, 18, 3, 18, 5, 18, 1281, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1286, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1291, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1296, 10, 18, 3, 18, 5, 18, 1299, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1304, 10, 18, 3, 18, 3, 18, 5, 18, 1308, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1313, 10, 18, 5, 18, 1315, 10, 18, 3, 19, 3, 19, 5, 19, 1319, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 1326, 10, 20, 12, 20, 14, 20, 1329, 11, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 5, 21, 1336, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 1345, 10, 23, 3, 24, 3, 24, 3, 24, 7, 24, 1350, 10, 24, 12, 24, 14, 24, 1353, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 1359, 10, 25, 12, 25, 14, 25, 1362, 11, 25, 3, 26, 3, 26, 5, 26, 1366, 10, 26, 3, 26, 5, 26, 1369, 10, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 1388, 10, 28, 12, 28, 14, 28, 1391, 11, 28, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 1397, 10, 29, 12, 29, 14, 29, 1400, 11, 29, 3, 29, 3, 29, 3, 30, 3, 30, 5, 30, 1406, 10, 30, 3, 30, 5, 30, 1409, 10, 30, 3, 31, 3, 31, 3, 31, 7, 31, 1414, 10, 31, 12, 31, 14, 31, 1417, 11, 31, 3, 31, 5, 31, 1420, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 1426, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 1432, 10, 33, 12, 33, 14, 33, 1435, 11, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 1443, 10, 34, 12, 34, 14, 34, 1446, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 1456, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 1463, 10, 36, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1469, 10, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 6, 39, 1480, 10, 39, 13, 39, 14, 39, 1481, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1489, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1496, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1508, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 1514, 10, 39, 12, 39, 14, 39, 1517, 11, 39, 3, 39, 7, 39, 1520, 10, 39, 12, 39, 14, 39, 1523, 11, 39, 5, 39, 1525, 10, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1532, 10, 40, 12, 40, 14, 40, 1535, 11, 40, 5, 40, 1537, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1544, 10, 40, 12, 40, 14, 40, 1547, 11, 40, 5, 40, 1549, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1556, 10, 40, 12, 40, 14, 40, 1559, 11, 40, 5, 40, 1561, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1568, 10, 40, 12, 40, 14, 40, 1571, 11, 40, 5, 40, 1573, 10, 40, 3, 40, 5, 40, 1576, 10, 40, 3, 40, 3, 40, 3, 40, 5, 40, 1581, 10, 40, 5, 40, 1583, 10, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1595, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1602, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1609, 10, 42, 3, 42, 7, 42, 1612, 10, 42, 12, 42, 14, 42, 1615, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 1626, 10, 43, 3, 44, 3, 44, 5, 44, 1630, 10, 44, 3, 44, 3, 44, 5, 44, 1634, 10, 44, 3, 45, 3, 45, 6, 45, 1638, 10, 45, 13, 45, 14, 45, 1639, 3, 46, 3, 46, 5, 46, 1644, 10, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 1650, 10, 46, 12, 46, 14, 46, 1653, 11, 46, 3, 46, 5, 46, 1656, 10, 46, 3, 46, 5, 46, 1659, 10, 46, 3, 46, 5, 46, 1662, 10, 46, 3, 46, 5, 46, 1665, 10, 46, 3, 46, 3, 46, 5, 46, 1669, 10, 46, 3, 47, 3, 47, 5, 47, 1673, 10, 47, 3, 47, 5, 47, 1676, 10, 47, 3, 47, 3, 47, 5, 47, 1680, 10, 47, 3, 47, 7, 47, 1683, 10, 47, 12, 47, 14, 47, 1686, 11, 47, 3, 47, 5, 47, 1689, 10, 47, 3, 47, 5, 47, 1692, 10, 47, 3, 47, 5, 47, 1695, 10, 47, 3, 47, 5, 47, 1698, 10, 47, 5, 47, 1700, 10, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 1712, 10, 48, 3, 48, 5, 48, 1715, 10, 48, 3, 48, 3, 48, 5, 48, 1719, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 1729, 10, 48, 3, 48, 3, 48, 5, 48, 1733, 10, 48, 5, 48, 1735, 10, 48, 3, 48, 5, 48, 1738, 10, 48, 3, 48, 3, 48, 5, 48, 1742, 10, 48, 3, 49, 3, 49, 7, 49, 1746, 10, 49, 12, 49, 14, 49, 1749, 11, 49, 3, 49, 5, 49, 1752, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 1763, 10, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 1773, 10, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 1785, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 1798, 10, 54, 12, 54, 14, 54, 1801, 11, 54, 3, 54, 3, 54, 5, 54, 1805, 10, 54, 3, 55, 3, 55, 3, 55, 7, 55, 1810, 10, 55, 12, 55, 14, 55, 1813, 11, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 5, 59, 1828, 10, 59, 3, 59, 7, 59, 1831, 10, 59, 12, 59, 14, 59, 1834, 11, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 7, 60, 1844, 10, 60, 12, 60, 14, 60, 1847, 11, 60, 3, 60, 3, 60, 5, 60, 1851, 10, 60, 3, 61, 3, 61, 3, 61, 3, 61, 7, 61, 1857, 10, 61, 12, 61, 14, 61, 1860, 11, 61, 3, 61, 7, 61, 1863, 10, 61, 12, 61, 14, 61, 1866, 11, 61, 3, 61, 5, 61, 1869, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1876, 10, 62, 12, 62, 14, 62, 1879, 11, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1891, 10, 62, 12, 62, 14, 62, 1894, 11, 62, 3, 62, 3, 62, 5, 62, 1898, 10, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1908, 10, 62, 12, 62, 14, 62, 1911, 11, 62, 3, 62, 3, 62, 5, 62, 1915, 10, 62, 3, 63, 3, 63, 3, 63, 3, 63, 7, 63, 1921, 10, 63, 12, 63, 14, 63, 1924, 11, 63, 5, 63, 1926, 10, 63, 3, 63, 3, 63, 5, 63, 1930, 10, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 1942, 10, 64, 12, 64, 14, 64, 1945, 11, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 7, 65, 1955, 10, 65, 12, 65, 14, 65, 1958, 11, 65, 3, 65, 3, 65, 5, 65, 1962, 10, 65, 3, 66, 3, 66, 5, 66, 1966, 10, 66, 3, 66, 5, 66, 1969, 10, 66, 3, 67, 3, 67, 3, 67, 5, 67, 1974, 10, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 1981, 10, 67, 12, 67, 14, 67, 1984, 11, 67, 5, 67, 1986, 10, 67, 3, 67, 3, 67, 3, 67, 5, 67, 1991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 1996, 10, 67, 12, 67, 14, 67, 1999, 11, 67, 5, 67, 2001, 10, 67, 3, 68, 3, 68, 3, 69, 3, 69, 7, 69, 2007, 10, 69, 12, 69, 14, 69, 2010, 11, 69, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 2016, 10, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 2023, 10, 70, 3, 71, 5, 71, 2026, 10, 71, 3, 71, 3, 71, 3, 71, 5, 71, 2031, 10, 71, 3, 71, 5, 71, 2034, 10, 71, 3, 71, 3, 71, 3, 71, 5, 71, 2039, 10, 71, 3, 71, 3, 71, 5, 71, 2043, 10, 71, 3, 71, 5, 71, 2046, 10, 71, 3, 71, 5, 71, 2049, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 5, 72, 2055, 10, 72, 3, 73, 3, 73, 3, 73, 5, 73, 2060, 10, 73, 3, 73, 3, 73, 3, 74, 5, 74, 2065, 10, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 5, 74, 2083, 10, 74, 5, 74, 2085, 10, 74, 3, 74, 5, 74, 2088, 10, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 7, 76, 2097, 10, 76, 12, 76, 14, 76, 2100, 11, 76, 3, 77, 3, 77, 3, 77, 3, 77, 7, 77, 2106, 10, 77, 12, 77, 14, 77, 2109, 11, 77, 3, 77, 3, 77, 3, 78, 3, 78, 5, 78, 2115, 10, 78, 3, 79, 3, 79, 3, 79, 3, 79, 7, 79, 2121, 10, 79, 12, 79, 14, 79, 2124, 11, 79, 3, 79, 3, 79, 3, 80, 3, 80, 5, 80, 2130, 10, 80, 3, 81, 3, 81, 5, 81, 2134, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2142, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2150, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2156, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 7, 82, 2162, 10, 82, 12, 82, 14, 82, 2165, 11, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 7, 83, 2174, 10, 83, 12, 83, 14, 83, 2177, 11, 83, 5, 83, 2179, 10, 83, 3, 83, 3, 83, 3, 83, 3, 84, 5, 84, 2185, 10, 84, 3, 84, 3, 84, 5, 84, 2189, 10, 84, 5, 84, 2191, 10, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2200, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2212, 10, 85, 5, 85, 2214, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2221, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2228, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2234, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2240, 10, 85, 5, 85, 2242, 10, 85, 3, 86, 3, 86, 3, 86, 7, 86, 2247, 10, 86, 12, 86, 14, 86, 2250, 11, 86, 3, 87, 3, 87, 3, 87, 7, 87, 2255, 10, 87, 12, 87, 14, 87, 2258, 11, 87, 3, 88, 3, 88, 3, 88, 5, 88, 2263, 10, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 5, 89, 2270, 10, 89, 3, 89, 3, 89, 3, 90, 3, 90, 5, 90, 2276, 10, 90, 3, 90, 3, 90, 5, 90, 2280, 10, 90, 5, 90, 2282, 10, 90, 3, 91, 3, 91, 3, 91, 7, 91, 2287, 10, 91, 12, 91, 14, 91, 2290, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 7, 92, 2296, 10, 92, 12, 92, 14, 92, 2299, 11, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 7, 93, 2309, 10, 93, 12, 93, 14, 93, 2312, 11, 93, 3, 93, 3, 93, 5, 93, 2316, 10, 93, 3, 94, 3, 94, 5, 94, 2320, 10, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 2334, 10, 96, 5, 96, 2336, 10, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 7, 96, 2344, 10, 96, 12, 96, 14, 96, 2347, 11, 96, 3, 97, 5, 97, 2350, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2358, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 7, 97, 2365, 10, 97, 12, 97, 14, 97, 2368, 11, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2373, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2381, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2386, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 7, 97, 2396, 10, 97, 12, 97, 14, 97, 2399, 11, 97, 3, 97, 3, 97, 5, 97, 2403, 10, 97, 3, 97, 5, 97, 2406, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2412, 10, 97, 3, 97, 3, 97, 5, 97, 2416, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2421, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2426, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2431, 10, 97, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 2437, 10, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 7, 98, 2458, 10, 98, 12, 98, 14, 98, 2461, 11, 98, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2467, 10, 99, 13, 99, 14, 99, 2468, 3, 99, 3, 99, 5, 99, 2473, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2480, 10, 99, 13, 99, 14, 99, 2481, 3, 99, 3, 99, 5, 99, 2486, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2502, 10, 99, 12, 99, 14, 99, 2505, 11, 99, 5, 99, 2507, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2515, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2524, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2545, 10, 99, 13, 99, 14, 99, 2546, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2558, 10, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2563, 10, 99, 12, 99, 14, 99, 2566, 11, 99, 5, 99, 2568, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2577, 10, 99, 3, 99, 3, 99, 5, 99, 2581, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2591, 10, 99, 13, 99, 14, 99, 2592, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2618, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2625, 10, 99, 3, 99, 5, 99, 2628, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2643, 10, 99, 3, 99, 3, 99, 5, 99, 2647, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2657, 10, 99, 12, 99, 14, 99, 2660, 11, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 6, 100, 2670, 10, 100, 13, 100, 14, 100, 2671, 5, 100, 2674, 10, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 5, 105, 2687, 10, 105, 3, 106, 3, 106, 5, 106, 2691, 10, 106, 3, 107, 3, 107, 3, 107, 6, 107, 2696, 10, 107, 13, 107, 14, 107, 2697, 3, 108, 3, 108, 3, 108, 5, 108, 2703, 10, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 5, 110, 2711, 10, 110, 3, 110, 3, 110, 5, 110, 2715, 10, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 5, 111, 2724, 10, 111, 3, 112, 3, 112, 3, 112, 5, 112, 2729, 10, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 5, 113, 2746, 10, 113, 3, 113, 3, 113, 5, 113, 2750, 10, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 2757, 10, 113, 12, 113, 14, 113, 2760, 11, 113, 3, 113, 5, 113, 2763, 10, 113, 5, 113, 2765, 10, 113, 3, 114, 3, 114, 3, 114, 7, 114, 2770, 10, 114, 12, 114, 14, 114, 2773, 11, 114, 3, 115, 3, 115, 3, 115, 3, 115, 5, 115, 2779, 10, 115, 3, 115, 5, 115, 2782, 10, 115, 3, 115, 5, 115, 2785, 10, 115, 3, 116, 3, 116, 3, 116, 7, 116, 2790, 10, 116, 12, 116, 14, 116, 2793, 11, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 2799, 10, 117, 3, 117, 5, 117, 2802, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 2807, 10, 118, 12, 118, 14, 118, 2810, 11, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 5, 119, 2817, 10, 119, 3, 119, 5, 119, 2820, 10, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 2831, 10, 121, 12, 121, 14, 121, 2834, 11, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2851, 10, 123, 12, 123, 14, 123, 2854, 11, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2861, 10, 123, 12, 123, 14, 123, 2864, 11, 123, 5, 123, 2866, 10, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2873, 10, 123, 12, 123, 14, 123, 2876, 11, 123, 5, 123, 2878, 10, 123, 5, 123, 2880, 10, 123, 3, 123, 5, 123, 2883, 10, 123, 3, 123, 5, 123, 2886, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 2904, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 5, 125, 2913, 10, 125, 3, 126, 3, 126, 3, 126, 7, 126, 2918, 10, 126, 12, 126, 14, 126, 2921, 11, 126, 3, 127, 3, 127, 3, 127, 3, 127, 5, 127, 2927, 10, 127, 3, 128, 3, 128, 3, 128, 7, 128, 2932, 10, 128, 12, 128, 14, 128, 2935, 11, 128, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 6, 130, 2942, 10, 130, 13, 130, 14, 130, 2943, 3, 130, 5, 130, 2947, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 2952, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 5, 132, 2960, 10, 132, 3, 133, 3, 133, 3, 134, 3, 134, 5, 134, 2966, 10, 134, 3, 134, 3, 134, 3, 134, 5, 134, 2971, 10, 134, 3, 134, 3, 134, 3, 134, 5, 134, 2976, 10, 134, 3, 134, 3, 134, 5, 134, 2980, 10, 134, 3, 134, 3, 134, 5, 134, 2984, 10, 134, 3, 134, 3, 134, 5, 134, 2988, 10, 134, 3, 134, 3, 134, 5, 134, 2992, 10, 134, 3, 134, 3, 134, 5, 134, 2996, 10, 134, 3, 134, 3, 134, 5, 134, 3000, 10, 134, 3, 134, 5, 134, 3003, 10, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 3012, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 7, 937, 999, 1009, 1016, 1024, 6, 82, 190, 194, 196, 139, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 2, 44, 4, 2, 67, 67, 182, 182, 4, 2, 34, 34, 196, 196, 4, 2, 65, 65, 152, 152, 4, 2, 102, 102, 115, 115, 3, 2, 45, 46, 4, 2, 229, 229, 259, 259, 4, 2, 17, 17, 37, 37, 7, 2, 42, 42, 54, 54, 88, 88, 101, 101, 143, 143, 3, 2, 71, 72, 4, 2, 88, 88, 101, 101, 4, 2, 156, 156, 285, 285, 4, 2, 14, 14, 137, 137, 5, 2, 64, 64, 151, 151, 206, 206, 6, 2, 83, 83, 122, 122, 215, 215, 249, 249, 5, 2, 83, 83, 215, 215, 249, 249, 4, 2, 25, 25, 71, 71, 4, 2, 96, 96, 129, 129, 4, 2, 16, 16, 76, 76, 4, 2, 289, 289, 291, 291, 5, 2, 16, 16, 21, 21, 219, 219, 5, 2, 91, 91, 243, 243, 251, 251, 4, 2, 274, 275, 280, 280, 3, 2, 276, 279, 4, 2, 274, 275, 283, 283, 4, 2, 59, 59, 61, 61, 3, 2, 227, 228, 4, 2, 6, 6, 102, 102, 4, 2, 6, 6, 98, 98, 5, 2, 29, 29, 132, 132, 238, 238, 3, 2, 266, 273, 3, 2, 274, 284, 6, 2, 19, 19, 115, 115, 155, 155, 163, 163, 4, 2, 91, 91, 243, 243, 3, 2, 274, 275, 4, 2, 77, 77, 172, 172, 4, 2, 164, 164, 220, 220, 4, 2, 97, 97, 179, 179, 3, 2, 290, 291, 4, 2, 78, 78, 214, 214, 53, 2, 14, 15, 17, 18, 22, 23, 25, 26, 28, 28, 30, 34, 37, 37, 39, 42, 44, 44, 46, 52, 54, 54, 57, 58, 63, 65, 67, 75, 77, 78, 82, 82, 84, 90, 93, 93, 95, 97, 100, 101, 104, 106, 109, 109, 112, 114, 116, 117, 119, 121, 123, 123, 126, 126, 128, 131, 134, 147, 150, 152, 154, 154, 157, 158, 161, 162, 165, 165, 167, 168, 170, 179, 181, 189, 191, 197, 199, 206, 210, 212, 214, 214, 216, 218, 220, 228, 230, 234, 237, 237, 239, 244, 246, 248, 252, 255, 258, 260, 263, 263, 279, 279, 17, 2, 20, 20, 56, 56, 83, 83, 103, 103, 118, 118, 122, 122, 127, 127, 133, 133, 153, 153, 159, 159, 198, 198, 209, 209, 215, 215, 249, 249, 257, 257, 19, 2, 14, 19, 21, 55, 57, 82, 84, 102, 104, 117, 119, 121, 123, 126, 128, 132, 134, 152, 154, 158, 160, 197, 199, 208, 210, 214, 216, 248, 250, 256, 258, 265, 279, 279, 2, 3492, 2, 276, 3, 2, 2, 2, 4, 285, 3, 2, 2, 2, 6, 288, 3, 2, 2, 2, 8, 291, 3, 2, 2, 2, 10, 294, 3, 2, 2, 2, 12, 297, 3, 2, 2, 2, 14, 300, 3, 2, 2, 2, 16, 1027, 3, 2, 2, 2, 18, 1197, 3, 2, 2, 2, 20, 1199, 3, 2, 2, 2, 22, 1216, 3, 2, 2, 2, 24, 1222, 3, 2, 2, 2, 26, 1234, 3, 2, 2, 2, 28, 1247, 3, 2, 2, 2, 30, 1250, 3, 2, 2, 2, 32, 1254, 3, 2, 2, 2, 34, 1314, 3, 2, 2, 2, 36, 1316, 3, 2, 2, 2, 38, 1320, 3, 2, 2, 2, 40, 1332, 3, 2, 2, 2, 42, 1337, 3, 2, 2, 2, 44, 1344, 3, 2, 2, 2, 46, 1346, 3, 2, 2, 2, 48, 1354, 3, 2, 2, 2, 50, 1363, 3, 2, 2, 2, 52, 1374, 3, 2, 2, 2, 54, 1389, 3, 2, 2, 2, 56, 1392, 3, 2, 2, 2, 58, 1403, 3, 2, 2, 2, 60, 1419, 3, 2, 2, 2, 62, 1425, 3, 2, 2, 2, 64, 1427, 3, 2, 2, 2, 66, 1438, 3, 2, 2, 2, 68, 1455, 3, 2, 2, 2, 70, 1462, 3, 2, 2, 2, 72, 1464, 3, 2, 2, 2, 74, 1470, 3, 2, 2, 2, 76, 1524, 3, 2, 2, 2, 78, 1536, 3, 2, 2, 2, 80, 1584, 3, 2, 2, 2, 82, 1587, 3, 2, 2, 2, 84, 1625, 3, 2, 2, 2, 86, 1627, 3, 2, 2, 2, 88, 1635, 3, 2, 2, 2, 90, 1668, 3, 2, 2, 2, 92, 1699, 3, 2, 2, 2, 94, 1711, 3, 2, 2, 2, 96, 1743, 3, 2, 2, 2, 98, 1755, 3, 2, 2, 2, 100, 1758, 3, 2, 2, 2, 102, 1767, 3, 2, 2, 2, 104, 1784, 3, 2, 2, 2, 106, 1804, 3, 2, 2, 2, 108, 1806, 3, 2, 2, 2, 110, 1814, 3, 2, 2, 2, 112, 1818, 3, 2, 2, 2, 114, 1821, 3, 2, 2, 2, 116, 1824, 3, 2, 2, 2, 118, 1850, 3, 2, 2, 2, 120, 1852, 3, 2, 2, 2, 122, 1914, 3, 2, 2, 2, 124, 1929, 3, 2, 2, 2, 126, 1931, 3, 2, 2, 2, 128, 1961, 3, 2, 2, 2, 130, 1963, 3, 2, 2, 2, 132, 1970, 3, 2, 2, 2, 134, 2002, 3, 2, 2, 2, 136, 2004, 3, 2, 2, 2, 138, 2022, 3, 2, 2, 2, 140, 2048, 3, 2, 2, 2, 142, 2054, 3, 2, 2, 2, 144, 2056, 3, 2, 2, 2, 146, 2087, 3, 2, 2, 2, 148, 2089, 3, 2, 2, 2, 150, 2093, 3, 2, 2, 2, 152, 2101, 3, 2, 2, 2, 154, 2112, 3, 2, 2, 2, 156, 2116, 3, 2, 2, 2, 158, 2127, 3, 2, 2, 2, 160, 2155, 3, 2, 2, 2, 162, 2157, 3, 2, 2, 2, 164, 2168, 3, 2, 2, 2, 166, 2190, 3, 2, 2, 2, 168, 2241, 3, 2, 2, 2, 170, 2243, 3, 2, 2, 2, 172, 2251, 3, 2, 2, 2, 174, 2262, 3, 2, 2, 2, 176, 2269, 3, 2, 2, 2, 178, 2273, 3, 2, 2, 2, 180, 2283, 3, 2, 2, 2, 182, 2291, 3, 2, 2, 2, 184, 2315, 3, 2, 2, 2, 186, 2319, 3, 2, 2, 2, 188, 2321, 3, 2, 2, 2, 190, 2335, 3, 2, 2, 2, 192, 2430, 3, 2, 2, 2, 194, 2436, 3, 2, 2, 2, 196, 2646, 3, 2, 2, 2, 198, 2673, 3, 2, 2, 2, 200, 2675, 3, 2, 2, 2, 202, 2677, 3, 2, 2, 2, 204, 2679, 3, 2, 2, 2, 206, 2681, 3, 2, 2, 2, 208, 2683, 3, 2, 2, 2, 210, 2688, 3, 2, 2, 2, 212, 2695, 3, 2, 2, 2, 214, 2699, 3, 2, 2, 2, 216, 2704, 3, 2, 2, 2, 218, 2714, 3, 2, 2, 2, 220, 2723, 3, 2, 2, 2, 222, 2728, 3, 2, 2, 2, 224, 2764, 3, 2, 2, 2, 226, 2766, 3, 2, 2, 2, 228, 2774, 3, 2, 2, 2, 230, 2786, 3, 2, 2, 2, 232, 2794, 3, 2, 2, 2, 234, 2803, 3, 2, 2, 2, 236, 2811, 3, 2, 2, 2, 238, 2821, 3, 2, 2, 2, 240, 2826, 3, 2, 2, 2, 242, 2835, 3, 2, 2, 2, 244, 2885, 3, 2, 2, 2, 246, 2903, 3, 2, 2, 2, 248, 2912, 3, 2, 2, 2, 250, 2914, 3, 2, 2, 2, 252, 2926, 3, 2, 2, 2, 254, 2928, 3, 2, 2, 2, 256, 2936, 3, 2, 2, 2, 258, 2946, 3, 2, 2, 2, 260, 2951, 3, 2, 2, 2, 262, 2959, 3, 2, 2, 2, 264, 2961, 3, 2, 2, 2, 266, 3002, 3, 2, 2, 2, 268, 3011, 3, 2, 2, 2, 270, 3013, 3, 2, 2, 2, 272, 3015, 3, 2, 2, 2, 274, 3017, 3, 2, 2, 2, 276, 280, 5, 16, 9, 2, 277, 279, 7, 3, 2, 2, 278, 277, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 2, 2, 3, 284, 3, 3, 2, 2, 2, 285, 286, 5, 178, 90, 2, 286, 287, 7, 2, 2, 3, 287, 5, 3, 2, 2, 2, 288, 289, 5, 174, 88, 2, 289, 290, 7, 2, 2, 3, 290, 7, 3, 2, 2, 2, 291, 292, 5, 172, 87, 2, 292, 293, 7, 2, 2, 3, 293, 9, 3, 2, 2, 2, 294, 295, 5, 176, 89, 2, 295, 296, 7, 2, 2, 3, 296, 11, 3, 2, 2, 2, 297, 298, 5, 224, 113, 2, 298, 299, 7, 2, 2, 3, 299, 13, 3, 2, 2, 2, 300, 301, 5, 230, 116, 2, 301, 302, 7, 2, 2, 3, 302, 15, 3, 2, 2, 2, 303, 1028, 5, 32, 17, 2, 304, 306, 5, 48, 25, 2, 305, 304, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 1028, 5, 76, 39, 2, 308, 310, 7, 255, 2, 2, 309, 311, 7, 151, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 1028, 5, 172, 87, 2, 313, 314, 7, 55, 2, 2, 314, 318, 5, 42, 22, 2, 315, 316, 7, 112, 2, 2, 316, 317, 7, 155, 2, 2, 317, 319, 7, 85, 2, 2, 318, 315, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 328, 5, 172, 87, 2, 321, 327, 5, 30, 16, 2, 322, 327, 5, 28, 15, 2, 323, 324, 7, 264, 2, 2, 324, 325, 9, 2, 2, 2, 325, 327, 5, 56, 29, 2, 326, 321, 3, 2, 2, 2, 326, 322, 3, 2, 2, 2, 326, 323, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 1028, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 17, 2, 2, 332, 333, 5, 42, 22, 2, 333, 334, 5, 172, 87, 2, 334, 335, 7, 214, 2, 2, 335, 336, 9, 2, 2, 2, 336, 337, 5, 56, 29, 2, 337, 1028, 3, 2, 2, 2, 338, 339, 7, 17, 2, 2, 339, 340, 5, 42, 22, 2, 340, 341, 5, 172, 87, 2, 341, 342, 7, 214, 2, 2, 342, 343, 5, 28, 15, 2, 343, 1028, 3, 2, 2, 2, 344, 345, 7, 78, 2, 2, 345, 348, 5, 42, 22, 2, 346, 347, 7, 112, 2, 2, 347, 349, 7, 85, 2, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 352, 5, 172, 87, 2, 351, 353, 9, 3, 2, 2, 352, 351, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 1028, 3, 2, 2, 2, 354, 355, 7, 217, 2, 2, 355, 358, 9, 4, 2, 2, 356, 357, 9, 5, 2, 2, 357, 359, 5, 172, 87, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 364, 3, 2, 2, 2, 360, 362, 7, 134, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 7, 285, 2, 2, 364, 361, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 1028, 3, 2, 2, 2, 366, 367, 6, 9, 2, 2, 367, 372, 5, 20, 11, 2, 368, 369, 7, 4, 2, 2, 369, 370, 5, 230, 116, 2, 370, 371, 7, 5, 2, 2, 371, 373, 3, 2, 2, 2, 372, 368, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 375, 3, 2, 2, 2, 374, 376, 5, 52, 27, 2, 375, 374, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 382, 5, 54, 28, 2, 378, 380, 7, 24, 2, 2, 379, 378, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 383, 5, 32, 17, 2, 382, 379, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 1028, 3, 2, 2, 2, 384, 385, 6, 9, 3, 2, 385, 390, 5, 20, 11, 2, 386, 387, 7, 4, 2, 2, 387, 388, 5, 230, 116, 2, 388, 389, 7, 5, 2, 2, 389, 391, 3, 2, 2, 2, 390, 386, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 5, 52, 27, 2, 393, 398, 5, 54, 28, 2, 394, 396, 7, 24, 2, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 399, 5, 32, 17, 2, 398, 395, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 1028, 3, 2, 2, 2, 400, 405, 5, 20, 11, 2, 401, 402, 7, 4, 2, 2, 402, 403, 5, 230, 116, 2, 403, 404, 7, 5, 2, 2, 404, 406, 3, 2, 2, 2, 405, 401, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 428, 3, 2, 2, 2, 407, 427, 5, 30, 16, 2, 408, 409, 7, 173, 2, 2, 409, 410, 7, 32, 2, 2, 410, 411, 7, 4, 2, 2, 411, 412, 5, 230, 116, 2, 412, 413, 7, 5, 2, 2, 413, 418, 3, 2, 2, 2, 414, 415, 7, 173, 2, 2, 415, 416, 7, 32, 2, 2, 416, 418, 5, 148, 75, 2, 417, 408, 3, 2, 2, 2, 417, 414, 3, 2, 2, 2, 418, 427, 3, 2, 2, 2, 419, 427, 5, 24, 13, 2, 420, 427, 5, 26, 14, 2, 421, 427, 5, 168, 85, 2, 422, 427, 5, 68, 35, 2, 423, 427, 5, 28, 15, 2, 424, 425, 7, 232, 2, 2, 425, 427, 5, 56, 29, 2, 426, 407, 3, 2, 2, 2, 426, 417, 3, 2, 2, 2, 426, 419, 3, 2, 2, 2, 426, 420, 3, 2, 2, 2, 426, 421, 3, 2, 2, 2, 426, 422, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 435, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 433, 7, 24, 2, 2, 432, 431, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 436, 5, 32, 17, 2, 435, 432, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 1028, 3, 2, 2, 2, 437, 438, 7, 55, 2, 2, 438, 442, 7, 229, 2, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 155, 2, 2, 441, 443, 7, 85, 2, 2, 442, 439, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 5, 174, 88, 2, 445, 446, 7, 134, 2, 2, 446, 455, 5, 174, 88, 2, 447, 454, 5, 52, 27, 2, 448, 454, 5, 168, 85, 2, 449, 454, 5, 68, 35, 2, 450, 454, 5, 28, 15, 2, 451, 452, 7, 232, 2, 2, 452, 454, 5, 56, 29, 2, 453, 447, 3, 2, 2, 2, 453, 448, 3, 2, 2, 2, 453, 449, 3, 2, 2, 2, 453, 450, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 457, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 1028, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 458, 463, 5, 22, 12, 2, 459, 460, 7, 4, 2, 2, 460, 461, 5, 230, 116, 2, 461, 462, 7, 5, 2, 2, 462, 464, 3, 2, 2, 2, 463, 459, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 5, 52, 27, 2, 466, 471, 5, 54, 28, 2, 467, 469, 7, 24, 2, 2, 468, 467, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 472, 5, 32, 17, 2, 471, 468, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 1028, 3, 2, 2, 2, 473, 474, 7, 18, 2, 2, 474, 475, 7, 229, 2, 2, 475, 477, 5, 172, 87, 2, 476, 478, 5, 38, 20, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 51, 2, 2, 480, 488, 7, 223, 2, 2, 481, 489, 5, 260, 131, 2, 482, 483, 7, 98, 2, 2, 483, 484, 7, 46, 2, 2, 484, 489, 5, 150, 76, 2, 485, 486, 7, 98, 2, 2, 486, 487, 7, 16, 2, 2, 487, 489, 7, 46, 2, 2, 488, 481, 3, 2, 2, 2, 488, 482, 3, 2, 2, 2, 488, 485, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 1028, 3, 2, 2, 2, 490, 491, 7, 17, 2, 2, 491, 492, 7, 229, 2, 2, 492, 493, 5, 172, 87, 2, 493, 494, 7, 14, 2, 2, 494, 495, 9, 6, 2, 2, 495, 496, 5, 226, 114, 2, 496, 1028, 3, 2, 2, 2, 497, 498, 7, 17, 2, 2, 498, 499, 7, 229, 2, 2, 499, 500, 5, 172, 87, 2, 500, 501, 7, 14, 2, 2, 501, 502, 9, 6, 2, 2, 502, 503, 7, 4, 2, 2, 503, 504, 5, 226, 114, 2, 504, 505, 7, 5, 2, 2, 505, 1028, 3, 2, 2, 2, 506, 507, 7, 17, 2, 2, 507, 508, 7, 229, 2, 2, 508, 509, 5, 172, 87, 2, 509, 510, 7, 192, 2, 2, 510, 511, 7, 45, 2, 2, 511, 512, 5, 172, 87, 2, 512, 513, 7, 236, 2, 2, 513, 514, 5, 256, 129, 2, 514, 1028, 3, 2, 2, 2, 515, 516, 7, 17, 2, 2, 516, 517, 7, 229, 2, 2, 517, 518, 5, 172, 87, 2, 518, 519, 7, 78, 2, 2, 519, 520, 9, 6, 2, 2, 520, 521, 7, 4, 2, 2, 521, 522, 5, 170, 86, 2, 522, 523, 7, 5, 2, 2, 523, 1028, 3, 2, 2, 2, 524, 525, 7, 17, 2, 2, 525, 526, 7, 229, 2, 2, 526, 527, 5, 172, 87, 2, 527, 528, 7, 78, 2, 2, 528, 529, 9, 6, 2, 2, 529, 530, 5, 170, 86, 2, 530, 1028, 3, 2, 2, 2, 531, 532, 7, 17, 2, 2, 532, 533, 9, 7, 2, 2, 533, 534, 5, 172, 87, 2, 534, 535, 7, 192, 2, 2, 535, 536, 7, 236, 2, 2, 536, 537, 5, 172, 87, 2, 537, 1028, 3, 2, 2, 2, 538, 539, 7, 17, 2, 2, 539, 540, 9, 7, 2, 2, 540, 541, 5, 172, 87, 2, 541, 542, 7, 214, 2, 2, 542, 543, 7, 232, 2, 2, 543, 544, 5, 56, 29, 2, 544, 1028, 3, 2, 2, 2, 545, 546, 7, 17, 2, 2, 546, 547, 9, 7, 2, 2, 547, 548, 5, 172, 87, 2, 548, 549, 7, 253, 2, 2, 549, 552, 7, 232, 2, 2, 550, 551, 7, 112, 2, 2, 551, 553, 7, 85, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 5, 56, 29, 2, 555, 1028, 3, 2, 2, 2, 556, 557, 7, 17, 2, 2, 557, 558, 7, 229, 2, 2, 558, 559, 5, 172, 87, 2, 559, 561, 9, 8, 2, 2, 560, 562, 7, 45, 2, 2, 561, 560, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 5, 172, 87, 2, 564, 566, 5, 268, 135, 2, 565, 564, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 1028, 3, 2, 2, 2, 567, 568, 7, 17, 2, 2, 568, 569, 7, 229, 2, 2, 569, 571, 5, 172, 87, 2, 570, 572, 5, 38, 20, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 7, 37, 2, 2, 574, 576, 7, 45, 2, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 5, 172, 87, 2, 578, 580, 5, 232, 117, 2, 579, 581, 5, 222, 112, 2, 580, 579, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 1028, 3, 2, 2, 2, 582, 583, 7, 17, 2, 2, 583, 584, 7, 229, 2, 2, 584, 586, 5, 172, 87, 2, 585, 587, 5, 38, 20, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 194, 2, 2, 589, 590, 7, 46, 2, 2, 590, 591, 7, 4, 2, 2, 591, 592, 5, 226, 114, 2, 592, 593, 7, 5, 2, 2, 593, 1028, 3, 2, 2, 2, 594, 595, 7, 17, 2, 2, 595, 596, 7, 229, 2, 2, 596, 598, 5, 172, 87, 2, 597, 599, 5, 38, 20, 2, 598, 597, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 601, 7, 214, 2, 2, 601, 602, 7, 211, 2, 2, 602, 606, 7, 285, 2, 2, 603, 604, 7, 264, 2, 2, 604, 605, 7, 212, 2, 2, 605, 607, 5, 56, 29, 2, 606, 603, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 1028, 3, 2, 2, 2, 608, 609, 7, 17, 2, 2, 609, 610, 7, 229, 2, 2, 610, 612, 5, 172, 87, 2, 611, 613, 5, 38, 20, 2, 612, 611, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 615, 7, 214, 2, 2, 615, 616, 7, 212, 2, 2, 616, 617, 5, 56, 29, 2, 617, 1028, 3, 2, 2, 2, 618, 619, 7, 17, 2, 2, 619, 620, 9, 7, 2, 2, 620, 621, 5, 172, 87, 2, 621, 625, 7, 14, 2, 2, 622, 623, 7, 112, 2, 2, 623, 624, 7, 155, 2, 2, 624, 626, 7, 85, 2, 2, 625, 622, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 628, 3, 2, 2, 2, 627, 629, 5, 36, 19, 2, 628, 627, 3, 2, 2, 2, 629, 630, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 1028, 3, 2, 2, 2, 632, 633, 7, 17, 2, 2, 633, 634, 7, 229, 2, 2, 634, 635, 5, 172, 87, 2, 635, 636, 5, 38, 20, 2, 636, 637, 7, 192, 2, 2, 637, 638, 7, 236, 2, 2, 638, 639, 5, 38, 20, 2, 639, 1028, 3, 2, 2, 2, 640, 641, 7, 17, 2, 2, 641, 642, 9, 7, 2, 2, 642, 643, 5, 172, 87, 2, 643, 646, 7, 78, 2, 2, 644, 645, 7, 112, 2, 2, 645, 647, 7, 85, 2, 2, 646, 644, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 653, 5, 38, 20, 2, 649, 650, 7, 6, 2, 2, 650, 652, 5, 38, 20, 2, 651, 649, 3, 2, 2, 2, 652, 655, 3, 2, 2, 2, 653, 651, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 656, 658, 7, 183, 2, 2, 657, 656, 3, 2, 2, 2, 657, 658, 3, 2, 2, 2, 658, 1028, 3, 2, 2, 2, 659, 660, 7, 17, 2, 2, 660, 661, 7, 229, 2, 2, 661, 663, 5, 172, 87, 2, 662, 664, 5, 38, 20, 2, 663, 662, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 666, 7, 214, 2, 2, 666, 667, 5, 28, 15, 2, 667, 1028, 3, 2, 2, 2, 668, 669, 7, 17, 2, 2, 669, 670, 7, 229, 2, 2, 670, 671, 5, 172, 87, 2, 671, 672, 7, 188, 2, 2, 672, 673, 7, 174, 2, 2, 673, 1028, 3, 2, 2, 2, 674, 675, 7, 78, 2, 2, 675, 678, 7, 229, 2, 2, 676, 677, 7, 112, 2, 2, 677, 679, 7, 85, 2, 2, 678, 676, 3, 2, 2, 2, 678, 679, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 682, 5, 172, 87, 2, 681, 683, 7, 183, 2, 2, 682, 681, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 1028, 3, 2, 2, 2, 684, 685, 7, 78, 2, 2, 685, 688, 7, 259, 2, 2, 686, 687, 7, 112, 2, 2, 687, 689, 7, 85, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 690, 3, 2, 2, 2, 690, 1028, 5, 172, 87, 2, 691, 694, 7, 55, 2, 2, 692, 693, 7, 163, 2, 2, 693, 695, 7, 194, 2, 2, 694, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 700, 3, 2, 2, 2, 696, 698, 7, 106, 2, 2, 697, 696, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 701, 7, 233, 2, 2, 700, 697, 3, 2, 2, 2, 700, 701, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 706, 7, 259, 2, 2, 703, 704, 7, 112, 2, 2, 704, 705, 7, 155, 2, 2, 705, 707, 7, 85, 2, 2, 706, 703, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 710, 5, 172, 87, 2, 709, 711, 5, 156, 79, 2, 710, 709, 3, 2, 2, 2, 710, 711, 3, 2, 2, 2, 711, 720, 3, 2, 2, 2, 712, 719, 5, 30, 16, 2, 713, 714, 7, 173, 2, 2, 714, 715, 7, 159, 2, 2, 715, 719, 5, 148, 75, 2, 716, 717, 7, 232, 2, 2, 717, 719, 5, 56, 29, 2, 718, 712, 3, 2, 2, 2, 718, 713, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 24, 2, 2, 724, 725, 5, 32, 17, 2, 725, 1028, 3, 2, 2, 2, 726, 729, 7, 55, 2, 2, 727, 728, 7, 163, 2, 2, 728, 730, 7, 194, 2, 2, 729, 727, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 732, 3, 2, 2, 2, 731, 733, 7, 106, 2, 2, 732, 731, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 7, 233, 2, 2, 735, 736, 7, 259, 2, 2, 736, 741, 5, 174, 88, 2, 737, 738, 7, 4, 2, 2, 738, 739, 5, 230, 116, 2, 739, 740, 7, 5, 2, 2, 740, 742, 3, 2, 2, 2, 741, 737, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 746, 5, 52, 27, 2, 744, 745, 7, 162, 2, 2, 745, 747, 5, 56, 29, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 1028, 3, 2, 2, 2, 748, 749, 7, 17, 2, 2, 749, 750, 7, 259, 2, 2, 750, 752, 5, 172, 87, 2, 751, 753, 7, 24, 2, 2, 752, 751, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 5, 32, 17, 2, 755, 1028, 3, 2, 2, 2, 756, 759, 7, 55, 2, 2, 757, 758, 7, 163, 2, 2, 758, 760, 7, 194, 2, 2, 759, 757, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 762, 3, 2, 2, 2, 761, 763, 7, 233, 2, 2, 762, 761, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 768, 7, 104, 2, 2, 765, 766, 7, 112, 2, 2, 766, 767, 7, 155, 2, 2, 767, 769, 7, 85, 2, 2, 768, 765, 3, 2, 2, 2, 768, 769, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 771, 5, 172, 87, 2, 771, 772, 7, 24, 2, 2, 772, 782, 7, 285, 2, 2, 773, 774, 7, 257, 2, 2, 774, 779, 5, 74, 38, 2, 775, 776, 7, 6, 2, 2, 776, 778, 5, 74, 38, 2, 777, 775, 3, 2, 2, 2, 778, 781, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 779, 780, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 782, 773, 3, 2, 2, 2, 782, 783, 3, 2, 2, 2, 783, 1028, 3, 2, 2, 2, 784, 786, 7, 78, 2, 2, 785, 787, 7, 233, 2, 2, 786, 785, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 788, 791, 7, 104, 2, 2, 789, 790, 7, 112, 2, 2, 790, 792, 7, 85, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 793, 3, 2, 2, 2, 793, 1028, 5, 172, 87, 2, 794, 796, 7, 86, 2, 2, 795, 797, 9, 9, 2, 2, 796, 795, 3, 2, 2, 2, 796, 797, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 1028, 5, 16, 9, 2, 799, 800, 7, 217, 2, 2, 800, 803, 7, 230, 2, 2, 801, 802, 9, 5, 2, 2, 802, 804, 5, 172, 87, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 809, 3, 2, 2, 2, 805, 807, 7, 134, 2, 2, 806, 805, 3, 2, 2, 2, 806, 807, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 810, 7, 285, 2, 2, 809, 806, 3, 2, 2, 2, 809, 810, 3, 2, 2, 2, 810, 1028, 3, 2, 2, 2, 811, 812, 7, 217, 2, 2, 812, 813, 7, 229, 2, 2, 813, 816, 7, 88, 2, 2, 814, 815, 9, 5, 2, 2, 815, 817, 5, 172, 87, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 819, 7, 134, 2, 2, 819, 821, 7, 285, 2, 2, 820, 822, 5, 38, 20, 2, 821, 820, 3, 2, 2, 2, 821, 822, 3, 2, 2, 2, 822, 1028, 3, 2, 2, 2, 823, 824, 7, 217, 2, 2, 824, 825, 7, 232, 2, 2, 825, 830, 5, 172, 87, 2, 826, 827, 7, 4, 2, 2, 827, 828, 5, 60, 31, 2, 828, 829, 7, 5, 2, 2, 829, 831, 3, 2, 2, 2, 830, 826, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 1028, 3, 2, 2, 2, 832, 833, 7, 217, 2, 2, 833, 834, 7, 46, 2, 2, 834, 835, 9, 5, 2, 2, 835, 838, 5, 172, 87, 2, 836, 837, 9, 5, 2, 2, 837, 839, 5, 172, 87, 2, 838, 836, 3, 2, 2, 2, 838, 839, 3, 2, 2, 2, 839, 1028, 3, 2, 2, 2, 840, 841, 7, 217, 2, 2, 841, 844, 7, 260, 2, 2, 842, 843, 9, 5, 2, 2, 843, 845, 5, 172, 87, 2, 844, 842, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 850, 3, 2, 2, 2, 846, 848, 7, 134, 2, 2, 847, 846, 3, 2, 2, 2, 847, 848, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 851, 7, 285, 2, 2, 850, 847, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 1028, 3, 2, 2, 2, 852, 853, 7, 217, 2, 2, 853, 854, 7, 174, 2, 2, 854, 856, 5, 172, 87, 2, 855, 857, 5, 38, 20, 2, 856, 855, 3, 2, 2, 2, 856, 857, 3, 2, 2, 2, 857, 1028, 3, 2, 2, 2, 858, 860, 7, 217, 2, 2, 859, 861, 5, 260, 131, 2, 860, 859, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 870, 7, 105, 2, 2, 863, 865, 7, 134, 2, 2, 864, 863, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 868, 3, 2, 2, 2, 866, 869, 5, 172, 87, 2, 867, 869, 7, 285, 2, 2, 868, 866, 3, 2, 2, 2, 868, 867, 3, 2, 2, 2, 869, 871, 3, 2, 2, 2, 870, 864, 3, 2, 2, 2, 870, 871, 3, 2, 2, 2, 871, 1028, 3, 2, 2, 2, 872, 873, 7, 217, 2, 2, 873, 874, 7, 55, 2, 2, 874, 875, 7, 229, 2, 2, 875, 878, 5, 172, 87, 2, 876, 877, 7, 24, 2, 2, 877, 879, 7, 211, 2, 2, 878, 876, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 1028, 3, 2, 2, 2, 880, 881, 7, 217, 2, 2, 881, 882, 7, 58, 2, 2, 882, 1028, 7, 151, 2, 2, 883, 884, 9, 10, 2, 2, 884, 886, 7, 104, 2, 2, 885, 887, 7, 88, 2, 2, 886, 885, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 1028, 5, 44, 23, 2, 889, 890, 9, 10, 2, 2, 890, 892, 5, 42, 22, 2, 891, 893, 7, 88, 2, 2, 892, 891, 3, 2, 2, 2, 892, 893, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 895, 5, 172, 87, 2, 895, 1028, 3, 2, 2, 2, 896, 898, 9, 10, 2, 2, 897, 899, 7, 229, 2, 2, 898, 897, 3, 2, 2, 2, 898, 899, 3, 2, 2, 2, 899, 901, 3, 2, 2, 2, 900, 902, 9, 11, 2, 2, 901, 900, 3, 2, 2, 2, 901, 902, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 5, 172, 87, 2, 904, 906, 5, 38, 20, 2, 905, 904, 3, 2, 2, 2, 905, 906, 3, 2, 2, 2, 906, 908, 3, 2, 2, 2, 907, 909, 5, 46, 24, 2, 908, 907, 3, 2, 2, 2, 908, 909, 3, 2, 2, 2, 909, 1028, 3, 2, 2, 2, 910, 912, 9, 10, 2, 2, 911, 913, 7, 184, 2, 2, 912, 911, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 3, 2, 2, 2, 914, 1028, 5, 32, 17, 2, 915, 916, 7, 47, 2, 2, 916, 917, 7, 159, 2, 2, 917, 918, 5, 42, 22, 2, 918, 919, 5, 172, 87, 2, 919, 920, 7, 125, 2, 2, 920, 921, 9, 12, 2, 2, 921, 1028, 3, 2, 2, 2, 922, 923, 7, 47, 2, 2, 923, 924, 7, 159, 2, 2, 924, 925, 7, 229, 2, 2, 925, 926, 5, 172, 87, 2, 926, 927, 7, 125, 2, 2, 927, 928, 9, 12, 2, 2, 928, 1028, 3, 2, 2, 2, 929, 930, 7, 191, 2, 2, 930, 931, 7, 229, 2, 2, 931, 1028, 5, 172, 87, 2, 932, 940, 7, 191, 2, 2, 933, 941, 7, 285, 2, 2, 934, 936, 11, 2, 2, 2, 935, 934, 3, 2, 2, 2, 936, 939, 3, 2, 2, 2, 937, 938, 3, 2, 2, 2, 937, 935, 3, 2, 2, 2, 938, 941, 3, 2, 2, 2, 939, 937, 3, 2, 2, 2, 940, 933, 3, 2, 2, 2, 940, 937, 3, 2, 2, 2, 941, 1028, 3, 2, 2, 2, 942, 944, 7, 33, 2, 2, 943, 945, 7, 131, 2, 2, 944, 943, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 7, 229, 2, 2, 947, 950, 5, 172, 87, 2, 948, 949, 7, 162, 2, 2, 949, 951, 5, 56, 29, 2, 950, 948, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 956, 3, 2, 2, 2, 952, 954, 7, 24, 2, 2, 953, 952, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 957, 5, 32, 17, 2, 956, 953, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 1028, 3, 2, 2, 2, 958, 959, 7, 248, 2, 2, 959, 962, 7, 229, 2, 2, 960, 961, 7, 112, 2, 2, 961, 963, 7, 85, 2, 2, 962, 960, 3, 2, 2, 2, 962, 963, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 964, 1028, 5, 172, 87, 2, 965, 966, 7, 39, 2, 2, 966, 1028, 7, 33, 2, 2, 967, 968, 7, 138, 2, 2, 968, 970, 7, 63, 2, 2, 969, 971, 7, 139, 2, 2, 970, 969, 3, 2, 2, 2, 970, 971, 3, 2, 2, 2, 971, 972, 3, 2, 2, 2, 972, 973, 7, 119, 2, 2, 973, 975, 7, 285, 2, 2, 974, 976, 7, 171, 2, 2, 975, 974, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 978, 7, 124, 2, 2, 978, 979, 7, 229, 2, 2, 979, 981, 5, 172, 87, 2, 980, 982, 5, 38, 20, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 1028, 3, 2, 2, 2, 983, 984, 7, 244, 2, 2, 984, 985, 7, 229, 2, 2, 985, 987, 5, 172, 87, 2, 986, 988, 5, 38, 20, 2, 987, 986, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 1028, 3, 2, 2, 2, 989, 990, 7, 150, 2, 2, 990, 991, 7, 193, 2, 2, 991, 992, 7, 229, 2, 2, 992, 1028, 5, 172, 87, 2, 993, 994, 9, 13, 2, 2, 994, 1002, 5, 260, 131, 2, 995, 1003, 7, 285, 2, 2, 996, 998, 11, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1001, 3, 2, 2, 2, 999, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1002, 995, 3, 2, 2, 2, 1002, 999, 3, 2, 2, 2, 1003, 1028, 3, 2, 2, 2, 1004, 1005, 7, 214, 2, 2, 1005, 1009, 7, 200, 2, 2, 1006, 1008, 11, 2, 2, 2, 1007, 1006, 3, 2, 2, 2, 1008, 1011, 3, 2, 2, 2, 1009, 1010, 3, 2, 2, 2, 1009, 1007, 3, 2, 2, 2, 1010, 1028, 3, 2, 2, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1016, 7, 214, 2, 2, 1013, 1015, 11, 2, 2, 2, 1014, 1013, 3, 2, 2, 2, 1015, 1018, 3, 2, 2, 2, 1016, 1017, 3, 2, 2, 2, 1016, 1014, 3, 2, 2, 2, 1017, 1028, 3, 2, 2, 2, 1018, 1016, 3, 2, 2, 2, 1019, 1028, 7, 195, 2, 2, 1020, 1024, 5, 18, 10, 2, 1021, 1023, 11, 2, 2, 2, 1022, 1021, 3, 2, 2, 2, 1023, 1026, 3, 2, 2, 2, 1024, 1025, 3, 2, 2, 2, 1024, 1022, 3, 2, 2, 2, 1025, 1028, 3, 2, 2, 2, 1026, 1024, 3, 2, 2, 2, 1027, 303, 3, 2, 2, 2, 1027, 305, 3, 2, 2, 2, 1027, 308, 3, 2, 2, 2, 1027, 313, 3, 2, 2, 2, 1027, 331, 3, 2, 2, 2, 1027, 338, 3, 2, 2, 2, 1027, 344, 3, 2, 2, 2, 1027, 354, 3, 2, 2, 2, 1027, 366, 3, 2, 2, 2, 1027, 384, 3, 2, 2, 2, 1027, 400, 3, 2, 2, 2, 1027, 437, 3, 2, 2, 2, 1027, 458, 3, 2, 2, 2, 1027, 473, 3, 2, 2, 2, 1027, 490, 3, 2, 2, 2, 1027, 497, 3, 2, 2, 2, 1027, 506, 3, 2, 2, 2, 1027, 515, 3, 2, 2, 2, 1027, 524, 3, 2, 2, 2, 1027, 531, 3, 2, 2, 2, 1027, 538, 3, 2, 2, 2, 1027, 545, 3, 2, 2, 2, 1027, 556, 3, 2, 2, 2, 1027, 567, 3, 2, 2, 2, 1027, 582, 3, 2, 2, 2, 1027, 594, 3, 2, 2, 2, 1027, 608, 3, 2, 2, 2, 1027, 618, 3, 2, 2, 2, 1027, 632, 3, 2, 2, 2, 1027, 640, 3, 2, 2, 2, 1027, 659, 3, 2, 2, 2, 1027, 668, 3, 2, 2, 2, 1027, 674, 3, 2, 2, 2, 1027, 684, 3, 2, 2, 2, 1027, 691, 3, 2, 2, 2, 1027, 726, 3, 2, 2, 2, 1027, 748, 3, 2, 2, 2, 1027, 756, 3, 2, 2, 2, 1027, 784, 3, 2, 2, 2, 1027, 794, 3, 2, 2, 2, 1027, 799, 3, 2, 2, 2, 1027, 811, 3, 2, 2, 2, 1027, 823, 3, 2, 2, 2, 1027, 832, 3, 2, 2, 2, 1027, 840, 3, 2, 2, 2, 1027, 852, 3, 2, 2, 2, 1027, 858, 3, 2, 2, 2, 1027, 872, 3, 2, 2, 2, 1027, 880, 3, 2, 2, 2, 1027, 883, 3, 2, 2, 2, 1027, 889, 3, 2, 2, 2, 1027, 896, 3, 2, 2, 2, 1027, 910, 3, 2, 2, 2, 1027, 915, 3, 2, 2, 2, 1027, 922, 3, 2, 2, 2, 1027, 929, 3, 2, 2, 2, 1027, 932, 3, 2, 2, 2, 1027, 942, 3, 2, 2, 2, 1027, 958, 3, 2, 2, 2, 1027, 965, 3, 2, 2, 2, 1027, 967, 3, 2, 2, 2, 1027, 983, 3, 2, 2, 2, 1027, 989, 3, 2, 2, 2, 1027, 993, 3, 2, 2, 2, 1027, 1004, 3, 2, 2, 2, 1027, 1012, 3, 2, 2, 2, 1027, 1019, 3, 2, 2, 2, 1027, 1020, 3, 2, 2, 2, 1028, 17, 3, 2, 2, 2, 1029, 1030, 7, 55, 2, 2, 1030, 1198, 7, 200, 2, 2, 1031, 1032, 7, 78, 2, 2, 1032, 1198, 7, 200, 2, 2, 1033, 1035, 7, 107, 2, 2, 1034, 1036, 7, 200, 2, 2, 1035, 1034, 3, 2, 2, 2, 1035, 1036, 3, 2, 2, 2, 1036, 1198, 3, 2, 2, 2, 1037, 1039, 7, 197, 2, 2, 1038, 1040, 7, 200, 2, 2, 1039, 1038, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 1198, 3, 2, 2, 2, 1041, 1042, 7, 217, 2, 2, 1042, 1198, 7, 107, 2, 2, 1043, 1044, 7, 217, 2, 2, 1044, 1046, 7, 200, 2, 2, 1045, 1047, 7, 107, 2, 2, 1046, 1045, 3, 2, 2, 2, 1046, 1047, 3, 2, 2, 2, 1047, 1198, 3, 2, 2, 2, 1048, 1049, 7, 217, 2, 2, 1049, 1198, 7, 181, 2, 2, 1050, 1051, 7, 217, 2, 2, 1051, 1198, 7, 201, 2, 2, 1052, 1053, 7, 217, 2, 2, 1053, 1054, 7, 58, 2, 2, 1054, 1198, 7, 201, 2, 2, 1055, 1056, 7, 87, 2, 2, 1056, 1198, 7, 229, 2, 2, 1057, 1058, 7, 114, 2, 2, 1058, 1198, 7, 229, 2, 2, 1059, 1060, 7, 217, 2, 2, 1060, 1198, 7, 50, 2, 2, 1061, 1062, 7, 217, 2, 2, 1062, 1063, 7, 55, 2, 2, 1063, 1198, 7, 229, 2, 2, 1064, 1065, 7, 217, 2, 2, 1065, 1198, 7, 240, 2, 2, 1066, 1067, 7, 217, 2, 2, 1067, 1198, 7, 117, 2, 2, 1068, 1069, 7, 217, 2, 2, 1069, 1198, 7, 142, 2, 2, 1070, 1071, 7, 55, 2, 2, 1071, 1198, 7, 116, 2, 2, 1072, 1073, 7, 78, 2, 2, 1073, 1198, 7, 116, 2, 2, 1074, 1075, 7, 17, 2, 2, 1075, 1198, 7, 116, 2, 2, 1076, 1077, 7, 141, 2, 2, 1077, 1198, 7, 229, 2, 2, 1078, 1079, 7, 141, 2, 2, 1079, 1198, 7, 64, 2, 2, 1080, 1081, 7, 252, 2, 2, 1081, 1198, 7, 229, 2, 2, 1082, 1083, 7, 252, 2, 2, 1083, 1198, 7, 64, 2, 2, 1084, 1085, 7, 55, 2, 2, 1085, 1086, 7, 233, 2, 2, 1086, 1198, 7, 144, 2, 2, 1087, 1088, 7, 78, 2, 2, 1088, 1089, 7, 233, 2, 2, 1089, 1198, 7, 144, 2, 2, 1090, 1091, 7, 17, 2, 2, 1091, 1092, 7, 229, 2, 2, 1092, 1093, 5, 174, 88, 2, 1093, 1094, 7, 155, 2, 2, 1094, 1095, 7, 41, 2, 2, 1095, 1198, 3, 2, 2, 2, 1096, 1097, 7, 17, 2, 2, 1097, 1098, 7, 229, 2, 2, 1098, 1099, 5, 174, 88, 2, 1099, 1100, 7, 41, 2, 2, 1100, 1101, 7, 32, 2, 2, 1101, 1198, 3, 2, 2, 2, 1102, 1103, 7, 17, 2, 2, 1103, 1104, 7, 229, 2, 2, 1104, 1105, 5, 174, 88, 2, 1105, 1106, 7, 155, 2, 2, 1106, 1107, 7, 221, 2, 2, 1107, 1198, 3, 2, 2, 2, 1108, 1109, 7, 17, 2, 2, 1109, 1110, 7, 229, 2, 2, 1110, 1111, 5, 174, 88, 2, 1111, 1112, 7, 218, 2, 2, 1112, 1113, 7, 32, 2, 2, 1113, 1198, 3, 2, 2, 2, 1114, 1115, 7, 17, 2, 2, 1115, 1116, 7, 229, 2, 2, 1116, 1117, 5, 174, 88, 2, 1117, 1118, 7, 155, 2, 2, 1118, 1119, 7, 218, 2, 2, 1119, 1198, 3, 2, 2, 2, 1120, 1121, 7, 17, 2, 2, 1121, 1122, 7, 229, 2, 2, 1122, 1123, 5, 174, 88, 2, 1123, 1124, 7, 155, 2, 2, 1124, 1125, 7, 224, 2, 2, 1125, 1126, 7, 24, 2, 2, 1126, 1127, 7, 74, 2, 2, 1127, 1198, 3, 2, 2, 2, 1128, 1129, 7, 17, 2, 2, 1129, 1130, 7, 229, 2, 2, 1130, 1131, 5, 174, 88, 2, 1131, 1132, 7, 214, 2, 2, 1132, 1133, 7, 218, 2, 2, 1133, 1134, 7, 140, 2, 2, 1134, 1198, 3, 2, 2, 2, 1135, 1136, 7, 17, 2, 2, 1136, 1137, 7, 229, 2, 2, 1137, 1138, 5, 174, 88, 2, 1138, 1139, 7, 84, 2, 2, 1139, 1140, 7, 172, 2, 2, 1140, 1198, 3, 2, 2, 2, 1141, 1142, 7, 17, 2, 2, 1142, 1143, 7, 229, 2, 2, 1143, 1144, 5, 174, 88, 2, 1144, 1145, 7, 22, 2, 2, 1145, 1146, 7, 172, 2, 2, 1146, 1198, 3, 2, 2, 2, 1147, 1148, 7, 17, 2, 2, 1148, 1149, 7, 229, 2, 2, 1149, 1150, 5, 174, 88, 2, 1150, 1151, 7, 246, 2, 2, 1151, 1152, 7, 172, 2, 2, 1152, 1198, 3, 2, 2, 2, 1153, 1154, 7, 17, 2, 2, 1154, 1155, 7, 229, 2, 2, 1155, 1156, 5, 174, 88, 2, 1156, 1157, 7, 237, 2, 2, 1157, 1198, 3, 2, 2, 2, 1158, 1159, 7, 17, 2, 2, 1159, 1160, 7, 229, 2, 2, 1160, 1162, 5, 174, 88, 2, 1161, 1163, 5, 38, 20, 2, 1162, 1161, 3, 2, 2, 2, 1162, 1163, 3, 2, 2, 2, 1163, 1164, 3, 2, 2, 2, 1164, 1165, 7, 49, 2, 2, 1165, 1198, 3, 2, 2, 2, 1166, 1167, 7, 17, 2, 2, 1167, 1168, 7, 229, 2, 2, 1168, 1170, 5, 174, 88, 2, 1169, 1171, 5, 38, 20, 2, 1170, 1169, 3, 2, 2, 2, 1170, 1171, 3, 2, 2, 2, 1171, 1172, 3, 2, 2, 2, 1172, 1173, 7, 52, 2, 2, 1173, 1198, 3, 2, 2, 2, 1174, 1175, 7, 17, 2, 2, 1175, 1176, 7, 229, 2, 2, 1176, 1178, 5, 174, 88, 2, 1177, 1179, 5, 38, 20, 2, 1178, 1177, 3, 2, 2, 2, 1178, 1179, 3, 2, 2, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 7, 214, 2, 2, 1181, 1182, 7, 95, 2, 2, 1182, 1198, 3, 2, 2, 2, 1183, 1184, 7, 17, 2, 2, 1184, 1185, 7, 229, 2, 2, 1185, 1187, 5, 174, 88, 2, 1186, 1188, 5, 38, 20, 2, 1187, 1186, 3, 2, 2, 2, 1187, 1188, 3, 2, 2, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 7, 194, 2, 2, 1190, 1191, 7, 46, 2, 2, 1191, 1198, 3, 2, 2, 2, 1192, 1193, 7, 222, 2, 2, 1193, 1198, 7, 239, 2, 2, 1194, 1198, 7, 48, 2, 2, 1195, 1198, 7, 202, 2, 2, 1196, 1198, 7, 73, 2, 2, 1197, 1029, 3, 2, 2, 2, 1197, 1031, 3, 2, 2, 2, 1197, 1033, 3, 2, 2, 2, 1197, 1037, 3, 2, 2, 2, 1197, 1041, 3, 2, 2, 2, 1197, 1043, 3, 2, 2, 2, 1197, 1048, 3, 2, 2, 2, 1197, 1050, 3, 2, 2, 2, 1197, 1052, 3, 2, 2, 2, 1197, 1055, 3, 2, 2, 2, 1197, 1057, 3, 2, 2, 2, 1197, 1059, 3, 2, 2, 2, 1197, 1061, 3, 2, 2, 2, 1197, 1064, 3, 2, 2, 2, 1197, 1066, 3, 2, 2, 2, 1197, 1068, 3, 2, 2, 2, 1197, 1070, 3, 2, 2, 2, 1197, 1072, 3, 2, 2, 2, 1197, 1074, 3, 2, 2, 2, 1197, 1076, 3, 2, 2, 2, 1197, 1078, 3, 2, 2, 2, 1197, 1080, 3, 2, 2, 2, 1197, 1082, 3, 2, 2, 2, 1197, 1084, 3, 2, 2, 2, 1197, 1087, 3, 2, 2, 2, 1197, 1090, 3, 2, 2, 2, 1197, 1096, 3, 2, 2, 2, 1197, 1102, 3, 2, 2, 2, 1197, 1108, 3, 2, 2, 2, 1197, 1114, 3, 2, 2, 2, 1197, 1120, 3, 2, 2, 2, 1197, 1128, 3, 2, 2, 2, 1197, 1135, 3, 2, 2, 2, 1197, 1141, 3, 2, 2, 2, 1197, 1147, 3, 2, 2, 2, 1197, 1153, 3, 2, 2, 2, 1197, 1158, 3, 2, 2, 2, 1197, 1166, 3, 2, 2, 2, 1197, 1174, 3, 2, 2, 2, 1197, 1183, 3, 2, 2, 2, 1197, 1192, 3, 2, 2, 2, 1197, 1194, 3, 2, 2, 2, 1197, 1195, 3, 2, 2, 2, 1197, 1196, 3, 2, 2, 2, 1198, 19, 3, 2, 2, 2, 1199, 1201, 7, 55, 2, 2, 1200, 1202, 7, 233, 2, 2, 1201, 1200, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1204, 3, 2, 2, 2, 1203, 1205, 7, 89, 2, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1210, 7, 229, 2, 2, 1207, 1208, 7, 112, 2, 2, 1208, 1209, 7, 155, 2, 2, 1209, 1211, 7, 85, 2, 2, 1210, 1207, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1212, 3, 2, 2, 2, 1212, 1213, 5, 172, 87, 2, 1213, 21, 3, 2, 2, 2, 1214, 1215, 7, 55, 2, 2, 1215, 1217, 7, 163, 2, 2, 1216, 1214, 3, 2, 2, 2, 1216, 1217, 3, 2, 2, 2, 1217, 1218, 3, 2, 2, 2, 1218, 1219, 7, 194, 2, 2, 1219, 1220, 7, 229, 2, 2, 1220, 1221, 5, 172, 87, 2, 1221, 23, 3, 2, 2, 2, 1222, 1223, 7, 41, 2, 2, 1223, 1224, 7, 32, 2, 2, 1224, 1228, 5, 148, 75, 2, 1225, 1226, 7, 221, 2, 2, 1226, 1227, 7, 32, 2, 2, 1227, 1229, 5, 152, 77, 2, 1228, 1225, 3, 2, 2, 2, 1228, 1229, 3, 2, 2, 2, 1229, 1230, 3, 2, 2, 2, 1230, 1231, 7, 124, 2, 2, 1231, 1232, 7, 289, 2, 2, 1232, 1233, 7, 31, 2, 2, 1233, 25, 3, 2, 2, 2, 1234, 1235, 7, 218, 2, 2, 1235, 1236, 7, 32, 2, 2, 1236, 1237, 5, 148, 75, 2, 1237, 1240, 7, 159, 2, 2, 1238, 1241, 5, 64, 33, 2, 1239, 1241, 5, 66, 34, 2, 1240, 1238, 3, 2, 2, 2, 1240, 1239, 3, 2, 2, 2, 1241, 1245, 3, 2, 2, 2, 1242, 1243, 7, 224, 2, 2, 1243, 1244, 7, 24, 2, 2, 1244, 1246, 7, 74, 2, 2, 1245, 1242, 3, 2, 2, 2, 1245, 1246, 3, 2, 2, 2, 1246, 27, 3, 2, 2, 2, 1247, 1248, 7, 140, 2, 2, 1248, 1249, 7, 285, 2, 2, 1249, 29, 3, 2, 2, 2, 1250, 1251, 7, 47, 2, 2, 1251, 1252, 7, 285, 2, 2, 1252, 31, 3, 2, 2, 2, 1253, 1255, 5, 48, 25, 2, 1254, 1253, 3, 2, 2, 2, 1254, 1255, 3, 2, 2, 2, 1255, 1256, 3, 2, 2, 2, 1256, 1257, 5, 82, 42, 2, 1257, 1258, 5, 78, 40, 2, 1258, 33, 3, 2, 2, 2, 1259, 1260, 7, 121, 2, 2, 1260, 1262, 7, 171, 2, 2, 1261, 1263, 7, 229, 2, 2, 1262, 1261, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1264, 3, 2, 2, 2, 1264, 1271, 5, 172, 87, 2, 1265, 1269, 5, 38, 20, 2, 1266, 1267, 7, 112, 2, 2, 1267, 1268, 7, 155, 2, 2, 1268, 1270, 7, 85, 2, 2, 1269, 1266, 3, 2, 2, 2, 1269, 1270, 3, 2, 2, 2, 1270, 1272, 3, 2, 2, 2, 1271, 1265, 3, 2, 2, 2, 1271, 1272, 3, 2, 2, 2, 1272, 1315, 3, 2, 2, 2, 1273, 1274, 7, 121, 2, 2, 1274, 1276, 7, 124, 2, 2, 1275, 1277, 7, 229, 2, 2, 1276, 1275, 3, 2, 2, 2, 1276, 1277, 3, 2, 2, 2, 1277, 1278, 3, 2, 2, 2, 1278, 1280, 5, 172, 87, 2, 1279, 1281, 5, 38, 20, 2, 1280, 1279, 3, 2, 2, 2, 1280, 1281, 3, 2, 2, 2, 1281, 1285, 3, 2, 2, 2, 1282, 1283, 7, 112, 2, 2, 1283, 1284, 7, 155, 2, 2, 1284, 1286, 7, 85, 2, 2, 1285, 1282, 3, 2, 2, 2, 1285, 1286, 3, 2, 2, 2, 1286, 1315, 3, 2, 2, 2, 1287, 1288, 7, 121, 2, 2, 1288, 1290, 7, 171, 2, 2, 1289, 1291, 7, 139, 2, 2, 1290, 1289, 3, 2, 2, 2, 1290, 1291, 3, 2, 2, 2, 1291, 1292, 3, 2, 2, 2, 1292, 1293, 7, 75, 2, 2, 1293, 1295, 7, 285, 2, 2, 1294, 1296, 5, 168, 85, 2, 1295, 1294, 3, 2, 2, 2, 1295, 1296, 3, 2, 2, 2, 1296, 1298, 3, 2, 2, 2, 1297, 1299, 5, 68, 35, 2, 1298, 1297, 3, 2, 2, 2, 1298, 1299, 3, 2, 2, 2, 1299, 1315, 3, 2, 2, 2, 1300, 1301, 7, 121, 2, 2, 1301, 1303, 7, 171, 2, 2, 1302, 1304, 7, 139, 2, 2, 1303, 1302, 3, 2, 2, 2, 1303, 1304, 3, 2, 2, 2, 1304, 1305, 3, 2, 2, 2, 1305, 1307, 7, 75, 2, 2, 1306, 1308, 7, 285, 2, 2, 1307, 1306, 3, 2, 2, 2, 1307, 1308, 3, 2, 2, 2, 1308, 1309, 3, 2, 2, 2, 1309, 1312, 5, 52, 27, 2, 1310, 1311, 7, 162, 2, 2, 1311, 1313, 5, 56, 29, 2, 1312, 1310, 3, 2, 2, 2, 1312, 1313, 3, 2, 2, 2, 1313, 1315, 3, 2, 2, 2, 1314, 1259, 3, 2, 2, 2, 1314, 1273, 3, 2, 2, 2, 1314, 1287, 3, 2, 2, 2, 1314, 1300, 3, 2, 2, 2, 1315, 35, 3, 2, 2, 2, 1316, 1318, 5, 38, 20, 2, 1317, 1319, 5, 28, 15, 2, 1318, 1317, 3, 2, 2, 2, 1318, 1319, 3, 2, 2, 2, 1319, 37, 3, 2, 2, 2, 1320, 1321, 7, 172, 2, 2, 1321, 1322, 7, 4, 2, 2, 1322, 1327, 5, 40, 21, 2, 1323, 1324, 7, 6, 2, 2, 1324, 1326, 5, 40, 21, 2, 1325, 1323, 3, 2, 2, 2, 1326, 1329, 3, 2, 2, 2, 1327, 1325, 3, 2, 2, 2, 1327, 1328, 3, 2, 2, 2, 1328, 1330, 3, 2, 2, 2, 1329, 1327, 3, 2, 2, 2, 1330, 1331, 7, 5, 2, 2, 1331, 39, 3, 2, 2, 2, 1332, 1335, 5, 260, 131, 2, 1333, 1334, 7, 266, 2, 2, 1334, 1336, 5, 198, 100, 2, 1335, 1333, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 41, 3, 2, 2, 2, 1337, 1338, 9, 14, 2, 2, 1338, 43, 3, 2, 2, 2, 1339, 1345, 5, 254, 128, 2, 1340, 1345, 7, 285, 2, 2, 1341, 1345, 5, 200, 101, 2, 1342, 1345, 5, 202, 102, 2, 1343, 1345, 5, 204, 103, 2, 1344, 1339, 3, 2, 2, 2, 1344, 1340, 3, 2, 2, 2, 1344, 1341, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1343, 3, 2, 2, 2, 1345, 45, 3, 2, 2, 2, 1346, 1351, 5, 260, 131, 2, 1347, 1348, 7, 7, 2, 2, 1348, 1350, 5, 260, 131, 2, 1349, 1347, 3, 2, 2, 2, 1350, 1353, 3, 2, 2, 2, 1351, 1349, 3, 2, 2, 2, 1351, 1352, 3, 2, 2, 2, 1352, 47, 3, 2, 2, 2, 1353, 1351, 3, 2, 2, 2, 1354, 1355, 7, 264, 2, 2, 1355, 1360, 5, 50, 26, 2, 1356, 1357, 7, 6, 2, 2, 1357, 1359, 5, 50, 26, 2, 1358, 1356, 3, 2, 2, 2, 1359, 1362, 3, 2, 2, 2, 1360, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 49, 3, 2, 2, 2, 1362, 1360, 3, 2, 2, 2, 1363, 1365, 5, 256, 129, 2, 1364, 1366, 5, 148, 75, 2, 1365, 1364, 3, 2, 2, 2, 1365, 1366, 3, 2, 2, 2, 1366, 1368, 3, 2, 2, 2, 1367, 1369, 7, 24, 2, 2, 1368, 1367, 3, 2, 2, 2, 1368, 1369, 3, 2, 2, 2, 1369, 1370, 3, 2, 2, 2, 1370, 1371, 7, 4, 2, 2, 1371, 1372, 5, 32, 17, 2, 1372, 1373, 7, 5, 2, 2, 1373, 51, 3, 2, 2, 2, 1374, 1375, 7, 257, 2, 2, 1375, 1376, 5, 172, 87, 2, 1376, 53, 3, 2, 2, 2, 1377, 1378, 7, 162, 2, 2, 1378, 1388, 5, 56, 29, 2, 1379, 1380, 7, 173, 2, 2, 1380, 1381, 7, 32, 2, 2, 1381, 1388, 5, 182, 92, 2, 1382, 1388, 5, 24, 13, 2, 1383, 1388, 5, 28, 15, 2, 1384, 1388, 5, 30, 16, 2, 1385, 1386, 7, 232, 2, 2, 1386, 1388, 5, 56, 29, 2, 1387, 1377, 3, 2, 2, 2, 1387, 1379, 3, 2, 2, 2, 1387, 1382, 3, 2, 2, 2, 1387, 1383, 3, 2, 2, 2, 1387, 1384, 3, 2, 2, 2, 1387, 1385, 3, 2, 2, 2, 1388, 1391, 3, 2, 2, 2, 1389, 1387, 3, 2, 2, 2, 1389, 1390, 3, 2, 2, 2, 1390, 55, 3, 2, 2, 2, 1391, 1389, 3, 2, 2, 2, 1392, 1393, 7, 4, 2, 2, 1393, 1398, 5, 58, 30, 2, 1394, 1395, 7, 6, 2, 2, 1395, 1397, 5, 58, 30, 2, 1396, 1394, 3, 2, 2, 2, 1397, 1400, 3, 2, 2, 2, 1398, 1396, 3, 2, 2, 2, 1398, 1399, 3, 2, 2, 2, 1399, 1401, 3, 2, 2, 2, 1400, 1398, 3, 2, 2, 2, 1401, 1402, 7, 5, 2, 2, 1402, 57, 3, 2, 2, 2, 1403, 1408, 5, 60, 31, 2, 1404, 1406, 7, 266, 2, 2, 1405, 1404, 3, 2, 2, 2, 1405, 1406, 3, 2, 2, 2, 1406, 1407, 3, 2, 2, 2, 1407, 1409, 5, 62, 32, 2, 1408, 1405, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 59, 3, 2, 2, 2, 1410, 1415, 5, 260, 131, 2, 1411, 1412, 7, 7, 2, 2, 1412, 1414, 5, 260, 131, 2, 1413, 1411, 3, 2, 2, 2, 1414, 1417, 3, 2, 2, 2, 1415, 1413, 3, 2, 2, 2, 1415, 1416, 3, 2, 2, 2, 1416, 1420, 3, 2, 2, 2, 1417, 1415, 3, 2, 2, 2, 1418, 1420, 7, 285, 2, 2, 1419, 1410, 3, 2, 2, 2, 1419, 1418, 3, 2, 2, 2, 1420, 61, 3, 2, 2, 2, 1421, 1426, 7, 289, 2, 2, 1422, 1426, 7, 291, 2, 2, 1423, 1426, 5, 206, 104, 2, 1424, 1426, 7, 285, 2, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1422, 3, 2, 2, 2, 1425, 1423, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 63, 3, 2, 2, 2, 1427, 1428, 7, 4, 2, 2, 1428, 1433, 5, 198, 100, 2, 1429, 1430, 7, 6, 2, 2, 1430, 1432, 5, 198, 100, 2, 1431, 1429, 3, 2, 2, 2, 1432, 1435, 3, 2, 2, 2, 1433, 1431, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1436, 3, 2, 2, 2, 1435, 1433, 3, 2, 2, 2, 1436, 1437, 7, 5, 2, 2, 1437, 65, 3, 2, 2, 2, 1438, 1439, 7, 4, 2, 2, 1439, 1444, 5, 64, 33, 2, 1440, 1441, 7, 6, 2, 2, 1441, 1443, 5, 64, 33, 2, 1442, 1440, 3, 2, 2, 2, 1443, 1446, 3, 2, 2, 2, 1444, 1442, 3, 2, 2, 2, 1444, 1445, 3, 2, 2, 2, 1445, 1447, 3, 2, 2, 2, 1446, 1444, 3, 2, 2, 2, 1447, 1448, 7, 5, 2, 2, 1448, 67, 3, 2, 2, 2, 1449, 1450, 7, 224, 2, 2, 1450, 1451, 7, 24, 2, 2, 1451, 1456, 5, 70, 36, 2, 1452, 1453, 7, 224, 2, 2, 1453, 1454, 7, 32, 2, 2, 1454, 1456, 5, 72, 37, 2, 1455, 1449, 3, 2, 2, 2, 1455, 1452, 3, 2, 2, 2, 1456, 69, 3, 2, 2, 2, 1457, 1458, 7, 120, 2, 2, 1458, 1459, 7, 285, 2, 2, 1459, 1460, 7, 167, 2, 2, 1460, 1463, 7, 285, 2, 2, 1461, 1463, 5, 260, 131, 2, 1462, 1457, 3, 2, 2, 2, 1462, 1461, 3, 2, 2, 2, 1463, 71, 3, 2, 2, 2, 1464, 1468, 7, 285, 2, 2, 1465, 1466, 7, 264, 2, 2, 1466, 1467, 7, 212, 2, 2, 1467, 1469, 5, 56, 29, 2, 1468, 1465, 3, 2, 2, 2, 1468, 1469, 3, 2, 2, 2, 1469, 73, 3, 2, 2, 2, 1470, 1471, 5, 260, 131, 2, 1471, 1472, 7, 285, 2, 2, 1472, 75, 3, 2, 2, 2, 1473, 1474, 5, 34, 18, 2, 1474, 1475, 5, 82, 42, 2, 1475, 1476, 5, 78, 40, 2, 1476, 1525, 3, 2, 2, 2, 1477, 1479, 5, 120, 61, 2, 1478, 1480, 5, 80, 41, 2, 1479, 1478, 3, 2, 2, 2, 1480, 1481, 3, 2, 2, 2, 1481, 1479, 3, 2, 2, 2, 1481, 1482, 3, 2, 2, 2, 1482, 1525, 3, 2, 2, 2, 1483, 1484, 7, 69, 2, 2, 1484, 1485, 7, 102, 2, 2, 1485, 1486, 5, 172, 87, 2, 1486, 1488, 5, 166, 84, 2, 1487, 1489, 5, 112, 57, 2, 1488, 1487, 3, 2, 2, 2, 1488, 1489, 3, 2, 2, 2, 1489, 1525, 3, 2, 2, 2, 1490, 1491, 7, 254, 2, 2, 1491, 1492, 5, 172, 87, 2, 1492, 1493, 5, 166, 84, 2, 1493, 1495, 5, 98, 50, 2, 1494, 1496, 5, 112, 57, 2, 1495, 1494, 3, 2, 2, 2, 1495, 1496, 3, 2, 2, 2, 1496, 1525, 3, 2, 2, 2, 1497, 1498, 7, 147, 2, 2, 1498, 1499, 7, 124, 2, 2, 1499, 1500, 5, 172, 87, 2, 1500, 1501, 5, 166, 84, 2, 1501, 1507, 7, 257, 2, 2, 1502, 1508, 5, 172, 87, 2, 1503, 1504, 7, 4, 2, 2, 1504, 1505, 5, 32, 17, 2, 1505, 1506, 7, 5, 2, 2, 1506, 1508, 3, 2, 2, 2, 1507, 1502, 3, 2, 2, 2, 1507, 1503, 3, 2, 2, 2, 1508, 1509, 3, 2, 2, 2, 1509, 1510, 5, 166, 84, 2, 1510, 1511, 7, 159, 2, 2, 1511, 1515, 5, 190, 96, 2, 1512, 1514, 5, 100, 51, 2, 1513, 1512, 3, 2, 2, 2, 1514, 1517, 3, 2, 2, 2, 1515, 1513, 3, 2, 2, 2, 1515, 1516, 3, 2, 2, 2, 1516, 1521, 3, 2, 2, 2, 1517, 1515, 3, 2, 2, 2, 1518, 1520, 5, 102, 52, 2, 1519, 1518, 3, 2, 2, 2, 1520, 1523, 3, 2, 2, 2, 1521, 1519, 3, 2, 2, 2, 1521, 1522, 3, 2, 2, 2, 1522, 1525, 3, 2, 2, 2, 1523, 1521, 3, 2, 2, 2, 1524, 1473, 3, 2, 2, 2, 1524, 1477, 3, 2, 2, 2, 1524, 1483, 3, 2, 2, 2, 1524, 1490, 3, 2, 2, 2, 1524, 1497, 3, 2, 2, 2, 1525, 77, 3, 2, 2, 2, 1526, 1527, 7, 164, 2, 2, 1527, 1528, 7, 32, 2, 2, 1528, 1533, 5, 86, 44, 2, 1529, 1530, 7, 6, 2, 2, 1530, 1532, 5, 86, 44, 2, 1531, 1529, 3, 2, 2, 2, 1532, 1535, 3, 2, 2, 2, 1533, 1531, 3, 2, 2, 2, 1533, 1534, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1536, 1526, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1548, 3, 2, 2, 2, 1538, 1539, 7, 40, 2, 2, 1539, 1540, 7, 32, 2, 2, 1540, 1545, 5, 188, 95, 2, 1541, 1542, 7, 6, 2, 2, 1542, 1544, 5, 188, 95, 2, 1543, 1541, 3, 2, 2, 2, 1544, 1547, 3, 2, 2, 2, 1545, 1543, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1549, 3, 2, 2, 2, 1547, 1545, 3, 2, 2, 2, 1548, 1538, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1560, 3, 2, 2, 2, 1550, 1551, 7, 77, 2, 2, 1551, 1552, 7, 32, 2, 2, 1552, 1557, 5, 188, 95, 2, 1553, 1554, 7, 6, 2, 2, 1554, 1556, 5, 188, 95, 2, 1555, 1553, 3, 2, 2, 2, 1556, 1559, 3, 2, 2, 2, 1557, 1555, 3, 2, 2, 2, 1557, 1558, 3, 2, 2, 2, 1558, 1561, 3, 2, 2, 2, 1559, 1557, 3, 2, 2, 2, 1560, 1550, 3, 2, 2, 2, 1560, 1561, 3, 2, 2, 2, 1561, 1572, 3, 2, 2, 2, 1562, 1563, 7, 220, 2, 2, 1563, 1564, 7, 32, 2, 2, 1564, 1569, 5, 86, 44, 2, 1565, 1566, 7, 6, 2, 2, 1566, 1568, 5, 86, 44, 2, 1567, 1565, 3, 2, 2, 2, 1568, 1571, 3, 2, 2, 2, 1569, 1567, 3, 2, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1573, 3, 2, 2, 2, 1571, 1569, 3, 2, 2, 2, 1572, 1562, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1575, 3, 2, 2, 2, 1574, 1576, 5, 240, 121, 2, 1575, 1574, 3, 2, 2, 2, 1575, 1576, 3, 2, 2, 2, 1576, 1582, 3, 2, 2, 2, 1577, 1580, 7, 135, 2, 2, 1578, 1581, 7, 16, 2, 2, 1579, 1581, 5, 188, 95, 2, 1580, 1578, 3, 2, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 1583, 3, 2, 2, 2, 1582, 1577, 3, 2, 2, 2, 1582, 1583, 3, 2, 2, 2, 1583, 79, 3, 2, 2, 2, 1584, 1585, 5, 34, 18, 2, 1585, 1586, 5, 90, 46, 2, 1586, 81, 3, 2, 2, 2, 1587, 1588, 8, 42, 1, 2, 1588, 1589, 5, 84, 43, 2, 1589, 1613, 3, 2, 2, 2, 1590, 1591, 12, 5, 2, 2, 1591, 1592, 6, 42, 5, 2, 1592, 1594, 9, 15, 2, 2, 1593, 1595, 5, 134, 68, 2, 1594, 1593, 3, 2, 2, 2, 1594, 1595, 3, 2, 2, 2, 1595, 1596, 3, 2, 2, 2, 1596, 1612, 5, 82, 42, 6, 1597, 1598, 12, 4, 2, 2, 1598, 1599, 6, 42, 7, 2, 1599, 1601, 7, 122, 2, 2, 1600, 1602, 5, 134, 68, 2, 1601, 1600, 3, 2, 2, 2, 1601, 1602, 3, 2, 2, 2, 1602, 1603, 3, 2, 2, 2, 1603, 1612, 5, 82, 42, 5, 1604, 1605, 12, 3, 2, 2, 1605, 1606, 6, 42, 9, 2, 1606, 1608, 9, 16, 2, 2, 1607, 1609, 5, 134, 68, 2, 1608, 1607, 3, 2, 2, 2, 1608, 1609, 3, 2, 2, 2, 1609, 1610, 3, 2, 2, 2, 1610, 1612, 5, 82, 42, 4, 1611, 1590, 3, 2, 2, 2, 1611, 1597, 3, 2, 2, 2, 1611, 1604, 3, 2, 2, 2, 1612, 1615, 3, 2, 2, 2, 1613, 1611, 3, 2, 2, 2, 1613, 1614, 3, 2, 2, 2, 1614, 83, 3, 2, 2, 2, 1615, 1613, 3, 2, 2, 2, 1616, 1626, 5, 92, 47, 2, 1617, 1626, 5, 88, 45, 2, 1618, 1619, 7, 229, 2, 2, 1619, 1626, 5, 172, 87, 2, 1620, 1626, 5, 162, 82, 2, 1621, 1622, 7, 4, 2, 2, 1622, 1623, 5, 32, 17, 2, 1623, 1624, 7, 5, 2, 2, 1624, 1626, 3, 2, 2, 2, 1625, 1616, 3, 2, 2, 2, 1625, 1617, 3, 2, 2, 2, 1625, 1618, 3, 2, 2, 2, 1625, 1620, 3, 2, 2, 2, 1625, 1621, 3, 2, 2, 2, 1626, 85, 3, 2, 2, 2, 1627, 1629, 5, 188, 95, 2, 1628, 1630, 9, 17, 2, 2, 1629, 1628, 3, 2, 2, 2, 1629, 1630, 3, 2, 2, 2, 1630, 1633, 3, 2, 2, 2, 1631, 1632, 7, 157, 2, 2, 1632, 1634, 9, 18, 2, 2, 1633, 1631, 3, 2, 2, 2, 1633, 1634, 3, 2, 2, 2, 1634, 87, 3, 2, 2, 2, 1635, 1637, 5, 120, 61, 2, 1636, 1638, 5, 90, 46, 2, 1637, 1636, 3, 2, 2, 2, 1638, 1639, 3, 2, 2, 2, 1639, 1637, 3, 2, 2, 2, 1639, 1640, 3, 2, 2, 2, 1640, 89, 3, 2, 2, 2, 1641, 1643, 5, 94, 48, 2, 1642, 1644, 5, 112, 57, 2, 1643, 1642, 3, 2, 2, 2, 1643, 1644, 3, 2, 2, 2, 1644, 1645, 3, 2, 2, 2, 1645, 1646, 5, 78, 40, 2, 1646, 1669, 3, 2, 2, 2, 1647, 1651, 5, 96, 49, 2, 1648, 1650, 5, 132, 67, 2, 1649, 1648, 3, 2, 2, 2, 1650, 1653, 3, 2, 2, 2, 1651, 1649, 3, 2, 2, 2, 1651, 1652, 3, 2, 2, 2, 1652, 1655, 3, 2, 2, 2, 1653, 1651, 3, 2, 2, 2, 1654, 1656, 5, 112, 57, 2, 1655, 1654, 3, 2, 2, 2, 1655, 1656, 3, 2, 2, 2, 1656, 1658, 3, 2, 2, 2, 1657, 1659, 5, 122, 62, 2, 1658, 1657, 3, 2, 2, 2, 1658, 1659, 3, 2, 2, 2, 1659, 1661, 3, 2, 2, 2, 1660, 1662, 5, 114, 58, 2, 1661, 1660, 3, 2, 2, 2, 1661, 1662, 3, 2, 2, 2, 1662, 1664, 3, 2, 2, 2, 1663, 1665, 5, 240, 121, 2, 1664, 1663, 3, 2, 2, 2, 1664, 1665, 3, 2, 2, 2, 1665, 1666, 3, 2, 2, 2, 1666, 1667, 5, 78, 40, 2, 1667, 1669, 3, 2, 2, 2, 1668, 1641, 3, 2, 2, 2, 1668, 1647, 3, 2, 2, 2, 1669, 91, 3, 2, 2, 2, 1670, 1672, 5, 94, 48, 2, 1671, 1673, 5, 120, 61, 2, 1672, 1671, 3, 2, 2, 2, 1672, 1673, 3, 2, 2, 2, 1673, 1675, 3, 2, 2, 2, 1674, 1676, 5, 112, 57, 2, 1675, 1674, 3, 2, 2, 2, 1675, 1676, 3, 2, 2, 2, 1676, 1700, 3, 2, 2, 2, 1677, 1679, 5, 96, 49, 2, 1678, 1680, 5, 120, 61, 2, 1679, 1678, 3, 2, 2, 2, 1679, 1680, 3, 2, 2, 2, 1680, 1684, 3, 2, 2, 2, 1681, 1683, 5, 132, 67, 2, 1682, 1681, 3, 2, 2, 2, 1683, 1686, 3, 2, 2, 2, 1684, 1682, 3, 2, 2, 2, 1684, 1685, 3, 2, 2, 2, 1685, 1688, 3, 2, 2, 2, 1686, 1684, 3, 2, 2, 2, 1687, 1689, 5, 112, 57, 2, 1688, 1687, 3, 2, 2, 2, 1688, 1689, 3, 2, 2, 2, 1689, 1691, 3, 2, 2, 2, 1690, 1692, 5, 122, 62, 2, 1691, 1690, 3, 2, 2, 2, 1691, 1692, 3, 2, 2, 2, 1692, 1694, 3, 2, 2, 2, 1693, 1695, 5, 114, 58, 2, 1694, 1693, 3, 2, 2, 2, 1694, 1695, 3, 2, 2, 2, 1695, 1697, 3, 2, 2, 2, 1696, 1698, 5, 240, 121, 2, 1697, 1696, 3, 2, 2, 2, 1697, 1698, 3, 2, 2, 2, 1698, 1700, 3, 2, 2, 2, 1699, 1670, 3, 2, 2, 2, 1699, 1677, 3, 2, 2, 2, 1700, 93, 3, 2, 2, 2, 1701, 1702, 7, 208, 2, 2, 1702, 1703, 7, 241, 2, 2, 1703, 1704, 7, 4, 2, 2, 1704, 1705, 5, 180, 91, 2, 1705, 1706, 7, 5, 2, 2, 1706, 1712, 3, 2, 2, 2, 1707, 1708, 7, 145, 2, 2, 1708, 1712, 5, 180, 91, 2, 1709, 1710, 7, 189, 2, 2, 1710, 1712, 5, 180, 91, 2, 1711, 1701, 3, 2, 2, 2, 1711, 1707, 3, 2, 2, 2, 1711, 1709, 3, 2, 2, 2, 1712, 1714, 3, 2, 2, 2, 1713, 1715, 5, 168, 85, 2, 1714, 1713, 3, 2, 2, 2, 1714, 1715, 3, 2, 2, 2, 1715, 1718, 3, 2, 2, 2, 1716, 1717, 7, 187, 2, 2, 1717, 1719, 7, 285, 2, 2, 1718, 1716, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1720, 3, 2, 2, 2, 1720, 1721, 7, 257, 2, 2, 1721, 1734, 7, 285, 2, 2, 1722, 1732, 7, 24, 2, 2, 1723, 1733, 5, 150, 76, 2, 1724, 1733, 5, 230, 116, 2, 1725, 1728, 7, 4, 2, 2, 1726, 1729, 5, 150, 76, 2, 1727, 1729, 5, 230, 116, 2, 1728, 1726, 3, 2, 2, 2, 1728, 1727, 3, 2, 2, 2, 1729, 1730, 3, 2, 2, 2, 1730, 1731, 7, 5, 2, 2, 1731, 1733, 3, 2, 2, 2, 1732, 1723, 3, 2, 2, 2, 1732, 1724, 3, 2, 2, 2, 1732, 1725, 3, 2, 2, 2, 1733, 1735, 3, 2, 2, 2, 1734, 1722, 3, 2, 2, 2, 1734, 1735, 3, 2, 2, 2, 1735, 1737, 3, 2, 2, 2, 1736, 1738, 5, 168, 85, 2, 1737, 1736, 3, 2, 2, 2, 1737, 1738, 3, 2, 2, 2, 1738, 1741, 3, 2, 2, 2, 1739, 1740, 7, 186, 2, 2, 1740, 1742, 7, 285, 2, 2, 1741, 1739, 3, 2, 2, 2, 1741, 1742, 3, 2, 2, 2, 1742, 95, 3, 2, 2, 2, 1743, 1747, 7, 208, 2, 2, 1744, 1746, 5, 116, 59, 2, 1745, 1744, 3, 2, 2, 2, 1746, 1749, 3, 2, 2, 2, 1747, 1745, 3, 2, 2, 2, 1747, 1748, 3, 2, 2, 2, 1748, 1751, 3, 2, 2, 2, 1749, 1747, 3, 2, 2, 2, 1750, 1752, 5, 134, 68, 2, 1751, 1750, 3, 2, 2, 2, 1751, 1752, 3, 2, 2, 2, 1752, 1753, 3, 2, 2, 2, 1753, 1754, 5, 180, 91, 2, 1754, 97, 3, 2, 2, 2, 1755, 1756, 7, 214, 2, 2, 1756, 1757, 5, 108, 55, 2, 1757, 99, 3, 2, 2, 2, 1758, 1759, 7, 261, 2, 2, 1759, 1762, 7, 146, 2, 2, 1760, 1761, 7, 19, 2, 2, 1761, 1763, 5, 190, 96, 2, 1762, 1760, 3, 2, 2, 2, 1762, 1763, 3, 2, 2, 2, 1763, 1764, 3, 2, 2, 2, 1764, 1765, 7, 235, 2, 2, 1765, 1766, 5, 104, 53, 2, 1766, 101, 3, 2, 2, 2, 1767, 1768, 7, 261, 2, 2, 1768, 1769, 7, 155, 2, 2, 1769, 1772, 7, 146, 2, 2, 1770, 1771, 7, 19, 2, 2, 1771, 1773, 5, 190, 96, 2, 1772, 1770, 3, 2, 2, 2, 1772, 1773, 3, 2, 2, 2, 1773, 1774, 3, 2, 2, 2, 1774, 1775, 7, 235, 2, 2, 1775, 1776, 5, 106, 54, 2, 1776, 103, 3, 2, 2, 2, 1777, 1785, 7, 69, 2, 2, 1778, 1779, 7, 254, 2, 2, 1779, 1780, 7, 214, 2, 2, 1780, 1785, 7, 276, 2, 2, 1781, 1782, 7, 254, 2, 2, 1782, 1783, 7, 214, 2, 2, 1783, 1785, 5, 108, 55, 2, 1784, 1777, 3, 2, 2, 2, 1784, 1778, 3, 2, 2, 2, 1784, 1781, 3, 2, 2, 2, 1785, 105, 3, 2, 2, 2, 1786, 1787, 7, 121, 2, 2, 1787, 1805, 7, 276, 2, 2, 1788, 1789, 7, 121, 2, 2, 1789, 1790, 7, 4, 2, 2, 1790, 1791, 5, 170, 86, 2, 1791, 1792, 7, 5, 2, 2, 1792, 1793, 7, 258, 2, 2, 1793, 1794, 7, 4, 2, 2, 1794, 1799, 5, 188, 95, 2, 1795, 1796, 7, 6, 2, 2, 1796, 1798, 5, 188, 95, 2, 1797, 1795, 3, 2, 2, 2, 1798, 1801, 3, 2, 2, 2, 1799, 1797, 3, 2, 2, 2, 1799, 1800, 3, 2, 2, 2, 1800, 1802, 3, 2, 2, 2, 1801, 1799, 3, 2, 2, 2, 1802, 1803, 7, 5, 2, 2, 1803, 1805, 3, 2, 2, 2, 1804, 1786, 3, 2, 2, 2, 1804, 1788, 3, 2, 2, 2, 1805, 107, 3, 2, 2, 2, 1806, 1811, 5, 110, 56, 2, 1807, 1808, 7, 6, 2, 2, 1808, 1810, 5, 110, 56, 2, 1809, 1807, 3, 2, 2, 2, 1810, 1813, 3, 2, 2, 2, 1811, 1809, 3, 2, 2, 2, 1811, 1812, 3, 2, 2, 2, 1812, 109, 3, 2, 2, 2, 1813, 1811, 3, 2, 2, 2, 1814, 1815, 5, 172, 87, 2, 1815, 1816, 7, 266, 2, 2, 1816, 1817, 5, 188, 95, 2, 1817, 111, 3, 2, 2, 2, 1818, 1819, 7, 262, 2, 2, 1819, 1820, 5, 190, 96, 2, 1820, 113, 3, 2, 2, 2, 1821, 1822, 7, 110, 2, 2, 1822, 1823, 5, 190, 96, 2, 1823, 115, 3, 2, 2, 2, 1824, 1825, 7, 8, 2, 2, 1825, 1832, 5, 118, 60, 2, 1826, 1828, 7, 6, 2, 2, 1827, 1826, 3, 2, 2, 2, 1827, 1828, 3, 2, 2, 2, 1828, 1829, 3, 2, 2, 2, 1829, 1831, 5, 118, 60, 2, 1830, 1827, 3, 2, 2, 2, 1831, 1834, 3, 2, 2, 2, 1832, 1830, 3, 2, 2, 2, 1832, 1833, 3, 2, 2, 2, 1833, 1835, 3, 2, 2, 2, 1834, 1832, 3, 2, 2, 2, 1835, 1836, 7, 9, 2, 2, 1836, 117, 3, 2, 2, 2, 1837, 1851, 5, 260, 131, 2, 1838, 1839, 5, 260, 131, 2, 1839, 1840, 7, 4, 2, 2, 1840, 1845, 5, 196, 99, 2, 1841, 1842, 7, 6, 2, 2, 1842, 1844, 5, 196, 99, 2, 1843, 1841, 3, 2, 2, 2, 1844, 1847, 3, 2, 2, 2, 1845, 1843, 3, 2, 2, 2, 1845, 1846, 3, 2, 2, 2, 1846, 1848, 3, 2, 2, 2, 1847, 1845, 3, 2, 2, 2, 1848, 1849, 7, 5, 2, 2, 1849, 1851, 3, 2, 2, 2, 1850, 1837, 3, 2, 2, 2, 1850, 1838, 3, 2, 2, 2, 1851, 119, 3, 2, 2, 2, 1852, 1853, 7, 102, 2, 2, 1853, 1858, 5, 136, 69, 2, 1854, 1855, 7, 6, 2, 2, 1855, 1857, 5, 136, 69, 2, 1856, 1854, 3, 2, 2, 2, 1857, 1860, 3, 2, 2, 2, 1858, 1856, 3, 2, 2, 2, 1858, 1859, 3, 2, 2, 2, 1859, 1864, 3, 2, 2, 2, 1860, 1858, 3, 2, 2, 2, 1861, 1863, 5, 132, 67, 2, 1862, 1861, 3, 2, 2, 2, 1863, 1866, 3, 2, 2, 2, 1864, 1862, 3, 2, 2, 2, 1864, 1865, 3, 2, 2, 2, 1865, 1868, 3, 2, 2, 2, 1866, 1864, 3, 2, 2, 2, 1867, 1869, 5, 126, 64, 2, 1868, 1867, 3, 2, 2, 2, 1868, 1869, 3, 2, 2, 2, 1869, 121, 3, 2, 2, 2, 1870, 1871, 7, 108, 2, 2, 1871, 1872, 7, 32, 2, 2, 1872, 1877, 5, 188, 95, 2, 1873, 1874, 7, 6, 2, 2, 1874, 1876, 5, 188, 95, 2, 1875, 1873, 3, 2, 2, 2, 1876, 1879, 3, 2, 2, 2, 1877, 1875, 3, 2, 2, 2, 1877, 1878, 3, 2, 2, 2, 1878, 1897, 3, 2, 2, 2, 1879, 1877, 3, 2, 2, 2, 1880, 1881, 7, 264, 2, 2, 1881, 1898, 7, 203, 2, 2, 1882, 1883, 7, 264, 2, 2, 1883, 1898, 7, 57, 2, 2, 1884, 1885, 7, 109, 2, 2, 1885, 1886, 7, 216, 2, 2, 1886, 1887, 7, 4, 2, 2, 1887, 1892, 5, 124, 63, 2, 1888, 1889, 7, 6, 2, 2, 1889, 1891, 5, 124, 63, 2, 1890, 1888, 3, 2, 2, 2, 1891, 1894, 3, 2, 2, 2, 1892, 1890, 3, 2, 2, 2, 1892, 1893, 3, 2, 2, 2, 1893, 1895, 3, 2, 2, 2, 1894, 1892, 3, 2, 2, 2, 1895, 1896, 7, 5, 2, 2, 1896, 1898, 3, 2, 2, 2, 1897, 1880, 3, 2, 2, 2, 1897, 1882, 3, 2, 2, 2, 1897, 1884, 3, 2, 2, 2, 1897, 1898, 3, 2, 2, 2, 1898, 1915, 3, 2, 2, 2, 1899, 1900, 7, 108, 2, 2, 1900, 1901, 7, 32, 2, 2, 1901, 1902, 7, 109, 2, 2, 1902, 1903, 7, 216, 2, 2, 1903, 1904, 7, 4, 2, 2, 1904, 1909, 5, 124, 63, 2, 1905, 1906, 7, 6, 2, 2, 1906, 1908, 5, 124, 63, 2, 1907, 1905, 3, 2, 2, 2, 1908, 1911, 3, 2, 2, 2, 1909, 1907, 3, 2, 2, 2, 1909, 1910, 3, 2, 2, 2, 1910, 1912, 3, 2, 2, 2, 1911, 1909, 3, 2, 2, 2, 1912, 1913, 7, 5, 2, 2, 1913, 1915, 3, 2, 2, 2, 1914, 1870, 3, 2, 2, 2, 1914, 1899, 3, 2, 2, 2, 1915, 123, 3, 2, 2, 2, 1916, 1925, 7, 4, 2, 2, 1917, 1922, 5, 188, 95, 2, 1918, 1919, 7, 6, 2, 2, 1919, 1921, 5, 188, 95, 2, 1920, 1918, 3, 2, 2, 2, 1921, 1924, 3, 2, 2, 2, 1922, 1920, 3, 2, 2, 2, 1922, 1923, 3, 2, 2, 2, 1923, 1926, 3, 2, 2, 2, 1924, 1922, 3, 2, 2, 2, 1925, 1917, 3, 2, 2, 2, 1925, 1926, 3, 2, 2, 2, 1926, 1927, 3, 2, 2, 2, 1927, 1930, 7, 5, 2, 2, 1928, 1930, 5, 188, 95, 2, 1929, 1916, 3, 2, 2, 2, 1929, 1928, 3, 2, 2, 2, 1930, 125, 3, 2, 2, 2, 1931, 1932, 7, 176, 2, 2, 1932, 1933, 7, 4, 2, 2, 1933, 1934, 5, 180, 91, 2, 1934, 1935, 7, 98, 2, 2, 1935, 1936, 5, 128, 65, 2, 1936, 1937, 7, 115, 2, 2, 1937, 1938, 7, 4, 2, 2, 1938, 1943, 5, 130, 66, 2, 1939, 1940, 7, 6, 2, 2, 1940, 1942, 5, 130, 66, 2, 1941, 1939, 3, 2, 2, 2, 1942, 1945, 3, 2, 2, 2, 1943, 1941, 3, 2, 2, 2, 1943, 1944, 3, 2, 2, 2, 1944, 1946, 3, 2, 2, 2, 1945, 1943, 3, 2, 2, 2, 1946, 1947, 7, 5, 2, 2, 1947, 1948, 7, 5, 2, 2, 1948, 127, 3, 2, 2, 2, 1949, 1962, 5, 260, 131, 2, 1950, 1951, 7, 4, 2, 2, 1951, 1956, 5, 260, 131, 2, 1952, 1953, 7, 6, 2, 2, 1953, 1955, 5, 260, 131, 2, 1954, 1952, 3, 2, 2, 2, 1955, 1958, 3, 2, 2, 2, 1956, 1954, 3, 2, 2, 2, 1956, 1957, 3, 2, 2, 2, 1957, 1959, 3, 2, 2, 2, 1958, 1956, 3, 2, 2, 2, 1959, 1960, 7, 5, 2, 2, 1960, 1962, 3, 2, 2, 2, 1961, 1949, 3, 2, 2, 2, 1961, 1950, 3, 2, 2, 2, 1962, 129, 3, 2, 2, 2, 1963, 1968, 5, 188, 95, 2, 1964, 1966, 7, 24, 2, 2, 1965, 1964, 3, 2, 2, 2, 1965, 1966, 3, 2, 2, 2, 1966, 1967, 3, 2, 2, 2, 1967, 1969, 5, 260, 131, 2, 1968, 1965, 3, 2, 2, 2, 1968, 1969, 3, 2, 2, 2, 1969, 131, 3, 2, 2, 2, 1970, 1971, 7, 130, 2, 2, 1971, 1973, 7, 259, 2, 2, 1972, 1974, 7, 166, 2, 2, 1973, 1972, 3, 2, 2, 2, 1973, 1974, 3, 2, 2, 2, 1974, 1975, 3, 2, 2, 2, 1975, 1976, 5, 254, 128, 2, 1976, 1985, 7, 4, 2, 2, 1977, 1982, 5, 188, 95, 2, 1978, 1979, 7, 6, 2, 2, 1979, 1981, 5, 188, 95, 2, 1980, 1978, 3, 2, 2, 2, 1981, 1984, 3, 2, 2, 2, 1982, 1980, 3, 2, 2, 2, 1982, 1983, 3, 2, 2, 2, 1983, 1986, 3, 2, 2, 2, 1984, 1982, 3, 2, 2, 2, 1985, 1977, 3, 2, 2, 2, 1985, 1986, 3, 2, 2, 2, 1986, 1987, 3, 2, 2, 2, 1987, 1988, 7, 5, 2, 2, 1988, 2000, 5, 260, 131, 2, 1989, 1991, 7, 24, 2, 2, 1990, 1989, 3, 2, 2, 2, 1990, 1991, 3, 2, 2, 2, 1991, 1992, 3, 2, 2, 2, 1992, 1997, 5, 260, 131, 2, 1993, 1994, 7, 6, 2, 2, 1994, 1996, 5, 260, 131, 2, 1995, 1993, 3, 2, 2, 2, 1996, 1999, 3, 2, 2, 2, 1997, 1995, 3, 2, 2, 2, 1997, 1998, 3, 2, 2, 2, 1998, 2001, 3, 2, 2, 2, 1999, 1997, 3, 2, 2, 2, 2000, 1990, 3, 2, 2, 2, 2000, 2001, 3, 2, 2, 2, 2001, 133, 3, 2, 2, 2, 2002, 2003, 9, 19, 2, 2, 2003, 135, 3, 2, 2, 2, 2004, 2008, 5, 160, 81, 2, 2005, 2007, 5, 138, 70, 2, 2006, 2005, 3, 2, 2, 2, 2007, 2010, 3, 2, 2, 2, 2008, 2006, 3, 2, 2, 2, 2008, 2009, 3, 2, 2, 2, 2009, 137, 3, 2, 2, 2, 2010, 2008, 3, 2, 2, 2, 2011, 2012, 5, 140, 71, 2, 2012, 2013, 7, 127, 2, 2, 2013, 2015, 5, 160, 81, 2, 2014, 2016, 5, 142, 72, 2, 2015, 2014, 3, 2, 2, 2, 2015, 2016, 3, 2, 2, 2, 2016, 2023, 3, 2, 2, 2, 2017, 2018, 7, 153, 2, 2, 2018, 2019, 5, 140, 71, 2, 2019, 2020, 7, 127, 2, 2, 2020, 2021, 5, 160, 81, 2, 2021, 2023, 3, 2, 2, 2, 2022, 2011, 3, 2, 2, 2, 2022, 2017, 3, 2, 2, 2, 2023, 139, 3, 2, 2, 2, 2024, 2026, 7, 118, 2, 2, 2025, 2024, 3, 2, 2, 2, 2025, 2026, 3, 2, 2, 2, 2026, 2049, 3, 2, 2, 2, 2027, 2049, 7, 56, 2, 2, 2028, 2030, 7, 133, 2, 2, 2029, 2031, 7, 166, 2, 2, 2030, 2029, 3, 2, 2, 2, 2030, 2031, 3, 2, 2, 2, 2031, 2049, 3, 2, 2, 2, 2032, 2034, 7, 133, 2, 2, 2033, 2032, 3, 2, 2, 2, 2033, 2034, 3, 2, 2, 2, 2034, 2035, 3, 2, 2, 2, 2035, 2049, 7, 209, 2, 2, 2036, 2038, 7, 198, 2, 2, 2037, 2039, 7, 166, 2, 2, 2038, 2037, 3, 2, 2, 2, 2038, 2039, 3, 2, 2, 2, 2039, 2049, 3, 2, 2, 2, 2040, 2042, 7, 103, 2, 2, 2041, 2043, 7, 166, 2, 2, 2042, 2041, 3, 2, 2, 2, 2042, 2043, 3, 2, 2, 2, 2043, 2049, 3, 2, 2, 2, 2044, 2046, 7, 133, 2, 2, 2045, 2044, 3, 2, 2, 2, 2045, 2046, 3, 2, 2, 2, 2046, 2047, 3, 2, 2, 2, 2047, 2049, 7, 20, 2, 2, 2048, 2025, 3, 2, 2, 2, 2048, 2027, 3, 2, 2, 2, 2048, 2028, 3, 2, 2, 2, 2048, 2033, 3, 2, 2, 2, 2048, 2036, 3, 2, 2, 2, 2048, 2040, 3, 2, 2, 2, 2048, 2045, 3, 2, 2, 2, 2049, 141, 3, 2, 2, 2, 2050, 2051, 7, 159, 2, 2, 2051, 2055, 5, 190, 96, 2, 2052, 2053, 7, 257, 2, 2, 2053, 2055, 5, 148, 75, 2, 2054, 2050, 3, 2, 2, 2, 2054, 2052, 3, 2, 2, 2, 2055, 143, 3, 2, 2, 2, 2056, 2057, 7, 231, 2, 2, 2057, 2059, 7, 4, 2, 2, 2058, 2060, 5, 146, 74, 2, 2059, 2058, 3, 2, 2, 2, 2059, 2060, 3, 2, 2, 2, 2060, 2061, 3, 2, 2, 2, 2061, 2062, 7, 5, 2, 2, 2062, 145, 3, 2, 2, 2, 2063, 2065, 7, 275, 2, 2, 2064, 2063, 3, 2, 2, 2, 2064, 2065, 3, 2, 2, 2, 2065, 2066, 3, 2, 2, 2, 2066, 2067, 9, 20, 2, 2, 2067, 2088, 7, 175, 2, 2, 2068, 2069, 5, 188, 95, 2, 2069, 2070, 7, 205, 2, 2, 2070, 2088, 3, 2, 2, 2, 2071, 2072, 7, 30, 2, 2, 2072, 2073, 7, 289, 2, 2, 2073, 2074, 7, 165, 2, 2, 2074, 2075, 7, 158, 2, 2, 2075, 2084, 7, 289, 2, 2, 2076, 2082, 7, 159, 2, 2, 2077, 2083, 5, 260, 131, 2, 2078, 2079, 5, 254, 128, 2, 2079, 2080, 7, 4, 2, 2, 2080, 2081, 7, 5, 2, 2, 2081, 2083, 3, 2, 2, 2, 2082, 2077, 3, 2, 2, 2, 2082, 2078, 3, 2, 2, 2, 2083, 2085, 3, 2, 2, 2, 2084, 2076, 3, 2, 2, 2, 2084, 2085, 3, 2, 2, 2, 2085, 2088, 3, 2, 2, 2, 2086, 2088, 5, 188, 95, 2, 2087, 2064, 3, 2, 2, 2, 2087, 2068, 3, 2, 2, 2, 2087, 2071, 3, 2, 2, 2, 2087, 2086, 3, 2, 2, 2, 2088, 147, 3, 2, 2, 2, 2089, 2090, 7, 4, 2, 2, 2090, 2091, 5, 150, 76, 2, 2091, 2092, 7, 5, 2, 2, 2092, 149, 3, 2, 2, 2, 2093, 2098, 5, 256, 129, 2, 2094, 2095, 7, 6, 2, 2, 2095, 2097, 5, 256, 129, 2, 2096, 2094, 3, 2, 2, 2, 2097, 2100, 3, 2, 2, 2, 2098, 2096, 3, 2, 2, 2, 2098, 2099, 3, 2, 2, 2, 2099, 151, 3, 2, 2, 2, 2100, 2098, 3, 2, 2, 2, 2101, 2102, 7, 4, 2, 2, 2102, 2107, 5, 154, 78, 2, 2103, 2104, 7, 6, 2, 2, 2104, 2106, 5, 154, 78, 2, 2105, 2103, 3, 2, 2, 2, 2106, 2109, 3, 2, 2, 2, 2107, 2105, 3, 2, 2, 2, 2107, 2108, 3, 2, 2, 2, 2108, 2110, 3, 2, 2, 2, 2109, 2107, 3, 2, 2, 2, 2110, 2111, 7, 5, 2, 2, 2111, 153, 3, 2, 2, 2, 2112, 2114, 5, 256, 129, 2, 2113, 2115, 9, 17, 2, 2, 2114, 2113, 3, 2, 2, 2, 2114, 2115, 3, 2, 2, 2, 2115, 155, 3, 2, 2, 2, 2116, 2117, 7, 4, 2, 2, 2117, 2122, 5, 158, 80, 2, 2118, 2119, 7, 6, 2, 2, 2119, 2121, 5, 158, 80, 2, 2120, 2118, 3, 2, 2, 2, 2121, 2124, 3, 2, 2, 2, 2122, 2120, 3, 2, 2, 2, 2122, 2123, 3, 2, 2, 2, 2123, 2125, 3, 2, 2, 2, 2124, 2122, 3, 2, 2, 2, 2125, 2126, 7, 5, 2, 2, 2126, 157, 3, 2, 2, 2, 2127, 2129, 5, 260, 131, 2, 2128, 2130, 5, 30, 16, 2, 2129, 2128, 3, 2, 2, 2, 2129, 2130, 3, 2, 2, 2, 2130, 159, 3, 2, 2, 2, 2131, 2133, 5, 172, 87, 2, 2132, 2134, 5, 144, 73, 2, 2133, 2132, 3, 2, 2, 2, 2133, 2134, 3, 2, 2, 2, 2134, 2135, 3, 2, 2, 2, 2135, 2136, 5, 166, 84, 2, 2136, 2156, 3, 2, 2, 2, 2137, 2138, 7, 4, 2, 2, 2138, 2139, 5, 32, 17, 2, 2139, 2141, 7, 5, 2, 2, 2140, 2142, 5, 144, 73, 2, 2141, 2140, 3, 2, 2, 2, 2141, 2142, 3, 2, 2, 2, 2142, 2143, 3, 2, 2, 2, 2143, 2144, 5, 166, 84, 2, 2144, 2156, 3, 2, 2, 2, 2145, 2146, 7, 4, 2, 2, 2146, 2147, 5, 136, 69, 2, 2147, 2149, 7, 5, 2, 2, 2148, 2150, 5, 144, 73, 2, 2149, 2148, 3, 2, 2, 2, 2149, 2150, 3, 2, 2, 2, 2150, 2151, 3, 2, 2, 2, 2151, 2152, 5, 166, 84, 2, 2152, 2156, 3, 2, 2, 2, 2153, 2156, 5, 162, 82, 2, 2154, 2156, 5, 164, 83, 2, 2155, 2131, 3, 2, 2, 2, 2155, 2137, 3, 2, 2, 2, 2155, 2145, 3, 2, 2, 2, 2155, 2153, 3, 2, 2, 2, 2155, 2154, 3, 2, 2, 2, 2156, 161, 3, 2, 2, 2, 2157, 2158, 7, 258, 2, 2, 2158, 2163, 5, 188, 95, 2, 2159, 2160, 7, 6, 2, 2, 2160, 2162, 5, 188, 95, 2, 2161, 2159, 3, 2, 2, 2, 2162, 2165, 3, 2, 2, 2, 2163, 2161, 3, 2, 2, 2, 2163, 2164, 3, 2, 2, 2, 2164, 2166, 3, 2, 2, 2, 2165, 2163, 3, 2, 2, 2, 2166, 2167, 5, 166, 84, 2, 2167, 163, 3, 2, 2, 2, 2168, 2169, 5, 256, 129, 2, 2169, 2178, 7, 4, 2, 2, 2170, 2175, 5, 188, 95, 2, 2171, 2172, 7, 6, 2, 2, 2172, 2174, 5, 188, 95, 2, 2173, 2171, 3, 2, 2, 2, 2174, 2177, 3, 2, 2, 2, 2175, 2173, 3, 2, 2, 2, 2175, 2176, 3, 2, 2, 2, 2176, 2179, 3, 2, 2, 2, 2177, 2175, 3, 2, 2, 2, 2178, 2170, 3, 2, 2, 2, 2178, 2179, 3, 2, 2, 2, 2179, 2180, 3, 2, 2, 2, 2180, 2181, 7, 5, 2, 2, 2181, 2182, 5, 166, 84, 2, 2182, 165, 3, 2, 2, 2, 2183, 2185, 7, 24, 2, 2, 2184, 2183, 3, 2, 2, 2, 2184, 2185, 3, 2, 2, 2, 2185, 2186, 3, 2, 2, 2, 2186, 2188, 5, 262, 132, 2, 2187, 2189, 5, 148, 75, 2, 2188, 2187, 3, 2, 2, 2, 2188, 2189, 3, 2, 2, 2, 2189, 2191, 3, 2, 2, 2, 2190, 2184, 3, 2, 2, 2, 2190, 2191, 3, 2, 2, 2, 2191, 167, 3, 2, 2, 2, 2192, 2193, 7, 204, 2, 2, 2193, 2194, 7, 100, 2, 2, 2194, 2195, 7, 211, 2, 2, 2195, 2199, 7, 285, 2, 2, 2196, 2197, 7, 264, 2, 2, 2197, 2198, 7, 212, 2, 2, 2198, 2200, 5, 56, 29, 2, 2199, 2196, 3, 2, 2, 2, 2199, 2200, 3, 2, 2, 2, 2200, 2242, 3, 2, 2, 2, 2201, 2202, 7, 204, 2, 2, 2202, 2203, 7, 100, 2, 2, 2203, 2213, 7, 70, 2, 2, 2204, 2205, 7, 93, 2, 2, 2205, 2206, 7, 234, 2, 2, 2206, 2207, 7, 32, 2, 2, 2207, 2211, 7, 285, 2, 2, 2208, 2209, 7, 82, 2, 2, 2209, 2210, 7, 32, 2, 2, 2210, 2212, 7, 285, 2, 2, 2211, 2208, 3, 2, 2, 2, 2211, 2212, 3, 2, 2, 2, 2212, 2214, 3, 2, 2, 2, 2213, 2204, 3, 2, 2, 2, 2213, 2214, 3, 2, 2, 2, 2214, 2220, 3, 2, 2, 2, 2215, 2216, 7, 44, 2, 2, 2216, 2217, 7, 126, 2, 2, 2217, 2218, 7, 234, 2, 2, 2218, 2219, 7, 32, 2, 2, 2219, 2221, 7, 285, 2, 2, 2220, 2215, 3, 2, 2, 2, 2220, 2221, 3, 2, 2, 2, 2221, 2227, 3, 2, 2, 2, 2222, 2223, 7, 145, 2, 2, 2223, 2224, 7, 128, 2, 2, 2224, 2225, 7, 234, 2, 2, 2225, 2226, 7, 32, 2, 2, 2226, 2228, 7, 285, 2, 2, 2227, 2222, 3, 2, 2, 2, 2227, 2228, 3, 2, 2, 2, 2228, 2233, 3, 2, 2, 2, 2229, 2230, 7, 136, 2, 2, 2230, 2231, 7, 234, 2, 2, 2231, 2232, 7, 32, 2, 2, 2232, 2234, 7, 285, 2, 2, 2233, 2229, 3, 2, 2, 2, 2233, 2234, 3, 2, 2, 2, 2234, 2239, 3, 2, 2, 2, 2235, 2236, 7, 156, 2, 2, 2236, 2237, 7, 68, 2, 2, 2237, 2238, 7, 24, 2, 2, 2238, 2240, 7, 285, 2, 2, 2239, 2235, 3, 2, 2, 2, 2239, 2240, 3, 2, 2, 2, 2240, 2242, 3, 2, 2, 2, 2241, 2192, 3, 2, 2, 2, 2241, 2201, 3, 2, 2, 2, 2242, 169, 3, 2, 2, 2, 2243, 2248, 5, 172, 87, 2, 2244, 2245, 7, 6, 2, 2, 2245, 2247, 5, 172, 87, 2, 2246, 2244, 3, 2, 2, 2, 2247, 2250, 3, 2, 2, 2, 2248, 2246, 3, 2, 2, 2, 2248, 2249, 3, 2, 2, 2, 2249, 171, 3, 2, 2, 2, 2250, 2248, 3, 2, 2, 2, 2251, 2256, 5, 256, 129, 2, 2252, 2253, 7, 7, 2, 2, 2253, 2255, 5, 256, 129, 2, 2254, 2252, 3, 2, 2, 2, 2255, 2258, 3, 2, 2, 2, 2256, 2254, 3, 2, 2, 2, 2256, 2257, 3, 2, 2, 2, 2257, 173, 3, 2, 2, 2, 2258, 2256, 3, 2, 2, 2, 2259, 2260, 5, 256, 129, 2, 2260, 2261, 7, 7, 2, 2, 2261, 2263, 3, 2, 2, 2, 2262, 2259, 3, 2, 2, 2, 2262, 2263, 3, 2, 2, 2, 2263, 2264, 3, 2, 2, 2, 2264, 2265, 5, 256, 129, 2, 2265, 175, 3, 2, 2, 2, 2266, 2267, 5, 256, 129, 2, 2267, 2268, 7, 7, 2, 2, 2268, 2270, 3, 2, 2, 2, 2269, 2266, 3, 2, 2, 2, 2269, 2270, 3, 2, 2, 2, 2270, 2271, 3, 2, 2, 2, 2271, 2272, 5, 256, 129, 2, 2272, 177, 3, 2, 2, 2, 2273, 2281, 5, 188, 95, 2, 2274, 2276, 7, 24, 2, 2, 2275, 2274, 3, 2, 2, 2, 2275, 2276, 3, 2, 2, 2, 2276, 2279, 3, 2, 2, 2, 2277, 2280, 5, 256, 129, 2, 2278, 2280, 5, 148, 75, 2, 2279, 2277, 3, 2, 2, 2, 2279, 2278, 3, 2, 2, 2, 2280, 2282, 3, 2, 2, 2, 2281, 2275, 3, 2, 2, 2, 2281, 2282, 3, 2, 2, 2, 2282, 179, 3, 2, 2, 2, 2283, 2288, 5, 178, 90, 2, 2284, 2285, 7, 6, 2, 2, 2285, 2287, 5, 178, 90, 2, 2286, 2284, 3, 2, 2, 2, 2287, 2290, 3, 2, 2, 2, 2288, 2286, 3, 2, 2, 2, 2288, 2289, 3, 2, 2, 2, 2289, 181, 3, 2, 2, 2, 2290, 2288, 3, 2, 2, 2, 2291, 2292, 7, 4, 2, 2, 2292, 2297, 5, 184, 93, 2, 2293, 2294, 7, 6, 2, 2, 2294, 2296, 5, 184, 93, 2, 2295, 2293, 3, 2, 2, 2, 2296, 2299, 3, 2, 2, 2, 2297, 2295, 3, 2, 2, 2, 2297, 2298, 3, 2, 2, 2, 2298, 2300, 3, 2, 2, 2, 2299, 2297, 3, 2, 2, 2, 2300, 2301, 7, 5, 2, 2, 2301, 183, 3, 2, 2, 2, 2302, 2316, 5, 254, 128, 2, 2303, 2304, 5, 260, 131, 2, 2304, 2305, 7, 4, 2, 2, 2305, 2310, 5, 186, 94, 2, 2306, 2307, 7, 6, 2, 2, 2307, 2309, 5, 186, 94, 2, 2308, 2306, 3, 2, 2, 2, 2309, 2312, 3, 2, 2, 2, 2310, 2308, 3, 2, 2, 2, 2310, 2311, 3, 2, 2, 2, 2311, 2313, 3, 2, 2, 2, 2312, 2310, 3, 2, 2, 2, 2313, 2314, 7, 5, 2, 2, 2314, 2316, 3, 2, 2, 2, 2315, 2302, 3, 2, 2, 2, 2315, 2303, 3, 2, 2, 2, 2316, 185, 3, 2, 2, 2, 2317, 2320, 5, 254, 128, 2, 2318, 2320, 5, 198, 100, 2, 2319, 2317, 3, 2, 2, 2, 2319, 2318, 3, 2, 2, 2, 2320, 187, 3, 2, 2, 2, 2321, 2322, 5, 190, 96, 2, 2322, 189, 3, 2, 2, 2, 2323, 2324, 8, 96, 1, 2, 2324, 2325, 7, 155, 2, 2, 2325, 2336, 5, 190, 96, 7, 2326, 2327, 7, 85, 2, 2, 2327, 2328, 7, 4, 2, 2, 2328, 2329, 5, 32, 17, 2, 2329, 2330, 7, 5, 2, 2, 2330, 2336, 3, 2, 2, 2, 2331, 2333, 5, 194, 98, 2, 2332, 2334, 5, 192, 97, 2, 2333, 2332, 3, 2, 2, 2, 2333, 2334, 3, 2, 2, 2, 2334, 2336, 3, 2, 2, 2, 2335, 2323, 3, 2, 2, 2, 2335, 2326, 3, 2, 2, 2, 2335, 2331, 3, 2, 2, 2, 2336, 2345, 3, 2, 2, 2, 2337, 2338, 12, 4, 2, 2, 2338, 2339, 7, 19, 2, 2, 2339, 2344, 5, 190, 96, 5, 2340, 2341, 12, 3, 2, 2, 2341, 2342, 7, 163, 2, 2, 2342, 2344, 5, 190, 96, 4, 2343, 2337, 3, 2, 2, 2, 2343, 2340, 3, 2, 2, 2, 2344, 2347, 3, 2, 2, 2, 2345, 2343, 3, 2, 2, 2, 2345, 2346, 3, 2, 2, 2, 2346, 191, 3, 2, 2, 2, 2347, 2345, 3, 2, 2, 2, 2348, 2350, 7, 155, 2, 2, 2349, 2348, 3, 2, 2, 2, 2349, 2350, 3, 2, 2, 2, 2350, 2351, 3, 2, 2, 2, 2351, 2352, 7, 28, 2, 2, 2352, 2353, 5, 194, 98, 2, 2353, 2354, 7, 19, 2, 2, 2354, 2355, 5, 194, 98, 2, 2355, 2431, 3, 2, 2, 2, 2356, 2358, 7, 155, 2, 2, 2357, 2356, 3, 2, 2, 2, 2357, 2358, 3, 2, 2, 2, 2358, 2359, 3, 2, 2, 2, 2359, 2360, 7, 115, 2, 2, 2360, 2361, 7, 4, 2, 2, 2361, 2366, 5, 188, 95, 2, 2362, 2363, 7, 6, 2, 2, 2363, 2365, 5, 188, 95, 2, 2364, 2362, 3, 2, 2, 2, 2365, 2368, 3, 2, 2, 2, 2366, 2364, 3, 2, 2, 2, 2366, 2367, 3, 2, 2, 2, 2367, 2369, 3, 2, 2, 2, 2368, 2366, 3, 2, 2, 2, 2369, 2370, 7, 5, 2, 2, 2370, 2431, 3, 2, 2, 2, 2371, 2373, 7, 155, 2, 2, 2372, 2371, 3, 2, 2, 2, 2372, 2373, 3, 2, 2, 2, 2373, 2374, 3, 2, 2, 2, 2374, 2375, 7, 115, 2, 2, 2375, 2376, 7, 4, 2, 2, 2376, 2377, 5, 32, 17, 2, 2377, 2378, 7, 5, 2, 2, 2378, 2431, 3, 2, 2, 2, 2379, 2381, 7, 155, 2, 2, 2380, 2379, 3, 2, 2, 2, 2380, 2381, 3, 2, 2, 2, 2381, 2382, 3, 2, 2, 2, 2382, 2383, 7, 199, 2, 2, 2383, 2431, 5, 194, 98, 2, 2384, 2386, 7, 155, 2, 2, 2385, 2384, 3, 2, 2, 2, 2385, 2386, 3, 2, 2, 2, 2386, 2387, 3, 2, 2, 2, 2387, 2388, 7, 134, 2, 2, 2388, 2402, 9, 21, 2, 2, 2389, 2390, 7, 4, 2, 2, 2390, 2403, 7, 5, 2, 2, 2391, 2392, 7, 4, 2, 2, 2392, 2397, 5, 188, 95, 2, 2393, 2394, 7, 6, 2, 2, 2394, 2396, 5, 188, 95, 2, 2395, 2393, 3, 2, 2, 2, 2396, 2399, 3, 2, 2, 2, 2397, 2395, 3, 2, 2, 2, 2397, 2398, 3, 2, 2, 2, 2398, 2400, 3, 2, 2, 2, 2399, 2397, 3, 2, 2, 2, 2400, 2401, 7, 5, 2, 2, 2401, 2403, 3, 2, 2, 2, 2402, 2389, 3, 2, 2, 2, 2402, 2391, 3, 2, 2, 2, 2403, 2431, 3, 2, 2, 2, 2404, 2406, 7, 155, 2, 2, 2405, 2404, 3, 2, 2, 2, 2405, 2406, 3, 2, 2, 2, 2406, 2407, 3, 2, 2, 2, 2407, 2408, 7, 134, 2, 2, 2408, 2411, 5, 194, 98, 2, 2409, 2410, 7, 81, 2, 2, 2410, 2412, 7, 285, 2, 2, 2411, 2409, 3, 2, 2, 2, 2411, 2412, 3, 2, 2, 2, 2412, 2431, 3, 2, 2, 2, 2413, 2415, 7, 125, 2, 2, 2414, 2416, 7, 155, 2, 2, 2415, 2414, 3, 2, 2, 2, 2415, 2416, 3, 2, 2, 2, 2416, 2417, 3, 2, 2, 2, 2417, 2431, 7, 156, 2, 2, 2418, 2420, 7, 125, 2, 2, 2419, 2421, 7, 155, 2, 2, 2420, 2419, 3, 2, 2, 2, 2420, 2421, 3, 2, 2, 2, 2421, 2422, 3, 2, 2, 2, 2422, 2431, 9, 22, 2, 2, 2423, 2425, 7, 125, 2, 2, 2424, 2426, 7, 155, 2, 2, 2425, 2424, 3, 2, 2, 2, 2425, 2426, 3, 2, 2, 2, 2426, 2427, 3, 2, 2, 2, 2427, 2428, 7, 76, 2, 2, 2428, 2429, 7, 102, 2, 2, 2429, 2431, 5, 194, 98, 2, 2430, 2349, 3, 2, 2, 2, 2430, 2357, 3, 2, 2, 2, 2430, 2372, 3, 2, 2, 2, 2430, 2380, 3, 2, 2, 2, 2430, 2385, 3, 2, 2, 2, 2430, 2405, 3, 2, 2, 2, 2430, 2413, 3, 2, 2, 2, 2430, 2418, 3, 2, 2, 2, 2430, 2423, 3, 2, 2, 2, 2431, 193, 3, 2, 2, 2, 2432, 2433, 8, 98, 1, 2, 2433, 2437, 5, 196, 99, 2, 2434, 2435, 9, 23, 2, 2, 2435, 2437, 5, 194, 98, 9, 2436, 2432, 3, 2, 2, 2, 2436, 2434, 3, 2, 2, 2, 2437, 2459, 3, 2, 2, 2, 2438, 2439, 12, 8, 2, 2, 2439, 2440, 9, 24, 2, 2, 2440, 2458, 5, 194, 98, 9, 2441, 2442, 12, 7, 2, 2, 2442, 2443, 9, 25, 2, 2, 2443, 2458, 5, 194, 98, 8, 2444, 2445, 12, 6, 2, 2, 2445, 2446, 7, 281, 2, 2, 2446, 2458, 5, 194, 98, 7, 2447, 2448, 12, 5, 2, 2, 2448, 2449, 7, 284, 2, 2, 2449, 2458, 5, 194, 98, 6, 2450, 2451, 12, 4, 2, 2, 2451, 2452, 7, 282, 2, 2, 2452, 2458, 5, 194, 98, 5, 2453, 2454, 12, 3, 2, 2, 2454, 2455, 5, 200, 101, 2, 2455, 2456, 5, 194, 98, 4, 2456, 2458, 3, 2, 2, 2, 2457, 2438, 3, 2, 2, 2, 2457, 2441, 3, 2, 2, 2, 2457, 2444, 3, 2, 2, 2, 2457, 2447, 3, 2, 2, 2, 2457, 2450, 3, 2, 2, 2, 2457, 2453, 3, 2, 2, 2, 2458, 2461, 3, 2, 2, 2, 2459, 2457, 3, 2, 2, 2, 2459, 2460, 3, 2, 2, 2, 2460, 195, 3, 2, 2, 2, 2461, 2459, 3, 2, 2, 2, 2462, 2463, 8, 99, 1, 2, 2463, 2647, 9, 26, 2, 2, 2464, 2466, 7, 35, 2, 2, 2465, 2467, 5, 238, 120, 2, 2466, 2465, 3, 2, 2, 2, 2467, 2468, 3, 2, 2, 2, 2468, 2466, 3, 2, 2, 2, 2468, 2469, 3, 2, 2, 2, 2469, 2472, 3, 2, 2, 2, 2470, 2471, 7, 79, 2, 2, 2471, 2473, 5, 188, 95, 2, 2472, 2470, 3, 2, 2, 2, 2472, 2473, 3, 2, 2, 2, 2473, 2474, 3, 2, 2, 2, 2474, 2475, 7, 80, 2, 2, 2475, 2647, 3, 2, 2, 2, 2476, 2477, 7, 35, 2, 2, 2477, 2479, 5, 188, 95, 2, 2478, 2480, 5, 238, 120, 2, 2479, 2478, 3, 2, 2, 2, 2480, 2481, 3, 2, 2, 2, 2481, 2479, 3, 2, 2, 2, 2481, 2482, 3, 2, 2, 2, 2482, 2485, 3, 2, 2, 2, 2483, 2484, 7, 79, 2, 2, 2484, 2486, 5, 188, 95, 2, 2485, 2483, 3, 2, 2, 2, 2485, 2486, 3, 2, 2, 2, 2486, 2487, 3, 2, 2, 2, 2487, 2488, 7, 80, 2, 2, 2488, 2647, 3, 2, 2, 2, 2489, 2490, 7, 36, 2, 2, 2490, 2491, 7, 4, 2, 2, 2491, 2492, 5, 188, 95, 2, 2492, 2493, 7, 24, 2, 2, 2493, 2494, 5, 224, 113, 2, 2494, 2495, 7, 5, 2, 2, 2495, 2647, 3, 2, 2, 2, 2496, 2497, 7, 226, 2, 2, 2497, 2506, 7, 4, 2, 2, 2498, 2503, 5, 178, 90, 2, 2499, 2500, 7, 6, 2, 2, 2500, 2502, 5, 178, 90, 2, 2501, 2499, 3, 2, 2, 2, 2502, 2505, 3, 2, 2, 2, 2503, 2501, 3, 2, 2, 2, 2503, 2504, 3, 2, 2, 2, 2504, 2507, 3, 2, 2, 2, 2505, 2503, 3, 2, 2, 2, 2506, 2498, 3, 2, 2, 2, 2506, 2507, 3, 2, 2, 2, 2507, 2508, 3, 2, 2, 2, 2508, 2647, 7, 5, 2, 2, 2509, 2510, 7, 96, 2, 2, 2510, 2511, 7, 4, 2, 2, 2511, 2514, 5, 188, 95, 2, 2512, 2513, 7, 113, 2, 2, 2513, 2515, 7, 157, 2, 2, 2514, 2512, 3, 2, 2, 2, 2514, 2515, 3, 2, 2, 2, 2515, 2516, 3, 2, 2, 2, 2516, 2517, 7, 5, 2, 2, 2517, 2647, 3, 2, 2, 2, 2518, 2519, 7, 129, 2, 2, 2519, 2520, 7, 4, 2, 2, 2520, 2523, 5, 188, 95, 2, 2521, 2522, 7, 113, 2, 2, 2522, 2524, 7, 157, 2, 2, 2523, 2521, 3, 2, 2, 2, 2523, 2524, 3, 2, 2, 2, 2524, 2525, 3, 2, 2, 2, 2525, 2526, 7, 5, 2, 2, 2526, 2647, 3, 2, 2, 2, 2527, 2528, 7, 178, 2, 2, 2528, 2529, 7, 4, 2, 2, 2529, 2530, 5, 194, 98, 2, 2530, 2531, 7, 115, 2, 2, 2531, 2532, 5, 194, 98, 2, 2532, 2533, 7, 5, 2, 2, 2533, 2647, 3, 2, 2, 2, 2534, 2647, 5, 198, 100, 2, 2535, 2647, 7, 276, 2, 2, 2536, 2537, 5, 254, 128, 2, 2537, 2538, 7, 7, 2, 2, 2538, 2539, 7, 276, 2, 2, 2539, 2647, 3, 2, 2, 2, 2540, 2541, 7, 4, 2, 2, 2541, 2544, 5, 178, 90, 2, 2542, 2543, 7, 6, 2, 2, 2543, 2545, 5, 178, 90, 2, 2544, 2542, 3, 2, 2, 2, 2545, 2546, 3, 2, 2, 2, 2546, 2544, 3, 2, 2, 2, 2546, 2547, 3, 2, 2, 2, 2547, 2548, 3, 2, 2, 2, 2548, 2549, 7, 5, 2, 2, 2549, 2647, 3, 2, 2, 2, 2550, 2551, 7, 4, 2, 2, 2551, 2552, 5, 32, 17, 2, 2552, 2553, 7, 5, 2, 2, 2553, 2647, 3, 2, 2, 2, 2554, 2555, 5, 252, 127, 2, 2555, 2567, 7, 4, 2, 2, 2556, 2558, 5, 134, 68, 2, 2557, 2556, 3, 2, 2, 2, 2557, 2558, 3, 2, 2, 2, 2558, 2559, 3, 2, 2, 2, 2559, 2564, 5, 188, 95, 2, 2560, 2561, 7, 6, 2, 2, 2561, 2563, 5, 188, 95, 2, 2562, 2560, 3, 2, 2, 2, 2563, 2566, 3, 2, 2, 2, 2564, 2562, 3, 2, 2, 2, 2564, 2565, 3, 2, 2, 2, 2565, 2568, 3, 2, 2, 2, 2566, 2564, 3, 2, 2, 2, 2567, 2557, 3, 2, 2, 2, 2567, 2568, 3, 2, 2, 2, 2568, 2569, 3, 2, 2, 2, 2569, 2576, 7, 5, 2, 2, 2570, 2571, 7, 94, 2, 2, 2571, 2572, 7, 4, 2, 2, 2572, 2573, 7, 262, 2, 2, 2573, 2574, 5, 190, 96, 2, 2574, 2575, 7, 5, 2, 2, 2575, 2577, 3, 2, 2, 2, 2576, 2570, 3, 2, 2, 2, 2576, 2577, 3, 2, 2, 2, 2577, 2580, 3, 2, 2, 2, 2578, 2579, 7, 168, 2, 2, 2579, 2581, 5, 244, 123, 2, 2580, 2578, 3, 2, 2, 2, 2580, 2581, 3, 2, 2, 2, 2581, 2647, 3, 2, 2, 2, 2582, 2583, 5, 260, 131, 2, 2583, 2584, 7, 10, 2, 2, 2584, 2585, 5, 188, 95, 2, 2585, 2647, 3, 2, 2, 2, 2586, 2587, 7, 4, 2, 2, 2587, 2590, 5, 260, 131, 2, 2588, 2589, 7, 6, 2, 2, 2589, 2591, 5, 260, 131, 2, 2590, 2588, 3, 2, 2, 2, 2591, 2592, 3, 2, 2, 2, 2592, 2590, 3, 2, 2, 2, 2592, 2593, 3, 2, 2, 2, 2593, 2594, 3, 2, 2, 2, 2594, 2595, 7, 5, 2, 2, 2595, 2596, 7, 10, 2, 2, 2596, 2597, 5, 188, 95, 2, 2597, 2647, 3, 2, 2, 2, 2598, 2647, 5, 260, 131, 2, 2599, 2600, 7, 4, 2, 2, 2600, 2601, 5, 188, 95, 2, 2601, 2602, 7, 5, 2, 2, 2602, 2647, 3, 2, 2, 2, 2603, 2604, 7, 90, 2, 2, 2604, 2605, 7, 4, 2, 2, 2605, 2606, 5, 260, 131, 2, 2606, 2607, 7, 102, 2, 2, 2607, 2608, 5, 194, 98, 2, 2608, 2609, 7, 5, 2, 2, 2609, 2647, 3, 2, 2, 2, 2610, 2611, 9, 27, 2, 2, 2611, 2612, 7, 4, 2, 2, 2612, 2613, 5, 194, 98, 2, 2613, 2614, 9, 28, 2, 2, 2614, 2617, 5, 194, 98, 2, 2615, 2616, 9, 29, 2, 2, 2616, 2618, 5, 194, 98, 2, 2617, 2615, 3, 2, 2, 2, 2617, 2618, 3, 2, 2, 2, 2618, 2619, 3, 2, 2, 2, 2619, 2620, 7, 5, 2, 2, 2620, 2647, 3, 2, 2, 2, 2621, 2622, 7, 242, 2, 2, 2622, 2624, 7, 4, 2, 2, 2623, 2625, 9, 30, 2, 2, 2624, 2623, 3, 2, 2, 2, 2624, 2625, 3, 2, 2, 2, 2625, 2627, 3, 2, 2, 2, 2626, 2628, 5, 194, 98, 2, 2627, 2626, 3, 2, 2, 2, 2627, 2628, 3, 2, 2, 2, 2628, 2629, 3, 2, 2, 2, 2629, 2630, 7, 102, 2, 2, 2630, 2631, 5, 194, 98, 2, 2631, 2632, 7, 5, 2, 2, 2632, 2647, 3, 2, 2, 2, 2633, 2634, 7, 170, 2, 2, 2634, 2635, 7, 4, 2, 2, 2635, 2636, 5, 194, 98, 2, 2636, 2637, 7, 177, 2, 2, 2637, 2638, 5, 194, 98, 2, 2638, 2639, 7, 102, 2, 2, 2639, 2642, 5, 194, 98, 2, 2640, 2641, 7, 98, 2, 2, 2641, 2643, 5, 194, 98, 2, 2642, 2640, 3, 2, 2, 2, 2642, 2643, 3, 2, 2, 2, 2643, 2644, 3, 2, 2, 2, 2644, 2645, 7, 5, 2, 2, 2645, 2647, 3, 2, 2, 2, 2646, 2462, 3, 2, 2, 2, 2646, 2464, 3, 2, 2, 2, 2646, 2476, 3, 2, 2, 2, 2646, 2489, 3, 2, 2, 2, 2646, 2496, 3, 2, 2, 2, 2646, 2509, 3, 2, 2, 2, 2646, 2518, 3, 2, 2, 2, 2646, 2527, 3, 2, 2, 2, 2646, 2534, 3, 2, 2, 2, 2646, 2535, 3, 2, 2, 2, 2646, 2536, 3, 2, 2, 2, 2646, 2540, 3, 2, 2, 2, 2646, 2550, 3, 2, 2, 2, 2646, 2554, 3, 2, 2, 2, 2646, 2582, 3, 2, 2, 2, 2646, 2586, 3, 2, 2, 2, 2646, 2598, 3, 2, 2, 2, 2646, 2599, 3, 2, 2, 2, 2646, 2603, 3, 2, 2, 2, 2646, 2610, 3, 2, 2, 2, 2646, 2621, 3, 2, 2, 2, 2646, 2633, 3, 2, 2, 2, 2647, 2658, 3, 2, 2, 2, 2648, 2649, 12, 10, 2, 2, 2649, 2650, 7, 11, 2, 2, 2650, 2651, 5, 194, 98, 2, 2651, 2652, 7, 12, 2, 2, 2652, 2657, 3, 2, 2, 2, 2653, 2654, 12, 8, 2, 2, 2654, 2655, 7, 7, 2, 2, 2655, 2657, 5, 260, 131, 2, 2656, 2648, 3, 2, 2, 2, 2656, 2653, 3, 2, 2, 2, 2657, 2660, 3, 2, 2, 2, 2658, 2656, 3, 2, 2, 2, 2658, 2659, 3, 2, 2, 2, 2659, 197, 3, 2, 2, 2, 2660, 2658, 3, 2, 2, 2, 2661, 2674, 7, 156, 2, 2, 2662, 2674, 5, 208, 105, 2, 2663, 2664, 5, 260, 131, 2, 2664, 2665, 7, 285, 2, 2, 2665, 2674, 3, 2, 2, 2, 2666, 2674, 5, 266, 134, 2, 2667, 2674, 5, 206, 104, 2, 2668, 2670, 7, 285, 2, 2, 2669, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2669, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2674, 3, 2, 2, 2, 2673, 2661, 3, 2, 2, 2, 2673, 2662, 3, 2, 2, 2, 2673, 2663, 3, 2, 2, 2, 2673, 2666, 3, 2, 2, 2, 2673, 2667, 3, 2, 2, 2, 2673, 2669, 3, 2, 2, 2, 2674, 199, 3, 2, 2, 2, 2675, 2676, 9, 31, 2, 2, 2676, 201, 3, 2, 2, 2, 2677, 2678, 9, 32, 2, 2, 2678, 203, 3, 2, 2, 2, 2679, 2680, 9, 33, 2, 2, 2680, 205, 3, 2, 2, 2, 2681, 2682, 9, 34, 2, 2, 2682, 207, 3, 2, 2, 2, 2683, 2686, 7, 123, 2, 2, 2684, 2687, 5, 210, 106, 2, 2685, 2687, 5, 214, 108, 2, 2686, 2684, 3, 2, 2, 2, 2686, 2685, 3, 2, 2, 2, 2686, 2687, 3, 2, 2, 2, 2687, 209, 3, 2, 2, 2, 2688, 2690, 5, 212, 107, 2, 2689, 2691, 5, 216, 109, 2, 2690, 2689, 3, 2, 2, 2, 2690, 2691, 3, 2, 2, 2, 2691, 211, 3, 2, 2, 2, 2692, 2693, 5, 218, 110, 2, 2693, 2694, 5, 220, 111, 2, 2694, 2696, 3, 2, 2, 2, 2695, 2692, 3, 2, 2, 2, 2696, 2697, 3, 2, 2, 2, 2697, 2695, 3, 2, 2, 2, 2697, 2698, 3, 2, 2, 2, 2698, 213, 3, 2, 2, 2, 2699, 2702, 5, 216, 109, 2, 2700, 2703, 5, 212, 107, 2, 2701, 2703, 5, 216, 109, 2, 2702, 2700, 3, 2, 2, 2, 2702, 2701, 3, 2, 2, 2, 2702, 2703, 3, 2, 2, 2, 2703, 215, 3, 2, 2, 2, 2704, 2705, 5, 218, 110, 2, 2705, 2706, 5, 220, 111, 2, 2706, 2707, 7, 236, 2, 2, 2707, 2708, 5, 220, 111, 2, 2708, 217, 3, 2, 2, 2, 2709, 2711, 9, 35, 2, 2, 2710, 2709, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2712, 3, 2, 2, 2, 2712, 2715, 9, 20, 2, 2, 2713, 2715, 7, 285, 2, 2, 2714, 2710, 3, 2, 2, 2, 2714, 2713, 3, 2, 2, 2, 2715, 219, 3, 2, 2, 2, 2716, 2724, 7, 66, 2, 2, 2717, 2724, 7, 111, 2, 2, 2718, 2724, 7, 148, 2, 2, 2719, 2724, 7, 149, 2, 2, 2720, 2724, 7, 207, 2, 2, 2721, 2724, 7, 265, 2, 2, 2722, 2724, 5, 260, 131, 2, 2723, 2716, 3, 2, 2, 2, 2723, 2717, 3, 2, 2, 2, 2723, 2718, 3, 2, 2, 2, 2723, 2719, 3, 2, 2, 2, 2723, 2720, 3, 2, 2, 2, 2723, 2721, 3, 2, 2, 2, 2723, 2722, 3, 2, 2, 2, 2724, 221, 3, 2, 2, 2, 2725, 2729, 7, 96, 2, 2, 2726, 2727, 7, 15, 2, 2, 2727, 2729, 5, 256, 129, 2, 2728, 2725, 3, 2, 2, 2, 2728, 2726, 3, 2, 2, 2, 2729, 223, 3, 2, 2, 2, 2730, 2731, 7, 23, 2, 2, 2731, 2732, 7, 270, 2, 2, 2732, 2733, 5, 224, 113, 2, 2733, 2734, 7, 272, 2, 2, 2734, 2765, 3, 2, 2, 2, 2735, 2736, 7, 145, 2, 2, 2736, 2737, 7, 270, 2, 2, 2737, 2738, 5, 224, 113, 2, 2738, 2739, 7, 6, 2, 2, 2739, 2740, 5, 224, 113, 2, 2740, 2741, 7, 272, 2, 2, 2741, 2765, 3, 2, 2, 2, 2742, 2749, 7, 226, 2, 2, 2743, 2745, 7, 270, 2, 2, 2744, 2746, 5, 234, 118, 2, 2745, 2744, 3, 2, 2, 2, 2745, 2746, 3, 2, 2, 2, 2746, 2747, 3, 2, 2, 2, 2747, 2750, 7, 272, 2, 2, 2748, 2750, 7, 268, 2, 2, 2749, 2743, 3, 2, 2, 2, 2749, 2748, 3, 2, 2, 2, 2750, 2765, 3, 2, 2, 2, 2751, 2762, 5, 260, 131, 2, 2752, 2753, 7, 4, 2, 2, 2753, 2758, 7, 289, 2, 2, 2754, 2755, 7, 6, 2, 2, 2755, 2757, 7, 289, 2, 2, 2756, 2754, 3, 2, 2, 2, 2757, 2760, 3, 2, 2, 2, 2758, 2756, 3, 2, 2, 2, 2758, 2759, 3, 2, 2, 2, 2759, 2761, 3, 2, 2, 2, 2760, 2758, 3, 2, 2, 2, 2761, 2763, 7, 5, 2, 2, 2762, 2752, 3, 2, 2, 2, 2762, 2763, 3, 2, 2, 2, 2763, 2765, 3, 2, 2, 2, 2764, 2730, 3, 2, 2, 2, 2764, 2735, 3, 2, 2, 2, 2764, 2742, 3, 2, 2, 2, 2764, 2751, 3, 2, 2, 2, 2765, 225, 3, 2, 2, 2, 2766, 2771, 5, 228, 115, 2, 2767, 2768, 7, 6, 2, 2, 2768, 2770, 5, 228, 115, 2, 2769, 2767, 3, 2, 2, 2, 2770, 2773, 3, 2, 2, 2, 2771, 2769, 3, 2, 2, 2, 2771, 2772, 3, 2, 2, 2, 2772, 227, 3, 2, 2, 2, 2773, 2771, 3, 2, 2, 2, 2774, 2775, 5, 172, 87, 2, 2775, 2778, 5, 224, 113, 2, 2776, 2777, 7, 155, 2, 2, 2777, 2779, 7, 156, 2, 2, 2778, 2776, 3, 2, 2, 2, 2778, 2779, 3, 2, 2, 2, 2779, 2781, 3, 2, 2, 2, 2780, 2782, 5, 30, 16, 2, 2781, 2780, 3, 2, 2, 2, 2781, 2782, 3, 2, 2, 2, 2782, 2784, 3, 2, 2, 2, 2783, 2785, 5, 222, 112, 2, 2784, 2783, 3, 2, 2, 2, 2784, 2785, 3, 2, 2, 2, 2785, 229, 3, 2, 2, 2, 2786, 2791, 5, 232, 117, 2, 2787, 2788, 7, 6, 2, 2, 2788, 2790, 5, 232, 117, 2, 2789, 2787, 3, 2, 2, 2, 2790, 2793, 3, 2, 2, 2, 2791, 2789, 3, 2, 2, 2, 2791, 2792, 3, 2, 2, 2, 2792, 231, 3, 2, 2, 2, 2793, 2791, 3, 2, 2, 2, 2794, 2795, 5, 256, 129, 2, 2795, 2798, 5, 224, 113, 2, 2796, 2797, 7, 155, 2, 2, 2797, 2799, 7, 156, 2, 2, 2798, 2796, 3, 2, 2, 2, 2798, 2799, 3, 2, 2, 2, 2799, 2801, 3, 2, 2, 2, 2800, 2802, 5, 30, 16, 2, 2801, 2800, 3, 2, 2, 2, 2801, 2802, 3, 2, 2, 2, 2802, 233, 3, 2, 2, 2, 2803, 2808, 5, 236, 119, 2, 2804, 2805, 7, 6, 2, 2, 2805, 2807, 5, 236, 119, 2, 2806, 2804, 3, 2, 2, 2, 2807, 2810, 3, 2, 2, 2, 2808, 2806, 3, 2, 2, 2, 2808, 2809, 3, 2, 2, 2, 2809, 235, 3, 2, 2, 2, 2810, 2808, 3, 2, 2, 2, 2811, 2812, 5, 260, 131, 2, 2812, 2813, 7, 13, 2, 2, 2813, 2816, 5, 224, 113, 2, 2814, 2815, 7, 155, 2, 2, 2815, 2817, 7, 156, 2, 2, 2816, 2814, 3, 2, 2, 2, 2816, 2817, 3, 2, 2, 2, 2817, 2819, 3, 2, 2, 2, 2818, 2820, 5, 30, 16, 2, 2819, 2818, 3, 2, 2, 2, 2819, 2820, 3, 2, 2, 2, 2820, 237, 3, 2, 2, 2, 2821, 2822, 7, 261, 2, 2, 2822, 2823, 5, 188, 95, 2, 2823, 2824, 7, 235, 2, 2, 2824, 2825, 5, 188, 95, 2, 2825, 239, 3, 2, 2, 2, 2826, 2827, 7, 263, 2, 2, 2827, 2832, 5, 242, 122, 2, 2828, 2829, 7, 6, 2, 2, 2829, 2831, 5, 242, 122, 2, 2830, 2828, 3, 2, 2, 2, 2831, 2834, 3, 2, 2, 2, 2832, 2830, 3, 2, 2, 2, 2832, 2833, 3, 2, 2, 2, 2833, 241, 3, 2, 2, 2, 2834, 2832, 3, 2, 2, 2, 2835, 2836, 5, 256, 129, 2, 2836, 2837, 7, 24, 2, 2, 2837, 2838, 5, 244, 123, 2, 2838, 243, 3, 2, 2, 2, 2839, 2886, 5, 256, 129, 2, 2840, 2841, 7, 4, 2, 2, 2841, 2842, 5, 256, 129, 2, 2842, 2843, 7, 5, 2, 2, 2843, 2886, 3, 2, 2, 2, 2844, 2879, 7, 4, 2, 2, 2845, 2846, 7, 40, 2, 2, 2846, 2847, 7, 32, 2, 2, 2847, 2852, 5, 188, 95, 2, 2848, 2849, 7, 6, 2, 2, 2849, 2851, 5, 188, 95, 2, 2850, 2848, 3, 2, 2, 2, 2851, 2854, 3, 2, 2, 2, 2852, 2850, 3, 2, 2, 2, 2852, 2853, 3, 2, 2, 2, 2853, 2880, 3, 2, 2, 2, 2854, 2852, 3, 2, 2, 2, 2855, 2856, 9, 36, 2, 2, 2856, 2857, 7, 32, 2, 2, 2857, 2862, 5, 188, 95, 2, 2858, 2859, 7, 6, 2, 2, 2859, 2861, 5, 188, 95, 2, 2860, 2858, 3, 2, 2, 2, 2861, 2864, 3, 2, 2, 2, 2862, 2860, 3, 2, 2, 2, 2862, 2863, 3, 2, 2, 2, 2863, 2866, 3, 2, 2, 2, 2864, 2862, 3, 2, 2, 2, 2865, 2855, 3, 2, 2, 2, 2865, 2866, 3, 2, 2, 2, 2866, 2877, 3, 2, 2, 2, 2867, 2868, 9, 37, 2, 2, 2868, 2869, 7, 32, 2, 2, 2869, 2874, 5, 86, 44, 2, 2870, 2871, 7, 6, 2, 2, 2871, 2873, 5, 86, 44, 2, 2872, 2870, 3, 2, 2, 2, 2873, 2876, 3, 2, 2, 2, 2874, 2872, 3, 2, 2, 2, 2874, 2875, 3, 2, 2, 2, 2875, 2878, 3, 2, 2, 2, 2876, 2874, 3, 2, 2, 2, 2877, 2867, 3, 2, 2, 2, 2877, 2878, 3, 2, 2, 2, 2878, 2880, 3, 2, 2, 2, 2879, 2845, 3, 2, 2, 2, 2879, 2865, 3, 2, 2, 2, 2880, 2882, 3, 2, 2, 2, 2881, 2883, 5, 246, 124, 2, 2882, 2881, 3, 2, 2, 2, 2882, 2883, 3, 2, 2, 2, 2883, 2884, 3, 2, 2, 2, 2884, 2886, 7, 5, 2, 2, 2885, 2839, 3, 2, 2, 2, 2885, 2840, 3, 2, 2, 2, 2885, 2844, 3, 2, 2, 2, 2886, 245, 3, 2, 2, 2, 2887, 2888, 7, 185, 2, 2, 2888, 2904, 5, 248, 125, 2, 2889, 2890, 7, 205, 2, 2, 2890, 2904, 5, 248, 125, 2, 2891, 2892, 7, 185, 2, 2, 2892, 2893, 7, 28, 2, 2, 2893, 2894, 5, 248, 125, 2, 2894, 2895, 7, 19, 2, 2, 2895, 2896, 5, 248, 125, 2, 2896, 2904, 3, 2, 2, 2, 2897, 2898, 7, 205, 2, 2, 2898, 2899, 7, 28, 2, 2, 2899, 2900, 5, 248, 125, 2, 2900, 2901, 7, 19, 2, 2, 2901, 2902, 5, 248, 125, 2, 2902, 2904, 3, 2, 2, 2, 2903, 2887, 3, 2, 2, 2, 2903, 2889, 3, 2, 2, 2, 2903, 2891, 3, 2, 2, 2, 2903, 2897, 3, 2, 2, 2, 2904, 247, 3, 2, 2, 2, 2905, 2906, 7, 247, 2, 2, 2906, 2913, 9, 38, 2, 2, 2907, 2908, 7, 58, 2, 2, 2908, 2913, 7, 204, 2, 2, 2909, 2910, 5, 188, 95, 2, 2910, 2911, 9, 38, 2, 2, 2911, 2913, 3, 2, 2, 2, 2912, 2905, 3, 2, 2, 2, 2912, 2907, 3, 2, 2, 2, 2912, 2909, 3, 2, 2, 2, 2913, 249, 3, 2, 2, 2, 2914, 2919, 5, 254, 128, 2, 2915, 2916, 7, 6, 2, 2, 2916, 2918, 5, 254, 128, 2, 2917, 2915, 3, 2, 2, 2, 2918, 2921, 3, 2, 2, 2, 2919, 2917, 3, 2, 2, 2, 2919, 2920, 3, 2, 2, 2, 2920, 251, 3, 2, 2, 2, 2921, 2919, 3, 2, 2, 2, 2922, 2927, 5, 254, 128, 2, 2923, 2927, 7, 94, 2, 2, 2924, 2927, 7, 133, 2, 2, 2925, 2927, 7, 198, 2, 2, 2926, 2922, 3, 2, 2, 2, 2926, 2923, 3, 2, 2, 2, 2926, 2924, 3, 2, 2, 2, 2926, 2925, 3, 2, 2, 2, 2927, 253, 3, 2, 2, 2, 2928, 2933, 5, 260, 131, 2, 2929, 2930, 7, 7, 2, 2, 2930, 2932, 5, 260, 131, 2, 2931, 2929, 3, 2, 2, 2, 2932, 2935, 3, 2, 2, 2, 2933, 2931, 3, 2, 2, 2, 2933, 2934, 3, 2, 2, 2, 2934, 255, 3, 2, 2, 2, 2935, 2933, 3, 2, 2, 2, 2936, 2937, 5, 260, 131, 2, 2937, 2938, 5, 258, 130, 2, 2938, 257, 3, 2, 2, 2, 2939, 2940, 7, 275, 2, 2, 2940, 2942, 5, 260, 131, 2, 2941, 2939, 3, 2, 2, 2, 2942, 2943, 3, 2, 2, 2, 2943, 2941, 3, 2, 2, 2, 2943, 2944, 3, 2, 2, 2, 2944, 2947, 3, 2, 2, 2, 2945, 2947, 3, 2, 2, 2, 2946, 2941, 3, 2, 2, 2, 2946, 2945, 3, 2, 2, 2, 2947, 259, 3, 2, 2, 2, 2948, 2952, 5, 262, 132, 2, 2949, 2950, 6, 131, 20, 2, 2950, 2952, 5, 272, 137, 2, 2951, 2948, 3, 2, 2, 2, 2951, 2949, 3, 2, 2, 2, 2952, 261, 3, 2, 2, 2, 2953, 2960, 7, 294, 2, 2, 2954, 2960, 5, 264, 133, 2, 2955, 2956, 6, 132, 21, 2, 2956, 2960, 5, 270, 136, 2, 2957, 2958, 6, 132, 22, 2, 2958, 2960, 5, 274, 138, 2, 2959, 2953, 3, 2, 2, 2, 2959, 2954, 3, 2, 2, 2, 2959, 2955, 3, 2, 2, 2, 2959, 2957, 3, 2, 2, 2, 2960, 263, 3, 2, 2, 2, 2961, 2962, 7, 295, 2, 2, 2962, 265, 3, 2, 2, 2, 2963, 2965, 6, 134, 23, 2, 2964, 2966, 7, 275, 2, 2, 2965, 2964, 3, 2, 2, 2, 2965, 2966, 3, 2, 2, 2, 2966, 2967, 3, 2, 2, 2, 2967, 3003, 7, 290, 2, 2, 2968, 2970, 6, 134, 24, 2, 2969, 2971, 7, 275, 2, 2, 2970, 2969, 3, 2, 2, 2, 2970, 2971, 3, 2, 2, 2, 2971, 2972, 3, 2, 2, 2, 2972, 3003, 7, 291, 2, 2, 2973, 2975, 6, 134, 25, 2, 2974, 2976, 7, 275, 2, 2, 2975, 2974, 3, 2, 2, 2, 2975, 2976, 3, 2, 2, 2, 2976, 2977, 3, 2, 2, 2, 2977, 3003, 9, 39, 2, 2, 2978, 2980, 7, 275, 2, 2, 2979, 2978, 3, 2, 2, 2, 2979, 2980, 3, 2, 2, 2, 2980, 2981, 3, 2, 2, 2, 2981, 3003, 7, 289, 2, 2, 2982, 2984, 7, 275, 2, 2, 2983, 2982, 3, 2, 2, 2, 2983, 2984, 3, 2, 2, 2, 2984, 2985, 3, 2, 2, 2, 2985, 3003, 7, 286, 2, 2, 2986, 2988, 7, 275, 2, 2, 2987, 2986, 3, 2, 2, 2, 2987, 2988, 3, 2, 2, 2, 2988, 2989, 3, 2, 2, 2, 2989, 3003, 7, 287, 2, 2, 2990, 2992, 7, 275, 2, 2, 2991, 2990, 3, 2, 2, 2, 2991, 2992, 3, 2, 2, 2, 2992, 2993, 3, 2, 2, 2, 2993, 3003, 7, 288, 2, 2, 2994, 2996, 7, 275, 2, 2, 2995, 2994, 3, 2, 2, 2, 2995, 2996, 3, 2, 2, 2, 2996, 2997, 3, 2, 2, 2, 2997, 3003, 7, 292, 2, 2, 2998, 3000, 7, 275, 2, 2, 2999, 2998, 3, 2, 2, 2, 2999, 3000, 3, 2, 2, 2, 3000, 3001, 3, 2, 2, 2, 3001, 3003, 7, 293, 2, 2, 3002, 2963, 3, 2, 2, 2, 3002, 2968, 3, 2, 2, 2, 3002, 2973, 3, 2, 2, 2, 3002, 2979, 3, 2, 2, 2, 3002, 2983, 3, 2, 2, 2, 3002, 2987, 3, 2, 2, 2, 3002, 2991, 3, 2, 2, 2, 3002, 2995, 3, 2, 2, 2, 3002, 2999, 3, 2, 2, 2, 3003, 267, 3, 2, 2, 2, 3004, 3005, 7, 245, 2, 2, 3005, 3012, 5, 224, 113, 2, 3006, 3012, 5, 30, 16, 2, 3007, 3012, 5, 222, 112, 2, 3008, 3009, 9, 40, 2, 2, 3009, 3010, 7, 155, 2, 2, 3010, 3012, 7, 156, 2, 2, 3011, 3004, 3, 2, 2, 2, 3011, 3006, 3, 2, 2, 2, 3011, 3007, 3, 2, 2, 2, 3011, 3008, 3, 2, 2, 2, 3012, 269, 3, 2, 2, 2, 3013, 3014, 9, 41, 2, 2, 3014, 271, 3, 2, 2, 2, 3015, 3016, 9, 42, 2, 2, 3016, 273, 3, 2, 2, 2, 3017, 3018, 9, 43, 2, 2, 3018, 275, 3, 2, 2, 2, 396, 280, 305, 310, 318, 326, 328, 348, 352, 358, 361, 364, 372, 375, 379, 382, 390, 395, 398, 405, 417, 426, 428, 432, 435, 442, 453, 455, 463, 468, 471, 477, 488, 552, 561, 565, 571, 575, 580, 586, 598, 606, 612, 625, 630, 646, 653, 657, 663, 678, 682, 688, 694, 697, 700, 706, 710, 718, 720, 729, 732, 741, 746, 752, 759, 762, 768, 779, 782, 786, 791, 796, 803, 806, 809, 816, 821, 830, 838, 844, 847, 850, 856, 860, 864, 868, 870, 878, 886, 892, 898, 901, 905, 908, 912, 937, 940, 944, 950, 953, 956, 962, 970, 975, 981, 987, 999, 1002, 1009, 1016, 1024, 1027, 1035, 1039, 1046, 1162, 1170, 1178, 1187, 1197, 1201, 1204, 1210, 1216, 1228, 1240, 1245, 1254, 1262, 1269, 1271, 1276, 1280, 1285, 1290, 1295, 1298, 1303, 1307, 1312, 1314, 1318, 1327, 1335, 1344, 1351, 1360, 1365, 1368, 1387, 1389, 1398, 1405, 1408, 1415, 1419, 1425, 1433, 1444, 1455, 1462, 1468, 1481, 1488, 1495, 1507, 1515, 1521, 1524, 1533, 1536, 1545, 1548, 1557, 1560, 1569, 1572, 1575, 1580, 1582, 1594, 1601, 1608, 1611, 1613, 1625, 1629, 1633, 1639, 1643, 1651, 1655, 1658, 1661, 1664, 1668, 1672, 1675, 1679, 1684, 1688, 1691, 1694, 1697, 1699, 1711, 1714, 1718, 1728, 1732, 1734, 1737, 1741, 1747, 1751, 1762, 1772, 1784, 1799, 1804, 1811, 1827, 1832, 1845, 1850, 1858, 1864, 1868, 1877, 1892, 1897, 1909, 1914, 1922, 1925, 1929, 1943, 1956, 1961, 1965, 1968, 1973, 1982, 1985, 1990, 1997, 2000, 2008, 2015, 2022, 2025, 2030, 2033, 2038, 2042, 2045, 2048, 2054, 2059, 2064, 2082, 2084, 2087, 2098, 2107, 2114, 2122, 2129, 2133, 2141, 2149, 2155, 2163, 2175, 2178, 2184, 2188, 2190, 2199, 2211, 2213, 2220, 2227, 2233, 2239, 2241, 2248, 2256, 2262, 2269, 2275, 2279, 2281, 2288, 2297, 2310, 2315, 2319, 2333, 2335, 2343, 2345, 2349, 2357, 2366, 2372, 2380, 2385, 2397, 2402, 2405, 2411, 2415, 2420, 2425, 2430, 2436, 2457, 2459, 2468, 2472, 2481, 2485, 2503, 2506, 2514, 2523, 2546, 2557, 2564, 2567, 2576, 2580, 2592, 2617, 2624, 2627, 2642, 2646, 2656, 2658, 2671, 2673, 2686, 2690, 2697, 2702, 2710, 2714, 2723, 2728, 2745, 2749, 2758, 2762, 2764, 2771, 2778, 2781, 2784, 2791, 2798, 2801, 2808, 2816, 2819, 2832, 2852, 2862, 2865, 2874, 2877, 2879, 2882, 2885, 2903, 2912, 2919, 2926, 2933, 2943, 2946, 2951, 2959, 2965, 2970, 2975, 2979, 2983, 2987, 2991, 2995, 2999, 3002, 3011] \ No newline at end of file diff --git a/pysparkling/sql/ast/generated/SqlBase.tokens b/pysparkling/sql/ast/generated/SqlBase.tokens new file mode 100644 index 000000000..0d0385147 --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBase.tokens @@ -0,0 +1,572 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +ADD=12 +AFTER=13 +ALL=14 +ALTER=15 +ANALYZE=16 +AND=17 +ANTI=18 +ANY=19 +ARCHIVE=20 +ARRAY=21 +AS=22 +ASC=23 +AT=24 +AUTHORIZATION=25 +BETWEEN=26 +BOTH=27 +BUCKET=28 +BUCKETS=29 +BY=30 +CACHE=31 +CASCADE=32 +CASE=33 +CAST=34 +CHANGE=35 +CHECK=36 +CLEAR=37 +CLUSTER=38 +CLUSTERED=39 +CODEGEN=40 +COLLATE=41 +COLLECTION=42 +COLUMN=43 +COLUMNS=44 +COMMENT=45 +COMMIT=46 +COMPACT=47 +COMPACTIONS=48 +COMPUTE=49 +CONCATENATE=50 +CONSTRAINT=51 +COST=52 +CREATE=53 +CROSS=54 +CUBE=55 +CURRENT=56 +CURRENT_DATE=57 +CURRENT_TIME=58 +CURRENT_TIMESTAMP=59 +CURRENT_USER=60 +DATA=61 +DATABASE=62 +DATABASES=63 +DAY=64 +DBPROPERTIES=65 +DEFINED=66 +DELETE=67 +DELIMITED=68 +DESC=69 +DESCRIBE=70 +DFS=71 +DIRECTORIES=72 +DIRECTORY=73 +DISTINCT=74 +DISTRIBUTE=75 +DROP=76 +ELSE=77 +END=78 +ESCAPE=79 +ESCAPED=80 +EXCEPT=81 +EXCHANGE=82 +EXISTS=83 +EXPLAIN=84 +EXPORT=85 +EXTENDED=86 +EXTERNAL=87 +EXTRACT=88 +FALSE=89 +FETCH=90 +FIELDS=91 +FILTER=92 +FILEFORMAT=93 +FIRST=94 +FOLLOWING=95 +FOR=96 +FOREIGN=97 +FORMAT=98 +FORMATTED=99 +FROM=100 +FULL=101 +FUNCTION=102 +FUNCTIONS=103 +GLOBAL=104 +GRANT=105 +GROUP=106 +GROUPING=107 +HAVING=108 +HOUR=109 +IF=110 +IGNORE=111 +IMPORT=112 +IN=113 +INDEX=114 +INDEXES=115 +INNER=116 +INPATH=117 +INPUTFORMAT=118 +INSERT=119 +INTERSECT=120 +INTERVAL=121 +INTO=122 +IS=123 +ITEMS=124 +JOIN=125 +KEYS=126 +LAST=127 +LATERAL=128 +LAZY=129 +LEADING=130 +LEFT=131 +LIKE=132 +LIMIT=133 +LINES=134 +LIST=135 +LOAD=136 +LOCAL=137 +LOCATION=138 +LOCK=139 +LOCKS=140 +LOGICAL=141 +MACRO=142 +MAP=143 +MATCHED=144 +MERGE=145 +MINUTE=146 +MONTH=147 +MSCK=148 +NAMESPACE=149 +NAMESPACES=150 +NATURAL=151 +NO=152 +NOT=153 +NULL=154 +NULLS=155 +OF=156 +ON=157 +ONLY=158 +OPTION=159 +OPTIONS=160 +OR=161 +ORDER=162 +OUT=163 +OUTER=164 +OUTPUTFORMAT=165 +OVER=166 +OVERLAPS=167 +OVERLAY=168 +OVERWRITE=169 +PARTITION=170 +PARTITIONED=171 +PARTITIONS=172 +PERCENTLIT=173 +PIVOT=174 +PLACING=175 +POSITION=176 +PRECEDING=177 +PRIMARY=178 +PRINCIPALS=179 +PROPERTIES=180 +PURGE=181 +QUERY=182 +RANGE=183 +RECORDREADER=184 +RECORDWRITER=185 +RECOVER=186 +REDUCE=187 +REFERENCES=188 +REFRESH=189 +RENAME=190 +REPAIR=191 +REPLACE=192 +RESET=193 +RESTRICT=194 +REVOKE=195 +RIGHT=196 +RLIKE=197 +ROLE=198 +ROLES=199 +ROLLBACK=200 +ROLLUP=201 +ROW=202 +ROWS=203 +SCHEMA=204 +SECOND=205 +SELECT=206 +SEMI=207 +SEPARATED=208 +SERDE=209 +SERDEPROPERTIES=210 +SESSION_USER=211 +SET=212 +SETMINUS=213 +SETS=214 +SHOW=215 +SKEWED=216 +SOME=217 +SORT=218 +SORTED=219 +START=220 +STATISTICS=221 +STORED=222 +STRATIFY=223 +STRUCT=224 +SUBSTR=225 +SUBSTRING=226 +TABLE=227 +TABLES=228 +TABLESAMPLE=229 +TBLPROPERTIES=230 +TEMPORARY=231 +TERMINATED=232 +THEN=233 +TO=234 +TOUCH=235 +TRAILING=236 +TRANSACTION=237 +TRANSACTIONS=238 +TRANSFORM=239 +TRIM=240 +TRUE=241 +TRUNCATE=242 +TYPE=243 +UNARCHIVE=244 +UNBOUNDED=245 +UNCACHE=246 +UNION=247 +UNIQUE=248 +UNKNOWN=249 +UNLOCK=250 +UNSET=251 +UPDATE=252 +USE=253 +USER=254 +USING=255 +VALUES=256 +VIEW=257 +VIEWS=258 +WHEN=259 +WHERE=260 +WINDOW=261 +WITH=262 +YEAR=263 +EQ=264 +NSEQ=265 +NEQ=266 +NEQJ=267 +LT=268 +LTE=269 +GT=270 +GTE=271 +PLUS=272 +MINUS=273 +ASTERISK=274 +SLASH=275 +PERCENT=276 +DIV=277 +TILDE=278 +AMPERSAND=279 +PIPE=280 +CONCAT_PIPE=281 +HAT=282 +STRING=283 +BIGINT_LITERAL=284 +SMALLINT_LITERAL=285 +TINYINT_LITERAL=286 +INTEGER_VALUE=287 +EXPONENT_VALUE=288 +DECIMAL_VALUE=289 +DOUBLE_LITERAL=290 +BIGDECIMAL_LITERAL=291 +IDENTIFIER=292 +BACKQUOTED_IDENTIFIER=293 +SIMPLE_COMMENT=294 +BRACKETED_COMMENT=295 +WS=296 +UNRECOGNIZED=297 +';'=1 +'('=2 +')'=3 +','=4 +'.'=5 +'/*+'=6 +'*/'=7 +'->'=8 +'['=9 +']'=10 +':'=11 +'ADD'=12 +'AFTER'=13 +'ALL'=14 +'ALTER'=15 +'ANALYZE'=16 +'AND'=17 +'ANTI'=18 +'ANY'=19 +'ARCHIVE'=20 +'ARRAY'=21 +'AS'=22 +'ASC'=23 +'AT'=24 +'AUTHORIZATION'=25 +'BETWEEN'=26 +'BOTH'=27 +'BUCKET'=28 +'BUCKETS'=29 +'BY'=30 +'CACHE'=31 +'CASCADE'=32 +'CASE'=33 +'CAST'=34 +'CHANGE'=35 +'CHECK'=36 +'CLEAR'=37 +'CLUSTER'=38 +'CLUSTERED'=39 +'CODEGEN'=40 +'COLLATE'=41 +'COLLECTION'=42 +'COLUMN'=43 +'COLUMNS'=44 +'COMMENT'=45 +'COMMIT'=46 +'COMPACT'=47 +'COMPACTIONS'=48 +'COMPUTE'=49 +'CONCATENATE'=50 +'CONSTRAINT'=51 +'COST'=52 +'CREATE'=53 +'CROSS'=54 +'CUBE'=55 +'CURRENT'=56 +'CURRENT_DATE'=57 +'CURRENT_TIME'=58 +'CURRENT_TIMESTAMP'=59 +'CURRENT_USER'=60 +'DATA'=61 +'DATABASE'=62 +'DAY'=64 +'DBPROPERTIES'=65 +'DEFINED'=66 +'DELETE'=67 +'DELIMITED'=68 +'DESC'=69 +'DESCRIBE'=70 +'DFS'=71 +'DIRECTORIES'=72 +'DIRECTORY'=73 +'DISTINCT'=74 +'DISTRIBUTE'=75 +'DROP'=76 +'ELSE'=77 +'END'=78 +'ESCAPE'=79 +'ESCAPED'=80 +'EXCEPT'=81 +'EXCHANGE'=82 +'EXISTS'=83 +'EXPLAIN'=84 +'EXPORT'=85 +'EXTENDED'=86 +'EXTERNAL'=87 +'EXTRACT'=88 +'FALSE'=89 +'FETCH'=90 +'FIELDS'=91 +'FILTER'=92 +'FILEFORMAT'=93 +'FIRST'=94 +'FOLLOWING'=95 +'FOR'=96 +'FOREIGN'=97 +'FORMAT'=98 +'FORMATTED'=99 +'FROM'=100 +'FULL'=101 +'FUNCTION'=102 +'FUNCTIONS'=103 +'GLOBAL'=104 +'GRANT'=105 +'GROUP'=106 +'GROUPING'=107 +'HAVING'=108 +'HOUR'=109 +'IF'=110 +'IGNORE'=111 +'IMPORT'=112 +'IN'=113 +'INDEX'=114 +'INDEXES'=115 +'INNER'=116 +'INPATH'=117 +'INPUTFORMAT'=118 +'INSERT'=119 +'INTERSECT'=120 +'INTERVAL'=121 +'INTO'=122 +'IS'=123 +'ITEMS'=124 +'JOIN'=125 +'KEYS'=126 +'LAST'=127 +'LATERAL'=128 +'LAZY'=129 +'LEADING'=130 +'LEFT'=131 +'LIKE'=132 +'LIMIT'=133 +'LINES'=134 +'LIST'=135 +'LOAD'=136 +'LOCAL'=137 +'LOCATION'=138 +'LOCK'=139 +'LOCKS'=140 +'LOGICAL'=141 +'MACRO'=142 +'MAP'=143 +'MATCHED'=144 +'MERGE'=145 +'MINUTE'=146 +'MONTH'=147 +'MSCK'=148 +'NAMESPACE'=149 +'NAMESPACES'=150 +'NATURAL'=151 +'NO'=152 +'NULL'=154 +'NULLS'=155 +'OF'=156 +'ON'=157 +'ONLY'=158 +'OPTION'=159 +'OPTIONS'=160 +'OR'=161 +'ORDER'=162 +'OUT'=163 +'OUTER'=164 +'OUTPUTFORMAT'=165 +'OVER'=166 +'OVERLAPS'=167 +'OVERLAY'=168 +'OVERWRITE'=169 +'PARTITION'=170 +'PARTITIONED'=171 +'PARTITIONS'=172 +'PERCENT'=173 +'PIVOT'=174 +'PLACING'=175 +'POSITION'=176 +'PRECEDING'=177 +'PRIMARY'=178 +'PRINCIPALS'=179 +'PROPERTIES'=180 +'PURGE'=181 +'QUERY'=182 +'RANGE'=183 +'RECORDREADER'=184 +'RECORDWRITER'=185 +'RECOVER'=186 +'REDUCE'=187 +'REFERENCES'=188 +'REFRESH'=189 +'RENAME'=190 +'REPAIR'=191 +'REPLACE'=192 +'RESET'=193 +'RESTRICT'=194 +'REVOKE'=195 +'RIGHT'=196 +'ROLE'=198 +'ROLES'=199 +'ROLLBACK'=200 +'ROLLUP'=201 +'ROW'=202 +'ROWS'=203 +'SCHEMA'=204 +'SECOND'=205 +'SELECT'=206 +'SEMI'=207 +'SEPARATED'=208 +'SERDE'=209 +'SERDEPROPERTIES'=210 +'SESSION_USER'=211 +'SET'=212 +'MINUS'=213 +'SETS'=214 +'SHOW'=215 +'SKEWED'=216 +'SOME'=217 +'SORT'=218 +'SORTED'=219 +'START'=220 +'STATISTICS'=221 +'STORED'=222 +'STRATIFY'=223 +'STRUCT'=224 +'SUBSTR'=225 +'SUBSTRING'=226 +'TABLE'=227 +'TABLES'=228 +'TABLESAMPLE'=229 +'TBLPROPERTIES'=230 +'TERMINATED'=232 +'THEN'=233 +'TO'=234 +'TOUCH'=235 +'TRAILING'=236 +'TRANSACTION'=237 +'TRANSACTIONS'=238 +'TRANSFORM'=239 +'TRIM'=240 +'TRUE'=241 +'TRUNCATE'=242 +'TYPE'=243 +'UNARCHIVE'=244 +'UNBOUNDED'=245 +'UNCACHE'=246 +'UNION'=247 +'UNIQUE'=248 +'UNKNOWN'=249 +'UNLOCK'=250 +'UNSET'=251 +'UPDATE'=252 +'USE'=253 +'USER'=254 +'USING'=255 +'VALUES'=256 +'VIEW'=257 +'VIEWS'=258 +'WHEN'=259 +'WHERE'=260 +'WINDOW'=261 +'WITH'=262 +'YEAR'=263 +'<=>'=265 +'<>'=266 +'!='=267 +'<'=268 +'>'=270 +'+'=272 +'-'=273 +'*'=274 +'/'=275 +'%'=276 +'DIV'=277 +'~'=278 +'&'=279 +'|'=280 +'||'=281 +'^'=282 diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.interp b/pysparkling/sql/ast/generated/SqlBaseLexer.interp new file mode 100644 index 000000000..d5a2997a4 --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.interp @@ -0,0 +1,912 @@ +token literal names: +null +';' +'(' +')' +',' +'.' +'/*+' +'*/' +'->' +'[' +']' +':' +'ADD' +'AFTER' +'ALL' +'ALTER' +'ANALYZE' +'AND' +'ANTI' +'ANY' +'ARCHIVE' +'ARRAY' +'AS' +'ASC' +'AT' +'AUTHORIZATION' +'BETWEEN' +'BOTH' +'BUCKET' +'BUCKETS' +'BY' +'CACHE' +'CASCADE' +'CASE' +'CAST' +'CHANGE' +'CHECK' +'CLEAR' +'CLUSTER' +'CLUSTERED' +'CODEGEN' +'COLLATE' +'COLLECTION' +'COLUMN' +'COLUMNS' +'COMMENT' +'COMMIT' +'COMPACT' +'COMPACTIONS' +'COMPUTE' +'CONCATENATE' +'CONSTRAINT' +'COST' +'CREATE' +'CROSS' +'CUBE' +'CURRENT' +'CURRENT_DATE' +'CURRENT_TIME' +'CURRENT_TIMESTAMP' +'CURRENT_USER' +'DATA' +'DATABASE' +null +'DAY' +'DBPROPERTIES' +'DEFINED' +'DELETE' +'DELIMITED' +'DESC' +'DESCRIBE' +'DFS' +'DIRECTORIES' +'DIRECTORY' +'DISTINCT' +'DISTRIBUTE' +'DROP' +'ELSE' +'END' +'ESCAPE' +'ESCAPED' +'EXCEPT' +'EXCHANGE' +'EXISTS' +'EXPLAIN' +'EXPORT' +'EXTENDED' +'EXTERNAL' +'EXTRACT' +'FALSE' +'FETCH' +'FIELDS' +'FILTER' +'FILEFORMAT' +'FIRST' +'FOLLOWING' +'FOR' +'FOREIGN' +'FORMAT' +'FORMATTED' +'FROM' +'FULL' +'FUNCTION' +'FUNCTIONS' +'GLOBAL' +'GRANT' +'GROUP' +'GROUPING' +'HAVING' +'HOUR' +'IF' +'IGNORE' +'IMPORT' +'IN' +'INDEX' +'INDEXES' +'INNER' +'INPATH' +'INPUTFORMAT' +'INSERT' +'INTERSECT' +'INTERVAL' +'INTO' +'IS' +'ITEMS' +'JOIN' +'KEYS' +'LAST' +'LATERAL' +'LAZY' +'LEADING' +'LEFT' +'LIKE' +'LIMIT' +'LINES' +'LIST' +'LOAD' +'LOCAL' +'LOCATION' +'LOCK' +'LOCKS' +'LOGICAL' +'MACRO' +'MAP' +'MATCHED' +'MERGE' +'MINUTE' +'MONTH' +'MSCK' +'NAMESPACE' +'NAMESPACES' +'NATURAL' +'NO' +null +'NULL' +'NULLS' +'OF' +'ON' +'ONLY' +'OPTION' +'OPTIONS' +'OR' +'ORDER' +'OUT' +'OUTER' +'OUTPUTFORMAT' +'OVER' +'OVERLAPS' +'OVERLAY' +'OVERWRITE' +'PARTITION' +'PARTITIONED' +'PARTITIONS' +'PERCENT' +'PIVOT' +'PLACING' +'POSITION' +'PRECEDING' +'PRIMARY' +'PRINCIPALS' +'PROPERTIES' +'PURGE' +'QUERY' +'RANGE' +'RECORDREADER' +'RECORDWRITER' +'RECOVER' +'REDUCE' +'REFERENCES' +'REFRESH' +'RENAME' +'REPAIR' +'REPLACE' +'RESET' +'RESTRICT' +'REVOKE' +'RIGHT' +null +'ROLE' +'ROLES' +'ROLLBACK' +'ROLLUP' +'ROW' +'ROWS' +'SCHEMA' +'SECOND' +'SELECT' +'SEMI' +'SEPARATED' +'SERDE' +'SERDEPROPERTIES' +'SESSION_USER' +'SET' +'MINUS' +'SETS' +'SHOW' +'SKEWED' +'SOME' +'SORT' +'SORTED' +'START' +'STATISTICS' +'STORED' +'STRATIFY' +'STRUCT' +'SUBSTR' +'SUBSTRING' +'TABLE' +'TABLES' +'TABLESAMPLE' +'TBLPROPERTIES' +null +'TERMINATED' +'THEN' +'TO' +'TOUCH' +'TRAILING' +'TRANSACTION' +'TRANSACTIONS' +'TRANSFORM' +'TRIM' +'TRUE' +'TRUNCATE' +'TYPE' +'UNARCHIVE' +'UNBOUNDED' +'UNCACHE' +'UNION' +'UNIQUE' +'UNKNOWN' +'UNLOCK' +'UNSET' +'UPDATE' +'USE' +'USER' +'USING' +'VALUES' +'VIEW' +'VIEWS' +'WHEN' +'WHERE' +'WINDOW' +'WITH' +'YEAR' +null +'<=>' +'<>' +'!=' +'<' +null +'>' +null +'+' +'-' +'*' +'/' +'%' +'DIV' +'~' +'&' +'|' +'||' +'^' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DATA +DATABASE +DATABASES +DAY +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SCHEMA +SECOND +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +DIV +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +rule names: +T__0 +T__1 +T__2 +T__3 +T__4 +T__5 +T__6 +T__7 +T__8 +T__9 +T__10 +ADD +AFTER +ALL +ALTER +ANALYZE +AND +ANTI +ANY +ARCHIVE +ARRAY +AS +ASC +AT +AUTHORIZATION +BETWEEN +BOTH +BUCKET +BUCKETS +BY +CACHE +CASCADE +CASE +CAST +CHANGE +CHECK +CLEAR +CLUSTER +CLUSTERED +CODEGEN +COLLATE +COLLECTION +COLUMN +COLUMNS +COMMENT +COMMIT +COMPACT +COMPACTIONS +COMPUTE +CONCATENATE +CONSTRAINT +COST +CREATE +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +DATA +DATABASE +DATABASES +DAY +DBPROPERTIES +DEFINED +DELETE +DELIMITED +DESC +DESCRIBE +DFS +DIRECTORIES +DIRECTORY +DISTINCT +DISTRIBUTE +DROP +ELSE +END +ESCAPE +ESCAPED +EXCEPT +EXCHANGE +EXISTS +EXPLAIN +EXPORT +EXTENDED +EXTERNAL +EXTRACT +FALSE +FETCH +FIELDS +FILTER +FILEFORMAT +FIRST +FOLLOWING +FOR +FOREIGN +FORMAT +FORMATTED +FROM +FULL +FUNCTION +FUNCTIONS +GLOBAL +GRANT +GROUP +GROUPING +HAVING +HOUR +IF +IGNORE +IMPORT +IN +INDEX +INDEXES +INNER +INPATH +INPUTFORMAT +INSERT +INTERSECT +INTERVAL +INTO +IS +ITEMS +JOIN +KEYS +LAST +LATERAL +LAZY +LEADING +LEFT +LIKE +LIMIT +LINES +LIST +LOAD +LOCAL +LOCATION +LOCK +LOCKS +LOGICAL +MACRO +MAP +MATCHED +MERGE +MINUTE +MONTH +MSCK +NAMESPACE +NAMESPACES +NATURAL +NO +NOT +NULL +NULLS +OF +ON +ONLY +OPTION +OPTIONS +OR +ORDER +OUT +OUTER +OUTPUTFORMAT +OVER +OVERLAPS +OVERLAY +OVERWRITE +PARTITION +PARTITIONED +PARTITIONS +PERCENTLIT +PIVOT +PLACING +POSITION +PRECEDING +PRIMARY +PRINCIPALS +PROPERTIES +PURGE +QUERY +RANGE +RECORDREADER +RECORDWRITER +RECOVER +REDUCE +REFERENCES +REFRESH +RENAME +REPAIR +REPLACE +RESET +RESTRICT +REVOKE +RIGHT +RLIKE +ROLE +ROLES +ROLLBACK +ROLLUP +ROW +ROWS +SCHEMA +SECOND +SELECT +SEMI +SEPARATED +SERDE +SERDEPROPERTIES +SESSION_USER +SET +SETMINUS +SETS +SHOW +SKEWED +SOME +SORT +SORTED +START +STATISTICS +STORED +STRATIFY +STRUCT +SUBSTR +SUBSTRING +TABLE +TABLES +TABLESAMPLE +TBLPROPERTIES +TEMPORARY +TERMINATED +THEN +TO +TOUCH +TRAILING +TRANSACTION +TRANSACTIONS +TRANSFORM +TRIM +TRUE +TRUNCATE +TYPE +UNARCHIVE +UNBOUNDED +UNCACHE +UNION +UNIQUE +UNKNOWN +UNLOCK +UNSET +UPDATE +USE +USER +USING +VALUES +VIEW +VIEWS +WHEN +WHERE +WINDOW +WITH +YEAR +EQ +NSEQ +NEQ +NEQJ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +DIV +TILDE +AMPERSAND +PIPE +CONCAT_PIPE +HAT +STRING +BIGINT_LITERAL +SMALLINT_LITERAL +TINYINT_LITERAL +INTEGER_VALUE +EXPONENT_VALUE +DECIMAL_VALUE +DOUBLE_LITERAL +BIGDECIMAL_LITERAL +IDENTIFIER +BACKQUOTED_IDENTIFIER +DECIMAL_DIGITS +EXPONENT +DIGIT +LETTER +SIMPLE_COMMENT +BRACKETED_COMMENT +WS +UNRECOGNIZED + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 299, 2742, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 4, 224, 9, 224, 4, 225, 9, 225, 4, 226, 9, 226, 4, 227, 9, 227, 4, 228, 9, 228, 4, 229, 9, 229, 4, 230, 9, 230, 4, 231, 9, 231, 4, 232, 9, 232, 4, 233, 9, 233, 4, 234, 9, 234, 4, 235, 9, 235, 4, 236, 9, 236, 4, 237, 9, 237, 4, 238, 9, 238, 4, 239, 9, 239, 4, 240, 9, 240, 4, 241, 9, 241, 4, 242, 9, 242, 4, 243, 9, 243, 4, 244, 9, 244, 4, 245, 9, 245, 4, 246, 9, 246, 4, 247, 9, 247, 4, 248, 9, 248, 4, 249, 9, 249, 4, 250, 9, 250, 4, 251, 9, 251, 4, 252, 9, 252, 4, 253, 9, 253, 4, 254, 9, 254, 4, 255, 9, 255, 4, 256, 9, 256, 4, 257, 9, 257, 4, 258, 9, 258, 4, 259, 9, 259, 4, 260, 9, 260, 4, 261, 9, 261, 4, 262, 9, 262, 4, 263, 9, 263, 4, 264, 9, 264, 4, 265, 9, 265, 4, 266, 9, 266, 4, 267, 9, 267, 4, 268, 9, 268, 4, 269, 9, 269, 4, 270, 9, 270, 4, 271, 9, 271, 4, 272, 9, 272, 4, 273, 9, 273, 4, 274, 9, 274, 4, 275, 9, 275, 4, 276, 9, 276, 4, 277, 9, 277, 4, 278, 9, 278, 4, 279, 9, 279, 4, 280, 9, 280, 4, 281, 9, 281, 4, 282, 9, 282, 4, 283, 9, 283, 4, 284, 9, 284, 4, 285, 9, 285, 4, 286, 9, 286, 4, 287, 9, 287, 4, 288, 9, 288, 4, 289, 9, 289, 4, 290, 9, 290, 4, 291, 9, 291, 4, 292, 9, 292, 4, 293, 9, 293, 4, 294, 9, 294, 4, 295, 9, 295, 4, 296, 9, 296, 4, 297, 9, 297, 4, 298, 9, 298, 4, 299, 9, 299, 4, 300, 9, 300, 4, 301, 9, 301, 4, 302, 9, 302, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 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, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 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, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 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, 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, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 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, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 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, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 1029, 10, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 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, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1656, 10, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 5, 198, 2002, 10, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 5, 232, 2264, 10, 232, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 265, 3, 265, 3, 265, 5, 265, 2492, 10, 265, 3, 266, 3, 266, 3, 266, 3, 266, 3, 267, 3, 267, 3, 267, 3, 268, 3, 268, 3, 268, 3, 269, 3, 269, 3, 270, 3, 270, 3, 270, 3, 270, 5, 270, 2510, 10, 270, 3, 271, 3, 271, 3, 272, 3, 272, 3, 272, 3, 272, 5, 272, 2518, 10, 272, 3, 273, 3, 273, 3, 274, 3, 274, 3, 275, 3, 275, 3, 276, 3, 276, 3, 277, 3, 277, 3, 278, 3, 278, 3, 278, 3, 278, 3, 279, 3, 279, 3, 280, 3, 280, 3, 281, 3, 281, 3, 282, 3, 282, 3, 282, 3, 283, 3, 283, 3, 284, 3, 284, 3, 284, 3, 284, 7, 284, 2549, 10, 284, 12, 284, 14, 284, 2552, 11, 284, 3, 284, 3, 284, 3, 284, 3, 284, 3, 284, 7, 284, 2559, 10, 284, 12, 284, 14, 284, 2562, 11, 284, 3, 284, 5, 284, 2565, 10, 284, 3, 285, 6, 285, 2568, 10, 285, 13, 285, 14, 285, 2569, 3, 285, 3, 285, 3, 286, 6, 286, 2575, 10, 286, 13, 286, 14, 286, 2576, 3, 286, 3, 286, 3, 287, 6, 287, 2582, 10, 287, 13, 287, 14, 287, 2583, 3, 287, 3, 287, 3, 288, 6, 288, 2589, 10, 288, 13, 288, 14, 288, 2590, 3, 289, 6, 289, 2594, 10, 289, 13, 289, 14, 289, 2595, 3, 289, 3, 289, 3, 289, 3, 289, 3, 289, 3, 289, 5, 289, 2604, 10, 289, 3, 290, 3, 290, 3, 290, 3, 291, 6, 291, 2610, 10, 291, 13, 291, 14, 291, 2611, 3, 291, 5, 291, 2615, 10, 291, 3, 291, 3, 291, 3, 291, 3, 291, 5, 291, 2621, 10, 291, 3, 291, 3, 291, 3, 291, 5, 291, 2626, 10, 291, 3, 292, 6, 292, 2629, 10, 292, 13, 292, 14, 292, 2630, 3, 292, 5, 292, 2634, 10, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 5, 292, 2641, 10, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 5, 292, 2648, 10, 292, 3, 293, 3, 293, 3, 293, 6, 293, 2653, 10, 293, 13, 293, 14, 293, 2654, 3, 294, 3, 294, 3, 294, 3, 294, 7, 294, 2661, 10, 294, 12, 294, 14, 294, 2664, 11, 294, 3, 294, 3, 294, 3, 295, 6, 295, 2669, 10, 295, 13, 295, 14, 295, 2670, 3, 295, 3, 295, 7, 295, 2675, 10, 295, 12, 295, 14, 295, 2678, 11, 295, 3, 295, 3, 295, 6, 295, 2682, 10, 295, 13, 295, 14, 295, 2683, 5, 295, 2686, 10, 295, 3, 296, 3, 296, 5, 296, 2690, 10, 296, 3, 296, 6, 296, 2693, 10, 296, 13, 296, 14, 296, 2694, 3, 297, 3, 297, 3, 298, 3, 298, 3, 299, 3, 299, 3, 299, 3, 299, 7, 299, 2705, 10, 299, 12, 299, 14, 299, 2708, 11, 299, 3, 299, 5, 299, 2711, 10, 299, 3, 299, 5, 299, 2714, 10, 299, 3, 299, 3, 299, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 7, 300, 2724, 10, 300, 12, 300, 14, 300, 2727, 11, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 301, 6, 301, 2735, 10, 301, 13, 301, 14, 301, 2736, 3, 301, 3, 301, 3, 302, 3, 302, 3, 2725, 2, 303, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 218, 435, 219, 437, 220, 439, 221, 441, 222, 443, 223, 445, 224, 447, 225, 449, 226, 451, 227, 453, 228, 455, 229, 457, 230, 459, 231, 461, 232, 463, 233, 465, 234, 467, 235, 469, 236, 471, 237, 473, 238, 475, 239, 477, 240, 479, 241, 481, 242, 483, 243, 485, 244, 487, 245, 489, 246, 491, 247, 493, 248, 495, 249, 497, 250, 499, 251, 501, 252, 503, 253, 505, 254, 507, 255, 509, 256, 511, 257, 513, 258, 515, 259, 517, 260, 519, 261, 521, 262, 523, 263, 525, 264, 527, 265, 529, 266, 531, 267, 533, 268, 535, 269, 537, 270, 539, 271, 541, 272, 543, 273, 545, 274, 547, 275, 549, 276, 551, 277, 553, 278, 555, 279, 557, 280, 559, 281, 561, 282, 563, 283, 565, 284, 567, 285, 569, 286, 571, 287, 573, 288, 575, 289, 577, 290, 579, 291, 581, 292, 583, 293, 585, 294, 587, 295, 589, 2, 591, 2, 593, 2, 595, 2, 597, 296, 599, 297, 601, 298, 603, 299, 3, 2, 10, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 3, 2, 67, 92, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2780, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 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, 29, 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, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 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, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 433, 3, 2, 2, 2, 2, 435, 3, 2, 2, 2, 2, 437, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 2, 447, 3, 2, 2, 2, 2, 449, 3, 2, 2, 2, 2, 451, 3, 2, 2, 2, 2, 453, 3, 2, 2, 2, 2, 455, 3, 2, 2, 2, 2, 457, 3, 2, 2, 2, 2, 459, 3, 2, 2, 2, 2, 461, 3, 2, 2, 2, 2, 463, 3, 2, 2, 2, 2, 465, 3, 2, 2, 2, 2, 467, 3, 2, 2, 2, 2, 469, 3, 2, 2, 2, 2, 471, 3, 2, 2, 2, 2, 473, 3, 2, 2, 2, 2, 475, 3, 2, 2, 2, 2, 477, 3, 2, 2, 2, 2, 479, 3, 2, 2, 2, 2, 481, 3, 2, 2, 2, 2, 483, 3, 2, 2, 2, 2, 485, 3, 2, 2, 2, 2, 487, 3, 2, 2, 2, 2, 489, 3, 2, 2, 2, 2, 491, 3, 2, 2, 2, 2, 493, 3, 2, 2, 2, 2, 495, 3, 2, 2, 2, 2, 497, 3, 2, 2, 2, 2, 499, 3, 2, 2, 2, 2, 501, 3, 2, 2, 2, 2, 503, 3, 2, 2, 2, 2, 505, 3, 2, 2, 2, 2, 507, 3, 2, 2, 2, 2, 509, 3, 2, 2, 2, 2, 511, 3, 2, 2, 2, 2, 513, 3, 2, 2, 2, 2, 515, 3, 2, 2, 2, 2, 517, 3, 2, 2, 2, 2, 519, 3, 2, 2, 2, 2, 521, 3, 2, 2, 2, 2, 523, 3, 2, 2, 2, 2, 525, 3, 2, 2, 2, 2, 527, 3, 2, 2, 2, 2, 529, 3, 2, 2, 2, 2, 531, 3, 2, 2, 2, 2, 533, 3, 2, 2, 2, 2, 535, 3, 2, 2, 2, 2, 537, 3, 2, 2, 2, 2, 539, 3, 2, 2, 2, 2, 541, 3, 2, 2, 2, 2, 543, 3, 2, 2, 2, 2, 545, 3, 2, 2, 2, 2, 547, 3, 2, 2, 2, 2, 549, 3, 2, 2, 2, 2, 551, 3, 2, 2, 2, 2, 553, 3, 2, 2, 2, 2, 555, 3, 2, 2, 2, 2, 557, 3, 2, 2, 2, 2, 559, 3, 2, 2, 2, 2, 561, 3, 2, 2, 2, 2, 563, 3, 2, 2, 2, 2, 565, 3, 2, 2, 2, 2, 567, 3, 2, 2, 2, 2, 569, 3, 2, 2, 2, 2, 571, 3, 2, 2, 2, 2, 573, 3, 2, 2, 2, 2, 575, 3, 2, 2, 2, 2, 577, 3, 2, 2, 2, 2, 579, 3, 2, 2, 2, 2, 581, 3, 2, 2, 2, 2, 583, 3, 2, 2, 2, 2, 585, 3, 2, 2, 2, 2, 587, 3, 2, 2, 2, 2, 597, 3, 2, 2, 2, 2, 599, 3, 2, 2, 2, 2, 601, 3, 2, 2, 2, 2, 603, 3, 2, 2, 2, 3, 605, 3, 2, 2, 2, 5, 607, 3, 2, 2, 2, 7, 609, 3, 2, 2, 2, 9, 611, 3, 2, 2, 2, 11, 613, 3, 2, 2, 2, 13, 615, 3, 2, 2, 2, 15, 619, 3, 2, 2, 2, 17, 622, 3, 2, 2, 2, 19, 625, 3, 2, 2, 2, 21, 627, 3, 2, 2, 2, 23, 629, 3, 2, 2, 2, 25, 631, 3, 2, 2, 2, 27, 635, 3, 2, 2, 2, 29, 641, 3, 2, 2, 2, 31, 645, 3, 2, 2, 2, 33, 651, 3, 2, 2, 2, 35, 659, 3, 2, 2, 2, 37, 663, 3, 2, 2, 2, 39, 668, 3, 2, 2, 2, 41, 672, 3, 2, 2, 2, 43, 680, 3, 2, 2, 2, 45, 686, 3, 2, 2, 2, 47, 689, 3, 2, 2, 2, 49, 693, 3, 2, 2, 2, 51, 696, 3, 2, 2, 2, 53, 710, 3, 2, 2, 2, 55, 718, 3, 2, 2, 2, 57, 723, 3, 2, 2, 2, 59, 730, 3, 2, 2, 2, 61, 738, 3, 2, 2, 2, 63, 741, 3, 2, 2, 2, 65, 747, 3, 2, 2, 2, 67, 755, 3, 2, 2, 2, 69, 760, 3, 2, 2, 2, 71, 765, 3, 2, 2, 2, 73, 772, 3, 2, 2, 2, 75, 778, 3, 2, 2, 2, 77, 784, 3, 2, 2, 2, 79, 792, 3, 2, 2, 2, 81, 802, 3, 2, 2, 2, 83, 810, 3, 2, 2, 2, 85, 818, 3, 2, 2, 2, 87, 829, 3, 2, 2, 2, 89, 836, 3, 2, 2, 2, 91, 844, 3, 2, 2, 2, 93, 852, 3, 2, 2, 2, 95, 859, 3, 2, 2, 2, 97, 867, 3, 2, 2, 2, 99, 879, 3, 2, 2, 2, 101, 887, 3, 2, 2, 2, 103, 899, 3, 2, 2, 2, 105, 910, 3, 2, 2, 2, 107, 915, 3, 2, 2, 2, 109, 922, 3, 2, 2, 2, 111, 928, 3, 2, 2, 2, 113, 933, 3, 2, 2, 2, 115, 941, 3, 2, 2, 2, 117, 954, 3, 2, 2, 2, 119, 967, 3, 2, 2, 2, 121, 985, 3, 2, 2, 2, 123, 998, 3, 2, 2, 2, 125, 1003, 3, 2, 2, 2, 127, 1028, 3, 2, 2, 2, 129, 1030, 3, 2, 2, 2, 131, 1034, 3, 2, 2, 2, 133, 1047, 3, 2, 2, 2, 135, 1055, 3, 2, 2, 2, 137, 1062, 3, 2, 2, 2, 139, 1072, 3, 2, 2, 2, 141, 1077, 3, 2, 2, 2, 143, 1086, 3, 2, 2, 2, 145, 1090, 3, 2, 2, 2, 147, 1102, 3, 2, 2, 2, 149, 1112, 3, 2, 2, 2, 151, 1121, 3, 2, 2, 2, 153, 1132, 3, 2, 2, 2, 155, 1137, 3, 2, 2, 2, 157, 1142, 3, 2, 2, 2, 159, 1146, 3, 2, 2, 2, 161, 1153, 3, 2, 2, 2, 163, 1161, 3, 2, 2, 2, 165, 1168, 3, 2, 2, 2, 167, 1177, 3, 2, 2, 2, 169, 1184, 3, 2, 2, 2, 171, 1192, 3, 2, 2, 2, 173, 1199, 3, 2, 2, 2, 175, 1208, 3, 2, 2, 2, 177, 1217, 3, 2, 2, 2, 179, 1225, 3, 2, 2, 2, 181, 1231, 3, 2, 2, 2, 183, 1237, 3, 2, 2, 2, 185, 1244, 3, 2, 2, 2, 187, 1251, 3, 2, 2, 2, 189, 1262, 3, 2, 2, 2, 191, 1268, 3, 2, 2, 2, 193, 1278, 3, 2, 2, 2, 195, 1282, 3, 2, 2, 2, 197, 1290, 3, 2, 2, 2, 199, 1297, 3, 2, 2, 2, 201, 1307, 3, 2, 2, 2, 203, 1312, 3, 2, 2, 2, 205, 1317, 3, 2, 2, 2, 207, 1326, 3, 2, 2, 2, 209, 1336, 3, 2, 2, 2, 211, 1343, 3, 2, 2, 2, 213, 1349, 3, 2, 2, 2, 215, 1355, 3, 2, 2, 2, 217, 1364, 3, 2, 2, 2, 219, 1371, 3, 2, 2, 2, 221, 1376, 3, 2, 2, 2, 223, 1379, 3, 2, 2, 2, 225, 1386, 3, 2, 2, 2, 227, 1393, 3, 2, 2, 2, 229, 1396, 3, 2, 2, 2, 231, 1402, 3, 2, 2, 2, 233, 1410, 3, 2, 2, 2, 235, 1416, 3, 2, 2, 2, 237, 1423, 3, 2, 2, 2, 239, 1435, 3, 2, 2, 2, 241, 1442, 3, 2, 2, 2, 243, 1452, 3, 2, 2, 2, 245, 1461, 3, 2, 2, 2, 247, 1466, 3, 2, 2, 2, 249, 1469, 3, 2, 2, 2, 251, 1475, 3, 2, 2, 2, 253, 1480, 3, 2, 2, 2, 255, 1485, 3, 2, 2, 2, 257, 1490, 3, 2, 2, 2, 259, 1498, 3, 2, 2, 2, 261, 1503, 3, 2, 2, 2, 263, 1511, 3, 2, 2, 2, 265, 1516, 3, 2, 2, 2, 267, 1521, 3, 2, 2, 2, 269, 1527, 3, 2, 2, 2, 271, 1533, 3, 2, 2, 2, 273, 1538, 3, 2, 2, 2, 275, 1543, 3, 2, 2, 2, 277, 1549, 3, 2, 2, 2, 279, 1558, 3, 2, 2, 2, 281, 1563, 3, 2, 2, 2, 283, 1569, 3, 2, 2, 2, 285, 1577, 3, 2, 2, 2, 287, 1583, 3, 2, 2, 2, 289, 1587, 3, 2, 2, 2, 291, 1595, 3, 2, 2, 2, 293, 1601, 3, 2, 2, 2, 295, 1608, 3, 2, 2, 2, 297, 1614, 3, 2, 2, 2, 299, 1619, 3, 2, 2, 2, 301, 1629, 3, 2, 2, 2, 303, 1640, 3, 2, 2, 2, 305, 1648, 3, 2, 2, 2, 307, 1655, 3, 2, 2, 2, 309, 1657, 3, 2, 2, 2, 311, 1662, 3, 2, 2, 2, 313, 1668, 3, 2, 2, 2, 315, 1671, 3, 2, 2, 2, 317, 1674, 3, 2, 2, 2, 319, 1679, 3, 2, 2, 2, 321, 1686, 3, 2, 2, 2, 323, 1694, 3, 2, 2, 2, 325, 1697, 3, 2, 2, 2, 327, 1703, 3, 2, 2, 2, 329, 1707, 3, 2, 2, 2, 331, 1713, 3, 2, 2, 2, 333, 1726, 3, 2, 2, 2, 335, 1731, 3, 2, 2, 2, 337, 1740, 3, 2, 2, 2, 339, 1748, 3, 2, 2, 2, 341, 1758, 3, 2, 2, 2, 343, 1768, 3, 2, 2, 2, 345, 1780, 3, 2, 2, 2, 347, 1791, 3, 2, 2, 2, 349, 1799, 3, 2, 2, 2, 351, 1805, 3, 2, 2, 2, 353, 1813, 3, 2, 2, 2, 355, 1822, 3, 2, 2, 2, 357, 1832, 3, 2, 2, 2, 359, 1840, 3, 2, 2, 2, 361, 1851, 3, 2, 2, 2, 363, 1862, 3, 2, 2, 2, 365, 1868, 3, 2, 2, 2, 367, 1874, 3, 2, 2, 2, 369, 1880, 3, 2, 2, 2, 371, 1893, 3, 2, 2, 2, 373, 1906, 3, 2, 2, 2, 375, 1914, 3, 2, 2, 2, 377, 1921, 3, 2, 2, 2, 379, 1932, 3, 2, 2, 2, 381, 1940, 3, 2, 2, 2, 383, 1947, 3, 2, 2, 2, 385, 1954, 3, 2, 2, 2, 387, 1962, 3, 2, 2, 2, 389, 1968, 3, 2, 2, 2, 391, 1977, 3, 2, 2, 2, 393, 1984, 3, 2, 2, 2, 395, 2001, 3, 2, 2, 2, 397, 2003, 3, 2, 2, 2, 399, 2008, 3, 2, 2, 2, 401, 2014, 3, 2, 2, 2, 403, 2023, 3, 2, 2, 2, 405, 2030, 3, 2, 2, 2, 407, 2034, 3, 2, 2, 2, 409, 2039, 3, 2, 2, 2, 411, 2046, 3, 2, 2, 2, 413, 2053, 3, 2, 2, 2, 415, 2060, 3, 2, 2, 2, 417, 2065, 3, 2, 2, 2, 419, 2075, 3, 2, 2, 2, 421, 2081, 3, 2, 2, 2, 423, 2097, 3, 2, 2, 2, 425, 2110, 3, 2, 2, 2, 427, 2114, 3, 2, 2, 2, 429, 2120, 3, 2, 2, 2, 431, 2125, 3, 2, 2, 2, 433, 2130, 3, 2, 2, 2, 435, 2137, 3, 2, 2, 2, 437, 2142, 3, 2, 2, 2, 439, 2147, 3, 2, 2, 2, 441, 2154, 3, 2, 2, 2, 443, 2160, 3, 2, 2, 2, 445, 2171, 3, 2, 2, 2, 447, 2178, 3, 2, 2, 2, 449, 2187, 3, 2, 2, 2, 451, 2194, 3, 2, 2, 2, 453, 2201, 3, 2, 2, 2, 455, 2211, 3, 2, 2, 2, 457, 2217, 3, 2, 2, 2, 459, 2224, 3, 2, 2, 2, 461, 2236, 3, 2, 2, 2, 463, 2263, 3, 2, 2, 2, 465, 2265, 3, 2, 2, 2, 467, 2276, 3, 2, 2, 2, 469, 2281, 3, 2, 2, 2, 471, 2284, 3, 2, 2, 2, 473, 2290, 3, 2, 2, 2, 475, 2299, 3, 2, 2, 2, 477, 2311, 3, 2, 2, 2, 479, 2324, 3, 2, 2, 2, 481, 2334, 3, 2, 2, 2, 483, 2339, 3, 2, 2, 2, 485, 2344, 3, 2, 2, 2, 487, 2353, 3, 2, 2, 2, 489, 2358, 3, 2, 2, 2, 491, 2368, 3, 2, 2, 2, 493, 2378, 3, 2, 2, 2, 495, 2386, 3, 2, 2, 2, 497, 2392, 3, 2, 2, 2, 499, 2399, 3, 2, 2, 2, 501, 2407, 3, 2, 2, 2, 503, 2414, 3, 2, 2, 2, 505, 2420, 3, 2, 2, 2, 507, 2427, 3, 2, 2, 2, 509, 2431, 3, 2, 2, 2, 511, 2436, 3, 2, 2, 2, 513, 2442, 3, 2, 2, 2, 515, 2449, 3, 2, 2, 2, 517, 2454, 3, 2, 2, 2, 519, 2460, 3, 2, 2, 2, 521, 2465, 3, 2, 2, 2, 523, 2471, 3, 2, 2, 2, 525, 2478, 3, 2, 2, 2, 527, 2483, 3, 2, 2, 2, 529, 2491, 3, 2, 2, 2, 531, 2493, 3, 2, 2, 2, 533, 2497, 3, 2, 2, 2, 535, 2500, 3, 2, 2, 2, 537, 2503, 3, 2, 2, 2, 539, 2509, 3, 2, 2, 2, 541, 2511, 3, 2, 2, 2, 543, 2517, 3, 2, 2, 2, 545, 2519, 3, 2, 2, 2, 547, 2521, 3, 2, 2, 2, 549, 2523, 3, 2, 2, 2, 551, 2525, 3, 2, 2, 2, 553, 2527, 3, 2, 2, 2, 555, 2529, 3, 2, 2, 2, 557, 2533, 3, 2, 2, 2, 559, 2535, 3, 2, 2, 2, 561, 2537, 3, 2, 2, 2, 563, 2539, 3, 2, 2, 2, 565, 2542, 3, 2, 2, 2, 567, 2564, 3, 2, 2, 2, 569, 2567, 3, 2, 2, 2, 571, 2574, 3, 2, 2, 2, 573, 2581, 3, 2, 2, 2, 575, 2588, 3, 2, 2, 2, 577, 2603, 3, 2, 2, 2, 579, 2605, 3, 2, 2, 2, 581, 2625, 3, 2, 2, 2, 583, 2647, 3, 2, 2, 2, 585, 2652, 3, 2, 2, 2, 587, 2656, 3, 2, 2, 2, 589, 2685, 3, 2, 2, 2, 591, 2687, 3, 2, 2, 2, 593, 2696, 3, 2, 2, 2, 595, 2698, 3, 2, 2, 2, 597, 2700, 3, 2, 2, 2, 599, 2717, 3, 2, 2, 2, 601, 2734, 3, 2, 2, 2, 603, 2740, 3, 2, 2, 2, 605, 606, 7, 61, 2, 2, 606, 4, 3, 2, 2, 2, 607, 608, 7, 42, 2, 2, 608, 6, 3, 2, 2, 2, 609, 610, 7, 43, 2, 2, 610, 8, 3, 2, 2, 2, 611, 612, 7, 46, 2, 2, 612, 10, 3, 2, 2, 2, 613, 614, 7, 48, 2, 2, 614, 12, 3, 2, 2, 2, 615, 616, 7, 49, 2, 2, 616, 617, 7, 44, 2, 2, 617, 618, 7, 45, 2, 2, 618, 14, 3, 2, 2, 2, 619, 620, 7, 44, 2, 2, 620, 621, 7, 49, 2, 2, 621, 16, 3, 2, 2, 2, 622, 623, 7, 47, 2, 2, 623, 624, 7, 64, 2, 2, 624, 18, 3, 2, 2, 2, 625, 626, 7, 93, 2, 2, 626, 20, 3, 2, 2, 2, 627, 628, 7, 95, 2, 2, 628, 22, 3, 2, 2, 2, 629, 630, 7, 60, 2, 2, 630, 24, 3, 2, 2, 2, 631, 632, 7, 67, 2, 2, 632, 633, 7, 70, 2, 2, 633, 634, 7, 70, 2, 2, 634, 26, 3, 2, 2, 2, 635, 636, 7, 67, 2, 2, 636, 637, 7, 72, 2, 2, 637, 638, 7, 86, 2, 2, 638, 639, 7, 71, 2, 2, 639, 640, 7, 84, 2, 2, 640, 28, 3, 2, 2, 2, 641, 642, 7, 67, 2, 2, 642, 643, 7, 78, 2, 2, 643, 644, 7, 78, 2, 2, 644, 30, 3, 2, 2, 2, 645, 646, 7, 67, 2, 2, 646, 647, 7, 78, 2, 2, 647, 648, 7, 86, 2, 2, 648, 649, 7, 71, 2, 2, 649, 650, 7, 84, 2, 2, 650, 32, 3, 2, 2, 2, 651, 652, 7, 67, 2, 2, 652, 653, 7, 80, 2, 2, 653, 654, 7, 67, 2, 2, 654, 655, 7, 78, 2, 2, 655, 656, 7, 91, 2, 2, 656, 657, 7, 92, 2, 2, 657, 658, 7, 71, 2, 2, 658, 34, 3, 2, 2, 2, 659, 660, 7, 67, 2, 2, 660, 661, 7, 80, 2, 2, 661, 662, 7, 70, 2, 2, 662, 36, 3, 2, 2, 2, 663, 664, 7, 67, 2, 2, 664, 665, 7, 80, 2, 2, 665, 666, 7, 86, 2, 2, 666, 667, 7, 75, 2, 2, 667, 38, 3, 2, 2, 2, 668, 669, 7, 67, 2, 2, 669, 670, 7, 80, 2, 2, 670, 671, 7, 91, 2, 2, 671, 40, 3, 2, 2, 2, 672, 673, 7, 67, 2, 2, 673, 674, 7, 84, 2, 2, 674, 675, 7, 69, 2, 2, 675, 676, 7, 74, 2, 2, 676, 677, 7, 75, 2, 2, 677, 678, 7, 88, 2, 2, 678, 679, 7, 71, 2, 2, 679, 42, 3, 2, 2, 2, 680, 681, 7, 67, 2, 2, 681, 682, 7, 84, 2, 2, 682, 683, 7, 84, 2, 2, 683, 684, 7, 67, 2, 2, 684, 685, 7, 91, 2, 2, 685, 44, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 85, 2, 2, 688, 46, 3, 2, 2, 2, 689, 690, 7, 67, 2, 2, 690, 691, 7, 85, 2, 2, 691, 692, 7, 69, 2, 2, 692, 48, 3, 2, 2, 2, 693, 694, 7, 67, 2, 2, 694, 695, 7, 86, 2, 2, 695, 50, 3, 2, 2, 2, 696, 697, 7, 67, 2, 2, 697, 698, 7, 87, 2, 2, 698, 699, 7, 86, 2, 2, 699, 700, 7, 74, 2, 2, 700, 701, 7, 81, 2, 2, 701, 702, 7, 84, 2, 2, 702, 703, 7, 75, 2, 2, 703, 704, 7, 92, 2, 2, 704, 705, 7, 67, 2, 2, 705, 706, 7, 86, 2, 2, 706, 707, 7, 75, 2, 2, 707, 708, 7, 81, 2, 2, 708, 709, 7, 80, 2, 2, 709, 52, 3, 2, 2, 2, 710, 711, 7, 68, 2, 2, 711, 712, 7, 71, 2, 2, 712, 713, 7, 86, 2, 2, 713, 714, 7, 89, 2, 2, 714, 715, 7, 71, 2, 2, 715, 716, 7, 71, 2, 2, 716, 717, 7, 80, 2, 2, 717, 54, 3, 2, 2, 2, 718, 719, 7, 68, 2, 2, 719, 720, 7, 81, 2, 2, 720, 721, 7, 86, 2, 2, 721, 722, 7, 74, 2, 2, 722, 56, 3, 2, 2, 2, 723, 724, 7, 68, 2, 2, 724, 725, 7, 87, 2, 2, 725, 726, 7, 69, 2, 2, 726, 727, 7, 77, 2, 2, 727, 728, 7, 71, 2, 2, 728, 729, 7, 86, 2, 2, 729, 58, 3, 2, 2, 2, 730, 731, 7, 68, 2, 2, 731, 732, 7, 87, 2, 2, 732, 733, 7, 69, 2, 2, 733, 734, 7, 77, 2, 2, 734, 735, 7, 71, 2, 2, 735, 736, 7, 86, 2, 2, 736, 737, 7, 85, 2, 2, 737, 60, 3, 2, 2, 2, 738, 739, 7, 68, 2, 2, 739, 740, 7, 91, 2, 2, 740, 62, 3, 2, 2, 2, 741, 742, 7, 69, 2, 2, 742, 743, 7, 67, 2, 2, 743, 744, 7, 69, 2, 2, 744, 745, 7, 74, 2, 2, 745, 746, 7, 71, 2, 2, 746, 64, 3, 2, 2, 2, 747, 748, 7, 69, 2, 2, 748, 749, 7, 67, 2, 2, 749, 750, 7, 85, 2, 2, 750, 751, 7, 69, 2, 2, 751, 752, 7, 67, 2, 2, 752, 753, 7, 70, 2, 2, 753, 754, 7, 71, 2, 2, 754, 66, 3, 2, 2, 2, 755, 756, 7, 69, 2, 2, 756, 757, 7, 67, 2, 2, 757, 758, 7, 85, 2, 2, 758, 759, 7, 71, 2, 2, 759, 68, 3, 2, 2, 2, 760, 761, 7, 69, 2, 2, 761, 762, 7, 67, 2, 2, 762, 763, 7, 85, 2, 2, 763, 764, 7, 86, 2, 2, 764, 70, 3, 2, 2, 2, 765, 766, 7, 69, 2, 2, 766, 767, 7, 74, 2, 2, 767, 768, 7, 67, 2, 2, 768, 769, 7, 80, 2, 2, 769, 770, 7, 73, 2, 2, 770, 771, 7, 71, 2, 2, 771, 72, 3, 2, 2, 2, 772, 773, 7, 69, 2, 2, 773, 774, 7, 74, 2, 2, 774, 775, 7, 71, 2, 2, 775, 776, 7, 69, 2, 2, 776, 777, 7, 77, 2, 2, 777, 74, 3, 2, 2, 2, 778, 779, 7, 69, 2, 2, 779, 780, 7, 78, 2, 2, 780, 781, 7, 71, 2, 2, 781, 782, 7, 67, 2, 2, 782, 783, 7, 84, 2, 2, 783, 76, 3, 2, 2, 2, 784, 785, 7, 69, 2, 2, 785, 786, 7, 78, 2, 2, 786, 787, 7, 87, 2, 2, 787, 788, 7, 85, 2, 2, 788, 789, 7, 86, 2, 2, 789, 790, 7, 71, 2, 2, 790, 791, 7, 84, 2, 2, 791, 78, 3, 2, 2, 2, 792, 793, 7, 69, 2, 2, 793, 794, 7, 78, 2, 2, 794, 795, 7, 87, 2, 2, 795, 796, 7, 85, 2, 2, 796, 797, 7, 86, 2, 2, 797, 798, 7, 71, 2, 2, 798, 799, 7, 84, 2, 2, 799, 800, 7, 71, 2, 2, 800, 801, 7, 70, 2, 2, 801, 80, 3, 2, 2, 2, 802, 803, 7, 69, 2, 2, 803, 804, 7, 81, 2, 2, 804, 805, 7, 70, 2, 2, 805, 806, 7, 71, 2, 2, 806, 807, 7, 73, 2, 2, 807, 808, 7, 71, 2, 2, 808, 809, 7, 80, 2, 2, 809, 82, 3, 2, 2, 2, 810, 811, 7, 69, 2, 2, 811, 812, 7, 81, 2, 2, 812, 813, 7, 78, 2, 2, 813, 814, 7, 78, 2, 2, 814, 815, 7, 67, 2, 2, 815, 816, 7, 86, 2, 2, 816, 817, 7, 71, 2, 2, 817, 84, 3, 2, 2, 2, 818, 819, 7, 69, 2, 2, 819, 820, 7, 81, 2, 2, 820, 821, 7, 78, 2, 2, 821, 822, 7, 78, 2, 2, 822, 823, 7, 71, 2, 2, 823, 824, 7, 69, 2, 2, 824, 825, 7, 86, 2, 2, 825, 826, 7, 75, 2, 2, 826, 827, 7, 81, 2, 2, 827, 828, 7, 80, 2, 2, 828, 86, 3, 2, 2, 2, 829, 830, 7, 69, 2, 2, 830, 831, 7, 81, 2, 2, 831, 832, 7, 78, 2, 2, 832, 833, 7, 87, 2, 2, 833, 834, 7, 79, 2, 2, 834, 835, 7, 80, 2, 2, 835, 88, 3, 2, 2, 2, 836, 837, 7, 69, 2, 2, 837, 838, 7, 81, 2, 2, 838, 839, 7, 78, 2, 2, 839, 840, 7, 87, 2, 2, 840, 841, 7, 79, 2, 2, 841, 842, 7, 80, 2, 2, 842, 843, 7, 85, 2, 2, 843, 90, 3, 2, 2, 2, 844, 845, 7, 69, 2, 2, 845, 846, 7, 81, 2, 2, 846, 847, 7, 79, 2, 2, 847, 848, 7, 79, 2, 2, 848, 849, 7, 71, 2, 2, 849, 850, 7, 80, 2, 2, 850, 851, 7, 86, 2, 2, 851, 92, 3, 2, 2, 2, 852, 853, 7, 69, 2, 2, 853, 854, 7, 81, 2, 2, 854, 855, 7, 79, 2, 2, 855, 856, 7, 79, 2, 2, 856, 857, 7, 75, 2, 2, 857, 858, 7, 86, 2, 2, 858, 94, 3, 2, 2, 2, 859, 860, 7, 69, 2, 2, 860, 861, 7, 81, 2, 2, 861, 862, 7, 79, 2, 2, 862, 863, 7, 82, 2, 2, 863, 864, 7, 67, 2, 2, 864, 865, 7, 69, 2, 2, 865, 866, 7, 86, 2, 2, 866, 96, 3, 2, 2, 2, 867, 868, 7, 69, 2, 2, 868, 869, 7, 81, 2, 2, 869, 870, 7, 79, 2, 2, 870, 871, 7, 82, 2, 2, 871, 872, 7, 67, 2, 2, 872, 873, 7, 69, 2, 2, 873, 874, 7, 86, 2, 2, 874, 875, 7, 75, 2, 2, 875, 876, 7, 81, 2, 2, 876, 877, 7, 80, 2, 2, 877, 878, 7, 85, 2, 2, 878, 98, 3, 2, 2, 2, 879, 880, 7, 69, 2, 2, 880, 881, 7, 81, 2, 2, 881, 882, 7, 79, 2, 2, 882, 883, 7, 82, 2, 2, 883, 884, 7, 87, 2, 2, 884, 885, 7, 86, 2, 2, 885, 886, 7, 71, 2, 2, 886, 100, 3, 2, 2, 2, 887, 888, 7, 69, 2, 2, 888, 889, 7, 81, 2, 2, 889, 890, 7, 80, 2, 2, 890, 891, 7, 69, 2, 2, 891, 892, 7, 67, 2, 2, 892, 893, 7, 86, 2, 2, 893, 894, 7, 71, 2, 2, 894, 895, 7, 80, 2, 2, 895, 896, 7, 67, 2, 2, 896, 897, 7, 86, 2, 2, 897, 898, 7, 71, 2, 2, 898, 102, 3, 2, 2, 2, 899, 900, 7, 69, 2, 2, 900, 901, 7, 81, 2, 2, 901, 902, 7, 80, 2, 2, 902, 903, 7, 85, 2, 2, 903, 904, 7, 86, 2, 2, 904, 905, 7, 84, 2, 2, 905, 906, 7, 67, 2, 2, 906, 907, 7, 75, 2, 2, 907, 908, 7, 80, 2, 2, 908, 909, 7, 86, 2, 2, 909, 104, 3, 2, 2, 2, 910, 911, 7, 69, 2, 2, 911, 912, 7, 81, 2, 2, 912, 913, 7, 85, 2, 2, 913, 914, 7, 86, 2, 2, 914, 106, 3, 2, 2, 2, 915, 916, 7, 69, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 71, 2, 2, 918, 919, 7, 67, 2, 2, 919, 920, 7, 86, 2, 2, 920, 921, 7, 71, 2, 2, 921, 108, 3, 2, 2, 2, 922, 923, 7, 69, 2, 2, 923, 924, 7, 84, 2, 2, 924, 925, 7, 81, 2, 2, 925, 926, 7, 85, 2, 2, 926, 927, 7, 85, 2, 2, 927, 110, 3, 2, 2, 2, 928, 929, 7, 69, 2, 2, 929, 930, 7, 87, 2, 2, 930, 931, 7, 68, 2, 2, 931, 932, 7, 71, 2, 2, 932, 112, 3, 2, 2, 2, 933, 934, 7, 69, 2, 2, 934, 935, 7, 87, 2, 2, 935, 936, 7, 84, 2, 2, 936, 937, 7, 84, 2, 2, 937, 938, 7, 71, 2, 2, 938, 939, 7, 80, 2, 2, 939, 940, 7, 86, 2, 2, 940, 114, 3, 2, 2, 2, 941, 942, 7, 69, 2, 2, 942, 943, 7, 87, 2, 2, 943, 944, 7, 84, 2, 2, 944, 945, 7, 84, 2, 2, 945, 946, 7, 71, 2, 2, 946, 947, 7, 80, 2, 2, 947, 948, 7, 86, 2, 2, 948, 949, 7, 97, 2, 2, 949, 950, 7, 70, 2, 2, 950, 951, 7, 67, 2, 2, 951, 952, 7, 86, 2, 2, 952, 953, 7, 71, 2, 2, 953, 116, 3, 2, 2, 2, 954, 955, 7, 69, 2, 2, 955, 956, 7, 87, 2, 2, 956, 957, 7, 84, 2, 2, 957, 958, 7, 84, 2, 2, 958, 959, 7, 71, 2, 2, 959, 960, 7, 80, 2, 2, 960, 961, 7, 86, 2, 2, 961, 962, 7, 97, 2, 2, 962, 963, 7, 86, 2, 2, 963, 964, 7, 75, 2, 2, 964, 965, 7, 79, 2, 2, 965, 966, 7, 71, 2, 2, 966, 118, 3, 2, 2, 2, 967, 968, 7, 69, 2, 2, 968, 969, 7, 87, 2, 2, 969, 970, 7, 84, 2, 2, 970, 971, 7, 84, 2, 2, 971, 972, 7, 71, 2, 2, 972, 973, 7, 80, 2, 2, 973, 974, 7, 86, 2, 2, 974, 975, 7, 97, 2, 2, 975, 976, 7, 86, 2, 2, 976, 977, 7, 75, 2, 2, 977, 978, 7, 79, 2, 2, 978, 979, 7, 71, 2, 2, 979, 980, 7, 85, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 67, 2, 2, 982, 983, 7, 79, 2, 2, 983, 984, 7, 82, 2, 2, 984, 120, 3, 2, 2, 2, 985, 986, 7, 69, 2, 2, 986, 987, 7, 87, 2, 2, 987, 988, 7, 84, 2, 2, 988, 989, 7, 84, 2, 2, 989, 990, 7, 71, 2, 2, 990, 991, 7, 80, 2, 2, 991, 992, 7, 86, 2, 2, 992, 993, 7, 97, 2, 2, 993, 994, 7, 87, 2, 2, 994, 995, 7, 85, 2, 2, 995, 996, 7, 71, 2, 2, 996, 997, 7, 84, 2, 2, 997, 122, 3, 2, 2, 2, 998, 999, 7, 70, 2, 2, 999, 1000, 7, 67, 2, 2, 1000, 1001, 7, 86, 2, 2, 1001, 1002, 7, 67, 2, 2, 1002, 124, 3, 2, 2, 2, 1003, 1004, 7, 70, 2, 2, 1004, 1005, 7, 67, 2, 2, 1005, 1006, 7, 86, 2, 2, 1006, 1007, 7, 67, 2, 2, 1007, 1008, 7, 68, 2, 2, 1008, 1009, 7, 67, 2, 2, 1009, 1010, 7, 85, 2, 2, 1010, 1011, 7, 71, 2, 2, 1011, 126, 3, 2, 2, 2, 1012, 1013, 7, 70, 2, 2, 1013, 1014, 7, 67, 2, 2, 1014, 1015, 7, 86, 2, 2, 1015, 1016, 7, 67, 2, 2, 1016, 1017, 7, 68, 2, 2, 1017, 1018, 7, 67, 2, 2, 1018, 1019, 7, 85, 2, 2, 1019, 1020, 7, 71, 2, 2, 1020, 1029, 7, 85, 2, 2, 1021, 1022, 7, 85, 2, 2, 1022, 1023, 7, 69, 2, 2, 1023, 1024, 7, 74, 2, 2, 1024, 1025, 7, 71, 2, 2, 1025, 1026, 7, 79, 2, 2, 1026, 1027, 7, 67, 2, 2, 1027, 1029, 7, 85, 2, 2, 1028, 1012, 3, 2, 2, 2, 1028, 1021, 3, 2, 2, 2, 1029, 128, 3, 2, 2, 2, 1030, 1031, 7, 70, 2, 2, 1031, 1032, 7, 67, 2, 2, 1032, 1033, 7, 91, 2, 2, 1033, 130, 3, 2, 2, 2, 1034, 1035, 7, 70, 2, 2, 1035, 1036, 7, 68, 2, 2, 1036, 1037, 7, 82, 2, 2, 1037, 1038, 7, 84, 2, 2, 1038, 1039, 7, 81, 2, 2, 1039, 1040, 7, 82, 2, 2, 1040, 1041, 7, 71, 2, 2, 1041, 1042, 7, 84, 2, 2, 1042, 1043, 7, 86, 2, 2, 1043, 1044, 7, 75, 2, 2, 1044, 1045, 7, 71, 2, 2, 1045, 1046, 7, 85, 2, 2, 1046, 132, 3, 2, 2, 2, 1047, 1048, 7, 70, 2, 2, 1048, 1049, 7, 71, 2, 2, 1049, 1050, 7, 72, 2, 2, 1050, 1051, 7, 75, 2, 2, 1051, 1052, 7, 80, 2, 2, 1052, 1053, 7, 71, 2, 2, 1053, 1054, 7, 70, 2, 2, 1054, 134, 3, 2, 2, 2, 1055, 1056, 7, 70, 2, 2, 1056, 1057, 7, 71, 2, 2, 1057, 1058, 7, 78, 2, 2, 1058, 1059, 7, 71, 2, 2, 1059, 1060, 7, 86, 2, 2, 1060, 1061, 7, 71, 2, 2, 1061, 136, 3, 2, 2, 2, 1062, 1063, 7, 70, 2, 2, 1063, 1064, 7, 71, 2, 2, 1064, 1065, 7, 78, 2, 2, 1065, 1066, 7, 75, 2, 2, 1066, 1067, 7, 79, 2, 2, 1067, 1068, 7, 75, 2, 2, 1068, 1069, 7, 86, 2, 2, 1069, 1070, 7, 71, 2, 2, 1070, 1071, 7, 70, 2, 2, 1071, 138, 3, 2, 2, 2, 1072, 1073, 7, 70, 2, 2, 1073, 1074, 7, 71, 2, 2, 1074, 1075, 7, 85, 2, 2, 1075, 1076, 7, 69, 2, 2, 1076, 140, 3, 2, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1079, 7, 71, 2, 2, 1079, 1080, 7, 85, 2, 2, 1080, 1081, 7, 69, 2, 2, 1081, 1082, 7, 84, 2, 2, 1082, 1083, 7, 75, 2, 2, 1083, 1084, 7, 68, 2, 2, 1084, 1085, 7, 71, 2, 2, 1085, 142, 3, 2, 2, 2, 1086, 1087, 7, 70, 2, 2, 1087, 1088, 7, 72, 2, 2, 1088, 1089, 7, 85, 2, 2, 1089, 144, 3, 2, 2, 2, 1090, 1091, 7, 70, 2, 2, 1091, 1092, 7, 75, 2, 2, 1092, 1093, 7, 84, 2, 2, 1093, 1094, 7, 71, 2, 2, 1094, 1095, 7, 69, 2, 2, 1095, 1096, 7, 86, 2, 2, 1096, 1097, 7, 81, 2, 2, 1097, 1098, 7, 84, 2, 2, 1098, 1099, 7, 75, 2, 2, 1099, 1100, 7, 71, 2, 2, 1100, 1101, 7, 85, 2, 2, 1101, 146, 3, 2, 2, 2, 1102, 1103, 7, 70, 2, 2, 1103, 1104, 7, 75, 2, 2, 1104, 1105, 7, 84, 2, 2, 1105, 1106, 7, 71, 2, 2, 1106, 1107, 7, 69, 2, 2, 1107, 1108, 7, 86, 2, 2, 1108, 1109, 7, 81, 2, 2, 1109, 1110, 7, 84, 2, 2, 1110, 1111, 7, 91, 2, 2, 1111, 148, 3, 2, 2, 2, 1112, 1113, 7, 70, 2, 2, 1113, 1114, 7, 75, 2, 2, 1114, 1115, 7, 85, 2, 2, 1115, 1116, 7, 86, 2, 2, 1116, 1117, 7, 75, 2, 2, 1117, 1118, 7, 80, 2, 2, 1118, 1119, 7, 69, 2, 2, 1119, 1120, 7, 86, 2, 2, 1120, 150, 3, 2, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1123, 7, 75, 2, 2, 1123, 1124, 7, 85, 2, 2, 1124, 1125, 7, 86, 2, 2, 1125, 1126, 7, 84, 2, 2, 1126, 1127, 7, 75, 2, 2, 1127, 1128, 7, 68, 2, 2, 1128, 1129, 7, 87, 2, 2, 1129, 1130, 7, 86, 2, 2, 1130, 1131, 7, 71, 2, 2, 1131, 152, 3, 2, 2, 2, 1132, 1133, 7, 70, 2, 2, 1133, 1134, 7, 84, 2, 2, 1134, 1135, 7, 81, 2, 2, 1135, 1136, 7, 82, 2, 2, 1136, 154, 3, 2, 2, 2, 1137, 1138, 7, 71, 2, 2, 1138, 1139, 7, 78, 2, 2, 1139, 1140, 7, 85, 2, 2, 1140, 1141, 7, 71, 2, 2, 1141, 156, 3, 2, 2, 2, 1142, 1143, 7, 71, 2, 2, 1143, 1144, 7, 80, 2, 2, 1144, 1145, 7, 70, 2, 2, 1145, 158, 3, 2, 2, 2, 1146, 1147, 7, 71, 2, 2, 1147, 1148, 7, 85, 2, 2, 1148, 1149, 7, 69, 2, 2, 1149, 1150, 7, 67, 2, 2, 1150, 1151, 7, 82, 2, 2, 1151, 1152, 7, 71, 2, 2, 1152, 160, 3, 2, 2, 2, 1153, 1154, 7, 71, 2, 2, 1154, 1155, 7, 85, 2, 2, 1155, 1156, 7, 69, 2, 2, 1156, 1157, 7, 67, 2, 2, 1157, 1158, 7, 82, 2, 2, 1158, 1159, 7, 71, 2, 2, 1159, 1160, 7, 70, 2, 2, 1160, 162, 3, 2, 2, 2, 1161, 1162, 7, 71, 2, 2, 1162, 1163, 7, 90, 2, 2, 1163, 1164, 7, 69, 2, 2, 1164, 1165, 7, 71, 2, 2, 1165, 1166, 7, 82, 2, 2, 1166, 1167, 7, 86, 2, 2, 1167, 164, 3, 2, 2, 2, 1168, 1169, 7, 71, 2, 2, 1169, 1170, 7, 90, 2, 2, 1170, 1171, 7, 69, 2, 2, 1171, 1172, 7, 74, 2, 2, 1172, 1173, 7, 67, 2, 2, 1173, 1174, 7, 80, 2, 2, 1174, 1175, 7, 73, 2, 2, 1175, 1176, 7, 71, 2, 2, 1176, 166, 3, 2, 2, 2, 1177, 1178, 7, 71, 2, 2, 1178, 1179, 7, 90, 2, 2, 1179, 1180, 7, 75, 2, 2, 1180, 1181, 7, 85, 2, 2, 1181, 1182, 7, 86, 2, 2, 1182, 1183, 7, 85, 2, 2, 1183, 168, 3, 2, 2, 2, 1184, 1185, 7, 71, 2, 2, 1185, 1186, 7, 90, 2, 2, 1186, 1187, 7, 82, 2, 2, 1187, 1188, 7, 78, 2, 2, 1188, 1189, 7, 67, 2, 2, 1189, 1190, 7, 75, 2, 2, 1190, 1191, 7, 80, 2, 2, 1191, 170, 3, 2, 2, 2, 1192, 1193, 7, 71, 2, 2, 1193, 1194, 7, 90, 2, 2, 1194, 1195, 7, 82, 2, 2, 1195, 1196, 7, 81, 2, 2, 1196, 1197, 7, 84, 2, 2, 1197, 1198, 7, 86, 2, 2, 1198, 172, 3, 2, 2, 2, 1199, 1200, 7, 71, 2, 2, 1200, 1201, 7, 90, 2, 2, 1201, 1202, 7, 86, 2, 2, 1202, 1203, 7, 71, 2, 2, 1203, 1204, 7, 80, 2, 2, 1204, 1205, 7, 70, 2, 2, 1205, 1206, 7, 71, 2, 2, 1206, 1207, 7, 70, 2, 2, 1207, 174, 3, 2, 2, 2, 1208, 1209, 7, 71, 2, 2, 1209, 1210, 7, 90, 2, 2, 1210, 1211, 7, 86, 2, 2, 1211, 1212, 7, 71, 2, 2, 1212, 1213, 7, 84, 2, 2, 1213, 1214, 7, 80, 2, 2, 1214, 1215, 7, 67, 2, 2, 1215, 1216, 7, 78, 2, 2, 1216, 176, 3, 2, 2, 2, 1217, 1218, 7, 71, 2, 2, 1218, 1219, 7, 90, 2, 2, 1219, 1220, 7, 86, 2, 2, 1220, 1221, 7, 84, 2, 2, 1221, 1222, 7, 67, 2, 2, 1222, 1223, 7, 69, 2, 2, 1223, 1224, 7, 86, 2, 2, 1224, 178, 3, 2, 2, 2, 1225, 1226, 7, 72, 2, 2, 1226, 1227, 7, 67, 2, 2, 1227, 1228, 7, 78, 2, 2, 1228, 1229, 7, 85, 2, 2, 1229, 1230, 7, 71, 2, 2, 1230, 180, 3, 2, 2, 2, 1231, 1232, 7, 72, 2, 2, 1232, 1233, 7, 71, 2, 2, 1233, 1234, 7, 86, 2, 2, 1234, 1235, 7, 69, 2, 2, 1235, 1236, 7, 74, 2, 2, 1236, 182, 3, 2, 2, 2, 1237, 1238, 7, 72, 2, 2, 1238, 1239, 7, 75, 2, 2, 1239, 1240, 7, 71, 2, 2, 1240, 1241, 7, 78, 2, 2, 1241, 1242, 7, 70, 2, 2, 1242, 1243, 7, 85, 2, 2, 1243, 184, 3, 2, 2, 2, 1244, 1245, 7, 72, 2, 2, 1245, 1246, 7, 75, 2, 2, 1246, 1247, 7, 78, 2, 2, 1247, 1248, 7, 86, 2, 2, 1248, 1249, 7, 71, 2, 2, 1249, 1250, 7, 84, 2, 2, 1250, 186, 3, 2, 2, 2, 1251, 1252, 7, 72, 2, 2, 1252, 1253, 7, 75, 2, 2, 1253, 1254, 7, 78, 2, 2, 1254, 1255, 7, 71, 2, 2, 1255, 1256, 7, 72, 2, 2, 1256, 1257, 7, 81, 2, 2, 1257, 1258, 7, 84, 2, 2, 1258, 1259, 7, 79, 2, 2, 1259, 1260, 7, 67, 2, 2, 1260, 1261, 7, 86, 2, 2, 1261, 188, 3, 2, 2, 2, 1262, 1263, 7, 72, 2, 2, 1263, 1264, 7, 75, 2, 2, 1264, 1265, 7, 84, 2, 2, 1265, 1266, 7, 85, 2, 2, 1266, 1267, 7, 86, 2, 2, 1267, 190, 3, 2, 2, 2, 1268, 1269, 7, 72, 2, 2, 1269, 1270, 7, 81, 2, 2, 1270, 1271, 7, 78, 2, 2, 1271, 1272, 7, 78, 2, 2, 1272, 1273, 7, 81, 2, 2, 1273, 1274, 7, 89, 2, 2, 1274, 1275, 7, 75, 2, 2, 1275, 1276, 7, 80, 2, 2, 1276, 1277, 7, 73, 2, 2, 1277, 192, 3, 2, 2, 2, 1278, 1279, 7, 72, 2, 2, 1279, 1280, 7, 81, 2, 2, 1280, 1281, 7, 84, 2, 2, 1281, 194, 3, 2, 2, 2, 1282, 1283, 7, 72, 2, 2, 1283, 1284, 7, 81, 2, 2, 1284, 1285, 7, 84, 2, 2, 1285, 1286, 7, 71, 2, 2, 1286, 1287, 7, 75, 2, 2, 1287, 1288, 7, 73, 2, 2, 1288, 1289, 7, 80, 2, 2, 1289, 196, 3, 2, 2, 2, 1290, 1291, 7, 72, 2, 2, 1291, 1292, 7, 81, 2, 2, 1292, 1293, 7, 84, 2, 2, 1293, 1294, 7, 79, 2, 2, 1294, 1295, 7, 67, 2, 2, 1295, 1296, 7, 86, 2, 2, 1296, 198, 3, 2, 2, 2, 1297, 1298, 7, 72, 2, 2, 1298, 1299, 7, 81, 2, 2, 1299, 1300, 7, 84, 2, 2, 1300, 1301, 7, 79, 2, 2, 1301, 1302, 7, 67, 2, 2, 1302, 1303, 7, 86, 2, 2, 1303, 1304, 7, 86, 2, 2, 1304, 1305, 7, 71, 2, 2, 1305, 1306, 7, 70, 2, 2, 1306, 200, 3, 2, 2, 2, 1307, 1308, 7, 72, 2, 2, 1308, 1309, 7, 84, 2, 2, 1309, 1310, 7, 81, 2, 2, 1310, 1311, 7, 79, 2, 2, 1311, 202, 3, 2, 2, 2, 1312, 1313, 7, 72, 2, 2, 1313, 1314, 7, 87, 2, 2, 1314, 1315, 7, 78, 2, 2, 1315, 1316, 7, 78, 2, 2, 1316, 204, 3, 2, 2, 2, 1317, 1318, 7, 72, 2, 2, 1318, 1319, 7, 87, 2, 2, 1319, 1320, 7, 80, 2, 2, 1320, 1321, 7, 69, 2, 2, 1321, 1322, 7, 86, 2, 2, 1322, 1323, 7, 75, 2, 2, 1323, 1324, 7, 81, 2, 2, 1324, 1325, 7, 80, 2, 2, 1325, 206, 3, 2, 2, 2, 1326, 1327, 7, 72, 2, 2, 1327, 1328, 7, 87, 2, 2, 1328, 1329, 7, 80, 2, 2, 1329, 1330, 7, 69, 2, 2, 1330, 1331, 7, 86, 2, 2, 1331, 1332, 7, 75, 2, 2, 1332, 1333, 7, 81, 2, 2, 1333, 1334, 7, 80, 2, 2, 1334, 1335, 7, 85, 2, 2, 1335, 208, 3, 2, 2, 2, 1336, 1337, 7, 73, 2, 2, 1337, 1338, 7, 78, 2, 2, 1338, 1339, 7, 81, 2, 2, 1339, 1340, 7, 68, 2, 2, 1340, 1341, 7, 67, 2, 2, 1341, 1342, 7, 78, 2, 2, 1342, 210, 3, 2, 2, 2, 1343, 1344, 7, 73, 2, 2, 1344, 1345, 7, 84, 2, 2, 1345, 1346, 7, 67, 2, 2, 1346, 1347, 7, 80, 2, 2, 1347, 1348, 7, 86, 2, 2, 1348, 212, 3, 2, 2, 2, 1349, 1350, 7, 73, 2, 2, 1350, 1351, 7, 84, 2, 2, 1351, 1352, 7, 81, 2, 2, 1352, 1353, 7, 87, 2, 2, 1353, 1354, 7, 82, 2, 2, 1354, 214, 3, 2, 2, 2, 1355, 1356, 7, 73, 2, 2, 1356, 1357, 7, 84, 2, 2, 1357, 1358, 7, 81, 2, 2, 1358, 1359, 7, 87, 2, 2, 1359, 1360, 7, 82, 2, 2, 1360, 1361, 7, 75, 2, 2, 1361, 1362, 7, 80, 2, 2, 1362, 1363, 7, 73, 2, 2, 1363, 216, 3, 2, 2, 2, 1364, 1365, 7, 74, 2, 2, 1365, 1366, 7, 67, 2, 2, 1366, 1367, 7, 88, 2, 2, 1367, 1368, 7, 75, 2, 2, 1368, 1369, 7, 80, 2, 2, 1369, 1370, 7, 73, 2, 2, 1370, 218, 3, 2, 2, 2, 1371, 1372, 7, 74, 2, 2, 1372, 1373, 7, 81, 2, 2, 1373, 1374, 7, 87, 2, 2, 1374, 1375, 7, 84, 2, 2, 1375, 220, 3, 2, 2, 2, 1376, 1377, 7, 75, 2, 2, 1377, 1378, 7, 72, 2, 2, 1378, 222, 3, 2, 2, 2, 1379, 1380, 7, 75, 2, 2, 1380, 1381, 7, 73, 2, 2, 1381, 1382, 7, 80, 2, 2, 1382, 1383, 7, 81, 2, 2, 1383, 1384, 7, 84, 2, 2, 1384, 1385, 7, 71, 2, 2, 1385, 224, 3, 2, 2, 2, 1386, 1387, 7, 75, 2, 2, 1387, 1388, 7, 79, 2, 2, 1388, 1389, 7, 82, 2, 2, 1389, 1390, 7, 81, 2, 2, 1390, 1391, 7, 84, 2, 2, 1391, 1392, 7, 86, 2, 2, 1392, 226, 3, 2, 2, 2, 1393, 1394, 7, 75, 2, 2, 1394, 1395, 7, 80, 2, 2, 1395, 228, 3, 2, 2, 2, 1396, 1397, 7, 75, 2, 2, 1397, 1398, 7, 80, 2, 2, 1398, 1399, 7, 70, 2, 2, 1399, 1400, 7, 71, 2, 2, 1400, 1401, 7, 90, 2, 2, 1401, 230, 3, 2, 2, 2, 1402, 1403, 7, 75, 2, 2, 1403, 1404, 7, 80, 2, 2, 1404, 1405, 7, 70, 2, 2, 1405, 1406, 7, 71, 2, 2, 1406, 1407, 7, 90, 2, 2, 1407, 1408, 7, 71, 2, 2, 1408, 1409, 7, 85, 2, 2, 1409, 232, 3, 2, 2, 2, 1410, 1411, 7, 75, 2, 2, 1411, 1412, 7, 80, 2, 2, 1412, 1413, 7, 80, 2, 2, 1413, 1414, 7, 71, 2, 2, 1414, 1415, 7, 84, 2, 2, 1415, 234, 3, 2, 2, 2, 1416, 1417, 7, 75, 2, 2, 1417, 1418, 7, 80, 2, 2, 1418, 1419, 7, 82, 2, 2, 1419, 1420, 7, 67, 2, 2, 1420, 1421, 7, 86, 2, 2, 1421, 1422, 7, 74, 2, 2, 1422, 236, 3, 2, 2, 2, 1423, 1424, 7, 75, 2, 2, 1424, 1425, 7, 80, 2, 2, 1425, 1426, 7, 82, 2, 2, 1426, 1427, 7, 87, 2, 2, 1427, 1428, 7, 86, 2, 2, 1428, 1429, 7, 72, 2, 2, 1429, 1430, 7, 81, 2, 2, 1430, 1431, 7, 84, 2, 2, 1431, 1432, 7, 79, 2, 2, 1432, 1433, 7, 67, 2, 2, 1433, 1434, 7, 86, 2, 2, 1434, 238, 3, 2, 2, 2, 1435, 1436, 7, 75, 2, 2, 1436, 1437, 7, 80, 2, 2, 1437, 1438, 7, 85, 2, 2, 1438, 1439, 7, 71, 2, 2, 1439, 1440, 7, 84, 2, 2, 1440, 1441, 7, 86, 2, 2, 1441, 240, 3, 2, 2, 2, 1442, 1443, 7, 75, 2, 2, 1443, 1444, 7, 80, 2, 2, 1444, 1445, 7, 86, 2, 2, 1445, 1446, 7, 71, 2, 2, 1446, 1447, 7, 84, 2, 2, 1447, 1448, 7, 85, 2, 2, 1448, 1449, 7, 71, 2, 2, 1449, 1450, 7, 69, 2, 2, 1450, 1451, 7, 86, 2, 2, 1451, 242, 3, 2, 2, 2, 1452, 1453, 7, 75, 2, 2, 1453, 1454, 7, 80, 2, 2, 1454, 1455, 7, 86, 2, 2, 1455, 1456, 7, 71, 2, 2, 1456, 1457, 7, 84, 2, 2, 1457, 1458, 7, 88, 2, 2, 1458, 1459, 7, 67, 2, 2, 1459, 1460, 7, 78, 2, 2, 1460, 244, 3, 2, 2, 2, 1461, 1462, 7, 75, 2, 2, 1462, 1463, 7, 80, 2, 2, 1463, 1464, 7, 86, 2, 2, 1464, 1465, 7, 81, 2, 2, 1465, 246, 3, 2, 2, 2, 1466, 1467, 7, 75, 2, 2, 1467, 1468, 7, 85, 2, 2, 1468, 248, 3, 2, 2, 2, 1469, 1470, 7, 75, 2, 2, 1470, 1471, 7, 86, 2, 2, 1471, 1472, 7, 71, 2, 2, 1472, 1473, 7, 79, 2, 2, 1473, 1474, 7, 85, 2, 2, 1474, 250, 3, 2, 2, 2, 1475, 1476, 7, 76, 2, 2, 1476, 1477, 7, 81, 2, 2, 1477, 1478, 7, 75, 2, 2, 1478, 1479, 7, 80, 2, 2, 1479, 252, 3, 2, 2, 2, 1480, 1481, 7, 77, 2, 2, 1481, 1482, 7, 71, 2, 2, 1482, 1483, 7, 91, 2, 2, 1483, 1484, 7, 85, 2, 2, 1484, 254, 3, 2, 2, 2, 1485, 1486, 7, 78, 2, 2, 1486, 1487, 7, 67, 2, 2, 1487, 1488, 7, 85, 2, 2, 1488, 1489, 7, 86, 2, 2, 1489, 256, 3, 2, 2, 2, 1490, 1491, 7, 78, 2, 2, 1491, 1492, 7, 67, 2, 2, 1492, 1493, 7, 86, 2, 2, 1493, 1494, 7, 71, 2, 2, 1494, 1495, 7, 84, 2, 2, 1495, 1496, 7, 67, 2, 2, 1496, 1497, 7, 78, 2, 2, 1497, 258, 3, 2, 2, 2, 1498, 1499, 7, 78, 2, 2, 1499, 1500, 7, 67, 2, 2, 1500, 1501, 7, 92, 2, 2, 1501, 1502, 7, 91, 2, 2, 1502, 260, 3, 2, 2, 2, 1503, 1504, 7, 78, 2, 2, 1504, 1505, 7, 71, 2, 2, 1505, 1506, 7, 67, 2, 2, 1506, 1507, 7, 70, 2, 2, 1507, 1508, 7, 75, 2, 2, 1508, 1509, 7, 80, 2, 2, 1509, 1510, 7, 73, 2, 2, 1510, 262, 3, 2, 2, 2, 1511, 1512, 7, 78, 2, 2, 1512, 1513, 7, 71, 2, 2, 1513, 1514, 7, 72, 2, 2, 1514, 1515, 7, 86, 2, 2, 1515, 264, 3, 2, 2, 2, 1516, 1517, 7, 78, 2, 2, 1517, 1518, 7, 75, 2, 2, 1518, 1519, 7, 77, 2, 2, 1519, 1520, 7, 71, 2, 2, 1520, 266, 3, 2, 2, 2, 1521, 1522, 7, 78, 2, 2, 1522, 1523, 7, 75, 2, 2, 1523, 1524, 7, 79, 2, 2, 1524, 1525, 7, 75, 2, 2, 1525, 1526, 7, 86, 2, 2, 1526, 268, 3, 2, 2, 2, 1527, 1528, 7, 78, 2, 2, 1528, 1529, 7, 75, 2, 2, 1529, 1530, 7, 80, 2, 2, 1530, 1531, 7, 71, 2, 2, 1531, 1532, 7, 85, 2, 2, 1532, 270, 3, 2, 2, 2, 1533, 1534, 7, 78, 2, 2, 1534, 1535, 7, 75, 2, 2, 1535, 1536, 7, 85, 2, 2, 1536, 1537, 7, 86, 2, 2, 1537, 272, 3, 2, 2, 2, 1538, 1539, 7, 78, 2, 2, 1539, 1540, 7, 81, 2, 2, 1540, 1541, 7, 67, 2, 2, 1541, 1542, 7, 70, 2, 2, 1542, 274, 3, 2, 2, 2, 1543, 1544, 7, 78, 2, 2, 1544, 1545, 7, 81, 2, 2, 1545, 1546, 7, 69, 2, 2, 1546, 1547, 7, 67, 2, 2, 1547, 1548, 7, 78, 2, 2, 1548, 276, 3, 2, 2, 2, 1549, 1550, 7, 78, 2, 2, 1550, 1551, 7, 81, 2, 2, 1551, 1552, 7, 69, 2, 2, 1552, 1553, 7, 67, 2, 2, 1553, 1554, 7, 86, 2, 2, 1554, 1555, 7, 75, 2, 2, 1555, 1556, 7, 81, 2, 2, 1556, 1557, 7, 80, 2, 2, 1557, 278, 3, 2, 2, 2, 1558, 1559, 7, 78, 2, 2, 1559, 1560, 7, 81, 2, 2, 1560, 1561, 7, 69, 2, 2, 1561, 1562, 7, 77, 2, 2, 1562, 280, 3, 2, 2, 2, 1563, 1564, 7, 78, 2, 2, 1564, 1565, 7, 81, 2, 2, 1565, 1566, 7, 69, 2, 2, 1566, 1567, 7, 77, 2, 2, 1567, 1568, 7, 85, 2, 2, 1568, 282, 3, 2, 2, 2, 1569, 1570, 7, 78, 2, 2, 1570, 1571, 7, 81, 2, 2, 1571, 1572, 7, 73, 2, 2, 1572, 1573, 7, 75, 2, 2, 1573, 1574, 7, 69, 2, 2, 1574, 1575, 7, 67, 2, 2, 1575, 1576, 7, 78, 2, 2, 1576, 284, 3, 2, 2, 2, 1577, 1578, 7, 79, 2, 2, 1578, 1579, 7, 67, 2, 2, 1579, 1580, 7, 69, 2, 2, 1580, 1581, 7, 84, 2, 2, 1581, 1582, 7, 81, 2, 2, 1582, 286, 3, 2, 2, 2, 1583, 1584, 7, 79, 2, 2, 1584, 1585, 7, 67, 2, 2, 1585, 1586, 7, 82, 2, 2, 1586, 288, 3, 2, 2, 2, 1587, 1588, 7, 79, 2, 2, 1588, 1589, 7, 67, 2, 2, 1589, 1590, 7, 86, 2, 2, 1590, 1591, 7, 69, 2, 2, 1591, 1592, 7, 74, 2, 2, 1592, 1593, 7, 71, 2, 2, 1593, 1594, 7, 70, 2, 2, 1594, 290, 3, 2, 2, 2, 1595, 1596, 7, 79, 2, 2, 1596, 1597, 7, 71, 2, 2, 1597, 1598, 7, 84, 2, 2, 1598, 1599, 7, 73, 2, 2, 1599, 1600, 7, 71, 2, 2, 1600, 292, 3, 2, 2, 2, 1601, 1602, 7, 79, 2, 2, 1602, 1603, 7, 75, 2, 2, 1603, 1604, 7, 80, 2, 2, 1604, 1605, 7, 87, 2, 2, 1605, 1606, 7, 86, 2, 2, 1606, 1607, 7, 71, 2, 2, 1607, 294, 3, 2, 2, 2, 1608, 1609, 7, 79, 2, 2, 1609, 1610, 7, 81, 2, 2, 1610, 1611, 7, 80, 2, 2, 1611, 1612, 7, 86, 2, 2, 1612, 1613, 7, 74, 2, 2, 1613, 296, 3, 2, 2, 2, 1614, 1615, 7, 79, 2, 2, 1615, 1616, 7, 85, 2, 2, 1616, 1617, 7, 69, 2, 2, 1617, 1618, 7, 77, 2, 2, 1618, 298, 3, 2, 2, 2, 1619, 1620, 7, 80, 2, 2, 1620, 1621, 7, 67, 2, 2, 1621, 1622, 7, 79, 2, 2, 1622, 1623, 7, 71, 2, 2, 1623, 1624, 7, 85, 2, 2, 1624, 1625, 7, 82, 2, 2, 1625, 1626, 7, 67, 2, 2, 1626, 1627, 7, 69, 2, 2, 1627, 1628, 7, 71, 2, 2, 1628, 300, 3, 2, 2, 2, 1629, 1630, 7, 80, 2, 2, 1630, 1631, 7, 67, 2, 2, 1631, 1632, 7, 79, 2, 2, 1632, 1633, 7, 71, 2, 2, 1633, 1634, 7, 85, 2, 2, 1634, 1635, 7, 82, 2, 2, 1635, 1636, 7, 67, 2, 2, 1636, 1637, 7, 69, 2, 2, 1637, 1638, 7, 71, 2, 2, 1638, 1639, 7, 85, 2, 2, 1639, 302, 3, 2, 2, 2, 1640, 1641, 7, 80, 2, 2, 1641, 1642, 7, 67, 2, 2, 1642, 1643, 7, 86, 2, 2, 1643, 1644, 7, 87, 2, 2, 1644, 1645, 7, 84, 2, 2, 1645, 1646, 7, 67, 2, 2, 1646, 1647, 7, 78, 2, 2, 1647, 304, 3, 2, 2, 2, 1648, 1649, 7, 80, 2, 2, 1649, 1650, 7, 81, 2, 2, 1650, 306, 3, 2, 2, 2, 1651, 1652, 7, 80, 2, 2, 1652, 1653, 7, 81, 2, 2, 1653, 1656, 7, 86, 2, 2, 1654, 1656, 7, 35, 2, 2, 1655, 1651, 3, 2, 2, 2, 1655, 1654, 3, 2, 2, 2, 1656, 308, 3, 2, 2, 2, 1657, 1658, 7, 80, 2, 2, 1658, 1659, 7, 87, 2, 2, 1659, 1660, 7, 78, 2, 2, 1660, 1661, 7, 78, 2, 2, 1661, 310, 3, 2, 2, 2, 1662, 1663, 7, 80, 2, 2, 1663, 1664, 7, 87, 2, 2, 1664, 1665, 7, 78, 2, 2, 1665, 1666, 7, 78, 2, 2, 1666, 1667, 7, 85, 2, 2, 1667, 312, 3, 2, 2, 2, 1668, 1669, 7, 81, 2, 2, 1669, 1670, 7, 72, 2, 2, 1670, 314, 3, 2, 2, 2, 1671, 1672, 7, 81, 2, 2, 1672, 1673, 7, 80, 2, 2, 1673, 316, 3, 2, 2, 2, 1674, 1675, 7, 81, 2, 2, 1675, 1676, 7, 80, 2, 2, 1676, 1677, 7, 78, 2, 2, 1677, 1678, 7, 91, 2, 2, 1678, 318, 3, 2, 2, 2, 1679, 1680, 7, 81, 2, 2, 1680, 1681, 7, 82, 2, 2, 1681, 1682, 7, 86, 2, 2, 1682, 1683, 7, 75, 2, 2, 1683, 1684, 7, 81, 2, 2, 1684, 1685, 7, 80, 2, 2, 1685, 320, 3, 2, 2, 2, 1686, 1687, 7, 81, 2, 2, 1687, 1688, 7, 82, 2, 2, 1688, 1689, 7, 86, 2, 2, 1689, 1690, 7, 75, 2, 2, 1690, 1691, 7, 81, 2, 2, 1691, 1692, 7, 80, 2, 2, 1692, 1693, 7, 85, 2, 2, 1693, 322, 3, 2, 2, 2, 1694, 1695, 7, 81, 2, 2, 1695, 1696, 7, 84, 2, 2, 1696, 324, 3, 2, 2, 2, 1697, 1698, 7, 81, 2, 2, 1698, 1699, 7, 84, 2, 2, 1699, 1700, 7, 70, 2, 2, 1700, 1701, 7, 71, 2, 2, 1701, 1702, 7, 84, 2, 2, 1702, 326, 3, 2, 2, 2, 1703, 1704, 7, 81, 2, 2, 1704, 1705, 7, 87, 2, 2, 1705, 1706, 7, 86, 2, 2, 1706, 328, 3, 2, 2, 2, 1707, 1708, 7, 81, 2, 2, 1708, 1709, 7, 87, 2, 2, 1709, 1710, 7, 86, 2, 2, 1710, 1711, 7, 71, 2, 2, 1711, 1712, 7, 84, 2, 2, 1712, 330, 3, 2, 2, 2, 1713, 1714, 7, 81, 2, 2, 1714, 1715, 7, 87, 2, 2, 1715, 1716, 7, 86, 2, 2, 1716, 1717, 7, 82, 2, 2, 1717, 1718, 7, 87, 2, 2, 1718, 1719, 7, 86, 2, 2, 1719, 1720, 7, 72, 2, 2, 1720, 1721, 7, 81, 2, 2, 1721, 1722, 7, 84, 2, 2, 1722, 1723, 7, 79, 2, 2, 1723, 1724, 7, 67, 2, 2, 1724, 1725, 7, 86, 2, 2, 1725, 332, 3, 2, 2, 2, 1726, 1727, 7, 81, 2, 2, 1727, 1728, 7, 88, 2, 2, 1728, 1729, 7, 71, 2, 2, 1729, 1730, 7, 84, 2, 2, 1730, 334, 3, 2, 2, 2, 1731, 1732, 7, 81, 2, 2, 1732, 1733, 7, 88, 2, 2, 1733, 1734, 7, 71, 2, 2, 1734, 1735, 7, 84, 2, 2, 1735, 1736, 7, 78, 2, 2, 1736, 1737, 7, 67, 2, 2, 1737, 1738, 7, 82, 2, 2, 1738, 1739, 7, 85, 2, 2, 1739, 336, 3, 2, 2, 2, 1740, 1741, 7, 81, 2, 2, 1741, 1742, 7, 88, 2, 2, 1742, 1743, 7, 71, 2, 2, 1743, 1744, 7, 84, 2, 2, 1744, 1745, 7, 78, 2, 2, 1745, 1746, 7, 67, 2, 2, 1746, 1747, 7, 91, 2, 2, 1747, 338, 3, 2, 2, 2, 1748, 1749, 7, 81, 2, 2, 1749, 1750, 7, 88, 2, 2, 1750, 1751, 7, 71, 2, 2, 1751, 1752, 7, 84, 2, 2, 1752, 1753, 7, 89, 2, 2, 1753, 1754, 7, 84, 2, 2, 1754, 1755, 7, 75, 2, 2, 1755, 1756, 7, 86, 2, 2, 1756, 1757, 7, 71, 2, 2, 1757, 340, 3, 2, 2, 2, 1758, 1759, 7, 82, 2, 2, 1759, 1760, 7, 67, 2, 2, 1760, 1761, 7, 84, 2, 2, 1761, 1762, 7, 86, 2, 2, 1762, 1763, 7, 75, 2, 2, 1763, 1764, 7, 86, 2, 2, 1764, 1765, 7, 75, 2, 2, 1765, 1766, 7, 81, 2, 2, 1766, 1767, 7, 80, 2, 2, 1767, 342, 3, 2, 2, 2, 1768, 1769, 7, 82, 2, 2, 1769, 1770, 7, 67, 2, 2, 1770, 1771, 7, 84, 2, 2, 1771, 1772, 7, 86, 2, 2, 1772, 1773, 7, 75, 2, 2, 1773, 1774, 7, 86, 2, 2, 1774, 1775, 7, 75, 2, 2, 1775, 1776, 7, 81, 2, 2, 1776, 1777, 7, 80, 2, 2, 1777, 1778, 7, 71, 2, 2, 1778, 1779, 7, 70, 2, 2, 1779, 344, 3, 2, 2, 2, 1780, 1781, 7, 82, 2, 2, 1781, 1782, 7, 67, 2, 2, 1782, 1783, 7, 84, 2, 2, 1783, 1784, 7, 86, 2, 2, 1784, 1785, 7, 75, 2, 2, 1785, 1786, 7, 86, 2, 2, 1786, 1787, 7, 75, 2, 2, 1787, 1788, 7, 81, 2, 2, 1788, 1789, 7, 80, 2, 2, 1789, 1790, 7, 85, 2, 2, 1790, 346, 3, 2, 2, 2, 1791, 1792, 7, 82, 2, 2, 1792, 1793, 7, 71, 2, 2, 1793, 1794, 7, 84, 2, 2, 1794, 1795, 7, 69, 2, 2, 1795, 1796, 7, 71, 2, 2, 1796, 1797, 7, 80, 2, 2, 1797, 1798, 7, 86, 2, 2, 1798, 348, 3, 2, 2, 2, 1799, 1800, 7, 82, 2, 2, 1800, 1801, 7, 75, 2, 2, 1801, 1802, 7, 88, 2, 2, 1802, 1803, 7, 81, 2, 2, 1803, 1804, 7, 86, 2, 2, 1804, 350, 3, 2, 2, 2, 1805, 1806, 7, 82, 2, 2, 1806, 1807, 7, 78, 2, 2, 1807, 1808, 7, 67, 2, 2, 1808, 1809, 7, 69, 2, 2, 1809, 1810, 7, 75, 2, 2, 1810, 1811, 7, 80, 2, 2, 1811, 1812, 7, 73, 2, 2, 1812, 352, 3, 2, 2, 2, 1813, 1814, 7, 82, 2, 2, 1814, 1815, 7, 81, 2, 2, 1815, 1816, 7, 85, 2, 2, 1816, 1817, 7, 75, 2, 2, 1817, 1818, 7, 86, 2, 2, 1818, 1819, 7, 75, 2, 2, 1819, 1820, 7, 81, 2, 2, 1820, 1821, 7, 80, 2, 2, 1821, 354, 3, 2, 2, 2, 1822, 1823, 7, 82, 2, 2, 1823, 1824, 7, 84, 2, 2, 1824, 1825, 7, 71, 2, 2, 1825, 1826, 7, 69, 2, 2, 1826, 1827, 7, 71, 2, 2, 1827, 1828, 7, 70, 2, 2, 1828, 1829, 7, 75, 2, 2, 1829, 1830, 7, 80, 2, 2, 1830, 1831, 7, 73, 2, 2, 1831, 356, 3, 2, 2, 2, 1832, 1833, 7, 82, 2, 2, 1833, 1834, 7, 84, 2, 2, 1834, 1835, 7, 75, 2, 2, 1835, 1836, 7, 79, 2, 2, 1836, 1837, 7, 67, 2, 2, 1837, 1838, 7, 84, 2, 2, 1838, 1839, 7, 91, 2, 2, 1839, 358, 3, 2, 2, 2, 1840, 1841, 7, 82, 2, 2, 1841, 1842, 7, 84, 2, 2, 1842, 1843, 7, 75, 2, 2, 1843, 1844, 7, 80, 2, 2, 1844, 1845, 7, 69, 2, 2, 1845, 1846, 7, 75, 2, 2, 1846, 1847, 7, 82, 2, 2, 1847, 1848, 7, 67, 2, 2, 1848, 1849, 7, 78, 2, 2, 1849, 1850, 7, 85, 2, 2, 1850, 360, 3, 2, 2, 2, 1851, 1852, 7, 82, 2, 2, 1852, 1853, 7, 84, 2, 2, 1853, 1854, 7, 81, 2, 2, 1854, 1855, 7, 82, 2, 2, 1855, 1856, 7, 71, 2, 2, 1856, 1857, 7, 84, 2, 2, 1857, 1858, 7, 86, 2, 2, 1858, 1859, 7, 75, 2, 2, 1859, 1860, 7, 71, 2, 2, 1860, 1861, 7, 85, 2, 2, 1861, 362, 3, 2, 2, 2, 1862, 1863, 7, 82, 2, 2, 1863, 1864, 7, 87, 2, 2, 1864, 1865, 7, 84, 2, 2, 1865, 1866, 7, 73, 2, 2, 1866, 1867, 7, 71, 2, 2, 1867, 364, 3, 2, 2, 2, 1868, 1869, 7, 83, 2, 2, 1869, 1870, 7, 87, 2, 2, 1870, 1871, 7, 71, 2, 2, 1871, 1872, 7, 84, 2, 2, 1872, 1873, 7, 91, 2, 2, 1873, 366, 3, 2, 2, 2, 1874, 1875, 7, 84, 2, 2, 1875, 1876, 7, 67, 2, 2, 1876, 1877, 7, 80, 2, 2, 1877, 1878, 7, 73, 2, 2, 1878, 1879, 7, 71, 2, 2, 1879, 368, 3, 2, 2, 2, 1880, 1881, 7, 84, 2, 2, 1881, 1882, 7, 71, 2, 2, 1882, 1883, 7, 69, 2, 2, 1883, 1884, 7, 81, 2, 2, 1884, 1885, 7, 84, 2, 2, 1885, 1886, 7, 70, 2, 2, 1886, 1887, 7, 84, 2, 2, 1887, 1888, 7, 71, 2, 2, 1888, 1889, 7, 67, 2, 2, 1889, 1890, 7, 70, 2, 2, 1890, 1891, 7, 71, 2, 2, 1891, 1892, 7, 84, 2, 2, 1892, 370, 3, 2, 2, 2, 1893, 1894, 7, 84, 2, 2, 1894, 1895, 7, 71, 2, 2, 1895, 1896, 7, 69, 2, 2, 1896, 1897, 7, 81, 2, 2, 1897, 1898, 7, 84, 2, 2, 1898, 1899, 7, 70, 2, 2, 1899, 1900, 7, 89, 2, 2, 1900, 1901, 7, 84, 2, 2, 1901, 1902, 7, 75, 2, 2, 1902, 1903, 7, 86, 2, 2, 1903, 1904, 7, 71, 2, 2, 1904, 1905, 7, 84, 2, 2, 1905, 372, 3, 2, 2, 2, 1906, 1907, 7, 84, 2, 2, 1907, 1908, 7, 71, 2, 2, 1908, 1909, 7, 69, 2, 2, 1909, 1910, 7, 81, 2, 2, 1910, 1911, 7, 88, 2, 2, 1911, 1912, 7, 71, 2, 2, 1912, 1913, 7, 84, 2, 2, 1913, 374, 3, 2, 2, 2, 1914, 1915, 7, 84, 2, 2, 1915, 1916, 7, 71, 2, 2, 1916, 1917, 7, 70, 2, 2, 1917, 1918, 7, 87, 2, 2, 1918, 1919, 7, 69, 2, 2, 1919, 1920, 7, 71, 2, 2, 1920, 376, 3, 2, 2, 2, 1921, 1922, 7, 84, 2, 2, 1922, 1923, 7, 71, 2, 2, 1923, 1924, 7, 72, 2, 2, 1924, 1925, 7, 71, 2, 2, 1925, 1926, 7, 84, 2, 2, 1926, 1927, 7, 71, 2, 2, 1927, 1928, 7, 80, 2, 2, 1928, 1929, 7, 69, 2, 2, 1929, 1930, 7, 71, 2, 2, 1930, 1931, 7, 85, 2, 2, 1931, 378, 3, 2, 2, 2, 1932, 1933, 7, 84, 2, 2, 1933, 1934, 7, 71, 2, 2, 1934, 1935, 7, 72, 2, 2, 1935, 1936, 7, 84, 2, 2, 1936, 1937, 7, 71, 2, 2, 1937, 1938, 7, 85, 2, 2, 1938, 1939, 7, 74, 2, 2, 1939, 380, 3, 2, 2, 2, 1940, 1941, 7, 84, 2, 2, 1941, 1942, 7, 71, 2, 2, 1942, 1943, 7, 80, 2, 2, 1943, 1944, 7, 67, 2, 2, 1944, 1945, 7, 79, 2, 2, 1945, 1946, 7, 71, 2, 2, 1946, 382, 3, 2, 2, 2, 1947, 1948, 7, 84, 2, 2, 1948, 1949, 7, 71, 2, 2, 1949, 1950, 7, 82, 2, 2, 1950, 1951, 7, 67, 2, 2, 1951, 1952, 7, 75, 2, 2, 1952, 1953, 7, 84, 2, 2, 1953, 384, 3, 2, 2, 2, 1954, 1955, 7, 84, 2, 2, 1955, 1956, 7, 71, 2, 2, 1956, 1957, 7, 82, 2, 2, 1957, 1958, 7, 78, 2, 2, 1958, 1959, 7, 67, 2, 2, 1959, 1960, 7, 69, 2, 2, 1960, 1961, 7, 71, 2, 2, 1961, 386, 3, 2, 2, 2, 1962, 1963, 7, 84, 2, 2, 1963, 1964, 7, 71, 2, 2, 1964, 1965, 7, 85, 2, 2, 1965, 1966, 7, 71, 2, 2, 1966, 1967, 7, 86, 2, 2, 1967, 388, 3, 2, 2, 2, 1968, 1969, 7, 84, 2, 2, 1969, 1970, 7, 71, 2, 2, 1970, 1971, 7, 85, 2, 2, 1971, 1972, 7, 86, 2, 2, 1972, 1973, 7, 84, 2, 2, 1973, 1974, 7, 75, 2, 2, 1974, 1975, 7, 69, 2, 2, 1975, 1976, 7, 86, 2, 2, 1976, 390, 3, 2, 2, 2, 1977, 1978, 7, 84, 2, 2, 1978, 1979, 7, 71, 2, 2, 1979, 1980, 7, 88, 2, 2, 1980, 1981, 7, 81, 2, 2, 1981, 1982, 7, 77, 2, 2, 1982, 1983, 7, 71, 2, 2, 1983, 392, 3, 2, 2, 2, 1984, 1985, 7, 84, 2, 2, 1985, 1986, 7, 75, 2, 2, 1986, 1987, 7, 73, 2, 2, 1987, 1988, 7, 74, 2, 2, 1988, 1989, 7, 86, 2, 2, 1989, 394, 3, 2, 2, 2, 1990, 1991, 7, 84, 2, 2, 1991, 1992, 7, 78, 2, 2, 1992, 1993, 7, 75, 2, 2, 1993, 1994, 7, 77, 2, 2, 1994, 2002, 7, 71, 2, 2, 1995, 1996, 7, 84, 2, 2, 1996, 1997, 7, 71, 2, 2, 1997, 1998, 7, 73, 2, 2, 1998, 1999, 7, 71, 2, 2, 1999, 2000, 7, 90, 2, 2, 2000, 2002, 7, 82, 2, 2, 2001, 1990, 3, 2, 2, 2, 2001, 1995, 3, 2, 2, 2, 2002, 396, 3, 2, 2, 2, 2003, 2004, 7, 84, 2, 2, 2004, 2005, 7, 81, 2, 2, 2005, 2006, 7, 78, 2, 2, 2006, 2007, 7, 71, 2, 2, 2007, 398, 3, 2, 2, 2, 2008, 2009, 7, 84, 2, 2, 2009, 2010, 7, 81, 2, 2, 2010, 2011, 7, 78, 2, 2, 2011, 2012, 7, 71, 2, 2, 2012, 2013, 7, 85, 2, 2, 2013, 400, 3, 2, 2, 2, 2014, 2015, 7, 84, 2, 2, 2015, 2016, 7, 81, 2, 2, 2016, 2017, 7, 78, 2, 2, 2017, 2018, 7, 78, 2, 2, 2018, 2019, 7, 68, 2, 2, 2019, 2020, 7, 67, 2, 2, 2020, 2021, 7, 69, 2, 2, 2021, 2022, 7, 77, 2, 2, 2022, 402, 3, 2, 2, 2, 2023, 2024, 7, 84, 2, 2, 2024, 2025, 7, 81, 2, 2, 2025, 2026, 7, 78, 2, 2, 2026, 2027, 7, 78, 2, 2, 2027, 2028, 7, 87, 2, 2, 2028, 2029, 7, 82, 2, 2, 2029, 404, 3, 2, 2, 2, 2030, 2031, 7, 84, 2, 2, 2031, 2032, 7, 81, 2, 2, 2032, 2033, 7, 89, 2, 2, 2033, 406, 3, 2, 2, 2, 2034, 2035, 7, 84, 2, 2, 2035, 2036, 7, 81, 2, 2, 2036, 2037, 7, 89, 2, 2, 2037, 2038, 7, 85, 2, 2, 2038, 408, 3, 2, 2, 2, 2039, 2040, 7, 85, 2, 2, 2040, 2041, 7, 69, 2, 2, 2041, 2042, 7, 74, 2, 2, 2042, 2043, 7, 71, 2, 2, 2043, 2044, 7, 79, 2, 2, 2044, 2045, 7, 67, 2, 2, 2045, 410, 3, 2, 2, 2, 2046, 2047, 7, 85, 2, 2, 2047, 2048, 7, 71, 2, 2, 2048, 2049, 7, 69, 2, 2, 2049, 2050, 7, 81, 2, 2, 2050, 2051, 7, 80, 2, 2, 2051, 2052, 7, 70, 2, 2, 2052, 412, 3, 2, 2, 2, 2053, 2054, 7, 85, 2, 2, 2054, 2055, 7, 71, 2, 2, 2055, 2056, 7, 78, 2, 2, 2056, 2057, 7, 71, 2, 2, 2057, 2058, 7, 69, 2, 2, 2058, 2059, 7, 86, 2, 2, 2059, 414, 3, 2, 2, 2, 2060, 2061, 7, 85, 2, 2, 2061, 2062, 7, 71, 2, 2, 2062, 2063, 7, 79, 2, 2, 2063, 2064, 7, 75, 2, 2, 2064, 416, 3, 2, 2, 2, 2065, 2066, 7, 85, 2, 2, 2066, 2067, 7, 71, 2, 2, 2067, 2068, 7, 82, 2, 2, 2068, 2069, 7, 67, 2, 2, 2069, 2070, 7, 84, 2, 2, 2070, 2071, 7, 67, 2, 2, 2071, 2072, 7, 86, 2, 2, 2072, 2073, 7, 71, 2, 2, 2073, 2074, 7, 70, 2, 2, 2074, 418, 3, 2, 2, 2, 2075, 2076, 7, 85, 2, 2, 2076, 2077, 7, 71, 2, 2, 2077, 2078, 7, 84, 2, 2, 2078, 2079, 7, 70, 2, 2, 2079, 2080, 7, 71, 2, 2, 2080, 420, 3, 2, 2, 2, 2081, 2082, 7, 85, 2, 2, 2082, 2083, 7, 71, 2, 2, 2083, 2084, 7, 84, 2, 2, 2084, 2085, 7, 70, 2, 2, 2085, 2086, 7, 71, 2, 2, 2086, 2087, 7, 82, 2, 2, 2087, 2088, 7, 84, 2, 2, 2088, 2089, 7, 81, 2, 2, 2089, 2090, 7, 82, 2, 2, 2090, 2091, 7, 71, 2, 2, 2091, 2092, 7, 84, 2, 2, 2092, 2093, 7, 86, 2, 2, 2093, 2094, 7, 75, 2, 2, 2094, 2095, 7, 71, 2, 2, 2095, 2096, 7, 85, 2, 2, 2096, 422, 3, 2, 2, 2, 2097, 2098, 7, 85, 2, 2, 2098, 2099, 7, 71, 2, 2, 2099, 2100, 7, 85, 2, 2, 2100, 2101, 7, 85, 2, 2, 2101, 2102, 7, 75, 2, 2, 2102, 2103, 7, 81, 2, 2, 2103, 2104, 7, 80, 2, 2, 2104, 2105, 7, 97, 2, 2, 2105, 2106, 7, 87, 2, 2, 2106, 2107, 7, 85, 2, 2, 2107, 2108, 7, 71, 2, 2, 2108, 2109, 7, 84, 2, 2, 2109, 424, 3, 2, 2, 2, 2110, 2111, 7, 85, 2, 2, 2111, 2112, 7, 71, 2, 2, 2112, 2113, 7, 86, 2, 2, 2113, 426, 3, 2, 2, 2, 2114, 2115, 7, 79, 2, 2, 2115, 2116, 7, 75, 2, 2, 2116, 2117, 7, 80, 2, 2, 2117, 2118, 7, 87, 2, 2, 2118, 2119, 7, 85, 2, 2, 2119, 428, 3, 2, 2, 2, 2120, 2121, 7, 85, 2, 2, 2121, 2122, 7, 71, 2, 2, 2122, 2123, 7, 86, 2, 2, 2123, 2124, 7, 85, 2, 2, 2124, 430, 3, 2, 2, 2, 2125, 2126, 7, 85, 2, 2, 2126, 2127, 7, 74, 2, 2, 2127, 2128, 7, 81, 2, 2, 2128, 2129, 7, 89, 2, 2, 2129, 432, 3, 2, 2, 2, 2130, 2131, 7, 85, 2, 2, 2131, 2132, 7, 77, 2, 2, 2132, 2133, 7, 71, 2, 2, 2133, 2134, 7, 89, 2, 2, 2134, 2135, 7, 71, 2, 2, 2135, 2136, 7, 70, 2, 2, 2136, 434, 3, 2, 2, 2, 2137, 2138, 7, 85, 2, 2, 2138, 2139, 7, 81, 2, 2, 2139, 2140, 7, 79, 2, 2, 2140, 2141, 7, 71, 2, 2, 2141, 436, 3, 2, 2, 2, 2142, 2143, 7, 85, 2, 2, 2143, 2144, 7, 81, 2, 2, 2144, 2145, 7, 84, 2, 2, 2145, 2146, 7, 86, 2, 2, 2146, 438, 3, 2, 2, 2, 2147, 2148, 7, 85, 2, 2, 2148, 2149, 7, 81, 2, 2, 2149, 2150, 7, 84, 2, 2, 2150, 2151, 7, 86, 2, 2, 2151, 2152, 7, 71, 2, 2, 2152, 2153, 7, 70, 2, 2, 2153, 440, 3, 2, 2, 2, 2154, 2155, 7, 85, 2, 2, 2155, 2156, 7, 86, 2, 2, 2156, 2157, 7, 67, 2, 2, 2157, 2158, 7, 84, 2, 2, 2158, 2159, 7, 86, 2, 2, 2159, 442, 3, 2, 2, 2, 2160, 2161, 7, 85, 2, 2, 2161, 2162, 7, 86, 2, 2, 2162, 2163, 7, 67, 2, 2, 2163, 2164, 7, 86, 2, 2, 2164, 2165, 7, 75, 2, 2, 2165, 2166, 7, 85, 2, 2, 2166, 2167, 7, 86, 2, 2, 2167, 2168, 7, 75, 2, 2, 2168, 2169, 7, 69, 2, 2, 2169, 2170, 7, 85, 2, 2, 2170, 444, 3, 2, 2, 2, 2171, 2172, 7, 85, 2, 2, 2172, 2173, 7, 86, 2, 2, 2173, 2174, 7, 81, 2, 2, 2174, 2175, 7, 84, 2, 2, 2175, 2176, 7, 71, 2, 2, 2176, 2177, 7, 70, 2, 2, 2177, 446, 3, 2, 2, 2, 2178, 2179, 7, 85, 2, 2, 2179, 2180, 7, 86, 2, 2, 2180, 2181, 7, 84, 2, 2, 2181, 2182, 7, 67, 2, 2, 2182, 2183, 7, 86, 2, 2, 2183, 2184, 7, 75, 2, 2, 2184, 2185, 7, 72, 2, 2, 2185, 2186, 7, 91, 2, 2, 2186, 448, 3, 2, 2, 2, 2187, 2188, 7, 85, 2, 2, 2188, 2189, 7, 86, 2, 2, 2189, 2190, 7, 84, 2, 2, 2190, 2191, 7, 87, 2, 2, 2191, 2192, 7, 69, 2, 2, 2192, 2193, 7, 86, 2, 2, 2193, 450, 3, 2, 2, 2, 2194, 2195, 7, 85, 2, 2, 2195, 2196, 7, 87, 2, 2, 2196, 2197, 7, 68, 2, 2, 2197, 2198, 7, 85, 2, 2, 2198, 2199, 7, 86, 2, 2, 2199, 2200, 7, 84, 2, 2, 2200, 452, 3, 2, 2, 2, 2201, 2202, 7, 85, 2, 2, 2202, 2203, 7, 87, 2, 2, 2203, 2204, 7, 68, 2, 2, 2204, 2205, 7, 85, 2, 2, 2205, 2206, 7, 86, 2, 2, 2206, 2207, 7, 84, 2, 2, 2207, 2208, 7, 75, 2, 2, 2208, 2209, 7, 80, 2, 2, 2209, 2210, 7, 73, 2, 2, 2210, 454, 3, 2, 2, 2, 2211, 2212, 7, 86, 2, 2, 2212, 2213, 7, 67, 2, 2, 2213, 2214, 7, 68, 2, 2, 2214, 2215, 7, 78, 2, 2, 2215, 2216, 7, 71, 2, 2, 2216, 456, 3, 2, 2, 2, 2217, 2218, 7, 86, 2, 2, 2218, 2219, 7, 67, 2, 2, 2219, 2220, 7, 68, 2, 2, 2220, 2221, 7, 78, 2, 2, 2221, 2222, 7, 71, 2, 2, 2222, 2223, 7, 85, 2, 2, 2223, 458, 3, 2, 2, 2, 2224, 2225, 7, 86, 2, 2, 2225, 2226, 7, 67, 2, 2, 2226, 2227, 7, 68, 2, 2, 2227, 2228, 7, 78, 2, 2, 2228, 2229, 7, 71, 2, 2, 2229, 2230, 7, 85, 2, 2, 2230, 2231, 7, 67, 2, 2, 2231, 2232, 7, 79, 2, 2, 2232, 2233, 7, 82, 2, 2, 2233, 2234, 7, 78, 2, 2, 2234, 2235, 7, 71, 2, 2, 2235, 460, 3, 2, 2, 2, 2236, 2237, 7, 86, 2, 2, 2237, 2238, 7, 68, 2, 2, 2238, 2239, 7, 78, 2, 2, 2239, 2240, 7, 82, 2, 2, 2240, 2241, 7, 84, 2, 2, 2241, 2242, 7, 81, 2, 2, 2242, 2243, 7, 82, 2, 2, 2243, 2244, 7, 71, 2, 2, 2244, 2245, 7, 84, 2, 2, 2245, 2246, 7, 86, 2, 2, 2246, 2247, 7, 75, 2, 2, 2247, 2248, 7, 71, 2, 2, 2248, 2249, 7, 85, 2, 2, 2249, 462, 3, 2, 2, 2, 2250, 2251, 7, 86, 2, 2, 2251, 2252, 7, 71, 2, 2, 2252, 2253, 7, 79, 2, 2, 2253, 2254, 7, 82, 2, 2, 2254, 2255, 7, 81, 2, 2, 2255, 2256, 7, 84, 2, 2, 2256, 2257, 7, 67, 2, 2, 2257, 2258, 7, 84, 2, 2, 2258, 2264, 7, 91, 2, 2, 2259, 2260, 7, 86, 2, 2, 2260, 2261, 7, 71, 2, 2, 2261, 2262, 7, 79, 2, 2, 2262, 2264, 7, 82, 2, 2, 2263, 2250, 3, 2, 2, 2, 2263, 2259, 3, 2, 2, 2, 2264, 464, 3, 2, 2, 2, 2265, 2266, 7, 86, 2, 2, 2266, 2267, 7, 71, 2, 2, 2267, 2268, 7, 84, 2, 2, 2268, 2269, 7, 79, 2, 2, 2269, 2270, 7, 75, 2, 2, 2270, 2271, 7, 80, 2, 2, 2271, 2272, 7, 67, 2, 2, 2272, 2273, 7, 86, 2, 2, 2273, 2274, 7, 71, 2, 2, 2274, 2275, 7, 70, 2, 2, 2275, 466, 3, 2, 2, 2, 2276, 2277, 7, 86, 2, 2, 2277, 2278, 7, 74, 2, 2, 2278, 2279, 7, 71, 2, 2, 2279, 2280, 7, 80, 2, 2, 2280, 468, 3, 2, 2, 2, 2281, 2282, 7, 86, 2, 2, 2282, 2283, 7, 81, 2, 2, 2283, 470, 3, 2, 2, 2, 2284, 2285, 7, 86, 2, 2, 2285, 2286, 7, 81, 2, 2, 2286, 2287, 7, 87, 2, 2, 2287, 2288, 7, 69, 2, 2, 2288, 2289, 7, 74, 2, 2, 2289, 472, 3, 2, 2, 2, 2290, 2291, 7, 86, 2, 2, 2291, 2292, 7, 84, 2, 2, 2292, 2293, 7, 67, 2, 2, 2293, 2294, 7, 75, 2, 2, 2294, 2295, 7, 78, 2, 2, 2295, 2296, 7, 75, 2, 2, 2296, 2297, 7, 80, 2, 2, 2297, 2298, 7, 73, 2, 2, 2298, 474, 3, 2, 2, 2, 2299, 2300, 7, 86, 2, 2, 2300, 2301, 7, 84, 2, 2, 2301, 2302, 7, 67, 2, 2, 2302, 2303, 7, 80, 2, 2, 2303, 2304, 7, 85, 2, 2, 2304, 2305, 7, 67, 2, 2, 2305, 2306, 7, 69, 2, 2, 2306, 2307, 7, 86, 2, 2, 2307, 2308, 7, 75, 2, 2, 2308, 2309, 7, 81, 2, 2, 2309, 2310, 7, 80, 2, 2, 2310, 476, 3, 2, 2, 2, 2311, 2312, 7, 86, 2, 2, 2312, 2313, 7, 84, 2, 2, 2313, 2314, 7, 67, 2, 2, 2314, 2315, 7, 80, 2, 2, 2315, 2316, 7, 85, 2, 2, 2316, 2317, 7, 67, 2, 2, 2317, 2318, 7, 69, 2, 2, 2318, 2319, 7, 86, 2, 2, 2319, 2320, 7, 75, 2, 2, 2320, 2321, 7, 81, 2, 2, 2321, 2322, 7, 80, 2, 2, 2322, 2323, 7, 85, 2, 2, 2323, 478, 3, 2, 2, 2, 2324, 2325, 7, 86, 2, 2, 2325, 2326, 7, 84, 2, 2, 2326, 2327, 7, 67, 2, 2, 2327, 2328, 7, 80, 2, 2, 2328, 2329, 7, 85, 2, 2, 2329, 2330, 7, 72, 2, 2, 2330, 2331, 7, 81, 2, 2, 2331, 2332, 7, 84, 2, 2, 2332, 2333, 7, 79, 2, 2, 2333, 480, 3, 2, 2, 2, 2334, 2335, 7, 86, 2, 2, 2335, 2336, 7, 84, 2, 2, 2336, 2337, 7, 75, 2, 2, 2337, 2338, 7, 79, 2, 2, 2338, 482, 3, 2, 2, 2, 2339, 2340, 7, 86, 2, 2, 2340, 2341, 7, 84, 2, 2, 2341, 2342, 7, 87, 2, 2, 2342, 2343, 7, 71, 2, 2, 2343, 484, 3, 2, 2, 2, 2344, 2345, 7, 86, 2, 2, 2345, 2346, 7, 84, 2, 2, 2346, 2347, 7, 87, 2, 2, 2347, 2348, 7, 80, 2, 2, 2348, 2349, 7, 69, 2, 2, 2349, 2350, 7, 67, 2, 2, 2350, 2351, 7, 86, 2, 2, 2351, 2352, 7, 71, 2, 2, 2352, 486, 3, 2, 2, 2, 2353, 2354, 7, 86, 2, 2, 2354, 2355, 7, 91, 2, 2, 2355, 2356, 7, 82, 2, 2, 2356, 2357, 7, 71, 2, 2, 2357, 488, 3, 2, 2, 2, 2358, 2359, 7, 87, 2, 2, 2359, 2360, 7, 80, 2, 2, 2360, 2361, 7, 67, 2, 2, 2361, 2362, 7, 84, 2, 2, 2362, 2363, 7, 69, 2, 2, 2363, 2364, 7, 74, 2, 2, 2364, 2365, 7, 75, 2, 2, 2365, 2366, 7, 88, 2, 2, 2366, 2367, 7, 71, 2, 2, 2367, 490, 3, 2, 2, 2, 2368, 2369, 7, 87, 2, 2, 2369, 2370, 7, 80, 2, 2, 2370, 2371, 7, 68, 2, 2, 2371, 2372, 7, 81, 2, 2, 2372, 2373, 7, 87, 2, 2, 2373, 2374, 7, 80, 2, 2, 2374, 2375, 7, 70, 2, 2, 2375, 2376, 7, 71, 2, 2, 2376, 2377, 7, 70, 2, 2, 2377, 492, 3, 2, 2, 2, 2378, 2379, 7, 87, 2, 2, 2379, 2380, 7, 80, 2, 2, 2380, 2381, 7, 69, 2, 2, 2381, 2382, 7, 67, 2, 2, 2382, 2383, 7, 69, 2, 2, 2383, 2384, 7, 74, 2, 2, 2384, 2385, 7, 71, 2, 2, 2385, 494, 3, 2, 2, 2, 2386, 2387, 7, 87, 2, 2, 2387, 2388, 7, 80, 2, 2, 2388, 2389, 7, 75, 2, 2, 2389, 2390, 7, 81, 2, 2, 2390, 2391, 7, 80, 2, 2, 2391, 496, 3, 2, 2, 2, 2392, 2393, 7, 87, 2, 2, 2393, 2394, 7, 80, 2, 2, 2394, 2395, 7, 75, 2, 2, 2395, 2396, 7, 83, 2, 2, 2396, 2397, 7, 87, 2, 2, 2397, 2398, 7, 71, 2, 2, 2398, 498, 3, 2, 2, 2, 2399, 2400, 7, 87, 2, 2, 2400, 2401, 7, 80, 2, 2, 2401, 2402, 7, 77, 2, 2, 2402, 2403, 7, 80, 2, 2, 2403, 2404, 7, 81, 2, 2, 2404, 2405, 7, 89, 2, 2, 2405, 2406, 7, 80, 2, 2, 2406, 500, 3, 2, 2, 2, 2407, 2408, 7, 87, 2, 2, 2408, 2409, 7, 80, 2, 2, 2409, 2410, 7, 78, 2, 2, 2410, 2411, 7, 81, 2, 2, 2411, 2412, 7, 69, 2, 2, 2412, 2413, 7, 77, 2, 2, 2413, 502, 3, 2, 2, 2, 2414, 2415, 7, 87, 2, 2, 2415, 2416, 7, 80, 2, 2, 2416, 2417, 7, 85, 2, 2, 2417, 2418, 7, 71, 2, 2, 2418, 2419, 7, 86, 2, 2, 2419, 504, 3, 2, 2, 2, 2420, 2421, 7, 87, 2, 2, 2421, 2422, 7, 82, 2, 2, 2422, 2423, 7, 70, 2, 2, 2423, 2424, 7, 67, 2, 2, 2424, 2425, 7, 86, 2, 2, 2425, 2426, 7, 71, 2, 2, 2426, 506, 3, 2, 2, 2, 2427, 2428, 7, 87, 2, 2, 2428, 2429, 7, 85, 2, 2, 2429, 2430, 7, 71, 2, 2, 2430, 508, 3, 2, 2, 2, 2431, 2432, 7, 87, 2, 2, 2432, 2433, 7, 85, 2, 2, 2433, 2434, 7, 71, 2, 2, 2434, 2435, 7, 84, 2, 2, 2435, 510, 3, 2, 2, 2, 2436, 2437, 7, 87, 2, 2, 2437, 2438, 7, 85, 2, 2, 2438, 2439, 7, 75, 2, 2, 2439, 2440, 7, 80, 2, 2, 2440, 2441, 7, 73, 2, 2, 2441, 512, 3, 2, 2, 2, 2442, 2443, 7, 88, 2, 2, 2443, 2444, 7, 67, 2, 2, 2444, 2445, 7, 78, 2, 2, 2445, 2446, 7, 87, 2, 2, 2446, 2447, 7, 71, 2, 2, 2447, 2448, 7, 85, 2, 2, 2448, 514, 3, 2, 2, 2, 2449, 2450, 7, 88, 2, 2, 2450, 2451, 7, 75, 2, 2, 2451, 2452, 7, 71, 2, 2, 2452, 2453, 7, 89, 2, 2, 2453, 516, 3, 2, 2, 2, 2454, 2455, 7, 88, 2, 2, 2455, 2456, 7, 75, 2, 2, 2456, 2457, 7, 71, 2, 2, 2457, 2458, 7, 89, 2, 2, 2458, 2459, 7, 85, 2, 2, 2459, 518, 3, 2, 2, 2, 2460, 2461, 7, 89, 2, 2, 2461, 2462, 7, 74, 2, 2, 2462, 2463, 7, 71, 2, 2, 2463, 2464, 7, 80, 2, 2, 2464, 520, 3, 2, 2, 2, 2465, 2466, 7, 89, 2, 2, 2466, 2467, 7, 74, 2, 2, 2467, 2468, 7, 71, 2, 2, 2468, 2469, 7, 84, 2, 2, 2469, 2470, 7, 71, 2, 2, 2470, 522, 3, 2, 2, 2, 2471, 2472, 7, 89, 2, 2, 2472, 2473, 7, 75, 2, 2, 2473, 2474, 7, 80, 2, 2, 2474, 2475, 7, 70, 2, 2, 2475, 2476, 7, 81, 2, 2, 2476, 2477, 7, 89, 2, 2, 2477, 524, 3, 2, 2, 2, 2478, 2479, 7, 89, 2, 2, 2479, 2480, 7, 75, 2, 2, 2480, 2481, 7, 86, 2, 2, 2481, 2482, 7, 74, 2, 2, 2482, 526, 3, 2, 2, 2, 2483, 2484, 7, 91, 2, 2, 2484, 2485, 7, 71, 2, 2, 2485, 2486, 7, 67, 2, 2, 2486, 2487, 7, 84, 2, 2, 2487, 528, 3, 2, 2, 2, 2488, 2492, 7, 63, 2, 2, 2489, 2490, 7, 63, 2, 2, 2490, 2492, 7, 63, 2, 2, 2491, 2488, 3, 2, 2, 2, 2491, 2489, 3, 2, 2, 2, 2492, 530, 3, 2, 2, 2, 2493, 2494, 7, 62, 2, 2, 2494, 2495, 7, 63, 2, 2, 2495, 2496, 7, 64, 2, 2, 2496, 532, 3, 2, 2, 2, 2497, 2498, 7, 62, 2, 2, 2498, 2499, 7, 64, 2, 2, 2499, 534, 3, 2, 2, 2, 2500, 2501, 7, 35, 2, 2, 2501, 2502, 7, 63, 2, 2, 2502, 536, 3, 2, 2, 2, 2503, 2504, 7, 62, 2, 2, 2504, 538, 3, 2, 2, 2, 2505, 2506, 7, 62, 2, 2, 2506, 2510, 7, 63, 2, 2, 2507, 2508, 7, 35, 2, 2, 2508, 2510, 7, 64, 2, 2, 2509, 2505, 3, 2, 2, 2, 2509, 2507, 3, 2, 2, 2, 2510, 540, 3, 2, 2, 2, 2511, 2512, 7, 64, 2, 2, 2512, 542, 3, 2, 2, 2, 2513, 2514, 7, 64, 2, 2, 2514, 2518, 7, 63, 2, 2, 2515, 2516, 7, 35, 2, 2, 2516, 2518, 7, 62, 2, 2, 2517, 2513, 3, 2, 2, 2, 2517, 2515, 3, 2, 2, 2, 2518, 544, 3, 2, 2, 2, 2519, 2520, 7, 45, 2, 2, 2520, 546, 3, 2, 2, 2, 2521, 2522, 7, 47, 2, 2, 2522, 548, 3, 2, 2, 2, 2523, 2524, 7, 44, 2, 2, 2524, 550, 3, 2, 2, 2, 2525, 2526, 7, 49, 2, 2, 2526, 552, 3, 2, 2, 2, 2527, 2528, 7, 39, 2, 2, 2528, 554, 3, 2, 2, 2, 2529, 2530, 7, 70, 2, 2, 2530, 2531, 7, 75, 2, 2, 2531, 2532, 7, 88, 2, 2, 2532, 556, 3, 2, 2, 2, 2533, 2534, 7, 128, 2, 2, 2534, 558, 3, 2, 2, 2, 2535, 2536, 7, 40, 2, 2, 2536, 560, 3, 2, 2, 2, 2537, 2538, 7, 126, 2, 2, 2538, 562, 3, 2, 2, 2, 2539, 2540, 7, 126, 2, 2, 2540, 2541, 7, 126, 2, 2, 2541, 564, 3, 2, 2, 2, 2542, 2543, 7, 96, 2, 2, 2543, 566, 3, 2, 2, 2, 2544, 2550, 7, 41, 2, 2, 2545, 2549, 10, 2, 2, 2, 2546, 2547, 7, 94, 2, 2, 2547, 2549, 11, 2, 2, 2, 2548, 2545, 3, 2, 2, 2, 2548, 2546, 3, 2, 2, 2, 2549, 2552, 3, 2, 2, 2, 2550, 2548, 3, 2, 2, 2, 2550, 2551, 3, 2, 2, 2, 2551, 2553, 3, 2, 2, 2, 2552, 2550, 3, 2, 2, 2, 2553, 2565, 7, 41, 2, 2, 2554, 2560, 7, 36, 2, 2, 2555, 2559, 10, 3, 2, 2, 2556, 2557, 7, 94, 2, 2, 2557, 2559, 11, 2, 2, 2, 2558, 2555, 3, 2, 2, 2, 2558, 2556, 3, 2, 2, 2, 2559, 2562, 3, 2, 2, 2, 2560, 2558, 3, 2, 2, 2, 2560, 2561, 3, 2, 2, 2, 2561, 2563, 3, 2, 2, 2, 2562, 2560, 3, 2, 2, 2, 2563, 2565, 7, 36, 2, 2, 2564, 2544, 3, 2, 2, 2, 2564, 2554, 3, 2, 2, 2, 2565, 568, 3, 2, 2, 2, 2566, 2568, 5, 593, 297, 2, 2567, 2566, 3, 2, 2, 2, 2568, 2569, 3, 2, 2, 2, 2569, 2567, 3, 2, 2, 2, 2569, 2570, 3, 2, 2, 2, 2570, 2571, 3, 2, 2, 2, 2571, 2572, 7, 78, 2, 2, 2572, 570, 3, 2, 2, 2, 2573, 2575, 5, 593, 297, 2, 2574, 2573, 3, 2, 2, 2, 2575, 2576, 3, 2, 2, 2, 2576, 2574, 3, 2, 2, 2, 2576, 2577, 3, 2, 2, 2, 2577, 2578, 3, 2, 2, 2, 2578, 2579, 7, 85, 2, 2, 2579, 572, 3, 2, 2, 2, 2580, 2582, 5, 593, 297, 2, 2581, 2580, 3, 2, 2, 2, 2582, 2583, 3, 2, 2, 2, 2583, 2581, 3, 2, 2, 2, 2583, 2584, 3, 2, 2, 2, 2584, 2585, 3, 2, 2, 2, 2585, 2586, 7, 91, 2, 2, 2586, 574, 3, 2, 2, 2, 2587, 2589, 5, 593, 297, 2, 2588, 2587, 3, 2, 2, 2, 2589, 2590, 3, 2, 2, 2, 2590, 2588, 3, 2, 2, 2, 2590, 2591, 3, 2, 2, 2, 2591, 576, 3, 2, 2, 2, 2592, 2594, 5, 593, 297, 2, 2593, 2592, 3, 2, 2, 2, 2594, 2595, 3, 2, 2, 2, 2595, 2593, 3, 2, 2, 2, 2595, 2596, 3, 2, 2, 2, 2596, 2597, 3, 2, 2, 2, 2597, 2598, 5, 591, 296, 2, 2598, 2604, 3, 2, 2, 2, 2599, 2600, 5, 589, 295, 2, 2600, 2601, 5, 591, 296, 2, 2601, 2602, 6, 289, 2, 2, 2602, 2604, 3, 2, 2, 2, 2603, 2593, 3, 2, 2, 2, 2603, 2599, 3, 2, 2, 2, 2604, 578, 3, 2, 2, 2, 2605, 2606, 5, 589, 295, 2, 2606, 2607, 6, 290, 3, 2, 2607, 580, 3, 2, 2, 2, 2608, 2610, 5, 593, 297, 2, 2609, 2608, 3, 2, 2, 2, 2610, 2611, 3, 2, 2, 2, 2611, 2609, 3, 2, 2, 2, 2611, 2612, 3, 2, 2, 2, 2612, 2614, 3, 2, 2, 2, 2613, 2615, 5, 591, 296, 2, 2614, 2613, 3, 2, 2, 2, 2614, 2615, 3, 2, 2, 2, 2615, 2616, 3, 2, 2, 2, 2616, 2617, 7, 70, 2, 2, 2617, 2626, 3, 2, 2, 2, 2618, 2620, 5, 589, 295, 2, 2619, 2621, 5, 591, 296, 2, 2620, 2619, 3, 2, 2, 2, 2620, 2621, 3, 2, 2, 2, 2621, 2622, 3, 2, 2, 2, 2622, 2623, 7, 70, 2, 2, 2623, 2624, 6, 291, 4, 2, 2624, 2626, 3, 2, 2, 2, 2625, 2609, 3, 2, 2, 2, 2625, 2618, 3, 2, 2, 2, 2626, 582, 3, 2, 2, 2, 2627, 2629, 5, 593, 297, 2, 2628, 2627, 3, 2, 2, 2, 2629, 2630, 3, 2, 2, 2, 2630, 2628, 3, 2, 2, 2, 2630, 2631, 3, 2, 2, 2, 2631, 2633, 3, 2, 2, 2, 2632, 2634, 5, 591, 296, 2, 2633, 2632, 3, 2, 2, 2, 2633, 2634, 3, 2, 2, 2, 2634, 2635, 3, 2, 2, 2, 2635, 2636, 7, 68, 2, 2, 2636, 2637, 7, 70, 2, 2, 2637, 2648, 3, 2, 2, 2, 2638, 2640, 5, 589, 295, 2, 2639, 2641, 5, 591, 296, 2, 2640, 2639, 3, 2, 2, 2, 2640, 2641, 3, 2, 2, 2, 2641, 2642, 3, 2, 2, 2, 2642, 2643, 7, 68, 2, 2, 2643, 2644, 7, 70, 2, 2, 2644, 2645, 3, 2, 2, 2, 2645, 2646, 6, 292, 5, 2, 2646, 2648, 3, 2, 2, 2, 2647, 2628, 3, 2, 2, 2, 2647, 2638, 3, 2, 2, 2, 2648, 584, 3, 2, 2, 2, 2649, 2653, 5, 595, 298, 2, 2650, 2653, 5, 593, 297, 2, 2651, 2653, 7, 97, 2, 2, 2652, 2649, 3, 2, 2, 2, 2652, 2650, 3, 2, 2, 2, 2652, 2651, 3, 2, 2, 2, 2653, 2654, 3, 2, 2, 2, 2654, 2652, 3, 2, 2, 2, 2654, 2655, 3, 2, 2, 2, 2655, 586, 3, 2, 2, 2, 2656, 2662, 7, 98, 2, 2, 2657, 2661, 10, 4, 2, 2, 2658, 2659, 7, 98, 2, 2, 2659, 2661, 7, 98, 2, 2, 2660, 2657, 3, 2, 2, 2, 2660, 2658, 3, 2, 2, 2, 2661, 2664, 3, 2, 2, 2, 2662, 2660, 3, 2, 2, 2, 2662, 2663, 3, 2, 2, 2, 2663, 2665, 3, 2, 2, 2, 2664, 2662, 3, 2, 2, 2, 2665, 2666, 7, 98, 2, 2, 2666, 588, 3, 2, 2, 2, 2667, 2669, 5, 593, 297, 2, 2668, 2667, 3, 2, 2, 2, 2669, 2670, 3, 2, 2, 2, 2670, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2676, 7, 48, 2, 2, 2673, 2675, 5, 593, 297, 2, 2674, 2673, 3, 2, 2, 2, 2675, 2678, 3, 2, 2, 2, 2676, 2674, 3, 2, 2, 2, 2676, 2677, 3, 2, 2, 2, 2677, 2686, 3, 2, 2, 2, 2678, 2676, 3, 2, 2, 2, 2679, 2681, 7, 48, 2, 2, 2680, 2682, 5, 593, 297, 2, 2681, 2680, 3, 2, 2, 2, 2682, 2683, 3, 2, 2, 2, 2683, 2681, 3, 2, 2, 2, 2683, 2684, 3, 2, 2, 2, 2684, 2686, 3, 2, 2, 2, 2685, 2668, 3, 2, 2, 2, 2685, 2679, 3, 2, 2, 2, 2686, 590, 3, 2, 2, 2, 2687, 2689, 7, 71, 2, 2, 2688, 2690, 9, 5, 2, 2, 2689, 2688, 3, 2, 2, 2, 2689, 2690, 3, 2, 2, 2, 2690, 2692, 3, 2, 2, 2, 2691, 2693, 5, 593, 297, 2, 2692, 2691, 3, 2, 2, 2, 2693, 2694, 3, 2, 2, 2, 2694, 2692, 3, 2, 2, 2, 2694, 2695, 3, 2, 2, 2, 2695, 592, 3, 2, 2, 2, 2696, 2697, 9, 6, 2, 2, 2697, 594, 3, 2, 2, 2, 2698, 2699, 9, 7, 2, 2, 2699, 596, 3, 2, 2, 2, 2700, 2701, 7, 47, 2, 2, 2701, 2702, 7, 47, 2, 2, 2702, 2706, 3, 2, 2, 2, 2703, 2705, 10, 8, 2, 2, 2704, 2703, 3, 2, 2, 2, 2705, 2708, 3, 2, 2, 2, 2706, 2704, 3, 2, 2, 2, 2706, 2707, 3, 2, 2, 2, 2707, 2710, 3, 2, 2, 2, 2708, 2706, 3, 2, 2, 2, 2709, 2711, 7, 15, 2, 2, 2710, 2709, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2713, 3, 2, 2, 2, 2712, 2714, 7, 12, 2, 2, 2713, 2712, 3, 2, 2, 2, 2713, 2714, 3, 2, 2, 2, 2714, 2715, 3, 2, 2, 2, 2715, 2716, 8, 299, 2, 2, 2716, 598, 3, 2, 2, 2, 2717, 2718, 7, 49, 2, 2, 2718, 2719, 7, 44, 2, 2, 2719, 2720, 3, 2, 2, 2, 2720, 2725, 6, 300, 6, 2, 2721, 2724, 5, 599, 300, 2, 2722, 2724, 11, 2, 2, 2, 2723, 2721, 3, 2, 2, 2, 2723, 2722, 3, 2, 2, 2, 2724, 2727, 3, 2, 2, 2, 2725, 2726, 3, 2, 2, 2, 2725, 2723, 3, 2, 2, 2, 2726, 2728, 3, 2, 2, 2, 2727, 2725, 3, 2, 2, 2, 2728, 2729, 7, 44, 2, 2, 2729, 2730, 7, 49, 2, 2, 2730, 2731, 3, 2, 2, 2, 2731, 2732, 8, 300, 2, 2, 2732, 600, 3, 2, 2, 2, 2733, 2735, 9, 9, 2, 2, 2734, 2733, 3, 2, 2, 2, 2735, 2736, 3, 2, 2, 2, 2736, 2734, 3, 2, 2, 2, 2736, 2737, 3, 2, 2, 2, 2737, 2738, 3, 2, 2, 2, 2738, 2739, 8, 301, 2, 2, 2739, 602, 3, 2, 2, 2, 2740, 2741, 11, 2, 2, 2, 2741, 604, 3, 2, 2, 2, 45, 2, 1028, 1655, 2001, 2263, 2491, 2509, 2517, 2548, 2550, 2558, 2560, 2564, 2569, 2576, 2583, 2590, 2595, 2603, 2611, 2614, 2620, 2625, 2630, 2633, 2640, 2647, 2652, 2654, 2660, 2662, 2670, 2676, 2683, 2685, 2689, 2694, 2706, 2710, 2713, 2723, 2725, 2736, 3, 2, 3, 2] \ No newline at end of file diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.py b/pysparkling/sql/ast/generated/SqlBaseLexer.py new file mode 100644 index 000000000..1dcbd240a --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.py @@ -0,0 +1,1878 @@ +# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u012b") + buf.write("\u0ab6\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\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") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") + buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") + buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") + buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") + buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") + buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") + buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") + buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") + buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") + buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") + buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") + buf.write("\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083") + buf.write("\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087") + buf.write("\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a") + buf.write("\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e") + buf.write("\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091") + buf.write("\4\u0092\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095") + buf.write("\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098\t\u0098") + buf.write("\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b\4\u009c") + buf.write("\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f") + buf.write("\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3") + buf.write("\t\u00a3\4\u00a4\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6") + buf.write("\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9\t\u00a9\4\u00aa") + buf.write("\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad") + buf.write("\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1") + buf.write("\t\u00b1\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4") + buf.write("\4\u00b5\t\u00b5\4\u00b6\t\u00b6\4\u00b7\t\u00b7\4\u00b8") + buf.write("\t\u00b8\4\u00b9\t\u00b9\4\u00ba\t\u00ba\4\u00bb\t\u00bb") + buf.write("\4\u00bc\t\u00bc\4\u00bd\t\u00bd\4\u00be\t\u00be\4\u00bf") + buf.write("\t\u00bf\4\u00c0\t\u00c0\4\u00c1\t\u00c1\4\u00c2\t\u00c2") + buf.write("\4\u00c3\t\u00c3\4\u00c4\t\u00c4\4\u00c5\t\u00c5\4\u00c6") + buf.write("\t\u00c6\4\u00c7\t\u00c7\4\u00c8\t\u00c8\4\u00c9\t\u00c9") + buf.write("\4\u00ca\t\u00ca\4\u00cb\t\u00cb\4\u00cc\t\u00cc\4\u00cd") + buf.write("\t\u00cd\4\u00ce\t\u00ce\4\u00cf\t\u00cf\4\u00d0\t\u00d0") + buf.write("\4\u00d1\t\u00d1\4\u00d2\t\u00d2\4\u00d3\t\u00d3\4\u00d4") + buf.write("\t\u00d4\4\u00d5\t\u00d5\4\u00d6\t\u00d6\4\u00d7\t\u00d7") + buf.write("\4\u00d8\t\u00d8\4\u00d9\t\u00d9\4\u00da\t\u00da\4\u00db") + buf.write("\t\u00db\4\u00dc\t\u00dc\4\u00dd\t\u00dd\4\u00de\t\u00de") + buf.write("\4\u00df\t\u00df\4\u00e0\t\u00e0\4\u00e1\t\u00e1\4\u00e2") + buf.write("\t\u00e2\4\u00e3\t\u00e3\4\u00e4\t\u00e4\4\u00e5\t\u00e5") + buf.write("\4\u00e6\t\u00e6\4\u00e7\t\u00e7\4\u00e8\t\u00e8\4\u00e9") + buf.write("\t\u00e9\4\u00ea\t\u00ea\4\u00eb\t\u00eb\4\u00ec\t\u00ec") + buf.write("\4\u00ed\t\u00ed\4\u00ee\t\u00ee\4\u00ef\t\u00ef\4\u00f0") + buf.write("\t\u00f0\4\u00f1\t\u00f1\4\u00f2\t\u00f2\4\u00f3\t\u00f3") + buf.write("\4\u00f4\t\u00f4\4\u00f5\t\u00f5\4\u00f6\t\u00f6\4\u00f7") + buf.write("\t\u00f7\4\u00f8\t\u00f8\4\u00f9\t\u00f9\4\u00fa\t\u00fa") + buf.write("\4\u00fb\t\u00fb\4\u00fc\t\u00fc\4\u00fd\t\u00fd\4\u00fe") + buf.write("\t\u00fe\4\u00ff\t\u00ff\4\u0100\t\u0100\4\u0101\t\u0101") + buf.write("\4\u0102\t\u0102\4\u0103\t\u0103\4\u0104\t\u0104\4\u0105") + buf.write("\t\u0105\4\u0106\t\u0106\4\u0107\t\u0107\4\u0108\t\u0108") + buf.write("\4\u0109\t\u0109\4\u010a\t\u010a\4\u010b\t\u010b\4\u010c") + buf.write("\t\u010c\4\u010d\t\u010d\4\u010e\t\u010e\4\u010f\t\u010f") + buf.write("\4\u0110\t\u0110\4\u0111\t\u0111\4\u0112\t\u0112\4\u0113") + buf.write("\t\u0113\4\u0114\t\u0114\4\u0115\t\u0115\4\u0116\t\u0116") + buf.write("\4\u0117\t\u0117\4\u0118\t\u0118\4\u0119\t\u0119\4\u011a") + buf.write("\t\u011a\4\u011b\t\u011b\4\u011c\t\u011c\4\u011d\t\u011d") + buf.write("\4\u011e\t\u011e\4\u011f\t\u011f\4\u0120\t\u0120\4\u0121") + buf.write("\t\u0121\4\u0122\t\u0122\4\u0123\t\u0123\4\u0124\t\u0124") + buf.write("\4\u0125\t\u0125\4\u0126\t\u0126\4\u0127\t\u0127\4\u0128") + buf.write("\t\u0128\4\u0129\t\u0129\4\u012a\t\u012a\4\u012b\t\u012b") + buf.write("\4\u012c\t\u012c\4\u012d\t\u012d\4\u012e\t\u012e\3\2\3") + buf.write("\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\7\3\b") + buf.write("\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r") + buf.write("\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17") + buf.write("\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21") + buf.write("\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27") + buf.write("\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3") + buf.write(" \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"") + buf.write("\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3") + buf.write("%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3") + buf.write("(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write("*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3") + buf.write("+\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3") + buf.write(".\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3") + buf.write("\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62") + buf.write("\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63") + buf.write("\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64") + buf.write("\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67") + buf.write("\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3") + buf.write(":\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3;\3") + buf.write(";\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3") + buf.write("<\3<\3<\3<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3") + buf.write(">\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3") + buf.write("@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\5@\u0405\n@\3A\3A\3A\3") + buf.write("A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3") + buf.write("C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3") + buf.write("E\3E\3E\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3") + buf.write("H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3") + buf.write("J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3") + buf.write("L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3") + buf.write("N\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3") + buf.write("Q\3Q\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3") + buf.write("T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3") + buf.write("V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3") + buf.write("X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3") + buf.write("[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]") + buf.write("\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3_\3_\3") + buf.write("_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3") + buf.write("b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3") + buf.write("d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3") + buf.write("g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3h\3h\3") + buf.write("i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3") + buf.write("k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3n\3") + buf.write("n\3n\3n\3n\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3") + buf.write("q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3") + buf.write("t\3t\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3v\3v\3w\3w\3w\3") + buf.write("w\3w\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3x\3x\3y\3y\3") + buf.write("y\3y\3y\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\3z\3z\3z\3z\3{\3") + buf.write("{\3{\3{\3{\3|\3|\3|\3}\3}\3}\3}\3}\3}\3~\3~\3~\3~\3~\3") + buf.write("\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3") + buf.write("\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081") + buf.write("\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082") + buf.write("\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083") + buf.write("\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084") + buf.write("\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086") + buf.write("\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087") + buf.write("\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088") + buf.write("\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a") + buf.write("\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b") + buf.write("\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b") + buf.write("\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d") + buf.write("\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e") + buf.write("\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f") + buf.write("\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090") + buf.write("\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091") + buf.write("\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092") + buf.write("\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093") + buf.write("\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094") + buf.write("\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096") + buf.write("\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096") + buf.write("\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097") + buf.write("\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098") + buf.write("\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099") + buf.write("\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a") + buf.write("\u0678\n\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b") + buf.write("\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d") + buf.write("\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f") + buf.write("\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0") + buf.write("\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1") + buf.write("\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2") + buf.write("\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a4") + buf.write("\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5") + buf.write("\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6") + buf.write("\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6") + buf.write("\3\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8") + buf.write("\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8") + buf.write("\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9") + buf.write("\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa") + buf.write("\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab") + buf.write("\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab") + buf.write("\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac") + buf.write("\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad") + buf.write("\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad") + buf.write("\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae") + buf.write("\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af") + buf.write("\3\u00af\3\u00af\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0") + buf.write("\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1") + buf.write("\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b2") + buf.write("\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2") + buf.write("\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b3") + buf.write("\3\u00b3\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4") + buf.write("\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4") + buf.write("\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5") + buf.write("\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6") + buf.write("\3\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7") + buf.write("\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8") + buf.write("\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9") + buf.write("\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9") + buf.write("\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba") + buf.write("\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00bb") + buf.write("\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb") + buf.write("\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc") + buf.write("\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd") + buf.write("\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00be\3\u00be\3\u00be") + buf.write("\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf") + buf.write("\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00c0\3\u00c0") + buf.write("\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c1\3\u00c1") + buf.write("\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c2") + buf.write("\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c3\3\u00c3") + buf.write("\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3") + buf.write("\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4") + buf.write("\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c6") + buf.write("\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6") + buf.write("\3\u00c6\3\u00c6\3\u00c6\5\u00c6\u07d2\n\u00c6\3\u00c7") + buf.write("\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c8\3\u00c8\3\u00c8") + buf.write("\3\u00c8\3\u00c8\3\u00c8\3\u00c9\3\u00c9\3\u00c9\3\u00c9") + buf.write("\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00ca\3\u00ca") + buf.write("\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00cb\3\u00cb") + buf.write("\3\u00cb\3\u00cb\3\u00cc\3\u00cc\3\u00cc\3\u00cc\3\u00cc") + buf.write("\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd") + buf.write("\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce") + buf.write("\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf") + buf.write("\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d1\3\u00d1") + buf.write("\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1") + buf.write("\3\u00d1\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2") + buf.write("\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3") + buf.write("\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3") + buf.write("\3\u00d3\3\u00d3\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4") + buf.write("\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4") + buf.write("\3\u00d4\3\u00d5\3\u00d5\3\u00d5\3\u00d5\3\u00d6\3\u00d6") + buf.write("\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d7\3\u00d7\3\u00d7") + buf.write("\3\u00d7\3\u00d7\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8") + buf.write("\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9") + buf.write("\3\u00da\3\u00da\3\u00da\3\u00da\3\u00da\3\u00db\3\u00db") + buf.write("\3\u00db\3\u00db\3\u00db\3\u00dc\3\u00dc\3\u00dc\3\u00dc") + buf.write("\3\u00dc\3\u00dc\3\u00dc\3\u00dd\3\u00dd\3\u00dd\3\u00dd") + buf.write("\3\u00dd\3\u00dd\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de") + buf.write("\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00df") + buf.write("\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00e0") + buf.write("\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0") + buf.write("\3\u00e0\3\u00e1\3\u00e1\3\u00e1\3\u00e1\3\u00e1\3\u00e1") + buf.write("\3\u00e1\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2") + buf.write("\3\u00e2\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e3") + buf.write("\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e4\3\u00e4\3\u00e4") + buf.write("\3\u00e4\3\u00e4\3\u00e4\3\u00e5\3\u00e5\3\u00e5\3\u00e5") + buf.write("\3\u00e5\3\u00e5\3\u00e5\3\u00e6\3\u00e6\3\u00e6\3\u00e6") + buf.write("\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6") + buf.write("\3\u00e6\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7") + buf.write("\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7") + buf.write("\3\u00e7\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8") + buf.write("\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8") + buf.write("\5\u00e8\u08d8\n\u00e8\3\u00e9\3\u00e9\3\u00e9\3\u00e9") + buf.write("\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9") + buf.write("\3\u00ea\3\u00ea\3\u00ea\3\u00ea\3\u00ea\3\u00eb\3\u00eb") + buf.write("\3\u00eb\3\u00ec\3\u00ec\3\u00ec\3\u00ec\3\u00ec\3\u00ec") + buf.write("\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed") + buf.write("\3\u00ed\3\u00ed\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee") + buf.write("\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee") + buf.write("\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef") + buf.write("\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00f0") + buf.write("\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0") + buf.write("\3\u00f0\3\u00f0\3\u00f1\3\u00f1\3\u00f1\3\u00f1\3\u00f1") + buf.write("\3\u00f2\3\u00f2\3\u00f2\3\u00f2\3\u00f2\3\u00f3\3\u00f3") + buf.write("\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3") + buf.write("\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f5\3\u00f5") + buf.write("\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5") + buf.write("\3\u00f5\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f6") + buf.write("\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f7\3\u00f7\3\u00f7") + buf.write("\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f8\3\u00f8") + buf.write("\3\u00f8\3\u00f8\3\u00f8\3\u00f8\3\u00f9\3\u00f9\3\u00f9") + buf.write("\3\u00f9\3\u00f9\3\u00f9\3\u00f9\3\u00fa\3\u00fa\3\u00fa") + buf.write("\3\u00fa\3\u00fa\3\u00fa\3\u00fa\3\u00fa\3\u00fb\3\u00fb") + buf.write("\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fc\3\u00fc") + buf.write("\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fd\3\u00fd\3\u00fd") + buf.write("\3\u00fd\3\u00fd\3\u00fd\3\u00fd\3\u00fe\3\u00fe\3\u00fe") + buf.write("\3\u00fe\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u0100") + buf.write("\3\u0100\3\u0100\3\u0100\3\u0100\3\u0100\3\u0101\3\u0101") + buf.write("\3\u0101\3\u0101\3\u0101\3\u0101\3\u0101\3\u0102\3\u0102") + buf.write("\3\u0102\3\u0102\3\u0102\3\u0103\3\u0103\3\u0103\3\u0103") + buf.write("\3\u0103\3\u0103\3\u0104\3\u0104\3\u0104\3\u0104\3\u0104") + buf.write("\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0106") + buf.write("\3\u0106\3\u0106\3\u0106\3\u0106\3\u0106\3\u0106\3\u0107") + buf.write("\3\u0107\3\u0107\3\u0107\3\u0107\3\u0108\3\u0108\3\u0108") + buf.write("\3\u0108\3\u0108\3\u0109\3\u0109\3\u0109\5\u0109\u09bc") + buf.write("\n\u0109\3\u010a\3\u010a\3\u010a\3\u010a\3\u010b\3\u010b") + buf.write("\3\u010b\3\u010c\3\u010c\3\u010c\3\u010d\3\u010d\3\u010e") + buf.write("\3\u010e\3\u010e\3\u010e\5\u010e\u09ce\n\u010e\3\u010f") + buf.write("\3\u010f\3\u0110\3\u0110\3\u0110\3\u0110\5\u0110\u09d6") + buf.write("\n\u0110\3\u0111\3\u0111\3\u0112\3\u0112\3\u0113\3\u0113") + buf.write("\3\u0114\3\u0114\3\u0115\3\u0115\3\u0116\3\u0116\3\u0116") + buf.write("\3\u0116\3\u0117\3\u0117\3\u0118\3\u0118\3\u0119\3\u0119") + buf.write("\3\u011a\3\u011a\3\u011a\3\u011b\3\u011b\3\u011c\3\u011c") + buf.write("\3\u011c\3\u011c\7\u011c\u09f5\n\u011c\f\u011c\16\u011c") + buf.write("\u09f8\13\u011c\3\u011c\3\u011c\3\u011c\3\u011c\3\u011c") + buf.write("\7\u011c\u09ff\n\u011c\f\u011c\16\u011c\u0a02\13\u011c") + buf.write("\3\u011c\5\u011c\u0a05\n\u011c\3\u011d\6\u011d\u0a08\n") + buf.write("\u011d\r\u011d\16\u011d\u0a09\3\u011d\3\u011d\3\u011e") + buf.write("\6\u011e\u0a0f\n\u011e\r\u011e\16\u011e\u0a10\3\u011e") + buf.write("\3\u011e\3\u011f\6\u011f\u0a16\n\u011f\r\u011f\16\u011f") + buf.write("\u0a17\3\u011f\3\u011f\3\u0120\6\u0120\u0a1d\n\u0120\r") + buf.write("\u0120\16\u0120\u0a1e\3\u0121\6\u0121\u0a22\n\u0121\r") + buf.write("\u0121\16\u0121\u0a23\3\u0121\3\u0121\3\u0121\3\u0121") + buf.write("\3\u0121\3\u0121\5\u0121\u0a2c\n\u0121\3\u0122\3\u0122") + buf.write("\3\u0122\3\u0123\6\u0123\u0a32\n\u0123\r\u0123\16\u0123") + buf.write("\u0a33\3\u0123\5\u0123\u0a37\n\u0123\3\u0123\3\u0123\3") + buf.write("\u0123\3\u0123\5\u0123\u0a3d\n\u0123\3\u0123\3\u0123\3") + buf.write("\u0123\5\u0123\u0a42\n\u0123\3\u0124\6\u0124\u0a45\n\u0124") + buf.write("\r\u0124\16\u0124\u0a46\3\u0124\5\u0124\u0a4a\n\u0124") + buf.write("\3\u0124\3\u0124\3\u0124\3\u0124\3\u0124\5\u0124\u0a51") + buf.write("\n\u0124\3\u0124\3\u0124\3\u0124\3\u0124\3\u0124\5\u0124") + buf.write("\u0a58\n\u0124\3\u0125\3\u0125\3\u0125\6\u0125\u0a5d\n") + buf.write("\u0125\r\u0125\16\u0125\u0a5e\3\u0126\3\u0126\3\u0126") + buf.write("\3\u0126\7\u0126\u0a65\n\u0126\f\u0126\16\u0126\u0a68") + buf.write("\13\u0126\3\u0126\3\u0126\3\u0127\6\u0127\u0a6d\n\u0127") + buf.write("\r\u0127\16\u0127\u0a6e\3\u0127\3\u0127\7\u0127\u0a73") + buf.write("\n\u0127\f\u0127\16\u0127\u0a76\13\u0127\3\u0127\3\u0127") + buf.write("\6\u0127\u0a7a\n\u0127\r\u0127\16\u0127\u0a7b\5\u0127") + buf.write("\u0a7e\n\u0127\3\u0128\3\u0128\5\u0128\u0a82\n\u0128\3") + buf.write("\u0128\6\u0128\u0a85\n\u0128\r\u0128\16\u0128\u0a86\3") + buf.write("\u0129\3\u0129\3\u012a\3\u012a\3\u012b\3\u012b\3\u012b") + buf.write("\3\u012b\7\u012b\u0a91\n\u012b\f\u012b\16\u012b\u0a94") + buf.write("\13\u012b\3\u012b\5\u012b\u0a97\n\u012b\3\u012b\5\u012b") + buf.write("\u0a9a\n\u012b\3\u012b\3\u012b\3\u012c\3\u012c\3\u012c") + buf.write("\3\u012c\3\u012c\3\u012c\7\u012c\u0aa4\n\u012c\f\u012c") + buf.write("\16\u012c\u0aa7\13\u012c\3\u012c\3\u012c\3\u012c\3\u012c") + buf.write("\3\u012c\3\u012d\6\u012d\u0aaf\n\u012d\r\u012d\16\u012d") + buf.write("\u0ab0\3\u012d\3\u012d\3\u012e\3\u012e\3\u0aa5\2\u012f") + buf.write("\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31") + buf.write("\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31") + buf.write("\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O") + buf.write(")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;") + buf.write("u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b") + buf.write("G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b") + buf.write("O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab") + buf.write("W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb") + buf.write("_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cb") + buf.write("g\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db") + buf.write("o\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00eb") + buf.write("w\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb") + buf.write("\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105") + buf.write("\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d\u0088") + buf.write("\u010f\u0089\u0111\u008a\u0113\u008b\u0115\u008c\u0117") + buf.write("\u008d\u0119\u008e\u011b\u008f\u011d\u0090\u011f\u0091") + buf.write("\u0121\u0092\u0123\u0093\u0125\u0094\u0127\u0095\u0129") + buf.write("\u0096\u012b\u0097\u012d\u0098\u012f\u0099\u0131\u009a") + buf.write("\u0133\u009b\u0135\u009c\u0137\u009d\u0139\u009e\u013b") + buf.write("\u009f\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143\u00a3") + buf.write("\u0145\u00a4\u0147\u00a5\u0149\u00a6\u014b\u00a7\u014d") + buf.write("\u00a8\u014f\u00a9\u0151\u00aa\u0153\u00ab\u0155\u00ac") + buf.write("\u0157\u00ad\u0159\u00ae\u015b\u00af\u015d\u00b0\u015f") + buf.write("\u00b1\u0161\u00b2\u0163\u00b3\u0165\u00b4\u0167\u00b5") + buf.write("\u0169\u00b6\u016b\u00b7\u016d\u00b8\u016f\u00b9\u0171") + buf.write("\u00ba\u0173\u00bb\u0175\u00bc\u0177\u00bd\u0179\u00be") + buf.write("\u017b\u00bf\u017d\u00c0\u017f\u00c1\u0181\u00c2\u0183") + buf.write("\u00c3\u0185\u00c4\u0187\u00c5\u0189\u00c6\u018b\u00c7") + buf.write("\u018d\u00c8\u018f\u00c9\u0191\u00ca\u0193\u00cb\u0195") + buf.write("\u00cc\u0197\u00cd\u0199\u00ce\u019b\u00cf\u019d\u00d0") + buf.write("\u019f\u00d1\u01a1\u00d2\u01a3\u00d3\u01a5\u00d4\u01a7") + buf.write("\u00d5\u01a9\u00d6\u01ab\u00d7\u01ad\u00d8\u01af\u00d9") + buf.write("\u01b1\u00da\u01b3\u00db\u01b5\u00dc\u01b7\u00dd\u01b9") + buf.write("\u00de\u01bb\u00df\u01bd\u00e0\u01bf\u00e1\u01c1\u00e2") + buf.write("\u01c3\u00e3\u01c5\u00e4\u01c7\u00e5\u01c9\u00e6\u01cb") + buf.write("\u00e7\u01cd\u00e8\u01cf\u00e9\u01d1\u00ea\u01d3\u00eb") + buf.write("\u01d5\u00ec\u01d7\u00ed\u01d9\u00ee\u01db\u00ef\u01dd") + buf.write("\u00f0\u01df\u00f1\u01e1\u00f2\u01e3\u00f3\u01e5\u00f4") + buf.write("\u01e7\u00f5\u01e9\u00f6\u01eb\u00f7\u01ed\u00f8\u01ef") + buf.write("\u00f9\u01f1\u00fa\u01f3\u00fb\u01f5\u00fc\u01f7\u00fd") + buf.write("\u01f9\u00fe\u01fb\u00ff\u01fd\u0100\u01ff\u0101\u0201") + buf.write("\u0102\u0203\u0103\u0205\u0104\u0207\u0105\u0209\u0106") + buf.write("\u020b\u0107\u020d\u0108\u020f\u0109\u0211\u010a\u0213") + buf.write("\u010b\u0215\u010c\u0217\u010d\u0219\u010e\u021b\u010f") + buf.write("\u021d\u0110\u021f\u0111\u0221\u0112\u0223\u0113\u0225") + buf.write("\u0114\u0227\u0115\u0229\u0116\u022b\u0117\u022d\u0118") + buf.write("\u022f\u0119\u0231\u011a\u0233\u011b\u0235\u011c\u0237") + buf.write("\u011d\u0239\u011e\u023b\u011f\u023d\u0120\u023f\u0121") + buf.write("\u0241\u0122\u0243\u0123\u0245\u0124\u0247\u0125\u0249") + buf.write("\u0126\u024b\u0127\u024d\2\u024f\2\u0251\2\u0253\2\u0255") + buf.write("\u0128\u0257\u0129\u0259\u012a\u025b\u012b\3\2\n\4\2)") + buf.write(")^^\4\2$$^^\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f\f\17\17") + buf.write("\5\2\13\f\17\17\"\"\2\u0adc\2\3\3\2\2\2\2\5\3\2\2\2\2") + buf.write("\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") + buf.write("\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") + buf.write("\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") + buf.write("\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2") + buf.write("\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") + buf.write("\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") + buf.write("\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2") + buf.write("\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3") + buf.write("\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y") + buf.write("\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2") + buf.write("c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2") + buf.write("\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2") + buf.write("\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3") + buf.write("\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2") + buf.write("\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d") + buf.write("\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2") + buf.write("\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b") + buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") + buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") + buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") + buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") + buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") + buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") + buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") + buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") + buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") + buf.write("\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1") + buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2") + buf.write("\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef") + buf.write("\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2") + buf.write("\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd") + buf.write("\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2") + buf.write("\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b") + buf.write("\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2") + buf.write("\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119") + buf.write("\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2") + buf.write("\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127") + buf.write("\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2") + buf.write("\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135") + buf.write("\3\2\2\2\2\u0137\3\2\2\2\2\u0139\3\2\2\2\2\u013b\3\2\2") + buf.write("\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2\2\2\u0143") + buf.write("\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2") + buf.write("\2\2\u014b\3\2\2\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0151") + buf.write("\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2") + buf.write("\2\2\u0159\3\2\2\2\2\u015b\3\2\2\2\2\u015d\3\2\2\2\2\u015f") + buf.write("\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2\2\2\u0165\3\2\2") + buf.write("\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016b\3\2\2\2\2\u016d") + buf.write("\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\2\u0173\3\2\2") + buf.write("\2\2\u0175\3\2\2\2\2\u0177\3\2\2\2\2\u0179\3\2\2\2\2\u017b") + buf.write("\3\2\2\2\2\u017d\3\2\2\2\2\u017f\3\2\2\2\2\u0181\3\2\2") + buf.write("\2\2\u0183\3\2\2\2\2\u0185\3\2\2\2\2\u0187\3\2\2\2\2\u0189") + buf.write("\3\2\2\2\2\u018b\3\2\2\2\2\u018d\3\2\2\2\2\u018f\3\2\2") + buf.write("\2\2\u0191\3\2\2\2\2\u0193\3\2\2\2\2\u0195\3\2\2\2\2\u0197") + buf.write("\3\2\2\2\2\u0199\3\2\2\2\2\u019b\3\2\2\2\2\u019d\3\2\2") + buf.write("\2\2\u019f\3\2\2\2\2\u01a1\3\2\2\2\2\u01a3\3\2\2\2\2\u01a5") + buf.write("\3\2\2\2\2\u01a7\3\2\2\2\2\u01a9\3\2\2\2\2\u01ab\3\2\2") + buf.write("\2\2\u01ad\3\2\2\2\2\u01af\3\2\2\2\2\u01b1\3\2\2\2\2\u01b3") + buf.write("\3\2\2\2\2\u01b5\3\2\2\2\2\u01b7\3\2\2\2\2\u01b9\3\2\2") + buf.write("\2\2\u01bb\3\2\2\2\2\u01bd\3\2\2\2\2\u01bf\3\2\2\2\2\u01c1") + buf.write("\3\2\2\2\2\u01c3\3\2\2\2\2\u01c5\3\2\2\2\2\u01c7\3\2\2") + buf.write("\2\2\u01c9\3\2\2\2\2\u01cb\3\2\2\2\2\u01cd\3\2\2\2\2\u01cf") + buf.write("\3\2\2\2\2\u01d1\3\2\2\2\2\u01d3\3\2\2\2\2\u01d5\3\2\2") + buf.write("\2\2\u01d7\3\2\2\2\2\u01d9\3\2\2\2\2\u01db\3\2\2\2\2\u01dd") + buf.write("\3\2\2\2\2\u01df\3\2\2\2\2\u01e1\3\2\2\2\2\u01e3\3\2\2") + buf.write("\2\2\u01e5\3\2\2\2\2\u01e7\3\2\2\2\2\u01e9\3\2\2\2\2\u01eb") + buf.write("\3\2\2\2\2\u01ed\3\2\2\2\2\u01ef\3\2\2\2\2\u01f1\3\2\2") + buf.write("\2\2\u01f3\3\2\2\2\2\u01f5\3\2\2\2\2\u01f7\3\2\2\2\2\u01f9") + buf.write("\3\2\2\2\2\u01fb\3\2\2\2\2\u01fd\3\2\2\2\2\u01ff\3\2\2") + buf.write("\2\2\u0201\3\2\2\2\2\u0203\3\2\2\2\2\u0205\3\2\2\2\2\u0207") + buf.write("\3\2\2\2\2\u0209\3\2\2\2\2\u020b\3\2\2\2\2\u020d\3\2\2") + buf.write("\2\2\u020f\3\2\2\2\2\u0211\3\2\2\2\2\u0213\3\2\2\2\2\u0215") + buf.write("\3\2\2\2\2\u0217\3\2\2\2\2\u0219\3\2\2\2\2\u021b\3\2\2") + buf.write("\2\2\u021d\3\2\2\2\2\u021f\3\2\2\2\2\u0221\3\2\2\2\2\u0223") + buf.write("\3\2\2\2\2\u0225\3\2\2\2\2\u0227\3\2\2\2\2\u0229\3\2\2") + buf.write("\2\2\u022b\3\2\2\2\2\u022d\3\2\2\2\2\u022f\3\2\2\2\2\u0231") + buf.write("\3\2\2\2\2\u0233\3\2\2\2\2\u0235\3\2\2\2\2\u0237\3\2\2") + buf.write("\2\2\u0239\3\2\2\2\2\u023b\3\2\2\2\2\u023d\3\2\2\2\2\u023f") + buf.write("\3\2\2\2\2\u0241\3\2\2\2\2\u0243\3\2\2\2\2\u0245\3\2\2") + buf.write("\2\2\u0247\3\2\2\2\2\u0249\3\2\2\2\2\u024b\3\2\2\2\2\u0255") + buf.write("\3\2\2\2\2\u0257\3\2\2\2\2\u0259\3\2\2\2\2\u025b\3\2\2") + buf.write("\2\3\u025d\3\2\2\2\5\u025f\3\2\2\2\7\u0261\3\2\2\2\t\u0263") + buf.write("\3\2\2\2\13\u0265\3\2\2\2\r\u0267\3\2\2\2\17\u026b\3\2") + buf.write("\2\2\21\u026e\3\2\2\2\23\u0271\3\2\2\2\25\u0273\3\2\2") + buf.write("\2\27\u0275\3\2\2\2\31\u0277\3\2\2\2\33\u027b\3\2\2\2") + buf.write("\35\u0281\3\2\2\2\37\u0285\3\2\2\2!\u028b\3\2\2\2#\u0293") + buf.write("\3\2\2\2%\u0297\3\2\2\2\'\u029c\3\2\2\2)\u02a0\3\2\2\2") + buf.write("+\u02a8\3\2\2\2-\u02ae\3\2\2\2/\u02b1\3\2\2\2\61\u02b5") + buf.write("\3\2\2\2\63\u02b8\3\2\2\2\65\u02c6\3\2\2\2\67\u02ce\3") + buf.write("\2\2\29\u02d3\3\2\2\2;\u02da\3\2\2\2=\u02e2\3\2\2\2?\u02e5") + buf.write("\3\2\2\2A\u02eb\3\2\2\2C\u02f3\3\2\2\2E\u02f8\3\2\2\2") + buf.write("G\u02fd\3\2\2\2I\u0304\3\2\2\2K\u030a\3\2\2\2M\u0310\3") + buf.write("\2\2\2O\u0318\3\2\2\2Q\u0322\3\2\2\2S\u032a\3\2\2\2U\u0332") + buf.write("\3\2\2\2W\u033d\3\2\2\2Y\u0344\3\2\2\2[\u034c\3\2\2\2") + buf.write("]\u0354\3\2\2\2_\u035b\3\2\2\2a\u0363\3\2\2\2c\u036f\3") + buf.write("\2\2\2e\u0377\3\2\2\2g\u0383\3\2\2\2i\u038e\3\2\2\2k\u0393") + buf.write("\3\2\2\2m\u039a\3\2\2\2o\u03a0\3\2\2\2q\u03a5\3\2\2\2") + buf.write("s\u03ad\3\2\2\2u\u03ba\3\2\2\2w\u03c7\3\2\2\2y\u03d9\3") + buf.write("\2\2\2{\u03e6\3\2\2\2}\u03eb\3\2\2\2\177\u0404\3\2\2\2") + buf.write("\u0081\u0406\3\2\2\2\u0083\u040a\3\2\2\2\u0085\u0417\3") + buf.write("\2\2\2\u0087\u041f\3\2\2\2\u0089\u0426\3\2\2\2\u008b\u0430") + buf.write("\3\2\2\2\u008d\u0435\3\2\2\2\u008f\u043e\3\2\2\2\u0091") + buf.write("\u0442\3\2\2\2\u0093\u044e\3\2\2\2\u0095\u0458\3\2\2\2") + buf.write("\u0097\u0461\3\2\2\2\u0099\u046c\3\2\2\2\u009b\u0471\3") + buf.write("\2\2\2\u009d\u0476\3\2\2\2\u009f\u047a\3\2\2\2\u00a1\u0481") + buf.write("\3\2\2\2\u00a3\u0489\3\2\2\2\u00a5\u0490\3\2\2\2\u00a7") + buf.write("\u0499\3\2\2\2\u00a9\u04a0\3\2\2\2\u00ab\u04a8\3\2\2\2") + buf.write("\u00ad\u04af\3\2\2\2\u00af\u04b8\3\2\2\2\u00b1\u04c1\3") + buf.write("\2\2\2\u00b3\u04c9\3\2\2\2\u00b5\u04cf\3\2\2\2\u00b7\u04d5") + buf.write("\3\2\2\2\u00b9\u04dc\3\2\2\2\u00bb\u04e3\3\2\2\2\u00bd") + buf.write("\u04ee\3\2\2\2\u00bf\u04f4\3\2\2\2\u00c1\u04fe\3\2\2\2") + buf.write("\u00c3\u0502\3\2\2\2\u00c5\u050a\3\2\2\2\u00c7\u0511\3") + buf.write("\2\2\2\u00c9\u051b\3\2\2\2\u00cb\u0520\3\2\2\2\u00cd\u0525") + buf.write("\3\2\2\2\u00cf\u052e\3\2\2\2\u00d1\u0538\3\2\2\2\u00d3") + buf.write("\u053f\3\2\2\2\u00d5\u0545\3\2\2\2\u00d7\u054b\3\2\2\2") + buf.write("\u00d9\u0554\3\2\2\2\u00db\u055b\3\2\2\2\u00dd\u0560\3") + buf.write("\2\2\2\u00df\u0563\3\2\2\2\u00e1\u056a\3\2\2\2\u00e3\u0571") + buf.write("\3\2\2\2\u00e5\u0574\3\2\2\2\u00e7\u057a\3\2\2\2\u00e9") + buf.write("\u0582\3\2\2\2\u00eb\u0588\3\2\2\2\u00ed\u058f\3\2\2\2") + buf.write("\u00ef\u059b\3\2\2\2\u00f1\u05a2\3\2\2\2\u00f3\u05ac\3") + buf.write("\2\2\2\u00f5\u05b5\3\2\2\2\u00f7\u05ba\3\2\2\2\u00f9\u05bd") + buf.write("\3\2\2\2\u00fb\u05c3\3\2\2\2\u00fd\u05c8\3\2\2\2\u00ff") + buf.write("\u05cd\3\2\2\2\u0101\u05d2\3\2\2\2\u0103\u05da\3\2\2\2") + buf.write("\u0105\u05df\3\2\2\2\u0107\u05e7\3\2\2\2\u0109\u05ec\3") + buf.write("\2\2\2\u010b\u05f1\3\2\2\2\u010d\u05f7\3\2\2\2\u010f\u05fd") + buf.write("\3\2\2\2\u0111\u0602\3\2\2\2\u0113\u0607\3\2\2\2\u0115") + buf.write("\u060d\3\2\2\2\u0117\u0616\3\2\2\2\u0119\u061b\3\2\2\2") + buf.write("\u011b\u0621\3\2\2\2\u011d\u0629\3\2\2\2\u011f\u062f\3") + buf.write("\2\2\2\u0121\u0633\3\2\2\2\u0123\u063b\3\2\2\2\u0125\u0641") + buf.write("\3\2\2\2\u0127\u0648\3\2\2\2\u0129\u064e\3\2\2\2\u012b") + buf.write("\u0653\3\2\2\2\u012d\u065d\3\2\2\2\u012f\u0668\3\2\2\2") + buf.write("\u0131\u0670\3\2\2\2\u0133\u0677\3\2\2\2\u0135\u0679\3") + buf.write("\2\2\2\u0137\u067e\3\2\2\2\u0139\u0684\3\2\2\2\u013b\u0687") + buf.write("\3\2\2\2\u013d\u068a\3\2\2\2\u013f\u068f\3\2\2\2\u0141") + buf.write("\u0696\3\2\2\2\u0143\u069e\3\2\2\2\u0145\u06a1\3\2\2\2") + buf.write("\u0147\u06a7\3\2\2\2\u0149\u06ab\3\2\2\2\u014b\u06b1\3") + buf.write("\2\2\2\u014d\u06be\3\2\2\2\u014f\u06c3\3\2\2\2\u0151\u06cc") + buf.write("\3\2\2\2\u0153\u06d4\3\2\2\2\u0155\u06de\3\2\2\2\u0157") + buf.write("\u06e8\3\2\2\2\u0159\u06f4\3\2\2\2\u015b\u06ff\3\2\2\2") + buf.write("\u015d\u0707\3\2\2\2\u015f\u070d\3\2\2\2\u0161\u0715\3") + buf.write("\2\2\2\u0163\u071e\3\2\2\2\u0165\u0728\3\2\2\2\u0167\u0730") + buf.write("\3\2\2\2\u0169\u073b\3\2\2\2\u016b\u0746\3\2\2\2\u016d") + buf.write("\u074c\3\2\2\2\u016f\u0752\3\2\2\2\u0171\u0758\3\2\2\2") + buf.write("\u0173\u0765\3\2\2\2\u0175\u0772\3\2\2\2\u0177\u077a\3") + buf.write("\2\2\2\u0179\u0781\3\2\2\2\u017b\u078c\3\2\2\2\u017d\u0794") + buf.write("\3\2\2\2\u017f\u079b\3\2\2\2\u0181\u07a2\3\2\2\2\u0183") + buf.write("\u07aa\3\2\2\2\u0185\u07b0\3\2\2\2\u0187\u07b9\3\2\2\2") + buf.write("\u0189\u07c0\3\2\2\2\u018b\u07d1\3\2\2\2\u018d\u07d3\3") + buf.write("\2\2\2\u018f\u07d8\3\2\2\2\u0191\u07de\3\2\2\2\u0193\u07e7") + buf.write("\3\2\2\2\u0195\u07ee\3\2\2\2\u0197\u07f2\3\2\2\2\u0199") + buf.write("\u07f7\3\2\2\2\u019b\u07fe\3\2\2\2\u019d\u0805\3\2\2\2") + buf.write("\u019f\u080c\3\2\2\2\u01a1\u0811\3\2\2\2\u01a3\u081b\3") + buf.write("\2\2\2\u01a5\u0821\3\2\2\2\u01a7\u0831\3\2\2\2\u01a9\u083e") + buf.write("\3\2\2\2\u01ab\u0842\3\2\2\2\u01ad\u0848\3\2\2\2\u01af") + buf.write("\u084d\3\2\2\2\u01b1\u0852\3\2\2\2\u01b3\u0859\3\2\2\2") + buf.write("\u01b5\u085e\3\2\2\2\u01b7\u0863\3\2\2\2\u01b9\u086a\3") + buf.write("\2\2\2\u01bb\u0870\3\2\2\2\u01bd\u087b\3\2\2\2\u01bf\u0882") + buf.write("\3\2\2\2\u01c1\u088b\3\2\2\2\u01c3\u0892\3\2\2\2\u01c5") + buf.write("\u0899\3\2\2\2\u01c7\u08a3\3\2\2\2\u01c9\u08a9\3\2\2\2") + buf.write("\u01cb\u08b0\3\2\2\2\u01cd\u08bc\3\2\2\2\u01cf\u08d7\3") + buf.write("\2\2\2\u01d1\u08d9\3\2\2\2\u01d3\u08e4\3\2\2\2\u01d5\u08e9") + buf.write("\3\2\2\2\u01d7\u08ec\3\2\2\2\u01d9\u08f2\3\2\2\2\u01db") + buf.write("\u08fb\3\2\2\2\u01dd\u0907\3\2\2\2\u01df\u0914\3\2\2\2") + buf.write("\u01e1\u091e\3\2\2\2\u01e3\u0923\3\2\2\2\u01e5\u0928\3") + buf.write("\2\2\2\u01e7\u0931\3\2\2\2\u01e9\u0936\3\2\2\2\u01eb\u0940") + buf.write("\3\2\2\2\u01ed\u094a\3\2\2\2\u01ef\u0952\3\2\2\2\u01f1") + buf.write("\u0958\3\2\2\2\u01f3\u095f\3\2\2\2\u01f5\u0967\3\2\2\2") + buf.write("\u01f7\u096e\3\2\2\2\u01f9\u0974\3\2\2\2\u01fb\u097b\3") + buf.write("\2\2\2\u01fd\u097f\3\2\2\2\u01ff\u0984\3\2\2\2\u0201\u098a") + buf.write("\3\2\2\2\u0203\u0991\3\2\2\2\u0205\u0996\3\2\2\2\u0207") + buf.write("\u099c\3\2\2\2\u0209\u09a1\3\2\2\2\u020b\u09a7\3\2\2\2") + buf.write("\u020d\u09ae\3\2\2\2\u020f\u09b3\3\2\2\2\u0211\u09bb\3") + buf.write("\2\2\2\u0213\u09bd\3\2\2\2\u0215\u09c1\3\2\2\2\u0217\u09c4") + buf.write("\3\2\2\2\u0219\u09c7\3\2\2\2\u021b\u09cd\3\2\2\2\u021d") + buf.write("\u09cf\3\2\2\2\u021f\u09d5\3\2\2\2\u0221\u09d7\3\2\2\2") + buf.write("\u0223\u09d9\3\2\2\2\u0225\u09db\3\2\2\2\u0227\u09dd\3") + buf.write("\2\2\2\u0229\u09df\3\2\2\2\u022b\u09e1\3\2\2\2\u022d\u09e5") + buf.write("\3\2\2\2\u022f\u09e7\3\2\2\2\u0231\u09e9\3\2\2\2\u0233") + buf.write("\u09eb\3\2\2\2\u0235\u09ee\3\2\2\2\u0237\u0a04\3\2\2\2") + buf.write("\u0239\u0a07\3\2\2\2\u023b\u0a0e\3\2\2\2\u023d\u0a15\3") + buf.write("\2\2\2\u023f\u0a1c\3\2\2\2\u0241\u0a2b\3\2\2\2\u0243\u0a2d") + buf.write("\3\2\2\2\u0245\u0a41\3\2\2\2\u0247\u0a57\3\2\2\2\u0249") + buf.write("\u0a5c\3\2\2\2\u024b\u0a60\3\2\2\2\u024d\u0a7d\3\2\2\2") + buf.write("\u024f\u0a7f\3\2\2\2\u0251\u0a88\3\2\2\2\u0253\u0a8a\3") + buf.write("\2\2\2\u0255\u0a8c\3\2\2\2\u0257\u0a9d\3\2\2\2\u0259\u0aae") + buf.write("\3\2\2\2\u025b\u0ab4\3\2\2\2\u025d\u025e\7=\2\2\u025e") + buf.write("\4\3\2\2\2\u025f\u0260\7*\2\2\u0260\6\3\2\2\2\u0261\u0262") + buf.write("\7+\2\2\u0262\b\3\2\2\2\u0263\u0264\7.\2\2\u0264\n\3\2") + buf.write("\2\2\u0265\u0266\7\60\2\2\u0266\f\3\2\2\2\u0267\u0268") + buf.write("\7\61\2\2\u0268\u0269\7,\2\2\u0269\u026a\7-\2\2\u026a") + buf.write("\16\3\2\2\2\u026b\u026c\7,\2\2\u026c\u026d\7\61\2\2\u026d") + buf.write("\20\3\2\2\2\u026e\u026f\7/\2\2\u026f\u0270\7@\2\2\u0270") + buf.write("\22\3\2\2\2\u0271\u0272\7]\2\2\u0272\24\3\2\2\2\u0273") + buf.write("\u0274\7_\2\2\u0274\26\3\2\2\2\u0275\u0276\7<\2\2\u0276") + buf.write("\30\3\2\2\2\u0277\u0278\7C\2\2\u0278\u0279\7F\2\2\u0279") + buf.write("\u027a\7F\2\2\u027a\32\3\2\2\2\u027b\u027c\7C\2\2\u027c") + buf.write("\u027d\7H\2\2\u027d\u027e\7V\2\2\u027e\u027f\7G\2\2\u027f") + buf.write("\u0280\7T\2\2\u0280\34\3\2\2\2\u0281\u0282\7C\2\2\u0282") + buf.write("\u0283\7N\2\2\u0283\u0284\7N\2\2\u0284\36\3\2\2\2\u0285") + buf.write("\u0286\7C\2\2\u0286\u0287\7N\2\2\u0287\u0288\7V\2\2\u0288") + buf.write("\u0289\7G\2\2\u0289\u028a\7T\2\2\u028a \3\2\2\2\u028b") + buf.write("\u028c\7C\2\2\u028c\u028d\7P\2\2\u028d\u028e\7C\2\2\u028e") + buf.write("\u028f\7N\2\2\u028f\u0290\7[\2\2\u0290\u0291\7\\\2\2\u0291") + buf.write("\u0292\7G\2\2\u0292\"\3\2\2\2\u0293\u0294\7C\2\2\u0294") + buf.write("\u0295\7P\2\2\u0295\u0296\7F\2\2\u0296$\3\2\2\2\u0297") + buf.write("\u0298\7C\2\2\u0298\u0299\7P\2\2\u0299\u029a\7V\2\2\u029a") + buf.write("\u029b\7K\2\2\u029b&\3\2\2\2\u029c\u029d\7C\2\2\u029d") + buf.write("\u029e\7P\2\2\u029e\u029f\7[\2\2\u029f(\3\2\2\2\u02a0") + buf.write("\u02a1\7C\2\2\u02a1\u02a2\7T\2\2\u02a2\u02a3\7E\2\2\u02a3") + buf.write("\u02a4\7J\2\2\u02a4\u02a5\7K\2\2\u02a5\u02a6\7X\2\2\u02a6") + buf.write("\u02a7\7G\2\2\u02a7*\3\2\2\2\u02a8\u02a9\7C\2\2\u02a9") + buf.write("\u02aa\7T\2\2\u02aa\u02ab\7T\2\2\u02ab\u02ac\7C\2\2\u02ac") + buf.write("\u02ad\7[\2\2\u02ad,\3\2\2\2\u02ae\u02af\7C\2\2\u02af") + buf.write("\u02b0\7U\2\2\u02b0.\3\2\2\2\u02b1\u02b2\7C\2\2\u02b2") + buf.write("\u02b3\7U\2\2\u02b3\u02b4\7E\2\2\u02b4\60\3\2\2\2\u02b5") + buf.write("\u02b6\7C\2\2\u02b6\u02b7\7V\2\2\u02b7\62\3\2\2\2\u02b8") + buf.write("\u02b9\7C\2\2\u02b9\u02ba\7W\2\2\u02ba\u02bb\7V\2\2\u02bb") + buf.write("\u02bc\7J\2\2\u02bc\u02bd\7Q\2\2\u02bd\u02be\7T\2\2\u02be") + buf.write("\u02bf\7K\2\2\u02bf\u02c0\7\\\2\2\u02c0\u02c1\7C\2\2\u02c1") + buf.write("\u02c2\7V\2\2\u02c2\u02c3\7K\2\2\u02c3\u02c4\7Q\2\2\u02c4") + buf.write("\u02c5\7P\2\2\u02c5\64\3\2\2\2\u02c6\u02c7\7D\2\2\u02c7") + buf.write("\u02c8\7G\2\2\u02c8\u02c9\7V\2\2\u02c9\u02ca\7Y\2\2\u02ca") + buf.write("\u02cb\7G\2\2\u02cb\u02cc\7G\2\2\u02cc\u02cd\7P\2\2\u02cd") + buf.write("\66\3\2\2\2\u02ce\u02cf\7D\2\2\u02cf\u02d0\7Q\2\2\u02d0") + buf.write("\u02d1\7V\2\2\u02d1\u02d2\7J\2\2\u02d28\3\2\2\2\u02d3") + buf.write("\u02d4\7D\2\2\u02d4\u02d5\7W\2\2\u02d5\u02d6\7E\2\2\u02d6") + buf.write("\u02d7\7M\2\2\u02d7\u02d8\7G\2\2\u02d8\u02d9\7V\2\2\u02d9") + buf.write(":\3\2\2\2\u02da\u02db\7D\2\2\u02db\u02dc\7W\2\2\u02dc") + buf.write("\u02dd\7E\2\2\u02dd\u02de\7M\2\2\u02de\u02df\7G\2\2\u02df") + buf.write("\u02e0\7V\2\2\u02e0\u02e1\7U\2\2\u02e1<\3\2\2\2\u02e2") + buf.write("\u02e3\7D\2\2\u02e3\u02e4\7[\2\2\u02e4>\3\2\2\2\u02e5") + buf.write("\u02e6\7E\2\2\u02e6\u02e7\7C\2\2\u02e7\u02e8\7E\2\2\u02e8") + buf.write("\u02e9\7J\2\2\u02e9\u02ea\7G\2\2\u02ea@\3\2\2\2\u02eb") + buf.write("\u02ec\7E\2\2\u02ec\u02ed\7C\2\2\u02ed\u02ee\7U\2\2\u02ee") + buf.write("\u02ef\7E\2\2\u02ef\u02f0\7C\2\2\u02f0\u02f1\7F\2\2\u02f1") + buf.write("\u02f2\7G\2\2\u02f2B\3\2\2\2\u02f3\u02f4\7E\2\2\u02f4") + buf.write("\u02f5\7C\2\2\u02f5\u02f6\7U\2\2\u02f6\u02f7\7G\2\2\u02f7") + buf.write("D\3\2\2\2\u02f8\u02f9\7E\2\2\u02f9\u02fa\7C\2\2\u02fa") + buf.write("\u02fb\7U\2\2\u02fb\u02fc\7V\2\2\u02fcF\3\2\2\2\u02fd") + buf.write("\u02fe\7E\2\2\u02fe\u02ff\7J\2\2\u02ff\u0300\7C\2\2\u0300") + buf.write("\u0301\7P\2\2\u0301\u0302\7I\2\2\u0302\u0303\7G\2\2\u0303") + buf.write("H\3\2\2\2\u0304\u0305\7E\2\2\u0305\u0306\7J\2\2\u0306") + buf.write("\u0307\7G\2\2\u0307\u0308\7E\2\2\u0308\u0309\7M\2\2\u0309") + buf.write("J\3\2\2\2\u030a\u030b\7E\2\2\u030b\u030c\7N\2\2\u030c") + buf.write("\u030d\7G\2\2\u030d\u030e\7C\2\2\u030e\u030f\7T\2\2\u030f") + buf.write("L\3\2\2\2\u0310\u0311\7E\2\2\u0311\u0312\7N\2\2\u0312") + buf.write("\u0313\7W\2\2\u0313\u0314\7U\2\2\u0314\u0315\7V\2\2\u0315") + buf.write("\u0316\7G\2\2\u0316\u0317\7T\2\2\u0317N\3\2\2\2\u0318") + buf.write("\u0319\7E\2\2\u0319\u031a\7N\2\2\u031a\u031b\7W\2\2\u031b") + buf.write("\u031c\7U\2\2\u031c\u031d\7V\2\2\u031d\u031e\7G\2\2\u031e") + buf.write("\u031f\7T\2\2\u031f\u0320\7G\2\2\u0320\u0321\7F\2\2\u0321") + buf.write("P\3\2\2\2\u0322\u0323\7E\2\2\u0323\u0324\7Q\2\2\u0324") + buf.write("\u0325\7F\2\2\u0325\u0326\7G\2\2\u0326\u0327\7I\2\2\u0327") + buf.write("\u0328\7G\2\2\u0328\u0329\7P\2\2\u0329R\3\2\2\2\u032a") + buf.write("\u032b\7E\2\2\u032b\u032c\7Q\2\2\u032c\u032d\7N\2\2\u032d") + buf.write("\u032e\7N\2\2\u032e\u032f\7C\2\2\u032f\u0330\7V\2\2\u0330") + buf.write("\u0331\7G\2\2\u0331T\3\2\2\2\u0332\u0333\7E\2\2\u0333") + buf.write("\u0334\7Q\2\2\u0334\u0335\7N\2\2\u0335\u0336\7N\2\2\u0336") + buf.write("\u0337\7G\2\2\u0337\u0338\7E\2\2\u0338\u0339\7V\2\2\u0339") + buf.write("\u033a\7K\2\2\u033a\u033b\7Q\2\2\u033b\u033c\7P\2\2\u033c") + buf.write("V\3\2\2\2\u033d\u033e\7E\2\2\u033e\u033f\7Q\2\2\u033f") + buf.write("\u0340\7N\2\2\u0340\u0341\7W\2\2\u0341\u0342\7O\2\2\u0342") + buf.write("\u0343\7P\2\2\u0343X\3\2\2\2\u0344\u0345\7E\2\2\u0345") + buf.write("\u0346\7Q\2\2\u0346\u0347\7N\2\2\u0347\u0348\7W\2\2\u0348") + buf.write("\u0349\7O\2\2\u0349\u034a\7P\2\2\u034a\u034b\7U\2\2\u034b") + buf.write("Z\3\2\2\2\u034c\u034d\7E\2\2\u034d\u034e\7Q\2\2\u034e") + buf.write("\u034f\7O\2\2\u034f\u0350\7O\2\2\u0350\u0351\7G\2\2\u0351") + buf.write("\u0352\7P\2\2\u0352\u0353\7V\2\2\u0353\\\3\2\2\2\u0354") + buf.write("\u0355\7E\2\2\u0355\u0356\7Q\2\2\u0356\u0357\7O\2\2\u0357") + buf.write("\u0358\7O\2\2\u0358\u0359\7K\2\2\u0359\u035a\7V\2\2\u035a") + buf.write("^\3\2\2\2\u035b\u035c\7E\2\2\u035c\u035d\7Q\2\2\u035d") + buf.write("\u035e\7O\2\2\u035e\u035f\7R\2\2\u035f\u0360\7C\2\2\u0360") + buf.write("\u0361\7E\2\2\u0361\u0362\7V\2\2\u0362`\3\2\2\2\u0363") + buf.write("\u0364\7E\2\2\u0364\u0365\7Q\2\2\u0365\u0366\7O\2\2\u0366") + buf.write("\u0367\7R\2\2\u0367\u0368\7C\2\2\u0368\u0369\7E\2\2\u0369") + buf.write("\u036a\7V\2\2\u036a\u036b\7K\2\2\u036b\u036c\7Q\2\2\u036c") + buf.write("\u036d\7P\2\2\u036d\u036e\7U\2\2\u036eb\3\2\2\2\u036f") + buf.write("\u0370\7E\2\2\u0370\u0371\7Q\2\2\u0371\u0372\7O\2\2\u0372") + buf.write("\u0373\7R\2\2\u0373\u0374\7W\2\2\u0374\u0375\7V\2\2\u0375") + buf.write("\u0376\7G\2\2\u0376d\3\2\2\2\u0377\u0378\7E\2\2\u0378") + buf.write("\u0379\7Q\2\2\u0379\u037a\7P\2\2\u037a\u037b\7E\2\2\u037b") + buf.write("\u037c\7C\2\2\u037c\u037d\7V\2\2\u037d\u037e\7G\2\2\u037e") + buf.write("\u037f\7P\2\2\u037f\u0380\7C\2\2\u0380\u0381\7V\2\2\u0381") + buf.write("\u0382\7G\2\2\u0382f\3\2\2\2\u0383\u0384\7E\2\2\u0384") + buf.write("\u0385\7Q\2\2\u0385\u0386\7P\2\2\u0386\u0387\7U\2\2\u0387") + buf.write("\u0388\7V\2\2\u0388\u0389\7T\2\2\u0389\u038a\7C\2\2\u038a") + buf.write("\u038b\7K\2\2\u038b\u038c\7P\2\2\u038c\u038d\7V\2\2\u038d") + buf.write("h\3\2\2\2\u038e\u038f\7E\2\2\u038f\u0390\7Q\2\2\u0390") + buf.write("\u0391\7U\2\2\u0391\u0392\7V\2\2\u0392j\3\2\2\2\u0393") + buf.write("\u0394\7E\2\2\u0394\u0395\7T\2\2\u0395\u0396\7G\2\2\u0396") + buf.write("\u0397\7C\2\2\u0397\u0398\7V\2\2\u0398\u0399\7G\2\2\u0399") + buf.write("l\3\2\2\2\u039a\u039b\7E\2\2\u039b\u039c\7T\2\2\u039c") + buf.write("\u039d\7Q\2\2\u039d\u039e\7U\2\2\u039e\u039f\7U\2\2\u039f") + buf.write("n\3\2\2\2\u03a0\u03a1\7E\2\2\u03a1\u03a2\7W\2\2\u03a2") + buf.write("\u03a3\7D\2\2\u03a3\u03a4\7G\2\2\u03a4p\3\2\2\2\u03a5") + buf.write("\u03a6\7E\2\2\u03a6\u03a7\7W\2\2\u03a7\u03a8\7T\2\2\u03a8") + buf.write("\u03a9\7T\2\2\u03a9\u03aa\7G\2\2\u03aa\u03ab\7P\2\2\u03ab") + buf.write("\u03ac\7V\2\2\u03acr\3\2\2\2\u03ad\u03ae\7E\2\2\u03ae") + buf.write("\u03af\7W\2\2\u03af\u03b0\7T\2\2\u03b0\u03b1\7T\2\2\u03b1") + buf.write("\u03b2\7G\2\2\u03b2\u03b3\7P\2\2\u03b3\u03b4\7V\2\2\u03b4") + buf.write("\u03b5\7a\2\2\u03b5\u03b6\7F\2\2\u03b6\u03b7\7C\2\2\u03b7") + buf.write("\u03b8\7V\2\2\u03b8\u03b9\7G\2\2\u03b9t\3\2\2\2\u03ba") + buf.write("\u03bb\7E\2\2\u03bb\u03bc\7W\2\2\u03bc\u03bd\7T\2\2\u03bd") + buf.write("\u03be\7T\2\2\u03be\u03bf\7G\2\2\u03bf\u03c0\7P\2\2\u03c0") + buf.write("\u03c1\7V\2\2\u03c1\u03c2\7a\2\2\u03c2\u03c3\7V\2\2\u03c3") + buf.write("\u03c4\7K\2\2\u03c4\u03c5\7O\2\2\u03c5\u03c6\7G\2\2\u03c6") + buf.write("v\3\2\2\2\u03c7\u03c8\7E\2\2\u03c8\u03c9\7W\2\2\u03c9") + buf.write("\u03ca\7T\2\2\u03ca\u03cb\7T\2\2\u03cb\u03cc\7G\2\2\u03cc") + buf.write("\u03cd\7P\2\2\u03cd\u03ce\7V\2\2\u03ce\u03cf\7a\2\2\u03cf") + buf.write("\u03d0\7V\2\2\u03d0\u03d1\7K\2\2\u03d1\u03d2\7O\2\2\u03d2") + buf.write("\u03d3\7G\2\2\u03d3\u03d4\7U\2\2\u03d4\u03d5\7V\2\2\u03d5") + buf.write("\u03d6\7C\2\2\u03d6\u03d7\7O\2\2\u03d7\u03d8\7R\2\2\u03d8") + buf.write("x\3\2\2\2\u03d9\u03da\7E\2\2\u03da\u03db\7W\2\2\u03db") + buf.write("\u03dc\7T\2\2\u03dc\u03dd\7T\2\2\u03dd\u03de\7G\2\2\u03de") + buf.write("\u03df\7P\2\2\u03df\u03e0\7V\2\2\u03e0\u03e1\7a\2\2\u03e1") + buf.write("\u03e2\7W\2\2\u03e2\u03e3\7U\2\2\u03e3\u03e4\7G\2\2\u03e4") + buf.write("\u03e5\7T\2\2\u03e5z\3\2\2\2\u03e6\u03e7\7F\2\2\u03e7") + buf.write("\u03e8\7C\2\2\u03e8\u03e9\7V\2\2\u03e9\u03ea\7C\2\2\u03ea") + buf.write("|\3\2\2\2\u03eb\u03ec\7F\2\2\u03ec\u03ed\7C\2\2\u03ed") + buf.write("\u03ee\7V\2\2\u03ee\u03ef\7C\2\2\u03ef\u03f0\7D\2\2\u03f0") + buf.write("\u03f1\7C\2\2\u03f1\u03f2\7U\2\2\u03f2\u03f3\7G\2\2\u03f3") + buf.write("~\3\2\2\2\u03f4\u03f5\7F\2\2\u03f5\u03f6\7C\2\2\u03f6") + buf.write("\u03f7\7V\2\2\u03f7\u03f8\7C\2\2\u03f8\u03f9\7D\2\2\u03f9") + buf.write("\u03fa\7C\2\2\u03fa\u03fb\7U\2\2\u03fb\u03fc\7G\2\2\u03fc") + buf.write("\u0405\7U\2\2\u03fd\u03fe\7U\2\2\u03fe\u03ff\7E\2\2\u03ff") + buf.write("\u0400\7J\2\2\u0400\u0401\7G\2\2\u0401\u0402\7O\2\2\u0402") + buf.write("\u0403\7C\2\2\u0403\u0405\7U\2\2\u0404\u03f4\3\2\2\2\u0404") + buf.write("\u03fd\3\2\2\2\u0405\u0080\3\2\2\2\u0406\u0407\7F\2\2") + buf.write("\u0407\u0408\7C\2\2\u0408\u0409\7[\2\2\u0409\u0082\3\2") + buf.write("\2\2\u040a\u040b\7F\2\2\u040b\u040c\7D\2\2\u040c\u040d") + buf.write("\7R\2\2\u040d\u040e\7T\2\2\u040e\u040f\7Q\2\2\u040f\u0410") + buf.write("\7R\2\2\u0410\u0411\7G\2\2\u0411\u0412\7T\2\2\u0412\u0413") + buf.write("\7V\2\2\u0413\u0414\7K\2\2\u0414\u0415\7G\2\2\u0415\u0416") + buf.write("\7U\2\2\u0416\u0084\3\2\2\2\u0417\u0418\7F\2\2\u0418\u0419") + buf.write("\7G\2\2\u0419\u041a\7H\2\2\u041a\u041b\7K\2\2\u041b\u041c") + buf.write("\7P\2\2\u041c\u041d\7G\2\2\u041d\u041e\7F\2\2\u041e\u0086") + buf.write("\3\2\2\2\u041f\u0420\7F\2\2\u0420\u0421\7G\2\2\u0421\u0422") + buf.write("\7N\2\2\u0422\u0423\7G\2\2\u0423\u0424\7V\2\2\u0424\u0425") + buf.write("\7G\2\2\u0425\u0088\3\2\2\2\u0426\u0427\7F\2\2\u0427\u0428") + buf.write("\7G\2\2\u0428\u0429\7N\2\2\u0429\u042a\7K\2\2\u042a\u042b") + buf.write("\7O\2\2\u042b\u042c\7K\2\2\u042c\u042d\7V\2\2\u042d\u042e") + buf.write("\7G\2\2\u042e\u042f\7F\2\2\u042f\u008a\3\2\2\2\u0430\u0431") + buf.write("\7F\2\2\u0431\u0432\7G\2\2\u0432\u0433\7U\2\2\u0433\u0434") + buf.write("\7E\2\2\u0434\u008c\3\2\2\2\u0435\u0436\7F\2\2\u0436\u0437") + buf.write("\7G\2\2\u0437\u0438\7U\2\2\u0438\u0439\7E\2\2\u0439\u043a") + buf.write("\7T\2\2\u043a\u043b\7K\2\2\u043b\u043c\7D\2\2\u043c\u043d") + buf.write("\7G\2\2\u043d\u008e\3\2\2\2\u043e\u043f\7F\2\2\u043f\u0440") + buf.write("\7H\2\2\u0440\u0441\7U\2\2\u0441\u0090\3\2\2\2\u0442\u0443") + buf.write("\7F\2\2\u0443\u0444\7K\2\2\u0444\u0445\7T\2\2\u0445\u0446") + buf.write("\7G\2\2\u0446\u0447\7E\2\2\u0447\u0448\7V\2\2\u0448\u0449") + buf.write("\7Q\2\2\u0449\u044a\7T\2\2\u044a\u044b\7K\2\2\u044b\u044c") + buf.write("\7G\2\2\u044c\u044d\7U\2\2\u044d\u0092\3\2\2\2\u044e\u044f") + buf.write("\7F\2\2\u044f\u0450\7K\2\2\u0450\u0451\7T\2\2\u0451\u0452") + buf.write("\7G\2\2\u0452\u0453\7E\2\2\u0453\u0454\7V\2\2\u0454\u0455") + buf.write("\7Q\2\2\u0455\u0456\7T\2\2\u0456\u0457\7[\2\2\u0457\u0094") + buf.write("\3\2\2\2\u0458\u0459\7F\2\2\u0459\u045a\7K\2\2\u045a\u045b") + buf.write("\7U\2\2\u045b\u045c\7V\2\2\u045c\u045d\7K\2\2\u045d\u045e") + buf.write("\7P\2\2\u045e\u045f\7E\2\2\u045f\u0460\7V\2\2\u0460\u0096") + buf.write("\3\2\2\2\u0461\u0462\7F\2\2\u0462\u0463\7K\2\2\u0463\u0464") + buf.write("\7U\2\2\u0464\u0465\7V\2\2\u0465\u0466\7T\2\2\u0466\u0467") + buf.write("\7K\2\2\u0467\u0468\7D\2\2\u0468\u0469\7W\2\2\u0469\u046a") + buf.write("\7V\2\2\u046a\u046b\7G\2\2\u046b\u0098\3\2\2\2\u046c\u046d") + buf.write("\7F\2\2\u046d\u046e\7T\2\2\u046e\u046f\7Q\2\2\u046f\u0470") + buf.write("\7R\2\2\u0470\u009a\3\2\2\2\u0471\u0472\7G\2\2\u0472\u0473") + buf.write("\7N\2\2\u0473\u0474\7U\2\2\u0474\u0475\7G\2\2\u0475\u009c") + buf.write("\3\2\2\2\u0476\u0477\7G\2\2\u0477\u0478\7P\2\2\u0478\u0479") + buf.write("\7F\2\2\u0479\u009e\3\2\2\2\u047a\u047b\7G\2\2\u047b\u047c") + buf.write("\7U\2\2\u047c\u047d\7E\2\2\u047d\u047e\7C\2\2\u047e\u047f") + buf.write("\7R\2\2\u047f\u0480\7G\2\2\u0480\u00a0\3\2\2\2\u0481\u0482") + buf.write("\7G\2\2\u0482\u0483\7U\2\2\u0483\u0484\7E\2\2\u0484\u0485") + buf.write("\7C\2\2\u0485\u0486\7R\2\2\u0486\u0487\7G\2\2\u0487\u0488") + buf.write("\7F\2\2\u0488\u00a2\3\2\2\2\u0489\u048a\7G\2\2\u048a\u048b") + buf.write("\7Z\2\2\u048b\u048c\7E\2\2\u048c\u048d\7G\2\2\u048d\u048e") + buf.write("\7R\2\2\u048e\u048f\7V\2\2\u048f\u00a4\3\2\2\2\u0490\u0491") + buf.write("\7G\2\2\u0491\u0492\7Z\2\2\u0492\u0493\7E\2\2\u0493\u0494") + buf.write("\7J\2\2\u0494\u0495\7C\2\2\u0495\u0496\7P\2\2\u0496\u0497") + buf.write("\7I\2\2\u0497\u0498\7G\2\2\u0498\u00a6\3\2\2\2\u0499\u049a") + buf.write("\7G\2\2\u049a\u049b\7Z\2\2\u049b\u049c\7K\2\2\u049c\u049d") + buf.write("\7U\2\2\u049d\u049e\7V\2\2\u049e\u049f\7U\2\2\u049f\u00a8") + buf.write("\3\2\2\2\u04a0\u04a1\7G\2\2\u04a1\u04a2\7Z\2\2\u04a2\u04a3") + buf.write("\7R\2\2\u04a3\u04a4\7N\2\2\u04a4\u04a5\7C\2\2\u04a5\u04a6") + buf.write("\7K\2\2\u04a6\u04a7\7P\2\2\u04a7\u00aa\3\2\2\2\u04a8\u04a9") + buf.write("\7G\2\2\u04a9\u04aa\7Z\2\2\u04aa\u04ab\7R\2\2\u04ab\u04ac") + buf.write("\7Q\2\2\u04ac\u04ad\7T\2\2\u04ad\u04ae\7V\2\2\u04ae\u00ac") + buf.write("\3\2\2\2\u04af\u04b0\7G\2\2\u04b0\u04b1\7Z\2\2\u04b1\u04b2") + buf.write("\7V\2\2\u04b2\u04b3\7G\2\2\u04b3\u04b4\7P\2\2\u04b4\u04b5") + buf.write("\7F\2\2\u04b5\u04b6\7G\2\2\u04b6\u04b7\7F\2\2\u04b7\u00ae") + buf.write("\3\2\2\2\u04b8\u04b9\7G\2\2\u04b9\u04ba\7Z\2\2\u04ba\u04bb") + buf.write("\7V\2\2\u04bb\u04bc\7G\2\2\u04bc\u04bd\7T\2\2\u04bd\u04be") + buf.write("\7P\2\2\u04be\u04bf\7C\2\2\u04bf\u04c0\7N\2\2\u04c0\u00b0") + buf.write("\3\2\2\2\u04c1\u04c2\7G\2\2\u04c2\u04c3\7Z\2\2\u04c3\u04c4") + buf.write("\7V\2\2\u04c4\u04c5\7T\2\2\u04c5\u04c6\7C\2\2\u04c6\u04c7") + buf.write("\7E\2\2\u04c7\u04c8\7V\2\2\u04c8\u00b2\3\2\2\2\u04c9\u04ca") + buf.write("\7H\2\2\u04ca\u04cb\7C\2\2\u04cb\u04cc\7N\2\2\u04cc\u04cd") + buf.write("\7U\2\2\u04cd\u04ce\7G\2\2\u04ce\u00b4\3\2\2\2\u04cf\u04d0") + buf.write("\7H\2\2\u04d0\u04d1\7G\2\2\u04d1\u04d2\7V\2\2\u04d2\u04d3") + buf.write("\7E\2\2\u04d3\u04d4\7J\2\2\u04d4\u00b6\3\2\2\2\u04d5\u04d6") + buf.write("\7H\2\2\u04d6\u04d7\7K\2\2\u04d7\u04d8\7G\2\2\u04d8\u04d9") + buf.write("\7N\2\2\u04d9\u04da\7F\2\2\u04da\u04db\7U\2\2\u04db\u00b8") + buf.write("\3\2\2\2\u04dc\u04dd\7H\2\2\u04dd\u04de\7K\2\2\u04de\u04df") + buf.write("\7N\2\2\u04df\u04e0\7V\2\2\u04e0\u04e1\7G\2\2\u04e1\u04e2") + buf.write("\7T\2\2\u04e2\u00ba\3\2\2\2\u04e3\u04e4\7H\2\2\u04e4\u04e5") + buf.write("\7K\2\2\u04e5\u04e6\7N\2\2\u04e6\u04e7\7G\2\2\u04e7\u04e8") + buf.write("\7H\2\2\u04e8\u04e9\7Q\2\2\u04e9\u04ea\7T\2\2\u04ea\u04eb") + buf.write("\7O\2\2\u04eb\u04ec\7C\2\2\u04ec\u04ed\7V\2\2\u04ed\u00bc") + buf.write("\3\2\2\2\u04ee\u04ef\7H\2\2\u04ef\u04f0\7K\2\2\u04f0\u04f1") + buf.write("\7T\2\2\u04f1\u04f2\7U\2\2\u04f2\u04f3\7V\2\2\u04f3\u00be") + buf.write("\3\2\2\2\u04f4\u04f5\7H\2\2\u04f5\u04f6\7Q\2\2\u04f6\u04f7") + buf.write("\7N\2\2\u04f7\u04f8\7N\2\2\u04f8\u04f9\7Q\2\2\u04f9\u04fa") + buf.write("\7Y\2\2\u04fa\u04fb\7K\2\2\u04fb\u04fc\7P\2\2\u04fc\u04fd") + buf.write("\7I\2\2\u04fd\u00c0\3\2\2\2\u04fe\u04ff\7H\2\2\u04ff\u0500") + buf.write("\7Q\2\2\u0500\u0501\7T\2\2\u0501\u00c2\3\2\2\2\u0502\u0503") + buf.write("\7H\2\2\u0503\u0504\7Q\2\2\u0504\u0505\7T\2\2\u0505\u0506") + buf.write("\7G\2\2\u0506\u0507\7K\2\2\u0507\u0508\7I\2\2\u0508\u0509") + buf.write("\7P\2\2\u0509\u00c4\3\2\2\2\u050a\u050b\7H\2\2\u050b\u050c") + buf.write("\7Q\2\2\u050c\u050d\7T\2\2\u050d\u050e\7O\2\2\u050e\u050f") + buf.write("\7C\2\2\u050f\u0510\7V\2\2\u0510\u00c6\3\2\2\2\u0511\u0512") + buf.write("\7H\2\2\u0512\u0513\7Q\2\2\u0513\u0514\7T\2\2\u0514\u0515") + buf.write("\7O\2\2\u0515\u0516\7C\2\2\u0516\u0517\7V\2\2\u0517\u0518") + buf.write("\7V\2\2\u0518\u0519\7G\2\2\u0519\u051a\7F\2\2\u051a\u00c8") + buf.write("\3\2\2\2\u051b\u051c\7H\2\2\u051c\u051d\7T\2\2\u051d\u051e") + buf.write("\7Q\2\2\u051e\u051f\7O\2\2\u051f\u00ca\3\2\2\2\u0520\u0521") + buf.write("\7H\2\2\u0521\u0522\7W\2\2\u0522\u0523\7N\2\2\u0523\u0524") + buf.write("\7N\2\2\u0524\u00cc\3\2\2\2\u0525\u0526\7H\2\2\u0526\u0527") + buf.write("\7W\2\2\u0527\u0528\7P\2\2\u0528\u0529\7E\2\2\u0529\u052a") + buf.write("\7V\2\2\u052a\u052b\7K\2\2\u052b\u052c\7Q\2\2\u052c\u052d") + buf.write("\7P\2\2\u052d\u00ce\3\2\2\2\u052e\u052f\7H\2\2\u052f\u0530") + buf.write("\7W\2\2\u0530\u0531\7P\2\2\u0531\u0532\7E\2\2\u0532\u0533") + buf.write("\7V\2\2\u0533\u0534\7K\2\2\u0534\u0535\7Q\2\2\u0535\u0536") + buf.write("\7P\2\2\u0536\u0537\7U\2\2\u0537\u00d0\3\2\2\2\u0538\u0539") + buf.write("\7I\2\2\u0539\u053a\7N\2\2\u053a\u053b\7Q\2\2\u053b\u053c") + buf.write("\7D\2\2\u053c\u053d\7C\2\2\u053d\u053e\7N\2\2\u053e\u00d2") + buf.write("\3\2\2\2\u053f\u0540\7I\2\2\u0540\u0541\7T\2\2\u0541\u0542") + buf.write("\7C\2\2\u0542\u0543\7P\2\2\u0543\u0544\7V\2\2\u0544\u00d4") + buf.write("\3\2\2\2\u0545\u0546\7I\2\2\u0546\u0547\7T\2\2\u0547\u0548") + buf.write("\7Q\2\2\u0548\u0549\7W\2\2\u0549\u054a\7R\2\2\u054a\u00d6") + buf.write("\3\2\2\2\u054b\u054c\7I\2\2\u054c\u054d\7T\2\2\u054d\u054e") + buf.write("\7Q\2\2\u054e\u054f\7W\2\2\u054f\u0550\7R\2\2\u0550\u0551") + buf.write("\7K\2\2\u0551\u0552\7P\2\2\u0552\u0553\7I\2\2\u0553\u00d8") + buf.write("\3\2\2\2\u0554\u0555\7J\2\2\u0555\u0556\7C\2\2\u0556\u0557") + buf.write("\7X\2\2\u0557\u0558\7K\2\2\u0558\u0559\7P\2\2\u0559\u055a") + buf.write("\7I\2\2\u055a\u00da\3\2\2\2\u055b\u055c\7J\2\2\u055c\u055d") + buf.write("\7Q\2\2\u055d\u055e\7W\2\2\u055e\u055f\7T\2\2\u055f\u00dc") + buf.write("\3\2\2\2\u0560\u0561\7K\2\2\u0561\u0562\7H\2\2\u0562\u00de") + buf.write("\3\2\2\2\u0563\u0564\7K\2\2\u0564\u0565\7I\2\2\u0565\u0566") + buf.write("\7P\2\2\u0566\u0567\7Q\2\2\u0567\u0568\7T\2\2\u0568\u0569") + buf.write("\7G\2\2\u0569\u00e0\3\2\2\2\u056a\u056b\7K\2\2\u056b\u056c") + buf.write("\7O\2\2\u056c\u056d\7R\2\2\u056d\u056e\7Q\2\2\u056e\u056f") + buf.write("\7T\2\2\u056f\u0570\7V\2\2\u0570\u00e2\3\2\2\2\u0571\u0572") + buf.write("\7K\2\2\u0572\u0573\7P\2\2\u0573\u00e4\3\2\2\2\u0574\u0575") + buf.write("\7K\2\2\u0575\u0576\7P\2\2\u0576\u0577\7F\2\2\u0577\u0578") + buf.write("\7G\2\2\u0578\u0579\7Z\2\2\u0579\u00e6\3\2\2\2\u057a\u057b") + buf.write("\7K\2\2\u057b\u057c\7P\2\2\u057c\u057d\7F\2\2\u057d\u057e") + buf.write("\7G\2\2\u057e\u057f\7Z\2\2\u057f\u0580\7G\2\2\u0580\u0581") + buf.write("\7U\2\2\u0581\u00e8\3\2\2\2\u0582\u0583\7K\2\2\u0583\u0584") + buf.write("\7P\2\2\u0584\u0585\7P\2\2\u0585\u0586\7G\2\2\u0586\u0587") + buf.write("\7T\2\2\u0587\u00ea\3\2\2\2\u0588\u0589\7K\2\2\u0589\u058a") + buf.write("\7P\2\2\u058a\u058b\7R\2\2\u058b\u058c\7C\2\2\u058c\u058d") + buf.write("\7V\2\2\u058d\u058e\7J\2\2\u058e\u00ec\3\2\2\2\u058f\u0590") + buf.write("\7K\2\2\u0590\u0591\7P\2\2\u0591\u0592\7R\2\2\u0592\u0593") + buf.write("\7W\2\2\u0593\u0594\7V\2\2\u0594\u0595\7H\2\2\u0595\u0596") + buf.write("\7Q\2\2\u0596\u0597\7T\2\2\u0597\u0598\7O\2\2\u0598\u0599") + buf.write("\7C\2\2\u0599\u059a\7V\2\2\u059a\u00ee\3\2\2\2\u059b\u059c") + buf.write("\7K\2\2\u059c\u059d\7P\2\2\u059d\u059e\7U\2\2\u059e\u059f") + buf.write("\7G\2\2\u059f\u05a0\7T\2\2\u05a0\u05a1\7V\2\2\u05a1\u00f0") + buf.write("\3\2\2\2\u05a2\u05a3\7K\2\2\u05a3\u05a4\7P\2\2\u05a4\u05a5") + buf.write("\7V\2\2\u05a5\u05a6\7G\2\2\u05a6\u05a7\7T\2\2\u05a7\u05a8") + buf.write("\7U\2\2\u05a8\u05a9\7G\2\2\u05a9\u05aa\7E\2\2\u05aa\u05ab") + buf.write("\7V\2\2\u05ab\u00f2\3\2\2\2\u05ac\u05ad\7K\2\2\u05ad\u05ae") + buf.write("\7P\2\2\u05ae\u05af\7V\2\2\u05af\u05b0\7G\2\2\u05b0\u05b1") + buf.write("\7T\2\2\u05b1\u05b2\7X\2\2\u05b2\u05b3\7C\2\2\u05b3\u05b4") + buf.write("\7N\2\2\u05b4\u00f4\3\2\2\2\u05b5\u05b6\7K\2\2\u05b6\u05b7") + buf.write("\7P\2\2\u05b7\u05b8\7V\2\2\u05b8\u05b9\7Q\2\2\u05b9\u00f6") + buf.write("\3\2\2\2\u05ba\u05bb\7K\2\2\u05bb\u05bc\7U\2\2\u05bc\u00f8") + buf.write("\3\2\2\2\u05bd\u05be\7K\2\2\u05be\u05bf\7V\2\2\u05bf\u05c0") + buf.write("\7G\2\2\u05c0\u05c1\7O\2\2\u05c1\u05c2\7U\2\2\u05c2\u00fa") + buf.write("\3\2\2\2\u05c3\u05c4\7L\2\2\u05c4\u05c5\7Q\2\2\u05c5\u05c6") + buf.write("\7K\2\2\u05c6\u05c7\7P\2\2\u05c7\u00fc\3\2\2\2\u05c8\u05c9") + buf.write("\7M\2\2\u05c9\u05ca\7G\2\2\u05ca\u05cb\7[\2\2\u05cb\u05cc") + buf.write("\7U\2\2\u05cc\u00fe\3\2\2\2\u05cd\u05ce\7N\2\2\u05ce\u05cf") + buf.write("\7C\2\2\u05cf\u05d0\7U\2\2\u05d0\u05d1\7V\2\2\u05d1\u0100") + buf.write("\3\2\2\2\u05d2\u05d3\7N\2\2\u05d3\u05d4\7C\2\2\u05d4\u05d5") + buf.write("\7V\2\2\u05d5\u05d6\7G\2\2\u05d6\u05d7\7T\2\2\u05d7\u05d8") + buf.write("\7C\2\2\u05d8\u05d9\7N\2\2\u05d9\u0102\3\2\2\2\u05da\u05db") + buf.write("\7N\2\2\u05db\u05dc\7C\2\2\u05dc\u05dd\7\\\2\2\u05dd\u05de") + buf.write("\7[\2\2\u05de\u0104\3\2\2\2\u05df\u05e0\7N\2\2\u05e0\u05e1") + buf.write("\7G\2\2\u05e1\u05e2\7C\2\2\u05e2\u05e3\7F\2\2\u05e3\u05e4") + buf.write("\7K\2\2\u05e4\u05e5\7P\2\2\u05e5\u05e6\7I\2\2\u05e6\u0106") + buf.write("\3\2\2\2\u05e7\u05e8\7N\2\2\u05e8\u05e9\7G\2\2\u05e9\u05ea") + buf.write("\7H\2\2\u05ea\u05eb\7V\2\2\u05eb\u0108\3\2\2\2\u05ec\u05ed") + buf.write("\7N\2\2\u05ed\u05ee\7K\2\2\u05ee\u05ef\7M\2\2\u05ef\u05f0") + buf.write("\7G\2\2\u05f0\u010a\3\2\2\2\u05f1\u05f2\7N\2\2\u05f2\u05f3") + buf.write("\7K\2\2\u05f3\u05f4\7O\2\2\u05f4\u05f5\7K\2\2\u05f5\u05f6") + buf.write("\7V\2\2\u05f6\u010c\3\2\2\2\u05f7\u05f8\7N\2\2\u05f8\u05f9") + buf.write("\7K\2\2\u05f9\u05fa\7P\2\2\u05fa\u05fb\7G\2\2\u05fb\u05fc") + buf.write("\7U\2\2\u05fc\u010e\3\2\2\2\u05fd\u05fe\7N\2\2\u05fe\u05ff") + buf.write("\7K\2\2\u05ff\u0600\7U\2\2\u0600\u0601\7V\2\2\u0601\u0110") + buf.write("\3\2\2\2\u0602\u0603\7N\2\2\u0603\u0604\7Q\2\2\u0604\u0605") + buf.write("\7C\2\2\u0605\u0606\7F\2\2\u0606\u0112\3\2\2\2\u0607\u0608") + buf.write("\7N\2\2\u0608\u0609\7Q\2\2\u0609\u060a\7E\2\2\u060a\u060b") + buf.write("\7C\2\2\u060b\u060c\7N\2\2\u060c\u0114\3\2\2\2\u060d\u060e") + buf.write("\7N\2\2\u060e\u060f\7Q\2\2\u060f\u0610\7E\2\2\u0610\u0611") + buf.write("\7C\2\2\u0611\u0612\7V\2\2\u0612\u0613\7K\2\2\u0613\u0614") + buf.write("\7Q\2\2\u0614\u0615\7P\2\2\u0615\u0116\3\2\2\2\u0616\u0617") + buf.write("\7N\2\2\u0617\u0618\7Q\2\2\u0618\u0619\7E\2\2\u0619\u061a") + buf.write("\7M\2\2\u061a\u0118\3\2\2\2\u061b\u061c\7N\2\2\u061c\u061d") + buf.write("\7Q\2\2\u061d\u061e\7E\2\2\u061e\u061f\7M\2\2\u061f\u0620") + buf.write("\7U\2\2\u0620\u011a\3\2\2\2\u0621\u0622\7N\2\2\u0622\u0623") + buf.write("\7Q\2\2\u0623\u0624\7I\2\2\u0624\u0625\7K\2\2\u0625\u0626") + buf.write("\7E\2\2\u0626\u0627\7C\2\2\u0627\u0628\7N\2\2\u0628\u011c") + buf.write("\3\2\2\2\u0629\u062a\7O\2\2\u062a\u062b\7C\2\2\u062b\u062c") + buf.write("\7E\2\2\u062c\u062d\7T\2\2\u062d\u062e\7Q\2\2\u062e\u011e") + buf.write("\3\2\2\2\u062f\u0630\7O\2\2\u0630\u0631\7C\2\2\u0631\u0632") + buf.write("\7R\2\2\u0632\u0120\3\2\2\2\u0633\u0634\7O\2\2\u0634\u0635") + buf.write("\7C\2\2\u0635\u0636\7V\2\2\u0636\u0637\7E\2\2\u0637\u0638") + buf.write("\7J\2\2\u0638\u0639\7G\2\2\u0639\u063a\7F\2\2\u063a\u0122") + buf.write("\3\2\2\2\u063b\u063c\7O\2\2\u063c\u063d\7G\2\2\u063d\u063e") + buf.write("\7T\2\2\u063e\u063f\7I\2\2\u063f\u0640\7G\2\2\u0640\u0124") + buf.write("\3\2\2\2\u0641\u0642\7O\2\2\u0642\u0643\7K\2\2\u0643\u0644") + buf.write("\7P\2\2\u0644\u0645\7W\2\2\u0645\u0646\7V\2\2\u0646\u0647") + buf.write("\7G\2\2\u0647\u0126\3\2\2\2\u0648\u0649\7O\2\2\u0649\u064a") + buf.write("\7Q\2\2\u064a\u064b\7P\2\2\u064b\u064c\7V\2\2\u064c\u064d") + buf.write("\7J\2\2\u064d\u0128\3\2\2\2\u064e\u064f\7O\2\2\u064f\u0650") + buf.write("\7U\2\2\u0650\u0651\7E\2\2\u0651\u0652\7M\2\2\u0652\u012a") + buf.write("\3\2\2\2\u0653\u0654\7P\2\2\u0654\u0655\7C\2\2\u0655\u0656") + buf.write("\7O\2\2\u0656\u0657\7G\2\2\u0657\u0658\7U\2\2\u0658\u0659") + buf.write("\7R\2\2\u0659\u065a\7C\2\2\u065a\u065b\7E\2\2\u065b\u065c") + buf.write("\7G\2\2\u065c\u012c\3\2\2\2\u065d\u065e\7P\2\2\u065e\u065f") + buf.write("\7C\2\2\u065f\u0660\7O\2\2\u0660\u0661\7G\2\2\u0661\u0662") + buf.write("\7U\2\2\u0662\u0663\7R\2\2\u0663\u0664\7C\2\2\u0664\u0665") + buf.write("\7E\2\2\u0665\u0666\7G\2\2\u0666\u0667\7U\2\2\u0667\u012e") + buf.write("\3\2\2\2\u0668\u0669\7P\2\2\u0669\u066a\7C\2\2\u066a\u066b") + buf.write("\7V\2\2\u066b\u066c\7W\2\2\u066c\u066d\7T\2\2\u066d\u066e") + buf.write("\7C\2\2\u066e\u066f\7N\2\2\u066f\u0130\3\2\2\2\u0670\u0671") + buf.write("\7P\2\2\u0671\u0672\7Q\2\2\u0672\u0132\3\2\2\2\u0673\u0674") + buf.write("\7P\2\2\u0674\u0675\7Q\2\2\u0675\u0678\7V\2\2\u0676\u0678") + buf.write("\7#\2\2\u0677\u0673\3\2\2\2\u0677\u0676\3\2\2\2\u0678") + buf.write("\u0134\3\2\2\2\u0679\u067a\7P\2\2\u067a\u067b\7W\2\2\u067b") + buf.write("\u067c\7N\2\2\u067c\u067d\7N\2\2\u067d\u0136\3\2\2\2\u067e") + buf.write("\u067f\7P\2\2\u067f\u0680\7W\2\2\u0680\u0681\7N\2\2\u0681") + buf.write("\u0682\7N\2\2\u0682\u0683\7U\2\2\u0683\u0138\3\2\2\2\u0684") + buf.write("\u0685\7Q\2\2\u0685\u0686\7H\2\2\u0686\u013a\3\2\2\2\u0687") + buf.write("\u0688\7Q\2\2\u0688\u0689\7P\2\2\u0689\u013c\3\2\2\2\u068a") + buf.write("\u068b\7Q\2\2\u068b\u068c\7P\2\2\u068c\u068d\7N\2\2\u068d") + buf.write("\u068e\7[\2\2\u068e\u013e\3\2\2\2\u068f\u0690\7Q\2\2\u0690") + buf.write("\u0691\7R\2\2\u0691\u0692\7V\2\2\u0692\u0693\7K\2\2\u0693") + buf.write("\u0694\7Q\2\2\u0694\u0695\7P\2\2\u0695\u0140\3\2\2\2\u0696") + buf.write("\u0697\7Q\2\2\u0697\u0698\7R\2\2\u0698\u0699\7V\2\2\u0699") + buf.write("\u069a\7K\2\2\u069a\u069b\7Q\2\2\u069b\u069c\7P\2\2\u069c") + buf.write("\u069d\7U\2\2\u069d\u0142\3\2\2\2\u069e\u069f\7Q\2\2\u069f") + buf.write("\u06a0\7T\2\2\u06a0\u0144\3\2\2\2\u06a1\u06a2\7Q\2\2\u06a2") + buf.write("\u06a3\7T\2\2\u06a3\u06a4\7F\2\2\u06a4\u06a5\7G\2\2\u06a5") + buf.write("\u06a6\7T\2\2\u06a6\u0146\3\2\2\2\u06a7\u06a8\7Q\2\2\u06a8") + buf.write("\u06a9\7W\2\2\u06a9\u06aa\7V\2\2\u06aa\u0148\3\2\2\2\u06ab") + buf.write("\u06ac\7Q\2\2\u06ac\u06ad\7W\2\2\u06ad\u06ae\7V\2\2\u06ae") + buf.write("\u06af\7G\2\2\u06af\u06b0\7T\2\2\u06b0\u014a\3\2\2\2\u06b1") + buf.write("\u06b2\7Q\2\2\u06b2\u06b3\7W\2\2\u06b3\u06b4\7V\2\2\u06b4") + buf.write("\u06b5\7R\2\2\u06b5\u06b6\7W\2\2\u06b6\u06b7\7V\2\2\u06b7") + buf.write("\u06b8\7H\2\2\u06b8\u06b9\7Q\2\2\u06b9\u06ba\7T\2\2\u06ba") + buf.write("\u06bb\7O\2\2\u06bb\u06bc\7C\2\2\u06bc\u06bd\7V\2\2\u06bd") + buf.write("\u014c\3\2\2\2\u06be\u06bf\7Q\2\2\u06bf\u06c0\7X\2\2\u06c0") + buf.write("\u06c1\7G\2\2\u06c1\u06c2\7T\2\2\u06c2\u014e\3\2\2\2\u06c3") + buf.write("\u06c4\7Q\2\2\u06c4\u06c5\7X\2\2\u06c5\u06c6\7G\2\2\u06c6") + buf.write("\u06c7\7T\2\2\u06c7\u06c8\7N\2\2\u06c8\u06c9\7C\2\2\u06c9") + buf.write("\u06ca\7R\2\2\u06ca\u06cb\7U\2\2\u06cb\u0150\3\2\2\2\u06cc") + buf.write("\u06cd\7Q\2\2\u06cd\u06ce\7X\2\2\u06ce\u06cf\7G\2\2\u06cf") + buf.write("\u06d0\7T\2\2\u06d0\u06d1\7N\2\2\u06d1\u06d2\7C\2\2\u06d2") + buf.write("\u06d3\7[\2\2\u06d3\u0152\3\2\2\2\u06d4\u06d5\7Q\2\2\u06d5") + buf.write("\u06d6\7X\2\2\u06d6\u06d7\7G\2\2\u06d7\u06d8\7T\2\2\u06d8") + buf.write("\u06d9\7Y\2\2\u06d9\u06da\7T\2\2\u06da\u06db\7K\2\2\u06db") + buf.write("\u06dc\7V\2\2\u06dc\u06dd\7G\2\2\u06dd\u0154\3\2\2\2\u06de") + buf.write("\u06df\7R\2\2\u06df\u06e0\7C\2\2\u06e0\u06e1\7T\2\2\u06e1") + buf.write("\u06e2\7V\2\2\u06e2\u06e3\7K\2\2\u06e3\u06e4\7V\2\2\u06e4") + buf.write("\u06e5\7K\2\2\u06e5\u06e6\7Q\2\2\u06e6\u06e7\7P\2\2\u06e7") + buf.write("\u0156\3\2\2\2\u06e8\u06e9\7R\2\2\u06e9\u06ea\7C\2\2\u06ea") + buf.write("\u06eb\7T\2\2\u06eb\u06ec\7V\2\2\u06ec\u06ed\7K\2\2\u06ed") + buf.write("\u06ee\7V\2\2\u06ee\u06ef\7K\2\2\u06ef\u06f0\7Q\2\2\u06f0") + buf.write("\u06f1\7P\2\2\u06f1\u06f2\7G\2\2\u06f2\u06f3\7F\2\2\u06f3") + buf.write("\u0158\3\2\2\2\u06f4\u06f5\7R\2\2\u06f5\u06f6\7C\2\2\u06f6") + buf.write("\u06f7\7T\2\2\u06f7\u06f8\7V\2\2\u06f8\u06f9\7K\2\2\u06f9") + buf.write("\u06fa\7V\2\2\u06fa\u06fb\7K\2\2\u06fb\u06fc\7Q\2\2\u06fc") + buf.write("\u06fd\7P\2\2\u06fd\u06fe\7U\2\2\u06fe\u015a\3\2\2\2\u06ff") + buf.write("\u0700\7R\2\2\u0700\u0701\7G\2\2\u0701\u0702\7T\2\2\u0702") + buf.write("\u0703\7E\2\2\u0703\u0704\7G\2\2\u0704\u0705\7P\2\2\u0705") + buf.write("\u0706\7V\2\2\u0706\u015c\3\2\2\2\u0707\u0708\7R\2\2\u0708") + buf.write("\u0709\7K\2\2\u0709\u070a\7X\2\2\u070a\u070b\7Q\2\2\u070b") + buf.write("\u070c\7V\2\2\u070c\u015e\3\2\2\2\u070d\u070e\7R\2\2\u070e") + buf.write("\u070f\7N\2\2\u070f\u0710\7C\2\2\u0710\u0711\7E\2\2\u0711") + buf.write("\u0712\7K\2\2\u0712\u0713\7P\2\2\u0713\u0714\7I\2\2\u0714") + buf.write("\u0160\3\2\2\2\u0715\u0716\7R\2\2\u0716\u0717\7Q\2\2\u0717") + buf.write("\u0718\7U\2\2\u0718\u0719\7K\2\2\u0719\u071a\7V\2\2\u071a") + buf.write("\u071b\7K\2\2\u071b\u071c\7Q\2\2\u071c\u071d\7P\2\2\u071d") + buf.write("\u0162\3\2\2\2\u071e\u071f\7R\2\2\u071f\u0720\7T\2\2\u0720") + buf.write("\u0721\7G\2\2\u0721\u0722\7E\2\2\u0722\u0723\7G\2\2\u0723") + buf.write("\u0724\7F\2\2\u0724\u0725\7K\2\2\u0725\u0726\7P\2\2\u0726") + buf.write("\u0727\7I\2\2\u0727\u0164\3\2\2\2\u0728\u0729\7R\2\2\u0729") + buf.write("\u072a\7T\2\2\u072a\u072b\7K\2\2\u072b\u072c\7O\2\2\u072c") + buf.write("\u072d\7C\2\2\u072d\u072e\7T\2\2\u072e\u072f\7[\2\2\u072f") + buf.write("\u0166\3\2\2\2\u0730\u0731\7R\2\2\u0731\u0732\7T\2\2\u0732") + buf.write("\u0733\7K\2\2\u0733\u0734\7P\2\2\u0734\u0735\7E\2\2\u0735") + buf.write("\u0736\7K\2\2\u0736\u0737\7R\2\2\u0737\u0738\7C\2\2\u0738") + buf.write("\u0739\7N\2\2\u0739\u073a\7U\2\2\u073a\u0168\3\2\2\2\u073b") + buf.write("\u073c\7R\2\2\u073c\u073d\7T\2\2\u073d\u073e\7Q\2\2\u073e") + buf.write("\u073f\7R\2\2\u073f\u0740\7G\2\2\u0740\u0741\7T\2\2\u0741") + buf.write("\u0742\7V\2\2\u0742\u0743\7K\2\2\u0743\u0744\7G\2\2\u0744") + buf.write("\u0745\7U\2\2\u0745\u016a\3\2\2\2\u0746\u0747\7R\2\2\u0747") + buf.write("\u0748\7W\2\2\u0748\u0749\7T\2\2\u0749\u074a\7I\2\2\u074a") + buf.write("\u074b\7G\2\2\u074b\u016c\3\2\2\2\u074c\u074d\7S\2\2\u074d") + buf.write("\u074e\7W\2\2\u074e\u074f\7G\2\2\u074f\u0750\7T\2\2\u0750") + buf.write("\u0751\7[\2\2\u0751\u016e\3\2\2\2\u0752\u0753\7T\2\2\u0753") + buf.write("\u0754\7C\2\2\u0754\u0755\7P\2\2\u0755\u0756\7I\2\2\u0756") + buf.write("\u0757\7G\2\2\u0757\u0170\3\2\2\2\u0758\u0759\7T\2\2\u0759") + buf.write("\u075a\7G\2\2\u075a\u075b\7E\2\2\u075b\u075c\7Q\2\2\u075c") + buf.write("\u075d\7T\2\2\u075d\u075e\7F\2\2\u075e\u075f\7T\2\2\u075f") + buf.write("\u0760\7G\2\2\u0760\u0761\7C\2\2\u0761\u0762\7F\2\2\u0762") + buf.write("\u0763\7G\2\2\u0763\u0764\7T\2\2\u0764\u0172\3\2\2\2\u0765") + buf.write("\u0766\7T\2\2\u0766\u0767\7G\2\2\u0767\u0768\7E\2\2\u0768") + buf.write("\u0769\7Q\2\2\u0769\u076a\7T\2\2\u076a\u076b\7F\2\2\u076b") + buf.write("\u076c\7Y\2\2\u076c\u076d\7T\2\2\u076d\u076e\7K\2\2\u076e") + buf.write("\u076f\7V\2\2\u076f\u0770\7G\2\2\u0770\u0771\7T\2\2\u0771") + buf.write("\u0174\3\2\2\2\u0772\u0773\7T\2\2\u0773\u0774\7G\2\2\u0774") + buf.write("\u0775\7E\2\2\u0775\u0776\7Q\2\2\u0776\u0777\7X\2\2\u0777") + buf.write("\u0778\7G\2\2\u0778\u0779\7T\2\2\u0779\u0176\3\2\2\2\u077a") + buf.write("\u077b\7T\2\2\u077b\u077c\7G\2\2\u077c\u077d\7F\2\2\u077d") + buf.write("\u077e\7W\2\2\u077e\u077f\7E\2\2\u077f\u0780\7G\2\2\u0780") + buf.write("\u0178\3\2\2\2\u0781\u0782\7T\2\2\u0782\u0783\7G\2\2\u0783") + buf.write("\u0784\7H\2\2\u0784\u0785\7G\2\2\u0785\u0786\7T\2\2\u0786") + buf.write("\u0787\7G\2\2\u0787\u0788\7P\2\2\u0788\u0789\7E\2\2\u0789") + buf.write("\u078a\7G\2\2\u078a\u078b\7U\2\2\u078b\u017a\3\2\2\2\u078c") + buf.write("\u078d\7T\2\2\u078d\u078e\7G\2\2\u078e\u078f\7H\2\2\u078f") + buf.write("\u0790\7T\2\2\u0790\u0791\7G\2\2\u0791\u0792\7U\2\2\u0792") + buf.write("\u0793\7J\2\2\u0793\u017c\3\2\2\2\u0794\u0795\7T\2\2\u0795") + buf.write("\u0796\7G\2\2\u0796\u0797\7P\2\2\u0797\u0798\7C\2\2\u0798") + buf.write("\u0799\7O\2\2\u0799\u079a\7G\2\2\u079a\u017e\3\2\2\2\u079b") + buf.write("\u079c\7T\2\2\u079c\u079d\7G\2\2\u079d\u079e\7R\2\2\u079e") + buf.write("\u079f\7C\2\2\u079f\u07a0\7K\2\2\u07a0\u07a1\7T\2\2\u07a1") + buf.write("\u0180\3\2\2\2\u07a2\u07a3\7T\2\2\u07a3\u07a4\7G\2\2\u07a4") + buf.write("\u07a5\7R\2\2\u07a5\u07a6\7N\2\2\u07a6\u07a7\7C\2\2\u07a7") + buf.write("\u07a8\7E\2\2\u07a8\u07a9\7G\2\2\u07a9\u0182\3\2\2\2\u07aa") + buf.write("\u07ab\7T\2\2\u07ab\u07ac\7G\2\2\u07ac\u07ad\7U\2\2\u07ad") + buf.write("\u07ae\7G\2\2\u07ae\u07af\7V\2\2\u07af\u0184\3\2\2\2\u07b0") + buf.write("\u07b1\7T\2\2\u07b1\u07b2\7G\2\2\u07b2\u07b3\7U\2\2\u07b3") + buf.write("\u07b4\7V\2\2\u07b4\u07b5\7T\2\2\u07b5\u07b6\7K\2\2\u07b6") + buf.write("\u07b7\7E\2\2\u07b7\u07b8\7V\2\2\u07b8\u0186\3\2\2\2\u07b9") + buf.write("\u07ba\7T\2\2\u07ba\u07bb\7G\2\2\u07bb\u07bc\7X\2\2\u07bc") + buf.write("\u07bd\7Q\2\2\u07bd\u07be\7M\2\2\u07be\u07bf\7G\2\2\u07bf") + buf.write("\u0188\3\2\2\2\u07c0\u07c1\7T\2\2\u07c1\u07c2\7K\2\2\u07c2") + buf.write("\u07c3\7I\2\2\u07c3\u07c4\7J\2\2\u07c4\u07c5\7V\2\2\u07c5") + buf.write("\u018a\3\2\2\2\u07c6\u07c7\7T\2\2\u07c7\u07c8\7N\2\2\u07c8") + buf.write("\u07c9\7K\2\2\u07c9\u07ca\7M\2\2\u07ca\u07d2\7G\2\2\u07cb") + buf.write("\u07cc\7T\2\2\u07cc\u07cd\7G\2\2\u07cd\u07ce\7I\2\2\u07ce") + buf.write("\u07cf\7G\2\2\u07cf\u07d0\7Z\2\2\u07d0\u07d2\7R\2\2\u07d1") + buf.write("\u07c6\3\2\2\2\u07d1\u07cb\3\2\2\2\u07d2\u018c\3\2\2\2") + buf.write("\u07d3\u07d4\7T\2\2\u07d4\u07d5\7Q\2\2\u07d5\u07d6\7N") + buf.write("\2\2\u07d6\u07d7\7G\2\2\u07d7\u018e\3\2\2\2\u07d8\u07d9") + buf.write("\7T\2\2\u07d9\u07da\7Q\2\2\u07da\u07db\7N\2\2\u07db\u07dc") + buf.write("\7G\2\2\u07dc\u07dd\7U\2\2\u07dd\u0190\3\2\2\2\u07de\u07df") + buf.write("\7T\2\2\u07df\u07e0\7Q\2\2\u07e0\u07e1\7N\2\2\u07e1\u07e2") + buf.write("\7N\2\2\u07e2\u07e3\7D\2\2\u07e3\u07e4\7C\2\2\u07e4\u07e5") + buf.write("\7E\2\2\u07e5\u07e6\7M\2\2\u07e6\u0192\3\2\2\2\u07e7\u07e8") + buf.write("\7T\2\2\u07e8\u07e9\7Q\2\2\u07e9\u07ea\7N\2\2\u07ea\u07eb") + buf.write("\7N\2\2\u07eb\u07ec\7W\2\2\u07ec\u07ed\7R\2\2\u07ed\u0194") + buf.write("\3\2\2\2\u07ee\u07ef\7T\2\2\u07ef\u07f0\7Q\2\2\u07f0\u07f1") + buf.write("\7Y\2\2\u07f1\u0196\3\2\2\2\u07f2\u07f3\7T\2\2\u07f3\u07f4") + buf.write("\7Q\2\2\u07f4\u07f5\7Y\2\2\u07f5\u07f6\7U\2\2\u07f6\u0198") + buf.write("\3\2\2\2\u07f7\u07f8\7U\2\2\u07f8\u07f9\7E\2\2\u07f9\u07fa") + buf.write("\7J\2\2\u07fa\u07fb\7G\2\2\u07fb\u07fc\7O\2\2\u07fc\u07fd") + buf.write("\7C\2\2\u07fd\u019a\3\2\2\2\u07fe\u07ff\7U\2\2\u07ff\u0800") + buf.write("\7G\2\2\u0800\u0801\7E\2\2\u0801\u0802\7Q\2\2\u0802\u0803") + buf.write("\7P\2\2\u0803\u0804\7F\2\2\u0804\u019c\3\2\2\2\u0805\u0806") + buf.write("\7U\2\2\u0806\u0807\7G\2\2\u0807\u0808\7N\2\2\u0808\u0809") + buf.write("\7G\2\2\u0809\u080a\7E\2\2\u080a\u080b\7V\2\2\u080b\u019e") + buf.write("\3\2\2\2\u080c\u080d\7U\2\2\u080d\u080e\7G\2\2\u080e\u080f") + buf.write("\7O\2\2\u080f\u0810\7K\2\2\u0810\u01a0\3\2\2\2\u0811\u0812") + buf.write("\7U\2\2\u0812\u0813\7G\2\2\u0813\u0814\7R\2\2\u0814\u0815") + buf.write("\7C\2\2\u0815\u0816\7T\2\2\u0816\u0817\7C\2\2\u0817\u0818") + buf.write("\7V\2\2\u0818\u0819\7G\2\2\u0819\u081a\7F\2\2\u081a\u01a2") + buf.write("\3\2\2\2\u081b\u081c\7U\2\2\u081c\u081d\7G\2\2\u081d\u081e") + buf.write("\7T\2\2\u081e\u081f\7F\2\2\u081f\u0820\7G\2\2\u0820\u01a4") + buf.write("\3\2\2\2\u0821\u0822\7U\2\2\u0822\u0823\7G\2\2\u0823\u0824") + buf.write("\7T\2\2\u0824\u0825\7F\2\2\u0825\u0826\7G\2\2\u0826\u0827") + buf.write("\7R\2\2\u0827\u0828\7T\2\2\u0828\u0829\7Q\2\2\u0829\u082a") + buf.write("\7R\2\2\u082a\u082b\7G\2\2\u082b\u082c\7T\2\2\u082c\u082d") + buf.write("\7V\2\2\u082d\u082e\7K\2\2\u082e\u082f\7G\2\2\u082f\u0830") + buf.write("\7U\2\2\u0830\u01a6\3\2\2\2\u0831\u0832\7U\2\2\u0832\u0833") + buf.write("\7G\2\2\u0833\u0834\7U\2\2\u0834\u0835\7U\2\2\u0835\u0836") + buf.write("\7K\2\2\u0836\u0837\7Q\2\2\u0837\u0838\7P\2\2\u0838\u0839") + buf.write("\7a\2\2\u0839\u083a\7W\2\2\u083a\u083b\7U\2\2\u083b\u083c") + buf.write("\7G\2\2\u083c\u083d\7T\2\2\u083d\u01a8\3\2\2\2\u083e\u083f") + buf.write("\7U\2\2\u083f\u0840\7G\2\2\u0840\u0841\7V\2\2\u0841\u01aa") + buf.write("\3\2\2\2\u0842\u0843\7O\2\2\u0843\u0844\7K\2\2\u0844\u0845") + buf.write("\7P\2\2\u0845\u0846\7W\2\2\u0846\u0847\7U\2\2\u0847\u01ac") + buf.write("\3\2\2\2\u0848\u0849\7U\2\2\u0849\u084a\7G\2\2\u084a\u084b") + buf.write("\7V\2\2\u084b\u084c\7U\2\2\u084c\u01ae\3\2\2\2\u084d\u084e") + buf.write("\7U\2\2\u084e\u084f\7J\2\2\u084f\u0850\7Q\2\2\u0850\u0851") + buf.write("\7Y\2\2\u0851\u01b0\3\2\2\2\u0852\u0853\7U\2\2\u0853\u0854") + buf.write("\7M\2\2\u0854\u0855\7G\2\2\u0855\u0856\7Y\2\2\u0856\u0857") + buf.write("\7G\2\2\u0857\u0858\7F\2\2\u0858\u01b2\3\2\2\2\u0859\u085a") + buf.write("\7U\2\2\u085a\u085b\7Q\2\2\u085b\u085c\7O\2\2\u085c\u085d") + buf.write("\7G\2\2\u085d\u01b4\3\2\2\2\u085e\u085f\7U\2\2\u085f\u0860") + buf.write("\7Q\2\2\u0860\u0861\7T\2\2\u0861\u0862\7V\2\2\u0862\u01b6") + buf.write("\3\2\2\2\u0863\u0864\7U\2\2\u0864\u0865\7Q\2\2\u0865\u0866") + buf.write("\7T\2\2\u0866\u0867\7V\2\2\u0867\u0868\7G\2\2\u0868\u0869") + buf.write("\7F\2\2\u0869\u01b8\3\2\2\2\u086a\u086b\7U\2\2\u086b\u086c") + buf.write("\7V\2\2\u086c\u086d\7C\2\2\u086d\u086e\7T\2\2\u086e\u086f") + buf.write("\7V\2\2\u086f\u01ba\3\2\2\2\u0870\u0871\7U\2\2\u0871\u0872") + buf.write("\7V\2\2\u0872\u0873\7C\2\2\u0873\u0874\7V\2\2\u0874\u0875") + buf.write("\7K\2\2\u0875\u0876\7U\2\2\u0876\u0877\7V\2\2\u0877\u0878") + buf.write("\7K\2\2\u0878\u0879\7E\2\2\u0879\u087a\7U\2\2\u087a\u01bc") + buf.write("\3\2\2\2\u087b\u087c\7U\2\2\u087c\u087d\7V\2\2\u087d\u087e") + buf.write("\7Q\2\2\u087e\u087f\7T\2\2\u087f\u0880\7G\2\2\u0880\u0881") + buf.write("\7F\2\2\u0881\u01be\3\2\2\2\u0882\u0883\7U\2\2\u0883\u0884") + buf.write("\7V\2\2\u0884\u0885\7T\2\2\u0885\u0886\7C\2\2\u0886\u0887") + buf.write("\7V\2\2\u0887\u0888\7K\2\2\u0888\u0889\7H\2\2\u0889\u088a") + buf.write("\7[\2\2\u088a\u01c0\3\2\2\2\u088b\u088c\7U\2\2\u088c\u088d") + buf.write("\7V\2\2\u088d\u088e\7T\2\2\u088e\u088f\7W\2\2\u088f\u0890") + buf.write("\7E\2\2\u0890\u0891\7V\2\2\u0891\u01c2\3\2\2\2\u0892\u0893") + buf.write("\7U\2\2\u0893\u0894\7W\2\2\u0894\u0895\7D\2\2\u0895\u0896") + buf.write("\7U\2\2\u0896\u0897\7V\2\2\u0897\u0898\7T\2\2\u0898\u01c4") + buf.write("\3\2\2\2\u0899\u089a\7U\2\2\u089a\u089b\7W\2\2\u089b\u089c") + buf.write("\7D\2\2\u089c\u089d\7U\2\2\u089d\u089e\7V\2\2\u089e\u089f") + buf.write("\7T\2\2\u089f\u08a0\7K\2\2\u08a0\u08a1\7P\2\2\u08a1\u08a2") + buf.write("\7I\2\2\u08a2\u01c6\3\2\2\2\u08a3\u08a4\7V\2\2\u08a4\u08a5") + buf.write("\7C\2\2\u08a5\u08a6\7D\2\2\u08a6\u08a7\7N\2\2\u08a7\u08a8") + buf.write("\7G\2\2\u08a8\u01c8\3\2\2\2\u08a9\u08aa\7V\2\2\u08aa\u08ab") + buf.write("\7C\2\2\u08ab\u08ac\7D\2\2\u08ac\u08ad\7N\2\2\u08ad\u08ae") + buf.write("\7G\2\2\u08ae\u08af\7U\2\2\u08af\u01ca\3\2\2\2\u08b0\u08b1") + buf.write("\7V\2\2\u08b1\u08b2\7C\2\2\u08b2\u08b3\7D\2\2\u08b3\u08b4") + buf.write("\7N\2\2\u08b4\u08b5\7G\2\2\u08b5\u08b6\7U\2\2\u08b6\u08b7") + buf.write("\7C\2\2\u08b7\u08b8\7O\2\2\u08b8\u08b9\7R\2\2\u08b9\u08ba") + buf.write("\7N\2\2\u08ba\u08bb\7G\2\2\u08bb\u01cc\3\2\2\2\u08bc\u08bd") + buf.write("\7V\2\2\u08bd\u08be\7D\2\2\u08be\u08bf\7N\2\2\u08bf\u08c0") + buf.write("\7R\2\2\u08c0\u08c1\7T\2\2\u08c1\u08c2\7Q\2\2\u08c2\u08c3") + buf.write("\7R\2\2\u08c3\u08c4\7G\2\2\u08c4\u08c5\7T\2\2\u08c5\u08c6") + buf.write("\7V\2\2\u08c6\u08c7\7K\2\2\u08c7\u08c8\7G\2\2\u08c8\u08c9") + buf.write("\7U\2\2\u08c9\u01ce\3\2\2\2\u08ca\u08cb\7V\2\2\u08cb\u08cc") + buf.write("\7G\2\2\u08cc\u08cd\7O\2\2\u08cd\u08ce\7R\2\2\u08ce\u08cf") + buf.write("\7Q\2\2\u08cf\u08d0\7T\2\2\u08d0\u08d1\7C\2\2\u08d1\u08d2") + buf.write("\7T\2\2\u08d2\u08d8\7[\2\2\u08d3\u08d4\7V\2\2\u08d4\u08d5") + buf.write("\7G\2\2\u08d5\u08d6\7O\2\2\u08d6\u08d8\7R\2\2\u08d7\u08ca") + buf.write("\3\2\2\2\u08d7\u08d3\3\2\2\2\u08d8\u01d0\3\2\2\2\u08d9") + buf.write("\u08da\7V\2\2\u08da\u08db\7G\2\2\u08db\u08dc\7T\2\2\u08dc") + buf.write("\u08dd\7O\2\2\u08dd\u08de\7K\2\2\u08de\u08df\7P\2\2\u08df") + buf.write("\u08e0\7C\2\2\u08e0\u08e1\7V\2\2\u08e1\u08e2\7G\2\2\u08e2") + buf.write("\u08e3\7F\2\2\u08e3\u01d2\3\2\2\2\u08e4\u08e5\7V\2\2\u08e5") + buf.write("\u08e6\7J\2\2\u08e6\u08e7\7G\2\2\u08e7\u08e8\7P\2\2\u08e8") + buf.write("\u01d4\3\2\2\2\u08e9\u08ea\7V\2\2\u08ea\u08eb\7Q\2\2\u08eb") + buf.write("\u01d6\3\2\2\2\u08ec\u08ed\7V\2\2\u08ed\u08ee\7Q\2\2\u08ee") + buf.write("\u08ef\7W\2\2\u08ef\u08f0\7E\2\2\u08f0\u08f1\7J\2\2\u08f1") + buf.write("\u01d8\3\2\2\2\u08f2\u08f3\7V\2\2\u08f3\u08f4\7T\2\2\u08f4") + buf.write("\u08f5\7C\2\2\u08f5\u08f6\7K\2\2\u08f6\u08f7\7N\2\2\u08f7") + buf.write("\u08f8\7K\2\2\u08f8\u08f9\7P\2\2\u08f9\u08fa\7I\2\2\u08fa") + buf.write("\u01da\3\2\2\2\u08fb\u08fc\7V\2\2\u08fc\u08fd\7T\2\2\u08fd") + buf.write("\u08fe\7C\2\2\u08fe\u08ff\7P\2\2\u08ff\u0900\7U\2\2\u0900") + buf.write("\u0901\7C\2\2\u0901\u0902\7E\2\2\u0902\u0903\7V\2\2\u0903") + buf.write("\u0904\7K\2\2\u0904\u0905\7Q\2\2\u0905\u0906\7P\2\2\u0906") + buf.write("\u01dc\3\2\2\2\u0907\u0908\7V\2\2\u0908\u0909\7T\2\2\u0909") + buf.write("\u090a\7C\2\2\u090a\u090b\7P\2\2\u090b\u090c\7U\2\2\u090c") + buf.write("\u090d\7C\2\2\u090d\u090e\7E\2\2\u090e\u090f\7V\2\2\u090f") + buf.write("\u0910\7K\2\2\u0910\u0911\7Q\2\2\u0911\u0912\7P\2\2\u0912") + buf.write("\u0913\7U\2\2\u0913\u01de\3\2\2\2\u0914\u0915\7V\2\2\u0915") + buf.write("\u0916\7T\2\2\u0916\u0917\7C\2\2\u0917\u0918\7P\2\2\u0918") + buf.write("\u0919\7U\2\2\u0919\u091a\7H\2\2\u091a\u091b\7Q\2\2\u091b") + buf.write("\u091c\7T\2\2\u091c\u091d\7O\2\2\u091d\u01e0\3\2\2\2\u091e") + buf.write("\u091f\7V\2\2\u091f\u0920\7T\2\2\u0920\u0921\7K\2\2\u0921") + buf.write("\u0922\7O\2\2\u0922\u01e2\3\2\2\2\u0923\u0924\7V\2\2\u0924") + buf.write("\u0925\7T\2\2\u0925\u0926\7W\2\2\u0926\u0927\7G\2\2\u0927") + buf.write("\u01e4\3\2\2\2\u0928\u0929\7V\2\2\u0929\u092a\7T\2\2\u092a") + buf.write("\u092b\7W\2\2\u092b\u092c\7P\2\2\u092c\u092d\7E\2\2\u092d") + buf.write("\u092e\7C\2\2\u092e\u092f\7V\2\2\u092f\u0930\7G\2\2\u0930") + buf.write("\u01e6\3\2\2\2\u0931\u0932\7V\2\2\u0932\u0933\7[\2\2\u0933") + buf.write("\u0934\7R\2\2\u0934\u0935\7G\2\2\u0935\u01e8\3\2\2\2\u0936") + buf.write("\u0937\7W\2\2\u0937\u0938\7P\2\2\u0938\u0939\7C\2\2\u0939") + buf.write("\u093a\7T\2\2\u093a\u093b\7E\2\2\u093b\u093c\7J\2\2\u093c") + buf.write("\u093d\7K\2\2\u093d\u093e\7X\2\2\u093e\u093f\7G\2\2\u093f") + buf.write("\u01ea\3\2\2\2\u0940\u0941\7W\2\2\u0941\u0942\7P\2\2\u0942") + buf.write("\u0943\7D\2\2\u0943\u0944\7Q\2\2\u0944\u0945\7W\2\2\u0945") + buf.write("\u0946\7P\2\2\u0946\u0947\7F\2\2\u0947\u0948\7G\2\2\u0948") + buf.write("\u0949\7F\2\2\u0949\u01ec\3\2\2\2\u094a\u094b\7W\2\2\u094b") + buf.write("\u094c\7P\2\2\u094c\u094d\7E\2\2\u094d\u094e\7C\2\2\u094e") + buf.write("\u094f\7E\2\2\u094f\u0950\7J\2\2\u0950\u0951\7G\2\2\u0951") + buf.write("\u01ee\3\2\2\2\u0952\u0953\7W\2\2\u0953\u0954\7P\2\2\u0954") + buf.write("\u0955\7K\2\2\u0955\u0956\7Q\2\2\u0956\u0957\7P\2\2\u0957") + buf.write("\u01f0\3\2\2\2\u0958\u0959\7W\2\2\u0959\u095a\7P\2\2\u095a") + buf.write("\u095b\7K\2\2\u095b\u095c\7S\2\2\u095c\u095d\7W\2\2\u095d") + buf.write("\u095e\7G\2\2\u095e\u01f2\3\2\2\2\u095f\u0960\7W\2\2\u0960") + buf.write("\u0961\7P\2\2\u0961\u0962\7M\2\2\u0962\u0963\7P\2\2\u0963") + buf.write("\u0964\7Q\2\2\u0964\u0965\7Y\2\2\u0965\u0966\7P\2\2\u0966") + buf.write("\u01f4\3\2\2\2\u0967\u0968\7W\2\2\u0968\u0969\7P\2\2\u0969") + buf.write("\u096a\7N\2\2\u096a\u096b\7Q\2\2\u096b\u096c\7E\2\2\u096c") + buf.write("\u096d\7M\2\2\u096d\u01f6\3\2\2\2\u096e\u096f\7W\2\2\u096f") + buf.write("\u0970\7P\2\2\u0970\u0971\7U\2\2\u0971\u0972\7G\2\2\u0972") + buf.write("\u0973\7V\2\2\u0973\u01f8\3\2\2\2\u0974\u0975\7W\2\2\u0975") + buf.write("\u0976\7R\2\2\u0976\u0977\7F\2\2\u0977\u0978\7C\2\2\u0978") + buf.write("\u0979\7V\2\2\u0979\u097a\7G\2\2\u097a\u01fa\3\2\2\2\u097b") + buf.write("\u097c\7W\2\2\u097c\u097d\7U\2\2\u097d\u097e\7G\2\2\u097e") + buf.write("\u01fc\3\2\2\2\u097f\u0980\7W\2\2\u0980\u0981\7U\2\2\u0981") + buf.write("\u0982\7G\2\2\u0982\u0983\7T\2\2\u0983\u01fe\3\2\2\2\u0984") + buf.write("\u0985\7W\2\2\u0985\u0986\7U\2\2\u0986\u0987\7K\2\2\u0987") + buf.write("\u0988\7P\2\2\u0988\u0989\7I\2\2\u0989\u0200\3\2\2\2\u098a") + buf.write("\u098b\7X\2\2\u098b\u098c\7C\2\2\u098c\u098d\7N\2\2\u098d") + buf.write("\u098e\7W\2\2\u098e\u098f\7G\2\2\u098f\u0990\7U\2\2\u0990") + buf.write("\u0202\3\2\2\2\u0991\u0992\7X\2\2\u0992\u0993\7K\2\2\u0993") + buf.write("\u0994\7G\2\2\u0994\u0995\7Y\2\2\u0995\u0204\3\2\2\2\u0996") + buf.write("\u0997\7X\2\2\u0997\u0998\7K\2\2\u0998\u0999\7G\2\2\u0999") + buf.write("\u099a\7Y\2\2\u099a\u099b\7U\2\2\u099b\u0206\3\2\2\2\u099c") + buf.write("\u099d\7Y\2\2\u099d\u099e\7J\2\2\u099e\u099f\7G\2\2\u099f") + buf.write("\u09a0\7P\2\2\u09a0\u0208\3\2\2\2\u09a1\u09a2\7Y\2\2\u09a2") + buf.write("\u09a3\7J\2\2\u09a3\u09a4\7G\2\2\u09a4\u09a5\7T\2\2\u09a5") + buf.write("\u09a6\7G\2\2\u09a6\u020a\3\2\2\2\u09a7\u09a8\7Y\2\2\u09a8") + buf.write("\u09a9\7K\2\2\u09a9\u09aa\7P\2\2\u09aa\u09ab\7F\2\2\u09ab") + buf.write("\u09ac\7Q\2\2\u09ac\u09ad\7Y\2\2\u09ad\u020c\3\2\2\2\u09ae") + buf.write("\u09af\7Y\2\2\u09af\u09b0\7K\2\2\u09b0\u09b1\7V\2\2\u09b1") + buf.write("\u09b2\7J\2\2\u09b2\u020e\3\2\2\2\u09b3\u09b4\7[\2\2\u09b4") + buf.write("\u09b5\7G\2\2\u09b5\u09b6\7C\2\2\u09b6\u09b7\7T\2\2\u09b7") + buf.write("\u0210\3\2\2\2\u09b8\u09bc\7?\2\2\u09b9\u09ba\7?\2\2\u09ba") + buf.write("\u09bc\7?\2\2\u09bb\u09b8\3\2\2\2\u09bb\u09b9\3\2\2\2") + buf.write("\u09bc\u0212\3\2\2\2\u09bd\u09be\7>\2\2\u09be\u09bf\7") + buf.write("?\2\2\u09bf\u09c0\7@\2\2\u09c0\u0214\3\2\2\2\u09c1\u09c2") + buf.write("\7>\2\2\u09c2\u09c3\7@\2\2\u09c3\u0216\3\2\2\2\u09c4\u09c5") + buf.write("\7#\2\2\u09c5\u09c6\7?\2\2\u09c6\u0218\3\2\2\2\u09c7\u09c8") + buf.write("\7>\2\2\u09c8\u021a\3\2\2\2\u09c9\u09ca\7>\2\2\u09ca\u09ce") + buf.write("\7?\2\2\u09cb\u09cc\7#\2\2\u09cc\u09ce\7@\2\2\u09cd\u09c9") + buf.write("\3\2\2\2\u09cd\u09cb\3\2\2\2\u09ce\u021c\3\2\2\2\u09cf") + buf.write("\u09d0\7@\2\2\u09d0\u021e\3\2\2\2\u09d1\u09d2\7@\2\2\u09d2") + buf.write("\u09d6\7?\2\2\u09d3\u09d4\7#\2\2\u09d4\u09d6\7>\2\2\u09d5") + buf.write("\u09d1\3\2\2\2\u09d5\u09d3\3\2\2\2\u09d6\u0220\3\2\2\2") + buf.write("\u09d7\u09d8\7-\2\2\u09d8\u0222\3\2\2\2\u09d9\u09da\7") + buf.write("/\2\2\u09da\u0224\3\2\2\2\u09db\u09dc\7,\2\2\u09dc\u0226") + buf.write("\3\2\2\2\u09dd\u09de\7\61\2\2\u09de\u0228\3\2\2\2\u09df") + buf.write("\u09e0\7\'\2\2\u09e0\u022a\3\2\2\2\u09e1\u09e2\7F\2\2") + buf.write("\u09e2\u09e3\7K\2\2\u09e3\u09e4\7X\2\2\u09e4\u022c\3\2") + buf.write("\2\2\u09e5\u09e6\7\u0080\2\2\u09e6\u022e\3\2\2\2\u09e7") + buf.write("\u09e8\7(\2\2\u09e8\u0230\3\2\2\2\u09e9\u09ea\7~\2\2\u09ea") + buf.write("\u0232\3\2\2\2\u09eb\u09ec\7~\2\2\u09ec\u09ed\7~\2\2\u09ed") + buf.write("\u0234\3\2\2\2\u09ee\u09ef\7`\2\2\u09ef\u0236\3\2\2\2") + buf.write("\u09f0\u09f6\7)\2\2\u09f1\u09f5\n\2\2\2\u09f2\u09f3\7") + buf.write("^\2\2\u09f3\u09f5\13\2\2\2\u09f4\u09f1\3\2\2\2\u09f4\u09f2") + buf.write("\3\2\2\2\u09f5\u09f8\3\2\2\2\u09f6\u09f4\3\2\2\2\u09f6") + buf.write("\u09f7\3\2\2\2\u09f7\u09f9\3\2\2\2\u09f8\u09f6\3\2\2\2") + buf.write("\u09f9\u0a05\7)\2\2\u09fa\u0a00\7$\2\2\u09fb\u09ff\n\3") + buf.write("\2\2\u09fc\u09fd\7^\2\2\u09fd\u09ff\13\2\2\2\u09fe\u09fb") + buf.write("\3\2\2\2\u09fe\u09fc\3\2\2\2\u09ff\u0a02\3\2\2\2\u0a00") + buf.write("\u09fe\3\2\2\2\u0a00\u0a01\3\2\2\2\u0a01\u0a03\3\2\2\2") + buf.write("\u0a02\u0a00\3\2\2\2\u0a03\u0a05\7$\2\2\u0a04\u09f0\3") + buf.write("\2\2\2\u0a04\u09fa\3\2\2\2\u0a05\u0238\3\2\2\2\u0a06\u0a08") + buf.write("\5\u0251\u0129\2\u0a07\u0a06\3\2\2\2\u0a08\u0a09\3\2\2") + buf.write("\2\u0a09\u0a07\3\2\2\2\u0a09\u0a0a\3\2\2\2\u0a0a\u0a0b") + buf.write("\3\2\2\2\u0a0b\u0a0c\7N\2\2\u0a0c\u023a\3\2\2\2\u0a0d") + buf.write("\u0a0f\5\u0251\u0129\2\u0a0e\u0a0d\3\2\2\2\u0a0f\u0a10") + buf.write("\3\2\2\2\u0a10\u0a0e\3\2\2\2\u0a10\u0a11\3\2\2\2\u0a11") + buf.write("\u0a12\3\2\2\2\u0a12\u0a13\7U\2\2\u0a13\u023c\3\2\2\2") + buf.write("\u0a14\u0a16\5\u0251\u0129\2\u0a15\u0a14\3\2\2\2\u0a16") + buf.write("\u0a17\3\2\2\2\u0a17\u0a15\3\2\2\2\u0a17\u0a18\3\2\2\2") + buf.write("\u0a18\u0a19\3\2\2\2\u0a19\u0a1a\7[\2\2\u0a1a\u023e\3") + buf.write("\2\2\2\u0a1b\u0a1d\5\u0251\u0129\2\u0a1c\u0a1b\3\2\2\2") + buf.write("\u0a1d\u0a1e\3\2\2\2\u0a1e\u0a1c\3\2\2\2\u0a1e\u0a1f\3") + buf.write("\2\2\2\u0a1f\u0240\3\2\2\2\u0a20\u0a22\5\u0251\u0129\2") + buf.write("\u0a21\u0a20\3\2\2\2\u0a22\u0a23\3\2\2\2\u0a23\u0a21\3") + buf.write("\2\2\2\u0a23\u0a24\3\2\2\2\u0a24\u0a25\3\2\2\2\u0a25\u0a26") + buf.write("\5\u024f\u0128\2\u0a26\u0a2c\3\2\2\2\u0a27\u0a28\5\u024d") + buf.write("\u0127\2\u0a28\u0a29\5\u024f\u0128\2\u0a29\u0a2a\6\u0121") + buf.write("\2\2\u0a2a\u0a2c\3\2\2\2\u0a2b\u0a21\3\2\2\2\u0a2b\u0a27") + buf.write("\3\2\2\2\u0a2c\u0242\3\2\2\2\u0a2d\u0a2e\5\u024d\u0127") + buf.write("\2\u0a2e\u0a2f\6\u0122\3\2\u0a2f\u0244\3\2\2\2\u0a30\u0a32") + buf.write("\5\u0251\u0129\2\u0a31\u0a30\3\2\2\2\u0a32\u0a33\3\2\2") + buf.write("\2\u0a33\u0a31\3\2\2\2\u0a33\u0a34\3\2\2\2\u0a34\u0a36") + buf.write("\3\2\2\2\u0a35\u0a37\5\u024f\u0128\2\u0a36\u0a35\3\2\2") + buf.write("\2\u0a36\u0a37\3\2\2\2\u0a37\u0a38\3\2\2\2\u0a38\u0a39") + buf.write("\7F\2\2\u0a39\u0a42\3\2\2\2\u0a3a\u0a3c\5\u024d\u0127") + buf.write("\2\u0a3b\u0a3d\5\u024f\u0128\2\u0a3c\u0a3b\3\2\2\2\u0a3c") + buf.write("\u0a3d\3\2\2\2\u0a3d\u0a3e\3\2\2\2\u0a3e\u0a3f\7F\2\2") + buf.write("\u0a3f\u0a40\6\u0123\4\2\u0a40\u0a42\3\2\2\2\u0a41\u0a31") + buf.write("\3\2\2\2\u0a41\u0a3a\3\2\2\2\u0a42\u0246\3\2\2\2\u0a43") + buf.write("\u0a45\5\u0251\u0129\2\u0a44\u0a43\3\2\2\2\u0a45\u0a46") + buf.write("\3\2\2\2\u0a46\u0a44\3\2\2\2\u0a46\u0a47\3\2\2\2\u0a47") + buf.write("\u0a49\3\2\2\2\u0a48\u0a4a\5\u024f\u0128\2\u0a49\u0a48") + buf.write("\3\2\2\2\u0a49\u0a4a\3\2\2\2\u0a4a\u0a4b\3\2\2\2\u0a4b") + buf.write("\u0a4c\7D\2\2\u0a4c\u0a4d\7F\2\2\u0a4d\u0a58\3\2\2\2\u0a4e") + buf.write("\u0a50\5\u024d\u0127\2\u0a4f\u0a51\5\u024f\u0128\2\u0a50") + buf.write("\u0a4f\3\2\2\2\u0a50\u0a51\3\2\2\2\u0a51\u0a52\3\2\2\2") + buf.write("\u0a52\u0a53\7D\2\2\u0a53\u0a54\7F\2\2\u0a54\u0a55\3\2") + buf.write("\2\2\u0a55\u0a56\6\u0124\5\2\u0a56\u0a58\3\2\2\2\u0a57") + buf.write("\u0a44\3\2\2\2\u0a57\u0a4e\3\2\2\2\u0a58\u0248\3\2\2\2") + buf.write("\u0a59\u0a5d\5\u0253\u012a\2\u0a5a\u0a5d\5\u0251\u0129") + buf.write("\2\u0a5b\u0a5d\7a\2\2\u0a5c\u0a59\3\2\2\2\u0a5c\u0a5a") + buf.write("\3\2\2\2\u0a5c\u0a5b\3\2\2\2\u0a5d\u0a5e\3\2\2\2\u0a5e") + buf.write("\u0a5c\3\2\2\2\u0a5e\u0a5f\3\2\2\2\u0a5f\u024a\3\2\2\2") + buf.write("\u0a60\u0a66\7b\2\2\u0a61\u0a65\n\4\2\2\u0a62\u0a63\7") + buf.write("b\2\2\u0a63\u0a65\7b\2\2\u0a64\u0a61\3\2\2\2\u0a64\u0a62") + buf.write("\3\2\2\2\u0a65\u0a68\3\2\2\2\u0a66\u0a64\3\2\2\2\u0a66") + buf.write("\u0a67\3\2\2\2\u0a67\u0a69\3\2\2\2\u0a68\u0a66\3\2\2\2") + buf.write("\u0a69\u0a6a\7b\2\2\u0a6a\u024c\3\2\2\2\u0a6b\u0a6d\5") + buf.write("\u0251\u0129\2\u0a6c\u0a6b\3\2\2\2\u0a6d\u0a6e\3\2\2\2") + buf.write("\u0a6e\u0a6c\3\2\2\2\u0a6e\u0a6f\3\2\2\2\u0a6f\u0a70\3") + buf.write("\2\2\2\u0a70\u0a74\7\60\2\2\u0a71\u0a73\5\u0251\u0129") + buf.write("\2\u0a72\u0a71\3\2\2\2\u0a73\u0a76\3\2\2\2\u0a74\u0a72") + buf.write("\3\2\2\2\u0a74\u0a75\3\2\2\2\u0a75\u0a7e\3\2\2\2\u0a76") + buf.write("\u0a74\3\2\2\2\u0a77\u0a79\7\60\2\2\u0a78\u0a7a\5\u0251") + buf.write("\u0129\2\u0a79\u0a78\3\2\2\2\u0a7a\u0a7b\3\2\2\2\u0a7b") + buf.write("\u0a79\3\2\2\2\u0a7b\u0a7c\3\2\2\2\u0a7c\u0a7e\3\2\2\2") + buf.write("\u0a7d\u0a6c\3\2\2\2\u0a7d\u0a77\3\2\2\2\u0a7e\u024e\3") + buf.write("\2\2\2\u0a7f\u0a81\7G\2\2\u0a80\u0a82\t\5\2\2\u0a81\u0a80") + buf.write("\3\2\2\2\u0a81\u0a82\3\2\2\2\u0a82\u0a84\3\2\2\2\u0a83") + buf.write("\u0a85\5\u0251\u0129\2\u0a84\u0a83\3\2\2\2\u0a85\u0a86") + buf.write("\3\2\2\2\u0a86\u0a84\3\2\2\2\u0a86\u0a87\3\2\2\2\u0a87") + buf.write("\u0250\3\2\2\2\u0a88\u0a89\t\6\2\2\u0a89\u0252\3\2\2\2") + buf.write("\u0a8a\u0a8b\t\7\2\2\u0a8b\u0254\3\2\2\2\u0a8c\u0a8d\7") + buf.write("/\2\2\u0a8d\u0a8e\7/\2\2\u0a8e\u0a92\3\2\2\2\u0a8f\u0a91") + buf.write("\n\b\2\2\u0a90\u0a8f\3\2\2\2\u0a91\u0a94\3\2\2\2\u0a92") + buf.write("\u0a90\3\2\2\2\u0a92\u0a93\3\2\2\2\u0a93\u0a96\3\2\2\2") + buf.write("\u0a94\u0a92\3\2\2\2\u0a95\u0a97\7\17\2\2\u0a96\u0a95") + buf.write("\3\2\2\2\u0a96\u0a97\3\2\2\2\u0a97\u0a99\3\2\2\2\u0a98") + buf.write("\u0a9a\7\f\2\2\u0a99\u0a98\3\2\2\2\u0a99\u0a9a\3\2\2\2") + buf.write("\u0a9a\u0a9b\3\2\2\2\u0a9b\u0a9c\b\u012b\2\2\u0a9c\u0256") + buf.write("\3\2\2\2\u0a9d\u0a9e\7\61\2\2\u0a9e\u0a9f\7,\2\2\u0a9f") + buf.write("\u0aa0\3\2\2\2\u0aa0\u0aa5\6\u012c\6\2\u0aa1\u0aa4\5\u0257") + buf.write("\u012c\2\u0aa2\u0aa4\13\2\2\2\u0aa3\u0aa1\3\2\2\2\u0aa3") + buf.write("\u0aa2\3\2\2\2\u0aa4\u0aa7\3\2\2\2\u0aa5\u0aa6\3\2\2\2") + buf.write("\u0aa5\u0aa3\3\2\2\2\u0aa6\u0aa8\3\2\2\2\u0aa7\u0aa5\3") + buf.write("\2\2\2\u0aa8\u0aa9\7,\2\2\u0aa9\u0aaa\7\61\2\2\u0aaa\u0aab") + buf.write("\3\2\2\2\u0aab\u0aac\b\u012c\2\2\u0aac\u0258\3\2\2\2\u0aad") + buf.write("\u0aaf\t\t\2\2\u0aae\u0aad\3\2\2\2\u0aaf\u0ab0\3\2\2\2") + buf.write("\u0ab0\u0aae\3\2\2\2\u0ab0\u0ab1\3\2\2\2\u0ab1\u0ab2\3") + buf.write("\2\2\2\u0ab2\u0ab3\b\u012d\2\2\u0ab3\u025a\3\2\2\2\u0ab4") + buf.write("\u0ab5\13\2\2\2\u0ab5\u025c\3\2\2\2-\2\u0404\u0677\u07d1") + buf.write("\u08d7\u09bb\u09cd\u09d5\u09f4\u09f6\u09fe\u0a00\u0a04") + buf.write("\u0a09\u0a10\u0a17\u0a1e\u0a23\u0a2b\u0a33\u0a36\u0a3c") + buf.write("\u0a41\u0a46\u0a49\u0a50\u0a57\u0a5c\u0a5e\u0a64\u0a66") + buf.write("\u0a6e\u0a74\u0a7b\u0a7d\u0a81\u0a86\u0a92\u0a96\u0a99") + buf.write("\u0aa3\u0aa5\u0ab0\3\2\3\2") + return buf.getvalue() + + +class SqlBaseLexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + T__0 = 1 + T__1 = 2 + T__2 = 3 + T__3 = 4 + T__4 = 5 + T__5 = 6 + T__6 = 7 + T__7 = 8 + T__8 = 9 + T__9 = 10 + T__10 = 11 + ADD = 12 + AFTER = 13 + ALL = 14 + ALTER = 15 + ANALYZE = 16 + AND = 17 + ANTI = 18 + ANY = 19 + ARCHIVE = 20 + ARRAY = 21 + AS = 22 + ASC = 23 + AT = 24 + AUTHORIZATION = 25 + BETWEEN = 26 + BOTH = 27 + BUCKET = 28 + BUCKETS = 29 + BY = 30 + CACHE = 31 + CASCADE = 32 + CASE = 33 + CAST = 34 + CHANGE = 35 + CHECK = 36 + CLEAR = 37 + CLUSTER = 38 + CLUSTERED = 39 + CODEGEN = 40 + COLLATE = 41 + COLLECTION = 42 + COLUMN = 43 + COLUMNS = 44 + COMMENT = 45 + COMMIT = 46 + COMPACT = 47 + COMPACTIONS = 48 + COMPUTE = 49 + CONCATENATE = 50 + CONSTRAINT = 51 + COST = 52 + CREATE = 53 + CROSS = 54 + CUBE = 55 + CURRENT = 56 + CURRENT_DATE = 57 + CURRENT_TIME = 58 + CURRENT_TIMESTAMP = 59 + CURRENT_USER = 60 + DATA = 61 + DATABASE = 62 + DATABASES = 63 + DAY = 64 + DBPROPERTIES = 65 + DEFINED = 66 + DELETE = 67 + DELIMITED = 68 + DESC = 69 + DESCRIBE = 70 + DFS = 71 + DIRECTORIES = 72 + DIRECTORY = 73 + DISTINCT = 74 + DISTRIBUTE = 75 + DROP = 76 + ELSE = 77 + END = 78 + ESCAPE = 79 + ESCAPED = 80 + EXCEPT = 81 + EXCHANGE = 82 + EXISTS = 83 + EXPLAIN = 84 + EXPORT = 85 + EXTENDED = 86 + EXTERNAL = 87 + EXTRACT = 88 + FALSE = 89 + FETCH = 90 + FIELDS = 91 + FILTER = 92 + FILEFORMAT = 93 + FIRST = 94 + FOLLOWING = 95 + FOR = 96 + FOREIGN = 97 + FORMAT = 98 + FORMATTED = 99 + FROM = 100 + FULL = 101 + FUNCTION = 102 + FUNCTIONS = 103 + GLOBAL = 104 + GRANT = 105 + GROUP = 106 + GROUPING = 107 + HAVING = 108 + HOUR = 109 + IF = 110 + IGNORE = 111 + IMPORT = 112 + IN = 113 + INDEX = 114 + INDEXES = 115 + INNER = 116 + INPATH = 117 + INPUTFORMAT = 118 + INSERT = 119 + INTERSECT = 120 + INTERVAL = 121 + INTO = 122 + IS = 123 + ITEMS = 124 + JOIN = 125 + KEYS = 126 + LAST = 127 + LATERAL = 128 + LAZY = 129 + LEADING = 130 + LEFT = 131 + LIKE = 132 + LIMIT = 133 + LINES = 134 + LIST = 135 + LOAD = 136 + LOCAL = 137 + LOCATION = 138 + LOCK = 139 + LOCKS = 140 + LOGICAL = 141 + MACRO = 142 + MAP = 143 + MATCHED = 144 + MERGE = 145 + MINUTE = 146 + MONTH = 147 + MSCK = 148 + NAMESPACE = 149 + NAMESPACES = 150 + NATURAL = 151 + NO = 152 + NOT = 153 + NULL = 154 + NULLS = 155 + OF = 156 + ON = 157 + ONLY = 158 + OPTION = 159 + OPTIONS = 160 + OR = 161 + ORDER = 162 + OUT = 163 + OUTER = 164 + OUTPUTFORMAT = 165 + OVER = 166 + OVERLAPS = 167 + OVERLAY = 168 + OVERWRITE = 169 + PARTITION = 170 + PARTITIONED = 171 + PARTITIONS = 172 + PERCENTLIT = 173 + PIVOT = 174 + PLACING = 175 + POSITION = 176 + PRECEDING = 177 + PRIMARY = 178 + PRINCIPALS = 179 + PROPERTIES = 180 + PURGE = 181 + QUERY = 182 + RANGE = 183 + RECORDREADER = 184 + RECORDWRITER = 185 + RECOVER = 186 + REDUCE = 187 + REFERENCES = 188 + REFRESH = 189 + RENAME = 190 + REPAIR = 191 + REPLACE = 192 + RESET = 193 + RESTRICT = 194 + REVOKE = 195 + RIGHT = 196 + RLIKE = 197 + ROLE = 198 + ROLES = 199 + ROLLBACK = 200 + ROLLUP = 201 + ROW = 202 + ROWS = 203 + SCHEMA = 204 + SECOND = 205 + SELECT = 206 + SEMI = 207 + SEPARATED = 208 + SERDE = 209 + SERDEPROPERTIES = 210 + SESSION_USER = 211 + SET = 212 + SETMINUS = 213 + SETS = 214 + SHOW = 215 + SKEWED = 216 + SOME = 217 + SORT = 218 + SORTED = 219 + START = 220 + STATISTICS = 221 + STORED = 222 + STRATIFY = 223 + STRUCT = 224 + SUBSTR = 225 + SUBSTRING = 226 + TABLE = 227 + TABLES = 228 + TABLESAMPLE = 229 + TBLPROPERTIES = 230 + TEMPORARY = 231 + TERMINATED = 232 + THEN = 233 + TO = 234 + TOUCH = 235 + TRAILING = 236 + TRANSACTION = 237 + TRANSACTIONS = 238 + TRANSFORM = 239 + TRIM = 240 + TRUE = 241 + TRUNCATE = 242 + TYPE = 243 + UNARCHIVE = 244 + UNBOUNDED = 245 + UNCACHE = 246 + UNION = 247 + UNIQUE = 248 + UNKNOWN = 249 + UNLOCK = 250 + UNSET = 251 + UPDATE = 252 + USE = 253 + USER = 254 + USING = 255 + VALUES = 256 + VIEW = 257 + VIEWS = 258 + WHEN = 259 + WHERE = 260 + WINDOW = 261 + WITH = 262 + YEAR = 263 + EQ = 264 + NSEQ = 265 + NEQ = 266 + NEQJ = 267 + LT = 268 + LTE = 269 + GT = 270 + GTE = 271 + PLUS = 272 + MINUS = 273 + ASTERISK = 274 + SLASH = 275 + PERCENT = 276 + DIV = 277 + TILDE = 278 + AMPERSAND = 279 + PIPE = 280 + CONCAT_PIPE = 281 + HAT = 282 + STRING = 283 + BIGINT_LITERAL = 284 + SMALLINT_LITERAL = 285 + TINYINT_LITERAL = 286 + INTEGER_VALUE = 287 + EXPONENT_VALUE = 288 + DECIMAL_VALUE = 289 + DOUBLE_LITERAL = 290 + BIGDECIMAL_LITERAL = 291 + IDENTIFIER = 292 + BACKQUOTED_IDENTIFIER = 293 + SIMPLE_COMMENT = 294 + BRACKETED_COMMENT = 295 + WS = 296 + UNRECOGNIZED = 297 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "';'", "'('", "')'", "','", "'.'", "'/*+'", "'*/'", "'->'", + "'['", "']'", "':'", "'ADD'", "'AFTER'", "'ALL'", "'ALTER'", + "'ANALYZE'", "'AND'", "'ANTI'", "'ANY'", "'ARCHIVE'", "'ARRAY'", + "'AS'", "'ASC'", "'AT'", "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", + "'BUCKET'", "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", + "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", "'CLUSTERED'", + "'CODEGEN'", "'COLLATE'", "'COLLECTION'", "'COLUMN'", "'COLUMNS'", + "'COMMENT'", "'COMMIT'", "'COMPACT'", "'COMPACTIONS'", "'COMPUTE'", + "'CONCATENATE'", "'CONSTRAINT'", "'COST'", "'CREATE'", "'CROSS'", + "'CUBE'", "'CURRENT'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", + "'CURRENT_USER'", "'DATA'", "'DATABASE'", "'DAY'", "'DBPROPERTIES'", + "'DEFINED'", "'DELETE'", "'DELIMITED'", "'DESC'", "'DESCRIBE'", + "'DFS'", "'DIRECTORIES'", "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", + "'DROP'", "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", + "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", "'EXTENDED'", + "'EXTERNAL'", "'EXTRACT'", "'FALSE'", "'FETCH'", "'FIELDS'", + "'FILTER'", "'FILEFORMAT'", "'FIRST'", "'FOLLOWING'", "'FOR'", + "'FOREIGN'", "'FORMAT'", "'FORMATTED'", "'FROM'", "'FULL'", + "'FUNCTION'", "'FUNCTIONS'", "'GLOBAL'", "'GRANT'", "'GROUP'", + "'GROUPING'", "'HAVING'", "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", + "'IN'", "'INDEX'", "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", + "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", "'IS'", "'ITEMS'", + "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", "'LAZY'", "'LEADING'", + "'LEFT'", "'LIKE'", "'LIMIT'", "'LINES'", "'LIST'", "'LOAD'", + "'LOCAL'", "'LOCATION'", "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", + "'MAP'", "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", + "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", "'NULL'", + "'NULLS'", "'OF'", "'ON'", "'ONLY'", "'OPTION'", "'OPTIONS'", + "'OR'", "'ORDER'", "'OUT'", "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", + "'OVERLAPS'", "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", + "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", "'POSITION'", + "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", "'PROPERTIES'", + "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", "'RECORDWRITER'", + "'RECOVER'", "'REDUCE'", "'REFERENCES'", "'REFRESH'", "'RENAME'", + "'REPAIR'", "'REPLACE'", "'RESET'", "'RESTRICT'", "'REVOKE'", + "'RIGHT'", "'ROLE'", "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", + "'ROWS'", "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", + "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", "'MINUS'", + "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", "'SORT'", "'SORTED'", + "'START'", "'STATISTICS'", "'STORED'", "'STRATIFY'", "'STRUCT'", + "'SUBSTR'", "'SUBSTRING'", "'TABLE'", "'TABLES'", "'TABLESAMPLE'", + "'TBLPROPERTIES'", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", + "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", + "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", "'UNBOUNDED'", + "'UNCACHE'", "'UNION'", "'UNIQUE'", "'UNKNOWN'", "'UNLOCK'", + "'UNSET'", "'UPDATE'", "'USE'", "'USER'", "'USING'", "'VALUES'", + "'VIEW'", "'VIEWS'", "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", + "'YEAR'", "'<=>'", "'<>'", "'!='", "'<'", "'>'", "'+'", "'-'", + "'*'", "'/'", "'%'", "'DIV'", "'~'", "'&'", "'|'", "'||'", "'^'" ] + + symbolicNames = [ "", + "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "ANTI", "ANY", + "ARCHIVE", "ARRAY", "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", + "BOTH", "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", + "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", + "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", + "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", + "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", + "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", + "DATA", "DATABASE", "DATABASES", "DAY", "DBPROPERTIES", "DEFINED", + "DELETE", "DELIMITED", "DESC", "DESCRIBE", "DFS", "DIRECTORIES", + "DIRECTORY", "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", + "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", + "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", + "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", + "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", + "FUNCTIONS", "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", + "HOUR", "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", + "INNER", "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", + "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", "LAZY", + "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", "LOAD", + "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", "MAP", + "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", + "NAMESPACES", "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", + "ON", "ONLY", "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", + "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", + "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", "PIVOT", + "PLACING", "POSITION", "PRECEDING", "PRIMARY", "PRINCIPALS", + "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", + "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", + "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", + "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", + "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", + "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", + "SOME", "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", + "STRUCT", "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", + "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", + "TRAILING", "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", + "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", + "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", + "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", + "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", + "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", "STRING", + "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", + "EXPONENT_VALUE", "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", + "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", + "WS", "UNRECOGNIZED" ] + + ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", + "T__7", "T__8", "T__9", "T__10", "ADD", "AFTER", "ALL", + "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", + "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", "BOTH", + "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", + "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", + "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", + "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", + "CONCATENATE", "CONSTRAINT", "COST", "CREATE", "CROSS", + "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", + "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", + "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", + "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", + "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", + "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIELDS", "FILTER", + "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", "FOREIGN", + "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", + "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", + "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", + "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", + "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", + "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", + "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", + "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", + "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", "NO", "NOT", + "NULL", "NULLS", "OF", "ON", "ONLY", "OPTION", "OPTIONS", + "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", + "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", + "PARTITIONS", "PERCENTLIT", "PIVOT", "PLACING", "POSITION", + "PRECEDING", "PRIMARY", "PRINCIPALS", "PROPERTIES", "PURGE", + "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", "RECOVER", + "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", + "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", + "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", + "SCHEMA", "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", + "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", + "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", "START", + "STATISTICS", "STORED", "STRATIFY", "STRUCT", "SUBSTR", + "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", + "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", "TRAILING", + "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", + "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", + "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", + "USE", "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", + "WHERE", "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", + "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", + "CONCAT_PIPE", "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", + "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", + "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", + "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "DECIMAL_DIGITS", + "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", + "WS", "UNRECOGNIZED" ] + + grammarFileName = "SqlBase.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.7.1") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + + """ + When false, INTERSECT is given the greater precedence over the other set + operations (UNION, EXCEPT and MINUS) as per the SQL standard. + """ + legacy_setops_precedence_enbled = False + + """ + When false, a literal with an exponent would be converted into + double type rather than decimal type. + """ + legacy_exponent_literal_as_decimal_enabled = False + + """ + When false, CREATE TABLE syntax without a provider will use + the value of spark.sql.sources.default as its provider. + """ + legacy_create_hive_table_by_default_enabled = False + + """ + When true, the behavior of keywords follows ANSI SQL standard. + """ + SQL_standard_keyword_behavior = False + + def isValidDecimal(self): + """ + Verify whether current token is a valid decimal token (which contains dot). + Returns true if the character that follows the token is not a digit or letter or underscore. + + For example: + For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. + For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. + For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. + For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed + by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' + which is not a digit or letter or underscore. + """ + nextChar = self._input.LA(1) + if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': + return False + else: + return True + + def isHint(self): + """ + This method will be called when we see '/*' and try to match it as a bracketed comment. + If the next character is '+', it should be parsed as hint later, and we cannot match + it as a bracketed comment. + + Returns true if the next character is '+'. + """ + nextChar = self._input.LA(1) + if nextChar == '+': + return True + else: + return False + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates is None: + preds = dict() + preds[287] = self.EXPONENT_VALUE_sempred + preds[288] = self.DECIMAL_VALUE_sempred + preds[289] = self.DOUBLE_LITERAL_sempred + preds[290] = self.BIGDECIMAL_LITERAL_sempred + preds[298] = self.BRACKETED_COMMENT_sempred + self._predicates = preds + pred = self._predicates.get(ruleIndex, None) + if pred is not None: + return pred(localctx, predIndex) + else: + raise Exception("No registered predicate for:" + str(ruleIndex)) + + def EXPONENT_VALUE_sempred(self, localctx:RuleContext, predIndex:int): + if predIndex == 0: + return self.isValidDecimal() + + + def DECIMAL_VALUE_sempred(self, localctx:RuleContext, predIndex:int): + if predIndex == 1: + return self.isValidDecimal() + + + def DOUBLE_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): + if predIndex == 2: + return self.isValidDecimal() + + + def BIGDECIMAL_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): + if predIndex == 3: + return self.isValidDecimal() + + + def BRACKETED_COMMENT_sempred(self, localctx:RuleContext, predIndex:int): + if predIndex == 4: + return not isHint() + + + diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.tokens b/pysparkling/sql/ast/generated/SqlBaseLexer.tokens new file mode 100644 index 000000000..0d0385147 --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.tokens @@ -0,0 +1,572 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +ADD=12 +AFTER=13 +ALL=14 +ALTER=15 +ANALYZE=16 +AND=17 +ANTI=18 +ANY=19 +ARCHIVE=20 +ARRAY=21 +AS=22 +ASC=23 +AT=24 +AUTHORIZATION=25 +BETWEEN=26 +BOTH=27 +BUCKET=28 +BUCKETS=29 +BY=30 +CACHE=31 +CASCADE=32 +CASE=33 +CAST=34 +CHANGE=35 +CHECK=36 +CLEAR=37 +CLUSTER=38 +CLUSTERED=39 +CODEGEN=40 +COLLATE=41 +COLLECTION=42 +COLUMN=43 +COLUMNS=44 +COMMENT=45 +COMMIT=46 +COMPACT=47 +COMPACTIONS=48 +COMPUTE=49 +CONCATENATE=50 +CONSTRAINT=51 +COST=52 +CREATE=53 +CROSS=54 +CUBE=55 +CURRENT=56 +CURRENT_DATE=57 +CURRENT_TIME=58 +CURRENT_TIMESTAMP=59 +CURRENT_USER=60 +DATA=61 +DATABASE=62 +DATABASES=63 +DAY=64 +DBPROPERTIES=65 +DEFINED=66 +DELETE=67 +DELIMITED=68 +DESC=69 +DESCRIBE=70 +DFS=71 +DIRECTORIES=72 +DIRECTORY=73 +DISTINCT=74 +DISTRIBUTE=75 +DROP=76 +ELSE=77 +END=78 +ESCAPE=79 +ESCAPED=80 +EXCEPT=81 +EXCHANGE=82 +EXISTS=83 +EXPLAIN=84 +EXPORT=85 +EXTENDED=86 +EXTERNAL=87 +EXTRACT=88 +FALSE=89 +FETCH=90 +FIELDS=91 +FILTER=92 +FILEFORMAT=93 +FIRST=94 +FOLLOWING=95 +FOR=96 +FOREIGN=97 +FORMAT=98 +FORMATTED=99 +FROM=100 +FULL=101 +FUNCTION=102 +FUNCTIONS=103 +GLOBAL=104 +GRANT=105 +GROUP=106 +GROUPING=107 +HAVING=108 +HOUR=109 +IF=110 +IGNORE=111 +IMPORT=112 +IN=113 +INDEX=114 +INDEXES=115 +INNER=116 +INPATH=117 +INPUTFORMAT=118 +INSERT=119 +INTERSECT=120 +INTERVAL=121 +INTO=122 +IS=123 +ITEMS=124 +JOIN=125 +KEYS=126 +LAST=127 +LATERAL=128 +LAZY=129 +LEADING=130 +LEFT=131 +LIKE=132 +LIMIT=133 +LINES=134 +LIST=135 +LOAD=136 +LOCAL=137 +LOCATION=138 +LOCK=139 +LOCKS=140 +LOGICAL=141 +MACRO=142 +MAP=143 +MATCHED=144 +MERGE=145 +MINUTE=146 +MONTH=147 +MSCK=148 +NAMESPACE=149 +NAMESPACES=150 +NATURAL=151 +NO=152 +NOT=153 +NULL=154 +NULLS=155 +OF=156 +ON=157 +ONLY=158 +OPTION=159 +OPTIONS=160 +OR=161 +ORDER=162 +OUT=163 +OUTER=164 +OUTPUTFORMAT=165 +OVER=166 +OVERLAPS=167 +OVERLAY=168 +OVERWRITE=169 +PARTITION=170 +PARTITIONED=171 +PARTITIONS=172 +PERCENTLIT=173 +PIVOT=174 +PLACING=175 +POSITION=176 +PRECEDING=177 +PRIMARY=178 +PRINCIPALS=179 +PROPERTIES=180 +PURGE=181 +QUERY=182 +RANGE=183 +RECORDREADER=184 +RECORDWRITER=185 +RECOVER=186 +REDUCE=187 +REFERENCES=188 +REFRESH=189 +RENAME=190 +REPAIR=191 +REPLACE=192 +RESET=193 +RESTRICT=194 +REVOKE=195 +RIGHT=196 +RLIKE=197 +ROLE=198 +ROLES=199 +ROLLBACK=200 +ROLLUP=201 +ROW=202 +ROWS=203 +SCHEMA=204 +SECOND=205 +SELECT=206 +SEMI=207 +SEPARATED=208 +SERDE=209 +SERDEPROPERTIES=210 +SESSION_USER=211 +SET=212 +SETMINUS=213 +SETS=214 +SHOW=215 +SKEWED=216 +SOME=217 +SORT=218 +SORTED=219 +START=220 +STATISTICS=221 +STORED=222 +STRATIFY=223 +STRUCT=224 +SUBSTR=225 +SUBSTRING=226 +TABLE=227 +TABLES=228 +TABLESAMPLE=229 +TBLPROPERTIES=230 +TEMPORARY=231 +TERMINATED=232 +THEN=233 +TO=234 +TOUCH=235 +TRAILING=236 +TRANSACTION=237 +TRANSACTIONS=238 +TRANSFORM=239 +TRIM=240 +TRUE=241 +TRUNCATE=242 +TYPE=243 +UNARCHIVE=244 +UNBOUNDED=245 +UNCACHE=246 +UNION=247 +UNIQUE=248 +UNKNOWN=249 +UNLOCK=250 +UNSET=251 +UPDATE=252 +USE=253 +USER=254 +USING=255 +VALUES=256 +VIEW=257 +VIEWS=258 +WHEN=259 +WHERE=260 +WINDOW=261 +WITH=262 +YEAR=263 +EQ=264 +NSEQ=265 +NEQ=266 +NEQJ=267 +LT=268 +LTE=269 +GT=270 +GTE=271 +PLUS=272 +MINUS=273 +ASTERISK=274 +SLASH=275 +PERCENT=276 +DIV=277 +TILDE=278 +AMPERSAND=279 +PIPE=280 +CONCAT_PIPE=281 +HAT=282 +STRING=283 +BIGINT_LITERAL=284 +SMALLINT_LITERAL=285 +TINYINT_LITERAL=286 +INTEGER_VALUE=287 +EXPONENT_VALUE=288 +DECIMAL_VALUE=289 +DOUBLE_LITERAL=290 +BIGDECIMAL_LITERAL=291 +IDENTIFIER=292 +BACKQUOTED_IDENTIFIER=293 +SIMPLE_COMMENT=294 +BRACKETED_COMMENT=295 +WS=296 +UNRECOGNIZED=297 +';'=1 +'('=2 +')'=3 +','=4 +'.'=5 +'/*+'=6 +'*/'=7 +'->'=8 +'['=9 +']'=10 +':'=11 +'ADD'=12 +'AFTER'=13 +'ALL'=14 +'ALTER'=15 +'ANALYZE'=16 +'AND'=17 +'ANTI'=18 +'ANY'=19 +'ARCHIVE'=20 +'ARRAY'=21 +'AS'=22 +'ASC'=23 +'AT'=24 +'AUTHORIZATION'=25 +'BETWEEN'=26 +'BOTH'=27 +'BUCKET'=28 +'BUCKETS'=29 +'BY'=30 +'CACHE'=31 +'CASCADE'=32 +'CASE'=33 +'CAST'=34 +'CHANGE'=35 +'CHECK'=36 +'CLEAR'=37 +'CLUSTER'=38 +'CLUSTERED'=39 +'CODEGEN'=40 +'COLLATE'=41 +'COLLECTION'=42 +'COLUMN'=43 +'COLUMNS'=44 +'COMMENT'=45 +'COMMIT'=46 +'COMPACT'=47 +'COMPACTIONS'=48 +'COMPUTE'=49 +'CONCATENATE'=50 +'CONSTRAINT'=51 +'COST'=52 +'CREATE'=53 +'CROSS'=54 +'CUBE'=55 +'CURRENT'=56 +'CURRENT_DATE'=57 +'CURRENT_TIME'=58 +'CURRENT_TIMESTAMP'=59 +'CURRENT_USER'=60 +'DATA'=61 +'DATABASE'=62 +'DAY'=64 +'DBPROPERTIES'=65 +'DEFINED'=66 +'DELETE'=67 +'DELIMITED'=68 +'DESC'=69 +'DESCRIBE'=70 +'DFS'=71 +'DIRECTORIES'=72 +'DIRECTORY'=73 +'DISTINCT'=74 +'DISTRIBUTE'=75 +'DROP'=76 +'ELSE'=77 +'END'=78 +'ESCAPE'=79 +'ESCAPED'=80 +'EXCEPT'=81 +'EXCHANGE'=82 +'EXISTS'=83 +'EXPLAIN'=84 +'EXPORT'=85 +'EXTENDED'=86 +'EXTERNAL'=87 +'EXTRACT'=88 +'FALSE'=89 +'FETCH'=90 +'FIELDS'=91 +'FILTER'=92 +'FILEFORMAT'=93 +'FIRST'=94 +'FOLLOWING'=95 +'FOR'=96 +'FOREIGN'=97 +'FORMAT'=98 +'FORMATTED'=99 +'FROM'=100 +'FULL'=101 +'FUNCTION'=102 +'FUNCTIONS'=103 +'GLOBAL'=104 +'GRANT'=105 +'GROUP'=106 +'GROUPING'=107 +'HAVING'=108 +'HOUR'=109 +'IF'=110 +'IGNORE'=111 +'IMPORT'=112 +'IN'=113 +'INDEX'=114 +'INDEXES'=115 +'INNER'=116 +'INPATH'=117 +'INPUTFORMAT'=118 +'INSERT'=119 +'INTERSECT'=120 +'INTERVAL'=121 +'INTO'=122 +'IS'=123 +'ITEMS'=124 +'JOIN'=125 +'KEYS'=126 +'LAST'=127 +'LATERAL'=128 +'LAZY'=129 +'LEADING'=130 +'LEFT'=131 +'LIKE'=132 +'LIMIT'=133 +'LINES'=134 +'LIST'=135 +'LOAD'=136 +'LOCAL'=137 +'LOCATION'=138 +'LOCK'=139 +'LOCKS'=140 +'LOGICAL'=141 +'MACRO'=142 +'MAP'=143 +'MATCHED'=144 +'MERGE'=145 +'MINUTE'=146 +'MONTH'=147 +'MSCK'=148 +'NAMESPACE'=149 +'NAMESPACES'=150 +'NATURAL'=151 +'NO'=152 +'NULL'=154 +'NULLS'=155 +'OF'=156 +'ON'=157 +'ONLY'=158 +'OPTION'=159 +'OPTIONS'=160 +'OR'=161 +'ORDER'=162 +'OUT'=163 +'OUTER'=164 +'OUTPUTFORMAT'=165 +'OVER'=166 +'OVERLAPS'=167 +'OVERLAY'=168 +'OVERWRITE'=169 +'PARTITION'=170 +'PARTITIONED'=171 +'PARTITIONS'=172 +'PERCENT'=173 +'PIVOT'=174 +'PLACING'=175 +'POSITION'=176 +'PRECEDING'=177 +'PRIMARY'=178 +'PRINCIPALS'=179 +'PROPERTIES'=180 +'PURGE'=181 +'QUERY'=182 +'RANGE'=183 +'RECORDREADER'=184 +'RECORDWRITER'=185 +'RECOVER'=186 +'REDUCE'=187 +'REFERENCES'=188 +'REFRESH'=189 +'RENAME'=190 +'REPAIR'=191 +'REPLACE'=192 +'RESET'=193 +'RESTRICT'=194 +'REVOKE'=195 +'RIGHT'=196 +'ROLE'=198 +'ROLES'=199 +'ROLLBACK'=200 +'ROLLUP'=201 +'ROW'=202 +'ROWS'=203 +'SCHEMA'=204 +'SECOND'=205 +'SELECT'=206 +'SEMI'=207 +'SEPARATED'=208 +'SERDE'=209 +'SERDEPROPERTIES'=210 +'SESSION_USER'=211 +'SET'=212 +'MINUS'=213 +'SETS'=214 +'SHOW'=215 +'SKEWED'=216 +'SOME'=217 +'SORT'=218 +'SORTED'=219 +'START'=220 +'STATISTICS'=221 +'STORED'=222 +'STRATIFY'=223 +'STRUCT'=224 +'SUBSTR'=225 +'SUBSTRING'=226 +'TABLE'=227 +'TABLES'=228 +'TABLESAMPLE'=229 +'TBLPROPERTIES'=230 +'TERMINATED'=232 +'THEN'=233 +'TO'=234 +'TOUCH'=235 +'TRAILING'=236 +'TRANSACTION'=237 +'TRANSACTIONS'=238 +'TRANSFORM'=239 +'TRIM'=240 +'TRUE'=241 +'TRUNCATE'=242 +'TYPE'=243 +'UNARCHIVE'=244 +'UNBOUNDED'=245 +'UNCACHE'=246 +'UNION'=247 +'UNIQUE'=248 +'UNKNOWN'=249 +'UNLOCK'=250 +'UNSET'=251 +'UPDATE'=252 +'USE'=253 +'USER'=254 +'USING'=255 +'VALUES'=256 +'VIEW'=257 +'VIEWS'=258 +'WHEN'=259 +'WHERE'=260 +'WINDOW'=261 +'WITH'=262 +'YEAR'=263 +'<=>'=265 +'<>'=266 +'!='=267 +'<'=268 +'>'=270 +'+'=272 +'-'=273 +'*'=274 +'/'=275 +'%'=276 +'DIV'=277 +'~'=278 +'&'=279 +'|'=280 +'||'=281 +'^'=282 diff --git a/pysparkling/sql/ast/generated/SqlBaseListener.py b/pysparkling/sql/ast/generated/SqlBaseListener.py new file mode 100644 index 000000000..f12369053 --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBaseListener.py @@ -0,0 +1,2404 @@ +# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .SqlBaseParser import SqlBaseParser +else: + from SqlBaseParser import SqlBaseParser + +# This class defines a complete listener for a parse tree produced by SqlBaseParser. +class SqlBaseListener(ParseTreeListener): + + # Enter a parse tree produced by SqlBaseParser#singleStatement. + def enterSingleStatement(self, ctx:SqlBaseParser.SingleStatementContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleStatement. + def exitSingleStatement(self, ctx:SqlBaseParser.SingleStatementContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleExpression. + def enterSingleExpression(self, ctx:SqlBaseParser.SingleExpressionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleExpression. + def exitSingleExpression(self, ctx:SqlBaseParser.SingleExpressionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleTableIdentifier. + def enterSingleTableIdentifier(self, ctx:SqlBaseParser.SingleTableIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleTableIdentifier. + def exitSingleTableIdentifier(self, ctx:SqlBaseParser.SingleTableIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleMultipartIdentifier. + def enterSingleMultipartIdentifier(self, ctx:SqlBaseParser.SingleMultipartIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleMultipartIdentifier. + def exitSingleMultipartIdentifier(self, ctx:SqlBaseParser.SingleMultipartIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleFunctionIdentifier. + def enterSingleFunctionIdentifier(self, ctx:SqlBaseParser.SingleFunctionIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleFunctionIdentifier. + def exitSingleFunctionIdentifier(self, ctx:SqlBaseParser.SingleFunctionIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleDataType. + def enterSingleDataType(self, ctx:SqlBaseParser.SingleDataTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleDataType. + def exitSingleDataType(self, ctx:SqlBaseParser.SingleDataTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleTableSchema. + def enterSingleTableSchema(self, ctx:SqlBaseParser.SingleTableSchemaContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleTableSchema. + def exitSingleTableSchema(self, ctx:SqlBaseParser.SingleTableSchemaContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#statementDefault. + def enterStatementDefault(self, ctx:SqlBaseParser.StatementDefaultContext): + pass + + # Exit a parse tree produced by SqlBaseParser#statementDefault. + def exitStatementDefault(self, ctx:SqlBaseParser.StatementDefaultContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dmlStatement. + def enterDmlStatement(self, ctx:SqlBaseParser.DmlStatementContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dmlStatement. + def exitDmlStatement(self, ctx:SqlBaseParser.DmlStatementContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#use. + def enterUse(self, ctx:SqlBaseParser.UseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#use. + def exitUse(self, ctx:SqlBaseParser.UseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createNamespace. + def enterCreateNamespace(self, ctx:SqlBaseParser.CreateNamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createNamespace. + def exitCreateNamespace(self, ctx:SqlBaseParser.CreateNamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setNamespaceProperties. + def enterSetNamespaceProperties(self, ctx:SqlBaseParser.SetNamespacePropertiesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setNamespaceProperties. + def exitSetNamespaceProperties(self, ctx:SqlBaseParser.SetNamespacePropertiesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setNamespaceLocation. + def enterSetNamespaceLocation(self, ctx:SqlBaseParser.SetNamespaceLocationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setNamespaceLocation. + def exitSetNamespaceLocation(self, ctx:SqlBaseParser.SetNamespaceLocationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropNamespace. + def enterDropNamespace(self, ctx:SqlBaseParser.DropNamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropNamespace. + def exitDropNamespace(self, ctx:SqlBaseParser.DropNamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showNamespaces. + def enterShowNamespaces(self, ctx:SqlBaseParser.ShowNamespacesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showNamespaces. + def exitShowNamespaces(self, ctx:SqlBaseParser.ShowNamespacesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createTable. + def enterCreateTable(self, ctx:SqlBaseParser.CreateTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createTable. + def exitCreateTable(self, ctx:SqlBaseParser.CreateTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createHiveTable. + def enterCreateHiveTable(self, ctx:SqlBaseParser.CreateHiveTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createHiveTable. + def exitCreateHiveTable(self, ctx:SqlBaseParser.CreateHiveTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createTableLike. + def enterCreateTableLike(self, ctx:SqlBaseParser.CreateTableLikeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createTableLike. + def exitCreateTableLike(self, ctx:SqlBaseParser.CreateTableLikeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#replaceTable. + def enterReplaceTable(self, ctx:SqlBaseParser.ReplaceTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#replaceTable. + def exitReplaceTable(self, ctx:SqlBaseParser.ReplaceTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#analyze. + def enterAnalyze(self, ctx:SqlBaseParser.AnalyzeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#analyze. + def exitAnalyze(self, ctx:SqlBaseParser.AnalyzeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#addTableColumns. + def enterAddTableColumns(self, ctx:SqlBaseParser.AddTableColumnsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#addTableColumns. + def exitAddTableColumns(self, ctx:SqlBaseParser.AddTableColumnsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#renameTableColumn. + def enterRenameTableColumn(self, ctx:SqlBaseParser.RenameTableColumnContext): + pass + + # Exit a parse tree produced by SqlBaseParser#renameTableColumn. + def exitRenameTableColumn(self, ctx:SqlBaseParser.RenameTableColumnContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropTableColumns. + def enterDropTableColumns(self, ctx:SqlBaseParser.DropTableColumnsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropTableColumns. + def exitDropTableColumns(self, ctx:SqlBaseParser.DropTableColumnsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#renameTable. + def enterRenameTable(self, ctx:SqlBaseParser.RenameTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#renameTable. + def exitRenameTable(self, ctx:SqlBaseParser.RenameTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setTableProperties. + def enterSetTableProperties(self, ctx:SqlBaseParser.SetTablePropertiesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setTableProperties. + def exitSetTableProperties(self, ctx:SqlBaseParser.SetTablePropertiesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#unsetTableProperties. + def enterUnsetTableProperties(self, ctx:SqlBaseParser.UnsetTablePropertiesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#unsetTableProperties. + def exitUnsetTableProperties(self, ctx:SqlBaseParser.UnsetTablePropertiesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#alterTableAlterColumn. + def enterAlterTableAlterColumn(self, ctx:SqlBaseParser.AlterTableAlterColumnContext): + pass + + # Exit a parse tree produced by SqlBaseParser#alterTableAlterColumn. + def exitAlterTableAlterColumn(self, ctx:SqlBaseParser.AlterTableAlterColumnContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#hiveChangeColumn. + def enterHiveChangeColumn(self, ctx:SqlBaseParser.HiveChangeColumnContext): + pass + + # Exit a parse tree produced by SqlBaseParser#hiveChangeColumn. + def exitHiveChangeColumn(self, ctx:SqlBaseParser.HiveChangeColumnContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#hiveReplaceColumns. + def enterHiveReplaceColumns(self, ctx:SqlBaseParser.HiveReplaceColumnsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#hiveReplaceColumns. + def exitHiveReplaceColumns(self, ctx:SqlBaseParser.HiveReplaceColumnsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setTableSerDe. + def enterSetTableSerDe(self, ctx:SqlBaseParser.SetTableSerDeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setTableSerDe. + def exitSetTableSerDe(self, ctx:SqlBaseParser.SetTableSerDeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#addTablePartition. + def enterAddTablePartition(self, ctx:SqlBaseParser.AddTablePartitionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#addTablePartition. + def exitAddTablePartition(self, ctx:SqlBaseParser.AddTablePartitionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#renameTablePartition. + def enterRenameTablePartition(self, ctx:SqlBaseParser.RenameTablePartitionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#renameTablePartition. + def exitRenameTablePartition(self, ctx:SqlBaseParser.RenameTablePartitionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropTablePartitions. + def enterDropTablePartitions(self, ctx:SqlBaseParser.DropTablePartitionsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropTablePartitions. + def exitDropTablePartitions(self, ctx:SqlBaseParser.DropTablePartitionsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setTableLocation. + def enterSetTableLocation(self, ctx:SqlBaseParser.SetTableLocationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setTableLocation. + def exitSetTableLocation(self, ctx:SqlBaseParser.SetTableLocationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#recoverPartitions. + def enterRecoverPartitions(self, ctx:SqlBaseParser.RecoverPartitionsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#recoverPartitions. + def exitRecoverPartitions(self, ctx:SqlBaseParser.RecoverPartitionsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropTable. + def enterDropTable(self, ctx:SqlBaseParser.DropTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropTable. + def exitDropTable(self, ctx:SqlBaseParser.DropTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropView. + def enterDropView(self, ctx:SqlBaseParser.DropViewContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropView. + def exitDropView(self, ctx:SqlBaseParser.DropViewContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createView. + def enterCreateView(self, ctx:SqlBaseParser.CreateViewContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createView. + def exitCreateView(self, ctx:SqlBaseParser.CreateViewContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createTempViewUsing. + def enterCreateTempViewUsing(self, ctx:SqlBaseParser.CreateTempViewUsingContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createTempViewUsing. + def exitCreateTempViewUsing(self, ctx:SqlBaseParser.CreateTempViewUsingContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#alterViewQuery. + def enterAlterViewQuery(self, ctx:SqlBaseParser.AlterViewQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#alterViewQuery. + def exitAlterViewQuery(self, ctx:SqlBaseParser.AlterViewQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createFunction. + def enterCreateFunction(self, ctx:SqlBaseParser.CreateFunctionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createFunction. + def exitCreateFunction(self, ctx:SqlBaseParser.CreateFunctionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dropFunction. + def enterDropFunction(self, ctx:SqlBaseParser.DropFunctionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dropFunction. + def exitDropFunction(self, ctx:SqlBaseParser.DropFunctionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#explain. + def enterExplain(self, ctx:SqlBaseParser.ExplainContext): + pass + + # Exit a parse tree produced by SqlBaseParser#explain. + def exitExplain(self, ctx:SqlBaseParser.ExplainContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showTables. + def enterShowTables(self, ctx:SqlBaseParser.ShowTablesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showTables. + def exitShowTables(self, ctx:SqlBaseParser.ShowTablesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showTable. + def enterShowTable(self, ctx:SqlBaseParser.ShowTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showTable. + def exitShowTable(self, ctx:SqlBaseParser.ShowTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showTblProperties. + def enterShowTblProperties(self, ctx:SqlBaseParser.ShowTblPropertiesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showTblProperties. + def exitShowTblProperties(self, ctx:SqlBaseParser.ShowTblPropertiesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showColumns. + def enterShowColumns(self, ctx:SqlBaseParser.ShowColumnsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showColumns. + def exitShowColumns(self, ctx:SqlBaseParser.ShowColumnsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showViews. + def enterShowViews(self, ctx:SqlBaseParser.ShowViewsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showViews. + def exitShowViews(self, ctx:SqlBaseParser.ShowViewsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showPartitions. + def enterShowPartitions(self, ctx:SqlBaseParser.ShowPartitionsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showPartitions. + def exitShowPartitions(self, ctx:SqlBaseParser.ShowPartitionsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showFunctions. + def enterShowFunctions(self, ctx:SqlBaseParser.ShowFunctionsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showFunctions. + def exitShowFunctions(self, ctx:SqlBaseParser.ShowFunctionsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showCreateTable. + def enterShowCreateTable(self, ctx:SqlBaseParser.ShowCreateTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showCreateTable. + def exitShowCreateTable(self, ctx:SqlBaseParser.ShowCreateTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#showCurrentNamespace. + def enterShowCurrentNamespace(self, ctx:SqlBaseParser.ShowCurrentNamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#showCurrentNamespace. + def exitShowCurrentNamespace(self, ctx:SqlBaseParser.ShowCurrentNamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeFunction. + def enterDescribeFunction(self, ctx:SqlBaseParser.DescribeFunctionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeFunction. + def exitDescribeFunction(self, ctx:SqlBaseParser.DescribeFunctionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeNamespace. + def enterDescribeNamespace(self, ctx:SqlBaseParser.DescribeNamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeNamespace. + def exitDescribeNamespace(self, ctx:SqlBaseParser.DescribeNamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeRelation. + def enterDescribeRelation(self, ctx:SqlBaseParser.DescribeRelationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeRelation. + def exitDescribeRelation(self, ctx:SqlBaseParser.DescribeRelationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeQuery. + def enterDescribeQuery(self, ctx:SqlBaseParser.DescribeQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeQuery. + def exitDescribeQuery(self, ctx:SqlBaseParser.DescribeQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#commentNamespace. + def enterCommentNamespace(self, ctx:SqlBaseParser.CommentNamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#commentNamespace. + def exitCommentNamespace(self, ctx:SqlBaseParser.CommentNamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#commentTable. + def enterCommentTable(self, ctx:SqlBaseParser.CommentTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#commentTable. + def exitCommentTable(self, ctx:SqlBaseParser.CommentTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#refreshTable. + def enterRefreshTable(self, ctx:SqlBaseParser.RefreshTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#refreshTable. + def exitRefreshTable(self, ctx:SqlBaseParser.RefreshTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#refreshResource. + def enterRefreshResource(self, ctx:SqlBaseParser.RefreshResourceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#refreshResource. + def exitRefreshResource(self, ctx:SqlBaseParser.RefreshResourceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#cacheTable. + def enterCacheTable(self, ctx:SqlBaseParser.CacheTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#cacheTable. + def exitCacheTable(self, ctx:SqlBaseParser.CacheTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#uncacheTable. + def enterUncacheTable(self, ctx:SqlBaseParser.UncacheTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#uncacheTable. + def exitUncacheTable(self, ctx:SqlBaseParser.UncacheTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#clearCache. + def enterClearCache(self, ctx:SqlBaseParser.ClearCacheContext): + pass + + # Exit a parse tree produced by SqlBaseParser#clearCache. + def exitClearCache(self, ctx:SqlBaseParser.ClearCacheContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#loadData. + def enterLoadData(self, ctx:SqlBaseParser.LoadDataContext): + pass + + # Exit a parse tree produced by SqlBaseParser#loadData. + def exitLoadData(self, ctx:SqlBaseParser.LoadDataContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#truncateTable. + def enterTruncateTable(self, ctx:SqlBaseParser.TruncateTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#truncateTable. + def exitTruncateTable(self, ctx:SqlBaseParser.TruncateTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#repairTable. + def enterRepairTable(self, ctx:SqlBaseParser.RepairTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#repairTable. + def exitRepairTable(self, ctx:SqlBaseParser.RepairTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#manageResource. + def enterManageResource(self, ctx:SqlBaseParser.ManageResourceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#manageResource. + def exitManageResource(self, ctx:SqlBaseParser.ManageResourceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#failNativeCommand. + def enterFailNativeCommand(self, ctx:SqlBaseParser.FailNativeCommandContext): + pass + + # Exit a parse tree produced by SqlBaseParser#failNativeCommand. + def exitFailNativeCommand(self, ctx:SqlBaseParser.FailNativeCommandContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setConfiguration. + def enterSetConfiguration(self, ctx:SqlBaseParser.SetConfigurationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setConfiguration. + def exitSetConfiguration(self, ctx:SqlBaseParser.SetConfigurationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#resetConfiguration. + def enterResetConfiguration(self, ctx:SqlBaseParser.ResetConfigurationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#resetConfiguration. + def exitResetConfiguration(self, ctx:SqlBaseParser.ResetConfigurationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#unsupportedHiveNativeCommands. + def enterUnsupportedHiveNativeCommands(self, ctx:SqlBaseParser.UnsupportedHiveNativeCommandsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#unsupportedHiveNativeCommands. + def exitUnsupportedHiveNativeCommands(self, ctx:SqlBaseParser.UnsupportedHiveNativeCommandsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createTableHeader. + def enterCreateTableHeader(self, ctx:SqlBaseParser.CreateTableHeaderContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createTableHeader. + def exitCreateTableHeader(self, ctx:SqlBaseParser.CreateTableHeaderContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#replaceTableHeader. + def enterReplaceTableHeader(self, ctx:SqlBaseParser.ReplaceTableHeaderContext): + pass + + # Exit a parse tree produced by SqlBaseParser#replaceTableHeader. + def exitReplaceTableHeader(self, ctx:SqlBaseParser.ReplaceTableHeaderContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#bucketSpec. + def enterBucketSpec(self, ctx:SqlBaseParser.BucketSpecContext): + pass + + # Exit a parse tree produced by SqlBaseParser#bucketSpec. + def exitBucketSpec(self, ctx:SqlBaseParser.BucketSpecContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#skewSpec. + def enterSkewSpec(self, ctx:SqlBaseParser.SkewSpecContext): + pass + + # Exit a parse tree produced by SqlBaseParser#skewSpec. + def exitSkewSpec(self, ctx:SqlBaseParser.SkewSpecContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#locationSpec. + def enterLocationSpec(self, ctx:SqlBaseParser.LocationSpecContext): + pass + + # Exit a parse tree produced by SqlBaseParser#locationSpec. + def exitLocationSpec(self, ctx:SqlBaseParser.LocationSpecContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#commentSpec. + def enterCommentSpec(self, ctx:SqlBaseParser.CommentSpecContext): + pass + + # Exit a parse tree produced by SqlBaseParser#commentSpec. + def exitCommentSpec(self, ctx:SqlBaseParser.CommentSpecContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#query. + def enterQuery(self, ctx:SqlBaseParser.QueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#query. + def exitQuery(self, ctx:SqlBaseParser.QueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#insertOverwriteTable. + def enterInsertOverwriteTable(self, ctx:SqlBaseParser.InsertOverwriteTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#insertOverwriteTable. + def exitInsertOverwriteTable(self, ctx:SqlBaseParser.InsertOverwriteTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#insertIntoTable. + def enterInsertIntoTable(self, ctx:SqlBaseParser.InsertIntoTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#insertIntoTable. + def exitInsertIntoTable(self, ctx:SqlBaseParser.InsertIntoTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#insertOverwriteHiveDir. + def enterInsertOverwriteHiveDir(self, ctx:SqlBaseParser.InsertOverwriteHiveDirContext): + pass + + # Exit a parse tree produced by SqlBaseParser#insertOverwriteHiveDir. + def exitInsertOverwriteHiveDir(self, ctx:SqlBaseParser.InsertOverwriteHiveDirContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#insertOverwriteDir. + def enterInsertOverwriteDir(self, ctx:SqlBaseParser.InsertOverwriteDirContext): + pass + + # Exit a parse tree produced by SqlBaseParser#insertOverwriteDir. + def exitInsertOverwriteDir(self, ctx:SqlBaseParser.InsertOverwriteDirContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#partitionSpecLocation. + def enterPartitionSpecLocation(self, ctx:SqlBaseParser.PartitionSpecLocationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#partitionSpecLocation. + def exitPartitionSpecLocation(self, ctx:SqlBaseParser.PartitionSpecLocationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#partitionSpec. + def enterPartitionSpec(self, ctx:SqlBaseParser.PartitionSpecContext): + pass + + # Exit a parse tree produced by SqlBaseParser#partitionSpec. + def exitPartitionSpec(self, ctx:SqlBaseParser.PartitionSpecContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#partitionVal. + def enterPartitionVal(self, ctx:SqlBaseParser.PartitionValContext): + pass + + # Exit a parse tree produced by SqlBaseParser#partitionVal. + def exitPartitionVal(self, ctx:SqlBaseParser.PartitionValContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#namespace. + def enterNamespace(self, ctx:SqlBaseParser.NamespaceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#namespace. + def exitNamespace(self, ctx:SqlBaseParser.NamespaceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeFuncName. + def enterDescribeFuncName(self, ctx:SqlBaseParser.DescribeFuncNameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeFuncName. + def exitDescribeFuncName(self, ctx:SqlBaseParser.DescribeFuncNameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#describeColName. + def enterDescribeColName(self, ctx:SqlBaseParser.DescribeColNameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#describeColName. + def exitDescribeColName(self, ctx:SqlBaseParser.DescribeColNameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#ctes. + def enterCtes(self, ctx:SqlBaseParser.CtesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#ctes. + def exitCtes(self, ctx:SqlBaseParser.CtesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#namedQuery. + def enterNamedQuery(self, ctx:SqlBaseParser.NamedQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#namedQuery. + def exitNamedQuery(self, ctx:SqlBaseParser.NamedQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableProvider. + def enterTableProvider(self, ctx:SqlBaseParser.TableProviderContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableProvider. + def exitTableProvider(self, ctx:SqlBaseParser.TableProviderContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createTableClauses. + def enterCreateTableClauses(self, ctx:SqlBaseParser.CreateTableClausesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createTableClauses. + def exitCreateTableClauses(self, ctx:SqlBaseParser.CreateTableClausesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tablePropertyList. + def enterTablePropertyList(self, ctx:SqlBaseParser.TablePropertyListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tablePropertyList. + def exitTablePropertyList(self, ctx:SqlBaseParser.TablePropertyListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableProperty. + def enterTableProperty(self, ctx:SqlBaseParser.TablePropertyContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableProperty. + def exitTableProperty(self, ctx:SqlBaseParser.TablePropertyContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tablePropertyKey. + def enterTablePropertyKey(self, ctx:SqlBaseParser.TablePropertyKeyContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tablePropertyKey. + def exitTablePropertyKey(self, ctx:SqlBaseParser.TablePropertyKeyContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tablePropertyValue. + def enterTablePropertyValue(self, ctx:SqlBaseParser.TablePropertyValueContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tablePropertyValue. + def exitTablePropertyValue(self, ctx:SqlBaseParser.TablePropertyValueContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#constantList. + def enterConstantList(self, ctx:SqlBaseParser.ConstantListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#constantList. + def exitConstantList(self, ctx:SqlBaseParser.ConstantListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#nestedConstantList. + def enterNestedConstantList(self, ctx:SqlBaseParser.NestedConstantListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#nestedConstantList. + def exitNestedConstantList(self, ctx:SqlBaseParser.NestedConstantListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#createFileFormat. + def enterCreateFileFormat(self, ctx:SqlBaseParser.CreateFileFormatContext): + pass + + # Exit a parse tree produced by SqlBaseParser#createFileFormat. + def exitCreateFileFormat(self, ctx:SqlBaseParser.CreateFileFormatContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableFileFormat. + def enterTableFileFormat(self, ctx:SqlBaseParser.TableFileFormatContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableFileFormat. + def exitTableFileFormat(self, ctx:SqlBaseParser.TableFileFormatContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#genericFileFormat. + def enterGenericFileFormat(self, ctx:SqlBaseParser.GenericFileFormatContext): + pass + + # Exit a parse tree produced by SqlBaseParser#genericFileFormat. + def exitGenericFileFormat(self, ctx:SqlBaseParser.GenericFileFormatContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#storageHandler. + def enterStorageHandler(self, ctx:SqlBaseParser.StorageHandlerContext): + pass + + # Exit a parse tree produced by SqlBaseParser#storageHandler. + def exitStorageHandler(self, ctx:SqlBaseParser.StorageHandlerContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#resource. + def enterResource(self, ctx:SqlBaseParser.ResourceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#resource. + def exitResource(self, ctx:SqlBaseParser.ResourceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#singleInsertQuery. + def enterSingleInsertQuery(self, ctx:SqlBaseParser.SingleInsertQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#singleInsertQuery. + def exitSingleInsertQuery(self, ctx:SqlBaseParser.SingleInsertQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#multiInsertQuery. + def enterMultiInsertQuery(self, ctx:SqlBaseParser.MultiInsertQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#multiInsertQuery. + def exitMultiInsertQuery(self, ctx:SqlBaseParser.MultiInsertQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#deleteFromTable. + def enterDeleteFromTable(self, ctx:SqlBaseParser.DeleteFromTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#deleteFromTable. + def exitDeleteFromTable(self, ctx:SqlBaseParser.DeleteFromTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#updateTable. + def enterUpdateTable(self, ctx:SqlBaseParser.UpdateTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#updateTable. + def exitUpdateTable(self, ctx:SqlBaseParser.UpdateTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#mergeIntoTable. + def enterMergeIntoTable(self, ctx:SqlBaseParser.MergeIntoTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#mergeIntoTable. + def exitMergeIntoTable(self, ctx:SqlBaseParser.MergeIntoTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#queryOrganization. + def enterQueryOrganization(self, ctx:SqlBaseParser.QueryOrganizationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#queryOrganization. + def exitQueryOrganization(self, ctx:SqlBaseParser.QueryOrganizationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#multiInsertQueryBody. + def enterMultiInsertQueryBody(self, ctx:SqlBaseParser.MultiInsertQueryBodyContext): + pass + + # Exit a parse tree produced by SqlBaseParser#multiInsertQueryBody. + def exitMultiInsertQueryBody(self, ctx:SqlBaseParser.MultiInsertQueryBodyContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#queryTermDefault. + def enterQueryTermDefault(self, ctx:SqlBaseParser.QueryTermDefaultContext): + pass + + # Exit a parse tree produced by SqlBaseParser#queryTermDefault. + def exitQueryTermDefault(self, ctx:SqlBaseParser.QueryTermDefaultContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setOperation. + def enterSetOperation(self, ctx:SqlBaseParser.SetOperationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setOperation. + def exitSetOperation(self, ctx:SqlBaseParser.SetOperationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#queryPrimaryDefault. + def enterQueryPrimaryDefault(self, ctx:SqlBaseParser.QueryPrimaryDefaultContext): + pass + + # Exit a parse tree produced by SqlBaseParser#queryPrimaryDefault. + def exitQueryPrimaryDefault(self, ctx:SqlBaseParser.QueryPrimaryDefaultContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#fromStmt. + def enterFromStmt(self, ctx:SqlBaseParser.FromStmtContext): + pass + + # Exit a parse tree produced by SqlBaseParser#fromStmt. + def exitFromStmt(self, ctx:SqlBaseParser.FromStmtContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#table. + def enterTable(self, ctx:SqlBaseParser.TableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#table. + def exitTable(self, ctx:SqlBaseParser.TableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#inlineTableDefault1. + def enterInlineTableDefault1(self, ctx:SqlBaseParser.InlineTableDefault1Context): + pass + + # Exit a parse tree produced by SqlBaseParser#inlineTableDefault1. + def exitInlineTableDefault1(self, ctx:SqlBaseParser.InlineTableDefault1Context): + pass + + + # Enter a parse tree produced by SqlBaseParser#subquery. + def enterSubquery(self, ctx:SqlBaseParser.SubqueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#subquery. + def exitSubquery(self, ctx:SqlBaseParser.SubqueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sortItem. + def enterSortItem(self, ctx:SqlBaseParser.SortItemContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sortItem. + def exitSortItem(self, ctx:SqlBaseParser.SortItemContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#fromStatement. + def enterFromStatement(self, ctx:SqlBaseParser.FromStatementContext): + pass + + # Exit a parse tree produced by SqlBaseParser#fromStatement. + def exitFromStatement(self, ctx:SqlBaseParser.FromStatementContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#fromStatementBody. + def enterFromStatementBody(self, ctx:SqlBaseParser.FromStatementBodyContext): + pass + + # Exit a parse tree produced by SqlBaseParser#fromStatementBody. + def exitFromStatementBody(self, ctx:SqlBaseParser.FromStatementBodyContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#transformQuerySpecification. + def enterTransformQuerySpecification(self, ctx:SqlBaseParser.TransformQuerySpecificationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#transformQuerySpecification. + def exitTransformQuerySpecification(self, ctx:SqlBaseParser.TransformQuerySpecificationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#regularQuerySpecification. + def enterRegularQuerySpecification(self, ctx:SqlBaseParser.RegularQuerySpecificationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#regularQuerySpecification. + def exitRegularQuerySpecification(self, ctx:SqlBaseParser.RegularQuerySpecificationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#transformClause. + def enterTransformClause(self, ctx:SqlBaseParser.TransformClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#transformClause. + def exitTransformClause(self, ctx:SqlBaseParser.TransformClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#selectClause. + def enterSelectClause(self, ctx:SqlBaseParser.SelectClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#selectClause. + def exitSelectClause(self, ctx:SqlBaseParser.SelectClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setClause. + def enterSetClause(self, ctx:SqlBaseParser.SetClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setClause. + def exitSetClause(self, ctx:SqlBaseParser.SetClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#matchedClause. + def enterMatchedClause(self, ctx:SqlBaseParser.MatchedClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#matchedClause. + def exitMatchedClause(self, ctx:SqlBaseParser.MatchedClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#notMatchedClause. + def enterNotMatchedClause(self, ctx:SqlBaseParser.NotMatchedClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#notMatchedClause. + def exitNotMatchedClause(self, ctx:SqlBaseParser.NotMatchedClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#matchedAction. + def enterMatchedAction(self, ctx:SqlBaseParser.MatchedActionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#matchedAction. + def exitMatchedAction(self, ctx:SqlBaseParser.MatchedActionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#notMatchedAction. + def enterNotMatchedAction(self, ctx:SqlBaseParser.NotMatchedActionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#notMatchedAction. + def exitNotMatchedAction(self, ctx:SqlBaseParser.NotMatchedActionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#assignmentList. + def enterAssignmentList(self, ctx:SqlBaseParser.AssignmentListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#assignmentList. + def exitAssignmentList(self, ctx:SqlBaseParser.AssignmentListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#assignment. + def enterAssignment(self, ctx:SqlBaseParser.AssignmentContext): + pass + + # Exit a parse tree produced by SqlBaseParser#assignment. + def exitAssignment(self, ctx:SqlBaseParser.AssignmentContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#whereClause. + def enterWhereClause(self, ctx:SqlBaseParser.WhereClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#whereClause. + def exitWhereClause(self, ctx:SqlBaseParser.WhereClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#havingClause. + def enterHavingClause(self, ctx:SqlBaseParser.HavingClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#havingClause. + def exitHavingClause(self, ctx:SqlBaseParser.HavingClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#hint. + def enterHint(self, ctx:SqlBaseParser.HintContext): + pass + + # Exit a parse tree produced by SqlBaseParser#hint. + def exitHint(self, ctx:SqlBaseParser.HintContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#hintStatement. + def enterHintStatement(self, ctx:SqlBaseParser.HintStatementContext): + pass + + # Exit a parse tree produced by SqlBaseParser#hintStatement. + def exitHintStatement(self, ctx:SqlBaseParser.HintStatementContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#fromClause. + def enterFromClause(self, ctx:SqlBaseParser.FromClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#fromClause. + def exitFromClause(self, ctx:SqlBaseParser.FromClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#aggregationClause. + def enterAggregationClause(self, ctx:SqlBaseParser.AggregationClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#aggregationClause. + def exitAggregationClause(self, ctx:SqlBaseParser.AggregationClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#groupingSet. + def enterGroupingSet(self, ctx:SqlBaseParser.GroupingSetContext): + pass + + # Exit a parse tree produced by SqlBaseParser#groupingSet. + def exitGroupingSet(self, ctx:SqlBaseParser.GroupingSetContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#pivotClause. + def enterPivotClause(self, ctx:SqlBaseParser.PivotClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#pivotClause. + def exitPivotClause(self, ctx:SqlBaseParser.PivotClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#pivotColumn. + def enterPivotColumn(self, ctx:SqlBaseParser.PivotColumnContext): + pass + + # Exit a parse tree produced by SqlBaseParser#pivotColumn. + def exitPivotColumn(self, ctx:SqlBaseParser.PivotColumnContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#pivotValue. + def enterPivotValue(self, ctx:SqlBaseParser.PivotValueContext): + pass + + # Exit a parse tree produced by SqlBaseParser#pivotValue. + def exitPivotValue(self, ctx:SqlBaseParser.PivotValueContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#lateralView. + def enterLateralView(self, ctx:SqlBaseParser.LateralViewContext): + pass + + # Exit a parse tree produced by SqlBaseParser#lateralView. + def exitLateralView(self, ctx:SqlBaseParser.LateralViewContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#setQuantifier. + def enterSetQuantifier(self, ctx:SqlBaseParser.SetQuantifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#setQuantifier. + def exitSetQuantifier(self, ctx:SqlBaseParser.SetQuantifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#relation. + def enterRelation(self, ctx:SqlBaseParser.RelationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#relation. + def exitRelation(self, ctx:SqlBaseParser.RelationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#joinRelation. + def enterJoinRelation(self, ctx:SqlBaseParser.JoinRelationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#joinRelation. + def exitJoinRelation(self, ctx:SqlBaseParser.JoinRelationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#joinType. + def enterJoinType(self, ctx:SqlBaseParser.JoinTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#joinType. + def exitJoinType(self, ctx:SqlBaseParser.JoinTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#joinCriteria. + def enterJoinCriteria(self, ctx:SqlBaseParser.JoinCriteriaContext): + pass + + # Exit a parse tree produced by SqlBaseParser#joinCriteria. + def exitJoinCriteria(self, ctx:SqlBaseParser.JoinCriteriaContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sample. + def enterSample(self, ctx:SqlBaseParser.SampleContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sample. + def exitSample(self, ctx:SqlBaseParser.SampleContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sampleByPercentile. + def enterSampleByPercentile(self, ctx:SqlBaseParser.SampleByPercentileContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sampleByPercentile. + def exitSampleByPercentile(self, ctx:SqlBaseParser.SampleByPercentileContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sampleByRows. + def enterSampleByRows(self, ctx:SqlBaseParser.SampleByRowsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sampleByRows. + def exitSampleByRows(self, ctx:SqlBaseParser.SampleByRowsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sampleByBucket. + def enterSampleByBucket(self, ctx:SqlBaseParser.SampleByBucketContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sampleByBucket. + def exitSampleByBucket(self, ctx:SqlBaseParser.SampleByBucketContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#sampleByBytes. + def enterSampleByBytes(self, ctx:SqlBaseParser.SampleByBytesContext): + pass + + # Exit a parse tree produced by SqlBaseParser#sampleByBytes. + def exitSampleByBytes(self, ctx:SqlBaseParser.SampleByBytesContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identifierList. + def enterIdentifierList(self, ctx:SqlBaseParser.IdentifierListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identifierList. + def exitIdentifierList(self, ctx:SqlBaseParser.IdentifierListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identifierSeq. + def enterIdentifierSeq(self, ctx:SqlBaseParser.IdentifierSeqContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identifierSeq. + def exitIdentifierSeq(self, ctx:SqlBaseParser.IdentifierSeqContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#orderedIdentifierList. + def enterOrderedIdentifierList(self, ctx:SqlBaseParser.OrderedIdentifierListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#orderedIdentifierList. + def exitOrderedIdentifierList(self, ctx:SqlBaseParser.OrderedIdentifierListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#orderedIdentifier. + def enterOrderedIdentifier(self, ctx:SqlBaseParser.OrderedIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#orderedIdentifier. + def exitOrderedIdentifier(self, ctx:SqlBaseParser.OrderedIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identifierCommentList. + def enterIdentifierCommentList(self, ctx:SqlBaseParser.IdentifierCommentListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identifierCommentList. + def exitIdentifierCommentList(self, ctx:SqlBaseParser.IdentifierCommentListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identifierComment. + def enterIdentifierComment(self, ctx:SqlBaseParser.IdentifierCommentContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identifierComment. + def exitIdentifierComment(self, ctx:SqlBaseParser.IdentifierCommentContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableName. + def enterTableName(self, ctx:SqlBaseParser.TableNameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableName. + def exitTableName(self, ctx:SqlBaseParser.TableNameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#aliasedQuery. + def enterAliasedQuery(self, ctx:SqlBaseParser.AliasedQueryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#aliasedQuery. + def exitAliasedQuery(self, ctx:SqlBaseParser.AliasedQueryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#aliasedRelation. + def enterAliasedRelation(self, ctx:SqlBaseParser.AliasedRelationContext): + pass + + # Exit a parse tree produced by SqlBaseParser#aliasedRelation. + def exitAliasedRelation(self, ctx:SqlBaseParser.AliasedRelationContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#inlineTableDefault2. + def enterInlineTableDefault2(self, ctx:SqlBaseParser.InlineTableDefault2Context): + pass + + # Exit a parse tree produced by SqlBaseParser#inlineTableDefault2. + def exitInlineTableDefault2(self, ctx:SqlBaseParser.InlineTableDefault2Context): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableValuedFunction. + def enterTableValuedFunction(self, ctx:SqlBaseParser.TableValuedFunctionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableValuedFunction. + def exitTableValuedFunction(self, ctx:SqlBaseParser.TableValuedFunctionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#inlineTable. + def enterInlineTable(self, ctx:SqlBaseParser.InlineTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#inlineTable. + def exitInlineTable(self, ctx:SqlBaseParser.InlineTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#functionTable. + def enterFunctionTable(self, ctx:SqlBaseParser.FunctionTableContext): + pass + + # Exit a parse tree produced by SqlBaseParser#functionTable. + def exitFunctionTable(self, ctx:SqlBaseParser.FunctionTableContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableAlias. + def enterTableAlias(self, ctx:SqlBaseParser.TableAliasContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableAlias. + def exitTableAlias(self, ctx:SqlBaseParser.TableAliasContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#rowFormatSerde. + def enterRowFormatSerde(self, ctx:SqlBaseParser.RowFormatSerdeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#rowFormatSerde. + def exitRowFormatSerde(self, ctx:SqlBaseParser.RowFormatSerdeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#rowFormatDelimited. + def enterRowFormatDelimited(self, ctx:SqlBaseParser.RowFormatDelimitedContext): + pass + + # Exit a parse tree produced by SqlBaseParser#rowFormatDelimited. + def exitRowFormatDelimited(self, ctx:SqlBaseParser.RowFormatDelimitedContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#multipartIdentifierList. + def enterMultipartIdentifierList(self, ctx:SqlBaseParser.MultipartIdentifierListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#multipartIdentifierList. + def exitMultipartIdentifierList(self, ctx:SqlBaseParser.MultipartIdentifierListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#multipartIdentifier. + def enterMultipartIdentifier(self, ctx:SqlBaseParser.MultipartIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#multipartIdentifier. + def exitMultipartIdentifier(self, ctx:SqlBaseParser.MultipartIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tableIdentifier. + def enterTableIdentifier(self, ctx:SqlBaseParser.TableIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tableIdentifier. + def exitTableIdentifier(self, ctx:SqlBaseParser.TableIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#functionIdentifier. + def enterFunctionIdentifier(self, ctx:SqlBaseParser.FunctionIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#functionIdentifier. + def exitFunctionIdentifier(self, ctx:SqlBaseParser.FunctionIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#namedExpression. + def enterNamedExpression(self, ctx:SqlBaseParser.NamedExpressionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#namedExpression. + def exitNamedExpression(self, ctx:SqlBaseParser.NamedExpressionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#namedExpressionSeq. + def enterNamedExpressionSeq(self, ctx:SqlBaseParser.NamedExpressionSeqContext): + pass + + # Exit a parse tree produced by SqlBaseParser#namedExpressionSeq. + def exitNamedExpressionSeq(self, ctx:SqlBaseParser.NamedExpressionSeqContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#transformList. + def enterTransformList(self, ctx:SqlBaseParser.TransformListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#transformList. + def exitTransformList(self, ctx:SqlBaseParser.TransformListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identityTransform. + def enterIdentityTransform(self, ctx:SqlBaseParser.IdentityTransformContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identityTransform. + def exitIdentityTransform(self, ctx:SqlBaseParser.IdentityTransformContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#applyTransform. + def enterApplyTransform(self, ctx:SqlBaseParser.ApplyTransformContext): + pass + + # Exit a parse tree produced by SqlBaseParser#applyTransform. + def exitApplyTransform(self, ctx:SqlBaseParser.ApplyTransformContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#transformArgument. + def enterTransformArgument(self, ctx:SqlBaseParser.TransformArgumentContext): + pass + + # Exit a parse tree produced by SqlBaseParser#transformArgument. + def exitTransformArgument(self, ctx:SqlBaseParser.TransformArgumentContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#expression. + def enterExpression(self, ctx:SqlBaseParser.ExpressionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#expression. + def exitExpression(self, ctx:SqlBaseParser.ExpressionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#logicalNot. + def enterLogicalNot(self, ctx:SqlBaseParser.LogicalNotContext): + pass + + # Exit a parse tree produced by SqlBaseParser#logicalNot. + def exitLogicalNot(self, ctx:SqlBaseParser.LogicalNotContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#predicated. + def enterPredicated(self, ctx:SqlBaseParser.PredicatedContext): + pass + + # Exit a parse tree produced by SqlBaseParser#predicated. + def exitPredicated(self, ctx:SqlBaseParser.PredicatedContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#exists. + def enterExists(self, ctx:SqlBaseParser.ExistsContext): + pass + + # Exit a parse tree produced by SqlBaseParser#exists. + def exitExists(self, ctx:SqlBaseParser.ExistsContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#logicalBinary. + def enterLogicalBinary(self, ctx:SqlBaseParser.LogicalBinaryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#logicalBinary. + def exitLogicalBinary(self, ctx:SqlBaseParser.LogicalBinaryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#predicate. + def enterPredicate(self, ctx:SqlBaseParser.PredicateContext): + pass + + # Exit a parse tree produced by SqlBaseParser#predicate. + def exitPredicate(self, ctx:SqlBaseParser.PredicateContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#valueExpressionDefault. + def enterValueExpressionDefault(self, ctx:SqlBaseParser.ValueExpressionDefaultContext): + pass + + # Exit a parse tree produced by SqlBaseParser#valueExpressionDefault. + def exitValueExpressionDefault(self, ctx:SqlBaseParser.ValueExpressionDefaultContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#comparison. + def enterComparison(self, ctx:SqlBaseParser.ComparisonContext): + pass + + # Exit a parse tree produced by SqlBaseParser#comparison. + def exitComparison(self, ctx:SqlBaseParser.ComparisonContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#arithmeticBinary. + def enterArithmeticBinary(self, ctx:SqlBaseParser.ArithmeticBinaryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#arithmeticBinary. + def exitArithmeticBinary(self, ctx:SqlBaseParser.ArithmeticBinaryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#arithmeticUnary. + def enterArithmeticUnary(self, ctx:SqlBaseParser.ArithmeticUnaryContext): + pass + + # Exit a parse tree produced by SqlBaseParser#arithmeticUnary. + def exitArithmeticUnary(self, ctx:SqlBaseParser.ArithmeticUnaryContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#struct. + def enterStruct(self, ctx:SqlBaseParser.StructContext): + pass + + # Exit a parse tree produced by SqlBaseParser#struct. + def exitStruct(self, ctx:SqlBaseParser.StructContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#dereference. + def enterDereference(self, ctx:SqlBaseParser.DereferenceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#dereference. + def exitDereference(self, ctx:SqlBaseParser.DereferenceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#simpleCase. + def enterSimpleCase(self, ctx:SqlBaseParser.SimpleCaseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#simpleCase. + def exitSimpleCase(self, ctx:SqlBaseParser.SimpleCaseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#columnReference. + def enterColumnReference(self, ctx:SqlBaseParser.ColumnReferenceContext): + pass + + # Exit a parse tree produced by SqlBaseParser#columnReference. + def exitColumnReference(self, ctx:SqlBaseParser.ColumnReferenceContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#rowConstructor. + def enterRowConstructor(self, ctx:SqlBaseParser.RowConstructorContext): + pass + + # Exit a parse tree produced by SqlBaseParser#rowConstructor. + def exitRowConstructor(self, ctx:SqlBaseParser.RowConstructorContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#last. + def enterLast(self, ctx:SqlBaseParser.LastContext): + pass + + # Exit a parse tree produced by SqlBaseParser#last. + def exitLast(self, ctx:SqlBaseParser.LastContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#star. + def enterStar(self, ctx:SqlBaseParser.StarContext): + pass + + # Exit a parse tree produced by SqlBaseParser#star. + def exitStar(self, ctx:SqlBaseParser.StarContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#overlay. + def enterOverlay(self, ctx:SqlBaseParser.OverlayContext): + pass + + # Exit a parse tree produced by SqlBaseParser#overlay. + def exitOverlay(self, ctx:SqlBaseParser.OverlayContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#subscript. + def enterSubscript(self, ctx:SqlBaseParser.SubscriptContext): + pass + + # Exit a parse tree produced by SqlBaseParser#subscript. + def exitSubscript(self, ctx:SqlBaseParser.SubscriptContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#subqueryExpression. + def enterSubqueryExpression(self, ctx:SqlBaseParser.SubqueryExpressionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#subqueryExpression. + def exitSubqueryExpression(self, ctx:SqlBaseParser.SubqueryExpressionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#substring. + def enterSubstring(self, ctx:SqlBaseParser.SubstringContext): + pass + + # Exit a parse tree produced by SqlBaseParser#substring. + def exitSubstring(self, ctx:SqlBaseParser.SubstringContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#currentDatetime. + def enterCurrentDatetime(self, ctx:SqlBaseParser.CurrentDatetimeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#currentDatetime. + def exitCurrentDatetime(self, ctx:SqlBaseParser.CurrentDatetimeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#cast. + def enterCast(self, ctx:SqlBaseParser.CastContext): + pass + + # Exit a parse tree produced by SqlBaseParser#cast. + def exitCast(self, ctx:SqlBaseParser.CastContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#constantDefault. + def enterConstantDefault(self, ctx:SqlBaseParser.ConstantDefaultContext): + pass + + # Exit a parse tree produced by SqlBaseParser#constantDefault. + def exitConstantDefault(self, ctx:SqlBaseParser.ConstantDefaultContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#lambda. + def enterLambda(self, ctx:SqlBaseParser.LambdaContext): + pass + + # Exit a parse tree produced by SqlBaseParser#lambda. + def exitLambda(self, ctx:SqlBaseParser.LambdaContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#parenthesizedExpression. + def enterParenthesizedExpression(self, ctx:SqlBaseParser.ParenthesizedExpressionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#parenthesizedExpression. + def exitParenthesizedExpression(self, ctx:SqlBaseParser.ParenthesizedExpressionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#extract. + def enterExtract(self, ctx:SqlBaseParser.ExtractContext): + pass + + # Exit a parse tree produced by SqlBaseParser#extract. + def exitExtract(self, ctx:SqlBaseParser.ExtractContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#trim. + def enterTrim(self, ctx:SqlBaseParser.TrimContext): + pass + + # Exit a parse tree produced by SqlBaseParser#trim. + def exitTrim(self, ctx:SqlBaseParser.TrimContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#functionCall. + def enterFunctionCall(self, ctx:SqlBaseParser.FunctionCallContext): + pass + + # Exit a parse tree produced by SqlBaseParser#functionCall. + def exitFunctionCall(self, ctx:SqlBaseParser.FunctionCallContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#searchedCase. + def enterSearchedCase(self, ctx:SqlBaseParser.SearchedCaseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#searchedCase. + def exitSearchedCase(self, ctx:SqlBaseParser.SearchedCaseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#position. + def enterPosition(self, ctx:SqlBaseParser.PositionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#position. + def exitPosition(self, ctx:SqlBaseParser.PositionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#first. + def enterFirst(self, ctx:SqlBaseParser.FirstContext): + pass + + # Exit a parse tree produced by SqlBaseParser#first. + def exitFirst(self, ctx:SqlBaseParser.FirstContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#nullLiteral. + def enterNullLiteral(self, ctx:SqlBaseParser.NullLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#nullLiteral. + def exitNullLiteral(self, ctx:SqlBaseParser.NullLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#intervalLiteral. + def enterIntervalLiteral(self, ctx:SqlBaseParser.IntervalLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#intervalLiteral. + def exitIntervalLiteral(self, ctx:SqlBaseParser.IntervalLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#typeConstructor. + def enterTypeConstructor(self, ctx:SqlBaseParser.TypeConstructorContext): + pass + + # Exit a parse tree produced by SqlBaseParser#typeConstructor. + def exitTypeConstructor(self, ctx:SqlBaseParser.TypeConstructorContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#numericLiteral. + def enterNumericLiteral(self, ctx:SqlBaseParser.NumericLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#numericLiteral. + def exitNumericLiteral(self, ctx:SqlBaseParser.NumericLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#booleanLiteral. + def enterBooleanLiteral(self, ctx:SqlBaseParser.BooleanLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#booleanLiteral. + def exitBooleanLiteral(self, ctx:SqlBaseParser.BooleanLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#stringLiteral. + def enterStringLiteral(self, ctx:SqlBaseParser.StringLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#stringLiteral. + def exitStringLiteral(self, ctx:SqlBaseParser.StringLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#comparisonOperator. + def enterComparisonOperator(self, ctx:SqlBaseParser.ComparisonOperatorContext): + pass + + # Exit a parse tree produced by SqlBaseParser#comparisonOperator. + def exitComparisonOperator(self, ctx:SqlBaseParser.ComparisonOperatorContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#arithmeticOperator. + def enterArithmeticOperator(self, ctx:SqlBaseParser.ArithmeticOperatorContext): + pass + + # Exit a parse tree produced by SqlBaseParser#arithmeticOperator. + def exitArithmeticOperator(self, ctx:SqlBaseParser.ArithmeticOperatorContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#predicateOperator. + def enterPredicateOperator(self, ctx:SqlBaseParser.PredicateOperatorContext): + pass + + # Exit a parse tree produced by SqlBaseParser#predicateOperator. + def exitPredicateOperator(self, ctx:SqlBaseParser.PredicateOperatorContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#booleanValue. + def enterBooleanValue(self, ctx:SqlBaseParser.BooleanValueContext): + pass + + # Exit a parse tree produced by SqlBaseParser#booleanValue. + def exitBooleanValue(self, ctx:SqlBaseParser.BooleanValueContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#interval. + def enterInterval(self, ctx:SqlBaseParser.IntervalContext): + pass + + # Exit a parse tree produced by SqlBaseParser#interval. + def exitInterval(self, ctx:SqlBaseParser.IntervalContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#errorCapturingMultiUnitsInterval. + def enterErrorCapturingMultiUnitsInterval(self, ctx:SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext): + pass + + # Exit a parse tree produced by SqlBaseParser#errorCapturingMultiUnitsInterval. + def exitErrorCapturingMultiUnitsInterval(self, ctx:SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#multiUnitsInterval. + def enterMultiUnitsInterval(self, ctx:SqlBaseParser.MultiUnitsIntervalContext): + pass + + # Exit a parse tree produced by SqlBaseParser#multiUnitsInterval. + def exitMultiUnitsInterval(self, ctx:SqlBaseParser.MultiUnitsIntervalContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#errorCapturingUnitToUnitInterval. + def enterErrorCapturingUnitToUnitInterval(self, ctx:SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext): + pass + + # Exit a parse tree produced by SqlBaseParser#errorCapturingUnitToUnitInterval. + def exitErrorCapturingUnitToUnitInterval(self, ctx:SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#unitToUnitInterval. + def enterUnitToUnitInterval(self, ctx:SqlBaseParser.UnitToUnitIntervalContext): + pass + + # Exit a parse tree produced by SqlBaseParser#unitToUnitInterval. + def exitUnitToUnitInterval(self, ctx:SqlBaseParser.UnitToUnitIntervalContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#intervalValue. + def enterIntervalValue(self, ctx:SqlBaseParser.IntervalValueContext): + pass + + # Exit a parse tree produced by SqlBaseParser#intervalValue. + def exitIntervalValue(self, ctx:SqlBaseParser.IntervalValueContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#intervalUnit. + def enterIntervalUnit(self, ctx:SqlBaseParser.IntervalUnitContext): + pass + + # Exit a parse tree produced by SqlBaseParser#intervalUnit. + def exitIntervalUnit(self, ctx:SqlBaseParser.IntervalUnitContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#colPosition. + def enterColPosition(self, ctx:SqlBaseParser.ColPositionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#colPosition. + def exitColPosition(self, ctx:SqlBaseParser.ColPositionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#complexDataType. + def enterComplexDataType(self, ctx:SqlBaseParser.ComplexDataTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#complexDataType. + def exitComplexDataType(self, ctx:SqlBaseParser.ComplexDataTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#primitiveDataType. + def enterPrimitiveDataType(self, ctx:SqlBaseParser.PrimitiveDataTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#primitiveDataType. + def exitPrimitiveDataType(self, ctx:SqlBaseParser.PrimitiveDataTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#qualifiedColTypeWithPositionList. + def enterQualifiedColTypeWithPositionList(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#qualifiedColTypeWithPositionList. + def exitQualifiedColTypeWithPositionList(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#qualifiedColTypeWithPosition. + def enterQualifiedColTypeWithPosition(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#qualifiedColTypeWithPosition. + def exitQualifiedColTypeWithPosition(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#colTypeList. + def enterColTypeList(self, ctx:SqlBaseParser.ColTypeListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#colTypeList. + def exitColTypeList(self, ctx:SqlBaseParser.ColTypeListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#colType. + def enterColType(self, ctx:SqlBaseParser.ColTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#colType. + def exitColType(self, ctx:SqlBaseParser.ColTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#complexColTypeList. + def enterComplexColTypeList(self, ctx:SqlBaseParser.ComplexColTypeListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#complexColTypeList. + def exitComplexColTypeList(self, ctx:SqlBaseParser.ComplexColTypeListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#complexColType. + def enterComplexColType(self, ctx:SqlBaseParser.ComplexColTypeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#complexColType. + def exitComplexColType(self, ctx:SqlBaseParser.ComplexColTypeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#whenClause. + def enterWhenClause(self, ctx:SqlBaseParser.WhenClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#whenClause. + def exitWhenClause(self, ctx:SqlBaseParser.WhenClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#windowClause. + def enterWindowClause(self, ctx:SqlBaseParser.WindowClauseContext): + pass + + # Exit a parse tree produced by SqlBaseParser#windowClause. + def exitWindowClause(self, ctx:SqlBaseParser.WindowClauseContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#namedWindow. + def enterNamedWindow(self, ctx:SqlBaseParser.NamedWindowContext): + pass + + # Exit a parse tree produced by SqlBaseParser#namedWindow. + def exitNamedWindow(self, ctx:SqlBaseParser.NamedWindowContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#windowRef. + def enterWindowRef(self, ctx:SqlBaseParser.WindowRefContext): + pass + + # Exit a parse tree produced by SqlBaseParser#windowRef. + def exitWindowRef(self, ctx:SqlBaseParser.WindowRefContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#windowDef. + def enterWindowDef(self, ctx:SqlBaseParser.WindowDefContext): + pass + + # Exit a parse tree produced by SqlBaseParser#windowDef. + def exitWindowDef(self, ctx:SqlBaseParser.WindowDefContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#windowFrame. + def enterWindowFrame(self, ctx:SqlBaseParser.WindowFrameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#windowFrame. + def exitWindowFrame(self, ctx:SqlBaseParser.WindowFrameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#frameBound. + def enterFrameBound(self, ctx:SqlBaseParser.FrameBoundContext): + pass + + # Exit a parse tree produced by SqlBaseParser#frameBound. + def exitFrameBound(self, ctx:SqlBaseParser.FrameBoundContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#qualifiedNameList. + def enterQualifiedNameList(self, ctx:SqlBaseParser.QualifiedNameListContext): + pass + + # Exit a parse tree produced by SqlBaseParser#qualifiedNameList. + def exitQualifiedNameList(self, ctx:SqlBaseParser.QualifiedNameListContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#functionName. + def enterFunctionName(self, ctx:SqlBaseParser.FunctionNameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#functionName. + def exitFunctionName(self, ctx:SqlBaseParser.FunctionNameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#qualifiedName. + def enterQualifiedName(self, ctx:SqlBaseParser.QualifiedNameContext): + pass + + # Exit a parse tree produced by SqlBaseParser#qualifiedName. + def exitQualifiedName(self, ctx:SqlBaseParser.QualifiedNameContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#errorCapturingIdentifier. + def enterErrorCapturingIdentifier(self, ctx:SqlBaseParser.ErrorCapturingIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#errorCapturingIdentifier. + def exitErrorCapturingIdentifier(self, ctx:SqlBaseParser.ErrorCapturingIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#errorIdent. + def enterErrorIdent(self, ctx:SqlBaseParser.ErrorIdentContext): + pass + + # Exit a parse tree produced by SqlBaseParser#errorIdent. + def exitErrorIdent(self, ctx:SqlBaseParser.ErrorIdentContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#realIdent. + def enterRealIdent(self, ctx:SqlBaseParser.RealIdentContext): + pass + + # Exit a parse tree produced by SqlBaseParser#realIdent. + def exitRealIdent(self, ctx:SqlBaseParser.RealIdentContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#identifier. + def enterIdentifier(self, ctx:SqlBaseParser.IdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#identifier. + def exitIdentifier(self, ctx:SqlBaseParser.IdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#unquotedIdentifier. + def enterUnquotedIdentifier(self, ctx:SqlBaseParser.UnquotedIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#unquotedIdentifier. + def exitUnquotedIdentifier(self, ctx:SqlBaseParser.UnquotedIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#quotedIdentifierAlternative. + def enterQuotedIdentifierAlternative(self, ctx:SqlBaseParser.QuotedIdentifierAlternativeContext): + pass + + # Exit a parse tree produced by SqlBaseParser#quotedIdentifierAlternative. + def exitQuotedIdentifierAlternative(self, ctx:SqlBaseParser.QuotedIdentifierAlternativeContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#quotedIdentifier. + def enterQuotedIdentifier(self, ctx:SqlBaseParser.QuotedIdentifierContext): + pass + + # Exit a parse tree produced by SqlBaseParser#quotedIdentifier. + def exitQuotedIdentifier(self, ctx:SqlBaseParser.QuotedIdentifierContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#exponentLiteral. + def enterExponentLiteral(self, ctx:SqlBaseParser.ExponentLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#exponentLiteral. + def exitExponentLiteral(self, ctx:SqlBaseParser.ExponentLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#decimalLiteral. + def enterDecimalLiteral(self, ctx:SqlBaseParser.DecimalLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#decimalLiteral. + def exitDecimalLiteral(self, ctx:SqlBaseParser.DecimalLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#legacyDecimalLiteral. + def enterLegacyDecimalLiteral(self, ctx:SqlBaseParser.LegacyDecimalLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#legacyDecimalLiteral. + def exitLegacyDecimalLiteral(self, ctx:SqlBaseParser.LegacyDecimalLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#integerLiteral. + def enterIntegerLiteral(self, ctx:SqlBaseParser.IntegerLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#integerLiteral. + def exitIntegerLiteral(self, ctx:SqlBaseParser.IntegerLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#bigIntLiteral. + def enterBigIntLiteral(self, ctx:SqlBaseParser.BigIntLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#bigIntLiteral. + def exitBigIntLiteral(self, ctx:SqlBaseParser.BigIntLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#smallIntLiteral. + def enterSmallIntLiteral(self, ctx:SqlBaseParser.SmallIntLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#smallIntLiteral. + def exitSmallIntLiteral(self, ctx:SqlBaseParser.SmallIntLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#tinyIntLiteral. + def enterTinyIntLiteral(self, ctx:SqlBaseParser.TinyIntLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#tinyIntLiteral. + def exitTinyIntLiteral(self, ctx:SqlBaseParser.TinyIntLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#doubleLiteral. + def enterDoubleLiteral(self, ctx:SqlBaseParser.DoubleLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#doubleLiteral. + def exitDoubleLiteral(self, ctx:SqlBaseParser.DoubleLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#bigDecimalLiteral. + def enterBigDecimalLiteral(self, ctx:SqlBaseParser.BigDecimalLiteralContext): + pass + + # Exit a parse tree produced by SqlBaseParser#bigDecimalLiteral. + def exitBigDecimalLiteral(self, ctx:SqlBaseParser.BigDecimalLiteralContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#alterColumnAction. + def enterAlterColumnAction(self, ctx:SqlBaseParser.AlterColumnActionContext): + pass + + # Exit a parse tree produced by SqlBaseParser#alterColumnAction. + def exitAlterColumnAction(self, ctx:SqlBaseParser.AlterColumnActionContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#ansiNonReserved. + def enterAnsiNonReserved(self, ctx:SqlBaseParser.AnsiNonReservedContext): + pass + + # Exit a parse tree produced by SqlBaseParser#ansiNonReserved. + def exitAnsiNonReserved(self, ctx:SqlBaseParser.AnsiNonReservedContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#strictNonReserved. + def enterStrictNonReserved(self, ctx:SqlBaseParser.StrictNonReservedContext): + pass + + # Exit a parse tree produced by SqlBaseParser#strictNonReserved. + def exitStrictNonReserved(self, ctx:SqlBaseParser.StrictNonReservedContext): + pass + + + # Enter a parse tree produced by SqlBaseParser#nonReserved. + def enterNonReserved(self, ctx:SqlBaseParser.NonReservedContext): + pass + + # Exit a parse tree produced by SqlBaseParser#nonReserved. + def exitNonReserved(self, ctx:SqlBaseParser.NonReservedContext): + pass + + diff --git a/pysparkling/sql/ast/generated/SqlBaseParser.py b/pysparkling/sql/ast/generated/SqlBaseParser.py new file mode 100644 index 000000000..a653a536f --- /dev/null +++ b/pysparkling/sql/ast/generated/SqlBaseParser.py @@ -0,0 +1,22167 @@ +# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u012b") + buf.write("\u0bcc\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\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") + buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") + buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") + buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") + buf.write("&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\4") + buf.write("/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t\64") + buf.write("\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t") + buf.write(";\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\t") + buf.write("D\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\t") + buf.write("M\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\t") + buf.write("V\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4") + buf.write("_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4") + buf.write("h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4") + buf.write("q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4") + buf.write("z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080") + buf.write("\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084") + buf.write("\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087") + buf.write("\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a\3\2\3") + buf.write("\2\7\2\u0117\n\2\f\2\16\2\u011a\13\2\3\2\3\2\3\3\3\3\3") + buf.write("\3\3\4\3\4\3\4\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\b") + buf.write("\3\b\3\b\3\t\3\t\5\t\u0132\n\t\3\t\3\t\3\t\5\t\u0137\n") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u013f\n\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\7\t\u0147\n\t\f\t\16\t\u014a\13\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\5\t\u015d\n\t\3\t\3\t\5\t\u0161\n\t\3\t\3\t\3\t\3") + buf.write("\t\5\t\u0167\n\t\3\t\5\t\u016a\n\t\3\t\5\t\u016d\n\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\5\t\u0175\n\t\3\t\5\t\u0178\n\t") + buf.write("\3\t\3\t\5\t\u017c\n\t\3\t\5\t\u017f\n\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\5\t\u0187\n\t\3\t\3\t\3\t\5\t\u018c\n\t\3\t") + buf.write("\5\t\u018f\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0196\n\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u01a2\n\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\7\t\u01ab\n\t\f\t\16\t\u01ae\13") + buf.write("\t\3\t\5\t\u01b1\n\t\3\t\5\t\u01b4\n\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\5\t\u01bb\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\7\t\u01c6\n\t\f\t\16\t\u01c9\13\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\5\t\u01d0\n\t\3\t\3\t\3\t\5\t\u01d5\n\t\3\t\5\t\u01d8") + buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u01de\n\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\5\t\u01e9\n\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\5\t\u0229\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t") + buf.write("\u0232\n\t\3\t\3\t\5\t\u0236\n\t\3\t\3\t\3\t\3\t\5\t\u023c") + buf.write("\n\t\3\t\3\t\5\t\u0240\n\t\3\t\3\t\3\t\5\t\u0245\n\t\3") + buf.write("\t\3\t\3\t\3\t\5\t\u024b\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\5\t\u0257\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5") + buf.write("\t\u025f\n\t\3\t\3\t\3\t\3\t\5\t\u0265\n\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0272\n\t\3\t\6\t") + buf.write("\u0275\n\t\r\t\16\t\u0276\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0287\n\t\3\t\3\t\3\t") + buf.write("\7\t\u028c\n\t\f\t\16\t\u028f\13\t\3\t\5\t\u0292\n\t\3") + buf.write("\t\3\t\3\t\3\t\5\t\u0298\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u02a7\n\t\3\t\3\t\5\t\u02ab") + buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u02b1\n\t\3\t\3\t\3\t\3\t\5\t") + buf.write("\u02b7\n\t\3\t\5\t\u02ba\n\t\3\t\5\t\u02bd\n\t\3\t\3\t") + buf.write("\3\t\3\t\5\t\u02c3\n\t\3\t\3\t\5\t\u02c7\n\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\7\t\u02cf\n\t\f\t\16\t\u02d2\13\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\5\t\u02da\n\t\3\t\5\t\u02dd\n\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u02e6\n\t\3\t\3\t\3\t\5\t") + buf.write("\u02eb\n\t\3\t\3\t\3\t\3\t\5\t\u02f1\n\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\5\t\u02f8\n\t\3\t\5\t\u02fb\n\t\3\t\3\t\3\t\3\t") + buf.write("\5\t\u0301\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u030a\n") + buf.write("\t\f\t\16\t\u030d\13\t\5\t\u030f\n\t\3\t\3\t\5\t\u0313") + buf.write("\n\t\3\t\3\t\3\t\5\t\u0318\n\t\3\t\3\t\3\t\5\t\u031d\n") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\5\t\u0324\n\t\3\t\5\t\u0327\n\t") + buf.write("\3\t\5\t\u032a\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0331\n\t\3") + buf.write("\t\3\t\3\t\5\t\u0336\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5") + buf.write("\t\u033f\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0347\n\t\3\t") + buf.write("\3\t\3\t\3\t\5\t\u034d\n\t\3\t\5\t\u0350\n\t\3\t\5\t\u0353") + buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u0359\n\t\3\t\3\t\5\t\u035d\n") + buf.write("\t\3\t\3\t\5\t\u0361\n\t\3\t\3\t\5\t\u0365\n\t\5\t\u0367") + buf.write("\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u036f\n\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\5\t\u0377\n\t\3\t\3\t\3\t\3\t\5\t\u037d\n") + buf.write("\t\3\t\3\t\3\t\3\t\5\t\u0383\n\t\3\t\5\t\u0386\n\t\3\t") + buf.write("\3\t\5\t\u038a\n\t\3\t\5\t\u038d\n\t\3\t\3\t\5\t\u0391") + buf.write("\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u03a8\n\t\f\t\16") + buf.write("\t\u03ab\13\t\5\t\u03ad\n\t\3\t\3\t\5\t\u03b1\n\t\3\t") + buf.write("\3\t\3\t\3\t\5\t\u03b7\n\t\3\t\5\t\u03ba\n\t\3\t\5\t\u03bd") + buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u03c3\n\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\5\t\u03cb\n\t\3\t\3\t\3\t\5\t\u03d0\n\t\3\t\3\t\3") + buf.write("\t\3\t\5\t\u03d6\n\t\3\t\3\t\3\t\3\t\5\t\u03dc\n\t\3\t") + buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u03e6\n\t\f\t\16\t\u03e9") + buf.write("\13\t\5\t\u03eb\n\t\3\t\3\t\3\t\7\t\u03f0\n\t\f\t\16\t") + buf.write("\u03f3\13\t\3\t\3\t\7\t\u03f7\n\t\f\t\16\t\u03fa\13\t") + buf.write("\3\t\3\t\3\t\7\t\u03ff\n\t\f\t\16\t\u0402\13\t\5\t\u0404") + buf.write("\n\t\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u040c\n\n\3\n\3\n\5\n") + buf.write("\u0410\n\n\3\n\3\n\3\n\3\n\3\n\5\n\u0417\n\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\5\n\u048b\n\n\3\n\3\n\3\n\3\n\3\n\3\n\5") + buf.write("\n\u0493\n\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u049b\n\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u04a4\n\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\n\3\n\5\n\u04ae\n\n\3\13\3\13\5\13\u04b2\n") + buf.write("\13\3\13\5\13\u04b5\n\13\3\13\3\13\3\13\3\13\5\13\u04bb") + buf.write("\n\13\3\13\3\13\3\f\3\f\5\f\u04c1\n\f\3\f\3\f\3\f\3\f") + buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u04cd\n\r\3\r\3\r\3\r\3\r") + buf.write("\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u04d9\n\16\3\16\3") + buf.write("\16\3\16\5\16\u04de\n\16\3\17\3\17\3\17\3\20\3\20\3\20") + buf.write("\3\21\5\21\u04e7\n\21\3\21\3\21\3\21\3\22\3\22\3\22\5") + buf.write("\22\u04ef\n\22\3\22\3\22\3\22\3\22\3\22\5\22\u04f6\n\22") + buf.write("\5\22\u04f8\n\22\3\22\3\22\3\22\5\22\u04fd\n\22\3\22\3") + buf.write("\22\5\22\u0501\n\22\3\22\3\22\3\22\5\22\u0506\n\22\3\22") + buf.write("\3\22\3\22\5\22\u050b\n\22\3\22\3\22\3\22\5\22\u0510\n") + buf.write("\22\3\22\5\22\u0513\n\22\3\22\3\22\3\22\5\22\u0518\n\22") + buf.write("\3\22\3\22\5\22\u051c\n\22\3\22\3\22\3\22\5\22\u0521\n") + buf.write("\22\5\22\u0523\n\22\3\23\3\23\5\23\u0527\n\23\3\24\3\24") + buf.write("\3\24\3\24\3\24\7\24\u052e\n\24\f\24\16\24\u0531\13\24") + buf.write("\3\24\3\24\3\25\3\25\3\25\5\25\u0538\n\25\3\26\3\26\3") + buf.write("\27\3\27\3\27\3\27\3\27\5\27\u0541\n\27\3\30\3\30\3\30") + buf.write("\7\30\u0546\n\30\f\30\16\30\u0549\13\30\3\31\3\31\3\31") + buf.write("\3\31\7\31\u054f\n\31\f\31\16\31\u0552\13\31\3\32\3\32") + buf.write("\5\32\u0556\n\32\3\32\5\32\u0559\n\32\3\32\3\32\3\32\3") + buf.write("\32\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\7\34\u056c\n\34\f\34\16\34\u056f\13\34") + buf.write("\3\35\3\35\3\35\3\35\7\35\u0575\n\35\f\35\16\35\u0578") + buf.write("\13\35\3\35\3\35\3\36\3\36\5\36\u057e\n\36\3\36\5\36\u0581") + buf.write("\n\36\3\37\3\37\3\37\7\37\u0586\n\37\f\37\16\37\u0589") + buf.write("\13\37\3\37\5\37\u058c\n\37\3 \3 \3 \3 \5 \u0592\n \3") + buf.write("!\3!\3!\3!\7!\u0598\n!\f!\16!\u059b\13!\3!\3!\3\"\3\"") + buf.write("\3\"\3\"\7\"\u05a3\n\"\f\"\16\"\u05a6\13\"\3\"\3\"\3#") + buf.write("\3#\3#\3#\3#\3#\5#\u05b0\n#\3$\3$\3$\3$\3$\5$\u05b7\n") + buf.write("$\3%\3%\3%\3%\5%\u05bd\n%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'") + buf.write("\3\'\6\'\u05c8\n\'\r\'\16\'\u05c9\3\'\3\'\3\'\3\'\3\'") + buf.write("\5\'\u05d1\n\'\3\'\3\'\3\'\3\'\3\'\5\'\u05d8\n\'\3\'\3") + buf.write("\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\5\'\u05e4\n\'\3\'\3") + buf.write("\'\3\'\3\'\7\'\u05ea\n\'\f\'\16\'\u05ed\13\'\3\'\7\'\u05f0") + buf.write("\n\'\f\'\16\'\u05f3\13\'\5\'\u05f5\n\'\3(\3(\3(\3(\3(") + buf.write("\7(\u05fc\n(\f(\16(\u05ff\13(\5(\u0601\n(\3(\3(\3(\3(") + buf.write("\3(\7(\u0608\n(\f(\16(\u060b\13(\5(\u060d\n(\3(\3(\3(") + buf.write("\3(\3(\7(\u0614\n(\f(\16(\u0617\13(\5(\u0619\n(\3(\3(") + buf.write("\3(\3(\3(\7(\u0620\n(\f(\16(\u0623\13(\5(\u0625\n(\3(") + buf.write("\5(\u0628\n(\3(\3(\3(\5(\u062d\n(\5(\u062f\n(\3)\3)\3") + buf.write(")\3*\3*\3*\3*\3*\3*\3*\5*\u063b\n*\3*\3*\3*\3*\3*\5*\u0642") + buf.write("\n*\3*\3*\3*\3*\3*\5*\u0649\n*\3*\7*\u064c\n*\f*\16*\u064f") + buf.write("\13*\3+\3+\3+\3+\3+\3+\3+\3+\3+\5+\u065a\n+\3,\3,\5,\u065e") + buf.write("\n,\3,\3,\5,\u0662\n,\3-\3-\6-\u0666\n-\r-\16-\u0667\3") + buf.write(".\3.\5.\u066c\n.\3.\3.\3.\3.\7.\u0672\n.\f.\16.\u0675") + buf.write("\13.\3.\5.\u0678\n.\3.\5.\u067b\n.\3.\5.\u067e\n.\3.\5") + buf.write(".\u0681\n.\3.\3.\5.\u0685\n.\3/\3/\5/\u0689\n/\3/\5/\u068c") + buf.write("\n/\3/\3/\5/\u0690\n/\3/\7/\u0693\n/\f/\16/\u0696\13/") + buf.write("\3/\5/\u0699\n/\3/\5/\u069c\n/\3/\5/\u069f\n/\3/\5/\u06a2") + buf.write("\n/\5/\u06a4\n/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\5\60\u06b0\n\60\3\60\5\60\u06b3\n\60\3\60\3") + buf.write("\60\5\60\u06b7\n\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") + buf.write("\3\60\5\60\u06c1\n\60\3\60\3\60\5\60\u06c5\n\60\5\60\u06c7") + buf.write("\n\60\3\60\5\60\u06ca\n\60\3\60\3\60\5\60\u06ce\n\60\3") + buf.write("\61\3\61\7\61\u06d2\n\61\f\61\16\61\u06d5\13\61\3\61\5") + buf.write("\61\u06d8\n\61\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63") + buf.write("\3\63\5\63\u06e3\n\63\3\63\3\63\3\63\3\64\3\64\3\64\3") + buf.write("\64\3\64\5\64\u06ed\n\64\3\64\3\64\3\64\3\65\3\65\3\65") + buf.write("\3\65\3\65\3\65\3\65\5\65\u06f9\n\65\3\66\3\66\3\66\3") + buf.write("\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\7\66\u0706\n\66") + buf.write("\f\66\16\66\u0709\13\66\3\66\3\66\5\66\u070d\n\66\3\67") + buf.write("\3\67\3\67\7\67\u0712\n\67\f\67\16\67\u0715\13\67\38\3") + buf.write("8\38\38\39\39\39\3:\3:\3:\3;\3;\3;\5;\u0724\n;\3;\7;\u0727") + buf.write("\n;\f;\16;\u072a\13;\3;\3;\3<\3<\3<\3<\3<\3<\7<\u0734") + buf.write("\n<\f<\16<\u0737\13<\3<\3<\5<\u073b\n<\3=\3=\3=\3=\7=") + buf.write("\u0741\n=\f=\16=\u0744\13=\3=\7=\u0747\n=\f=\16=\u074a") + buf.write("\13=\3=\5=\u074d\n=\3>\3>\3>\3>\3>\7>\u0754\n>\f>\16>") + buf.write("\u0757\13>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\7>\u0763\n>\f") + buf.write(">\16>\u0766\13>\3>\3>\5>\u076a\n>\3>\3>\3>\3>\3>\3>\3") + buf.write(">\3>\7>\u0774\n>\f>\16>\u0777\13>\3>\3>\5>\u077b\n>\3") + buf.write("?\3?\3?\3?\7?\u0781\n?\f?\16?\u0784\13?\5?\u0786\n?\3") + buf.write("?\3?\5?\u078a\n?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\7@\u0796") + buf.write("\n@\f@\16@\u0799\13@\3@\3@\3@\3A\3A\3A\3A\3A\7A\u07a3") + buf.write("\nA\fA\16A\u07a6\13A\3A\3A\5A\u07aa\nA\3B\3B\5B\u07ae") + buf.write("\nB\3B\5B\u07b1\nB\3C\3C\3C\5C\u07b6\nC\3C\3C\3C\3C\3") + buf.write("C\7C\u07bd\nC\fC\16C\u07c0\13C\5C\u07c2\nC\3C\3C\3C\5") + buf.write("C\u07c7\nC\3C\3C\3C\7C\u07cc\nC\fC\16C\u07cf\13C\5C\u07d1") + buf.write("\nC\3D\3D\3E\3E\7E\u07d7\nE\fE\16E\u07da\13E\3F\3F\3F") + buf.write("\3F\5F\u07e0\nF\3F\3F\3F\3F\3F\5F\u07e7\nF\3G\5G\u07ea") + buf.write("\nG\3G\3G\3G\5G\u07ef\nG\3G\5G\u07f2\nG\3G\3G\3G\5G\u07f7") + buf.write("\nG\3G\3G\5G\u07fb\nG\3G\5G\u07fe\nG\3G\5G\u0801\nG\3") + buf.write("H\3H\3H\3H\5H\u0807\nH\3I\3I\3I\5I\u080c\nI\3I\3I\3J\5") + buf.write("J\u0811\nJ\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") + buf.write("J\3J\5J\u0823\nJ\5J\u0825\nJ\3J\5J\u0828\nJ\3K\3K\3K\3") + buf.write("K\3L\3L\3L\7L\u0831\nL\fL\16L\u0834\13L\3M\3M\3M\3M\7") + buf.write("M\u083a\nM\fM\16M\u083d\13M\3M\3M\3N\3N\5N\u0843\nN\3") + buf.write("O\3O\3O\3O\7O\u0849\nO\fO\16O\u084c\13O\3O\3O\3P\3P\5") + buf.write("P\u0852\nP\3Q\3Q\5Q\u0856\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u085e") + buf.write("\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u0866\nQ\3Q\3Q\3Q\3Q\5Q\u086c") + buf.write("\nQ\3R\3R\3R\3R\7R\u0872\nR\fR\16R\u0875\13R\3R\3R\3S") + buf.write("\3S\3S\3S\3S\7S\u087e\nS\fS\16S\u0881\13S\5S\u0883\nS") + buf.write("\3S\3S\3S\3T\5T\u0889\nT\3T\3T\5T\u088d\nT\5T\u088f\n") + buf.write("T\3U\3U\3U\3U\3U\3U\3U\5U\u0898\nU\3U\3U\3U\3U\3U\3U\3") + buf.write("U\3U\3U\3U\5U\u08a4\nU\5U\u08a6\nU\3U\3U\3U\3U\3U\5U\u08ad") + buf.write("\nU\3U\3U\3U\3U\3U\5U\u08b4\nU\3U\3U\3U\3U\5U\u08ba\n") + buf.write("U\3U\3U\3U\3U\5U\u08c0\nU\5U\u08c2\nU\3V\3V\3V\7V\u08c7") + buf.write("\nV\fV\16V\u08ca\13V\3W\3W\3W\7W\u08cf\nW\fW\16W\u08d2") + buf.write("\13W\3X\3X\3X\5X\u08d7\nX\3X\3X\3Y\3Y\3Y\5Y\u08de\nY\3") + buf.write("Y\3Y\3Z\3Z\5Z\u08e4\nZ\3Z\3Z\5Z\u08e8\nZ\5Z\u08ea\nZ\3") + buf.write("[\3[\3[\7[\u08ef\n[\f[\16[\u08f2\13[\3\\\3\\\3\\\3\\\7") + buf.write("\\\u08f8\n\\\f\\\16\\\u08fb\13\\\3\\\3\\\3]\3]\3]\3]\3") + buf.write("]\3]\7]\u0905\n]\f]\16]\u0908\13]\3]\3]\5]\u090c\n]\3") + buf.write("^\3^\5^\u0910\n^\3_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5") + buf.write("`\u091e\n`\5`\u0920\n`\3`\3`\3`\3`\3`\3`\7`\u0928\n`\f") + buf.write("`\16`\u092b\13`\3a\5a\u092e\na\3a\3a\3a\3a\3a\3a\5a\u0936") + buf.write("\na\3a\3a\3a\3a\3a\7a\u093d\na\fa\16a\u0940\13a\3a\3a") + buf.write("\3a\5a\u0945\na\3a\3a\3a\3a\3a\3a\5a\u094d\na\3a\3a\3") + buf.write("a\5a\u0952\na\3a\3a\3a\3a\3a\3a\3a\3a\7a\u095c\na\fa\16") + buf.write("a\u095f\13a\3a\3a\5a\u0963\na\3a\5a\u0966\na\3a\3a\3a") + buf.write("\3a\5a\u096c\na\3a\3a\5a\u0970\na\3a\3a\3a\5a\u0975\n") + buf.write("a\3a\3a\3a\5a\u097a\na\3a\3a\3a\5a\u097f\na\3b\3b\3b\3") + buf.write("b\5b\u0985\nb\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3") + buf.write("b\3b\3b\3b\3b\3b\7b\u099a\nb\fb\16b\u099d\13b\3c\3c\3") + buf.write("c\3c\6c\u09a3\nc\rc\16c\u09a4\3c\3c\5c\u09a9\nc\3c\3c") + buf.write("\3c\3c\3c\6c\u09b0\nc\rc\16c\u09b1\3c\3c\5c\u09b6\nc\3") + buf.write("c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\7c\u09c6\nc\f") + buf.write("c\16c\u09c9\13c\5c\u09cb\nc\3c\3c\3c\3c\3c\3c\5c\u09d3") + buf.write("\nc\3c\3c\3c\3c\3c\3c\3c\5c\u09dc\nc\3c\3c\3c\3c\3c\3") + buf.write("c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\6c\u09f1\nc\r") + buf.write("c\16c\u09f2\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u09fe\nc\3c") + buf.write("\3c\3c\7c\u0a03\nc\fc\16c\u0a06\13c\5c\u0a08\nc\3c\3c") + buf.write("\3c\3c\3c\3c\3c\5c\u0a11\nc\3c\3c\5c\u0a15\nc\3c\3c\3") + buf.write("c\3c\3c\3c\3c\3c\6c\u0a1f\nc\rc\16c\u0a20\3c\3c\3c\3c") + buf.write("\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3") + buf.write("c\3c\5c\u0a3a\nc\3c\3c\3c\3c\3c\5c\u0a41\nc\3c\5c\u0a44") + buf.write("\nc\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u0a53\n") + buf.write("c\3c\3c\5c\u0a57\nc\3c\3c\3c\3c\3c\3c\3c\3c\7c\u0a61\n") + buf.write("c\fc\16c\u0a64\13c\3d\3d\3d\3d\3d\3d\3d\3d\6d\u0a6e\n") + buf.write("d\rd\16d\u0a6f\5d\u0a72\nd\3e\3e\3f\3f\3g\3g\3h\3h\3i") + buf.write("\3i\3i\5i\u0a7f\ni\3j\3j\5j\u0a83\nj\3k\3k\3k\6k\u0a88") + buf.write("\nk\rk\16k\u0a89\3l\3l\3l\5l\u0a8f\nl\3m\3m\3m\3m\3m\3") + buf.write("n\5n\u0a97\nn\3n\3n\5n\u0a9b\nn\3o\3o\3o\3o\3o\3o\3o\5") + buf.write("o\u0aa4\no\3p\3p\3p\5p\u0aa9\np\3q\3q\3q\3q\3q\3q\3q\3") + buf.write("q\3q\3q\3q\3q\3q\3q\3q\5q\u0aba\nq\3q\3q\5q\u0abe\nq\3") + buf.write("q\3q\3q\3q\3q\7q\u0ac5\nq\fq\16q\u0ac8\13q\3q\5q\u0acb") + buf.write("\nq\5q\u0acd\nq\3r\3r\3r\7r\u0ad2\nr\fr\16r\u0ad5\13r") + buf.write("\3s\3s\3s\3s\5s\u0adb\ns\3s\5s\u0ade\ns\3s\5s\u0ae1\n") + buf.write("s\3t\3t\3t\7t\u0ae6\nt\ft\16t\u0ae9\13t\3u\3u\3u\3u\5") + buf.write("u\u0aef\nu\3u\5u\u0af2\nu\3v\3v\3v\7v\u0af7\nv\fv\16v") + buf.write("\u0afa\13v\3w\3w\3w\3w\3w\5w\u0b01\nw\3w\5w\u0b04\nw\3") + buf.write("x\3x\3x\3x\3x\3y\3y\3y\3y\7y\u0b0f\ny\fy\16y\u0b12\13") + buf.write("y\3z\3z\3z\3z\3{\3{\3{\3{\3{\3{\3{\3{\3{\3{\3{\7{\u0b23") + buf.write("\n{\f{\16{\u0b26\13{\3{\3{\3{\3{\3{\7{\u0b2d\n{\f{\16") + buf.write("{\u0b30\13{\5{\u0b32\n{\3{\3{\3{\3{\3{\7{\u0b39\n{\f{") + buf.write("\16{\u0b3c\13{\5{\u0b3e\n{\5{\u0b40\n{\3{\5{\u0b43\n{") + buf.write("\3{\5{\u0b46\n{\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3") + buf.write("|\3|\3|\3|\5|\u0b58\n|\3}\3}\3}\3}\3}\3}\3}\5}\u0b61\n") + buf.write("}\3~\3~\3~\7~\u0b66\n~\f~\16~\u0b69\13~\3\177\3\177\3") + buf.write("\177\3\177\5\177\u0b6f\n\177\3\u0080\3\u0080\3\u0080\7") + buf.write("\u0080\u0b74\n\u0080\f\u0080\16\u0080\u0b77\13\u0080\3") + buf.write("\u0081\3\u0081\3\u0081\3\u0082\3\u0082\6\u0082\u0b7e\n") + buf.write("\u0082\r\u0082\16\u0082\u0b7f\3\u0082\5\u0082\u0b83\n") + buf.write("\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u0b88\n\u0083\3") + buf.write("\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\5\u0084") + buf.write("\u0b90\n\u0084\3\u0085\3\u0085\3\u0086\3\u0086\5\u0086") + buf.write("\u0b96\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u0b9b\n") + buf.write("\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u0ba0\n\u0086\3") + buf.write("\u0086\3\u0086\5\u0086\u0ba4\n\u0086\3\u0086\3\u0086\5") + buf.write("\u0086\u0ba8\n\u0086\3\u0086\3\u0086\5\u0086\u0bac\n\u0086") + buf.write("\3\u0086\3\u0086\5\u0086\u0bb0\n\u0086\3\u0086\3\u0086") + buf.write("\5\u0086\u0bb4\n\u0086\3\u0086\3\u0086\5\u0086\u0bb8\n") + buf.write("\u0086\3\u0086\5\u0086\u0bbb\n\u0086\3\u0087\3\u0087\3") + buf.write("\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087\u0bc4\n") + buf.write("\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a\3\u008a") + buf.write("\3\u008a\7\u03a9\u03e7\u03f1\u03f8\u0400\6R\u00be\u00c2") + buf.write("\u00c4\u008b\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") + buf.write("$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz") + buf.write("|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090") + buf.write("\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2") + buf.write("\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4") + buf.write("\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6") + buf.write("\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8") + buf.write("\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea") + buf.write("\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc") + buf.write("\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e") + buf.write("\u0110\u0112\2,\4\2CC\u00b6\u00b6\4\2\"\"\u00c4\u00c4") + buf.write("\4\2AA\u0098\u0098\4\2ffss\3\2-.\4\2\u00e5\u00e5\u0103") + buf.write("\u0103\4\2\21\21%%\7\2**\66\66XXee\u008f\u008f\3\2GH\4") + buf.write("\2XXee\4\2\u009c\u009c\u011d\u011d\4\2\16\16\u0089\u0089") + buf.write("\5\2@@\u0097\u0097\u00ce\u00ce\6\2SSzz\u00d7\u00d7\u00f9") + buf.write("\u00f9\5\2SS\u00d7\u00d7\u00f9\u00f9\4\2\31\31GG\4\2`") + buf.write("`\u0081\u0081\4\2\20\20LL\4\2\u0121\u0121\u0123\u0123") + buf.write("\5\2\20\20\25\25\u00db\u00db\5\2[[\u00f3\u00f3\u00fb\u00fb") + buf.write("\4\2\u0112\u0113\u0118\u0118\3\2\u0114\u0117\4\2\u0112") + buf.write("\u0113\u011b\u011b\4\2;;==\3\2\u00e3\u00e4\4\2\6\6ff\4") + buf.write("\2\6\6bb\5\2\35\35\u0084\u0084\u00ee\u00ee\3\2\u010a\u0111") + buf.write("\3\2\u0112\u011c\6\2\23\23ss\u009b\u009b\u00a3\u00a3\4") + buf.write("\2[[\u00f3\u00f3\3\2\u0112\u0113\4\2MM\u00ac\u00ac\4\2") + buf.write("\u00a4\u00a4\u00dc\u00dc\4\2aa\u00b3\u00b3\3\2\u0122\u0123") + buf.write("\4\2NN\u00d6\u00d6\65\2\16\17\21\22\26\27\31\32\34\34") + buf.write("\36\"%%\'*,,.\64\66\669:?ACKMNRRTZ]]_adehjmmprtuwy{{~") + buf.write("~\u0080\u0083\u0086\u0093\u0096\u0098\u009a\u009a\u009d") + buf.write("\u009e\u00a1\u00a2\u00a5\u00a5\u00a7\u00a8\u00aa\u00b3") + buf.write("\u00b5\u00bd\u00bf\u00c5\u00c7\u00ce\u00d2\u00d4\u00d6") + buf.write("\u00d6\u00d8\u00da\u00dc\u00e4\u00e6\u00ea\u00ed\u00ed") + buf.write("\u00ef\u00f4\u00f6\u00f8\u00fc\u00ff\u0102\u0104\u0107") + buf.write("\u0107\u0117\u0117\21\2\24\2488SSggvvzz\177\177\u0085") + buf.write("\u0085\u0099\u0099\u009f\u009f\u00c6\u00c6\u00d1\u00d1") + buf.write("\u00d7\u00d7\u00f9\u00f9\u0101\u0101\23\2\16\23\25\67") + buf.write("9RTfhuwy{~\u0080\u0084\u0086\u0098\u009a\u009e\u00a0\u00c5") + buf.write("\u00c7\u00d0\u00d2\u00d6\u00d8\u00f8\u00fa\u0100\u0102") + buf.write("\u0109\u0117\u0117\2\u0da4\2\u0114\3\2\2\2\4\u011d\3\2") + buf.write("\2\2\6\u0120\3\2\2\2\b\u0123\3\2\2\2\n\u0126\3\2\2\2\f") + buf.write("\u0129\3\2\2\2\16\u012c\3\2\2\2\20\u0403\3\2\2\2\22\u04ad") + buf.write("\3\2\2\2\24\u04af\3\2\2\2\26\u04c0\3\2\2\2\30\u04c6\3") + buf.write("\2\2\2\32\u04d2\3\2\2\2\34\u04df\3\2\2\2\36\u04e2\3\2") + buf.write("\2\2 \u04e6\3\2\2\2\"\u0522\3\2\2\2$\u0524\3\2\2\2&\u0528") + buf.write("\3\2\2\2(\u0534\3\2\2\2*\u0539\3\2\2\2,\u0540\3\2\2\2") + buf.write(".\u0542\3\2\2\2\60\u054a\3\2\2\2\62\u0553\3\2\2\2\64\u055e") + buf.write("\3\2\2\2\66\u056d\3\2\2\28\u0570\3\2\2\2:\u057b\3\2\2") + buf.write("\2<\u058b\3\2\2\2>\u0591\3\2\2\2@\u0593\3\2\2\2B\u059e") + buf.write("\3\2\2\2D\u05af\3\2\2\2F\u05b6\3\2\2\2H\u05b8\3\2\2\2") + buf.write("J\u05be\3\2\2\2L\u05f4\3\2\2\2N\u0600\3\2\2\2P\u0630\3") + buf.write("\2\2\2R\u0633\3\2\2\2T\u0659\3\2\2\2V\u065b\3\2\2\2X\u0663") + buf.write("\3\2\2\2Z\u0684\3\2\2\2\\\u06a3\3\2\2\2^\u06af\3\2\2\2") + buf.write("`\u06cf\3\2\2\2b\u06db\3\2\2\2d\u06de\3\2\2\2f\u06e7\3") + buf.write("\2\2\2h\u06f8\3\2\2\2j\u070c\3\2\2\2l\u070e\3\2\2\2n\u0716") + buf.write("\3\2\2\2p\u071a\3\2\2\2r\u071d\3\2\2\2t\u0720\3\2\2\2") + buf.write("v\u073a\3\2\2\2x\u073c\3\2\2\2z\u077a\3\2\2\2|\u0789\3") + buf.write("\2\2\2~\u078b\3\2\2\2\u0080\u07a9\3\2\2\2\u0082\u07ab") + buf.write("\3\2\2\2\u0084\u07b2\3\2\2\2\u0086\u07d2\3\2\2\2\u0088") + buf.write("\u07d4\3\2\2\2\u008a\u07e6\3\2\2\2\u008c\u0800\3\2\2\2") + buf.write("\u008e\u0806\3\2\2\2\u0090\u0808\3\2\2\2\u0092\u0827\3") + buf.write("\2\2\2\u0094\u0829\3\2\2\2\u0096\u082d\3\2\2\2\u0098\u0835") + buf.write("\3\2\2\2\u009a\u0840\3\2\2\2\u009c\u0844\3\2\2\2\u009e") + buf.write("\u084f\3\2\2\2\u00a0\u086b\3\2\2\2\u00a2\u086d\3\2\2\2") + buf.write("\u00a4\u0878\3\2\2\2\u00a6\u088e\3\2\2\2\u00a8\u08c1\3") + buf.write("\2\2\2\u00aa\u08c3\3\2\2\2\u00ac\u08cb\3\2\2\2\u00ae\u08d6") + buf.write("\3\2\2\2\u00b0\u08dd\3\2\2\2\u00b2\u08e1\3\2\2\2\u00b4") + buf.write("\u08eb\3\2\2\2\u00b6\u08f3\3\2\2\2\u00b8\u090b\3\2\2\2") + buf.write("\u00ba\u090f\3\2\2\2\u00bc\u0911\3\2\2\2\u00be\u091f\3") + buf.write("\2\2\2\u00c0\u097e\3\2\2\2\u00c2\u0984\3\2\2\2\u00c4\u0a56") + buf.write("\3\2\2\2\u00c6\u0a71\3\2\2\2\u00c8\u0a73\3\2\2\2\u00ca") + buf.write("\u0a75\3\2\2\2\u00cc\u0a77\3\2\2\2\u00ce\u0a79\3\2\2\2") + buf.write("\u00d0\u0a7b\3\2\2\2\u00d2\u0a80\3\2\2\2\u00d4\u0a87\3") + buf.write("\2\2\2\u00d6\u0a8b\3\2\2\2\u00d8\u0a90\3\2\2\2\u00da\u0a9a") + buf.write("\3\2\2\2\u00dc\u0aa3\3\2\2\2\u00de\u0aa8\3\2\2\2\u00e0") + buf.write("\u0acc\3\2\2\2\u00e2\u0ace\3\2\2\2\u00e4\u0ad6\3\2\2\2") + buf.write("\u00e6\u0ae2\3\2\2\2\u00e8\u0aea\3\2\2\2\u00ea\u0af3\3") + buf.write("\2\2\2\u00ec\u0afb\3\2\2\2\u00ee\u0b05\3\2\2\2\u00f0\u0b0a") + buf.write("\3\2\2\2\u00f2\u0b13\3\2\2\2\u00f4\u0b45\3\2\2\2\u00f6") + buf.write("\u0b57\3\2\2\2\u00f8\u0b60\3\2\2\2\u00fa\u0b62\3\2\2\2") + buf.write("\u00fc\u0b6e\3\2\2\2\u00fe\u0b70\3\2\2\2\u0100\u0b78\3") + buf.write("\2\2\2\u0102\u0b82\3\2\2\2\u0104\u0b87\3\2\2\2\u0106\u0b8f") + buf.write("\3\2\2\2\u0108\u0b91\3\2\2\2\u010a\u0bba\3\2\2\2\u010c") + buf.write("\u0bc3\3\2\2\2\u010e\u0bc5\3\2\2\2\u0110\u0bc7\3\2\2\2") + buf.write("\u0112\u0bc9\3\2\2\2\u0114\u0118\5\20\t\2\u0115\u0117") + buf.write("\7\3\2\2\u0116\u0115\3\2\2\2\u0117\u011a\3\2\2\2\u0118") + buf.write("\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b\3\2\2\2") + buf.write("\u011a\u0118\3\2\2\2\u011b\u011c\7\2\2\3\u011c\3\3\2\2") + buf.write("\2\u011d\u011e\5\u00b2Z\2\u011e\u011f\7\2\2\3\u011f\5") + buf.write("\3\2\2\2\u0120\u0121\5\u00aeX\2\u0121\u0122\7\2\2\3\u0122") + buf.write("\7\3\2\2\2\u0123\u0124\5\u00acW\2\u0124\u0125\7\2\2\3") + buf.write("\u0125\t\3\2\2\2\u0126\u0127\5\u00b0Y\2\u0127\u0128\7") + buf.write("\2\2\3\u0128\13\3\2\2\2\u0129\u012a\5\u00e0q\2\u012a\u012b") + buf.write("\7\2\2\3\u012b\r\3\2\2\2\u012c\u012d\5\u00e6t\2\u012d") + buf.write("\u012e\7\2\2\3\u012e\17\3\2\2\2\u012f\u0404\5 \21\2\u0130") + buf.write("\u0132\5\60\31\2\u0131\u0130\3\2\2\2\u0131\u0132\3\2\2") + buf.write("\2\u0132\u0133\3\2\2\2\u0133\u0404\5L\'\2\u0134\u0136") + buf.write("\7\u00ff\2\2\u0135\u0137\7\u0097\2\2\u0136\u0135\3\2\2") + buf.write("\2\u0136\u0137\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u0404") + buf.write("\5\u00acW\2\u0139\u013a\7\67\2\2\u013a\u013e\5*\26\2\u013b") + buf.write("\u013c\7p\2\2\u013c\u013d\7\u009b\2\2\u013d\u013f\7U\2") + buf.write("\2\u013e\u013b\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140") + buf.write("\3\2\2\2\u0140\u0148\5\u00acW\2\u0141\u0147\5\36\20\2") + buf.write("\u0142\u0147\5\34\17\2\u0143\u0144\7\u0108\2\2\u0144\u0145") + buf.write("\t\2\2\2\u0145\u0147\58\35\2\u0146\u0141\3\2\2\2\u0146") + buf.write("\u0142\3\2\2\2\u0146\u0143\3\2\2\2\u0147\u014a\3\2\2\2") + buf.write("\u0148\u0146\3\2\2\2\u0148\u0149\3\2\2\2\u0149\u0404\3") + buf.write("\2\2\2\u014a\u0148\3\2\2\2\u014b\u014c\7\21\2\2\u014c") + buf.write("\u014d\5*\26\2\u014d\u014e\5\u00acW\2\u014e\u014f\7\u00d6") + buf.write("\2\2\u014f\u0150\t\2\2\2\u0150\u0151\58\35\2\u0151\u0404") + buf.write("\3\2\2\2\u0152\u0153\7\21\2\2\u0153\u0154\5*\26\2\u0154") + buf.write("\u0155\5\u00acW\2\u0155\u0156\7\u00d6\2\2\u0156\u0157") + buf.write("\5\34\17\2\u0157\u0404\3\2\2\2\u0158\u0159\7N\2\2\u0159") + buf.write("\u015c\5*\26\2\u015a\u015b\7p\2\2\u015b\u015d\7U\2\2\u015c") + buf.write("\u015a\3\2\2\2\u015c\u015d\3\2\2\2\u015d\u015e\3\2\2\2") + buf.write("\u015e\u0160\5\u00acW\2\u015f\u0161\t\3\2\2\u0160\u015f") + buf.write("\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0404\3\2\2\2\u0162") + buf.write("\u0163\7\u00d9\2\2\u0163\u0166\t\4\2\2\u0164\u0165\t\5") + buf.write("\2\2\u0165\u0167\5\u00acW\2\u0166\u0164\3\2\2\2\u0166") + buf.write("\u0167\3\2\2\2\u0167\u016c\3\2\2\2\u0168\u016a\7\u0086") + buf.write("\2\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016b") + buf.write("\3\2\2\2\u016b\u016d\7\u011d\2\2\u016c\u0169\3\2\2\2\u016c") + buf.write("\u016d\3\2\2\2\u016d\u0404\3\2\2\2\u016e\u016f\6\t\2\2") + buf.write("\u016f\u0174\5\24\13\2\u0170\u0171\7\4\2\2\u0171\u0172") + buf.write("\5\u00e6t\2\u0172\u0173\7\5\2\2\u0173\u0175\3\2\2\2\u0174") + buf.write("\u0170\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0177\3\2\2\2") + buf.write("\u0176\u0178\5\64\33\2\u0177\u0176\3\2\2\2\u0177\u0178") + buf.write("\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017e\5\66\34\2\u017a") + buf.write("\u017c\7\30\2\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2") + buf.write("\2\u017c\u017d\3\2\2\2\u017d\u017f\5 \21\2\u017e\u017b") + buf.write("\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0404\3\2\2\2\u0180") + buf.write("\u0181\6\t\3\2\u0181\u0186\5\24\13\2\u0182\u0183\7\4\2") + buf.write("\2\u0183\u0184\5\u00e6t\2\u0184\u0185\7\5\2\2\u0185\u0187") + buf.write("\3\2\2\2\u0186\u0182\3\2\2\2\u0186\u0187\3\2\2\2\u0187") + buf.write("\u0188\3\2\2\2\u0188\u0189\5\64\33\2\u0189\u018e\5\66") + buf.write("\34\2\u018a\u018c\7\30\2\2\u018b\u018a\3\2\2\2\u018b\u018c") + buf.write("\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f\5 \21\2\u018e") + buf.write("\u018b\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0404\3\2\2\2") + buf.write("\u0190\u0195\5\24\13\2\u0191\u0192\7\4\2\2\u0192\u0193") + buf.write("\5\u00e6t\2\u0193\u0194\7\5\2\2\u0194\u0196\3\2\2\2\u0195") + buf.write("\u0191\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u01ac\3\2\2\2") + buf.write("\u0197\u01ab\5\36\20\2\u0198\u0199\7\u00ad\2\2\u0199\u019a") + buf.write("\7 \2\2\u019a\u019b\7\4\2\2\u019b\u019c\5\u00e6t\2\u019c") + buf.write("\u019d\7\5\2\2\u019d\u01a2\3\2\2\2\u019e\u019f\7\u00ad") + buf.write("\2\2\u019f\u01a0\7 \2\2\u01a0\u01a2\5\u0094K\2\u01a1\u0198") + buf.write("\3\2\2\2\u01a1\u019e\3\2\2\2\u01a2\u01ab\3\2\2\2\u01a3") + buf.write("\u01ab\5\30\r\2\u01a4\u01ab\5\32\16\2\u01a5\u01ab\5\u00a8") + buf.write("U\2\u01a6\u01ab\5D#\2\u01a7\u01ab\5\34\17\2\u01a8\u01a9") + buf.write("\7\u00e8\2\2\u01a9\u01ab\58\35\2\u01aa\u0197\3\2\2\2\u01aa") + buf.write("\u01a1\3\2\2\2\u01aa\u01a3\3\2\2\2\u01aa\u01a4\3\2\2\2") + buf.write("\u01aa\u01a5\3\2\2\2\u01aa\u01a6\3\2\2\2\u01aa\u01a7\3") + buf.write("\2\2\2\u01aa\u01a8\3\2\2\2\u01ab\u01ae\3\2\2\2\u01ac\u01aa") + buf.write("\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01b3\3\2\2\2\u01ae") + buf.write("\u01ac\3\2\2\2\u01af\u01b1\7\30\2\2\u01b0\u01af\3\2\2") + buf.write("\2\u01b0\u01b1\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01b4") + buf.write("\5 \21\2\u01b3\u01b0\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4") + buf.write("\u0404\3\2\2\2\u01b5\u01b6\7\67\2\2\u01b6\u01ba\7\u00e5") + buf.write("\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7\u009b\2\2\u01b9") + buf.write("\u01bb\7U\2\2\u01ba\u01b7\3\2\2\2\u01ba\u01bb\3\2\2\2") + buf.write("\u01bb\u01bc\3\2\2\2\u01bc\u01bd\5\u00aeX\2\u01bd\u01be") + buf.write("\7\u0086\2\2\u01be\u01c7\5\u00aeX\2\u01bf\u01c6\5\64\33") + buf.write("\2\u01c0\u01c6\5\u00a8U\2\u01c1\u01c6\5D#\2\u01c2\u01c6") + buf.write("\5\34\17\2\u01c3\u01c4\7\u00e8\2\2\u01c4\u01c6\58\35\2") + buf.write("\u01c5\u01bf\3\2\2\2\u01c5\u01c0\3\2\2\2\u01c5\u01c1\3") + buf.write("\2\2\2\u01c5\u01c2\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c6\u01c9") + buf.write("\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8") + buf.write("\u0404\3\2\2\2\u01c9\u01c7\3\2\2\2\u01ca\u01cf\5\26\f") + buf.write("\2\u01cb\u01cc\7\4\2\2\u01cc\u01cd\5\u00e6t\2\u01cd\u01ce") + buf.write("\7\5\2\2\u01ce\u01d0\3\2\2\2\u01cf\u01cb\3\2\2\2\u01cf") + buf.write("\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\5\64\33") + buf.write("\2\u01d2\u01d7\5\66\34\2\u01d3\u01d5\7\30\2\2\u01d4\u01d3") + buf.write("\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6") + buf.write("\u01d8\5 \21\2\u01d7\u01d4\3\2\2\2\u01d7\u01d8\3\2\2\2") + buf.write("\u01d8\u0404\3\2\2\2\u01d9\u01da\7\22\2\2\u01da\u01db") + buf.write("\7\u00e5\2\2\u01db\u01dd\5\u00acW\2\u01dc\u01de\5&\24") + buf.write("\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df") + buf.write("\3\2\2\2\u01df\u01e0\7\63\2\2\u01e0\u01e8\7\u00df\2\2") + buf.write("\u01e1\u01e9\5\u0104\u0083\2\u01e2\u01e3\7b\2\2\u01e3") + buf.write("\u01e4\7.\2\2\u01e4\u01e9\5\u0096L\2\u01e5\u01e6\7b\2") + buf.write("\2\u01e6\u01e7\7\20\2\2\u01e7\u01e9\7.\2\2\u01e8\u01e1") + buf.write("\3\2\2\2\u01e8\u01e2\3\2\2\2\u01e8\u01e5\3\2\2\2\u01e8") + buf.write("\u01e9\3\2\2\2\u01e9\u0404\3\2\2\2\u01ea\u01eb\7\21\2") + buf.write("\2\u01eb\u01ec\7\u00e5\2\2\u01ec\u01ed\5\u00acW\2\u01ed") + buf.write("\u01ee\7\16\2\2\u01ee\u01ef\t\6\2\2\u01ef\u01f0\5\u00e2") + buf.write("r\2\u01f0\u0404\3\2\2\2\u01f1\u01f2\7\21\2\2\u01f2\u01f3") + buf.write("\7\u00e5\2\2\u01f3\u01f4\5\u00acW\2\u01f4\u01f5\7\16\2") + buf.write("\2\u01f5\u01f6\t\6\2\2\u01f6\u01f7\7\4\2\2\u01f7\u01f8") + buf.write("\5\u00e2r\2\u01f8\u01f9\7\5\2\2\u01f9\u0404\3\2\2\2\u01fa") + buf.write("\u01fb\7\21\2\2\u01fb\u01fc\7\u00e5\2\2\u01fc\u01fd\5") + buf.write("\u00acW\2\u01fd\u01fe\7\u00c0\2\2\u01fe\u01ff\7-\2\2\u01ff") + buf.write("\u0200\5\u00acW\2\u0200\u0201\7\u00ec\2\2\u0201\u0202") + buf.write("\5\u0100\u0081\2\u0202\u0404\3\2\2\2\u0203\u0204\7\21") + buf.write("\2\2\u0204\u0205\7\u00e5\2\2\u0205\u0206\5\u00acW\2\u0206") + buf.write("\u0207\7N\2\2\u0207\u0208\t\6\2\2\u0208\u0209\7\4\2\2") + buf.write("\u0209\u020a\5\u00aaV\2\u020a\u020b\7\5\2\2\u020b\u0404") + buf.write("\3\2\2\2\u020c\u020d\7\21\2\2\u020d\u020e\7\u00e5\2\2") + buf.write("\u020e\u020f\5\u00acW\2\u020f\u0210\7N\2\2\u0210\u0211") + buf.write("\t\6\2\2\u0211\u0212\5\u00aaV\2\u0212\u0404\3\2\2\2\u0213") + buf.write("\u0214\7\21\2\2\u0214\u0215\t\7\2\2\u0215\u0216\5\u00ac") + buf.write("W\2\u0216\u0217\7\u00c0\2\2\u0217\u0218\7\u00ec\2\2\u0218") + buf.write("\u0219\5\u00acW\2\u0219\u0404\3\2\2\2\u021a\u021b\7\21") + buf.write("\2\2\u021b\u021c\t\7\2\2\u021c\u021d\5\u00acW\2\u021d") + buf.write("\u021e\7\u00d6\2\2\u021e\u021f\7\u00e8\2\2\u021f\u0220") + buf.write("\58\35\2\u0220\u0404\3\2\2\2\u0221\u0222\7\21\2\2\u0222") + buf.write("\u0223\t\7\2\2\u0223\u0224\5\u00acW\2\u0224\u0225\7\u00fd") + buf.write("\2\2\u0225\u0228\7\u00e8\2\2\u0226\u0227\7p\2\2\u0227") + buf.write("\u0229\7U\2\2\u0228\u0226\3\2\2\2\u0228\u0229\3\2\2\2") + buf.write("\u0229\u022a\3\2\2\2\u022a\u022b\58\35\2\u022b\u0404\3") + buf.write("\2\2\2\u022c\u022d\7\21\2\2\u022d\u022e\7\u00e5\2\2\u022e") + buf.write("\u022f\5\u00acW\2\u022f\u0231\t\b\2\2\u0230\u0232\7-\2") + buf.write("\2\u0231\u0230\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0233") + buf.write("\3\2\2\2\u0233\u0235\5\u00acW\2\u0234\u0236\5\u010c\u0087") + buf.write("\2\u0235\u0234\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0404") + buf.write("\3\2\2\2\u0237\u0238\7\21\2\2\u0238\u0239\7\u00e5\2\2") + buf.write("\u0239\u023b\5\u00acW\2\u023a\u023c\5&\24\2\u023b\u023a") + buf.write("\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023d\3\2\2\2\u023d") + buf.write("\u023f\7%\2\2\u023e\u0240\7-\2\2\u023f\u023e\3\2\2\2\u023f") + buf.write("\u0240\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u0242\5\u00ac") + buf.write("W\2\u0242\u0244\5\u00e8u\2\u0243\u0245\5\u00dep\2\u0244") + buf.write("\u0243\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0404\3\2\2\2") + buf.write("\u0246\u0247\7\21\2\2\u0247\u0248\7\u00e5\2\2\u0248\u024a") + buf.write("\5\u00acW\2\u0249\u024b\5&\24\2\u024a\u0249\3\2\2\2\u024a") + buf.write("\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7\u00c2") + buf.write("\2\2\u024d\u024e\7.\2\2\u024e\u024f\7\4\2\2\u024f\u0250") + buf.write("\5\u00e2r\2\u0250\u0251\7\5\2\2\u0251\u0404\3\2\2\2\u0252") + buf.write("\u0253\7\21\2\2\u0253\u0254\7\u00e5\2\2\u0254\u0256\5") + buf.write("\u00acW\2\u0255\u0257\5&\24\2\u0256\u0255\3\2\2\2\u0256") + buf.write("\u0257\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259\7\u00d6") + buf.write("\2\2\u0259\u025a\7\u00d3\2\2\u025a\u025e\7\u011d\2\2\u025b") + buf.write("\u025c\7\u0108\2\2\u025c\u025d\7\u00d4\2\2\u025d\u025f") + buf.write("\58\35\2\u025e\u025b\3\2\2\2\u025e\u025f\3\2\2\2\u025f") + buf.write("\u0404\3\2\2\2\u0260\u0261\7\21\2\2\u0261\u0262\7\u00e5") + buf.write("\2\2\u0262\u0264\5\u00acW\2\u0263\u0265\5&\24\2\u0264") + buf.write("\u0263\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\3\2\2\2") + buf.write("\u0266\u0267\7\u00d6\2\2\u0267\u0268\7\u00d4\2\2\u0268") + buf.write("\u0269\58\35\2\u0269\u0404\3\2\2\2\u026a\u026b\7\21\2") + buf.write("\2\u026b\u026c\t\7\2\2\u026c\u026d\5\u00acW\2\u026d\u0271") + buf.write("\7\16\2\2\u026e\u026f\7p\2\2\u026f\u0270\7\u009b\2\2\u0270") + buf.write("\u0272\7U\2\2\u0271\u026e\3\2\2\2\u0271\u0272\3\2\2\2") + buf.write("\u0272\u0274\3\2\2\2\u0273\u0275\5$\23\2\u0274\u0273\3") + buf.write("\2\2\2\u0275\u0276\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277") + buf.write("\3\2\2\2\u0277\u0404\3\2\2\2\u0278\u0279\7\21\2\2\u0279") + buf.write("\u027a\7\u00e5\2\2\u027a\u027b\5\u00acW\2\u027b\u027c") + buf.write("\5&\24\2\u027c\u027d\7\u00c0\2\2\u027d\u027e\7\u00ec\2") + buf.write("\2\u027e\u027f\5&\24\2\u027f\u0404\3\2\2\2\u0280\u0281") + buf.write("\7\21\2\2\u0281\u0282\t\7\2\2\u0282\u0283\5\u00acW\2\u0283") + buf.write("\u0286\7N\2\2\u0284\u0285\7p\2\2\u0285\u0287\7U\2\2\u0286") + buf.write("\u0284\3\2\2\2\u0286\u0287\3\2\2\2\u0287\u0288\3\2\2\2") + buf.write("\u0288\u028d\5&\24\2\u0289\u028a\7\6\2\2\u028a\u028c\5") + buf.write("&\24\2\u028b\u0289\3\2\2\2\u028c\u028f\3\2\2\2\u028d\u028b") + buf.write("\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u0291\3\2\2\2\u028f") + buf.write("\u028d\3\2\2\2\u0290\u0292\7\u00b7\2\2\u0291\u0290\3\2") + buf.write("\2\2\u0291\u0292\3\2\2\2\u0292\u0404\3\2\2\2\u0293\u0294") + buf.write("\7\21\2\2\u0294\u0295\7\u00e5\2\2\u0295\u0297\5\u00ac") + buf.write("W\2\u0296\u0298\5&\24\2\u0297\u0296\3\2\2\2\u0297\u0298") + buf.write("\3\2\2\2\u0298\u0299\3\2\2\2\u0299\u029a\7\u00d6\2\2\u029a") + buf.write("\u029b\5\34\17\2\u029b\u0404\3\2\2\2\u029c\u029d\7\21") + buf.write("\2\2\u029d\u029e\7\u00e5\2\2\u029e\u029f\5\u00acW\2\u029f") + buf.write("\u02a0\7\u00bc\2\2\u02a0\u02a1\7\u00ae\2\2\u02a1\u0404") + buf.write("\3\2\2\2\u02a2\u02a3\7N\2\2\u02a3\u02a6\7\u00e5\2\2\u02a4") + buf.write("\u02a5\7p\2\2\u02a5\u02a7\7U\2\2\u02a6\u02a4\3\2\2\2\u02a6") + buf.write("\u02a7\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02aa\5\u00ac") + buf.write("W\2\u02a9\u02ab\7\u00b7\2\2\u02aa\u02a9\3\2\2\2\u02aa") + buf.write("\u02ab\3\2\2\2\u02ab\u0404\3\2\2\2\u02ac\u02ad\7N\2\2") + buf.write("\u02ad\u02b0\7\u0103\2\2\u02ae\u02af\7p\2\2\u02af\u02b1") + buf.write("\7U\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1") + buf.write("\u02b2\3\2\2\2\u02b2\u0404\5\u00acW\2\u02b3\u02b6\7\67") + buf.write("\2\2\u02b4\u02b5\7\u00a3\2\2\u02b5\u02b7\7\u00c2\2\2\u02b6") + buf.write("\u02b4\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02bc\3\2\2\2") + buf.write("\u02b8\u02ba\7j\2\2\u02b9\u02b8\3\2\2\2\u02b9\u02ba\3") + buf.write("\2\2\2\u02ba\u02bb\3\2\2\2\u02bb\u02bd\7\u00e9\2\2\u02bc") + buf.write("\u02b9\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\3\2\2\2") + buf.write("\u02be\u02c2\7\u0103\2\2\u02bf\u02c0\7p\2\2\u02c0\u02c1") + buf.write("\7\u009b\2\2\u02c1\u02c3\7U\2\2\u02c2\u02bf\3\2\2\2\u02c2") + buf.write("\u02c3\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c6\5\u00ac") + buf.write("W\2\u02c5\u02c7\5\u009cO\2\u02c6\u02c5\3\2\2\2\u02c6\u02c7") + buf.write("\3\2\2\2\u02c7\u02d0\3\2\2\2\u02c8\u02cf\5\36\20\2\u02c9") + buf.write("\u02ca\7\u00ad\2\2\u02ca\u02cb\7\u009f\2\2\u02cb\u02cf") + buf.write("\5\u0094K\2\u02cc\u02cd\7\u00e8\2\2\u02cd\u02cf\58\35") + buf.write("\2\u02ce\u02c8\3\2\2\2\u02ce\u02c9\3\2\2\2\u02ce\u02cc") + buf.write("\3\2\2\2\u02cf\u02d2\3\2\2\2\u02d0\u02ce\3\2\2\2\u02d0") + buf.write("\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02d0\3\2\2\2") + buf.write("\u02d3\u02d4\7\30\2\2\u02d4\u02d5\5 \21\2\u02d5\u0404") + buf.write("\3\2\2\2\u02d6\u02d9\7\67\2\2\u02d7\u02d8\7\u00a3\2\2") + buf.write("\u02d8\u02da\7\u00c2\2\2\u02d9\u02d7\3\2\2\2\u02d9\u02da") + buf.write("\3\2\2\2\u02da\u02dc\3\2\2\2\u02db\u02dd\7j\2\2\u02dc") + buf.write("\u02db\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02de\3\2\2\2") + buf.write("\u02de\u02df\7\u00e9\2\2\u02df\u02e0\7\u0103\2\2\u02e0") + buf.write("\u02e5\5\u00aeX\2\u02e1\u02e2\7\4\2\2\u02e2\u02e3\5\u00e6") + buf.write("t\2\u02e3\u02e4\7\5\2\2\u02e4\u02e6\3\2\2\2\u02e5\u02e1") + buf.write("\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7") + buf.write("\u02ea\5\64\33\2\u02e8\u02e9\7\u00a2\2\2\u02e9\u02eb\5") + buf.write("8\35\2\u02ea\u02e8\3\2\2\2\u02ea\u02eb\3\2\2\2\u02eb\u0404") + buf.write("\3\2\2\2\u02ec\u02ed\7\21\2\2\u02ed\u02ee\7\u0103\2\2") + buf.write("\u02ee\u02f0\5\u00acW\2\u02ef\u02f1\7\30\2\2\u02f0\u02ef") + buf.write("\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2") + buf.write("\u02f3\5 \21\2\u02f3\u0404\3\2\2\2\u02f4\u02f7\7\67\2") + buf.write("\2\u02f5\u02f6\7\u00a3\2\2\u02f6\u02f8\7\u00c2\2\2\u02f7") + buf.write("\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u02fa\3\2\2\2") + buf.write("\u02f9\u02fb\7\u00e9\2\2\u02fa\u02f9\3\2\2\2\u02fa\u02fb") + buf.write("\3\2\2\2\u02fb\u02fc\3\2\2\2\u02fc\u0300\7h\2\2\u02fd") + buf.write("\u02fe\7p\2\2\u02fe\u02ff\7\u009b\2\2\u02ff\u0301\7U\2") + buf.write("\2\u0300\u02fd\3\2\2\2\u0300\u0301\3\2\2\2\u0301\u0302") + buf.write("\3\2\2\2\u0302\u0303\5\u00acW\2\u0303\u0304\7\30\2\2\u0304") + buf.write("\u030e\7\u011d\2\2\u0305\u0306\7\u0101\2\2\u0306\u030b") + buf.write("\5J&\2\u0307\u0308\7\6\2\2\u0308\u030a\5J&\2\u0309\u0307") + buf.write("\3\2\2\2\u030a\u030d\3\2\2\2\u030b\u0309\3\2\2\2\u030b") + buf.write("\u030c\3\2\2\2\u030c\u030f\3\2\2\2\u030d\u030b\3\2\2\2") + buf.write("\u030e\u0305\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0404\3") + buf.write("\2\2\2\u0310\u0312\7N\2\2\u0311\u0313\7\u00e9\2\2\u0312") + buf.write("\u0311\3\2\2\2\u0312\u0313\3\2\2\2\u0313\u0314\3\2\2\2") + buf.write("\u0314\u0317\7h\2\2\u0315\u0316\7p\2\2\u0316\u0318\7U") + buf.write("\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0319") + buf.write("\3\2\2\2\u0319\u0404\5\u00acW\2\u031a\u031c\7V\2\2\u031b") + buf.write("\u031d\t\t\2\2\u031c\u031b\3\2\2\2\u031c\u031d\3\2\2\2") + buf.write("\u031d\u031e\3\2\2\2\u031e\u0404\5\20\t\2\u031f\u0320") + buf.write("\7\u00d9\2\2\u0320\u0323\7\u00e6\2\2\u0321\u0322\t\5\2") + buf.write("\2\u0322\u0324\5\u00acW\2\u0323\u0321\3\2\2\2\u0323\u0324") + buf.write("\3\2\2\2\u0324\u0329\3\2\2\2\u0325\u0327\7\u0086\2\2\u0326") + buf.write("\u0325\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2") + buf.write("\u0328\u032a\7\u011d\2\2\u0329\u0326\3\2\2\2\u0329\u032a") + buf.write("\3\2\2\2\u032a\u0404\3\2\2\2\u032b\u032c\7\u00d9\2\2\u032c") + buf.write("\u032d\7\u00e5\2\2\u032d\u0330\7X\2\2\u032e\u032f\t\5") + buf.write("\2\2\u032f\u0331\5\u00acW\2\u0330\u032e\3\2\2\2\u0330") + buf.write("\u0331\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0333\7\u0086") + buf.write("\2\2\u0333\u0335\7\u011d\2\2\u0334\u0336\5&\24\2\u0335") + buf.write("\u0334\3\2\2\2\u0335\u0336\3\2\2\2\u0336\u0404\3\2\2\2") + buf.write("\u0337\u0338\7\u00d9\2\2\u0338\u0339\7\u00e8\2\2\u0339") + buf.write("\u033e\5\u00acW\2\u033a\u033b\7\4\2\2\u033b\u033c\5<\37") + buf.write("\2\u033c\u033d\7\5\2\2\u033d\u033f\3\2\2\2\u033e\u033a") + buf.write("\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u0404\3\2\2\2\u0340") + buf.write("\u0341\7\u00d9\2\2\u0341\u0342\7.\2\2\u0342\u0343\t\5") + buf.write("\2\2\u0343\u0346\5\u00acW\2\u0344\u0345\t\5\2\2\u0345") + buf.write("\u0347\5\u00acW\2\u0346\u0344\3\2\2\2\u0346\u0347\3\2") + buf.write("\2\2\u0347\u0404\3\2\2\2\u0348\u0349\7\u00d9\2\2\u0349") + buf.write("\u034c\7\u0104\2\2\u034a\u034b\t\5\2\2\u034b\u034d\5\u00ac") + buf.write("W\2\u034c\u034a\3\2\2\2\u034c\u034d\3\2\2\2\u034d\u0352") + buf.write("\3\2\2\2\u034e\u0350\7\u0086\2\2\u034f\u034e\3\2\2\2\u034f") + buf.write("\u0350\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u0353\7\u011d") + buf.write("\2\2\u0352\u034f\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0404") + buf.write("\3\2\2\2\u0354\u0355\7\u00d9\2\2\u0355\u0356\7\u00ae\2") + buf.write("\2\u0356\u0358\5\u00acW\2\u0357\u0359\5&\24\2\u0358\u0357") + buf.write("\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0404\3\2\2\2\u035a") + buf.write("\u035c\7\u00d9\2\2\u035b\u035d\5\u0104\u0083\2\u035c\u035b") + buf.write("\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e") + buf.write("\u0366\7i\2\2\u035f\u0361\7\u0086\2\2\u0360\u035f\3\2") + buf.write("\2\2\u0360\u0361\3\2\2\2\u0361\u0364\3\2\2\2\u0362\u0365") + buf.write("\5\u00acW\2\u0363\u0365\7\u011d\2\2\u0364\u0362\3\2\2") + buf.write("\2\u0364\u0363\3\2\2\2\u0365\u0367\3\2\2\2\u0366\u0360") + buf.write("\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0404\3\2\2\2\u0368") + buf.write("\u0369\7\u00d9\2\2\u0369\u036a\7\67\2\2\u036a\u036b\7") + buf.write("\u00e5\2\2\u036b\u036e\5\u00acW\2\u036c\u036d\7\30\2\2") + buf.write("\u036d\u036f\7\u00d3\2\2\u036e\u036c\3\2\2\2\u036e\u036f") + buf.write("\3\2\2\2\u036f\u0404\3\2\2\2\u0370\u0371\7\u00d9\2\2\u0371") + buf.write("\u0372\7:\2\2\u0372\u0404\7\u0097\2\2\u0373\u0374\t\n") + buf.write("\2\2\u0374\u0376\7h\2\2\u0375\u0377\7X\2\2\u0376\u0375") + buf.write("\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\3\2\2\2\u0378") + buf.write("\u0404\5,\27\2\u0379\u037a\t\n\2\2\u037a\u037c\5*\26\2") + buf.write("\u037b\u037d\7X\2\2\u037c\u037b\3\2\2\2\u037c\u037d\3") + buf.write("\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\5\u00acW\2\u037f") + buf.write("\u0404\3\2\2\2\u0380\u0382\t\n\2\2\u0381\u0383\7\u00e5") + buf.write("\2\2\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0385") + buf.write("\3\2\2\2\u0384\u0386\t\13\2\2\u0385\u0384\3\2\2\2\u0385") + buf.write("\u0386\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u0389\5\u00ac") + buf.write("W\2\u0388\u038a\5&\24\2\u0389\u0388\3\2\2\2\u0389\u038a") + buf.write("\3\2\2\2\u038a\u038c\3\2\2\2\u038b\u038d\5.\30\2\u038c") + buf.write("\u038b\3\2\2\2\u038c\u038d\3\2\2\2\u038d\u0404\3\2\2\2") + buf.write("\u038e\u0390\t\n\2\2\u038f\u0391\7\u00b8\2\2\u0390\u038f") + buf.write("\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\3\2\2\2\u0392") + buf.write("\u0404\5 \21\2\u0393\u0394\7/\2\2\u0394\u0395\7\u009f") + buf.write("\2\2\u0395\u0396\5*\26\2\u0396\u0397\5\u00acW\2\u0397") + buf.write("\u0398\7}\2\2\u0398\u0399\t\f\2\2\u0399\u0404\3\2\2\2") + buf.write("\u039a\u039b\7/\2\2\u039b\u039c\7\u009f\2\2\u039c\u039d") + buf.write("\7\u00e5\2\2\u039d\u039e\5\u00acW\2\u039e\u039f\7}\2\2") + buf.write("\u039f\u03a0\t\f\2\2\u03a0\u0404\3\2\2\2\u03a1\u03a2\7") + buf.write("\u00bf\2\2\u03a2\u03a3\7\u00e5\2\2\u03a3\u0404\5\u00ac") + buf.write("W\2\u03a4\u03ac\7\u00bf\2\2\u03a5\u03ad\7\u011d\2\2\u03a6") + buf.write("\u03a8\13\2\2\2\u03a7\u03a6\3\2\2\2\u03a8\u03ab\3\2\2") + buf.write("\2\u03a9\u03aa\3\2\2\2\u03a9\u03a7\3\2\2\2\u03aa\u03ad") + buf.write("\3\2\2\2\u03ab\u03a9\3\2\2\2\u03ac\u03a5\3\2\2\2\u03ac") + buf.write("\u03a9\3\2\2\2\u03ad\u0404\3\2\2\2\u03ae\u03b0\7!\2\2") + buf.write("\u03af\u03b1\7\u0083\2\2\u03b0\u03af\3\2\2\2\u03b0\u03b1") + buf.write("\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b3\7\u00e5\2\2\u03b3") + buf.write("\u03b6\5\u00acW\2\u03b4\u03b5\7\u00a2\2\2\u03b5\u03b7") + buf.write("\58\35\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7") + buf.write("\u03bc\3\2\2\2\u03b8\u03ba\7\30\2\2\u03b9\u03b8\3\2\2") + buf.write("\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u03bd") + buf.write("\5 \21\2\u03bc\u03b9\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd") + buf.write("\u0404\3\2\2\2\u03be\u03bf\7\u00f8\2\2\u03bf\u03c2\7\u00e5") + buf.write("\2\2\u03c0\u03c1\7p\2\2\u03c1\u03c3\7U\2\2\u03c2\u03c0") + buf.write("\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4") + buf.write("\u0404\5\u00acW\2\u03c5\u03c6\7\'\2\2\u03c6\u0404\7!\2") + buf.write("\2\u03c7\u03c8\7\u008a\2\2\u03c8\u03ca\7?\2\2\u03c9\u03cb") + buf.write("\7\u008b\2\2\u03ca\u03c9\3\2\2\2\u03ca\u03cb\3\2\2\2\u03cb") + buf.write("\u03cc\3\2\2\2\u03cc\u03cd\7w\2\2\u03cd\u03cf\7\u011d") + buf.write("\2\2\u03ce\u03d0\7\u00ab\2\2\u03cf\u03ce\3\2\2\2\u03cf") + buf.write("\u03d0\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\7|\2\2") + buf.write("\u03d2\u03d3\7\u00e5\2\2\u03d3\u03d5\5\u00acW\2\u03d4") + buf.write("\u03d6\5&\24\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2") + buf.write("\u03d6\u0404\3\2\2\2\u03d7\u03d8\7\u00f4\2\2\u03d8\u03d9") + buf.write("\7\u00e5\2\2\u03d9\u03db\5\u00acW\2\u03da\u03dc\5&\24") + buf.write("\2\u03db\u03da\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u0404") + buf.write("\3\2\2\2\u03dd\u03de\7\u0096\2\2\u03de\u03df\7\u00c1\2") + buf.write("\2\u03df\u03e0\7\u00e5\2\2\u03e0\u0404\5\u00acW\2\u03e1") + buf.write("\u03e2\t\r\2\2\u03e2\u03ea\5\u0104\u0083\2\u03e3\u03eb") + buf.write("\7\u011d\2\2\u03e4\u03e6\13\2\2\2\u03e5\u03e4\3\2\2\2") + buf.write("\u03e6\u03e9\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e7\u03e5\3") + buf.write("\2\2\2\u03e8\u03eb\3\2\2\2\u03e9\u03e7\3\2\2\2\u03ea\u03e3") + buf.write("\3\2\2\2\u03ea\u03e7\3\2\2\2\u03eb\u0404\3\2\2\2\u03ec") + buf.write("\u03ed\7\u00d6\2\2\u03ed\u03f1\7\u00c8\2\2\u03ee\u03f0") + buf.write("\13\2\2\2\u03ef\u03ee\3\2\2\2\u03f0\u03f3\3\2\2\2\u03f1") + buf.write("\u03f2\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f2\u0404\3\2\2\2") + buf.write("\u03f3\u03f1\3\2\2\2\u03f4\u03f8\7\u00d6\2\2\u03f5\u03f7") + buf.write("\13\2\2\2\u03f6\u03f5\3\2\2\2\u03f7\u03fa\3\2\2\2\u03f8") + buf.write("\u03f9\3\2\2\2\u03f8\u03f6\3\2\2\2\u03f9\u0404\3\2\2\2") + buf.write("\u03fa\u03f8\3\2\2\2\u03fb\u0404\7\u00c3\2\2\u03fc\u0400") + buf.write("\5\22\n\2\u03fd\u03ff\13\2\2\2\u03fe\u03fd\3\2\2\2\u03ff") + buf.write("\u0402\3\2\2\2\u0400\u0401\3\2\2\2\u0400\u03fe\3\2\2\2") + buf.write("\u0401\u0404\3\2\2\2\u0402\u0400\3\2\2\2\u0403\u012f\3") + buf.write("\2\2\2\u0403\u0131\3\2\2\2\u0403\u0134\3\2\2\2\u0403\u0139") + buf.write("\3\2\2\2\u0403\u014b\3\2\2\2\u0403\u0152\3\2\2\2\u0403") + buf.write("\u0158\3\2\2\2\u0403\u0162\3\2\2\2\u0403\u016e\3\2\2\2") + buf.write("\u0403\u0180\3\2\2\2\u0403\u0190\3\2\2\2\u0403\u01b5\3") + buf.write("\2\2\2\u0403\u01ca\3\2\2\2\u0403\u01d9\3\2\2\2\u0403\u01ea") + buf.write("\3\2\2\2\u0403\u01f1\3\2\2\2\u0403\u01fa\3\2\2\2\u0403") + buf.write("\u0203\3\2\2\2\u0403\u020c\3\2\2\2\u0403\u0213\3\2\2\2") + buf.write("\u0403\u021a\3\2\2\2\u0403\u0221\3\2\2\2\u0403\u022c\3") + buf.write("\2\2\2\u0403\u0237\3\2\2\2\u0403\u0246\3\2\2\2\u0403\u0252") + buf.write("\3\2\2\2\u0403\u0260\3\2\2\2\u0403\u026a\3\2\2\2\u0403") + buf.write("\u0278\3\2\2\2\u0403\u0280\3\2\2\2\u0403\u0293\3\2\2\2") + buf.write("\u0403\u029c\3\2\2\2\u0403\u02a2\3\2\2\2\u0403\u02ac\3") + buf.write("\2\2\2\u0403\u02b3\3\2\2\2\u0403\u02d6\3\2\2\2\u0403\u02ec") + buf.write("\3\2\2\2\u0403\u02f4\3\2\2\2\u0403\u0310\3\2\2\2\u0403") + buf.write("\u031a\3\2\2\2\u0403\u031f\3\2\2\2\u0403\u032b\3\2\2\2") + buf.write("\u0403\u0337\3\2\2\2\u0403\u0340\3\2\2\2\u0403\u0348\3") + buf.write("\2\2\2\u0403\u0354\3\2\2\2\u0403\u035a\3\2\2\2\u0403\u0368") + buf.write("\3\2\2\2\u0403\u0370\3\2\2\2\u0403\u0373\3\2\2\2\u0403") + buf.write("\u0379\3\2\2\2\u0403\u0380\3\2\2\2\u0403\u038e\3\2\2\2") + buf.write("\u0403\u0393\3\2\2\2\u0403\u039a\3\2\2\2\u0403\u03a1\3") + buf.write("\2\2\2\u0403\u03a4\3\2\2\2\u0403\u03ae\3\2\2\2\u0403\u03be") + buf.write("\3\2\2\2\u0403\u03c5\3\2\2\2\u0403\u03c7\3\2\2\2\u0403") + buf.write("\u03d7\3\2\2\2\u0403\u03dd\3\2\2\2\u0403\u03e1\3\2\2\2") + buf.write("\u0403\u03ec\3\2\2\2\u0403\u03f4\3\2\2\2\u0403\u03fb\3") + buf.write("\2\2\2\u0403\u03fc\3\2\2\2\u0404\21\3\2\2\2\u0405\u0406") + buf.write("\7\67\2\2\u0406\u04ae\7\u00c8\2\2\u0407\u0408\7N\2\2\u0408") + buf.write("\u04ae\7\u00c8\2\2\u0409\u040b\7k\2\2\u040a\u040c\7\u00c8") + buf.write("\2\2\u040b\u040a\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u04ae") + buf.write("\3\2\2\2\u040d\u040f\7\u00c5\2\2\u040e\u0410\7\u00c8\2") + buf.write("\2\u040f\u040e\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u04ae") + buf.write("\3\2\2\2\u0411\u0412\7\u00d9\2\2\u0412\u04ae\7k\2\2\u0413") + buf.write("\u0414\7\u00d9\2\2\u0414\u0416\7\u00c8\2\2\u0415\u0417") + buf.write("\7k\2\2\u0416\u0415\3\2\2\2\u0416\u0417\3\2\2\2\u0417") + buf.write("\u04ae\3\2\2\2\u0418\u0419\7\u00d9\2\2\u0419\u04ae\7\u00b5") + buf.write("\2\2\u041a\u041b\7\u00d9\2\2\u041b\u04ae\7\u00c9\2\2\u041c") + buf.write("\u041d\7\u00d9\2\2\u041d\u041e\7:\2\2\u041e\u04ae\7\u00c9") + buf.write("\2\2\u041f\u0420\7W\2\2\u0420\u04ae\7\u00e5\2\2\u0421") + buf.write("\u0422\7r\2\2\u0422\u04ae\7\u00e5\2\2\u0423\u0424\7\u00d9") + buf.write("\2\2\u0424\u04ae\7\62\2\2\u0425\u0426\7\u00d9\2\2\u0426") + buf.write("\u0427\7\67\2\2\u0427\u04ae\7\u00e5\2\2\u0428\u0429\7") + buf.write("\u00d9\2\2\u0429\u04ae\7\u00f0\2\2\u042a\u042b\7\u00d9") + buf.write("\2\2\u042b\u04ae\7u\2\2\u042c\u042d\7\u00d9\2\2\u042d") + buf.write("\u04ae\7\u008e\2\2\u042e\u042f\7\67\2\2\u042f\u04ae\7") + buf.write("t\2\2\u0430\u0431\7N\2\2\u0431\u04ae\7t\2\2\u0432\u0433") + buf.write("\7\21\2\2\u0433\u04ae\7t\2\2\u0434\u0435\7\u008d\2\2\u0435") + buf.write("\u04ae\7\u00e5\2\2\u0436\u0437\7\u008d\2\2\u0437\u04ae") + buf.write("\7@\2\2\u0438\u0439\7\u00fc\2\2\u0439\u04ae\7\u00e5\2") + buf.write("\2\u043a\u043b\7\u00fc\2\2\u043b\u04ae\7@\2\2\u043c\u043d") + buf.write("\7\67\2\2\u043d\u043e\7\u00e9\2\2\u043e\u04ae\7\u0090") + buf.write("\2\2\u043f\u0440\7N\2\2\u0440\u0441\7\u00e9\2\2\u0441") + buf.write("\u04ae\7\u0090\2\2\u0442\u0443\7\21\2\2\u0443\u0444\7") + buf.write("\u00e5\2\2\u0444\u0445\5\u00aeX\2\u0445\u0446\7\u009b") + buf.write("\2\2\u0446\u0447\7)\2\2\u0447\u04ae\3\2\2\2\u0448\u0449") + buf.write("\7\21\2\2\u0449\u044a\7\u00e5\2\2\u044a\u044b\5\u00ae") + buf.write("X\2\u044b\u044c\7)\2\2\u044c\u044d\7 \2\2\u044d\u04ae") + buf.write("\3\2\2\2\u044e\u044f\7\21\2\2\u044f\u0450\7\u00e5\2\2") + buf.write("\u0450\u0451\5\u00aeX\2\u0451\u0452\7\u009b\2\2\u0452") + buf.write("\u0453\7\u00dd\2\2\u0453\u04ae\3\2\2\2\u0454\u0455\7\21") + buf.write("\2\2\u0455\u0456\7\u00e5\2\2\u0456\u0457\5\u00aeX\2\u0457") + buf.write("\u0458\7\u00da\2\2\u0458\u0459\7 \2\2\u0459\u04ae\3\2") + buf.write("\2\2\u045a\u045b\7\21\2\2\u045b\u045c\7\u00e5\2\2\u045c") + buf.write("\u045d\5\u00aeX\2\u045d\u045e\7\u009b\2\2\u045e\u045f") + buf.write("\7\u00da\2\2\u045f\u04ae\3\2\2\2\u0460\u0461\7\21\2\2") + buf.write("\u0461\u0462\7\u00e5\2\2\u0462\u0463\5\u00aeX\2\u0463") + buf.write("\u0464\7\u009b\2\2\u0464\u0465\7\u00e0\2\2\u0465\u0466") + buf.write("\7\30\2\2\u0466\u0467\7J\2\2\u0467\u04ae\3\2\2\2\u0468") + buf.write("\u0469\7\21\2\2\u0469\u046a\7\u00e5\2\2\u046a\u046b\5") + buf.write("\u00aeX\2\u046b\u046c\7\u00d6\2\2\u046c\u046d\7\u00da") + buf.write("\2\2\u046d\u046e\7\u008c\2\2\u046e\u04ae\3\2\2\2\u046f") + buf.write("\u0470\7\21\2\2\u0470\u0471\7\u00e5\2\2\u0471\u0472\5") + buf.write("\u00aeX\2\u0472\u0473\7T\2\2\u0473\u0474\7\u00ac\2\2\u0474") + buf.write("\u04ae\3\2\2\2\u0475\u0476\7\21\2\2\u0476\u0477\7\u00e5") + buf.write("\2\2\u0477\u0478\5\u00aeX\2\u0478\u0479\7\26\2\2\u0479") + buf.write("\u047a\7\u00ac\2\2\u047a\u04ae\3\2\2\2\u047b\u047c\7\21") + buf.write("\2\2\u047c\u047d\7\u00e5\2\2\u047d\u047e\5\u00aeX\2\u047e") + buf.write("\u047f\7\u00f6\2\2\u047f\u0480\7\u00ac\2\2\u0480\u04ae") + buf.write("\3\2\2\2\u0481\u0482\7\21\2\2\u0482\u0483\7\u00e5\2\2") + buf.write("\u0483\u0484\5\u00aeX\2\u0484\u0485\7\u00ed\2\2\u0485") + buf.write("\u04ae\3\2\2\2\u0486\u0487\7\21\2\2\u0487\u0488\7\u00e5") + buf.write("\2\2\u0488\u048a\5\u00aeX\2\u0489\u048b\5&\24\2\u048a") + buf.write("\u0489\3\2\2\2\u048a\u048b\3\2\2\2\u048b\u048c\3\2\2\2") + buf.write("\u048c\u048d\7\61\2\2\u048d\u04ae\3\2\2\2\u048e\u048f") + buf.write("\7\21\2\2\u048f\u0490\7\u00e5\2\2\u0490\u0492\5\u00ae") + buf.write("X\2\u0491\u0493\5&\24\2\u0492\u0491\3\2\2\2\u0492\u0493") + buf.write("\3\2\2\2\u0493\u0494\3\2\2\2\u0494\u0495\7\64\2\2\u0495") + buf.write("\u04ae\3\2\2\2\u0496\u0497\7\21\2\2\u0497\u0498\7\u00e5") + buf.write("\2\2\u0498\u049a\5\u00aeX\2\u0499\u049b\5&\24\2\u049a") + buf.write("\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2") + buf.write("\u049c\u049d\7\u00d6\2\2\u049d\u049e\7_\2\2\u049e\u04ae") + buf.write("\3\2\2\2\u049f\u04a0\7\21\2\2\u04a0\u04a1\7\u00e5\2\2") + buf.write("\u04a1\u04a3\5\u00aeX\2\u04a2\u04a4\5&\24\2\u04a3\u04a2") + buf.write("\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5") + buf.write("\u04a6\7\u00c2\2\2\u04a6\u04a7\7.\2\2\u04a7\u04ae\3\2") + buf.write("\2\2\u04a8\u04a9\7\u00de\2\2\u04a9\u04ae\7\u00ef\2\2\u04aa") + buf.write("\u04ae\7\60\2\2\u04ab\u04ae\7\u00ca\2\2\u04ac\u04ae\7") + buf.write("I\2\2\u04ad\u0405\3\2\2\2\u04ad\u0407\3\2\2\2\u04ad\u0409") + buf.write("\3\2\2\2\u04ad\u040d\3\2\2\2\u04ad\u0411\3\2\2\2\u04ad") + buf.write("\u0413\3\2\2\2\u04ad\u0418\3\2\2\2\u04ad\u041a\3\2\2\2") + buf.write("\u04ad\u041c\3\2\2\2\u04ad\u041f\3\2\2\2\u04ad\u0421\3") + buf.write("\2\2\2\u04ad\u0423\3\2\2\2\u04ad\u0425\3\2\2\2\u04ad\u0428") + buf.write("\3\2\2\2\u04ad\u042a\3\2\2\2\u04ad\u042c\3\2\2\2\u04ad") + buf.write("\u042e\3\2\2\2\u04ad\u0430\3\2\2\2\u04ad\u0432\3\2\2\2") + buf.write("\u04ad\u0434\3\2\2\2\u04ad\u0436\3\2\2\2\u04ad\u0438\3") + buf.write("\2\2\2\u04ad\u043a\3\2\2\2\u04ad\u043c\3\2\2\2\u04ad\u043f") + buf.write("\3\2\2\2\u04ad\u0442\3\2\2\2\u04ad\u0448\3\2\2\2\u04ad") + buf.write("\u044e\3\2\2\2\u04ad\u0454\3\2\2\2\u04ad\u045a\3\2\2\2") + buf.write("\u04ad\u0460\3\2\2\2\u04ad\u0468\3\2\2\2\u04ad\u046f\3") + buf.write("\2\2\2\u04ad\u0475\3\2\2\2\u04ad\u047b\3\2\2\2\u04ad\u0481") + buf.write("\3\2\2\2\u04ad\u0486\3\2\2\2\u04ad\u048e\3\2\2\2\u04ad") + buf.write("\u0496\3\2\2\2\u04ad\u049f\3\2\2\2\u04ad\u04a8\3\2\2\2") + buf.write("\u04ad\u04aa\3\2\2\2\u04ad\u04ab\3\2\2\2\u04ad\u04ac\3") + buf.write("\2\2\2\u04ae\23\3\2\2\2\u04af\u04b1\7\67\2\2\u04b0\u04b2") + buf.write("\7\u00e9\2\2\u04b1\u04b0\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2") + buf.write("\u04b4\3\2\2\2\u04b3\u04b5\7Y\2\2\u04b4\u04b3\3\2\2\2") + buf.write("\u04b4\u04b5\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04ba\7") + buf.write("\u00e5\2\2\u04b7\u04b8\7p\2\2\u04b8\u04b9\7\u009b\2\2") + buf.write("\u04b9\u04bb\7U\2\2\u04ba\u04b7\3\2\2\2\u04ba\u04bb\3") + buf.write("\2\2\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\5\u00acW\2\u04bd") + buf.write("\25\3\2\2\2\u04be\u04bf\7\67\2\2\u04bf\u04c1\7\u00a3\2") + buf.write("\2\u04c0\u04be\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c2") + buf.write("\3\2\2\2\u04c2\u04c3\7\u00c2\2\2\u04c3\u04c4\7\u00e5\2") + buf.write("\2\u04c4\u04c5\5\u00acW\2\u04c5\27\3\2\2\2\u04c6\u04c7") + buf.write("\7)\2\2\u04c7\u04c8\7 \2\2\u04c8\u04cc\5\u0094K\2\u04c9") + buf.write("\u04ca\7\u00dd\2\2\u04ca\u04cb\7 \2\2\u04cb\u04cd\5\u0098") + buf.write("M\2\u04cc\u04c9\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04ce") + buf.write("\3\2\2\2\u04ce\u04cf\7|\2\2\u04cf\u04d0\7\u0121\2\2\u04d0") + buf.write("\u04d1\7\37\2\2\u04d1\31\3\2\2\2\u04d2\u04d3\7\u00da\2") + buf.write("\2\u04d3\u04d4\7 \2\2\u04d4\u04d5\5\u0094K\2\u04d5\u04d8") + buf.write("\7\u009f\2\2\u04d6\u04d9\5@!\2\u04d7\u04d9\5B\"\2\u04d8") + buf.write("\u04d6\3\2\2\2\u04d8\u04d7\3\2\2\2\u04d9\u04dd\3\2\2\2") + buf.write("\u04da\u04db\7\u00e0\2\2\u04db\u04dc\7\30\2\2\u04dc\u04de") + buf.write("\7J\2\2\u04dd\u04da\3\2\2\2\u04dd\u04de\3\2\2\2\u04de") + buf.write("\33\3\2\2\2\u04df\u04e0\7\u008c\2\2\u04e0\u04e1\7\u011d") + buf.write("\2\2\u04e1\35\3\2\2\2\u04e2\u04e3\7/\2\2\u04e3\u04e4\7") + buf.write("\u011d\2\2\u04e4\37\3\2\2\2\u04e5\u04e7\5\60\31\2\u04e6") + buf.write("\u04e5\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04e8\3\2\2\2") + buf.write("\u04e8\u04e9\5R*\2\u04e9\u04ea\5N(\2\u04ea!\3\2\2\2\u04eb") + buf.write("\u04ec\7y\2\2\u04ec\u04ee\7\u00ab\2\2\u04ed\u04ef\7\u00e5") + buf.write("\2\2\u04ee\u04ed\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f0") + buf.write("\3\2\2\2\u04f0\u04f7\5\u00acW\2\u04f1\u04f5\5&\24\2\u04f2") + buf.write("\u04f3\7p\2\2\u04f3\u04f4\7\u009b\2\2\u04f4\u04f6\7U\2") + buf.write("\2\u04f5\u04f2\3\2\2\2\u04f5\u04f6\3\2\2\2\u04f6\u04f8") + buf.write("\3\2\2\2\u04f7\u04f1\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8") + buf.write("\u0523\3\2\2\2\u04f9\u04fa\7y\2\2\u04fa\u04fc\7|\2\2\u04fb") + buf.write("\u04fd\7\u00e5\2\2\u04fc\u04fb\3\2\2\2\u04fc\u04fd\3\2") + buf.write("\2\2\u04fd\u04fe\3\2\2\2\u04fe\u0500\5\u00acW\2\u04ff") + buf.write("\u0501\5&\24\2\u0500\u04ff\3\2\2\2\u0500\u0501\3\2\2\2") + buf.write("\u0501\u0505\3\2\2\2\u0502\u0503\7p\2\2\u0503\u0504\7") + buf.write("\u009b\2\2\u0504\u0506\7U\2\2\u0505\u0502\3\2\2\2\u0505") + buf.write("\u0506\3\2\2\2\u0506\u0523\3\2\2\2\u0507\u0508\7y\2\2") + buf.write("\u0508\u050a\7\u00ab\2\2\u0509\u050b\7\u008b\2\2\u050a") + buf.write("\u0509\3\2\2\2\u050a\u050b\3\2\2\2\u050b\u050c\3\2\2\2") + buf.write("\u050c\u050d\7K\2\2\u050d\u050f\7\u011d\2\2\u050e\u0510") + buf.write("\5\u00a8U\2\u050f\u050e\3\2\2\2\u050f\u0510\3\2\2\2\u0510") + buf.write("\u0512\3\2\2\2\u0511\u0513\5D#\2\u0512\u0511\3\2\2\2\u0512") + buf.write("\u0513\3\2\2\2\u0513\u0523\3\2\2\2\u0514\u0515\7y\2\2") + buf.write("\u0515\u0517\7\u00ab\2\2\u0516\u0518\7\u008b\2\2\u0517") + buf.write("\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518\u0519\3\2\2\2") + buf.write("\u0519\u051b\7K\2\2\u051a\u051c\7\u011d\2\2\u051b\u051a") + buf.write("\3\2\2\2\u051b\u051c\3\2\2\2\u051c\u051d\3\2\2\2\u051d") + buf.write("\u0520\5\64\33\2\u051e\u051f\7\u00a2\2\2\u051f\u0521\5") + buf.write("8\35\2\u0520\u051e\3\2\2\2\u0520\u0521\3\2\2\2\u0521\u0523") + buf.write("\3\2\2\2\u0522\u04eb\3\2\2\2\u0522\u04f9\3\2\2\2\u0522") + buf.write("\u0507\3\2\2\2\u0522\u0514\3\2\2\2\u0523#\3\2\2\2\u0524") + buf.write("\u0526\5&\24\2\u0525\u0527\5\34\17\2\u0526\u0525\3\2\2") + buf.write("\2\u0526\u0527\3\2\2\2\u0527%\3\2\2\2\u0528\u0529\7\u00ac") + buf.write("\2\2\u0529\u052a\7\4\2\2\u052a\u052f\5(\25\2\u052b\u052c") + buf.write("\7\6\2\2\u052c\u052e\5(\25\2\u052d\u052b\3\2\2\2\u052e") + buf.write("\u0531\3\2\2\2\u052f\u052d\3\2\2\2\u052f\u0530\3\2\2\2") + buf.write("\u0530\u0532\3\2\2\2\u0531\u052f\3\2\2\2\u0532\u0533\7") + buf.write("\5\2\2\u0533\'\3\2\2\2\u0534\u0537\5\u0104\u0083\2\u0535") + buf.write("\u0536\7\u010a\2\2\u0536\u0538\5\u00c6d\2\u0537\u0535") + buf.write("\3\2\2\2\u0537\u0538\3\2\2\2\u0538)\3\2\2\2\u0539\u053a") + buf.write("\t\16\2\2\u053a+\3\2\2\2\u053b\u0541\5\u00fe\u0080\2\u053c") + buf.write("\u0541\7\u011d\2\2\u053d\u0541\5\u00c8e\2\u053e\u0541") + buf.write("\5\u00caf\2\u053f\u0541\5\u00ccg\2\u0540\u053b\3\2\2\2") + buf.write("\u0540\u053c\3\2\2\2\u0540\u053d\3\2\2\2\u0540\u053e\3") + buf.write("\2\2\2\u0540\u053f\3\2\2\2\u0541-\3\2\2\2\u0542\u0547") + buf.write("\5\u0104\u0083\2\u0543\u0544\7\7\2\2\u0544\u0546\5\u0104") + buf.write("\u0083\2\u0545\u0543\3\2\2\2\u0546\u0549\3\2\2\2\u0547") + buf.write("\u0545\3\2\2\2\u0547\u0548\3\2\2\2\u0548/\3\2\2\2\u0549") + buf.write("\u0547\3\2\2\2\u054a\u054b\7\u0108\2\2\u054b\u0550\5\62") + buf.write("\32\2\u054c\u054d\7\6\2\2\u054d\u054f\5\62\32\2\u054e") + buf.write("\u054c\3\2\2\2\u054f\u0552\3\2\2\2\u0550\u054e\3\2\2\2") + buf.write("\u0550\u0551\3\2\2\2\u0551\61\3\2\2\2\u0552\u0550\3\2") + buf.write("\2\2\u0553\u0555\5\u0100\u0081\2\u0554\u0556\5\u0094K") + buf.write("\2\u0555\u0554\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0558") + buf.write("\3\2\2\2\u0557\u0559\7\30\2\2\u0558\u0557\3\2\2\2\u0558") + buf.write("\u0559\3\2\2\2\u0559\u055a\3\2\2\2\u055a\u055b\7\4\2\2") + buf.write("\u055b\u055c\5 \21\2\u055c\u055d\7\5\2\2\u055d\63\3\2") + buf.write("\2\2\u055e\u055f\7\u0101\2\2\u055f\u0560\5\u00acW\2\u0560") + buf.write("\65\3\2\2\2\u0561\u0562\7\u00a2\2\2\u0562\u056c\58\35") + buf.write("\2\u0563\u0564\7\u00ad\2\2\u0564\u0565\7 \2\2\u0565\u056c") + buf.write("\5\u00b6\\\2\u0566\u056c\5\30\r\2\u0567\u056c\5\34\17") + buf.write("\2\u0568\u056c\5\36\20\2\u0569\u056a\7\u00e8\2\2\u056a") + buf.write("\u056c\58\35\2\u056b\u0561\3\2\2\2\u056b\u0563\3\2\2\2") + buf.write("\u056b\u0566\3\2\2\2\u056b\u0567\3\2\2\2\u056b\u0568\3") + buf.write("\2\2\2\u056b\u0569\3\2\2\2\u056c\u056f\3\2\2\2\u056d\u056b") + buf.write("\3\2\2\2\u056d\u056e\3\2\2\2\u056e\67\3\2\2\2\u056f\u056d") + buf.write("\3\2\2\2\u0570\u0571\7\4\2\2\u0571\u0576\5:\36\2\u0572") + buf.write("\u0573\7\6\2\2\u0573\u0575\5:\36\2\u0574\u0572\3\2\2\2") + buf.write("\u0575\u0578\3\2\2\2\u0576\u0574\3\2\2\2\u0576\u0577\3") + buf.write("\2\2\2\u0577\u0579\3\2\2\2\u0578\u0576\3\2\2\2\u0579\u057a") + buf.write("\7\5\2\2\u057a9\3\2\2\2\u057b\u0580\5<\37\2\u057c\u057e") + buf.write("\7\u010a\2\2\u057d\u057c\3\2\2\2\u057d\u057e\3\2\2\2\u057e") + buf.write("\u057f\3\2\2\2\u057f\u0581\5> \2\u0580\u057d\3\2\2\2\u0580") + buf.write("\u0581\3\2\2\2\u0581;\3\2\2\2\u0582\u0587\5\u0104\u0083") + buf.write("\2\u0583\u0584\7\7\2\2\u0584\u0586\5\u0104\u0083\2\u0585") + buf.write("\u0583\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2") + buf.write("\u0587\u0588\3\2\2\2\u0588\u058c\3\2\2\2\u0589\u0587\3") + buf.write("\2\2\2\u058a\u058c\7\u011d\2\2\u058b\u0582\3\2\2\2\u058b") + buf.write("\u058a\3\2\2\2\u058c=\3\2\2\2\u058d\u0592\7\u0121\2\2") + buf.write("\u058e\u0592\7\u0123\2\2\u058f\u0592\5\u00ceh\2\u0590") + buf.write("\u0592\7\u011d\2\2\u0591\u058d\3\2\2\2\u0591\u058e\3\2") + buf.write("\2\2\u0591\u058f\3\2\2\2\u0591\u0590\3\2\2\2\u0592?\3") + buf.write("\2\2\2\u0593\u0594\7\4\2\2\u0594\u0599\5\u00c6d\2\u0595") + buf.write("\u0596\7\6\2\2\u0596\u0598\5\u00c6d\2\u0597\u0595\3\2") + buf.write("\2\2\u0598\u059b\3\2\2\2\u0599\u0597\3\2\2\2\u0599\u059a") + buf.write("\3\2\2\2\u059a\u059c\3\2\2\2\u059b\u0599\3\2\2\2\u059c") + buf.write("\u059d\7\5\2\2\u059dA\3\2\2\2\u059e\u059f\7\4\2\2\u059f") + buf.write("\u05a4\5@!\2\u05a0\u05a1\7\6\2\2\u05a1\u05a3\5@!\2\u05a2") + buf.write("\u05a0\3\2\2\2\u05a3\u05a6\3\2\2\2\u05a4\u05a2\3\2\2\2") + buf.write("\u05a4\u05a5\3\2\2\2\u05a5\u05a7\3\2\2\2\u05a6\u05a4\3") + buf.write("\2\2\2\u05a7\u05a8\7\5\2\2\u05a8C\3\2\2\2\u05a9\u05aa") + buf.write("\7\u00e0\2\2\u05aa\u05ab\7\30\2\2\u05ab\u05b0\5F$\2\u05ac") + buf.write("\u05ad\7\u00e0\2\2\u05ad\u05ae\7 \2\2\u05ae\u05b0\5H%") + buf.write("\2\u05af\u05a9\3\2\2\2\u05af\u05ac\3\2\2\2\u05b0E\3\2") + buf.write("\2\2\u05b1\u05b2\7x\2\2\u05b2\u05b3\7\u011d\2\2\u05b3") + buf.write("\u05b4\7\u00a7\2\2\u05b4\u05b7\7\u011d\2\2\u05b5\u05b7") + buf.write("\5\u0104\u0083\2\u05b6\u05b1\3\2\2\2\u05b6\u05b5\3\2\2") + buf.write("\2\u05b7G\3\2\2\2\u05b8\u05bc\7\u011d\2\2\u05b9\u05ba") + buf.write("\7\u0108\2\2\u05ba\u05bb\7\u00d4\2\2\u05bb\u05bd\58\35") + buf.write("\2\u05bc\u05b9\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bdI\3\2") + buf.write("\2\2\u05be\u05bf\5\u0104\u0083\2\u05bf\u05c0\7\u011d\2") + buf.write("\2\u05c0K\3\2\2\2\u05c1\u05c2\5\"\22\2\u05c2\u05c3\5R") + buf.write("*\2\u05c3\u05c4\5N(\2\u05c4\u05f5\3\2\2\2\u05c5\u05c7") + buf.write("\5x=\2\u05c6\u05c8\5P)\2\u05c7\u05c6\3\2\2\2\u05c8\u05c9") + buf.write("\3\2\2\2\u05c9\u05c7\3\2\2\2\u05c9\u05ca\3\2\2\2\u05ca") + buf.write("\u05f5\3\2\2\2\u05cb\u05cc\7E\2\2\u05cc\u05cd\7f\2\2\u05cd") + buf.write("\u05ce\5\u00acW\2\u05ce\u05d0\5\u00a6T\2\u05cf\u05d1\5") + buf.write("p9\2\u05d0\u05cf\3\2\2\2\u05d0\u05d1\3\2\2\2\u05d1\u05f5") + buf.write("\3\2\2\2\u05d2\u05d3\7\u00fe\2\2\u05d3\u05d4\5\u00acW") + buf.write("\2\u05d4\u05d5\5\u00a6T\2\u05d5\u05d7\5b\62\2\u05d6\u05d8") + buf.write("\5p9\2\u05d7\u05d6\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05f5") + buf.write("\3\2\2\2\u05d9\u05da\7\u0093\2\2\u05da\u05db\7|\2\2\u05db") + buf.write("\u05dc\5\u00acW\2\u05dc\u05dd\5\u00a6T\2\u05dd\u05e3\7") + buf.write("\u0101\2\2\u05de\u05e4\5\u00acW\2\u05df\u05e0\7\4\2\2") + buf.write("\u05e0\u05e1\5 \21\2\u05e1\u05e2\7\5\2\2\u05e2\u05e4\3") + buf.write("\2\2\2\u05e3\u05de\3\2\2\2\u05e3\u05df\3\2\2\2\u05e4\u05e5") + buf.write("\3\2\2\2\u05e5\u05e6\5\u00a6T\2\u05e6\u05e7\7\u009f\2") + buf.write("\2\u05e7\u05eb\5\u00be`\2\u05e8\u05ea\5d\63\2\u05e9\u05e8") + buf.write("\3\2\2\2\u05ea\u05ed\3\2\2\2\u05eb\u05e9\3\2\2\2\u05eb") + buf.write("\u05ec\3\2\2\2\u05ec\u05f1\3\2\2\2\u05ed\u05eb\3\2\2\2") + buf.write("\u05ee\u05f0\5f\64\2\u05ef\u05ee\3\2\2\2\u05f0\u05f3\3") + buf.write("\2\2\2\u05f1\u05ef\3\2\2\2\u05f1\u05f2\3\2\2\2\u05f2\u05f5") + buf.write("\3\2\2\2\u05f3\u05f1\3\2\2\2\u05f4\u05c1\3\2\2\2\u05f4") + buf.write("\u05c5\3\2\2\2\u05f4\u05cb\3\2\2\2\u05f4\u05d2\3\2\2\2") + buf.write("\u05f4\u05d9\3\2\2\2\u05f5M\3\2\2\2\u05f6\u05f7\7\u00a4") + buf.write("\2\2\u05f7\u05f8\7 \2\2\u05f8\u05fd\5V,\2\u05f9\u05fa") + buf.write("\7\6\2\2\u05fa\u05fc\5V,\2\u05fb\u05f9\3\2\2\2\u05fc\u05ff") + buf.write("\3\2\2\2\u05fd\u05fb\3\2\2\2\u05fd\u05fe\3\2\2\2\u05fe") + buf.write("\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u0600\u05f6\3\2\2\2") + buf.write("\u0600\u0601\3\2\2\2\u0601\u060c\3\2\2\2\u0602\u0603\7") + buf.write("(\2\2\u0603\u0604\7 \2\2\u0604\u0609\5\u00bc_\2\u0605") + buf.write("\u0606\7\6\2\2\u0606\u0608\5\u00bc_\2\u0607\u0605\3\2") + buf.write("\2\2\u0608\u060b\3\2\2\2\u0609\u0607\3\2\2\2\u0609\u060a") + buf.write("\3\2\2\2\u060a\u060d\3\2\2\2\u060b\u0609\3\2\2\2\u060c") + buf.write("\u0602\3\2\2\2\u060c\u060d\3\2\2\2\u060d\u0618\3\2\2\2") + buf.write("\u060e\u060f\7M\2\2\u060f\u0610\7 \2\2\u0610\u0615\5\u00bc") + buf.write("_\2\u0611\u0612\7\6\2\2\u0612\u0614\5\u00bc_\2\u0613\u0611") + buf.write("\3\2\2\2\u0614\u0617\3\2\2\2\u0615\u0613\3\2\2\2\u0615") + buf.write("\u0616\3\2\2\2\u0616\u0619\3\2\2\2\u0617\u0615\3\2\2\2") + buf.write("\u0618\u060e\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0624\3") + buf.write("\2\2\2\u061a\u061b\7\u00dc\2\2\u061b\u061c\7 \2\2\u061c") + buf.write("\u0621\5V,\2\u061d\u061e\7\6\2\2\u061e\u0620\5V,\2\u061f") + buf.write("\u061d\3\2\2\2\u0620\u0623\3\2\2\2\u0621\u061f\3\2\2\2") + buf.write("\u0621\u0622\3\2\2\2\u0622\u0625\3\2\2\2\u0623\u0621\3") + buf.write("\2\2\2\u0624\u061a\3\2\2\2\u0624\u0625\3\2\2\2\u0625\u0627") + buf.write("\3\2\2\2\u0626\u0628\5\u00f0y\2\u0627\u0626\3\2\2\2\u0627") + buf.write("\u0628\3\2\2\2\u0628\u062e\3\2\2\2\u0629\u062c\7\u0087") + buf.write("\2\2\u062a\u062d\7\20\2\2\u062b\u062d\5\u00bc_\2\u062c") + buf.write("\u062a\3\2\2\2\u062c\u062b\3\2\2\2\u062d\u062f\3\2\2\2") + buf.write("\u062e\u0629\3\2\2\2\u062e\u062f\3\2\2\2\u062fO\3\2\2") + buf.write("\2\u0630\u0631\5\"\22\2\u0631\u0632\5Z.\2\u0632Q\3\2\2") + buf.write("\2\u0633\u0634\b*\1\2\u0634\u0635\5T+\2\u0635\u064d\3") + buf.write("\2\2\2\u0636\u0637\f\5\2\2\u0637\u0638\6*\5\2\u0638\u063a") + buf.write("\t\17\2\2\u0639\u063b\5\u0086D\2\u063a\u0639\3\2\2\2\u063a") + buf.write("\u063b\3\2\2\2\u063b\u063c\3\2\2\2\u063c\u064c\5R*\6\u063d") + buf.write("\u063e\f\4\2\2\u063e\u063f\6*\7\2\u063f\u0641\7z\2\2\u0640") + buf.write("\u0642\5\u0086D\2\u0641\u0640\3\2\2\2\u0641\u0642\3\2") + buf.write("\2\2\u0642\u0643\3\2\2\2\u0643\u064c\5R*\5\u0644\u0645") + buf.write("\f\3\2\2\u0645\u0646\6*\t\2\u0646\u0648\t\20\2\2\u0647") + buf.write("\u0649\5\u0086D\2\u0648\u0647\3\2\2\2\u0648\u0649\3\2") + buf.write("\2\2\u0649\u064a\3\2\2\2\u064a\u064c\5R*\4\u064b\u0636") + buf.write("\3\2\2\2\u064b\u063d\3\2\2\2\u064b\u0644\3\2\2\2\u064c") + buf.write("\u064f\3\2\2\2\u064d\u064b\3\2\2\2\u064d\u064e\3\2\2\2") + buf.write("\u064eS\3\2\2\2\u064f\u064d\3\2\2\2\u0650\u065a\5\\/\2") + buf.write("\u0651\u065a\5X-\2\u0652\u0653\7\u00e5\2\2\u0653\u065a") + buf.write("\5\u00acW\2\u0654\u065a\5\u00a2R\2\u0655\u0656\7\4\2\2") + buf.write("\u0656\u0657\5 \21\2\u0657\u0658\7\5\2\2\u0658\u065a\3") + buf.write("\2\2\2\u0659\u0650\3\2\2\2\u0659\u0651\3\2\2\2\u0659\u0652") + buf.write("\3\2\2\2\u0659\u0654\3\2\2\2\u0659\u0655\3\2\2\2\u065a") + buf.write("U\3\2\2\2\u065b\u065d\5\u00bc_\2\u065c\u065e\t\21\2\2") + buf.write("\u065d\u065c\3\2\2\2\u065d\u065e\3\2\2\2\u065e\u0661\3") + buf.write("\2\2\2\u065f\u0660\7\u009d\2\2\u0660\u0662\t\22\2\2\u0661") + buf.write("\u065f\3\2\2\2\u0661\u0662\3\2\2\2\u0662W\3\2\2\2\u0663") + buf.write("\u0665\5x=\2\u0664\u0666\5Z.\2\u0665\u0664\3\2\2\2\u0666") + buf.write("\u0667\3\2\2\2\u0667\u0665\3\2\2\2\u0667\u0668\3\2\2\2") + buf.write("\u0668Y\3\2\2\2\u0669\u066b\5^\60\2\u066a\u066c\5p9\2") + buf.write("\u066b\u066a\3\2\2\2\u066b\u066c\3\2\2\2\u066c\u066d\3") + buf.write("\2\2\2\u066d\u066e\5N(\2\u066e\u0685\3\2\2\2\u066f\u0673") + buf.write("\5`\61\2\u0670\u0672\5\u0084C\2\u0671\u0670\3\2\2\2\u0672") + buf.write("\u0675\3\2\2\2\u0673\u0671\3\2\2\2\u0673\u0674\3\2\2\2") + buf.write("\u0674\u0677\3\2\2\2\u0675\u0673\3\2\2\2\u0676\u0678\5") + buf.write("p9\2\u0677\u0676\3\2\2\2\u0677\u0678\3\2\2\2\u0678\u067a") + buf.write("\3\2\2\2\u0679\u067b\5z>\2\u067a\u0679\3\2\2\2\u067a\u067b") + buf.write("\3\2\2\2\u067b\u067d\3\2\2\2\u067c\u067e\5r:\2\u067d\u067c") + buf.write("\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u0680\3\2\2\2\u067f") + buf.write("\u0681\5\u00f0y\2\u0680\u067f\3\2\2\2\u0680\u0681\3\2") + buf.write("\2\2\u0681\u0682\3\2\2\2\u0682\u0683\5N(\2\u0683\u0685") + buf.write("\3\2\2\2\u0684\u0669\3\2\2\2\u0684\u066f\3\2\2\2\u0685") + buf.write("[\3\2\2\2\u0686\u0688\5^\60\2\u0687\u0689\5x=\2\u0688") + buf.write("\u0687\3\2\2\2\u0688\u0689\3\2\2\2\u0689\u068b\3\2\2\2") + buf.write("\u068a\u068c\5p9\2\u068b\u068a\3\2\2\2\u068b\u068c\3\2") + buf.write("\2\2\u068c\u06a4\3\2\2\2\u068d\u068f\5`\61\2\u068e\u0690") + buf.write("\5x=\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0694") + buf.write("\3\2\2\2\u0691\u0693\5\u0084C\2\u0692\u0691\3\2\2\2\u0693") + buf.write("\u0696\3\2\2\2\u0694\u0692\3\2\2\2\u0694\u0695\3\2\2\2") + buf.write("\u0695\u0698\3\2\2\2\u0696\u0694\3\2\2\2\u0697\u0699\5") + buf.write("p9\2\u0698\u0697\3\2\2\2\u0698\u0699\3\2\2\2\u0699\u069b") + buf.write("\3\2\2\2\u069a\u069c\5z>\2\u069b\u069a\3\2\2\2\u069b\u069c") + buf.write("\3\2\2\2\u069c\u069e\3\2\2\2\u069d\u069f\5r:\2\u069e\u069d") + buf.write("\3\2\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0") + buf.write("\u06a2\5\u00f0y\2\u06a1\u06a0\3\2\2\2\u06a1\u06a2\3\2") + buf.write("\2\2\u06a2\u06a4\3\2\2\2\u06a3\u0686\3\2\2\2\u06a3\u068d") + buf.write("\3\2\2\2\u06a4]\3\2\2\2\u06a5\u06a6\7\u00d0\2\2\u06a6") + buf.write("\u06a7\7\u00f1\2\2\u06a7\u06a8\7\4\2\2\u06a8\u06a9\5\u00b4") + buf.write("[\2\u06a9\u06aa\7\5\2\2\u06aa\u06b0\3\2\2\2\u06ab\u06ac") + buf.write("\7\u0091\2\2\u06ac\u06b0\5\u00b4[\2\u06ad\u06ae\7\u00bd") + buf.write("\2\2\u06ae\u06b0\5\u00b4[\2\u06af\u06a5\3\2\2\2\u06af") + buf.write("\u06ab\3\2\2\2\u06af\u06ad\3\2\2\2\u06b0\u06b2\3\2\2\2") + buf.write("\u06b1\u06b3\5\u00a8U\2\u06b2\u06b1\3\2\2\2\u06b2\u06b3") + buf.write("\3\2\2\2\u06b3\u06b6\3\2\2\2\u06b4\u06b5\7\u00bb\2\2\u06b5") + buf.write("\u06b7\7\u011d\2\2\u06b6\u06b4\3\2\2\2\u06b6\u06b7\3\2") + buf.write("\2\2\u06b7\u06b8\3\2\2\2\u06b8\u06b9\7\u0101\2\2\u06b9") + buf.write("\u06c6\7\u011d\2\2\u06ba\u06c4\7\30\2\2\u06bb\u06c5\5") + buf.write("\u0096L\2\u06bc\u06c5\5\u00e6t\2\u06bd\u06c0\7\4\2\2\u06be") + buf.write("\u06c1\5\u0096L\2\u06bf\u06c1\5\u00e6t\2\u06c0\u06be\3") + buf.write("\2\2\2\u06c0\u06bf\3\2\2\2\u06c1\u06c2\3\2\2\2\u06c2\u06c3") + buf.write("\7\5\2\2\u06c3\u06c5\3\2\2\2\u06c4\u06bb\3\2\2\2\u06c4") + buf.write("\u06bc\3\2\2\2\u06c4\u06bd\3\2\2\2\u06c5\u06c7\3\2\2\2") + buf.write("\u06c6\u06ba\3\2\2\2\u06c6\u06c7\3\2\2\2\u06c7\u06c9\3") + buf.write("\2\2\2\u06c8\u06ca\5\u00a8U\2\u06c9\u06c8\3\2\2\2\u06c9") + buf.write("\u06ca\3\2\2\2\u06ca\u06cd\3\2\2\2\u06cb\u06cc\7\u00ba") + buf.write("\2\2\u06cc\u06ce\7\u011d\2\2\u06cd\u06cb\3\2\2\2\u06cd") + buf.write("\u06ce\3\2\2\2\u06ce_\3\2\2\2\u06cf\u06d3\7\u00d0\2\2") + buf.write("\u06d0\u06d2\5t;\2\u06d1\u06d0\3\2\2\2\u06d2\u06d5\3\2") + buf.write("\2\2\u06d3\u06d1\3\2\2\2\u06d3\u06d4\3\2\2\2\u06d4\u06d7") + buf.write("\3\2\2\2\u06d5\u06d3\3\2\2\2\u06d6\u06d8\5\u0086D\2\u06d7") + buf.write("\u06d6\3\2\2\2\u06d7\u06d8\3\2\2\2\u06d8\u06d9\3\2\2\2") + buf.write("\u06d9\u06da\5\u00b4[\2\u06daa\3\2\2\2\u06db\u06dc\7\u00d6") + buf.write("\2\2\u06dc\u06dd\5l\67\2\u06ddc\3\2\2\2\u06de\u06df\7") + buf.write("\u0105\2\2\u06df\u06e2\7\u0092\2\2\u06e0\u06e1\7\23\2") + buf.write("\2\u06e1\u06e3\5\u00be`\2\u06e2\u06e0\3\2\2\2\u06e2\u06e3") + buf.write("\3\2\2\2\u06e3\u06e4\3\2\2\2\u06e4\u06e5\7\u00eb\2\2\u06e5") + buf.write("\u06e6\5h\65\2\u06e6e\3\2\2\2\u06e7\u06e8\7\u0105\2\2") + buf.write("\u06e8\u06e9\7\u009b\2\2\u06e9\u06ec\7\u0092\2\2\u06ea") + buf.write("\u06eb\7\23\2\2\u06eb\u06ed\5\u00be`\2\u06ec\u06ea\3\2") + buf.write("\2\2\u06ec\u06ed\3\2\2\2\u06ed\u06ee\3\2\2\2\u06ee\u06ef") + buf.write("\7\u00eb\2\2\u06ef\u06f0\5j\66\2\u06f0g\3\2\2\2\u06f1") + buf.write("\u06f9\7E\2\2\u06f2\u06f3\7\u00fe\2\2\u06f3\u06f4\7\u00d6") + buf.write("\2\2\u06f4\u06f9\7\u0114\2\2\u06f5\u06f6\7\u00fe\2\2\u06f6") + buf.write("\u06f7\7\u00d6\2\2\u06f7\u06f9\5l\67\2\u06f8\u06f1\3\2") + buf.write("\2\2\u06f8\u06f2\3\2\2\2\u06f8\u06f5\3\2\2\2\u06f9i\3") + buf.write("\2\2\2\u06fa\u06fb\7y\2\2\u06fb\u070d\7\u0114\2\2\u06fc") + buf.write("\u06fd\7y\2\2\u06fd\u06fe\7\4\2\2\u06fe\u06ff\5\u00aa") + buf.write("V\2\u06ff\u0700\7\5\2\2\u0700\u0701\7\u0102\2\2\u0701") + buf.write("\u0702\7\4\2\2\u0702\u0707\5\u00bc_\2\u0703\u0704\7\6") + buf.write("\2\2\u0704\u0706\5\u00bc_\2\u0705\u0703\3\2\2\2\u0706") + buf.write("\u0709\3\2\2\2\u0707\u0705\3\2\2\2\u0707\u0708\3\2\2\2") + buf.write("\u0708\u070a\3\2\2\2\u0709\u0707\3\2\2\2\u070a\u070b\7") + buf.write("\5\2\2\u070b\u070d\3\2\2\2\u070c\u06fa\3\2\2\2\u070c\u06fc") + buf.write("\3\2\2\2\u070dk\3\2\2\2\u070e\u0713\5n8\2\u070f\u0710") + buf.write("\7\6\2\2\u0710\u0712\5n8\2\u0711\u070f\3\2\2\2\u0712\u0715") + buf.write("\3\2\2\2\u0713\u0711\3\2\2\2\u0713\u0714\3\2\2\2\u0714") + buf.write("m\3\2\2\2\u0715\u0713\3\2\2\2\u0716\u0717\5\u00acW\2\u0717") + buf.write("\u0718\7\u010a\2\2\u0718\u0719\5\u00bc_\2\u0719o\3\2\2") + buf.write("\2\u071a\u071b\7\u0106\2\2\u071b\u071c\5\u00be`\2\u071c") + buf.write("q\3\2\2\2\u071d\u071e\7n\2\2\u071e\u071f\5\u00be`\2\u071f") + buf.write("s\3\2\2\2\u0720\u0721\7\b\2\2\u0721\u0728\5v<\2\u0722") + buf.write("\u0724\7\6\2\2\u0723\u0722\3\2\2\2\u0723\u0724\3\2\2\2") + buf.write("\u0724\u0725\3\2\2\2\u0725\u0727\5v<\2\u0726\u0723\3\2") + buf.write("\2\2\u0727\u072a\3\2\2\2\u0728\u0726\3\2\2\2\u0728\u0729") + buf.write("\3\2\2\2\u0729\u072b\3\2\2\2\u072a\u0728\3\2\2\2\u072b") + buf.write("\u072c\7\t\2\2\u072cu\3\2\2\2\u072d\u073b\5\u0104\u0083") + buf.write("\2\u072e\u072f\5\u0104\u0083\2\u072f\u0730\7\4\2\2\u0730") + buf.write("\u0735\5\u00c4c\2\u0731\u0732\7\6\2\2\u0732\u0734\5\u00c4") + buf.write("c\2\u0733\u0731\3\2\2\2\u0734\u0737\3\2\2\2\u0735\u0733") + buf.write("\3\2\2\2\u0735\u0736\3\2\2\2\u0736\u0738\3\2\2\2\u0737") + buf.write("\u0735\3\2\2\2\u0738\u0739\7\5\2\2\u0739\u073b\3\2\2\2") + buf.write("\u073a\u072d\3\2\2\2\u073a\u072e\3\2\2\2\u073bw\3\2\2") + buf.write("\2\u073c\u073d\7f\2\2\u073d\u0742\5\u0088E\2\u073e\u073f") + buf.write("\7\6\2\2\u073f\u0741\5\u0088E\2\u0740\u073e\3\2\2\2\u0741") + buf.write("\u0744\3\2\2\2\u0742\u0740\3\2\2\2\u0742\u0743\3\2\2\2") + buf.write("\u0743\u0748\3\2\2\2\u0744\u0742\3\2\2\2\u0745\u0747\5") + buf.write("\u0084C\2\u0746\u0745\3\2\2\2\u0747\u074a\3\2\2\2\u0748") + buf.write("\u0746\3\2\2\2\u0748\u0749\3\2\2\2\u0749\u074c\3\2\2\2") + buf.write("\u074a\u0748\3\2\2\2\u074b\u074d\5~@\2\u074c\u074b\3\2") + buf.write("\2\2\u074c\u074d\3\2\2\2\u074dy\3\2\2\2\u074e\u074f\7") + buf.write("l\2\2\u074f\u0750\7 \2\2\u0750\u0755\5\u00bc_\2\u0751") + buf.write("\u0752\7\6\2\2\u0752\u0754\5\u00bc_\2\u0753\u0751\3\2") + buf.write("\2\2\u0754\u0757\3\2\2\2\u0755\u0753\3\2\2\2\u0755\u0756") + buf.write("\3\2\2\2\u0756\u0769\3\2\2\2\u0757\u0755\3\2\2\2\u0758") + buf.write("\u0759\7\u0108\2\2\u0759\u076a\7\u00cb\2\2\u075a\u075b") + buf.write("\7\u0108\2\2\u075b\u076a\79\2\2\u075c\u075d\7m\2\2\u075d") + buf.write("\u075e\7\u00d8\2\2\u075e\u075f\7\4\2\2\u075f\u0764\5|") + buf.write("?\2\u0760\u0761\7\6\2\2\u0761\u0763\5|?\2\u0762\u0760") + buf.write("\3\2\2\2\u0763\u0766\3\2\2\2\u0764\u0762\3\2\2\2\u0764") + buf.write("\u0765\3\2\2\2\u0765\u0767\3\2\2\2\u0766\u0764\3\2\2\2") + buf.write("\u0767\u0768\7\5\2\2\u0768\u076a\3\2\2\2\u0769\u0758\3") + buf.write("\2\2\2\u0769\u075a\3\2\2\2\u0769\u075c\3\2\2\2\u0769\u076a") + buf.write("\3\2\2\2\u076a\u077b\3\2\2\2\u076b\u076c\7l\2\2\u076c") + buf.write("\u076d\7 \2\2\u076d\u076e\7m\2\2\u076e\u076f\7\u00d8\2") + buf.write("\2\u076f\u0770\7\4\2\2\u0770\u0775\5|?\2\u0771\u0772\7") + buf.write("\6\2\2\u0772\u0774\5|?\2\u0773\u0771\3\2\2\2\u0774\u0777") + buf.write("\3\2\2\2\u0775\u0773\3\2\2\2\u0775\u0776\3\2\2\2\u0776") + buf.write("\u0778\3\2\2\2\u0777\u0775\3\2\2\2\u0778\u0779\7\5\2\2") + buf.write("\u0779\u077b\3\2\2\2\u077a\u074e\3\2\2\2\u077a\u076b\3") + buf.write("\2\2\2\u077b{\3\2\2\2\u077c\u0785\7\4\2\2\u077d\u0782") + buf.write("\5\u00bc_\2\u077e\u077f\7\6\2\2\u077f\u0781\5\u00bc_\2") + buf.write("\u0780\u077e\3\2\2\2\u0781\u0784\3\2\2\2\u0782\u0780\3") + buf.write("\2\2\2\u0782\u0783\3\2\2\2\u0783\u0786\3\2\2\2\u0784\u0782") + buf.write("\3\2\2\2\u0785\u077d\3\2\2\2\u0785\u0786\3\2\2\2\u0786") + buf.write("\u0787\3\2\2\2\u0787\u078a\7\5\2\2\u0788\u078a\5\u00bc") + buf.write("_\2\u0789\u077c\3\2\2\2\u0789\u0788\3\2\2\2\u078a}\3\2") + buf.write("\2\2\u078b\u078c\7\u00b0\2\2\u078c\u078d\7\4\2\2\u078d") + buf.write("\u078e\5\u00b4[\2\u078e\u078f\7b\2\2\u078f\u0790\5\u0080") + buf.write("A\2\u0790\u0791\7s\2\2\u0791\u0792\7\4\2\2\u0792\u0797") + buf.write("\5\u0082B\2\u0793\u0794\7\6\2\2\u0794\u0796\5\u0082B\2") + buf.write("\u0795\u0793\3\2\2\2\u0796\u0799\3\2\2\2\u0797\u0795\3") + buf.write("\2\2\2\u0797\u0798\3\2\2\2\u0798\u079a\3\2\2\2\u0799\u0797") + buf.write("\3\2\2\2\u079a\u079b\7\5\2\2\u079b\u079c\7\5\2\2\u079c") + buf.write("\177\3\2\2\2\u079d\u07aa\5\u0104\u0083\2\u079e\u079f\7") + buf.write("\4\2\2\u079f\u07a4\5\u0104\u0083\2\u07a0\u07a1\7\6\2\2") + buf.write("\u07a1\u07a3\5\u0104\u0083\2\u07a2\u07a0\3\2\2\2\u07a3") + buf.write("\u07a6\3\2\2\2\u07a4\u07a2\3\2\2\2\u07a4\u07a5\3\2\2\2") + buf.write("\u07a5\u07a7\3\2\2\2\u07a6\u07a4\3\2\2\2\u07a7\u07a8\7") + buf.write("\5\2\2\u07a8\u07aa\3\2\2\2\u07a9\u079d\3\2\2\2\u07a9\u079e") + buf.write("\3\2\2\2\u07aa\u0081\3\2\2\2\u07ab\u07b0\5\u00bc_\2\u07ac") + buf.write("\u07ae\7\30\2\2\u07ad\u07ac\3\2\2\2\u07ad\u07ae\3\2\2") + buf.write("\2\u07ae\u07af\3\2\2\2\u07af\u07b1\5\u0104\u0083\2\u07b0") + buf.write("\u07ad\3\2\2\2\u07b0\u07b1\3\2\2\2\u07b1\u0083\3\2\2\2") + buf.write("\u07b2\u07b3\7\u0082\2\2\u07b3\u07b5\7\u0103\2\2\u07b4") + buf.write("\u07b6\7\u00a6\2\2\u07b5\u07b4\3\2\2\2\u07b5\u07b6\3\2") + buf.write("\2\2\u07b6\u07b7\3\2\2\2\u07b7\u07b8\5\u00fe\u0080\2\u07b8") + buf.write("\u07c1\7\4\2\2\u07b9\u07be\5\u00bc_\2\u07ba\u07bb\7\6") + buf.write("\2\2\u07bb\u07bd\5\u00bc_\2\u07bc\u07ba\3\2\2\2\u07bd") + buf.write("\u07c0\3\2\2\2\u07be\u07bc\3\2\2\2\u07be\u07bf\3\2\2\2") + buf.write("\u07bf\u07c2\3\2\2\2\u07c0\u07be\3\2\2\2\u07c1\u07b9\3") + buf.write("\2\2\2\u07c1\u07c2\3\2\2\2\u07c2\u07c3\3\2\2\2\u07c3\u07c4") + buf.write("\7\5\2\2\u07c4\u07d0\5\u0104\u0083\2\u07c5\u07c7\7\30") + buf.write("\2\2\u07c6\u07c5\3\2\2\2\u07c6\u07c7\3\2\2\2\u07c7\u07c8") + buf.write("\3\2\2\2\u07c8\u07cd\5\u0104\u0083\2\u07c9\u07ca\7\6\2") + buf.write("\2\u07ca\u07cc\5\u0104\u0083\2\u07cb\u07c9\3\2\2\2\u07cc") + buf.write("\u07cf\3\2\2\2\u07cd\u07cb\3\2\2\2\u07cd\u07ce\3\2\2\2") + buf.write("\u07ce\u07d1\3\2\2\2\u07cf\u07cd\3\2\2\2\u07d0\u07c6\3") + buf.write("\2\2\2\u07d0\u07d1\3\2\2\2\u07d1\u0085\3\2\2\2\u07d2\u07d3") + buf.write("\t\23\2\2\u07d3\u0087\3\2\2\2\u07d4\u07d8\5\u00a0Q\2\u07d5") + buf.write("\u07d7\5\u008aF\2\u07d6\u07d5\3\2\2\2\u07d7\u07da\3\2") + buf.write("\2\2\u07d8\u07d6\3\2\2\2\u07d8\u07d9\3\2\2\2\u07d9\u0089") + buf.write("\3\2\2\2\u07da\u07d8\3\2\2\2\u07db\u07dc\5\u008cG\2\u07dc") + buf.write("\u07dd\7\177\2\2\u07dd\u07df\5\u00a0Q\2\u07de\u07e0\5") + buf.write("\u008eH\2\u07df\u07de\3\2\2\2\u07df\u07e0\3\2\2\2\u07e0") + buf.write("\u07e7\3\2\2\2\u07e1\u07e2\7\u0099\2\2\u07e2\u07e3\5\u008c") + buf.write("G\2\u07e3\u07e4\7\177\2\2\u07e4\u07e5\5\u00a0Q\2\u07e5") + buf.write("\u07e7\3\2\2\2\u07e6\u07db\3\2\2\2\u07e6\u07e1\3\2\2\2") + buf.write("\u07e7\u008b\3\2\2\2\u07e8\u07ea\7v\2\2\u07e9\u07e8\3") + buf.write("\2\2\2\u07e9\u07ea\3\2\2\2\u07ea\u0801\3\2\2\2\u07eb\u0801") + buf.write("\78\2\2\u07ec\u07ee\7\u0085\2\2\u07ed\u07ef\7\u00a6\2") + buf.write("\2\u07ee\u07ed\3\2\2\2\u07ee\u07ef\3\2\2\2\u07ef\u0801") + buf.write("\3\2\2\2\u07f0\u07f2\7\u0085\2\2\u07f1\u07f0\3\2\2\2\u07f1") + buf.write("\u07f2\3\2\2\2\u07f2\u07f3\3\2\2\2\u07f3\u0801\7\u00d1") + buf.write("\2\2\u07f4\u07f6\7\u00c6\2\2\u07f5\u07f7\7\u00a6\2\2\u07f6") + buf.write("\u07f5\3\2\2\2\u07f6\u07f7\3\2\2\2\u07f7\u0801\3\2\2\2") + buf.write("\u07f8\u07fa\7g\2\2\u07f9\u07fb\7\u00a6\2\2\u07fa\u07f9") + buf.write("\3\2\2\2\u07fa\u07fb\3\2\2\2\u07fb\u0801\3\2\2\2\u07fc") + buf.write("\u07fe\7\u0085\2\2\u07fd\u07fc\3\2\2\2\u07fd\u07fe\3\2") + buf.write("\2\2\u07fe\u07ff\3\2\2\2\u07ff\u0801\7\24\2\2\u0800\u07e9") + buf.write("\3\2\2\2\u0800\u07eb\3\2\2\2\u0800\u07ec\3\2\2\2\u0800") + buf.write("\u07f1\3\2\2\2\u0800\u07f4\3\2\2\2\u0800\u07f8\3\2\2\2") + buf.write("\u0800\u07fd\3\2\2\2\u0801\u008d\3\2\2\2\u0802\u0803\7") + buf.write("\u009f\2\2\u0803\u0807\5\u00be`\2\u0804\u0805\7\u0101") + buf.write("\2\2\u0805\u0807\5\u0094K\2\u0806\u0802\3\2\2\2\u0806") + buf.write("\u0804\3\2\2\2\u0807\u008f\3\2\2\2\u0808\u0809\7\u00e7") + buf.write("\2\2\u0809\u080b\7\4\2\2\u080a\u080c\5\u0092J\2\u080b") + buf.write("\u080a\3\2\2\2\u080b\u080c\3\2\2\2\u080c\u080d\3\2\2\2") + buf.write("\u080d\u080e\7\5\2\2\u080e\u0091\3\2\2\2\u080f\u0811\7") + buf.write("\u0113\2\2\u0810\u080f\3\2\2\2\u0810\u0811\3\2\2\2\u0811") + buf.write("\u0812\3\2\2\2\u0812\u0813\t\24\2\2\u0813\u0828\7\u00af") + buf.write("\2\2\u0814\u0815\5\u00bc_\2\u0815\u0816\7\u00cd\2\2\u0816") + buf.write("\u0828\3\2\2\2\u0817\u0818\7\36\2\2\u0818\u0819\7\u0121") + buf.write("\2\2\u0819\u081a\7\u00a5\2\2\u081a\u081b\7\u009e\2\2\u081b") + buf.write("\u0824\7\u0121\2\2\u081c\u0822\7\u009f\2\2\u081d\u0823") + buf.write("\5\u0104\u0083\2\u081e\u081f\5\u00fe\u0080\2\u081f\u0820") + buf.write("\7\4\2\2\u0820\u0821\7\5\2\2\u0821\u0823\3\2\2\2\u0822") + buf.write("\u081d\3\2\2\2\u0822\u081e\3\2\2\2\u0823\u0825\3\2\2\2") + buf.write("\u0824\u081c\3\2\2\2\u0824\u0825\3\2\2\2\u0825\u0828\3") + buf.write("\2\2\2\u0826\u0828\5\u00bc_\2\u0827\u0810\3\2\2\2\u0827") + buf.write("\u0814\3\2\2\2\u0827\u0817\3\2\2\2\u0827\u0826\3\2\2\2") + buf.write("\u0828\u0093\3\2\2\2\u0829\u082a\7\4\2\2\u082a\u082b\5") + buf.write("\u0096L\2\u082b\u082c\7\5\2\2\u082c\u0095\3\2\2\2\u082d") + buf.write("\u0832\5\u0100\u0081\2\u082e\u082f\7\6\2\2\u082f\u0831") + buf.write("\5\u0100\u0081\2\u0830\u082e\3\2\2\2\u0831\u0834\3\2\2") + buf.write("\2\u0832\u0830\3\2\2\2\u0832\u0833\3\2\2\2\u0833\u0097") + buf.write("\3\2\2\2\u0834\u0832\3\2\2\2\u0835\u0836\7\4\2\2\u0836") + buf.write("\u083b\5\u009aN\2\u0837\u0838\7\6\2\2\u0838\u083a\5\u009a") + buf.write("N\2\u0839\u0837\3\2\2\2\u083a\u083d\3\2\2\2\u083b\u0839") + buf.write("\3\2\2\2\u083b\u083c\3\2\2\2\u083c\u083e\3\2\2\2\u083d") + buf.write("\u083b\3\2\2\2\u083e\u083f\7\5\2\2\u083f\u0099\3\2\2\2") + buf.write("\u0840\u0842\5\u0100\u0081\2\u0841\u0843\t\21\2\2\u0842") + buf.write("\u0841\3\2\2\2\u0842\u0843\3\2\2\2\u0843\u009b\3\2\2\2") + buf.write("\u0844\u0845\7\4\2\2\u0845\u084a\5\u009eP\2\u0846\u0847") + buf.write("\7\6\2\2\u0847\u0849\5\u009eP\2\u0848\u0846\3\2\2\2\u0849") + buf.write("\u084c\3\2\2\2\u084a\u0848\3\2\2\2\u084a\u084b\3\2\2\2") + buf.write("\u084b\u084d\3\2\2\2\u084c\u084a\3\2\2\2\u084d\u084e\7") + buf.write("\5\2\2\u084e\u009d\3\2\2\2\u084f\u0851\5\u0104\u0083\2") + buf.write("\u0850\u0852\5\36\20\2\u0851\u0850\3\2\2\2\u0851\u0852") + buf.write("\3\2\2\2\u0852\u009f\3\2\2\2\u0853\u0855\5\u00acW\2\u0854") + buf.write("\u0856\5\u0090I\2\u0855\u0854\3\2\2\2\u0855\u0856\3\2") + buf.write("\2\2\u0856\u0857\3\2\2\2\u0857\u0858\5\u00a6T\2\u0858") + buf.write("\u086c\3\2\2\2\u0859\u085a\7\4\2\2\u085a\u085b\5 \21\2") + buf.write("\u085b\u085d\7\5\2\2\u085c\u085e\5\u0090I\2\u085d\u085c") + buf.write("\3\2\2\2\u085d\u085e\3\2\2\2\u085e\u085f\3\2\2\2\u085f") + buf.write("\u0860\5\u00a6T\2\u0860\u086c\3\2\2\2\u0861\u0862\7\4") + buf.write("\2\2\u0862\u0863\5\u0088E\2\u0863\u0865\7\5\2\2\u0864") + buf.write("\u0866\5\u0090I\2\u0865\u0864\3\2\2\2\u0865\u0866\3\2") + buf.write("\2\2\u0866\u0867\3\2\2\2\u0867\u0868\5\u00a6T\2\u0868") + buf.write("\u086c\3\2\2\2\u0869\u086c\5\u00a2R\2\u086a\u086c\5\u00a4") + buf.write("S\2\u086b\u0853\3\2\2\2\u086b\u0859\3\2\2\2\u086b\u0861") + buf.write("\3\2\2\2\u086b\u0869\3\2\2\2\u086b\u086a\3\2\2\2\u086c") + buf.write("\u00a1\3\2\2\2\u086d\u086e\7\u0102\2\2\u086e\u0873\5\u00bc") + buf.write("_\2\u086f\u0870\7\6\2\2\u0870\u0872\5\u00bc_\2\u0871\u086f") + buf.write("\3\2\2\2\u0872\u0875\3\2\2\2\u0873\u0871\3\2\2\2\u0873") + buf.write("\u0874\3\2\2\2\u0874\u0876\3\2\2\2\u0875\u0873\3\2\2\2") + buf.write("\u0876\u0877\5\u00a6T\2\u0877\u00a3\3\2\2\2\u0878\u0879") + buf.write("\5\u0100\u0081\2\u0879\u0882\7\4\2\2\u087a\u087f\5\u00bc") + buf.write("_\2\u087b\u087c\7\6\2\2\u087c\u087e\5\u00bc_\2\u087d\u087b") + buf.write("\3\2\2\2\u087e\u0881\3\2\2\2\u087f\u087d\3\2\2\2\u087f") + buf.write("\u0880\3\2\2\2\u0880\u0883\3\2\2\2\u0881\u087f\3\2\2\2") + buf.write("\u0882\u087a\3\2\2\2\u0882\u0883\3\2\2\2\u0883\u0884\3") + buf.write("\2\2\2\u0884\u0885\7\5\2\2\u0885\u0886\5\u00a6T\2\u0886") + buf.write("\u00a5\3\2\2\2\u0887\u0889\7\30\2\2\u0888\u0887\3\2\2") + buf.write("\2\u0888\u0889\3\2\2\2\u0889\u088a\3\2\2\2\u088a\u088c") + buf.write("\5\u0106\u0084\2\u088b\u088d\5\u0094K\2\u088c\u088b\3") + buf.write("\2\2\2\u088c\u088d\3\2\2\2\u088d\u088f\3\2\2\2\u088e\u0888") + buf.write("\3\2\2\2\u088e\u088f\3\2\2\2\u088f\u00a7\3\2\2\2\u0890") + buf.write("\u0891\7\u00cc\2\2\u0891\u0892\7d\2\2\u0892\u0893\7\u00d3") + buf.write("\2\2\u0893\u0897\7\u011d\2\2\u0894\u0895\7\u0108\2\2\u0895") + buf.write("\u0896\7\u00d4\2\2\u0896\u0898\58\35\2\u0897\u0894\3\2") + buf.write("\2\2\u0897\u0898\3\2\2\2\u0898\u08c2\3\2\2\2\u0899\u089a") + buf.write("\7\u00cc\2\2\u089a\u089b\7d\2\2\u089b\u08a5\7F\2\2\u089c") + buf.write("\u089d\7]\2\2\u089d\u089e\7\u00ea\2\2\u089e\u089f\7 \2") + buf.write("\2\u089f\u08a3\7\u011d\2\2\u08a0\u08a1\7R\2\2\u08a1\u08a2") + buf.write("\7 \2\2\u08a2\u08a4\7\u011d\2\2\u08a3\u08a0\3\2\2\2\u08a3") + buf.write("\u08a4\3\2\2\2\u08a4\u08a6\3\2\2\2\u08a5\u089c\3\2\2\2") + buf.write("\u08a5\u08a6\3\2\2\2\u08a6\u08ac\3\2\2\2\u08a7\u08a8\7") + buf.write(",\2\2\u08a8\u08a9\7~\2\2\u08a9\u08aa\7\u00ea\2\2\u08aa") + buf.write("\u08ab\7 \2\2\u08ab\u08ad\7\u011d\2\2\u08ac\u08a7\3\2") + buf.write("\2\2\u08ac\u08ad\3\2\2\2\u08ad\u08b3\3\2\2\2\u08ae\u08af") + buf.write("\7\u0091\2\2\u08af\u08b0\7\u0080\2\2\u08b0\u08b1\7\u00ea") + buf.write("\2\2\u08b1\u08b2\7 \2\2\u08b2\u08b4\7\u011d\2\2\u08b3") + buf.write("\u08ae\3\2\2\2\u08b3\u08b4\3\2\2\2\u08b4\u08b9\3\2\2\2") + buf.write("\u08b5\u08b6\7\u0088\2\2\u08b6\u08b7\7\u00ea\2\2\u08b7") + buf.write("\u08b8\7 \2\2\u08b8\u08ba\7\u011d\2\2\u08b9\u08b5\3\2") + buf.write("\2\2\u08b9\u08ba\3\2\2\2\u08ba\u08bf\3\2\2\2\u08bb\u08bc") + buf.write("\7\u009c\2\2\u08bc\u08bd\7D\2\2\u08bd\u08be\7\30\2\2\u08be") + buf.write("\u08c0\7\u011d\2\2\u08bf\u08bb\3\2\2\2\u08bf\u08c0\3\2") + buf.write("\2\2\u08c0\u08c2\3\2\2\2\u08c1\u0890\3\2\2\2\u08c1\u0899") + buf.write("\3\2\2\2\u08c2\u00a9\3\2\2\2\u08c3\u08c8\5\u00acW\2\u08c4") + buf.write("\u08c5\7\6\2\2\u08c5\u08c7\5\u00acW\2\u08c6\u08c4\3\2") + buf.write("\2\2\u08c7\u08ca\3\2\2\2\u08c8\u08c6\3\2\2\2\u08c8\u08c9") + buf.write("\3\2\2\2\u08c9\u00ab\3\2\2\2\u08ca\u08c8\3\2\2\2\u08cb") + buf.write("\u08d0\5\u0100\u0081\2\u08cc\u08cd\7\7\2\2\u08cd\u08cf") + buf.write("\5\u0100\u0081\2\u08ce\u08cc\3\2\2\2\u08cf\u08d2\3\2\2") + buf.write("\2\u08d0\u08ce\3\2\2\2\u08d0\u08d1\3\2\2\2\u08d1\u00ad") + buf.write("\3\2\2\2\u08d2\u08d0\3\2\2\2\u08d3\u08d4\5\u0100\u0081") + buf.write("\2\u08d4\u08d5\7\7\2\2\u08d5\u08d7\3\2\2\2\u08d6\u08d3") + buf.write("\3\2\2\2\u08d6\u08d7\3\2\2\2\u08d7\u08d8\3\2\2\2\u08d8") + buf.write("\u08d9\5\u0100\u0081\2\u08d9\u00af\3\2\2\2\u08da\u08db") + buf.write("\5\u0100\u0081\2\u08db\u08dc\7\7\2\2\u08dc\u08de\3\2\2") + buf.write("\2\u08dd\u08da\3\2\2\2\u08dd\u08de\3\2\2\2\u08de\u08df") + buf.write("\3\2\2\2\u08df\u08e0\5\u0100\u0081\2\u08e0\u00b1\3\2\2") + buf.write("\2\u08e1\u08e9\5\u00bc_\2\u08e2\u08e4\7\30\2\2\u08e3\u08e2") + buf.write("\3\2\2\2\u08e3\u08e4\3\2\2\2\u08e4\u08e7\3\2\2\2\u08e5") + buf.write("\u08e8\5\u0100\u0081\2\u08e6\u08e8\5\u0094K\2\u08e7\u08e5") + buf.write("\3\2\2\2\u08e7\u08e6\3\2\2\2\u08e8\u08ea\3\2\2\2\u08e9") + buf.write("\u08e3\3\2\2\2\u08e9\u08ea\3\2\2\2\u08ea\u00b3\3\2\2\2") + buf.write("\u08eb\u08f0\5\u00b2Z\2\u08ec\u08ed\7\6\2\2\u08ed\u08ef") + buf.write("\5\u00b2Z\2\u08ee\u08ec\3\2\2\2\u08ef\u08f2\3\2\2\2\u08f0") + buf.write("\u08ee\3\2\2\2\u08f0\u08f1\3\2\2\2\u08f1\u00b5\3\2\2\2") + buf.write("\u08f2\u08f0\3\2\2\2\u08f3\u08f4\7\4\2\2\u08f4\u08f9\5") + buf.write("\u00b8]\2\u08f5\u08f6\7\6\2\2\u08f6\u08f8\5\u00b8]\2\u08f7") + buf.write("\u08f5\3\2\2\2\u08f8\u08fb\3\2\2\2\u08f9\u08f7\3\2\2\2") + buf.write("\u08f9\u08fa\3\2\2\2\u08fa\u08fc\3\2\2\2\u08fb\u08f9\3") + buf.write("\2\2\2\u08fc\u08fd\7\5\2\2\u08fd\u00b7\3\2\2\2\u08fe\u090c") + buf.write("\5\u00fe\u0080\2\u08ff\u0900\5\u0104\u0083\2\u0900\u0901") + buf.write("\7\4\2\2\u0901\u0906\5\u00ba^\2\u0902\u0903\7\6\2\2\u0903") + buf.write("\u0905\5\u00ba^\2\u0904\u0902\3\2\2\2\u0905\u0908\3\2") + buf.write("\2\2\u0906\u0904\3\2\2\2\u0906\u0907\3\2\2\2\u0907\u0909") + buf.write("\3\2\2\2\u0908\u0906\3\2\2\2\u0909\u090a\7\5\2\2\u090a") + buf.write("\u090c\3\2\2\2\u090b\u08fe\3\2\2\2\u090b\u08ff\3\2\2\2") + buf.write("\u090c\u00b9\3\2\2\2\u090d\u0910\5\u00fe\u0080\2\u090e") + buf.write("\u0910\5\u00c6d\2\u090f\u090d\3\2\2\2\u090f\u090e\3\2") + buf.write("\2\2\u0910\u00bb\3\2\2\2\u0911\u0912\5\u00be`\2\u0912") + buf.write("\u00bd\3\2\2\2\u0913\u0914\b`\1\2\u0914\u0915\7\u009b") + buf.write("\2\2\u0915\u0920\5\u00be`\7\u0916\u0917\7U\2\2\u0917\u0918") + buf.write("\7\4\2\2\u0918\u0919\5 \21\2\u0919\u091a\7\5\2\2\u091a") + buf.write("\u0920\3\2\2\2\u091b\u091d\5\u00c2b\2\u091c\u091e\5\u00c0") + buf.write("a\2\u091d\u091c\3\2\2\2\u091d\u091e\3\2\2\2\u091e\u0920") + buf.write("\3\2\2\2\u091f\u0913\3\2\2\2\u091f\u0916\3\2\2\2\u091f") + buf.write("\u091b\3\2\2\2\u0920\u0929\3\2\2\2\u0921\u0922\f\4\2\2") + buf.write("\u0922\u0923\7\23\2\2\u0923\u0928\5\u00be`\5\u0924\u0925") + buf.write("\f\3\2\2\u0925\u0926\7\u00a3\2\2\u0926\u0928\5\u00be`") + buf.write("\4\u0927\u0921\3\2\2\2\u0927\u0924\3\2\2\2\u0928\u092b") + buf.write("\3\2\2\2\u0929\u0927\3\2\2\2\u0929\u092a\3\2\2\2\u092a") + buf.write("\u00bf\3\2\2\2\u092b\u0929\3\2\2\2\u092c\u092e\7\u009b") + buf.write("\2\2\u092d\u092c\3\2\2\2\u092d\u092e\3\2\2\2\u092e\u092f") + buf.write("\3\2\2\2\u092f\u0930\7\34\2\2\u0930\u0931\5\u00c2b\2\u0931") + buf.write("\u0932\7\23\2\2\u0932\u0933\5\u00c2b\2\u0933\u097f\3\2") + buf.write("\2\2\u0934\u0936\7\u009b\2\2\u0935\u0934\3\2\2\2\u0935") + buf.write("\u0936\3\2\2\2\u0936\u0937\3\2\2\2\u0937\u0938\7s\2\2") + buf.write("\u0938\u0939\7\4\2\2\u0939\u093e\5\u00bc_\2\u093a\u093b") + buf.write("\7\6\2\2\u093b\u093d\5\u00bc_\2\u093c\u093a\3\2\2\2\u093d") + buf.write("\u0940\3\2\2\2\u093e\u093c\3\2\2\2\u093e\u093f\3\2\2\2") + buf.write("\u093f\u0941\3\2\2\2\u0940\u093e\3\2\2\2\u0941\u0942\7") + buf.write("\5\2\2\u0942\u097f\3\2\2\2\u0943\u0945\7\u009b\2\2\u0944") + buf.write("\u0943\3\2\2\2\u0944\u0945\3\2\2\2\u0945\u0946\3\2\2\2") + buf.write("\u0946\u0947\7s\2\2\u0947\u0948\7\4\2\2\u0948\u0949\5") + buf.write(" \21\2\u0949\u094a\7\5\2\2\u094a\u097f\3\2\2\2\u094b\u094d") + buf.write("\7\u009b\2\2\u094c\u094b\3\2\2\2\u094c\u094d\3\2\2\2\u094d") + buf.write("\u094e\3\2\2\2\u094e\u094f\7\u00c7\2\2\u094f\u097f\5\u00c2") + buf.write("b\2\u0950\u0952\7\u009b\2\2\u0951\u0950\3\2\2\2\u0951") + buf.write("\u0952\3\2\2\2\u0952\u0953\3\2\2\2\u0953\u0954\7\u0086") + buf.write("\2\2\u0954\u0962\t\25\2\2\u0955\u0956\7\4\2\2\u0956\u0963") + buf.write("\7\5\2\2\u0957\u0958\7\4\2\2\u0958\u095d\5\u00bc_\2\u0959") + buf.write("\u095a\7\6\2\2\u095a\u095c\5\u00bc_\2\u095b\u0959\3\2") + buf.write("\2\2\u095c\u095f\3\2\2\2\u095d\u095b\3\2\2\2\u095d\u095e") + buf.write("\3\2\2\2\u095e\u0960\3\2\2\2\u095f\u095d\3\2\2\2\u0960") + buf.write("\u0961\7\5\2\2\u0961\u0963\3\2\2\2\u0962\u0955\3\2\2\2") + buf.write("\u0962\u0957\3\2\2\2\u0963\u097f\3\2\2\2\u0964\u0966\7") + buf.write("\u009b\2\2\u0965\u0964\3\2\2\2\u0965\u0966\3\2\2\2\u0966") + buf.write("\u0967\3\2\2\2\u0967\u0968\7\u0086\2\2\u0968\u096b\5\u00c2") + buf.write("b\2\u0969\u096a\7Q\2\2\u096a\u096c\7\u011d\2\2\u096b\u0969") + buf.write("\3\2\2\2\u096b\u096c\3\2\2\2\u096c\u097f\3\2\2\2\u096d") + buf.write("\u096f\7}\2\2\u096e\u0970\7\u009b\2\2\u096f\u096e\3\2") + buf.write("\2\2\u096f\u0970\3\2\2\2\u0970\u0971\3\2\2\2\u0971\u097f") + buf.write("\7\u009c\2\2\u0972\u0974\7}\2\2\u0973\u0975\7\u009b\2") + buf.write("\2\u0974\u0973\3\2\2\2\u0974\u0975\3\2\2\2\u0975\u0976") + buf.write("\3\2\2\2\u0976\u097f\t\26\2\2\u0977\u0979\7}\2\2\u0978") + buf.write("\u097a\7\u009b\2\2\u0979\u0978\3\2\2\2\u0979\u097a\3\2") + buf.write("\2\2\u097a\u097b\3\2\2\2\u097b\u097c\7L\2\2\u097c\u097d") + buf.write("\7f\2\2\u097d\u097f\5\u00c2b\2\u097e\u092d\3\2\2\2\u097e") + buf.write("\u0935\3\2\2\2\u097e\u0944\3\2\2\2\u097e\u094c\3\2\2\2") + buf.write("\u097e\u0951\3\2\2\2\u097e\u0965\3\2\2\2\u097e\u096d\3") + buf.write("\2\2\2\u097e\u0972\3\2\2\2\u097e\u0977\3\2\2\2\u097f\u00c1") + buf.write("\3\2\2\2\u0980\u0981\bb\1\2\u0981\u0985\5\u00c4c\2\u0982") + buf.write("\u0983\t\27\2\2\u0983\u0985\5\u00c2b\t\u0984\u0980\3\2") + buf.write("\2\2\u0984\u0982\3\2\2\2\u0985\u099b\3\2\2\2\u0986\u0987") + buf.write("\f\b\2\2\u0987\u0988\t\30\2\2\u0988\u099a\5\u00c2b\t\u0989") + buf.write("\u098a\f\7\2\2\u098a\u098b\t\31\2\2\u098b\u099a\5\u00c2") + buf.write("b\b\u098c\u098d\f\6\2\2\u098d\u098e\7\u0119\2\2\u098e") + buf.write("\u099a\5\u00c2b\7\u098f\u0990\f\5\2\2\u0990\u0991\7\u011c") + buf.write("\2\2\u0991\u099a\5\u00c2b\6\u0992\u0993\f\4\2\2\u0993") + buf.write("\u0994\7\u011a\2\2\u0994\u099a\5\u00c2b\5\u0995\u0996") + buf.write("\f\3\2\2\u0996\u0997\5\u00c8e\2\u0997\u0998\5\u00c2b\4") + buf.write("\u0998\u099a\3\2\2\2\u0999\u0986\3\2\2\2\u0999\u0989\3") + buf.write("\2\2\2\u0999\u098c\3\2\2\2\u0999\u098f\3\2\2\2\u0999\u0992") + buf.write("\3\2\2\2\u0999\u0995\3\2\2\2\u099a\u099d\3\2\2\2\u099b") + buf.write("\u0999\3\2\2\2\u099b\u099c\3\2\2\2\u099c\u00c3\3\2\2\2") + buf.write("\u099d\u099b\3\2\2\2\u099e\u099f\bc\1\2\u099f\u0a57\t") + buf.write("\32\2\2\u09a0\u09a2\7#\2\2\u09a1\u09a3\5\u00eex\2\u09a2") + buf.write("\u09a1\3\2\2\2\u09a3\u09a4\3\2\2\2\u09a4\u09a2\3\2\2\2") + buf.write("\u09a4\u09a5\3\2\2\2\u09a5\u09a8\3\2\2\2\u09a6\u09a7\7") + buf.write("O\2\2\u09a7\u09a9\5\u00bc_\2\u09a8\u09a6\3\2\2\2\u09a8") + buf.write("\u09a9\3\2\2\2\u09a9\u09aa\3\2\2\2\u09aa\u09ab\7P\2\2") + buf.write("\u09ab\u0a57\3\2\2\2\u09ac\u09ad\7#\2\2\u09ad\u09af\5") + buf.write("\u00bc_\2\u09ae\u09b0\5\u00eex\2\u09af\u09ae\3\2\2\2\u09b0") + buf.write("\u09b1\3\2\2\2\u09b1\u09af\3\2\2\2\u09b1\u09b2\3\2\2\2") + buf.write("\u09b2\u09b5\3\2\2\2\u09b3\u09b4\7O\2\2\u09b4\u09b6\5") + buf.write("\u00bc_\2\u09b5\u09b3\3\2\2\2\u09b5\u09b6\3\2\2\2\u09b6") + buf.write("\u09b7\3\2\2\2\u09b7\u09b8\7P\2\2\u09b8\u0a57\3\2\2\2") + buf.write("\u09b9\u09ba\7$\2\2\u09ba\u09bb\7\4\2\2\u09bb\u09bc\5") + buf.write("\u00bc_\2\u09bc\u09bd\7\30\2\2\u09bd\u09be\5\u00e0q\2") + buf.write("\u09be\u09bf\7\5\2\2\u09bf\u0a57\3\2\2\2\u09c0\u09c1\7") + buf.write("\u00e2\2\2\u09c1\u09ca\7\4\2\2\u09c2\u09c7\5\u00b2Z\2") + buf.write("\u09c3\u09c4\7\6\2\2\u09c4\u09c6\5\u00b2Z\2\u09c5\u09c3") + buf.write("\3\2\2\2\u09c6\u09c9\3\2\2\2\u09c7\u09c5\3\2\2\2\u09c7") + buf.write("\u09c8\3\2\2\2\u09c8\u09cb\3\2\2\2\u09c9\u09c7\3\2\2\2") + buf.write("\u09ca\u09c2\3\2\2\2\u09ca\u09cb\3\2\2\2\u09cb\u09cc\3") + buf.write("\2\2\2\u09cc\u0a57\7\5\2\2\u09cd\u09ce\7`\2\2\u09ce\u09cf") + buf.write("\7\4\2\2\u09cf\u09d2\5\u00bc_\2\u09d0\u09d1\7q\2\2\u09d1") + buf.write("\u09d3\7\u009d\2\2\u09d2\u09d0\3\2\2\2\u09d2\u09d3\3\2") + buf.write("\2\2\u09d3\u09d4\3\2\2\2\u09d4\u09d5\7\5\2\2\u09d5\u0a57") + buf.write("\3\2\2\2\u09d6\u09d7\7\u0081\2\2\u09d7\u09d8\7\4\2\2\u09d8") + buf.write("\u09db\5\u00bc_\2\u09d9\u09da\7q\2\2\u09da\u09dc\7\u009d") + buf.write("\2\2\u09db\u09d9\3\2\2\2\u09db\u09dc\3\2\2\2\u09dc\u09dd") + buf.write("\3\2\2\2\u09dd\u09de\7\5\2\2\u09de\u0a57\3\2\2\2\u09df") + buf.write("\u09e0\7\u00b2\2\2\u09e0\u09e1\7\4\2\2\u09e1\u09e2\5\u00c2") + buf.write("b\2\u09e2\u09e3\7s\2\2\u09e3\u09e4\5\u00c2b\2\u09e4\u09e5") + buf.write("\7\5\2\2\u09e5\u0a57\3\2\2\2\u09e6\u0a57\5\u00c6d\2\u09e7") + buf.write("\u0a57\7\u0114\2\2\u09e8\u09e9\5\u00fe\u0080\2\u09e9\u09ea") + buf.write("\7\7\2\2\u09ea\u09eb\7\u0114\2\2\u09eb\u0a57\3\2\2\2\u09ec") + buf.write("\u09ed\7\4\2\2\u09ed\u09f0\5\u00b2Z\2\u09ee\u09ef\7\6") + buf.write("\2\2\u09ef\u09f1\5\u00b2Z\2\u09f0\u09ee\3\2\2\2\u09f1") + buf.write("\u09f2\3\2\2\2\u09f2\u09f0\3\2\2\2\u09f2\u09f3\3\2\2\2") + buf.write("\u09f3\u09f4\3\2\2\2\u09f4\u09f5\7\5\2\2\u09f5\u0a57\3") + buf.write("\2\2\2\u09f6\u09f7\7\4\2\2\u09f7\u09f8\5 \21\2\u09f8\u09f9") + buf.write("\7\5\2\2\u09f9\u0a57\3\2\2\2\u09fa\u09fb\5\u00fc\177\2") + buf.write("\u09fb\u0a07\7\4\2\2\u09fc\u09fe\5\u0086D\2\u09fd\u09fc") + buf.write("\3\2\2\2\u09fd\u09fe\3\2\2\2\u09fe\u09ff\3\2\2\2\u09ff") + buf.write("\u0a04\5\u00bc_\2\u0a00\u0a01\7\6\2\2\u0a01\u0a03\5\u00bc") + buf.write("_\2\u0a02\u0a00\3\2\2\2\u0a03\u0a06\3\2\2\2\u0a04\u0a02") + buf.write("\3\2\2\2\u0a04\u0a05\3\2\2\2\u0a05\u0a08\3\2\2\2\u0a06") + buf.write("\u0a04\3\2\2\2\u0a07\u09fd\3\2\2\2\u0a07\u0a08\3\2\2\2") + buf.write("\u0a08\u0a09\3\2\2\2\u0a09\u0a10\7\5\2\2\u0a0a\u0a0b\7") + buf.write("^\2\2\u0a0b\u0a0c\7\4\2\2\u0a0c\u0a0d\7\u0106\2\2\u0a0d") + buf.write("\u0a0e\5\u00be`\2\u0a0e\u0a0f\7\5\2\2\u0a0f\u0a11\3\2") + buf.write("\2\2\u0a10\u0a0a\3\2\2\2\u0a10\u0a11\3\2\2\2\u0a11\u0a14") + buf.write("\3\2\2\2\u0a12\u0a13\7\u00a8\2\2\u0a13\u0a15\5\u00f4{") + buf.write("\2\u0a14\u0a12\3\2\2\2\u0a14\u0a15\3\2\2\2\u0a15\u0a57") + buf.write("\3\2\2\2\u0a16\u0a17\5\u0104\u0083\2\u0a17\u0a18\7\n\2") + buf.write("\2\u0a18\u0a19\5\u00bc_\2\u0a19\u0a57\3\2\2\2\u0a1a\u0a1b") + buf.write("\7\4\2\2\u0a1b\u0a1e\5\u0104\u0083\2\u0a1c\u0a1d\7\6\2") + buf.write("\2\u0a1d\u0a1f\5\u0104\u0083\2\u0a1e\u0a1c\3\2\2\2\u0a1f") + buf.write("\u0a20\3\2\2\2\u0a20\u0a1e\3\2\2\2\u0a20\u0a21\3\2\2\2") + buf.write("\u0a21\u0a22\3\2\2\2\u0a22\u0a23\7\5\2\2\u0a23\u0a24\7") + buf.write("\n\2\2\u0a24\u0a25\5\u00bc_\2\u0a25\u0a57\3\2\2\2\u0a26") + buf.write("\u0a57\5\u0104\u0083\2\u0a27\u0a28\7\4\2\2\u0a28\u0a29") + buf.write("\5\u00bc_\2\u0a29\u0a2a\7\5\2\2\u0a2a\u0a57\3\2\2\2\u0a2b") + buf.write("\u0a2c\7Z\2\2\u0a2c\u0a2d\7\4\2\2\u0a2d\u0a2e\5\u0104") + buf.write("\u0083\2\u0a2e\u0a2f\7f\2\2\u0a2f\u0a30\5\u00c2b\2\u0a30") + buf.write("\u0a31\7\5\2\2\u0a31\u0a57\3\2\2\2\u0a32\u0a33\t\33\2") + buf.write("\2\u0a33\u0a34\7\4\2\2\u0a34\u0a35\5\u00c2b\2\u0a35\u0a36") + buf.write("\t\34\2\2\u0a36\u0a39\5\u00c2b\2\u0a37\u0a38\t\35\2\2") + buf.write("\u0a38\u0a3a\5\u00c2b\2\u0a39\u0a37\3\2\2\2\u0a39\u0a3a") + buf.write("\3\2\2\2\u0a3a\u0a3b\3\2\2\2\u0a3b\u0a3c\7\5\2\2\u0a3c") + buf.write("\u0a57\3\2\2\2\u0a3d\u0a3e\7\u00f2\2\2\u0a3e\u0a40\7\4") + buf.write("\2\2\u0a3f\u0a41\t\36\2\2\u0a40\u0a3f\3\2\2\2\u0a40\u0a41") + buf.write("\3\2\2\2\u0a41\u0a43\3\2\2\2\u0a42\u0a44\5\u00c2b\2\u0a43") + buf.write("\u0a42\3\2\2\2\u0a43\u0a44\3\2\2\2\u0a44\u0a45\3\2\2\2") + buf.write("\u0a45\u0a46\7f\2\2\u0a46\u0a47\5\u00c2b\2\u0a47\u0a48") + buf.write("\7\5\2\2\u0a48\u0a57\3\2\2\2\u0a49\u0a4a\7\u00aa\2\2\u0a4a") + buf.write("\u0a4b\7\4\2\2\u0a4b\u0a4c\5\u00c2b\2\u0a4c\u0a4d\7\u00b1") + buf.write("\2\2\u0a4d\u0a4e\5\u00c2b\2\u0a4e\u0a4f\7f\2\2\u0a4f\u0a52") + buf.write("\5\u00c2b\2\u0a50\u0a51\7b\2\2\u0a51\u0a53\5\u00c2b\2") + buf.write("\u0a52\u0a50\3\2\2\2\u0a52\u0a53\3\2\2\2\u0a53\u0a54\3") + buf.write("\2\2\2\u0a54\u0a55\7\5\2\2\u0a55\u0a57\3\2\2\2\u0a56\u099e") + buf.write("\3\2\2\2\u0a56\u09a0\3\2\2\2\u0a56\u09ac\3\2\2\2\u0a56") + buf.write("\u09b9\3\2\2\2\u0a56\u09c0\3\2\2\2\u0a56\u09cd\3\2\2\2") + buf.write("\u0a56\u09d6\3\2\2\2\u0a56\u09df\3\2\2\2\u0a56\u09e6\3") + buf.write("\2\2\2\u0a56\u09e7\3\2\2\2\u0a56\u09e8\3\2\2\2\u0a56\u09ec") + buf.write("\3\2\2\2\u0a56\u09f6\3\2\2\2\u0a56\u09fa\3\2\2\2\u0a56") + buf.write("\u0a16\3\2\2\2\u0a56\u0a1a\3\2\2\2\u0a56\u0a26\3\2\2\2") + buf.write("\u0a56\u0a27\3\2\2\2\u0a56\u0a2b\3\2\2\2\u0a56\u0a32\3") + buf.write("\2\2\2\u0a56\u0a3d\3\2\2\2\u0a56\u0a49\3\2\2\2\u0a57\u0a62") + buf.write("\3\2\2\2\u0a58\u0a59\f\n\2\2\u0a59\u0a5a\7\13\2\2\u0a5a") + buf.write("\u0a5b\5\u00c2b\2\u0a5b\u0a5c\7\f\2\2\u0a5c\u0a61\3\2") + buf.write("\2\2\u0a5d\u0a5e\f\b\2\2\u0a5e\u0a5f\7\7\2\2\u0a5f\u0a61") + buf.write("\5\u0104\u0083\2\u0a60\u0a58\3\2\2\2\u0a60\u0a5d\3\2\2") + buf.write("\2\u0a61\u0a64\3\2\2\2\u0a62\u0a60\3\2\2\2\u0a62\u0a63") + buf.write("\3\2\2\2\u0a63\u00c5\3\2\2\2\u0a64\u0a62\3\2\2\2\u0a65") + buf.write("\u0a72\7\u009c\2\2\u0a66\u0a72\5\u00d0i\2\u0a67\u0a68") + buf.write("\5\u0104\u0083\2\u0a68\u0a69\7\u011d\2\2\u0a69\u0a72\3") + buf.write("\2\2\2\u0a6a\u0a72\5\u010a\u0086\2\u0a6b\u0a72\5\u00ce") + buf.write("h\2\u0a6c\u0a6e\7\u011d\2\2\u0a6d\u0a6c\3\2\2\2\u0a6e") + buf.write("\u0a6f\3\2\2\2\u0a6f\u0a6d\3\2\2\2\u0a6f\u0a70\3\2\2\2") + buf.write("\u0a70\u0a72\3\2\2\2\u0a71\u0a65\3\2\2\2\u0a71\u0a66\3") + buf.write("\2\2\2\u0a71\u0a67\3\2\2\2\u0a71\u0a6a\3\2\2\2\u0a71\u0a6b") + buf.write("\3\2\2\2\u0a71\u0a6d\3\2\2\2\u0a72\u00c7\3\2\2\2\u0a73") + buf.write("\u0a74\t\37\2\2\u0a74\u00c9\3\2\2\2\u0a75\u0a76\t \2\2") + buf.write("\u0a76\u00cb\3\2\2\2\u0a77\u0a78\t!\2\2\u0a78\u00cd\3") + buf.write("\2\2\2\u0a79\u0a7a\t\"\2\2\u0a7a\u00cf\3\2\2\2\u0a7b\u0a7e") + buf.write("\7{\2\2\u0a7c\u0a7f\5\u00d2j\2\u0a7d\u0a7f\5\u00d6l\2") + buf.write("\u0a7e\u0a7c\3\2\2\2\u0a7e\u0a7d\3\2\2\2\u0a7e\u0a7f\3") + buf.write("\2\2\2\u0a7f\u00d1\3\2\2\2\u0a80\u0a82\5\u00d4k\2\u0a81") + buf.write("\u0a83\5\u00d8m\2\u0a82\u0a81\3\2\2\2\u0a82\u0a83\3\2") + buf.write("\2\2\u0a83\u00d3\3\2\2\2\u0a84\u0a85\5\u00dan\2\u0a85") + buf.write("\u0a86\5\u00dco\2\u0a86\u0a88\3\2\2\2\u0a87\u0a84\3\2") + buf.write("\2\2\u0a88\u0a89\3\2\2\2\u0a89\u0a87\3\2\2\2\u0a89\u0a8a") + buf.write("\3\2\2\2\u0a8a\u00d5\3\2\2\2\u0a8b\u0a8e\5\u00d8m\2\u0a8c") + buf.write("\u0a8f\5\u00d4k\2\u0a8d\u0a8f\5\u00d8m\2\u0a8e\u0a8c\3") + buf.write("\2\2\2\u0a8e\u0a8d\3\2\2\2\u0a8e\u0a8f\3\2\2\2\u0a8f\u00d7") + buf.write("\3\2\2\2\u0a90\u0a91\5\u00dan\2\u0a91\u0a92\5\u00dco\2") + buf.write("\u0a92\u0a93\7\u00ec\2\2\u0a93\u0a94\5\u00dco\2\u0a94") + buf.write("\u00d9\3\2\2\2\u0a95\u0a97\t#\2\2\u0a96\u0a95\3\2\2\2") + buf.write("\u0a96\u0a97\3\2\2\2\u0a97\u0a98\3\2\2\2\u0a98\u0a9b\t") + buf.write("\24\2\2\u0a99\u0a9b\7\u011d\2\2\u0a9a\u0a96\3\2\2\2\u0a9a") + buf.write("\u0a99\3\2\2\2\u0a9b\u00db\3\2\2\2\u0a9c\u0aa4\7B\2\2") + buf.write("\u0a9d\u0aa4\7o\2\2\u0a9e\u0aa4\7\u0094\2\2\u0a9f\u0aa4") + buf.write("\7\u0095\2\2\u0aa0\u0aa4\7\u00cf\2\2\u0aa1\u0aa4\7\u0109") + buf.write("\2\2\u0aa2\u0aa4\5\u0104\u0083\2\u0aa3\u0a9c\3\2\2\2\u0aa3") + buf.write("\u0a9d\3\2\2\2\u0aa3\u0a9e\3\2\2\2\u0aa3\u0a9f\3\2\2\2") + buf.write("\u0aa3\u0aa0\3\2\2\2\u0aa3\u0aa1\3\2\2\2\u0aa3\u0aa2\3") + buf.write("\2\2\2\u0aa4\u00dd\3\2\2\2\u0aa5\u0aa9\7`\2\2\u0aa6\u0aa7") + buf.write("\7\17\2\2\u0aa7\u0aa9\5\u0100\u0081\2\u0aa8\u0aa5\3\2") + buf.write("\2\2\u0aa8\u0aa6\3\2\2\2\u0aa9\u00df\3\2\2\2\u0aaa\u0aab") + buf.write("\7\27\2\2\u0aab\u0aac\7\u010e\2\2\u0aac\u0aad\5\u00e0") + buf.write("q\2\u0aad\u0aae\7\u0110\2\2\u0aae\u0acd\3\2\2\2\u0aaf") + buf.write("\u0ab0\7\u0091\2\2\u0ab0\u0ab1\7\u010e\2\2\u0ab1\u0ab2") + buf.write("\5\u00e0q\2\u0ab2\u0ab3\7\6\2\2\u0ab3\u0ab4\5\u00e0q\2") + buf.write("\u0ab4\u0ab5\7\u0110\2\2\u0ab5\u0acd\3\2\2\2\u0ab6\u0abd") + buf.write("\7\u00e2\2\2\u0ab7\u0ab9\7\u010e\2\2\u0ab8\u0aba\5\u00ea") + buf.write("v\2\u0ab9\u0ab8\3\2\2\2\u0ab9\u0aba\3\2\2\2\u0aba\u0abb") + buf.write("\3\2\2\2\u0abb\u0abe\7\u0110\2\2\u0abc\u0abe\7\u010c\2") + buf.write("\2\u0abd\u0ab7\3\2\2\2\u0abd\u0abc\3\2\2\2\u0abe\u0acd") + buf.write("\3\2\2\2\u0abf\u0aca\5\u0104\u0083\2\u0ac0\u0ac1\7\4\2") + buf.write("\2\u0ac1\u0ac6\7\u0121\2\2\u0ac2\u0ac3\7\6\2\2\u0ac3\u0ac5") + buf.write("\7\u0121\2\2\u0ac4\u0ac2\3\2\2\2\u0ac5\u0ac8\3\2\2\2\u0ac6") + buf.write("\u0ac4\3\2\2\2\u0ac6\u0ac7\3\2\2\2\u0ac7\u0ac9\3\2\2\2") + buf.write("\u0ac8\u0ac6\3\2\2\2\u0ac9\u0acb\7\5\2\2\u0aca\u0ac0\3") + buf.write("\2\2\2\u0aca\u0acb\3\2\2\2\u0acb\u0acd\3\2\2\2\u0acc\u0aaa") + buf.write("\3\2\2\2\u0acc\u0aaf\3\2\2\2\u0acc\u0ab6\3\2\2\2\u0acc") + buf.write("\u0abf\3\2\2\2\u0acd\u00e1\3\2\2\2\u0ace\u0ad3\5\u00e4") + buf.write("s\2\u0acf\u0ad0\7\6\2\2\u0ad0\u0ad2\5\u00e4s\2\u0ad1\u0acf") + buf.write("\3\2\2\2\u0ad2\u0ad5\3\2\2\2\u0ad3\u0ad1\3\2\2\2\u0ad3") + buf.write("\u0ad4\3\2\2\2\u0ad4\u00e3\3\2\2\2\u0ad5\u0ad3\3\2\2\2") + buf.write("\u0ad6\u0ad7\5\u00acW\2\u0ad7\u0ada\5\u00e0q\2\u0ad8\u0ad9") + buf.write("\7\u009b\2\2\u0ad9\u0adb\7\u009c\2\2\u0ada\u0ad8\3\2\2") + buf.write("\2\u0ada\u0adb\3\2\2\2\u0adb\u0add\3\2\2\2\u0adc\u0ade") + buf.write("\5\36\20\2\u0add\u0adc\3\2\2\2\u0add\u0ade\3\2\2\2\u0ade") + buf.write("\u0ae0\3\2\2\2\u0adf\u0ae1\5\u00dep\2\u0ae0\u0adf\3\2") + buf.write("\2\2\u0ae0\u0ae1\3\2\2\2\u0ae1\u00e5\3\2\2\2\u0ae2\u0ae7") + buf.write("\5\u00e8u\2\u0ae3\u0ae4\7\6\2\2\u0ae4\u0ae6\5\u00e8u\2") + buf.write("\u0ae5\u0ae3\3\2\2\2\u0ae6\u0ae9\3\2\2\2\u0ae7\u0ae5\3") + buf.write("\2\2\2\u0ae7\u0ae8\3\2\2\2\u0ae8\u00e7\3\2\2\2\u0ae9\u0ae7") + buf.write("\3\2\2\2\u0aea\u0aeb\5\u0100\u0081\2\u0aeb\u0aee\5\u00e0") + buf.write("q\2\u0aec\u0aed\7\u009b\2\2\u0aed\u0aef\7\u009c\2\2\u0aee") + buf.write("\u0aec\3\2\2\2\u0aee\u0aef\3\2\2\2\u0aef\u0af1\3\2\2\2") + buf.write("\u0af0\u0af2\5\36\20\2\u0af1\u0af0\3\2\2\2\u0af1\u0af2") + buf.write("\3\2\2\2\u0af2\u00e9\3\2\2\2\u0af3\u0af8\5\u00ecw\2\u0af4") + buf.write("\u0af5\7\6\2\2\u0af5\u0af7\5\u00ecw\2\u0af6\u0af4\3\2") + buf.write("\2\2\u0af7\u0afa\3\2\2\2\u0af8\u0af6\3\2\2\2\u0af8\u0af9") + buf.write("\3\2\2\2\u0af9\u00eb\3\2\2\2\u0afa\u0af8\3\2\2\2\u0afb") + buf.write("\u0afc\5\u0104\u0083\2\u0afc\u0afd\7\r\2\2\u0afd\u0b00") + buf.write("\5\u00e0q\2\u0afe\u0aff\7\u009b\2\2\u0aff\u0b01\7\u009c") + buf.write("\2\2\u0b00\u0afe\3\2\2\2\u0b00\u0b01\3\2\2\2\u0b01\u0b03") + buf.write("\3\2\2\2\u0b02\u0b04\5\36\20\2\u0b03\u0b02\3\2\2\2\u0b03") + buf.write("\u0b04\3\2\2\2\u0b04\u00ed\3\2\2\2\u0b05\u0b06\7\u0105") + buf.write("\2\2\u0b06\u0b07\5\u00bc_\2\u0b07\u0b08\7\u00eb\2\2\u0b08") + buf.write("\u0b09\5\u00bc_\2\u0b09\u00ef\3\2\2\2\u0b0a\u0b0b\7\u0107") + buf.write("\2\2\u0b0b\u0b10\5\u00f2z\2\u0b0c\u0b0d\7\6\2\2\u0b0d") + buf.write("\u0b0f\5\u00f2z\2\u0b0e\u0b0c\3\2\2\2\u0b0f\u0b12\3\2") + buf.write("\2\2\u0b10\u0b0e\3\2\2\2\u0b10\u0b11\3\2\2\2\u0b11\u00f1") + buf.write("\3\2\2\2\u0b12\u0b10\3\2\2\2\u0b13\u0b14\5\u0100\u0081") + buf.write("\2\u0b14\u0b15\7\30\2\2\u0b15\u0b16\5\u00f4{\2\u0b16\u00f3") + buf.write("\3\2\2\2\u0b17\u0b46\5\u0100\u0081\2\u0b18\u0b19\7\4\2") + buf.write("\2\u0b19\u0b1a\5\u0100\u0081\2\u0b1a\u0b1b\7\5\2\2\u0b1b") + buf.write("\u0b46\3\2\2\2\u0b1c\u0b3f\7\4\2\2\u0b1d\u0b1e\7(\2\2") + buf.write("\u0b1e\u0b1f\7 \2\2\u0b1f\u0b24\5\u00bc_\2\u0b20\u0b21") + buf.write("\7\6\2\2\u0b21\u0b23\5\u00bc_\2\u0b22\u0b20\3\2\2\2\u0b23") + buf.write("\u0b26\3\2\2\2\u0b24\u0b22\3\2\2\2\u0b24\u0b25\3\2\2\2") + buf.write("\u0b25\u0b40\3\2\2\2\u0b26\u0b24\3\2\2\2\u0b27\u0b28\t") + buf.write("$\2\2\u0b28\u0b29\7 \2\2\u0b29\u0b2e\5\u00bc_\2\u0b2a") + buf.write("\u0b2b\7\6\2\2\u0b2b\u0b2d\5\u00bc_\2\u0b2c\u0b2a\3\2") + buf.write("\2\2\u0b2d\u0b30\3\2\2\2\u0b2e\u0b2c\3\2\2\2\u0b2e\u0b2f") + buf.write("\3\2\2\2\u0b2f\u0b32\3\2\2\2\u0b30\u0b2e\3\2\2\2\u0b31") + buf.write("\u0b27\3\2\2\2\u0b31\u0b32\3\2\2\2\u0b32\u0b3d\3\2\2\2") + buf.write("\u0b33\u0b34\t%\2\2\u0b34\u0b35\7 \2\2\u0b35\u0b3a\5V") + buf.write(",\2\u0b36\u0b37\7\6\2\2\u0b37\u0b39\5V,\2\u0b38\u0b36") + buf.write("\3\2\2\2\u0b39\u0b3c\3\2\2\2\u0b3a\u0b38\3\2\2\2\u0b3a") + buf.write("\u0b3b\3\2\2\2\u0b3b\u0b3e\3\2\2\2\u0b3c\u0b3a\3\2\2\2") + buf.write("\u0b3d\u0b33\3\2\2\2\u0b3d\u0b3e\3\2\2\2\u0b3e\u0b40\3") + buf.write("\2\2\2\u0b3f\u0b1d\3\2\2\2\u0b3f\u0b31\3\2\2\2\u0b40\u0b42") + buf.write("\3\2\2\2\u0b41\u0b43\5\u00f6|\2\u0b42\u0b41\3\2\2\2\u0b42") + buf.write("\u0b43\3\2\2\2\u0b43\u0b44\3\2\2\2\u0b44\u0b46\7\5\2\2") + buf.write("\u0b45\u0b17\3\2\2\2\u0b45\u0b18\3\2\2\2\u0b45\u0b1c\3") + buf.write("\2\2\2\u0b46\u00f5\3\2\2\2\u0b47\u0b48\7\u00b9\2\2\u0b48") + buf.write("\u0b58\5\u00f8}\2\u0b49\u0b4a\7\u00cd\2\2\u0b4a\u0b58") + buf.write("\5\u00f8}\2\u0b4b\u0b4c\7\u00b9\2\2\u0b4c\u0b4d\7\34\2") + buf.write("\2\u0b4d\u0b4e\5\u00f8}\2\u0b4e\u0b4f\7\23\2\2\u0b4f\u0b50") + buf.write("\5\u00f8}\2\u0b50\u0b58\3\2\2\2\u0b51\u0b52\7\u00cd\2") + buf.write("\2\u0b52\u0b53\7\34\2\2\u0b53\u0b54\5\u00f8}\2\u0b54\u0b55") + buf.write("\7\23\2\2\u0b55\u0b56\5\u00f8}\2\u0b56\u0b58\3\2\2\2\u0b57") + buf.write("\u0b47\3\2\2\2\u0b57\u0b49\3\2\2\2\u0b57\u0b4b\3\2\2\2") + buf.write("\u0b57\u0b51\3\2\2\2\u0b58\u00f7\3\2\2\2\u0b59\u0b5a\7") + buf.write("\u00f7\2\2\u0b5a\u0b61\t&\2\2\u0b5b\u0b5c\7:\2\2\u0b5c") + buf.write("\u0b61\7\u00cc\2\2\u0b5d\u0b5e\5\u00bc_\2\u0b5e\u0b5f") + buf.write("\t&\2\2\u0b5f\u0b61\3\2\2\2\u0b60\u0b59\3\2\2\2\u0b60") + buf.write("\u0b5b\3\2\2\2\u0b60\u0b5d\3\2\2\2\u0b61\u00f9\3\2\2\2") + buf.write("\u0b62\u0b67\5\u00fe\u0080\2\u0b63\u0b64\7\6\2\2\u0b64") + buf.write("\u0b66\5\u00fe\u0080\2\u0b65\u0b63\3\2\2\2\u0b66\u0b69") + buf.write("\3\2\2\2\u0b67\u0b65\3\2\2\2\u0b67\u0b68\3\2\2\2\u0b68") + buf.write("\u00fb\3\2\2\2\u0b69\u0b67\3\2\2\2\u0b6a\u0b6f\5\u00fe") + buf.write("\u0080\2\u0b6b\u0b6f\7^\2\2\u0b6c\u0b6f\7\u0085\2\2\u0b6d") + buf.write("\u0b6f\7\u00c6\2\2\u0b6e\u0b6a\3\2\2\2\u0b6e\u0b6b\3\2") + buf.write("\2\2\u0b6e\u0b6c\3\2\2\2\u0b6e\u0b6d\3\2\2\2\u0b6f\u00fd") + buf.write("\3\2\2\2\u0b70\u0b75\5\u0104\u0083\2\u0b71\u0b72\7\7\2") + buf.write("\2\u0b72\u0b74\5\u0104\u0083\2\u0b73\u0b71\3\2\2\2\u0b74") + buf.write("\u0b77\3\2\2\2\u0b75\u0b73\3\2\2\2\u0b75\u0b76\3\2\2\2") + buf.write("\u0b76\u00ff\3\2\2\2\u0b77\u0b75\3\2\2\2\u0b78\u0b79\5") + buf.write("\u0104\u0083\2\u0b79\u0b7a\5\u0102\u0082\2\u0b7a\u0101") + buf.write("\3\2\2\2\u0b7b\u0b7c\7\u0113\2\2\u0b7c\u0b7e\5\u0104\u0083") + buf.write("\2\u0b7d\u0b7b\3\2\2\2\u0b7e\u0b7f\3\2\2\2\u0b7f\u0b7d") + buf.write("\3\2\2\2\u0b7f\u0b80\3\2\2\2\u0b80\u0b83\3\2\2\2\u0b81") + buf.write("\u0b83\3\2\2\2\u0b82\u0b7d\3\2\2\2\u0b82\u0b81\3\2\2\2") + buf.write("\u0b83\u0103\3\2\2\2\u0b84\u0b88\5\u0106\u0084\2\u0b85") + buf.write("\u0b86\6\u0083\24\2\u0b86\u0b88\5\u0110\u0089\2\u0b87") + buf.write("\u0b84\3\2\2\2\u0b87\u0b85\3\2\2\2\u0b88\u0105\3\2\2\2") + buf.write("\u0b89\u0b90\7\u0126\2\2\u0b8a\u0b90\5\u0108\u0085\2\u0b8b") + buf.write("\u0b8c\6\u0084\25\2\u0b8c\u0b90\5\u010e\u0088\2\u0b8d") + buf.write("\u0b8e\6\u0084\26\2\u0b8e\u0b90\5\u0112\u008a\2\u0b8f") + buf.write("\u0b89\3\2\2\2\u0b8f\u0b8a\3\2\2\2\u0b8f\u0b8b\3\2\2\2") + buf.write("\u0b8f\u0b8d\3\2\2\2\u0b90\u0107\3\2\2\2\u0b91\u0b92\7") + buf.write("\u0127\2\2\u0b92\u0109\3\2\2\2\u0b93\u0b95\6\u0086\27") + buf.write("\2\u0b94\u0b96\7\u0113\2\2\u0b95\u0b94\3\2\2\2\u0b95\u0b96") + buf.write("\3\2\2\2\u0b96\u0b97\3\2\2\2\u0b97\u0bbb\7\u0122\2\2\u0b98") + buf.write("\u0b9a\6\u0086\30\2\u0b99\u0b9b\7\u0113\2\2\u0b9a\u0b99") + buf.write("\3\2\2\2\u0b9a\u0b9b\3\2\2\2\u0b9b\u0b9c\3\2\2\2\u0b9c") + buf.write("\u0bbb\7\u0123\2\2\u0b9d\u0b9f\6\u0086\31\2\u0b9e\u0ba0") + buf.write("\7\u0113\2\2\u0b9f\u0b9e\3\2\2\2\u0b9f\u0ba0\3\2\2\2\u0ba0") + buf.write("\u0ba1\3\2\2\2\u0ba1\u0bbb\t\'\2\2\u0ba2\u0ba4\7\u0113") + buf.write("\2\2\u0ba3\u0ba2\3\2\2\2\u0ba3\u0ba4\3\2\2\2\u0ba4\u0ba5") + buf.write("\3\2\2\2\u0ba5\u0bbb\7\u0121\2\2\u0ba6\u0ba8\7\u0113\2") + buf.write("\2\u0ba7\u0ba6\3\2\2\2\u0ba7\u0ba8\3\2\2\2\u0ba8\u0ba9") + buf.write("\3\2\2\2\u0ba9\u0bbb\7\u011e\2\2\u0baa\u0bac\7\u0113\2") + buf.write("\2\u0bab\u0baa\3\2\2\2\u0bab\u0bac\3\2\2\2\u0bac\u0bad") + buf.write("\3\2\2\2\u0bad\u0bbb\7\u011f\2\2\u0bae\u0bb0\7\u0113\2") + buf.write("\2\u0baf\u0bae\3\2\2\2\u0baf\u0bb0\3\2\2\2\u0bb0\u0bb1") + buf.write("\3\2\2\2\u0bb1\u0bbb\7\u0120\2\2\u0bb2\u0bb4\7\u0113\2") + buf.write("\2\u0bb3\u0bb2\3\2\2\2\u0bb3\u0bb4\3\2\2\2\u0bb4\u0bb5") + buf.write("\3\2\2\2\u0bb5\u0bbb\7\u0124\2\2\u0bb6\u0bb8\7\u0113\2") + buf.write("\2\u0bb7\u0bb6\3\2\2\2\u0bb7\u0bb8\3\2\2\2\u0bb8\u0bb9") + buf.write("\3\2\2\2\u0bb9\u0bbb\7\u0125\2\2\u0bba\u0b93\3\2\2\2\u0bba") + buf.write("\u0b98\3\2\2\2\u0bba\u0b9d\3\2\2\2\u0bba\u0ba3\3\2\2\2") + buf.write("\u0bba\u0ba7\3\2\2\2\u0bba\u0bab\3\2\2\2\u0bba\u0baf\3") + buf.write("\2\2\2\u0bba\u0bb3\3\2\2\2\u0bba\u0bb7\3\2\2\2\u0bbb\u010b") + buf.write("\3\2\2\2\u0bbc\u0bbd\7\u00f5\2\2\u0bbd\u0bc4\5\u00e0q") + buf.write("\2\u0bbe\u0bc4\5\36\20\2\u0bbf\u0bc4\5\u00dep\2\u0bc0") + buf.write("\u0bc1\t(\2\2\u0bc1\u0bc2\7\u009b\2\2\u0bc2\u0bc4\7\u009c") + buf.write("\2\2\u0bc3\u0bbc\3\2\2\2\u0bc3\u0bbe\3\2\2\2\u0bc3\u0bbf") + buf.write("\3\2\2\2\u0bc3\u0bc0\3\2\2\2\u0bc4\u010d\3\2\2\2\u0bc5") + buf.write("\u0bc6\t)\2\2\u0bc6\u010f\3\2\2\2\u0bc7\u0bc8\t*\2\2\u0bc8") + buf.write("\u0111\3\2\2\2\u0bc9\u0bca\t+\2\2\u0bca\u0113\3\2\2\2") + buf.write("\u018c\u0118\u0131\u0136\u013e\u0146\u0148\u015c\u0160") + buf.write("\u0166\u0169\u016c\u0174\u0177\u017b\u017e\u0186\u018b") + buf.write("\u018e\u0195\u01a1\u01aa\u01ac\u01b0\u01b3\u01ba\u01c5") + buf.write("\u01c7\u01cf\u01d4\u01d7\u01dd\u01e8\u0228\u0231\u0235") + buf.write("\u023b\u023f\u0244\u024a\u0256\u025e\u0264\u0271\u0276") + buf.write("\u0286\u028d\u0291\u0297\u02a6\u02aa\u02b0\u02b6\u02b9") + buf.write("\u02bc\u02c2\u02c6\u02ce\u02d0\u02d9\u02dc\u02e5\u02ea") + buf.write("\u02f0\u02f7\u02fa\u0300\u030b\u030e\u0312\u0317\u031c") + buf.write("\u0323\u0326\u0329\u0330\u0335\u033e\u0346\u034c\u034f") + buf.write("\u0352\u0358\u035c\u0360\u0364\u0366\u036e\u0376\u037c") + buf.write("\u0382\u0385\u0389\u038c\u0390\u03a9\u03ac\u03b0\u03b6") + buf.write("\u03b9\u03bc\u03c2\u03ca\u03cf\u03d5\u03db\u03e7\u03ea") + buf.write("\u03f1\u03f8\u0400\u0403\u040b\u040f\u0416\u048a\u0492") + buf.write("\u049a\u04a3\u04ad\u04b1\u04b4\u04ba\u04c0\u04cc\u04d8") + buf.write("\u04dd\u04e6\u04ee\u04f5\u04f7\u04fc\u0500\u0505\u050a") + buf.write("\u050f\u0512\u0517\u051b\u0520\u0522\u0526\u052f\u0537") + buf.write("\u0540\u0547\u0550\u0555\u0558\u056b\u056d\u0576\u057d") + buf.write("\u0580\u0587\u058b\u0591\u0599\u05a4\u05af\u05b6\u05bc") + buf.write("\u05c9\u05d0\u05d7\u05e3\u05eb\u05f1\u05f4\u05fd\u0600") + buf.write("\u0609\u060c\u0615\u0618\u0621\u0624\u0627\u062c\u062e") + buf.write("\u063a\u0641\u0648\u064b\u064d\u0659\u065d\u0661\u0667") + buf.write("\u066b\u0673\u0677\u067a\u067d\u0680\u0684\u0688\u068b") + buf.write("\u068f\u0694\u0698\u069b\u069e\u06a1\u06a3\u06af\u06b2") + buf.write("\u06b6\u06c0\u06c4\u06c6\u06c9\u06cd\u06d3\u06d7\u06e2") + buf.write("\u06ec\u06f8\u0707\u070c\u0713\u0723\u0728\u0735\u073a") + buf.write("\u0742\u0748\u074c\u0755\u0764\u0769\u0775\u077a\u0782") + buf.write("\u0785\u0789\u0797\u07a4\u07a9\u07ad\u07b0\u07b5\u07be") + buf.write("\u07c1\u07c6\u07cd\u07d0\u07d8\u07df\u07e6\u07e9\u07ee") + buf.write("\u07f1\u07f6\u07fa\u07fd\u0800\u0806\u080b\u0810\u0822") + buf.write("\u0824\u0827\u0832\u083b\u0842\u084a\u0851\u0855\u085d") + buf.write("\u0865\u086b\u0873\u087f\u0882\u0888\u088c\u088e\u0897") + buf.write("\u08a3\u08a5\u08ac\u08b3\u08b9\u08bf\u08c1\u08c8\u08d0") + buf.write("\u08d6\u08dd\u08e3\u08e7\u08e9\u08f0\u08f9\u0906\u090b") + buf.write("\u090f\u091d\u091f\u0927\u0929\u092d\u0935\u093e\u0944") + buf.write("\u094c\u0951\u095d\u0962\u0965\u096b\u096f\u0974\u0979") + buf.write("\u097e\u0984\u0999\u099b\u09a4\u09a8\u09b1\u09b5\u09c7") + buf.write("\u09ca\u09d2\u09db\u09f2\u09fd\u0a04\u0a07\u0a10\u0a14") + buf.write("\u0a20\u0a39\u0a40\u0a43\u0a52\u0a56\u0a60\u0a62\u0a6f") + buf.write("\u0a71\u0a7e\u0a82\u0a89\u0a8e\u0a96\u0a9a\u0aa3\u0aa8") + buf.write("\u0ab9\u0abd\u0ac6\u0aca\u0acc\u0ad3\u0ada\u0add\u0ae0") + buf.write("\u0ae7\u0aee\u0af1\u0af8\u0b00\u0b03\u0b10\u0b24\u0b2e") + buf.write("\u0b31\u0b3a\u0b3d\u0b3f\u0b42\u0b45\u0b57\u0b60\u0b67") + buf.write("\u0b6e\u0b75\u0b7f\u0b82\u0b87\u0b8f\u0b95\u0b9a\u0b9f") + buf.write("\u0ba3\u0ba7\u0bab\u0baf\u0bb3\u0bb7\u0bba\u0bc3") + return buf.getvalue() + + +class SqlBaseParser ( Parser ): + + grammarFileName = "SqlBase.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "';'", "'('", "')'", "','", "'.'", "'/*+'", + "'*/'", "'->'", "'['", "']'", "':'", "'ADD'", "'AFTER'", + "'ALL'", "'ALTER'", "'ANALYZE'", "'AND'", "'ANTI'", + "'ANY'", "'ARCHIVE'", "'ARRAY'", "'AS'", "'ASC'", "'AT'", + "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", "'BUCKET'", + "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", + "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", + "'CLUSTERED'", "'CODEGEN'", "'COLLATE'", "'COLLECTION'", + "'COLUMN'", "'COLUMNS'", "'COMMENT'", "'COMMIT'", "'COMPACT'", + "'COMPACTIONS'", "'COMPUTE'", "'CONCATENATE'", "'CONSTRAINT'", + "'COST'", "'CREATE'", "'CROSS'", "'CUBE'", "'CURRENT'", + "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", + "'CURRENT_USER'", "'DATA'", "'DATABASE'", "", + "'DAY'", "'DBPROPERTIES'", "'DEFINED'", "'DELETE'", + "'DELIMITED'", "'DESC'", "'DESCRIBE'", "'DFS'", "'DIRECTORIES'", + "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", "'DROP'", + "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", + "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", + "'EXTENDED'", "'EXTERNAL'", "'EXTRACT'", "'FALSE'", + "'FETCH'", "'FIELDS'", "'FILTER'", "'FILEFORMAT'", + "'FIRST'", "'FOLLOWING'", "'FOR'", "'FOREIGN'", "'FORMAT'", + "'FORMATTED'", "'FROM'", "'FULL'", "'FUNCTION'", "'FUNCTIONS'", + "'GLOBAL'", "'GRANT'", "'GROUP'", "'GROUPING'", "'HAVING'", + "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", "'IN'", "'INDEX'", + "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", + "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", + "'IS'", "'ITEMS'", "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", + "'LAZY'", "'LEADING'", "'LEFT'", "'LIKE'", "'LIMIT'", + "'LINES'", "'LIST'", "'LOAD'", "'LOCAL'", "'LOCATION'", + "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", "'MAP'", + "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", + "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", + "", "'NULL'", "'NULLS'", "'OF'", "'ON'", "'ONLY'", + "'OPTION'", "'OPTIONS'", "'OR'", "'ORDER'", "'OUT'", + "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", "'OVERLAPS'", + "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", + "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", + "'POSITION'", "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", + "'PROPERTIES'", "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", + "'RECORDWRITER'", "'RECOVER'", "'REDUCE'", "'REFERENCES'", + "'REFRESH'", "'RENAME'", "'REPAIR'", "'REPLACE'", "'RESET'", + "'RESTRICT'", "'REVOKE'", "'RIGHT'", "", "'ROLE'", + "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", "'ROWS'", + "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", + "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", + "'MINUS'", "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", + "'SORT'", "'SORTED'", "'START'", "'STATISTICS'", "'STORED'", + "'STRATIFY'", "'STRUCT'", "'SUBSTR'", "'SUBSTRING'", + "'TABLE'", "'TABLES'", "'TABLESAMPLE'", "'TBLPROPERTIES'", + "", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", + "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", + "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", + "'UNBOUNDED'", "'UNCACHE'", "'UNION'", "'UNIQUE'", + "'UNKNOWN'", "'UNLOCK'", "'UNSET'", "'UPDATE'", "'USE'", + "'USER'", "'USING'", "'VALUES'", "'VIEW'", "'VIEWS'", + "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", "'YEAR'", + "", "'<=>'", "'<>'", "'!='", "'<'", "", + "'>'", "", "'+'", "'-'", "'*'", "'/'", "'%'", + "'DIV'", "'~'", "'&'", "'|'", "'||'", "'^'" ] + + symbolicNames = [ "", "", "", "", + "", "", "", "", + "", "", "", "", + "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", + "ANTI", "ANY", "ARCHIVE", "ARRAY", "AS", "ASC", "AT", + "AUTHORIZATION", "BETWEEN", "BOTH", "BUCKET", "BUCKETS", + "BY", "CACHE", "CASCADE", "CASE", "CAST", "CHANGE", + "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", "CODEGEN", + "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", + "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", + "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", + "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", + "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", + "DESC", "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", + "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", + "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", + "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", + "FETCH", "FIELDS", "FILTER", "FILEFORMAT", "FIRST", + "FOLLOWING", "FOR", "FOREIGN", "FORMAT", "FORMATTED", + "FROM", "FULL", "FUNCTION", "FUNCTIONS", "GLOBAL", + "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", "IF", + "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", + "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", + "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", + "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", + "LIST", "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", + "LOGICAL", "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", + "MONTH", "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", + "NO", "NOT", "NULL", "NULLS", "OF", "ON", "ONLY", + "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", + "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", + "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", + "PIVOT", "PLACING", "POSITION", "PRECEDING", "PRIMARY", + "PRINCIPALS", "PROPERTIES", "PURGE", "QUERY", "RANGE", + "RECORDREADER", "RECORDWRITER", "RECOVER", "REDUCE", + "REFERENCES", "REFRESH", "RENAME", "REPAIR", "REPLACE", + "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", "ROLE", + "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", + "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", + "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", + "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", + "START", "STATISTICS", "STORED", "STRATIFY", "STRUCT", + "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", + "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", + "TO", "TOUCH", "TRAILING", "TRANSACTION", "TRANSACTIONS", + "TRANSFORM", "TRIM", "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", + "UNBOUNDED", "UNCACHE", "UNION", "UNIQUE", "UNKNOWN", + "UNLOCK", "UNSET", "UPDATE", "USE", "USER", "USING", + "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", "WINDOW", + "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", + "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", + "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", + "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", + "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", + "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" ] + + RULE_singleStatement = 0 + RULE_singleExpression = 1 + RULE_singleTableIdentifier = 2 + RULE_singleMultipartIdentifier = 3 + RULE_singleFunctionIdentifier = 4 + RULE_singleDataType = 5 + RULE_singleTableSchema = 6 + RULE_statement = 7 + RULE_unsupportedHiveNativeCommands = 8 + RULE_createTableHeader = 9 + RULE_replaceTableHeader = 10 + RULE_bucketSpec = 11 + RULE_skewSpec = 12 + RULE_locationSpec = 13 + RULE_commentSpec = 14 + RULE_query = 15 + RULE_insertInto = 16 + RULE_partitionSpecLocation = 17 + RULE_partitionSpec = 18 + RULE_partitionVal = 19 + RULE_namespace = 20 + RULE_describeFuncName = 21 + RULE_describeColName = 22 + RULE_ctes = 23 + RULE_namedQuery = 24 + RULE_tableProvider = 25 + RULE_createTableClauses = 26 + RULE_tablePropertyList = 27 + RULE_tableProperty = 28 + RULE_tablePropertyKey = 29 + RULE_tablePropertyValue = 30 + RULE_constantList = 31 + RULE_nestedConstantList = 32 + RULE_createFileFormat = 33 + RULE_fileFormat = 34 + RULE_storageHandler = 35 + RULE_resource = 36 + RULE_dmlStatementNoWith = 37 + RULE_queryOrganization = 38 + RULE_multiInsertQueryBody = 39 + RULE_queryTerm = 40 + RULE_queryPrimary = 41 + RULE_sortItem = 42 + RULE_fromStatement = 43 + RULE_fromStatementBody = 44 + RULE_querySpecification = 45 + RULE_transformClause = 46 + RULE_selectClause = 47 + RULE_setClause = 48 + RULE_matchedClause = 49 + RULE_notMatchedClause = 50 + RULE_matchedAction = 51 + RULE_notMatchedAction = 52 + RULE_assignmentList = 53 + RULE_assignment = 54 + RULE_whereClause = 55 + RULE_havingClause = 56 + RULE_hint = 57 + RULE_hintStatement = 58 + RULE_fromClause = 59 + RULE_aggregationClause = 60 + RULE_groupingSet = 61 + RULE_pivotClause = 62 + RULE_pivotColumn = 63 + RULE_pivotValue = 64 + RULE_lateralView = 65 + RULE_setQuantifier = 66 + RULE_relation = 67 + RULE_joinRelation = 68 + RULE_joinType = 69 + RULE_joinCriteria = 70 + RULE_sample = 71 + RULE_sampleMethod = 72 + RULE_identifierList = 73 + RULE_identifierSeq = 74 + RULE_orderedIdentifierList = 75 + RULE_orderedIdentifier = 76 + RULE_identifierCommentList = 77 + RULE_identifierComment = 78 + RULE_relationPrimary = 79 + RULE_inlineTable = 80 + RULE_functionTable = 81 + RULE_tableAlias = 82 + RULE_rowFormat = 83 + RULE_multipartIdentifierList = 84 + RULE_multipartIdentifier = 85 + RULE_tableIdentifier = 86 + RULE_functionIdentifier = 87 + RULE_namedExpression = 88 + RULE_namedExpressionSeq = 89 + RULE_transformList = 90 + RULE_transform = 91 + RULE_transformArgument = 92 + RULE_expression = 93 + RULE_booleanExpression = 94 + RULE_predicate = 95 + RULE_valueExpression = 96 + RULE_primaryExpression = 97 + RULE_constant = 98 + RULE_comparisonOperator = 99 + RULE_arithmeticOperator = 100 + RULE_predicateOperator = 101 + RULE_booleanValue = 102 + RULE_interval = 103 + RULE_errorCapturingMultiUnitsInterval = 104 + RULE_multiUnitsInterval = 105 + RULE_errorCapturingUnitToUnitInterval = 106 + RULE_unitToUnitInterval = 107 + RULE_intervalValue = 108 + RULE_intervalUnit = 109 + RULE_colPosition = 110 + RULE_dataType = 111 + RULE_qualifiedColTypeWithPositionList = 112 + RULE_qualifiedColTypeWithPosition = 113 + RULE_colTypeList = 114 + RULE_colType = 115 + RULE_complexColTypeList = 116 + RULE_complexColType = 117 + RULE_whenClause = 118 + RULE_windowClause = 119 + RULE_namedWindow = 120 + RULE_windowSpec = 121 + RULE_windowFrame = 122 + RULE_frameBound = 123 + RULE_qualifiedNameList = 124 + RULE_functionName = 125 + RULE_qualifiedName = 126 + RULE_errorCapturingIdentifier = 127 + RULE_errorCapturingIdentifierExtra = 128 + RULE_identifier = 129 + RULE_strictIdentifier = 130 + RULE_quotedIdentifier = 131 + RULE_number = 132 + RULE_alterColumnAction = 133 + RULE_ansiNonReserved = 134 + RULE_strictNonReserved = 135 + RULE_nonReserved = 136 + + ruleNames = [ "singleStatement", "singleExpression", "singleTableIdentifier", + "singleMultipartIdentifier", "singleFunctionIdentifier", + "singleDataType", "singleTableSchema", "statement", "unsupportedHiveNativeCommands", + "createTableHeader", "replaceTableHeader", "bucketSpec", + "skewSpec", "locationSpec", "commentSpec", "query", "insertInto", + "partitionSpecLocation", "partitionSpec", "partitionVal", + "namespace", "describeFuncName", "describeColName", "ctes", + "namedQuery", "tableProvider", "createTableClauses", + "tablePropertyList", "tableProperty", "tablePropertyKey", + "tablePropertyValue", "constantList", "nestedConstantList", + "createFileFormat", "fileFormat", "storageHandler", "resource", + "dmlStatementNoWith", "queryOrganization", "multiInsertQueryBody", + "queryTerm", "queryPrimary", "sortItem", "fromStatement", + "fromStatementBody", "querySpecification", "transformClause", + "selectClause", "setClause", "matchedClause", "notMatchedClause", + "matchedAction", "notMatchedAction", "assignmentList", + "assignment", "whereClause", "havingClause", "hint", + "hintStatement", "fromClause", "aggregationClause", "groupingSet", + "pivotClause", "pivotColumn", "pivotValue", "lateralView", + "setQuantifier", "relation", "joinRelation", "joinType", + "joinCriteria", "sample", "sampleMethod", "identifierList", + "identifierSeq", "orderedIdentifierList", "orderedIdentifier", + "identifierCommentList", "identifierComment", "relationPrimary", + "inlineTable", "functionTable", "tableAlias", "rowFormat", + "multipartIdentifierList", "multipartIdentifier", "tableIdentifier", + "functionIdentifier", "namedExpression", "namedExpressionSeq", + "transformList", "transform", "transformArgument", "expression", + "booleanExpression", "predicate", "valueExpression", + "primaryExpression", "constant", "comparisonOperator", + "arithmeticOperator", "predicateOperator", "booleanValue", + "interval", "errorCapturingMultiUnitsInterval", "multiUnitsInterval", + "errorCapturingUnitToUnitInterval", "unitToUnitInterval", + "intervalValue", "intervalUnit", "colPosition", "dataType", + "qualifiedColTypeWithPositionList", "qualifiedColTypeWithPosition", + "colTypeList", "colType", "complexColTypeList", "complexColType", + "whenClause", "windowClause", "namedWindow", "windowSpec", + "windowFrame", "frameBound", "qualifiedNameList", "functionName", + "qualifiedName", "errorCapturingIdentifier", "errorCapturingIdentifierExtra", + "identifier", "strictIdentifier", "quotedIdentifier", + "number", "alterColumnAction", "ansiNonReserved", "strictNonReserved", + "nonReserved" ] + + EOF = Token.EOF + T__0=1 + T__1=2 + T__2=3 + T__3=4 + T__4=5 + T__5=6 + T__6=7 + T__7=8 + T__8=9 + T__9=10 + T__10=11 + ADD=12 + AFTER=13 + ALL=14 + ALTER=15 + ANALYZE=16 + AND=17 + ANTI=18 + ANY=19 + ARCHIVE=20 + ARRAY=21 + AS=22 + ASC=23 + AT=24 + AUTHORIZATION=25 + BETWEEN=26 + BOTH=27 + BUCKET=28 + BUCKETS=29 + BY=30 + CACHE=31 + CASCADE=32 + CASE=33 + CAST=34 + CHANGE=35 + CHECK=36 + CLEAR=37 + CLUSTER=38 + CLUSTERED=39 + CODEGEN=40 + COLLATE=41 + COLLECTION=42 + COLUMN=43 + COLUMNS=44 + COMMENT=45 + COMMIT=46 + COMPACT=47 + COMPACTIONS=48 + COMPUTE=49 + CONCATENATE=50 + CONSTRAINT=51 + COST=52 + CREATE=53 + CROSS=54 + CUBE=55 + CURRENT=56 + CURRENT_DATE=57 + CURRENT_TIME=58 + CURRENT_TIMESTAMP=59 + CURRENT_USER=60 + DATA=61 + DATABASE=62 + DATABASES=63 + DAY=64 + DBPROPERTIES=65 + DEFINED=66 + DELETE=67 + DELIMITED=68 + DESC=69 + DESCRIBE=70 + DFS=71 + DIRECTORIES=72 + DIRECTORY=73 + DISTINCT=74 + DISTRIBUTE=75 + DROP=76 + ELSE=77 + END=78 + ESCAPE=79 + ESCAPED=80 + EXCEPT=81 + EXCHANGE=82 + EXISTS=83 + EXPLAIN=84 + EXPORT=85 + EXTENDED=86 + EXTERNAL=87 + EXTRACT=88 + FALSE=89 + FETCH=90 + FIELDS=91 + FILTER=92 + FILEFORMAT=93 + FIRST=94 + FOLLOWING=95 + FOR=96 + FOREIGN=97 + FORMAT=98 + FORMATTED=99 + FROM=100 + FULL=101 + FUNCTION=102 + FUNCTIONS=103 + GLOBAL=104 + GRANT=105 + GROUP=106 + GROUPING=107 + HAVING=108 + HOUR=109 + IF=110 + IGNORE=111 + IMPORT=112 + IN=113 + INDEX=114 + INDEXES=115 + INNER=116 + INPATH=117 + INPUTFORMAT=118 + INSERT=119 + INTERSECT=120 + INTERVAL=121 + INTO=122 + IS=123 + ITEMS=124 + JOIN=125 + KEYS=126 + LAST=127 + LATERAL=128 + LAZY=129 + LEADING=130 + LEFT=131 + LIKE=132 + LIMIT=133 + LINES=134 + LIST=135 + LOAD=136 + LOCAL=137 + LOCATION=138 + LOCK=139 + LOCKS=140 + LOGICAL=141 + MACRO=142 + MAP=143 + MATCHED=144 + MERGE=145 + MINUTE=146 + MONTH=147 + MSCK=148 + NAMESPACE=149 + NAMESPACES=150 + NATURAL=151 + NO=152 + NOT=153 + NULL=154 + NULLS=155 + OF=156 + ON=157 + ONLY=158 + OPTION=159 + OPTIONS=160 + OR=161 + ORDER=162 + OUT=163 + OUTER=164 + OUTPUTFORMAT=165 + OVER=166 + OVERLAPS=167 + OVERLAY=168 + OVERWRITE=169 + PARTITION=170 + PARTITIONED=171 + PARTITIONS=172 + PERCENTLIT=173 + PIVOT=174 + PLACING=175 + POSITION=176 + PRECEDING=177 + PRIMARY=178 + PRINCIPALS=179 + PROPERTIES=180 + PURGE=181 + QUERY=182 + RANGE=183 + RECORDREADER=184 + RECORDWRITER=185 + RECOVER=186 + REDUCE=187 + REFERENCES=188 + REFRESH=189 + RENAME=190 + REPAIR=191 + REPLACE=192 + RESET=193 + RESTRICT=194 + REVOKE=195 + RIGHT=196 + RLIKE=197 + ROLE=198 + ROLES=199 + ROLLBACK=200 + ROLLUP=201 + ROW=202 + ROWS=203 + SCHEMA=204 + SECOND=205 + SELECT=206 + SEMI=207 + SEPARATED=208 + SERDE=209 + SERDEPROPERTIES=210 + SESSION_USER=211 + SET=212 + SETMINUS=213 + SETS=214 + SHOW=215 + SKEWED=216 + SOME=217 + SORT=218 + SORTED=219 + START=220 + STATISTICS=221 + STORED=222 + STRATIFY=223 + STRUCT=224 + SUBSTR=225 + SUBSTRING=226 + TABLE=227 + TABLES=228 + TABLESAMPLE=229 + TBLPROPERTIES=230 + TEMPORARY=231 + TERMINATED=232 + THEN=233 + TO=234 + TOUCH=235 + TRAILING=236 + TRANSACTION=237 + TRANSACTIONS=238 + TRANSFORM=239 + TRIM=240 + TRUE=241 + TRUNCATE=242 + TYPE=243 + UNARCHIVE=244 + UNBOUNDED=245 + UNCACHE=246 + UNION=247 + UNIQUE=248 + UNKNOWN=249 + UNLOCK=250 + UNSET=251 + UPDATE=252 + USE=253 + USER=254 + USING=255 + VALUES=256 + VIEW=257 + VIEWS=258 + WHEN=259 + WHERE=260 + WINDOW=261 + WITH=262 + YEAR=263 + EQ=264 + NSEQ=265 + NEQ=266 + NEQJ=267 + LT=268 + LTE=269 + GT=270 + GTE=271 + PLUS=272 + MINUS=273 + ASTERISK=274 + SLASH=275 + PERCENT=276 + DIV=277 + TILDE=278 + AMPERSAND=279 + PIPE=280 + CONCAT_PIPE=281 + HAT=282 + STRING=283 + BIGINT_LITERAL=284 + SMALLINT_LITERAL=285 + TINYINT_LITERAL=286 + INTEGER_VALUE=287 + EXPONENT_VALUE=288 + DECIMAL_VALUE=289 + DOUBLE_LITERAL=290 + BIGDECIMAL_LITERAL=291 + IDENTIFIER=292 + BACKQUOTED_IDENTIFIER=293 + SIMPLE_COMMENT=294 + BRACKETED_COMMENT=295 + WS=296 + UNRECOGNIZED=297 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.7.1") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + """ + When false, INTERSECT is given the greater precedence over the other set + operations (UNION, EXCEPT and MINUS) as per the SQL standard. + """ + legacy_setops_precedence_enbled = False + + """ + When false, a literal with an exponent would be converted into + double type rather than decimal type. + """ + legacy_exponent_literal_as_decimal_enabled = False + + """ + When false, CREATE TABLE syntax without a provider will use + the value of spark.sql.sources.default as its provider. + """ + legacy_create_hive_table_by_default_enabled = False + + """ + When true, the behavior of keywords follows ANSI SQL standard. + """ + SQL_standard_keyword_behavior = False + + def isValidDecimal(self): + """ + Verify whether current token is a valid decimal token (which contains dot). + Returns true if the character that follows the token is not a digit or letter or underscore. + + For example: + For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. + For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. + For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. + For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed + by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' + which is not a digit or letter or underscore. + """ + nextChar = self._input.LA(1) + if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': + return False + else: + return True + + def isHint(self): + """ + This method will be called when we see '/*' and try to match it as a bracketed comment. + If the next character is '+', it should be parsed as hint later, and we cannot match + it as a bracketed comment. + + Returns true if the next character is '+'. + """ + nextChar = self._input.LA(1) + if nextChar == '+': + return True + else: + return False + + + class SingleStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def statement(self): + return self.getTypedRuleContext(SqlBaseParser.StatementContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleStatement" ): + listener.enterSingleStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleStatement" ): + listener.exitSingleStatement(self) + + + + + def singleStatement(self): + + localctx = SqlBaseParser.SingleStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_singleStatement) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 274 + self.statement() + self.state = 278 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__0: + self.state = 275 + self.match(SqlBaseParser.T__0) + self.state = 280 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 281 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def namedExpression(self): + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleExpression + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleExpression" ): + listener.enterSingleExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleExpression" ): + listener.exitSingleExpression(self) + + + + + def singleExpression(self): + + localctx = SqlBaseParser.SingleExpressionContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_singleExpression) + try: + self.enterOuterAlt(localctx, 1) + self.state = 283 + self.namedExpression() + self.state = 284 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleTableIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def tableIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleTableIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleTableIdentifier" ): + listener.enterSingleTableIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleTableIdentifier" ): + listener.exitSingleTableIdentifier(self) + + + + + def singleTableIdentifier(self): + + localctx = SqlBaseParser.SingleTableIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_singleTableIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 286 + self.tableIdentifier() + self.state = 287 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleMultipartIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleMultipartIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleMultipartIdentifier" ): + listener.enterSingleMultipartIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleMultipartIdentifier" ): + listener.exitSingleMultipartIdentifier(self) + + + + + def singleMultipartIdentifier(self): + + localctx = SqlBaseParser.SingleMultipartIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_singleMultipartIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 289 + self.multipartIdentifier() + self.state = 290 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleFunctionIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def functionIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.FunctionIdentifierContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleFunctionIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleFunctionIdentifier" ): + listener.enterSingleFunctionIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleFunctionIdentifier" ): + listener.exitSingleFunctionIdentifier(self) + + + + + def singleFunctionIdentifier(self): + + localctx = SqlBaseParser.SingleFunctionIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_singleFunctionIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 292 + self.functionIdentifier() + self.state = 293 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleDataTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleDataType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleDataType" ): + listener.enterSingleDataType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleDataType" ): + listener.exitSingleDataType(self) + + + + + def singleDataType(self): + + localctx = SqlBaseParser.SingleDataTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_singleDataType) + try: + self.enterOuterAlt(localctx, 1) + self.state = 295 + self.dataType() + self.state = 296 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SingleTableSchemaContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def colTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) + + + def EOF(self): + return self.getToken(SqlBaseParser.EOF, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_singleTableSchema + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleTableSchema" ): + listener.enterSingleTableSchema(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleTableSchema" ): + listener.exitSingleTableSchema(self) + + + + + def singleTableSchema(self): + + localctx = SqlBaseParser.SingleTableSchemaContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_singleTableSchema) + try: + self.enterOuterAlt(localctx, 1) + self.state = 298 + self.colTypeList() + self.state = 299 + self.match(SqlBaseParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_statement + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class ExplainContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def EXPLAIN(self): + return self.getToken(SqlBaseParser.EXPLAIN, 0) + def statement(self): + return self.getTypedRuleContext(SqlBaseParser.StatementContext,0) + + def LOGICAL(self): + return self.getToken(SqlBaseParser.LOGICAL, 0) + def FORMATTED(self): + return self.getToken(SqlBaseParser.FORMATTED, 0) + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + def CODEGEN(self): + return self.getToken(SqlBaseParser.CODEGEN, 0) + def COST(self): + return self.getToken(SqlBaseParser.COST, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExplain" ): + listener.enterExplain(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExplain" ): + listener.exitExplain(self) + + + class ResetConfigurationContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def RESET(self): + return self.getToken(SqlBaseParser.RESET, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterResetConfiguration" ): + listener.enterResetConfiguration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitResetConfiguration" ): + listener.exitResetConfiguration(self) + + + class AlterViewQueryContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAlterViewQuery" ): + listener.enterAlterViewQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAlterViewQuery" ): + listener.exitAlterViewQuery(self) + + + class UseContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def USE(self): + return self.getToken(SqlBaseParser.USE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def NAMESPACE(self): + return self.getToken(SqlBaseParser.NAMESPACE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUse" ): + listener.enterUse(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUse" ): + listener.exitUse(self) + + + class DropNamespaceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def RESTRICT(self): + return self.getToken(SqlBaseParser.RESTRICT, 0) + def CASCADE(self): + return self.getToken(SqlBaseParser.CASCADE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropNamespace" ): + listener.enterDropNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropNamespace" ): + listener.exitDropNamespace(self) + + + class CreateTempViewUsingContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def tableIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) + + def tableProvider(self): + return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) + + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + def GLOBAL(self): + return self.getToken(SqlBaseParser.GLOBAL, 0) + def colTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) + + def OPTIONS(self): + return self.getToken(SqlBaseParser.OPTIONS, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateTempViewUsing" ): + listener.enterCreateTempViewUsing(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateTempViewUsing" ): + listener.exitCreateTempViewUsing(self) + + + class RenameTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.from_ = None # MultipartIdentifierContext + self.to = None # MultipartIdentifierContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def RENAME(self): + return self.getToken(SqlBaseParser.RENAME, 0) + def TO(self): + return self.getToken(SqlBaseParser.TO, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRenameTable" ): + listener.enterRenameTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRenameTable" ): + listener.exitRenameTable(self) + + + class FailNativeCommandContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def ROLE(self): + return self.getToken(SqlBaseParser.ROLE, 0) + def unsupportedHiveNativeCommands(self): + return self.getTypedRuleContext(SqlBaseParser.UnsupportedHiveNativeCommandsContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFailNativeCommand" ): + listener.enterFailNativeCommand(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFailNativeCommand" ): + listener.exitFailNativeCommand(self) + + + class ClearCacheContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def CLEAR(self): + return self.getToken(SqlBaseParser.CLEAR, 0) + def CACHE(self): + return self.getToken(SqlBaseParser.CACHE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterClearCache" ): + listener.enterClearCache(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitClearCache" ): + listener.exitClearCache(self) + + + class DropViewContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropView" ): + listener.enterDropView(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropView" ): + listener.exitDropView(self) + + + class ShowTablesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.pattern = None # Token + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def TABLES(self): + return self.getToken(SqlBaseParser.TABLES, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowTables" ): + listener.enterShowTables(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowTables" ): + listener.exitShowTables(self) + + + class RecoverPartitionsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def RECOVER(self): + return self.getToken(SqlBaseParser.RECOVER, 0) + def PARTITIONS(self): + return self.getToken(SqlBaseParser.PARTITIONS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRecoverPartitions" ): + listener.enterRecoverPartitions(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRecoverPartitions" ): + listener.exitRecoverPartitions(self) + + + class ShowCurrentNamespaceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def CURRENT(self): + return self.getToken(SqlBaseParser.CURRENT, 0) + def NAMESPACE(self): + return self.getToken(SqlBaseParser.NAMESPACE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowCurrentNamespace" ): + listener.enterShowCurrentNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowCurrentNamespace" ): + listener.exitShowCurrentNamespace(self) + + + class RenameTablePartitionContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.from_ = None # PartitionSpecContext + self.to = None # PartitionSpecContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def RENAME(self): + return self.getToken(SqlBaseParser.RENAME, 0) + def TO(self): + return self.getToken(SqlBaseParser.TO, 0) + def partitionSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRenameTablePartition" ): + listener.enterRenameTablePartition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRenameTablePartition" ): + listener.exitRenameTablePartition(self) + + + class RepairTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def MSCK(self): + return self.getToken(SqlBaseParser.MSCK, 0) + def REPAIR(self): + return self.getToken(SqlBaseParser.REPAIR, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRepairTable" ): + listener.enterRepairTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRepairTable" ): + listener.exitRepairTable(self) + + + class RefreshResourceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def REFRESH(self): + return self.getToken(SqlBaseParser.REFRESH, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRefreshResource" ): + listener.enterRefreshResource(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRefreshResource" ): + listener.exitRefreshResource(self) + + + class ShowCreateTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + def SERDE(self): + return self.getToken(SqlBaseParser.SERDE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowCreateTable" ): + listener.enterShowCreateTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowCreateTable" ): + listener.exitShowCreateTable(self) + + + class ShowNamespacesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.pattern = None # Token + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def DATABASES(self): + return self.getToken(SqlBaseParser.DATABASES, 0) + def NAMESPACES(self): + return self.getToken(SqlBaseParser.NAMESPACES, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowNamespaces" ): + listener.enterShowNamespaces(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowNamespaces" ): + listener.exitShowNamespaces(self) + + + class ShowColumnsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.ns = None # MultipartIdentifierContext + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + def FROM(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.FROM) + else: + return self.getToken(SqlBaseParser.FROM, i) + def IN(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.IN) + else: + return self.getToken(SqlBaseParser.IN, i) + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowColumns" ): + listener.enterShowColumns(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowColumns" ): + listener.exitShowColumns(self) + + + class ReplaceTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def replaceTableHeader(self): + return self.getTypedRuleContext(SqlBaseParser.ReplaceTableHeaderContext,0) + + def tableProvider(self): + return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) + + def createTableClauses(self): + return self.getTypedRuleContext(SqlBaseParser.CreateTableClausesContext,0) + + def colTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReplaceTable" ): + listener.enterReplaceTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReplaceTable" ): + listener.exitReplaceTable(self) + + + class AddTablePartitionContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def ADD(self): + return self.getToken(SqlBaseParser.ADD, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def partitionSpecLocation(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecLocationContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecLocationContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAddTablePartition" ): + listener.enterAddTablePartition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAddTablePartition" ): + listener.exitAddTablePartition(self) + + + class SetNamespaceLocationContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def locationSpec(self): + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetNamespaceLocation" ): + listener.enterSetNamespaceLocation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetNamespaceLocation" ): + listener.exitSetNamespaceLocation(self) + + + class RefreshTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def REFRESH(self): + return self.getToken(SqlBaseParser.REFRESH, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRefreshTable" ): + listener.enterRefreshTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRefreshTable" ): + listener.exitRefreshTable(self) + + + class SetNamespacePropertiesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + def DBPROPERTIES(self): + return self.getToken(SqlBaseParser.DBPROPERTIES, 0) + def PROPERTIES(self): + return self.getToken(SqlBaseParser.PROPERTIES, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetNamespaceProperties" ): + listener.enterSetNamespaceProperties(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetNamespaceProperties" ): + listener.exitSetNamespaceProperties(self) + + + class ManageResourceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def ADD(self): + return self.getToken(SqlBaseParser.ADD, 0) + def LIST(self): + return self.getToken(SqlBaseParser.LIST, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterManageResource" ): + listener.enterManageResource(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitManageResource" ): + listener.exitManageResource(self) + + + class AnalyzeContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ANALYZE(self): + return self.getToken(SqlBaseParser.ANALYZE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def COMPUTE(self): + return self.getToken(SqlBaseParser.COMPUTE, 0) + def STATISTICS(self): + return self.getToken(SqlBaseParser.STATISTICS, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def FOR(self): + return self.getToken(SqlBaseParser.FOR, 0) + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + def identifierSeq(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) + + def ALL(self): + return self.getToken(SqlBaseParser.ALL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAnalyze" ): + listener.enterAnalyze(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAnalyze" ): + listener.exitAnalyze(self) + + + class CreateHiveTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.columns = None # ColTypeListContext + self.partitionColumns = None # ColTypeListContext + self.partitionColumnNames = None # IdentifierListContext + self.tableProps = None # TablePropertyListContext + self.copyFrom(ctx) + + def createTableHeader(self): + return self.getTypedRuleContext(SqlBaseParser.CreateTableHeaderContext,0) + + def commentSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) + + def bucketSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.BucketSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.BucketSpecContext,i) + + def skewSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.SkewSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.SkewSpecContext,i) + + def rowFormat(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) + else: + return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) + + def createFileFormat(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CreateFileFormatContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,i) + + def locationSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def colTypeList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ColTypeListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,i) + + def PARTITIONED(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.PARTITIONED) + else: + return self.getToken(SqlBaseParser.PARTITIONED, i) + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + def TBLPROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.TBLPROPERTIES) + else: + return self.getToken(SqlBaseParser.TBLPROPERTIES, i) + def identifierList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,i) + + def tablePropertyList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateHiveTable" ): + listener.enterCreateHiveTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateHiveTable" ): + listener.exitCreateHiveTable(self) + + + class CreateFunctionContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.className = None # Token + self.copyFrom(ctx) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def FUNCTION(self): + return self.getToken(SqlBaseParser.FUNCTION, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + def resource(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ResourceContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ResourceContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateFunction" ): + listener.enterCreateFunction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateFunction" ): + listener.exitCreateFunction(self) + + + class ShowTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.ns = None # MultipartIdentifierContext + self.pattern = None # Token + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowTable" ): + listener.enterShowTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowTable" ): + listener.exitShowTable(self) + + + class HiveReplaceColumnsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.columns = None # QualifiedColTypeWithPositionListContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def qualifiedColTypeWithPositionList(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionListContext,0) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterHiveReplaceColumns" ): + listener.enterHiveReplaceColumns(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitHiveReplaceColumns" ): + listener.exitHiveReplaceColumns(self) + + + class CommentNamespaceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.comment = None # Token + self.copyFrom(ctx) + + def COMMENT(self): + return self.getToken(SqlBaseParser.COMMENT, 0) + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IS(self): + return self.getToken(SqlBaseParser.IS, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCommentNamespace" ): + listener.enterCommentNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCommentNamespace" ): + listener.exitCommentNamespace(self) + + + class CreateTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def createTableHeader(self): + return self.getTypedRuleContext(SqlBaseParser.CreateTableHeaderContext,0) + + def createTableClauses(self): + return self.getTypedRuleContext(SqlBaseParser.CreateTableClausesContext,0) + + def colTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) + + def tableProvider(self): + return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateTable" ): + listener.enterCreateTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateTable" ): + listener.exitCreateTable(self) + + + class DmlStatementContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def dmlStatementNoWith(self): + return self.getTypedRuleContext(SqlBaseParser.DmlStatementNoWithContext,0) + + def ctes(self): + return self.getTypedRuleContext(SqlBaseParser.CtesContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDmlStatement" ): + listener.enterDmlStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDmlStatement" ): + listener.exitDmlStatement(self) + + + class CreateTableLikeContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.target = None # TableIdentifierContext + self.source = None # TableIdentifierContext + self.tableProps = None # TablePropertyListContext + self.copyFrom(ctx) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + def tableIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TableIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,i) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def tableProvider(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TableProviderContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,i) + + def rowFormat(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) + else: + return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) + + def createFileFormat(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CreateFileFormatContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,i) + + def locationSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) + + def TBLPROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.TBLPROPERTIES) + else: + return self.getToken(SqlBaseParser.TBLPROPERTIES, i) + def tablePropertyList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateTableLike" ): + listener.enterCreateTableLike(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateTableLike" ): + listener.exitCreateTableLike(self) + + + class UncacheTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def UNCACHE(self): + return self.getToken(SqlBaseParser.UNCACHE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUncacheTable" ): + listener.enterUncacheTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUncacheTable" ): + listener.exitUncacheTable(self) + + + class DropFunctionContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def FUNCTION(self): + return self.getToken(SqlBaseParser.FUNCTION, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropFunction" ): + listener.enterDropFunction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropFunction" ): + listener.exitDropFunction(self) + + + class DescribeRelationContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.option = None # Token + self.copyFrom(ctx) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def describeColName(self): + return self.getTypedRuleContext(SqlBaseParser.DescribeColNameContext,0) + + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + def FORMATTED(self): + return self.getToken(SqlBaseParser.FORMATTED, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeRelation" ): + listener.enterDescribeRelation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeRelation" ): + listener.exitDescribeRelation(self) + + + class LoadDataContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.path = None # Token + self.copyFrom(ctx) + + def LOAD(self): + return self.getToken(SqlBaseParser.LOAD, 0) + def DATA(self): + return self.getToken(SqlBaseParser.DATA, 0) + def INPATH(self): + return self.getToken(SqlBaseParser.INPATH, 0) + def INTO(self): + return self.getToken(SqlBaseParser.INTO, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def LOCAL(self): + return self.getToken(SqlBaseParser.LOCAL, 0) + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLoadData" ): + listener.enterLoadData(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLoadData" ): + listener.exitLoadData(self) + + + class ShowPartitionsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def PARTITIONS(self): + return self.getToken(SqlBaseParser.PARTITIONS, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowPartitions" ): + listener.enterShowPartitions(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowPartitions" ): + listener.exitShowPartitions(self) + + + class DescribeFunctionContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def FUNCTION(self): + return self.getToken(SqlBaseParser.FUNCTION, 0) + def describeFuncName(self): + return self.getTypedRuleContext(SqlBaseParser.DescribeFuncNameContext,0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeFunction" ): + listener.enterDescribeFunction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeFunction" ): + listener.exitDescribeFunction(self) + + + class RenameTableColumnContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.from_ = None # MultipartIdentifierContext + self.to = None # ErrorCapturingIdentifierContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def RENAME(self): + return self.getToken(SqlBaseParser.RENAME, 0) + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + def TO(self): + return self.getToken(SqlBaseParser.TO, 0) + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRenameTableColumn" ): + listener.enterRenameTableColumn(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRenameTableColumn" ): + listener.exitRenameTableColumn(self) + + + class StatementDefaultContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStatementDefault" ): + listener.enterStatementDefault(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStatementDefault" ): + listener.exitStatementDefault(self) + + + class HiveChangeColumnContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.colName = None # MultipartIdentifierContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def CHANGE(self): + return self.getToken(SqlBaseParser.CHANGE, 0) + def colType(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeContext,0) + + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + def colPosition(self): + return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterHiveChangeColumn" ): + listener.enterHiveChangeColumn(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitHiveChangeColumn" ): + listener.exitHiveChangeColumn(self) + + + class DescribeQueryContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + def QUERY(self): + return self.getToken(SqlBaseParser.QUERY, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeQuery" ): + listener.enterDescribeQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeQuery" ): + listener.exitDescribeQuery(self) + + + class TruncateTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def TRUNCATE(self): + return self.getToken(SqlBaseParser.TRUNCATE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTruncateTable" ): + listener.enterTruncateTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTruncateTable" ): + listener.exitTruncateTable(self) + + + class SetTableSerDeContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def SERDE(self): + return self.getToken(SqlBaseParser.SERDE, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + def SERDEPROPERTIES(self): + return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetTableSerDe" ): + listener.enterSetTableSerDe(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetTableSerDe" ): + listener.exitSetTableSerDe(self) + + + class CreateViewContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def identifierCommentList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierCommentListContext,0) + + def commentSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) + + def PARTITIONED(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.PARTITIONED) + else: + return self.getToken(SqlBaseParser.PARTITIONED, i) + def ON(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.ON) + else: + return self.getToken(SqlBaseParser.ON, i) + def identifierList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,i) + + def TBLPROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.TBLPROPERTIES) + else: + return self.getToken(SqlBaseParser.TBLPROPERTIES, i) + def tablePropertyList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) + + def GLOBAL(self): + return self.getToken(SqlBaseParser.GLOBAL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateView" ): + listener.enterCreateView(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateView" ): + listener.exitCreateView(self) + + + class DropTablePartitionsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def partitionSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,i) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def PURGE(self): + return self.getToken(SqlBaseParser.PURGE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropTablePartitions" ): + listener.enterDropTablePartitions(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropTablePartitions" ): + listener.exitDropTablePartitions(self) + + + class SetConfigurationContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetConfiguration" ): + listener.enterSetConfiguration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetConfiguration" ): + listener.exitSetConfiguration(self) + + + class DropTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def PURGE(self): + return self.getToken(SqlBaseParser.PURGE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropTable" ): + listener.enterDropTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropTable" ): + listener.exitDropTable(self) + + + class DescribeNamespaceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeNamespace" ): + listener.enterDescribeNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeNamespace" ): + listener.exitDescribeNamespace(self) + + + class AlterTableAlterColumnContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.column = None # MultipartIdentifierContext + self.copyFrom(ctx) + + def ALTER(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.ALTER) + else: + return self.getToken(SqlBaseParser.ALTER, i) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + def CHANGE(self): + return self.getToken(SqlBaseParser.CHANGE, 0) + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + def alterColumnAction(self): + return self.getTypedRuleContext(SqlBaseParser.AlterColumnActionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAlterTableAlterColumn" ): + listener.enterAlterTableAlterColumn(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAlterTableAlterColumn" ): + listener.exitAlterTableAlterColumn(self) + + + class CommentTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.comment = None # Token + self.copyFrom(ctx) + + def COMMENT(self): + return self.getToken(SqlBaseParser.COMMENT, 0) + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IS(self): + return self.getToken(SqlBaseParser.IS, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCommentTable" ): + listener.enterCommentTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCommentTable" ): + listener.exitCommentTable(self) + + + class CreateNamespaceContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + def namespace(self): + return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def commentSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) + + def locationSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) + + def WITH(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.WITH) + else: + return self.getToken(SqlBaseParser.WITH, i) + def tablePropertyList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) + + def DBPROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.DBPROPERTIES) + else: + return self.getToken(SqlBaseParser.DBPROPERTIES, i) + def PROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.PROPERTIES) + else: + return self.getToken(SqlBaseParser.PROPERTIES, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateNamespace" ): + listener.enterCreateNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateNamespace" ): + listener.exitCreateNamespace(self) + + + class ShowTblPropertiesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.table = None # MultipartIdentifierContext + self.key = None # TablePropertyKeyContext + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def TBLPROPERTIES(self): + return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def tablePropertyKey(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyKeyContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowTblProperties" ): + listener.enterShowTblProperties(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowTblProperties" ): + listener.exitShowTblProperties(self) + + + class UnsetTablePropertiesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def UNSET(self): + return self.getToken(SqlBaseParser.UNSET, 0) + def TBLPROPERTIES(self): + return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnsetTableProperties" ): + listener.enterUnsetTableProperties(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnsetTableProperties" ): + listener.exitUnsetTableProperties(self) + + + class SetTableLocationContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def locationSpec(self): + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetTableLocation" ): + listener.enterSetTableLocation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetTableLocation" ): + listener.exitSetTableLocation(self) + + + class DropTableColumnsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.columns = None # MultipartIdentifierListContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + def multipartIdentifierList(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDropTableColumns" ): + listener.enterDropTableColumns(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDropTableColumns" ): + listener.exitDropTableColumns(self) + + + class ShowViewsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.pattern = None # Token + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def VIEWS(self): + return self.getToken(SqlBaseParser.VIEWS, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowViews" ): + listener.enterShowViews(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowViews" ): + listener.exitShowViews(self) + + + class ShowFunctionsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.pattern = None # Token + self.copyFrom(ctx) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + def FUNCTIONS(self): + return self.getToken(SqlBaseParser.FUNCTIONS, 0) + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterShowFunctions" ): + listener.enterShowFunctions(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitShowFunctions" ): + listener.exitShowFunctions(self) + + + class CacheTableContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.options = None # TablePropertyListContext + self.copyFrom(ctx) + + def CACHE(self): + return self.getToken(SqlBaseParser.CACHE, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def LAZY(self): + return self.getToken(SqlBaseParser.LAZY, 0) + def OPTIONS(self): + return self.getToken(SqlBaseParser.OPTIONS, 0) + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCacheTable" ): + listener.enterCacheTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCacheTable" ): + listener.exitCacheTable(self) + + + class AddTableColumnsContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.columns = None # QualifiedColTypeWithPositionListContext + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def ADD(self): + return self.getToken(SqlBaseParser.ADD, 0) + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + def qualifiedColTypeWithPositionList(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAddTableColumns" ): + listener.enterAddTableColumns(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAddTableColumns" ): + listener.exitAddTableColumns(self) + + + class SetTablePropertiesContext(StatementContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext + super().__init__(parser) + self.copyFrom(ctx) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + def TBLPROPERTIES(self): + return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetTableProperties" ): + listener.enterSetTableProperties(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetTableProperties" ): + listener.exitSetTableProperties(self) + + + + def statement(self): + + localctx = SqlBaseParser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 1025 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,110,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.StatementDefaultContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 301 + self.query() + pass + + elif la_ == 2: + localctx = SqlBaseParser.DmlStatementContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 303 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.WITH: + self.state = 302 + self.ctes() + + + self.state = 305 + self.dmlStatementNoWith() + pass + + elif la_ == 3: + localctx = SqlBaseParser.UseContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 306 + self.match(SqlBaseParser.USE) + self.state = 308 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,2,self._ctx) + if la_ == 1: + self.state = 307 + self.match(SqlBaseParser.NAMESPACE) + + + self.state = 310 + self.multipartIdentifier() + pass + + elif la_ == 4: + localctx = SqlBaseParser.CreateNamespaceContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 311 + self.match(SqlBaseParser.CREATE) + self.state = 312 + self.namespace() + self.state = 316 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,3,self._ctx) + if la_ == 1: + self.state = 313 + self.match(SqlBaseParser.IF) + self.state = 314 + self.match(SqlBaseParser.NOT) + self.state = 315 + self.match(SqlBaseParser.EXISTS) + + + self.state = 318 + self.multipartIdentifier() + self.state = 326 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.LOCATION or _la==SqlBaseParser.WITH: + self.state = 324 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.COMMENT]: + self.state = 319 + self.commentSpec() + pass + elif token in [SqlBaseParser.LOCATION]: + self.state = 320 + self.locationSpec() + pass + elif token in [SqlBaseParser.WITH]: + self.state = 321 + self.match(SqlBaseParser.WITH) + self.state = 322 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DBPROPERTIES or _la==SqlBaseParser.PROPERTIES): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 323 + self.tablePropertyList() + pass + else: + raise NoViableAltException(self) + + self.state = 328 + self._errHandler.sync(self) + _la = self._input.LA(1) + + pass + + elif la_ == 5: + localctx = SqlBaseParser.SetNamespacePropertiesContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 329 + self.match(SqlBaseParser.ALTER) + self.state = 330 + self.namespace() + self.state = 331 + self.multipartIdentifier() + self.state = 332 + self.match(SqlBaseParser.SET) + self.state = 333 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DBPROPERTIES or _la==SqlBaseParser.PROPERTIES): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 334 + self.tablePropertyList() + pass + + elif la_ == 6: + localctx = SqlBaseParser.SetNamespaceLocationContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 336 + self.match(SqlBaseParser.ALTER) + self.state = 337 + self.namespace() + self.state = 338 + self.multipartIdentifier() + self.state = 339 + self.match(SqlBaseParser.SET) + self.state = 340 + self.locationSpec() + pass + + elif la_ == 7: + localctx = SqlBaseParser.DropNamespaceContext(self, localctx) + self.enterOuterAlt(localctx, 7) + self.state = 342 + self.match(SqlBaseParser.DROP) + self.state = 343 + self.namespace() + self.state = 346 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,6,self._ctx) + if la_ == 1: + self.state = 344 + self.match(SqlBaseParser.IF) + self.state = 345 + self.match(SqlBaseParser.EXISTS) + + + self.state = 348 + self.multipartIdentifier() + self.state = 350 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.CASCADE or _la==SqlBaseParser.RESTRICT: + self.state = 349 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.CASCADE or _la==SqlBaseParser.RESTRICT): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + pass + + elif la_ == 8: + localctx = SqlBaseParser.ShowNamespacesContext(self, localctx) + self.enterOuterAlt(localctx, 8) + self.state = 352 + self.match(SqlBaseParser.SHOW) + self.state = 353 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DATABASES or _la==SqlBaseParser.NAMESPACES): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 356 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: + self.state = 354 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 355 + self.multipartIdentifier() + + + self.state = 362 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: + self.state = 359 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE: + self.state = 358 + self.match(SqlBaseParser.LIKE) + + + self.state = 361 + localctx.pattern = self.match(SqlBaseParser.STRING) + + + pass + + elif la_ == 9: + localctx = SqlBaseParser.CreateTableContext(self, localctx) + self.enterOuterAlt(localctx, 9) + self.state = 364 + if not not self.legacy_create_hive_table_by_default_enabled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.legacy_create_hive_table_by_default_enabled") + self.state = 365 + self.createTableHeader() + self.state = 370 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,11,self._ctx) + if la_ == 1: + self.state = 366 + self.match(SqlBaseParser.T__1) + self.state = 367 + self.colTypeList() + self.state = 368 + self.match(SqlBaseParser.T__2) + + + self.state = 373 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.USING: + self.state = 372 + self.tableProvider() + + + self.state = 375 + self.createTableClauses() + self.state = 380 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: + self.state = 377 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 376 + self.match(SqlBaseParser.AS) + + + self.state = 379 + self.query() + + + pass + + elif la_ == 10: + localctx = SqlBaseParser.CreateTableContext(self, localctx) + self.enterOuterAlt(localctx, 10) + self.state = 382 + if not self.legacy_create_hive_table_by_default_enabled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.legacy_create_hive_table_by_default_enabled") + self.state = 383 + self.createTableHeader() + self.state = 388 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1: + self.state = 384 + self.match(SqlBaseParser.T__1) + self.state = 385 + self.colTypeList() + self.state = 386 + self.match(SqlBaseParser.T__2) + + + self.state = 390 + self.tableProvider() + self.state = 391 + self.createTableClauses() + self.state = 396 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: + self.state = 393 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 392 + self.match(SqlBaseParser.AS) + + + self.state = 395 + self.query() + + + pass + + elif la_ == 11: + localctx = SqlBaseParser.CreateHiveTableContext(self, localctx) + self.enterOuterAlt(localctx, 11) + self.state = 398 + self.createTableHeader() + self.state = 403 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,18,self._ctx) + if la_ == 1: + self.state = 399 + self.match(SqlBaseParser.T__1) + self.state = 400 + localctx.columns = self.colTypeList() + self.state = 401 + self.match(SqlBaseParser.T__2) + + + self.state = 426 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.CLUSTERED or _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.LOCATION or _la==SqlBaseParser.PARTITIONED or ((((_la - 202)) & ~0x3f) == 0 and ((1 << (_la - 202)) & ((1 << (SqlBaseParser.ROW - 202)) | (1 << (SqlBaseParser.SKEWED - 202)) | (1 << (SqlBaseParser.STORED - 202)) | (1 << (SqlBaseParser.TBLPROPERTIES - 202)))) != 0): + self.state = 424 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.COMMENT]: + self.state = 405 + self.commentSpec() + pass + elif token in [SqlBaseParser.PARTITIONED]: + self.state = 415 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,19,self._ctx) + if la_ == 1: + self.state = 406 + self.match(SqlBaseParser.PARTITIONED) + self.state = 407 + self.match(SqlBaseParser.BY) + self.state = 408 + self.match(SqlBaseParser.T__1) + self.state = 409 + localctx.partitionColumns = self.colTypeList() + self.state = 410 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 2: + self.state = 412 + self.match(SqlBaseParser.PARTITIONED) + self.state = 413 + self.match(SqlBaseParser.BY) + self.state = 414 + localctx.partitionColumnNames = self.identifierList() + pass + + + pass + elif token in [SqlBaseParser.CLUSTERED]: + self.state = 417 + self.bucketSpec() + pass + elif token in [SqlBaseParser.SKEWED]: + self.state = 418 + self.skewSpec() + pass + elif token in [SqlBaseParser.ROW]: + self.state = 419 + self.rowFormat() + pass + elif token in [SqlBaseParser.STORED]: + self.state = 420 + self.createFileFormat() + pass + elif token in [SqlBaseParser.LOCATION]: + self.state = 421 + self.locationSpec() + pass + elif token in [SqlBaseParser.TBLPROPERTIES]: + self.state = 422 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 423 + localctx.tableProps = self.tablePropertyList() + pass + else: + raise NoViableAltException(self) + + self.state = 428 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 433 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: + self.state = 430 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 429 + self.match(SqlBaseParser.AS) + + + self.state = 432 + self.query() + + + pass + + elif la_ == 12: + localctx = SqlBaseParser.CreateTableLikeContext(self, localctx) + self.enterOuterAlt(localctx, 12) + self.state = 435 + self.match(SqlBaseParser.CREATE) + self.state = 436 + self.match(SqlBaseParser.TABLE) + self.state = 440 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,24,self._ctx) + if la_ == 1: + self.state = 437 + self.match(SqlBaseParser.IF) + self.state = 438 + self.match(SqlBaseParser.NOT) + self.state = 439 + self.match(SqlBaseParser.EXISTS) + + + self.state = 442 + localctx.target = self.tableIdentifier() + self.state = 443 + self.match(SqlBaseParser.LIKE) + self.state = 444 + localctx.source = self.tableIdentifier() + self.state = 453 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.LOCATION or ((((_la - 202)) & ~0x3f) == 0 and ((1 << (_la - 202)) & ((1 << (SqlBaseParser.ROW - 202)) | (1 << (SqlBaseParser.STORED - 202)) | (1 << (SqlBaseParser.TBLPROPERTIES - 202)) | (1 << (SqlBaseParser.USING - 202)))) != 0): + self.state = 451 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.USING]: + self.state = 445 + self.tableProvider() + pass + elif token in [SqlBaseParser.ROW]: + self.state = 446 + self.rowFormat() + pass + elif token in [SqlBaseParser.STORED]: + self.state = 447 + self.createFileFormat() + pass + elif token in [SqlBaseParser.LOCATION]: + self.state = 448 + self.locationSpec() + pass + elif token in [SqlBaseParser.TBLPROPERTIES]: + self.state = 449 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 450 + localctx.tableProps = self.tablePropertyList() + pass + else: + raise NoViableAltException(self) + + self.state = 455 + self._errHandler.sync(self) + _la = self._input.LA(1) + + pass + + elif la_ == 13: + localctx = SqlBaseParser.ReplaceTableContext(self, localctx) + self.enterOuterAlt(localctx, 13) + self.state = 456 + self.replaceTableHeader() + self.state = 461 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1: + self.state = 457 + self.match(SqlBaseParser.T__1) + self.state = 458 + self.colTypeList() + self.state = 459 + self.match(SqlBaseParser.T__2) + + + self.state = 463 + self.tableProvider() + self.state = 464 + self.createTableClauses() + self.state = 469 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: + self.state = 466 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 465 + self.match(SqlBaseParser.AS) + + + self.state = 468 + self.query() + + + pass + + elif la_ == 14: + localctx = SqlBaseParser.AnalyzeContext(self, localctx) + self.enterOuterAlt(localctx, 14) + self.state = 471 + self.match(SqlBaseParser.ANALYZE) + self.state = 472 + self.match(SqlBaseParser.TABLE) + self.state = 473 + self.multipartIdentifier() + self.state = 475 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 474 + self.partitionSpec() + + + self.state = 477 + self.match(SqlBaseParser.COMPUTE) + self.state = 478 + self.match(SqlBaseParser.STATISTICS) + self.state = 486 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,31,self._ctx) + if la_ == 1: + self.state = 479 + self.identifier() + + elif la_ == 2: + self.state = 480 + self.match(SqlBaseParser.FOR) + self.state = 481 + self.match(SqlBaseParser.COLUMNS) + self.state = 482 + self.identifierSeq() + + elif la_ == 3: + self.state = 483 + self.match(SqlBaseParser.FOR) + self.state = 484 + self.match(SqlBaseParser.ALL) + self.state = 485 + self.match(SqlBaseParser.COLUMNS) + + + pass + + elif la_ == 15: + localctx = SqlBaseParser.AddTableColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 15) + self.state = 488 + self.match(SqlBaseParser.ALTER) + self.state = 489 + self.match(SqlBaseParser.TABLE) + self.state = 490 + self.multipartIdentifier() + self.state = 491 + self.match(SqlBaseParser.ADD) + self.state = 492 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 493 + localctx.columns = self.qualifiedColTypeWithPositionList() + pass + + elif la_ == 16: + localctx = SqlBaseParser.AddTableColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 16) + self.state = 495 + self.match(SqlBaseParser.ALTER) + self.state = 496 + self.match(SqlBaseParser.TABLE) + self.state = 497 + self.multipartIdentifier() + self.state = 498 + self.match(SqlBaseParser.ADD) + self.state = 499 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 500 + self.match(SqlBaseParser.T__1) + self.state = 501 + localctx.columns = self.qualifiedColTypeWithPositionList() + self.state = 502 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 17: + localctx = SqlBaseParser.RenameTableColumnContext(self, localctx) + self.enterOuterAlt(localctx, 17) + self.state = 504 + self.match(SqlBaseParser.ALTER) + self.state = 505 + self.match(SqlBaseParser.TABLE) + self.state = 506 + localctx.table = self.multipartIdentifier() + self.state = 507 + self.match(SqlBaseParser.RENAME) + self.state = 508 + self.match(SqlBaseParser.COLUMN) + self.state = 509 + localctx.from_ = self.multipartIdentifier() + self.state = 510 + self.match(SqlBaseParser.TO) + self.state = 511 + localctx.to = self.errorCapturingIdentifier() + pass + + elif la_ == 18: + localctx = SqlBaseParser.DropTableColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 18) + self.state = 513 + self.match(SqlBaseParser.ALTER) + self.state = 514 + self.match(SqlBaseParser.TABLE) + self.state = 515 + self.multipartIdentifier() + self.state = 516 + self.match(SqlBaseParser.DROP) + self.state = 517 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 518 + self.match(SqlBaseParser.T__1) + self.state = 519 + localctx.columns = self.multipartIdentifierList() + self.state = 520 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 19: + localctx = SqlBaseParser.DropTableColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 19) + self.state = 522 + self.match(SqlBaseParser.ALTER) + self.state = 523 + self.match(SqlBaseParser.TABLE) + self.state = 524 + self.multipartIdentifier() + self.state = 525 + self.match(SqlBaseParser.DROP) + self.state = 526 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 527 + localctx.columns = self.multipartIdentifierList() + pass + + elif la_ == 20: + localctx = SqlBaseParser.RenameTableContext(self, localctx) + self.enterOuterAlt(localctx, 20) + self.state = 529 + self.match(SqlBaseParser.ALTER) + self.state = 530 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 531 + localctx.from_ = self.multipartIdentifier() + self.state = 532 + self.match(SqlBaseParser.RENAME) + self.state = 533 + self.match(SqlBaseParser.TO) + self.state = 534 + localctx.to = self.multipartIdentifier() + pass + + elif la_ == 21: + localctx = SqlBaseParser.SetTablePropertiesContext(self, localctx) + self.enterOuterAlt(localctx, 21) + self.state = 536 + self.match(SqlBaseParser.ALTER) + self.state = 537 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 538 + self.multipartIdentifier() + self.state = 539 + self.match(SqlBaseParser.SET) + self.state = 540 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 541 + self.tablePropertyList() + pass + + elif la_ == 22: + localctx = SqlBaseParser.UnsetTablePropertiesContext(self, localctx) + self.enterOuterAlt(localctx, 22) + self.state = 543 + self.match(SqlBaseParser.ALTER) + self.state = 544 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 545 + self.multipartIdentifier() + self.state = 546 + self.match(SqlBaseParser.UNSET) + self.state = 547 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 550 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IF: + self.state = 548 + self.match(SqlBaseParser.IF) + self.state = 549 + self.match(SqlBaseParser.EXISTS) + + + self.state = 552 + self.tablePropertyList() + pass + + elif la_ == 23: + localctx = SqlBaseParser.AlterTableAlterColumnContext(self, localctx) + self.enterOuterAlt(localctx, 23) + self.state = 554 + self.match(SqlBaseParser.ALTER) + self.state = 555 + self.match(SqlBaseParser.TABLE) + self.state = 556 + localctx.table = self.multipartIdentifier() + self.state = 557 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ALTER or _la==SqlBaseParser.CHANGE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 559 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,33,self._ctx) + if la_ == 1: + self.state = 558 + self.match(SqlBaseParser.COLUMN) + + + self.state = 561 + localctx.column = self.multipartIdentifier() + self.state = 563 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.DROP or _la==SqlBaseParser.FIRST or _la==SqlBaseParser.SET or _la==SqlBaseParser.TYPE: + self.state = 562 + self.alterColumnAction() + + + pass + + elif la_ == 24: + localctx = SqlBaseParser.HiveChangeColumnContext(self, localctx) + self.enterOuterAlt(localctx, 24) + self.state = 565 + self.match(SqlBaseParser.ALTER) + self.state = 566 + self.match(SqlBaseParser.TABLE) + self.state = 567 + localctx.table = self.multipartIdentifier() + self.state = 569 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 568 + self.partitionSpec() + + + self.state = 571 + self.match(SqlBaseParser.CHANGE) + self.state = 573 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,36,self._ctx) + if la_ == 1: + self.state = 572 + self.match(SqlBaseParser.COLUMN) + + + self.state = 575 + localctx.colName = self.multipartIdentifier() + self.state = 576 + self.colType() + self.state = 578 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.FIRST: + self.state = 577 + self.colPosition() + + + pass + + elif la_ == 25: + localctx = SqlBaseParser.HiveReplaceColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 25) + self.state = 580 + self.match(SqlBaseParser.ALTER) + self.state = 581 + self.match(SqlBaseParser.TABLE) + self.state = 582 + localctx.table = self.multipartIdentifier() + self.state = 584 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 583 + self.partitionSpec() + + + self.state = 586 + self.match(SqlBaseParser.REPLACE) + self.state = 587 + self.match(SqlBaseParser.COLUMNS) + self.state = 588 + self.match(SqlBaseParser.T__1) + self.state = 589 + localctx.columns = self.qualifiedColTypeWithPositionList() + self.state = 590 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 26: + localctx = SqlBaseParser.SetTableSerDeContext(self, localctx) + self.enterOuterAlt(localctx, 26) + self.state = 592 + self.match(SqlBaseParser.ALTER) + self.state = 593 + self.match(SqlBaseParser.TABLE) + self.state = 594 + self.multipartIdentifier() + self.state = 596 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 595 + self.partitionSpec() + + + self.state = 598 + self.match(SqlBaseParser.SET) + self.state = 599 + self.match(SqlBaseParser.SERDE) + self.state = 600 + self.match(SqlBaseParser.STRING) + self.state = 604 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.WITH: + self.state = 601 + self.match(SqlBaseParser.WITH) + self.state = 602 + self.match(SqlBaseParser.SERDEPROPERTIES) + self.state = 603 + self.tablePropertyList() + + + pass + + elif la_ == 27: + localctx = SqlBaseParser.SetTableSerDeContext(self, localctx) + self.enterOuterAlt(localctx, 27) + self.state = 606 + self.match(SqlBaseParser.ALTER) + self.state = 607 + self.match(SqlBaseParser.TABLE) + self.state = 608 + self.multipartIdentifier() + self.state = 610 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 609 + self.partitionSpec() + + + self.state = 612 + self.match(SqlBaseParser.SET) + self.state = 613 + self.match(SqlBaseParser.SERDEPROPERTIES) + self.state = 614 + self.tablePropertyList() + pass + + elif la_ == 28: + localctx = SqlBaseParser.AddTablePartitionContext(self, localctx) + self.enterOuterAlt(localctx, 28) + self.state = 616 + self.match(SqlBaseParser.ALTER) + self.state = 617 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 618 + self.multipartIdentifier() + self.state = 619 + self.match(SqlBaseParser.ADD) + self.state = 623 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IF: + self.state = 620 + self.match(SqlBaseParser.IF) + self.state = 621 + self.match(SqlBaseParser.NOT) + self.state = 622 + self.match(SqlBaseParser.EXISTS) + + + self.state = 626 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 625 + self.partitionSpecLocation() + self.state = 628 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.PARTITION): + break + + pass + + elif la_ == 29: + localctx = SqlBaseParser.RenameTablePartitionContext(self, localctx) + self.enterOuterAlt(localctx, 29) + self.state = 630 + self.match(SqlBaseParser.ALTER) + self.state = 631 + self.match(SqlBaseParser.TABLE) + self.state = 632 + self.multipartIdentifier() + self.state = 633 + localctx.from_ = self.partitionSpec() + self.state = 634 + self.match(SqlBaseParser.RENAME) + self.state = 635 + self.match(SqlBaseParser.TO) + self.state = 636 + localctx.to = self.partitionSpec() + pass + + elif la_ == 30: + localctx = SqlBaseParser.DropTablePartitionsContext(self, localctx) + self.enterOuterAlt(localctx, 30) + self.state = 638 + self.match(SqlBaseParser.ALTER) + self.state = 639 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 640 + self.multipartIdentifier() + self.state = 641 + self.match(SqlBaseParser.DROP) + self.state = 644 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IF: + self.state = 642 + self.match(SqlBaseParser.IF) + self.state = 643 + self.match(SqlBaseParser.EXISTS) + + + self.state = 646 + self.partitionSpec() + self.state = 651 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 647 + self.match(SqlBaseParser.T__3) + self.state = 648 + self.partitionSpec() + self.state = 653 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 655 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PURGE: + self.state = 654 + self.match(SqlBaseParser.PURGE) + + + pass + + elif la_ == 31: + localctx = SqlBaseParser.SetTableLocationContext(self, localctx) + self.enterOuterAlt(localctx, 31) + self.state = 657 + self.match(SqlBaseParser.ALTER) + self.state = 658 + self.match(SqlBaseParser.TABLE) + self.state = 659 + self.multipartIdentifier() + self.state = 661 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 660 + self.partitionSpec() + + + self.state = 663 + self.match(SqlBaseParser.SET) + self.state = 664 + self.locationSpec() + pass + + elif la_ == 32: + localctx = SqlBaseParser.RecoverPartitionsContext(self, localctx) + self.enterOuterAlt(localctx, 32) + self.state = 666 + self.match(SqlBaseParser.ALTER) + self.state = 667 + self.match(SqlBaseParser.TABLE) + self.state = 668 + self.multipartIdentifier() + self.state = 669 + self.match(SqlBaseParser.RECOVER) + self.state = 670 + self.match(SqlBaseParser.PARTITIONS) + pass + + elif la_ == 33: + localctx = SqlBaseParser.DropTableContext(self, localctx) + self.enterOuterAlt(localctx, 33) + self.state = 672 + self.match(SqlBaseParser.DROP) + self.state = 673 + self.match(SqlBaseParser.TABLE) + self.state = 676 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,48,self._ctx) + if la_ == 1: + self.state = 674 + self.match(SqlBaseParser.IF) + self.state = 675 + self.match(SqlBaseParser.EXISTS) + + + self.state = 678 + self.multipartIdentifier() + self.state = 680 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PURGE: + self.state = 679 + self.match(SqlBaseParser.PURGE) + + + pass + + elif la_ == 34: + localctx = SqlBaseParser.DropViewContext(self, localctx) + self.enterOuterAlt(localctx, 34) + self.state = 682 + self.match(SqlBaseParser.DROP) + self.state = 683 + self.match(SqlBaseParser.VIEW) + self.state = 686 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,50,self._ctx) + if la_ == 1: + self.state = 684 + self.match(SqlBaseParser.IF) + self.state = 685 + self.match(SqlBaseParser.EXISTS) + + + self.state = 688 + self.multipartIdentifier() + pass + + elif la_ == 35: + localctx = SqlBaseParser.CreateViewContext(self, localctx) + self.enterOuterAlt(localctx, 35) + self.state = 689 + self.match(SqlBaseParser.CREATE) + self.state = 692 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OR: + self.state = 690 + self.match(SqlBaseParser.OR) + self.state = 691 + self.match(SqlBaseParser.REPLACE) + + + self.state = 698 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.GLOBAL or _la==SqlBaseParser.TEMPORARY: + self.state = 695 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.GLOBAL: + self.state = 694 + self.match(SqlBaseParser.GLOBAL) + + + self.state = 697 + self.match(SqlBaseParser.TEMPORARY) + + + self.state = 700 + self.match(SqlBaseParser.VIEW) + self.state = 704 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,54,self._ctx) + if la_ == 1: + self.state = 701 + self.match(SqlBaseParser.IF) + self.state = 702 + self.match(SqlBaseParser.NOT) + self.state = 703 + self.match(SqlBaseParser.EXISTS) + + + self.state = 706 + self.multipartIdentifier() + self.state = 708 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1: + self.state = 707 + self.identifierCommentList() + + + self.state = 718 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.PARTITIONED or _la==SqlBaseParser.TBLPROPERTIES: + self.state = 716 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.COMMENT]: + self.state = 710 + self.commentSpec() + pass + elif token in [SqlBaseParser.PARTITIONED]: + self.state = 711 + self.match(SqlBaseParser.PARTITIONED) + self.state = 712 + self.match(SqlBaseParser.ON) + self.state = 713 + self.identifierList() + pass + elif token in [SqlBaseParser.TBLPROPERTIES]: + self.state = 714 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 715 + self.tablePropertyList() + pass + else: + raise NoViableAltException(self) + + self.state = 720 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 721 + self.match(SqlBaseParser.AS) + self.state = 722 + self.query() + pass + + elif la_ == 36: + localctx = SqlBaseParser.CreateTempViewUsingContext(self, localctx) + self.enterOuterAlt(localctx, 36) + self.state = 724 + self.match(SqlBaseParser.CREATE) + self.state = 727 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OR: + self.state = 725 + self.match(SqlBaseParser.OR) + self.state = 726 + self.match(SqlBaseParser.REPLACE) + + + self.state = 730 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.GLOBAL: + self.state = 729 + self.match(SqlBaseParser.GLOBAL) + + + self.state = 732 + self.match(SqlBaseParser.TEMPORARY) + self.state = 733 + self.match(SqlBaseParser.VIEW) + self.state = 734 + self.tableIdentifier() + self.state = 739 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1: + self.state = 735 + self.match(SqlBaseParser.T__1) + self.state = 736 + self.colTypeList() + self.state = 737 + self.match(SqlBaseParser.T__2) + + + self.state = 741 + self.tableProvider() + self.state = 744 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OPTIONS: + self.state = 742 + self.match(SqlBaseParser.OPTIONS) + self.state = 743 + self.tablePropertyList() + + + pass + + elif la_ == 37: + localctx = SqlBaseParser.AlterViewQueryContext(self, localctx) + self.enterOuterAlt(localctx, 37) + self.state = 746 + self.match(SqlBaseParser.ALTER) + self.state = 747 + self.match(SqlBaseParser.VIEW) + self.state = 748 + self.multipartIdentifier() + self.state = 750 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 749 + self.match(SqlBaseParser.AS) + + + self.state = 752 + self.query() + pass + + elif la_ == 38: + localctx = SqlBaseParser.CreateFunctionContext(self, localctx) + self.enterOuterAlt(localctx, 38) + self.state = 754 + self.match(SqlBaseParser.CREATE) + self.state = 757 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OR: + self.state = 755 + self.match(SqlBaseParser.OR) + self.state = 756 + self.match(SqlBaseParser.REPLACE) + + + self.state = 760 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.TEMPORARY: + self.state = 759 + self.match(SqlBaseParser.TEMPORARY) + + + self.state = 762 + self.match(SqlBaseParser.FUNCTION) + self.state = 766 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,65,self._ctx) + if la_ == 1: + self.state = 763 + self.match(SqlBaseParser.IF) + self.state = 764 + self.match(SqlBaseParser.NOT) + self.state = 765 + self.match(SqlBaseParser.EXISTS) + + + self.state = 768 + self.multipartIdentifier() + self.state = 769 + self.match(SqlBaseParser.AS) + self.state = 770 + localctx.className = self.match(SqlBaseParser.STRING) + self.state = 780 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.USING: + self.state = 771 + self.match(SqlBaseParser.USING) + self.state = 772 + self.resource() + self.state = 777 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 773 + self.match(SqlBaseParser.T__3) + self.state = 774 + self.resource() + self.state = 779 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + pass + + elif la_ == 39: + localctx = SqlBaseParser.DropFunctionContext(self, localctx) + self.enterOuterAlt(localctx, 39) + self.state = 782 + self.match(SqlBaseParser.DROP) + self.state = 784 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.TEMPORARY: + self.state = 783 + self.match(SqlBaseParser.TEMPORARY) + + + self.state = 786 + self.match(SqlBaseParser.FUNCTION) + self.state = 789 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,69,self._ctx) + if la_ == 1: + self.state = 787 + self.match(SqlBaseParser.IF) + self.state = 788 + self.match(SqlBaseParser.EXISTS) + + + self.state = 791 + self.multipartIdentifier() + pass + + elif la_ == 40: + localctx = SqlBaseParser.ExplainContext(self, localctx) + self.enterOuterAlt(localctx, 40) + self.state = 792 + self.match(SqlBaseParser.EXPLAIN) + self.state = 794 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,70,self._ctx) + if la_ == 1: + self.state = 793 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.CODEGEN or _la==SqlBaseParser.COST or ((((_la - 86)) & ~0x3f) == 0 and ((1 << (_la - 86)) & ((1 << (SqlBaseParser.EXTENDED - 86)) | (1 << (SqlBaseParser.FORMATTED - 86)) | (1 << (SqlBaseParser.LOGICAL - 86)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 796 + self.statement() + pass + + elif la_ == 41: + localctx = SqlBaseParser.ShowTablesContext(self, localctx) + self.enterOuterAlt(localctx, 41) + self.state = 797 + self.match(SqlBaseParser.SHOW) + self.state = 798 + self.match(SqlBaseParser.TABLES) + self.state = 801 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: + self.state = 799 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 800 + self.multipartIdentifier() + + + self.state = 807 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: + self.state = 804 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE: + self.state = 803 + self.match(SqlBaseParser.LIKE) + + + self.state = 806 + localctx.pattern = self.match(SqlBaseParser.STRING) + + + pass + + elif la_ == 42: + localctx = SqlBaseParser.ShowTableContext(self, localctx) + self.enterOuterAlt(localctx, 42) + self.state = 809 + self.match(SqlBaseParser.SHOW) + self.state = 810 + self.match(SqlBaseParser.TABLE) + self.state = 811 + self.match(SqlBaseParser.EXTENDED) + self.state = 814 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: + self.state = 812 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 813 + localctx.ns = self.multipartIdentifier() + + + self.state = 816 + self.match(SqlBaseParser.LIKE) + self.state = 817 + localctx.pattern = self.match(SqlBaseParser.STRING) + self.state = 819 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 818 + self.partitionSpec() + + + pass + + elif la_ == 43: + localctx = SqlBaseParser.ShowTblPropertiesContext(self, localctx) + self.enterOuterAlt(localctx, 43) + self.state = 821 + self.match(SqlBaseParser.SHOW) + self.state = 822 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 823 + localctx.table = self.multipartIdentifier() + self.state = 828 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1: + self.state = 824 + self.match(SqlBaseParser.T__1) + self.state = 825 + localctx.key = self.tablePropertyKey() + self.state = 826 + self.match(SqlBaseParser.T__2) + + + pass + + elif la_ == 44: + localctx = SqlBaseParser.ShowColumnsContext(self, localctx) + self.enterOuterAlt(localctx, 44) + self.state = 830 + self.match(SqlBaseParser.SHOW) + self.state = 831 + self.match(SqlBaseParser.COLUMNS) + self.state = 832 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 833 + localctx.table = self.multipartIdentifier() + self.state = 836 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: + self.state = 834 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 835 + localctx.ns = self.multipartIdentifier() + + + pass + + elif la_ == 45: + localctx = SqlBaseParser.ShowViewsContext(self, localctx) + self.enterOuterAlt(localctx, 45) + self.state = 838 + self.match(SqlBaseParser.SHOW) + self.state = 839 + self.match(SqlBaseParser.VIEWS) + self.state = 842 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: + self.state = 840 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 841 + self.multipartIdentifier() + + + self.state = 848 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: + self.state = 845 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LIKE: + self.state = 844 + self.match(SqlBaseParser.LIKE) + + + self.state = 847 + localctx.pattern = self.match(SqlBaseParser.STRING) + + + pass + + elif la_ == 46: + localctx = SqlBaseParser.ShowPartitionsContext(self, localctx) + self.enterOuterAlt(localctx, 46) + self.state = 850 + self.match(SqlBaseParser.SHOW) + self.state = 851 + self.match(SqlBaseParser.PARTITIONS) + self.state = 852 + self.multipartIdentifier() + self.state = 854 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 853 + self.partitionSpec() + + + pass + + elif la_ == 47: + localctx = SqlBaseParser.ShowFunctionsContext(self, localctx) + self.enterOuterAlt(localctx, 47) + self.state = 856 + self.match(SqlBaseParser.SHOW) + self.state = 858 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) + if la_ == 1: + self.state = 857 + self.identifier() + + + self.state = 860 + self.match(SqlBaseParser.FUNCTIONS) + self.state = 868 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,85,self._ctx) + if la_ == 1: + self.state = 862 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,83,self._ctx) + if la_ == 1: + self.state = 861 + self.match(SqlBaseParser.LIKE) + + + self.state = 866 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,84,self._ctx) + if la_ == 1: + self.state = 864 + self.multipartIdentifier() + pass + + elif la_ == 2: + self.state = 865 + localctx.pattern = self.match(SqlBaseParser.STRING) + pass + + + + + pass + + elif la_ == 48: + localctx = SqlBaseParser.ShowCreateTableContext(self, localctx) + self.enterOuterAlt(localctx, 48) + self.state = 870 + self.match(SqlBaseParser.SHOW) + self.state = 871 + self.match(SqlBaseParser.CREATE) + self.state = 872 + self.match(SqlBaseParser.TABLE) + self.state = 873 + self.multipartIdentifier() + self.state = 876 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 874 + self.match(SqlBaseParser.AS) + self.state = 875 + self.match(SqlBaseParser.SERDE) + + + pass + + elif la_ == 49: + localctx = SqlBaseParser.ShowCurrentNamespaceContext(self, localctx) + self.enterOuterAlt(localctx, 49) + self.state = 878 + self.match(SqlBaseParser.SHOW) + self.state = 879 + self.match(SqlBaseParser.CURRENT) + self.state = 880 + self.match(SqlBaseParser.NAMESPACE) + pass + + elif la_ == 50: + localctx = SqlBaseParser.DescribeFunctionContext(self, localctx) + self.enterOuterAlt(localctx, 50) + self.state = 881 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 882 + self.match(SqlBaseParser.FUNCTION) + self.state = 884 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,87,self._ctx) + if la_ == 1: + self.state = 883 + self.match(SqlBaseParser.EXTENDED) + + + self.state = 886 + self.describeFuncName() + pass + + elif la_ == 51: + localctx = SqlBaseParser.DescribeNamespaceContext(self, localctx) + self.enterOuterAlt(localctx, 51) + self.state = 887 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 888 + self.namespace() + self.state = 890 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,88,self._ctx) + if la_ == 1: + self.state = 889 + self.match(SqlBaseParser.EXTENDED) + + + self.state = 892 + self.multipartIdentifier() + pass + + elif la_ == 52: + localctx = SqlBaseParser.DescribeRelationContext(self, localctx) + self.enterOuterAlt(localctx, 52) + self.state = 894 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 896 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) + if la_ == 1: + self.state = 895 + self.match(SqlBaseParser.TABLE) + + + self.state = 899 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,90,self._ctx) + if la_ == 1: + self.state = 898 + localctx.option = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.EXTENDED or _la==SqlBaseParser.FORMATTED): + localctx.option = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 901 + self.multipartIdentifier() + self.state = 903 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,91,self._ctx) + if la_ == 1: + self.state = 902 + self.partitionSpec() + + + self.state = 906 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,92,self._ctx) + if la_ == 1: + self.state = 905 + self.describeColName() + + + pass + + elif la_ == 53: + localctx = SqlBaseParser.DescribeQueryContext(self, localctx) + self.enterOuterAlt(localctx, 53) + self.state = 908 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 910 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.QUERY: + self.state = 909 + self.match(SqlBaseParser.QUERY) + + + self.state = 912 + self.query() + pass + + elif la_ == 54: + localctx = SqlBaseParser.CommentNamespaceContext(self, localctx) + self.enterOuterAlt(localctx, 54) + self.state = 913 + self.match(SqlBaseParser.COMMENT) + self.state = 914 + self.match(SqlBaseParser.ON) + self.state = 915 + self.namespace() + self.state = 916 + self.multipartIdentifier() + self.state = 917 + self.match(SqlBaseParser.IS) + self.state = 918 + localctx.comment = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.NULL or _la==SqlBaseParser.STRING): + localctx.comment = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 55: + localctx = SqlBaseParser.CommentTableContext(self, localctx) + self.enterOuterAlt(localctx, 55) + self.state = 920 + self.match(SqlBaseParser.COMMENT) + self.state = 921 + self.match(SqlBaseParser.ON) + self.state = 922 + self.match(SqlBaseParser.TABLE) + self.state = 923 + self.multipartIdentifier() + self.state = 924 + self.match(SqlBaseParser.IS) + self.state = 925 + localctx.comment = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.NULL or _la==SqlBaseParser.STRING): + localctx.comment = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 56: + localctx = SqlBaseParser.RefreshTableContext(self, localctx) + self.enterOuterAlt(localctx, 56) + self.state = 927 + self.match(SqlBaseParser.REFRESH) + self.state = 928 + self.match(SqlBaseParser.TABLE) + self.state = 929 + self.multipartIdentifier() + pass + + elif la_ == 57: + localctx = SqlBaseParser.RefreshResourceContext(self, localctx) + self.enterOuterAlt(localctx, 57) + self.state = 930 + self.match(SqlBaseParser.REFRESH) + self.state = 938 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,95,self._ctx) + if la_ == 1: + self.state = 931 + self.match(SqlBaseParser.STRING) + pass + + elif la_ == 2: + self.state = 935 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) + while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1+1: + self.state = 932 + self.matchWildcard() + self.state = 937 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) + + pass + + + pass + + elif la_ == 58: + localctx = SqlBaseParser.CacheTableContext(self, localctx) + self.enterOuterAlt(localctx, 58) + self.state = 940 + self.match(SqlBaseParser.CACHE) + self.state = 942 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LAZY: + self.state = 941 + self.match(SqlBaseParser.LAZY) + + + self.state = 944 + self.match(SqlBaseParser.TABLE) + self.state = 945 + self.multipartIdentifier() + self.state = 948 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OPTIONS: + self.state = 946 + self.match(SqlBaseParser.OPTIONS) + self.state = 947 + localctx.options = self.tablePropertyList() + + + self.state = 954 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: + self.state = 951 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 950 + self.match(SqlBaseParser.AS) + + + self.state = 953 + self.query() + + + pass + + elif la_ == 59: + localctx = SqlBaseParser.UncacheTableContext(self, localctx) + self.enterOuterAlt(localctx, 59) + self.state = 956 + self.match(SqlBaseParser.UNCACHE) + self.state = 957 + self.match(SqlBaseParser.TABLE) + self.state = 960 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,100,self._ctx) + if la_ == 1: + self.state = 958 + self.match(SqlBaseParser.IF) + self.state = 959 + self.match(SqlBaseParser.EXISTS) + + + self.state = 962 + self.multipartIdentifier() + pass + + elif la_ == 60: + localctx = SqlBaseParser.ClearCacheContext(self, localctx) + self.enterOuterAlt(localctx, 60) + self.state = 963 + self.match(SqlBaseParser.CLEAR) + self.state = 964 + self.match(SqlBaseParser.CACHE) + pass + + elif la_ == 61: + localctx = SqlBaseParser.LoadDataContext(self, localctx) + self.enterOuterAlt(localctx, 61) + self.state = 965 + self.match(SqlBaseParser.LOAD) + self.state = 966 + self.match(SqlBaseParser.DATA) + self.state = 968 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LOCAL: + self.state = 967 + self.match(SqlBaseParser.LOCAL) + + + self.state = 970 + self.match(SqlBaseParser.INPATH) + self.state = 971 + localctx.path = self.match(SqlBaseParser.STRING) + self.state = 973 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OVERWRITE: + self.state = 972 + self.match(SqlBaseParser.OVERWRITE) + + + self.state = 975 + self.match(SqlBaseParser.INTO) + self.state = 976 + self.match(SqlBaseParser.TABLE) + self.state = 977 + self.multipartIdentifier() + self.state = 979 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 978 + self.partitionSpec() + + + pass + + elif la_ == 62: + localctx = SqlBaseParser.TruncateTableContext(self, localctx) + self.enterOuterAlt(localctx, 62) + self.state = 981 + self.match(SqlBaseParser.TRUNCATE) + self.state = 982 + self.match(SqlBaseParser.TABLE) + self.state = 983 + self.multipartIdentifier() + self.state = 985 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 984 + self.partitionSpec() + + + pass + + elif la_ == 63: + localctx = SqlBaseParser.RepairTableContext(self, localctx) + self.enterOuterAlt(localctx, 63) + self.state = 987 + self.match(SqlBaseParser.MSCK) + self.state = 988 + self.match(SqlBaseParser.REPAIR) + self.state = 989 + self.match(SqlBaseParser.TABLE) + self.state = 990 + self.multipartIdentifier() + pass + + elif la_ == 64: + localctx = SqlBaseParser.ManageResourceContext(self, localctx) + self.enterOuterAlt(localctx, 64) + self.state = 991 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ADD or _la==SqlBaseParser.LIST): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 992 + self.identifier() + self.state = 1000 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,106,self._ctx) + if la_ == 1: + self.state = 993 + self.match(SqlBaseParser.STRING) + pass + + elif la_ == 2: + self.state = 997 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,105,self._ctx) + while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1+1: + self.state = 994 + self.matchWildcard() + self.state = 999 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,105,self._ctx) + + pass + + + pass + + elif la_ == 65: + localctx = SqlBaseParser.FailNativeCommandContext(self, localctx) + self.enterOuterAlt(localctx, 65) + self.state = 1002 + self.match(SqlBaseParser.SET) + self.state = 1003 + self.match(SqlBaseParser.ROLE) + self.state = 1007 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,107,self._ctx) + while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1+1: + self.state = 1004 + self.matchWildcard() + self.state = 1009 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,107,self._ctx) + + pass + + elif la_ == 66: + localctx = SqlBaseParser.SetConfigurationContext(self, localctx) + self.enterOuterAlt(localctx, 66) + self.state = 1010 + self.match(SqlBaseParser.SET) + self.state = 1014 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,108,self._ctx) + while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1+1: + self.state = 1011 + self.matchWildcard() + self.state = 1016 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,108,self._ctx) + + pass + + elif la_ == 67: + localctx = SqlBaseParser.ResetConfigurationContext(self, localctx) + self.enterOuterAlt(localctx, 67) + self.state = 1017 + self.match(SqlBaseParser.RESET) + pass + + elif la_ == 68: + localctx = SqlBaseParser.FailNativeCommandContext(self, localctx) + self.enterOuterAlt(localctx, 68) + self.state = 1018 + self.unsupportedHiveNativeCommands() + self.state = 1022 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,109,self._ctx) + while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1+1: + self.state = 1019 + self.matchWildcard() + self.state = 1024 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,109,self._ctx) + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class UnsupportedHiveNativeCommandsContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.kw1 = None # Token + self.kw2 = None # Token + self.kw3 = None # Token + self.kw4 = None # Token + self.kw5 = None # Token + self.kw6 = None # Token + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + + def ROLE(self): + return self.getToken(SqlBaseParser.ROLE, 0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + + def GRANT(self): + return self.getToken(SqlBaseParser.GRANT, 0) + + def REVOKE(self): + return self.getToken(SqlBaseParser.REVOKE, 0) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + + def PRINCIPALS(self): + return self.getToken(SqlBaseParser.PRINCIPALS, 0) + + def ROLES(self): + return self.getToken(SqlBaseParser.ROLES, 0) + + def CURRENT(self): + return self.getToken(SqlBaseParser.CURRENT, 0) + + def EXPORT(self): + return self.getToken(SqlBaseParser.EXPORT, 0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + + def IMPORT(self): + return self.getToken(SqlBaseParser.IMPORT, 0) + + def COMPACTIONS(self): + return self.getToken(SqlBaseParser.COMPACTIONS, 0) + + def TRANSACTIONS(self): + return self.getToken(SqlBaseParser.TRANSACTIONS, 0) + + def INDEXES(self): + return self.getToken(SqlBaseParser.INDEXES, 0) + + def LOCKS(self): + return self.getToken(SqlBaseParser.LOCKS, 0) + + def INDEX(self): + return self.getToken(SqlBaseParser.INDEX, 0) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + + def LOCK(self): + return self.getToken(SqlBaseParser.LOCK, 0) + + def DATABASE(self): + return self.getToken(SqlBaseParser.DATABASE, 0) + + def UNLOCK(self): + return self.getToken(SqlBaseParser.UNLOCK, 0) + + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + + def MACRO(self): + return self.getToken(SqlBaseParser.MACRO, 0) + + def tableIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def CLUSTERED(self): + return self.getToken(SqlBaseParser.CLUSTERED, 0) + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def SORTED(self): + return self.getToken(SqlBaseParser.SORTED, 0) + + def SKEWED(self): + return self.getToken(SqlBaseParser.SKEWED, 0) + + def STORED(self): + return self.getToken(SqlBaseParser.STORED, 0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def DIRECTORIES(self): + return self.getToken(SqlBaseParser.DIRECTORIES, 0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def LOCATION(self): + return self.getToken(SqlBaseParser.LOCATION, 0) + + def EXCHANGE(self): + return self.getToken(SqlBaseParser.EXCHANGE, 0) + + def PARTITION(self): + return self.getToken(SqlBaseParser.PARTITION, 0) + + def ARCHIVE(self): + return self.getToken(SqlBaseParser.ARCHIVE, 0) + + def UNARCHIVE(self): + return self.getToken(SqlBaseParser.UNARCHIVE, 0) + + def TOUCH(self): + return self.getToken(SqlBaseParser.TOUCH, 0) + + def COMPACT(self): + return self.getToken(SqlBaseParser.COMPACT, 0) + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def CONCATENATE(self): + return self.getToken(SqlBaseParser.CONCATENATE, 0) + + def FILEFORMAT(self): + return self.getToken(SqlBaseParser.FILEFORMAT, 0) + + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + + def START(self): + return self.getToken(SqlBaseParser.START, 0) + + def TRANSACTION(self): + return self.getToken(SqlBaseParser.TRANSACTION, 0) + + def COMMIT(self): + return self.getToken(SqlBaseParser.COMMIT, 0) + + def ROLLBACK(self): + return self.getToken(SqlBaseParser.ROLLBACK, 0) + + def DFS(self): + return self.getToken(SqlBaseParser.DFS, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_unsupportedHiveNativeCommands + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnsupportedHiveNativeCommands" ): + listener.enterUnsupportedHiveNativeCommands(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnsupportedHiveNativeCommands" ): + listener.exitUnsupportedHiveNativeCommands(self) + + + + + def unsupportedHiveNativeCommands(self): + + localctx = SqlBaseParser.UnsupportedHiveNativeCommandsContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_unsupportedHiveNativeCommands) + self._la = 0 # Token type + try: + self.state = 1195 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,118,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1027 + localctx.kw1 = self.match(SqlBaseParser.CREATE) + self.state = 1028 + localctx.kw2 = self.match(SqlBaseParser.ROLE) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1029 + localctx.kw1 = self.match(SqlBaseParser.DROP) + self.state = 1030 + localctx.kw2 = self.match(SqlBaseParser.ROLE) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 1031 + localctx.kw1 = self.match(SqlBaseParser.GRANT) + self.state = 1033 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,111,self._ctx) + if la_ == 1: + self.state = 1032 + localctx.kw2 = self.match(SqlBaseParser.ROLE) + + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 1035 + localctx.kw1 = self.match(SqlBaseParser.REVOKE) + self.state = 1037 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,112,self._ctx) + if la_ == 1: + self.state = 1036 + localctx.kw2 = self.match(SqlBaseParser.ROLE) + + + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 1039 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1040 + localctx.kw2 = self.match(SqlBaseParser.GRANT) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 1041 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1042 + localctx.kw2 = self.match(SqlBaseParser.ROLE) + self.state = 1044 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,113,self._ctx) + if la_ == 1: + self.state = 1043 + localctx.kw3 = self.match(SqlBaseParser.GRANT) + + + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 1046 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1047 + localctx.kw2 = self.match(SqlBaseParser.PRINCIPALS) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 1048 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1049 + localctx.kw2 = self.match(SqlBaseParser.ROLES) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 1050 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1051 + localctx.kw2 = self.match(SqlBaseParser.CURRENT) + self.state = 1052 + localctx.kw3 = self.match(SqlBaseParser.ROLES) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 1053 + localctx.kw1 = self.match(SqlBaseParser.EXPORT) + self.state = 1054 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 1055 + localctx.kw1 = self.match(SqlBaseParser.IMPORT) + self.state = 1056 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 1057 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1058 + localctx.kw2 = self.match(SqlBaseParser.COMPACTIONS) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 1059 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1060 + localctx.kw2 = self.match(SqlBaseParser.CREATE) + self.state = 1061 + localctx.kw3 = self.match(SqlBaseParser.TABLE) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 1062 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1063 + localctx.kw2 = self.match(SqlBaseParser.TRANSACTIONS) + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 1064 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1065 + localctx.kw2 = self.match(SqlBaseParser.INDEXES) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 1066 + localctx.kw1 = self.match(SqlBaseParser.SHOW) + self.state = 1067 + localctx.kw2 = self.match(SqlBaseParser.LOCKS) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 1068 + localctx.kw1 = self.match(SqlBaseParser.CREATE) + self.state = 1069 + localctx.kw2 = self.match(SqlBaseParser.INDEX) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 1070 + localctx.kw1 = self.match(SqlBaseParser.DROP) + self.state = 1071 + localctx.kw2 = self.match(SqlBaseParser.INDEX) + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 1072 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1073 + localctx.kw2 = self.match(SqlBaseParser.INDEX) + pass + + elif la_ == 20: + self.enterOuterAlt(localctx, 20) + self.state = 1074 + localctx.kw1 = self.match(SqlBaseParser.LOCK) + self.state = 1075 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + pass + + elif la_ == 21: + self.enterOuterAlt(localctx, 21) + self.state = 1076 + localctx.kw1 = self.match(SqlBaseParser.LOCK) + self.state = 1077 + localctx.kw2 = self.match(SqlBaseParser.DATABASE) + pass + + elif la_ == 22: + self.enterOuterAlt(localctx, 22) + self.state = 1078 + localctx.kw1 = self.match(SqlBaseParser.UNLOCK) + self.state = 1079 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + pass + + elif la_ == 23: + self.enterOuterAlt(localctx, 23) + self.state = 1080 + localctx.kw1 = self.match(SqlBaseParser.UNLOCK) + self.state = 1081 + localctx.kw2 = self.match(SqlBaseParser.DATABASE) + pass + + elif la_ == 24: + self.enterOuterAlt(localctx, 24) + self.state = 1082 + localctx.kw1 = self.match(SqlBaseParser.CREATE) + self.state = 1083 + localctx.kw2 = self.match(SqlBaseParser.TEMPORARY) + self.state = 1084 + localctx.kw3 = self.match(SqlBaseParser.MACRO) + pass + + elif la_ == 25: + self.enterOuterAlt(localctx, 25) + self.state = 1085 + localctx.kw1 = self.match(SqlBaseParser.DROP) + self.state = 1086 + localctx.kw2 = self.match(SqlBaseParser.TEMPORARY) + self.state = 1087 + localctx.kw3 = self.match(SqlBaseParser.MACRO) + pass + + elif la_ == 26: + self.enterOuterAlt(localctx, 26) + self.state = 1088 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1089 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1090 + self.tableIdentifier() + self.state = 1091 + localctx.kw3 = self.match(SqlBaseParser.NOT) + self.state = 1092 + localctx.kw4 = self.match(SqlBaseParser.CLUSTERED) + pass + + elif la_ == 27: + self.enterOuterAlt(localctx, 27) + self.state = 1094 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1095 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1096 + self.tableIdentifier() + self.state = 1097 + localctx.kw3 = self.match(SqlBaseParser.CLUSTERED) + self.state = 1098 + localctx.kw4 = self.match(SqlBaseParser.BY) + pass + + elif la_ == 28: + self.enterOuterAlt(localctx, 28) + self.state = 1100 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1101 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1102 + self.tableIdentifier() + self.state = 1103 + localctx.kw3 = self.match(SqlBaseParser.NOT) + self.state = 1104 + localctx.kw4 = self.match(SqlBaseParser.SORTED) + pass + + elif la_ == 29: + self.enterOuterAlt(localctx, 29) + self.state = 1106 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1107 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1108 + self.tableIdentifier() + self.state = 1109 + localctx.kw3 = self.match(SqlBaseParser.SKEWED) + self.state = 1110 + localctx.kw4 = self.match(SqlBaseParser.BY) + pass + + elif la_ == 30: + self.enterOuterAlt(localctx, 30) + self.state = 1112 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1113 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1114 + self.tableIdentifier() + self.state = 1115 + localctx.kw3 = self.match(SqlBaseParser.NOT) + self.state = 1116 + localctx.kw4 = self.match(SqlBaseParser.SKEWED) + pass + + elif la_ == 31: + self.enterOuterAlt(localctx, 31) + self.state = 1118 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1119 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1120 + self.tableIdentifier() + self.state = 1121 + localctx.kw3 = self.match(SqlBaseParser.NOT) + self.state = 1122 + localctx.kw4 = self.match(SqlBaseParser.STORED) + self.state = 1123 + localctx.kw5 = self.match(SqlBaseParser.AS) + self.state = 1124 + localctx.kw6 = self.match(SqlBaseParser.DIRECTORIES) + pass + + elif la_ == 32: + self.enterOuterAlt(localctx, 32) + self.state = 1126 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1127 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1128 + self.tableIdentifier() + self.state = 1129 + localctx.kw3 = self.match(SqlBaseParser.SET) + self.state = 1130 + localctx.kw4 = self.match(SqlBaseParser.SKEWED) + self.state = 1131 + localctx.kw5 = self.match(SqlBaseParser.LOCATION) + pass + + elif la_ == 33: + self.enterOuterAlt(localctx, 33) + self.state = 1133 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1134 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1135 + self.tableIdentifier() + self.state = 1136 + localctx.kw3 = self.match(SqlBaseParser.EXCHANGE) + self.state = 1137 + localctx.kw4 = self.match(SqlBaseParser.PARTITION) + pass + + elif la_ == 34: + self.enterOuterAlt(localctx, 34) + self.state = 1139 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1140 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1141 + self.tableIdentifier() + self.state = 1142 + localctx.kw3 = self.match(SqlBaseParser.ARCHIVE) + self.state = 1143 + localctx.kw4 = self.match(SqlBaseParser.PARTITION) + pass + + elif la_ == 35: + self.enterOuterAlt(localctx, 35) + self.state = 1145 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1146 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1147 + self.tableIdentifier() + self.state = 1148 + localctx.kw3 = self.match(SqlBaseParser.UNARCHIVE) + self.state = 1149 + localctx.kw4 = self.match(SqlBaseParser.PARTITION) + pass + + elif la_ == 36: + self.enterOuterAlt(localctx, 36) + self.state = 1151 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1152 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1153 + self.tableIdentifier() + self.state = 1154 + localctx.kw3 = self.match(SqlBaseParser.TOUCH) + pass + + elif la_ == 37: + self.enterOuterAlt(localctx, 37) + self.state = 1156 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1157 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1158 + self.tableIdentifier() + self.state = 1160 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1159 + self.partitionSpec() + + + self.state = 1162 + localctx.kw3 = self.match(SqlBaseParser.COMPACT) + pass + + elif la_ == 38: + self.enterOuterAlt(localctx, 38) + self.state = 1164 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1165 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1166 + self.tableIdentifier() + self.state = 1168 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1167 + self.partitionSpec() + + + self.state = 1170 + localctx.kw3 = self.match(SqlBaseParser.CONCATENATE) + pass + + elif la_ == 39: + self.enterOuterAlt(localctx, 39) + self.state = 1172 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1173 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1174 + self.tableIdentifier() + self.state = 1176 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1175 + self.partitionSpec() + + + self.state = 1178 + localctx.kw3 = self.match(SqlBaseParser.SET) + self.state = 1179 + localctx.kw4 = self.match(SqlBaseParser.FILEFORMAT) + pass + + elif la_ == 40: + self.enterOuterAlt(localctx, 40) + self.state = 1181 + localctx.kw1 = self.match(SqlBaseParser.ALTER) + self.state = 1182 + localctx.kw2 = self.match(SqlBaseParser.TABLE) + self.state = 1183 + self.tableIdentifier() + self.state = 1185 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1184 + self.partitionSpec() + + + self.state = 1187 + localctx.kw3 = self.match(SqlBaseParser.REPLACE) + self.state = 1188 + localctx.kw4 = self.match(SqlBaseParser.COLUMNS) + pass + + elif la_ == 41: + self.enterOuterAlt(localctx, 41) + self.state = 1190 + localctx.kw1 = self.match(SqlBaseParser.START) + self.state = 1191 + localctx.kw2 = self.match(SqlBaseParser.TRANSACTION) + pass + + elif la_ == 42: + self.enterOuterAlt(localctx, 42) + self.state = 1192 + localctx.kw1 = self.match(SqlBaseParser.COMMIT) + pass + + elif la_ == 43: + self.enterOuterAlt(localctx, 43) + self.state = 1193 + localctx.kw1 = self.match(SqlBaseParser.ROLLBACK) + pass + + elif la_ == 44: + self.enterOuterAlt(localctx, 44) + self.state = 1194 + localctx.kw1 = self.match(SqlBaseParser.DFS) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class CreateTableHeaderContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + + def EXTERNAL(self): + return self.getToken(SqlBaseParser.EXTERNAL, 0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_createTableHeader + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateTableHeader" ): + listener.enterCreateTableHeader(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateTableHeader" ): + listener.exitCreateTableHeader(self) + + + + + def createTableHeader(self): + + localctx = SqlBaseParser.CreateTableHeaderContext(self, self._ctx, self.state) + self.enterRule(localctx, 18, self.RULE_createTableHeader) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1197 + self.match(SqlBaseParser.CREATE) + self.state = 1199 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.TEMPORARY: + self.state = 1198 + self.match(SqlBaseParser.TEMPORARY) + + + self.state = 1202 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.EXTERNAL: + self.state = 1201 + self.match(SqlBaseParser.EXTERNAL) + + + self.state = 1204 + self.match(SqlBaseParser.TABLE) + self.state = 1208 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,121,self._ctx) + if la_ == 1: + self.state = 1205 + self.match(SqlBaseParser.IF) + self.state = 1206 + self.match(SqlBaseParser.NOT) + self.state = 1207 + self.match(SqlBaseParser.EXISTS) + + + self.state = 1210 + self.multipartIdentifier() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ReplaceTableHeaderContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_replaceTableHeader + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReplaceTableHeader" ): + listener.enterReplaceTableHeader(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReplaceTableHeader" ): + listener.exitReplaceTableHeader(self) + + + + + def replaceTableHeader(self): + + localctx = SqlBaseParser.ReplaceTableHeaderContext(self, self._ctx, self.state) + self.enterRule(localctx, 20, self.RULE_replaceTableHeader) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1214 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.CREATE: + self.state = 1212 + self.match(SqlBaseParser.CREATE) + self.state = 1213 + self.match(SqlBaseParser.OR) + + + self.state = 1216 + self.match(SqlBaseParser.REPLACE) + self.state = 1217 + self.match(SqlBaseParser.TABLE) + self.state = 1218 + self.multipartIdentifier() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class BucketSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def CLUSTERED(self): + return self.getToken(SqlBaseParser.CLUSTERED, 0) + + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def INTO(self): + return self.getToken(SqlBaseParser.INTO, 0) + + def INTEGER_VALUE(self): + return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) + + def BUCKETS(self): + return self.getToken(SqlBaseParser.BUCKETS, 0) + + def SORTED(self): + return self.getToken(SqlBaseParser.SORTED, 0) + + def orderedIdentifierList(self): + return self.getTypedRuleContext(SqlBaseParser.OrderedIdentifierListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_bucketSpec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBucketSpec" ): + listener.enterBucketSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBucketSpec" ): + listener.exitBucketSpec(self) + + + + + def bucketSpec(self): + + localctx = SqlBaseParser.BucketSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 22, self.RULE_bucketSpec) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1220 + self.match(SqlBaseParser.CLUSTERED) + self.state = 1221 + self.match(SqlBaseParser.BY) + self.state = 1222 + self.identifierList() + self.state = 1226 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.SORTED: + self.state = 1223 + self.match(SqlBaseParser.SORTED) + self.state = 1224 + self.match(SqlBaseParser.BY) + self.state = 1225 + self.orderedIdentifierList() + + + self.state = 1228 + self.match(SqlBaseParser.INTO) + self.state = 1229 + self.match(SqlBaseParser.INTEGER_VALUE) + self.state = 1230 + self.match(SqlBaseParser.BUCKETS) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SkewSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def SKEWED(self): + return self.getToken(SqlBaseParser.SKEWED, 0) + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + + def constantList(self): + return self.getTypedRuleContext(SqlBaseParser.ConstantListContext,0) + + + def nestedConstantList(self): + return self.getTypedRuleContext(SqlBaseParser.NestedConstantListContext,0) + + + def STORED(self): + return self.getToken(SqlBaseParser.STORED, 0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def DIRECTORIES(self): + return self.getToken(SqlBaseParser.DIRECTORIES, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_skewSpec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSkewSpec" ): + listener.enterSkewSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSkewSpec" ): + listener.exitSkewSpec(self) + + + + + def skewSpec(self): + + localctx = SqlBaseParser.SkewSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 24, self.RULE_skewSpec) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1232 + self.match(SqlBaseParser.SKEWED) + self.state = 1233 + self.match(SqlBaseParser.BY) + self.state = 1234 + self.identifierList() + self.state = 1235 + self.match(SqlBaseParser.ON) + self.state = 1238 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,124,self._ctx) + if la_ == 1: + self.state = 1236 + self.constantList() + pass + + elif la_ == 2: + self.state = 1237 + self.nestedConstantList() + pass + + + self.state = 1243 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,125,self._ctx) + if la_ == 1: + self.state = 1240 + self.match(SqlBaseParser.STORED) + self.state = 1241 + self.match(SqlBaseParser.AS) + self.state = 1242 + self.match(SqlBaseParser.DIRECTORIES) + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class LocationSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LOCATION(self): + return self.getToken(SqlBaseParser.LOCATION, 0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_locationSpec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLocationSpec" ): + listener.enterLocationSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLocationSpec" ): + listener.exitLocationSpec(self) + + + + + def locationSpec(self): + + localctx = SqlBaseParser.LocationSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 26, self.RULE_locationSpec) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1245 + self.match(SqlBaseParser.LOCATION) + self.state = 1246 + self.match(SqlBaseParser.STRING) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class CommentSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def COMMENT(self): + return self.getToken(SqlBaseParser.COMMENT, 0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_commentSpec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCommentSpec" ): + listener.enterCommentSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCommentSpec" ): + listener.exitCommentSpec(self) + + + + + def commentSpec(self): + + localctx = SqlBaseParser.CommentSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 28, self.RULE_commentSpec) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1248 + self.match(SqlBaseParser.COMMENT) + self.state = 1249 + self.match(SqlBaseParser.STRING) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QueryContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def queryTerm(self): + return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,0) + + + def queryOrganization(self): + return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) + + + def ctes(self): + return self.getTypedRuleContext(SqlBaseParser.CtesContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_query + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQuery" ): + listener.enterQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQuery" ): + listener.exitQuery(self) + + + + + def query(self): + + localctx = SqlBaseParser.QueryContext(self, self._ctx, self.state) + self.enterRule(localctx, 30, self.RULE_query) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1252 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.WITH: + self.state = 1251 + self.ctes() + + + self.state = 1254 + self.queryTerm(0) + self.state = 1255 + self.queryOrganization() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class InsertIntoContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_insertInto + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class InsertOverwriteHiveDirContext(InsertIntoContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext + super().__init__(parser) + self.path = None # Token + self.copyFrom(ctx) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + def DIRECTORY(self): + return self.getToken(SqlBaseParser.DIRECTORY, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def LOCAL(self): + return self.getToken(SqlBaseParser.LOCAL, 0) + def rowFormat(self): + return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,0) + + def createFileFormat(self): + return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInsertOverwriteHiveDir" ): + listener.enterInsertOverwriteHiveDir(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInsertOverwriteHiveDir" ): + listener.exitInsertOverwriteHiveDir(self) + + + class InsertOverwriteDirContext(InsertIntoContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext + super().__init__(parser) + self.path = None # Token + self.options = None # TablePropertyListContext + self.copyFrom(ctx) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + def DIRECTORY(self): + return self.getToken(SqlBaseParser.DIRECTORY, 0) + def tableProvider(self): + return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) + + def LOCAL(self): + return self.getToken(SqlBaseParser.LOCAL, 0) + def OPTIONS(self): + return self.getToken(SqlBaseParser.OPTIONS, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInsertOverwriteDir" ): + listener.enterInsertOverwriteDir(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInsertOverwriteDir" ): + listener.exitInsertOverwriteDir(self) + + + class InsertOverwriteTableContext(InsertIntoContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext + super().__init__(parser) + self.copyFrom(ctx) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInsertOverwriteTable" ): + listener.enterInsertOverwriteTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInsertOverwriteTable" ): + listener.exitInsertOverwriteTable(self) + + + class InsertIntoTableContext(InsertIntoContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext + super().__init__(parser) + self.copyFrom(ctx) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + def INTO(self): + return self.getToken(SqlBaseParser.INTO, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInsertIntoTable" ): + listener.enterInsertIntoTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInsertIntoTable" ): + listener.exitInsertIntoTable(self) + + + + def insertInto(self): + + localctx = SqlBaseParser.InsertIntoContext(self, self._ctx, self.state) + self.enterRule(localctx, 32, self.RULE_insertInto) + self._la = 0 # Token type + try: + self.state = 1312 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,139,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.InsertOverwriteTableContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 1257 + self.match(SqlBaseParser.INSERT) + self.state = 1258 + self.match(SqlBaseParser.OVERWRITE) + self.state = 1260 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,127,self._ctx) + if la_ == 1: + self.state = 1259 + self.match(SqlBaseParser.TABLE) + + + self.state = 1262 + self.multipartIdentifier() + self.state = 1269 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1263 + self.partitionSpec() + self.state = 1267 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IF: + self.state = 1264 + self.match(SqlBaseParser.IF) + self.state = 1265 + self.match(SqlBaseParser.NOT) + self.state = 1266 + self.match(SqlBaseParser.EXISTS) + + + + + pass + + elif la_ == 2: + localctx = SqlBaseParser.InsertIntoTableContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 1271 + self.match(SqlBaseParser.INSERT) + self.state = 1272 + self.match(SqlBaseParser.INTO) + self.state = 1274 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,130,self._ctx) + if la_ == 1: + self.state = 1273 + self.match(SqlBaseParser.TABLE) + + + self.state = 1276 + self.multipartIdentifier() + self.state = 1278 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PARTITION: + self.state = 1277 + self.partitionSpec() + + + self.state = 1283 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IF: + self.state = 1280 + self.match(SqlBaseParser.IF) + self.state = 1281 + self.match(SqlBaseParser.NOT) + self.state = 1282 + self.match(SqlBaseParser.EXISTS) + + + pass + + elif la_ == 3: + localctx = SqlBaseParser.InsertOverwriteHiveDirContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 1285 + self.match(SqlBaseParser.INSERT) + self.state = 1286 + self.match(SqlBaseParser.OVERWRITE) + self.state = 1288 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LOCAL: + self.state = 1287 + self.match(SqlBaseParser.LOCAL) + + + self.state = 1290 + self.match(SqlBaseParser.DIRECTORY) + self.state = 1291 + localctx.path = self.match(SqlBaseParser.STRING) + self.state = 1293 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ROW: + self.state = 1292 + self.rowFormat() + + + self.state = 1296 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.STORED: + self.state = 1295 + self.createFileFormat() + + + pass + + elif la_ == 4: + localctx = SqlBaseParser.InsertOverwriteDirContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 1298 + self.match(SqlBaseParser.INSERT) + self.state = 1299 + self.match(SqlBaseParser.OVERWRITE) + self.state = 1301 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LOCAL: + self.state = 1300 + self.match(SqlBaseParser.LOCAL) + + + self.state = 1303 + self.match(SqlBaseParser.DIRECTORY) + self.state = 1305 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.STRING: + self.state = 1304 + localctx.path = self.match(SqlBaseParser.STRING) + + + self.state = 1307 + self.tableProvider() + self.state = 1310 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OPTIONS: + self.state = 1308 + self.match(SqlBaseParser.OPTIONS) + self.state = 1309 + localctx.options = self.tablePropertyList() + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PartitionSpecLocationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def partitionSpec(self): + return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) + + + def locationSpec(self): + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_partitionSpecLocation + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPartitionSpecLocation" ): + listener.enterPartitionSpecLocation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPartitionSpecLocation" ): + listener.exitPartitionSpecLocation(self) + + + + + def partitionSpecLocation(self): + + localctx = SqlBaseParser.PartitionSpecLocationContext(self, self._ctx, self.state) + self.enterRule(localctx, 34, self.RULE_partitionSpecLocation) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1314 + self.partitionSpec() + self.state = 1316 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LOCATION: + self.state = 1315 + self.locationSpec() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PartitionSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def PARTITION(self): + return self.getToken(SqlBaseParser.PARTITION, 0) + + def partitionVal(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PartitionValContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PartitionValContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_partitionSpec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPartitionSpec" ): + listener.enterPartitionSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPartitionSpec" ): + listener.exitPartitionSpec(self) + + + + + def partitionSpec(self): + + localctx = SqlBaseParser.PartitionSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 36, self.RULE_partitionSpec) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1318 + self.match(SqlBaseParser.PARTITION) + self.state = 1319 + self.match(SqlBaseParser.T__1) + self.state = 1320 + self.partitionVal() + self.state = 1325 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1321 + self.match(SqlBaseParser.T__3) + self.state = 1322 + self.partitionVal() + self.state = 1327 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1328 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PartitionValContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def EQ(self): + return self.getToken(SqlBaseParser.EQ, 0) + + def constant(self): + return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_partitionVal + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPartitionVal" ): + listener.enterPartitionVal(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPartitionVal" ): + listener.exitPartitionVal(self) + + + + + def partitionVal(self): + + localctx = SqlBaseParser.PartitionValContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_partitionVal) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1330 + self.identifier() + self.state = 1333 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.EQ: + self.state = 1331 + self.match(SqlBaseParser.EQ) + self.state = 1332 + self.constant() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NamespaceContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def NAMESPACE(self): + return self.getToken(SqlBaseParser.NAMESPACE, 0) + + def DATABASE(self): + return self.getToken(SqlBaseParser.DATABASE, 0) + + def SCHEMA(self): + return self.getToken(SqlBaseParser.SCHEMA, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_namespace + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamespace" ): + listener.enterNamespace(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamespace" ): + listener.exitNamespace(self) + + + + + def namespace(self): + + localctx = SqlBaseParser.NamespaceContext(self, self._ctx, self.state) + self.enterRule(localctx, 40, self.RULE_namespace) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1335 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DATABASE or _la==SqlBaseParser.NAMESPACE or _la==SqlBaseParser.SCHEMA): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class DescribeFuncNameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def comparisonOperator(self): + return self.getTypedRuleContext(SqlBaseParser.ComparisonOperatorContext,0) + + + def arithmeticOperator(self): + return self.getTypedRuleContext(SqlBaseParser.ArithmeticOperatorContext,0) + + + def predicateOperator(self): + return self.getTypedRuleContext(SqlBaseParser.PredicateOperatorContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_describeFuncName + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeFuncName" ): + listener.enterDescribeFuncName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeFuncName" ): + listener.exitDescribeFuncName(self) + + + + + def describeFuncName(self): + + localctx = SqlBaseParser.DescribeFuncNameContext(self, self._ctx, self.state) + self.enterRule(localctx, 42, self.RULE_describeFuncName) + try: + self.state = 1342 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,143,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1337 + self.qualifiedName() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1338 + self.match(SqlBaseParser.STRING) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 1339 + self.comparisonOperator() + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 1340 + self.arithmeticOperator() + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 1341 + self.predicateOperator() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class DescribeColNameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._identifier = None # IdentifierContext + self.nameParts = list() # of IdentifierContexts + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_describeColName + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDescribeColName" ): + listener.enterDescribeColName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDescribeColName" ): + listener.exitDescribeColName(self) + + + + + def describeColName(self): + + localctx = SqlBaseParser.DescribeColNameContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_describeColName) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1344 + localctx._identifier = self.identifier() + localctx.nameParts.append(localctx._identifier) + self.state = 1349 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__4: + self.state = 1345 + self.match(SqlBaseParser.T__4) + self.state = 1346 + localctx._identifier = self.identifier() + localctx.nameParts.append(localctx._identifier) + self.state = 1351 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class CtesContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + + def namedQuery(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NamedQueryContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NamedQueryContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_ctes + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCtes" ): + listener.enterCtes(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCtes" ): + listener.exitCtes(self) + + + + + def ctes(self): + + localctx = SqlBaseParser.CtesContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_ctes) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1352 + self.match(SqlBaseParser.WITH) + self.state = 1353 + self.namedQuery() + self.state = 1358 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1354 + self.match(SqlBaseParser.T__3) + self.state = 1355 + self.namedQuery() + self.state = 1360 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NamedQueryContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # ErrorCapturingIdentifierContext + self.columnAliases = None # IdentifierListContext + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_namedQuery + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedQuery" ): + listener.enterNamedQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedQuery" ): + listener.exitNamedQuery(self) + + + + + def namedQuery(self): + + localctx = SqlBaseParser.NamedQueryContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_namedQuery) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1361 + localctx.name = self.errorCapturingIdentifier() + self.state = 1363 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,146,self._ctx) + if la_ == 1: + self.state = 1362 + localctx.columnAliases = self.identifierList() + + + self.state = 1366 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AS: + self.state = 1365 + self.match(SqlBaseParser.AS) + + + self.state = 1368 + self.match(SqlBaseParser.T__1) + self.state = 1369 + self.query() + self.state = 1370 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TableProviderContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_tableProvider + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableProvider" ): + listener.enterTableProvider(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableProvider" ): + listener.exitTableProvider(self) + + + + + def tableProvider(self): + + localctx = SqlBaseParser.TableProviderContext(self, self._ctx, self.state) + self.enterRule(localctx, 50, self.RULE_tableProvider) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1372 + self.match(SqlBaseParser.USING) + self.state = 1373 + self.multipartIdentifier() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class CreateTableClausesContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.options = None # TablePropertyListContext + self.partitioning = None # TransformListContext + self.tableProps = None # TablePropertyListContext + + def bucketSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.BucketSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.BucketSpecContext,i) + + + def locationSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) + + + def commentSpec(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) + else: + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) + + + def OPTIONS(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.OPTIONS) + else: + return self.getToken(SqlBaseParser.OPTIONS, i) + + def PARTITIONED(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.PARTITIONED) + else: + return self.getToken(SqlBaseParser.PARTITIONED, i) + + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + + def TBLPROPERTIES(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.TBLPROPERTIES) + else: + return self.getToken(SqlBaseParser.TBLPROPERTIES, i) + + def tablePropertyList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) + + + def transformList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TransformListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TransformListContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_createTableClauses + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateTableClauses" ): + listener.enterCreateTableClauses(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateTableClauses" ): + listener.exitCreateTableClauses(self) + + + + + def createTableClauses(self): + + localctx = SqlBaseParser.CreateTableClausesContext(self, self._ctx, self.state) + self.enterRule(localctx, 52, self.RULE_createTableClauses) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1387 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.CLUSTERED or _la==SqlBaseParser.COMMENT or ((((_la - 138)) & ~0x3f) == 0 and ((1 << (_la - 138)) & ((1 << (SqlBaseParser.LOCATION - 138)) | (1 << (SqlBaseParser.OPTIONS - 138)) | (1 << (SqlBaseParser.PARTITIONED - 138)))) != 0) or _la==SqlBaseParser.TBLPROPERTIES: + self.state = 1385 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.OPTIONS]: + self.state = 1375 + self.match(SqlBaseParser.OPTIONS) + self.state = 1376 + localctx.options = self.tablePropertyList() + pass + elif token in [SqlBaseParser.PARTITIONED]: + self.state = 1377 + self.match(SqlBaseParser.PARTITIONED) + self.state = 1378 + self.match(SqlBaseParser.BY) + self.state = 1379 + localctx.partitioning = self.transformList() + pass + elif token in [SqlBaseParser.CLUSTERED]: + self.state = 1380 + self.bucketSpec() + pass + elif token in [SqlBaseParser.LOCATION]: + self.state = 1381 + self.locationSpec() + pass + elif token in [SqlBaseParser.COMMENT]: + self.state = 1382 + self.commentSpec() + pass + elif token in [SqlBaseParser.TBLPROPERTIES]: + self.state = 1383 + self.match(SqlBaseParser.TBLPROPERTIES) + self.state = 1384 + localctx.tableProps = self.tablePropertyList() + pass + else: + raise NoViableAltException(self) + + self.state = 1389 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TablePropertyListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def tableProperty(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TablePropertyContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TablePropertyContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_tablePropertyList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTablePropertyList" ): + listener.enterTablePropertyList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTablePropertyList" ): + listener.exitTablePropertyList(self) + + + + + def tablePropertyList(self): + + localctx = SqlBaseParser.TablePropertyListContext(self, self._ctx, self.state) + self.enterRule(localctx, 54, self.RULE_tablePropertyList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1390 + self.match(SqlBaseParser.T__1) + self.state = 1391 + self.tableProperty() + self.state = 1396 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1392 + self.match(SqlBaseParser.T__3) + self.state = 1393 + self.tableProperty() + self.state = 1398 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1399 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TablePropertyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.key = None # TablePropertyKeyContext + self.value = None # TablePropertyValueContext + + def tablePropertyKey(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyKeyContext,0) + + + def tablePropertyValue(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyValueContext,0) + + + def EQ(self): + return self.getToken(SqlBaseParser.EQ, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_tableProperty + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableProperty" ): + listener.enterTableProperty(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableProperty" ): + listener.exitTableProperty(self) + + + + + def tableProperty(self): + + localctx = SqlBaseParser.TablePropertyContext(self, self._ctx, self.state) + self.enterRule(localctx, 56, self.RULE_tableProperty) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1401 + localctx.key = self.tablePropertyKey() + self.state = 1406 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FALSE or ((((_la - 241)) & ~0x3f) == 0 and ((1 << (_la - 241)) & ((1 << (SqlBaseParser.TRUE - 241)) | (1 << (SqlBaseParser.EQ - 241)) | (1 << (SqlBaseParser.STRING - 241)) | (1 << (SqlBaseParser.INTEGER_VALUE - 241)) | (1 << (SqlBaseParser.DECIMAL_VALUE - 241)))) != 0): + self.state = 1403 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.EQ: + self.state = 1402 + self.match(SqlBaseParser.EQ) + + + self.state = 1405 + localctx.value = self.tablePropertyValue() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TablePropertyKeyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_tablePropertyKey + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTablePropertyKey" ): + listener.enterTablePropertyKey(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTablePropertyKey" ): + listener.exitTablePropertyKey(self) + + + + + def tablePropertyKey(self): + + localctx = SqlBaseParser.TablePropertyKeyContext(self, self._ctx, self.state) + self.enterRule(localctx, 58, self.RULE_tablePropertyKey) + self._la = 0 # Token type + try: + self.state = 1417 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,154,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1408 + self.identifier() + self.state = 1413 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__4: + self.state = 1409 + self.match(SqlBaseParser.T__4) + self.state = 1410 + self.identifier() + self.state = 1415 + self._errHandler.sync(self) + _la = self._input.LA(1) + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1416 + self.match(SqlBaseParser.STRING) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TablePropertyValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def INTEGER_VALUE(self): + return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) + + def DECIMAL_VALUE(self): + return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) + + def booleanValue(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanValueContext,0) + + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_tablePropertyValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTablePropertyValue" ): + listener.enterTablePropertyValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTablePropertyValue" ): + listener.exitTablePropertyValue(self) + + + + + def tablePropertyValue(self): + + localctx = SqlBaseParser.TablePropertyValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 60, self.RULE_tablePropertyValue) + try: + self.state = 1423 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.INTEGER_VALUE]: + self.enterOuterAlt(localctx, 1) + self.state = 1419 + self.match(SqlBaseParser.INTEGER_VALUE) + pass + elif token in [SqlBaseParser.DECIMAL_VALUE]: + self.enterOuterAlt(localctx, 2) + self.state = 1420 + self.match(SqlBaseParser.DECIMAL_VALUE) + pass + elif token in [SqlBaseParser.FALSE, SqlBaseParser.TRUE]: + self.enterOuterAlt(localctx, 3) + self.state = 1421 + self.booleanValue() + pass + elif token in [SqlBaseParser.STRING]: + self.enterOuterAlt(localctx, 4) + self.state = 1422 + self.match(SqlBaseParser.STRING) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ConstantListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def constant(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ConstantContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ConstantContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_constantList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstantList" ): + listener.enterConstantList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstantList" ): + listener.exitConstantList(self) + + + + + def constantList(self): + + localctx = SqlBaseParser.ConstantListContext(self, self._ctx, self.state) + self.enterRule(localctx, 62, self.RULE_constantList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1425 + self.match(SqlBaseParser.T__1) + self.state = 1426 + self.constant() + self.state = 1431 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1427 + self.match(SqlBaseParser.T__3) + self.state = 1428 + self.constant() + self.state = 1433 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1434 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NestedConstantListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def constantList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ConstantListContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ConstantListContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_nestedConstantList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNestedConstantList" ): + listener.enterNestedConstantList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNestedConstantList" ): + listener.exitNestedConstantList(self) + + + + + def nestedConstantList(self): + + localctx = SqlBaseParser.NestedConstantListContext(self, self._ctx, self.state) + self.enterRule(localctx, 64, self.RULE_nestedConstantList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1436 + self.match(SqlBaseParser.T__1) + self.state = 1437 + self.constantList() + self.state = 1442 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1438 + self.match(SqlBaseParser.T__3) + self.state = 1439 + self.constantList() + self.state = 1444 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1445 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class CreateFileFormatContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def STORED(self): + return self.getToken(SqlBaseParser.STORED, 0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def fileFormat(self): + return self.getTypedRuleContext(SqlBaseParser.FileFormatContext,0) + + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def storageHandler(self): + return self.getTypedRuleContext(SqlBaseParser.StorageHandlerContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_createFileFormat + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCreateFileFormat" ): + listener.enterCreateFileFormat(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCreateFileFormat" ): + listener.exitCreateFileFormat(self) + + + + + def createFileFormat(self): + + localctx = SqlBaseParser.CreateFileFormatContext(self, self._ctx, self.state) + self.enterRule(localctx, 66, self.RULE_createFileFormat) + try: + self.state = 1453 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,158,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1447 + self.match(SqlBaseParser.STORED) + self.state = 1448 + self.match(SqlBaseParser.AS) + self.state = 1449 + self.fileFormat() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1450 + self.match(SqlBaseParser.STORED) + self.state = 1451 + self.match(SqlBaseParser.BY) + self.state = 1452 + self.storageHandler() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FileFormatContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_fileFormat + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class TableFileFormatContext(FileFormatContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.FileFormatContext + super().__init__(parser) + self.inFmt = None # Token + self.outFmt = None # Token + self.copyFrom(ctx) + + def INPUTFORMAT(self): + return self.getToken(SqlBaseParser.INPUTFORMAT, 0) + def OUTPUTFORMAT(self): + return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) + def STRING(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.STRING) + else: + return self.getToken(SqlBaseParser.STRING, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableFileFormat" ): + listener.enterTableFileFormat(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableFileFormat" ): + listener.exitTableFileFormat(self) + + + class GenericFileFormatContext(FileFormatContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.FileFormatContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGenericFileFormat" ): + listener.enterGenericFileFormat(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGenericFileFormat" ): + listener.exitGenericFileFormat(self) + + + + def fileFormat(self): + + localctx = SqlBaseParser.FileFormatContext(self, self._ctx, self.state) + self.enterRule(localctx, 68, self.RULE_fileFormat) + try: + self.state = 1460 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,159,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.TableFileFormatContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 1455 + self.match(SqlBaseParser.INPUTFORMAT) + self.state = 1456 + localctx.inFmt = self.match(SqlBaseParser.STRING) + self.state = 1457 + self.match(SqlBaseParser.OUTPUTFORMAT) + self.state = 1458 + localctx.outFmt = self.match(SqlBaseParser.STRING) + pass + + elif la_ == 2: + localctx = SqlBaseParser.GenericFileFormatContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 1459 + self.identifier() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class StorageHandlerContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + + def SERDEPROPERTIES(self): + return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) + + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_storageHandler + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStorageHandler" ): + listener.enterStorageHandler(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStorageHandler" ): + listener.exitStorageHandler(self) + + + + + def storageHandler(self): + + localctx = SqlBaseParser.StorageHandlerContext(self, self._ctx, self.state) + self.enterRule(localctx, 70, self.RULE_storageHandler) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1462 + self.match(SqlBaseParser.STRING) + self.state = 1466 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,160,self._ctx) + if la_ == 1: + self.state = 1463 + self.match(SqlBaseParser.WITH) + self.state = 1464 + self.match(SqlBaseParser.SERDEPROPERTIES) + self.state = 1465 + self.tablePropertyList() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ResourceContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_resource + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterResource" ): + listener.enterResource(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitResource" ): + listener.exitResource(self) + + + + + def resource(self): + + localctx = SqlBaseParser.ResourceContext(self, self._ctx, self.state) + self.enterRule(localctx, 72, self.RULE_resource) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1468 + self.identifier() + self.state = 1469 + self.match(SqlBaseParser.STRING) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class DmlStatementNoWithContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_dmlStatementNoWith + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class DeleteFromTableContext(DmlStatementNoWithContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext + super().__init__(parser) + self.copyFrom(ctx) + + def DELETE(self): + return self.getToken(SqlBaseParser.DELETE, 0) + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + def whereClause(self): + return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDeleteFromTable" ): + listener.enterDeleteFromTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDeleteFromTable" ): + listener.exitDeleteFromTable(self) + + + class SingleInsertQueryContext(DmlStatementNoWithContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext + super().__init__(parser) + self.copyFrom(ctx) + + def insertInto(self): + return self.getTypedRuleContext(SqlBaseParser.InsertIntoContext,0) + + def queryTerm(self): + return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,0) + + def queryOrganization(self): + return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSingleInsertQuery" ): + listener.enterSingleInsertQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSingleInsertQuery" ): + listener.exitSingleInsertQuery(self) + + + class MultiInsertQueryContext(DmlStatementNoWithContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext + super().__init__(parser) + self.copyFrom(ctx) + + def fromClause(self): + return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) + + def multiInsertQueryBody(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultiInsertQueryBodyContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultiInsertQueryBodyContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMultiInsertQuery" ): + listener.enterMultiInsertQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMultiInsertQuery" ): + listener.exitMultiInsertQuery(self) + + + class UpdateTableContext(DmlStatementNoWithContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext + super().__init__(parser) + self.copyFrom(ctx) + + def UPDATE(self): + return self.getToken(SqlBaseParser.UPDATE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + def setClause(self): + return self.getTypedRuleContext(SqlBaseParser.SetClauseContext,0) + + def whereClause(self): + return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUpdateTable" ): + listener.enterUpdateTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUpdateTable" ): + listener.exitUpdateTable(self) + + + class MergeIntoTableContext(DmlStatementNoWithContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext + super().__init__(parser) + self.target = None # MultipartIdentifierContext + self.targetAlias = None # TableAliasContext + self.source = None # MultipartIdentifierContext + self.sourceQuery = None # QueryContext + self.sourceAlias = None # TableAliasContext + self.mergeCondition = None # BooleanExpressionContext + self.copyFrom(ctx) + + def MERGE(self): + return self.getToken(SqlBaseParser.MERGE, 0) + def INTO(self): + return self.getToken(SqlBaseParser.INTO, 0) + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + def tableAlias(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TableAliasContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,i) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def matchedClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MatchedClauseContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MatchedClauseContext,i) + + def notMatchedClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NotMatchedClauseContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NotMatchedClauseContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMergeIntoTable" ): + listener.enterMergeIntoTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMergeIntoTable" ): + listener.exitMergeIntoTable(self) + + + + def dmlStatementNoWith(self): + + localctx = SqlBaseParser.DmlStatementNoWithContext(self, self._ctx, self.state) + self.enterRule(localctx, 74, self.RULE_dmlStatementNoWith) + self._la = 0 # Token type + try: + self.state = 1522 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.INSERT]: + localctx = SqlBaseParser.SingleInsertQueryContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 1471 + self.insertInto() + self.state = 1472 + self.queryTerm(0) + self.state = 1473 + self.queryOrganization() + pass + elif token in [SqlBaseParser.FROM]: + localctx = SqlBaseParser.MultiInsertQueryContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 1475 + self.fromClause() + self.state = 1477 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 1476 + self.multiInsertQueryBody() + self.state = 1479 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.INSERT): + break + + pass + elif token in [SqlBaseParser.DELETE]: + localctx = SqlBaseParser.DeleteFromTableContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 1481 + self.match(SqlBaseParser.DELETE) + self.state = 1482 + self.match(SqlBaseParser.FROM) + self.state = 1483 + self.multipartIdentifier() + self.state = 1484 + self.tableAlias() + self.state = 1486 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.WHERE: + self.state = 1485 + self.whereClause() + + + pass + elif token in [SqlBaseParser.UPDATE]: + localctx = SqlBaseParser.UpdateTableContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 1488 + self.match(SqlBaseParser.UPDATE) + self.state = 1489 + self.multipartIdentifier() + self.state = 1490 + self.tableAlias() + self.state = 1491 + self.setClause() + self.state = 1493 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.WHERE: + self.state = 1492 + self.whereClause() + + + pass + elif token in [SqlBaseParser.MERGE]: + localctx = SqlBaseParser.MergeIntoTableContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 1495 + self.match(SqlBaseParser.MERGE) + self.state = 1496 + self.match(SqlBaseParser.INTO) + self.state = 1497 + localctx.target = self.multipartIdentifier() + self.state = 1498 + localctx.targetAlias = self.tableAlias() + self.state = 1499 + self.match(SqlBaseParser.USING) + self.state = 1505 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,164,self._ctx) + if la_ == 1: + self.state = 1500 + localctx.source = self.multipartIdentifier() + pass + + elif la_ == 2: + self.state = 1501 + self.match(SqlBaseParser.T__1) + self.state = 1502 + localctx.sourceQuery = self.query() + self.state = 1503 + self.match(SqlBaseParser.T__2) + pass + + + self.state = 1507 + localctx.sourceAlias = self.tableAlias() + self.state = 1508 + self.match(SqlBaseParser.ON) + self.state = 1509 + localctx.mergeCondition = self.booleanExpression(0) + self.state = 1513 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,165,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1510 + self.matchedClause() + self.state = 1515 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,165,self._ctx) + + self.state = 1519 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.WHEN: + self.state = 1516 + self.notMatchedClause() + self.state = 1521 + self._errHandler.sync(self) + _la = self._input.LA(1) + + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QueryOrganizationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._sortItem = None # SortItemContext + self.order = list() # of SortItemContexts + self._expression = None # ExpressionContext + self.clusterBy = list() # of ExpressionContexts + self.distributeBy = list() # of ExpressionContexts + self.sort = list() # of SortItemContexts + self.limit = None # ExpressionContext + + def ORDER(self): + return self.getToken(SqlBaseParser.ORDER, 0) + + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + + def CLUSTER(self): + return self.getToken(SqlBaseParser.CLUSTER, 0) + + def DISTRIBUTE(self): + return self.getToken(SqlBaseParser.DISTRIBUTE, 0) + + def SORT(self): + return self.getToken(SqlBaseParser.SORT, 0) + + def windowClause(self): + return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) + + + def LIMIT(self): + return self.getToken(SqlBaseParser.LIMIT, 0) + + def sortItem(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.SortItemContext) + else: + return self.getTypedRuleContext(SqlBaseParser.SortItemContext,i) + + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def ALL(self): + return self.getToken(SqlBaseParser.ALL, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_queryOrganization + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQueryOrganization" ): + listener.enterQueryOrganization(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQueryOrganization" ): + listener.exitQueryOrganization(self) + + + + + def queryOrganization(self): + + localctx = SqlBaseParser.QueryOrganizationContext(self, self._ctx, self.state) + self.enterRule(localctx, 76, self.RULE_queryOrganization) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1534 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,169,self._ctx) + if la_ == 1: + self.state = 1524 + self.match(SqlBaseParser.ORDER) + self.state = 1525 + self.match(SqlBaseParser.BY) + self.state = 1526 + localctx._sortItem = self.sortItem() + localctx.order.append(localctx._sortItem) + self.state = 1531 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,168,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1527 + self.match(SqlBaseParser.T__3) + self.state = 1528 + localctx._sortItem = self.sortItem() + localctx.order.append(localctx._sortItem) + self.state = 1533 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,168,self._ctx) + + + + self.state = 1546 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,171,self._ctx) + if la_ == 1: + self.state = 1536 + self.match(SqlBaseParser.CLUSTER) + self.state = 1537 + self.match(SqlBaseParser.BY) + self.state = 1538 + localctx._expression = self.expression() + localctx.clusterBy.append(localctx._expression) + self.state = 1543 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,170,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1539 + self.match(SqlBaseParser.T__3) + self.state = 1540 + localctx._expression = self.expression() + localctx.clusterBy.append(localctx._expression) + self.state = 1545 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,170,self._ctx) + + + + self.state = 1558 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,173,self._ctx) + if la_ == 1: + self.state = 1548 + self.match(SqlBaseParser.DISTRIBUTE) + self.state = 1549 + self.match(SqlBaseParser.BY) + self.state = 1550 + localctx._expression = self.expression() + localctx.distributeBy.append(localctx._expression) + self.state = 1555 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,172,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1551 + self.match(SqlBaseParser.T__3) + self.state = 1552 + localctx._expression = self.expression() + localctx.distributeBy.append(localctx._expression) + self.state = 1557 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,172,self._ctx) + + + + self.state = 1570 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,175,self._ctx) + if la_ == 1: + self.state = 1560 + self.match(SqlBaseParser.SORT) + self.state = 1561 + self.match(SqlBaseParser.BY) + self.state = 1562 + localctx._sortItem = self.sortItem() + localctx.sort.append(localctx._sortItem) + self.state = 1567 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,174,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1563 + self.match(SqlBaseParser.T__3) + self.state = 1564 + localctx._sortItem = self.sortItem() + localctx.sort.append(localctx._sortItem) + self.state = 1569 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,174,self._ctx) + + + + self.state = 1573 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,176,self._ctx) + if la_ == 1: + self.state = 1572 + self.windowClause() + + + self.state = 1580 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,178,self._ctx) + if la_ == 1: + self.state = 1575 + self.match(SqlBaseParser.LIMIT) + self.state = 1578 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,177,self._ctx) + if la_ == 1: + self.state = 1576 + self.match(SqlBaseParser.ALL) + pass + + elif la_ == 2: + self.state = 1577 + localctx.limit = self.expression() + pass + + + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MultiInsertQueryBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def insertInto(self): + return self.getTypedRuleContext(SqlBaseParser.InsertIntoContext,0) + + + def fromStatementBody(self): + return self.getTypedRuleContext(SqlBaseParser.FromStatementBodyContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_multiInsertQueryBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMultiInsertQueryBody" ): + listener.enterMultiInsertQueryBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMultiInsertQueryBody" ): + listener.exitMultiInsertQueryBody(self) + + + + + def multiInsertQueryBody(self): + + localctx = SqlBaseParser.MultiInsertQueryBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 78, self.RULE_multiInsertQueryBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1582 + self.insertInto() + self.state = 1583 + self.fromStatementBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QueryTermContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_queryTerm + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + class QueryTermDefaultContext(QueryTermContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryTermContext + super().__init__(parser) + self.copyFrom(ctx) + + def queryPrimary(self): + return self.getTypedRuleContext(SqlBaseParser.QueryPrimaryContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQueryTermDefault" ): + listener.enterQueryTermDefault(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQueryTermDefault" ): + listener.exitQueryTermDefault(self) + + + class SetOperationContext(QueryTermContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryTermContext + super().__init__(parser) + self.left = None # QueryTermContext + self.operator = None # Token + self.right = None # QueryTermContext + self.copyFrom(ctx) + + def queryTerm(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.QueryTermContext) + else: + return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,i) + + def INTERSECT(self): + return self.getToken(SqlBaseParser.INTERSECT, 0) + def UNION(self): + return self.getToken(SqlBaseParser.UNION, 0) + def EXCEPT(self): + return self.getToken(SqlBaseParser.EXCEPT, 0) + def SETMINUS(self): + return self.getToken(SqlBaseParser.SETMINUS, 0) + def setQuantifier(self): + return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetOperation" ): + listener.enterSetOperation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetOperation" ): + listener.exitSetOperation(self) + + + + def queryTerm(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = SqlBaseParser.QueryTermContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 80 + self.enterRecursionRule(localctx, 80, self.RULE_queryTerm, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + localctx = SqlBaseParser.QueryTermDefaultContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 1586 + self.queryPrimary() + self._ctx.stop = self._input.LT(-1) + self.state = 1611 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,183,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 1609 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,182,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) + self.state = 1588 + if not self.precpred(self._ctx, 3): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") + self.state = 1589 + if not self.legacy_setops_precedence_enbled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.legacy_setops_precedence_enbled") + self.state = 1590 + localctx.operator = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.EXCEPT or _la==SqlBaseParser.INTERSECT or _la==SqlBaseParser.SETMINUS or _la==SqlBaseParser.UNION): + localctx.operator = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 1592 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: + self.state = 1591 + self.setQuantifier() + + + self.state = 1594 + localctx.right = self.queryTerm(4) + pass + + elif la_ == 2: + localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) + self.state = 1595 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 1596 + if not not self.legacy_setops_precedence_enbled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.legacy_setops_precedence_enbled") + self.state = 1597 + localctx.operator = self.match(SqlBaseParser.INTERSECT) + self.state = 1599 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: + self.state = 1598 + self.setQuantifier() + + + self.state = 1601 + localctx.right = self.queryTerm(3) + pass + + elif la_ == 3: + localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) + self.state = 1602 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 1603 + if not not self.legacy_setops_precedence_enbled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.legacy_setops_precedence_enbled") + self.state = 1604 + localctx.operator = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.EXCEPT or _la==SqlBaseParser.SETMINUS or _la==SqlBaseParser.UNION): + localctx.operator = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 1606 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: + self.state = 1605 + self.setQuantifier() + + + self.state = 1608 + localctx.right = self.queryTerm(2) + pass + + + self.state = 1613 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,183,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + class QueryPrimaryContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_queryPrimary + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class SubqueryContext(QueryPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSubquery" ): + listener.enterSubquery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSubquery" ): + listener.exitSubquery(self) + + + class QueryPrimaryDefaultContext(QueryPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def querySpecification(self): + return self.getTypedRuleContext(SqlBaseParser.QuerySpecificationContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQueryPrimaryDefault" ): + listener.enterQueryPrimaryDefault(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQueryPrimaryDefault" ): + listener.exitQueryPrimaryDefault(self) + + + class InlineTableDefault1Context(QueryPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def inlineTable(self): + return self.getTypedRuleContext(SqlBaseParser.InlineTableContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInlineTableDefault1" ): + listener.enterInlineTableDefault1(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInlineTableDefault1" ): + listener.exitInlineTableDefault1(self) + + + class FromStmtContext(QueryPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def fromStatement(self): + return self.getTypedRuleContext(SqlBaseParser.FromStatementContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFromStmt" ): + listener.enterFromStmt(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFromStmt" ): + listener.exitFromStmt(self) + + + class TableContext(QueryPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTable" ): + listener.enterTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTable" ): + listener.exitTable(self) + + + + def queryPrimary(self): + + localctx = SqlBaseParser.QueryPrimaryContext(self, self._ctx, self.state) + self.enterRule(localctx, 82, self.RULE_queryPrimary) + try: + self.state = 1623 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.MAP, SqlBaseParser.REDUCE, SqlBaseParser.SELECT]: + localctx = SqlBaseParser.QueryPrimaryDefaultContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 1614 + self.querySpecification() + pass + elif token in [SqlBaseParser.FROM]: + localctx = SqlBaseParser.FromStmtContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 1615 + self.fromStatement() + pass + elif token in [SqlBaseParser.TABLE]: + localctx = SqlBaseParser.TableContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 1616 + self.match(SqlBaseParser.TABLE) + self.state = 1617 + self.multipartIdentifier() + pass + elif token in [SqlBaseParser.VALUES]: + localctx = SqlBaseParser.InlineTableDefault1Context(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 1618 + self.inlineTable() + pass + elif token in [SqlBaseParser.T__1]: + localctx = SqlBaseParser.SubqueryContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 1619 + self.match(SqlBaseParser.T__1) + self.state = 1620 + self.query() + self.state = 1621 + self.match(SqlBaseParser.T__2) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SortItemContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.ordering = None # Token + self.nullOrder = None # Token + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def NULLS(self): + return self.getToken(SqlBaseParser.NULLS, 0) + + def ASC(self): + return self.getToken(SqlBaseParser.ASC, 0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + + def LAST(self): + return self.getToken(SqlBaseParser.LAST, 0) + + def FIRST(self): + return self.getToken(SqlBaseParser.FIRST, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_sortItem + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSortItem" ): + listener.enterSortItem(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSortItem" ): + listener.exitSortItem(self) + + + + + def sortItem(self): + + localctx = SqlBaseParser.SortItemContext(self, self._ctx, self.state) + self.enterRule(localctx, 84, self.RULE_sortItem) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1625 + self.expression() + self.state = 1627 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,185,self._ctx) + if la_ == 1: + self.state = 1626 + localctx.ordering = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC): + localctx.ordering = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 1631 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,186,self._ctx) + if la_ == 1: + self.state = 1629 + self.match(SqlBaseParser.NULLS) + self.state = 1630 + localctx.nullOrder = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FIRST or _la==SqlBaseParser.LAST): + localctx.nullOrder = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FromStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def fromClause(self): + return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) + + + def fromStatementBody(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.FromStatementBodyContext) + else: + return self.getTypedRuleContext(SqlBaseParser.FromStatementBodyContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_fromStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFromStatement" ): + listener.enterFromStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFromStatement" ): + listener.exitFromStatement(self) + + + + + def fromStatement(self): + + localctx = SqlBaseParser.FromStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 86, self.RULE_fromStatement) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1633 + self.fromClause() + self.state = 1635 + self._errHandler.sync(self) + _alt = 1 + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt == 1: + self.state = 1634 + self.fromStatementBody() + + else: + raise NoViableAltException(self) + self.state = 1637 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,187,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FromStatementBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def transformClause(self): + return self.getTypedRuleContext(SqlBaseParser.TransformClauseContext,0) + + + def queryOrganization(self): + return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) + + + def whereClause(self): + return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) + + + def selectClause(self): + return self.getTypedRuleContext(SqlBaseParser.SelectClauseContext,0) + + + def lateralView(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) + + + def aggregationClause(self): + return self.getTypedRuleContext(SqlBaseParser.AggregationClauseContext,0) + + + def havingClause(self): + return self.getTypedRuleContext(SqlBaseParser.HavingClauseContext,0) + + + def windowClause(self): + return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_fromStatementBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFromStatementBody" ): + listener.enterFromStatementBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFromStatementBody" ): + listener.exitFromStatementBody(self) + + + + + def fromStatementBody(self): + + localctx = SqlBaseParser.FromStatementBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 88, self.RULE_fromStatementBody) + try: + self.state = 1666 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,194,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1639 + self.transformClause() + self.state = 1641 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,188,self._ctx) + if la_ == 1: + self.state = 1640 + self.whereClause() + + + self.state = 1643 + self.queryOrganization() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1645 + self.selectClause() + self.state = 1649 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,189,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1646 + self.lateralView() + self.state = 1651 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,189,self._ctx) + + self.state = 1653 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,190,self._ctx) + if la_ == 1: + self.state = 1652 + self.whereClause() + + + self.state = 1656 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,191,self._ctx) + if la_ == 1: + self.state = 1655 + self.aggregationClause() + + + self.state = 1659 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,192,self._ctx) + if la_ == 1: + self.state = 1658 + self.havingClause() + + + self.state = 1662 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,193,self._ctx) + if la_ == 1: + self.state = 1661 + self.windowClause() + + + self.state = 1664 + self.queryOrganization() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QuerySpecificationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_querySpecification + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class RegularQuerySpecificationContext(QuerySpecificationContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QuerySpecificationContext + super().__init__(parser) + self.copyFrom(ctx) + + def selectClause(self): + return self.getTypedRuleContext(SqlBaseParser.SelectClauseContext,0) + + def fromClause(self): + return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) + + def lateralView(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) + + def whereClause(self): + return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) + + def aggregationClause(self): + return self.getTypedRuleContext(SqlBaseParser.AggregationClauseContext,0) + + def havingClause(self): + return self.getTypedRuleContext(SqlBaseParser.HavingClauseContext,0) + + def windowClause(self): + return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRegularQuerySpecification" ): + listener.enterRegularQuerySpecification(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRegularQuerySpecification" ): + listener.exitRegularQuerySpecification(self) + + + class TransformQuerySpecificationContext(QuerySpecificationContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QuerySpecificationContext + super().__init__(parser) + self.copyFrom(ctx) + + def transformClause(self): + return self.getTypedRuleContext(SqlBaseParser.TransformClauseContext,0) + + def fromClause(self): + return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) + + def whereClause(self): + return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTransformQuerySpecification" ): + listener.enterTransformQuerySpecification(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTransformQuerySpecification" ): + listener.exitTransformQuerySpecification(self) + + + + def querySpecification(self): + + localctx = SqlBaseParser.QuerySpecificationContext(self, self._ctx, self.state) + self.enterRule(localctx, 90, self.RULE_querySpecification) + try: + self.state = 1697 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,203,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.TransformQuerySpecificationContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 1668 + self.transformClause() + self.state = 1670 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,195,self._ctx) + if la_ == 1: + self.state = 1669 + self.fromClause() + + + self.state = 1673 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,196,self._ctx) + if la_ == 1: + self.state = 1672 + self.whereClause() + + + pass + + elif la_ == 2: + localctx = SqlBaseParser.RegularQuerySpecificationContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 1675 + self.selectClause() + self.state = 1677 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,197,self._ctx) + if la_ == 1: + self.state = 1676 + self.fromClause() + + + self.state = 1682 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,198,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1679 + self.lateralView() + self.state = 1684 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,198,self._ctx) + + self.state = 1686 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,199,self._ctx) + if la_ == 1: + self.state = 1685 + self.whereClause() + + + self.state = 1689 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,200,self._ctx) + if la_ == 1: + self.state = 1688 + self.aggregationClause() + + + self.state = 1692 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,201,self._ctx) + if la_ == 1: + self.state = 1691 + self.havingClause() + + + self.state = 1695 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,202,self._ctx) + if la_ == 1: + self.state = 1694 + self.windowClause() + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TransformClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.kind = None # Token + self.inRowFormat = None # RowFormatContext + self.recordWriter = None # Token + self.script = None # Token + self.outRowFormat = None # RowFormatContext + self.recordReader = None # Token + + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + + def STRING(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.STRING) + else: + return self.getToken(SqlBaseParser.STRING, i) + + def SELECT(self): + return self.getToken(SqlBaseParser.SELECT, 0) + + def namedExpressionSeq(self): + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) + + + def TRANSFORM(self): + return self.getToken(SqlBaseParser.TRANSFORM, 0) + + def MAP(self): + return self.getToken(SqlBaseParser.MAP, 0) + + def REDUCE(self): + return self.getToken(SqlBaseParser.REDUCE, 0) + + def RECORDWRITER(self): + return self.getToken(SqlBaseParser.RECORDWRITER, 0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def RECORDREADER(self): + return self.getToken(SqlBaseParser.RECORDREADER, 0) + + def rowFormat(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) + else: + return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) + + + def identifierSeq(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) + + + def colTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_transformClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTransformClause" ): + listener.enterTransformClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTransformClause" ): + listener.exitTransformClause(self) + + + + + def transformClause(self): + + localctx = SqlBaseParser.TransformClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 92, self.RULE_transformClause) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1709 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.SELECT]: + self.state = 1699 + self.match(SqlBaseParser.SELECT) + self.state = 1700 + localctx.kind = self.match(SqlBaseParser.TRANSFORM) + self.state = 1701 + self.match(SqlBaseParser.T__1) + self.state = 1702 + self.namedExpressionSeq() + self.state = 1703 + self.match(SqlBaseParser.T__2) + pass + elif token in [SqlBaseParser.MAP]: + self.state = 1705 + localctx.kind = self.match(SqlBaseParser.MAP) + self.state = 1706 + self.namedExpressionSeq() + pass + elif token in [SqlBaseParser.REDUCE]: + self.state = 1707 + localctx.kind = self.match(SqlBaseParser.REDUCE) + self.state = 1708 + self.namedExpressionSeq() + pass + else: + raise NoViableAltException(self) + + self.state = 1712 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ROW: + self.state = 1711 + localctx.inRowFormat = self.rowFormat() + + + self.state = 1716 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.RECORDWRITER: + self.state = 1714 + self.match(SqlBaseParser.RECORDWRITER) + self.state = 1715 + localctx.recordWriter = self.match(SqlBaseParser.STRING) + + + self.state = 1718 + self.match(SqlBaseParser.USING) + self.state = 1719 + localctx.script = self.match(SqlBaseParser.STRING) + self.state = 1732 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,209,self._ctx) + if la_ == 1: + self.state = 1720 + self.match(SqlBaseParser.AS) + self.state = 1730 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,208,self._ctx) + if la_ == 1: + self.state = 1721 + self.identifierSeq() + pass + + elif la_ == 2: + self.state = 1722 + self.colTypeList() + pass + + elif la_ == 3: + self.state = 1723 + self.match(SqlBaseParser.T__1) + self.state = 1726 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,207,self._ctx) + if la_ == 1: + self.state = 1724 + self.identifierSeq() + pass + + elif la_ == 2: + self.state = 1725 + self.colTypeList() + pass + + + self.state = 1728 + self.match(SqlBaseParser.T__2) + pass + + + + + self.state = 1735 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,210,self._ctx) + if la_ == 1: + self.state = 1734 + localctx.outRowFormat = self.rowFormat() + + + self.state = 1739 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,211,self._ctx) + if la_ == 1: + self.state = 1737 + self.match(SqlBaseParser.RECORDREADER) + self.state = 1738 + localctx.recordReader = self.match(SqlBaseParser.STRING) + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SelectClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._hint = None # HintContext + self.hints = list() # of HintContexts + + def SELECT(self): + return self.getToken(SqlBaseParser.SELECT, 0) + + def namedExpressionSeq(self): + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) + + + def setQuantifier(self): + return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) + + + def hint(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.HintContext) + else: + return self.getTypedRuleContext(SqlBaseParser.HintContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_selectClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSelectClause" ): + listener.enterSelectClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSelectClause" ): + listener.exitSelectClause(self) + + + + + def selectClause(self): + + localctx = SqlBaseParser.SelectClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 94, self.RULE_selectClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1741 + self.match(SqlBaseParser.SELECT) + self.state = 1745 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,212,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1742 + localctx._hint = self.hint() + localctx.hints.append(localctx._hint) + self.state = 1747 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,212,self._ctx) + + self.state = 1749 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,213,self._ctx) + if la_ == 1: + self.state = 1748 + self.setQuantifier() + + + self.state = 1751 + self.namedExpressionSeq() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SetClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def assignmentList(self): + return self.getTypedRuleContext(SqlBaseParser.AssignmentListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_setClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetClause" ): + listener.enterSetClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetClause" ): + listener.exitSetClause(self) + + + + + def setClause(self): + + localctx = SqlBaseParser.SetClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 96, self.RULE_setClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1753 + self.match(SqlBaseParser.SET) + self.state = 1754 + self.assignmentList() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MatchedClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.matchedCond = None # BooleanExpressionContext + + def WHEN(self): + return self.getToken(SqlBaseParser.WHEN, 0) + + def MATCHED(self): + return self.getToken(SqlBaseParser.MATCHED, 0) + + def THEN(self): + return self.getToken(SqlBaseParser.THEN, 0) + + def matchedAction(self): + return self.getTypedRuleContext(SqlBaseParser.MatchedActionContext,0) + + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_matchedClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMatchedClause" ): + listener.enterMatchedClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMatchedClause" ): + listener.exitMatchedClause(self) + + + + + def matchedClause(self): + + localctx = SqlBaseParser.MatchedClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 98, self.RULE_matchedClause) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1756 + self.match(SqlBaseParser.WHEN) + self.state = 1757 + self.match(SqlBaseParser.MATCHED) + self.state = 1760 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AND: + self.state = 1758 + self.match(SqlBaseParser.AND) + self.state = 1759 + localctx.matchedCond = self.booleanExpression(0) + + + self.state = 1762 + self.match(SqlBaseParser.THEN) + self.state = 1763 + self.matchedAction() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NotMatchedClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.notMatchedCond = None # BooleanExpressionContext + + def WHEN(self): + return self.getToken(SqlBaseParser.WHEN, 0) + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def MATCHED(self): + return self.getToken(SqlBaseParser.MATCHED, 0) + + def THEN(self): + return self.getToken(SqlBaseParser.THEN, 0) + + def notMatchedAction(self): + return self.getTypedRuleContext(SqlBaseParser.NotMatchedActionContext,0) + + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_notMatchedClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNotMatchedClause" ): + listener.enterNotMatchedClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNotMatchedClause" ): + listener.exitNotMatchedClause(self) + + + + + def notMatchedClause(self): + + localctx = SqlBaseParser.NotMatchedClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 100, self.RULE_notMatchedClause) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1765 + self.match(SqlBaseParser.WHEN) + self.state = 1766 + self.match(SqlBaseParser.NOT) + self.state = 1767 + self.match(SqlBaseParser.MATCHED) + self.state = 1770 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AND: + self.state = 1768 + self.match(SqlBaseParser.AND) + self.state = 1769 + localctx.notMatchedCond = self.booleanExpression(0) + + + self.state = 1772 + self.match(SqlBaseParser.THEN) + self.state = 1773 + self.notMatchedAction() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MatchedActionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def DELETE(self): + return self.getToken(SqlBaseParser.DELETE, 0) + + def UPDATE(self): + return self.getToken(SqlBaseParser.UPDATE, 0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def ASTERISK(self): + return self.getToken(SqlBaseParser.ASTERISK, 0) + + def assignmentList(self): + return self.getTypedRuleContext(SqlBaseParser.AssignmentListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_matchedAction + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMatchedAction" ): + listener.enterMatchedAction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMatchedAction" ): + listener.exitMatchedAction(self) + + + + + def matchedAction(self): + + localctx = SqlBaseParser.MatchedActionContext(self, self._ctx, self.state) + self.enterRule(localctx, 102, self.RULE_matchedAction) + try: + self.state = 1782 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,216,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1775 + self.match(SqlBaseParser.DELETE) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1776 + self.match(SqlBaseParser.UPDATE) + self.state = 1777 + self.match(SqlBaseParser.SET) + self.state = 1778 + self.match(SqlBaseParser.ASTERISK) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 1779 + self.match(SqlBaseParser.UPDATE) + self.state = 1780 + self.match(SqlBaseParser.SET) + self.state = 1781 + self.assignmentList() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NotMatchedActionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.columns = None # MultipartIdentifierListContext + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + + def ASTERISK(self): + return self.getToken(SqlBaseParser.ASTERISK, 0) + + def VALUES(self): + return self.getToken(SqlBaseParser.VALUES, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def multipartIdentifierList(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_notMatchedAction + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNotMatchedAction" ): + listener.enterNotMatchedAction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNotMatchedAction" ): + listener.exitNotMatchedAction(self) + + + + + def notMatchedAction(self): + + localctx = SqlBaseParser.NotMatchedActionContext(self, self._ctx, self.state) + self.enterRule(localctx, 104, self.RULE_notMatchedAction) + self._la = 0 # Token type + try: + self.state = 1802 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,218,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1784 + self.match(SqlBaseParser.INSERT) + self.state = 1785 + self.match(SqlBaseParser.ASTERISK) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1786 + self.match(SqlBaseParser.INSERT) + self.state = 1787 + self.match(SqlBaseParser.T__1) + self.state = 1788 + localctx.columns = self.multipartIdentifierList() + self.state = 1789 + self.match(SqlBaseParser.T__2) + self.state = 1790 + self.match(SqlBaseParser.VALUES) + self.state = 1791 + self.match(SqlBaseParser.T__1) + self.state = 1792 + self.expression() + self.state = 1797 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1793 + self.match(SqlBaseParser.T__3) + self.state = 1794 + self.expression() + self.state = 1799 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1800 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class AssignmentListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def assignment(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.AssignmentContext) + else: + return self.getTypedRuleContext(SqlBaseParser.AssignmentContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_assignmentList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAssignmentList" ): + listener.enterAssignmentList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAssignmentList" ): + listener.exitAssignmentList(self) + + + + + def assignmentList(self): + + localctx = SqlBaseParser.AssignmentListContext(self, self._ctx, self.state) + self.enterRule(localctx, 106, self.RULE_assignmentList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1804 + self.assignment() + self.state = 1809 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1805 + self.match(SqlBaseParser.T__3) + self.state = 1806 + self.assignment() + self.state = 1811 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class AssignmentContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.key = None # MultipartIdentifierContext + self.value = None # ExpressionContext + + def EQ(self): + return self.getToken(SqlBaseParser.EQ, 0) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_assignment + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAssignment" ): + listener.enterAssignment(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAssignment" ): + listener.exitAssignment(self) + + + + + def assignment(self): + + localctx = SqlBaseParser.AssignmentContext(self, self._ctx, self.state) + self.enterRule(localctx, 108, self.RULE_assignment) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1812 + localctx.key = self.multipartIdentifier() + self.state = 1813 + self.match(SqlBaseParser.EQ) + self.state = 1814 + localctx.value = self.expression() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class WhereClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def WHERE(self): + return self.getToken(SqlBaseParser.WHERE, 0) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_whereClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWhereClause" ): + listener.enterWhereClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWhereClause" ): + listener.exitWhereClause(self) + + + + + def whereClause(self): + + localctx = SqlBaseParser.WhereClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 110, self.RULE_whereClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1816 + self.match(SqlBaseParser.WHERE) + self.state = 1817 + self.booleanExpression(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class HavingClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def HAVING(self): + return self.getToken(SqlBaseParser.HAVING, 0) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_havingClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterHavingClause" ): + listener.enterHavingClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitHavingClause" ): + listener.exitHavingClause(self) + + + + + def havingClause(self): + + localctx = SqlBaseParser.HavingClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 112, self.RULE_havingClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1819 + self.match(SqlBaseParser.HAVING) + self.state = 1820 + self.booleanExpression(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class HintContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._hintStatement = None # HintStatementContext + self.hintStatements = list() # of HintStatementContexts + + def hintStatement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.HintStatementContext) + else: + return self.getTypedRuleContext(SqlBaseParser.HintStatementContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_hint + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterHint" ): + listener.enterHint(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitHint" ): + listener.exitHint(self) + + + + + def hint(self): + + localctx = SqlBaseParser.HintContext(self, self._ctx, self.state) + self.enterRule(localctx, 114, self.RULE_hint) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1822 + self.match(SqlBaseParser.T__5) + self.state = 1823 + localctx._hintStatement = self.hintStatement() + localctx.hintStatements.append(localctx._hintStatement) + self.state = 1830 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,221,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1825 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,220,self._ctx) + if la_ == 1: + self.state = 1824 + self.match(SqlBaseParser.T__3) + + + self.state = 1827 + localctx._hintStatement = self.hintStatement() + localctx.hintStatements.append(localctx._hintStatement) + self.state = 1832 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,221,self._ctx) + + self.state = 1833 + self.match(SqlBaseParser.T__6) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class HintStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.hintName = None # IdentifierContext + self._primaryExpression = None # PrimaryExpressionContext + self.parameters = list() # of PrimaryExpressionContexts + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def primaryExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PrimaryExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_hintStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterHintStatement" ): + listener.enterHintStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitHintStatement" ): + listener.exitHintStatement(self) + + + + + def hintStatement(self): + + localctx = SqlBaseParser.HintStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 116, self.RULE_hintStatement) + self._la = 0 # Token type + try: + self.state = 1848 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,223,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1835 + localctx.hintName = self.identifier() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1836 + localctx.hintName = self.identifier() + self.state = 1837 + self.match(SqlBaseParser.T__1) + self.state = 1838 + localctx._primaryExpression = self.primaryExpression(0) + localctx.parameters.append(localctx._primaryExpression) + self.state = 1843 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1839 + self.match(SqlBaseParser.T__3) + self.state = 1840 + localctx._primaryExpression = self.primaryExpression(0) + localctx.parameters.append(localctx._primaryExpression) + self.state = 1845 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1846 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FromClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + + def relation(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.RelationContext) + else: + return self.getTypedRuleContext(SqlBaseParser.RelationContext,i) + + + def lateralView(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) + else: + return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) + + + def pivotClause(self): + return self.getTypedRuleContext(SqlBaseParser.PivotClauseContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_fromClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFromClause" ): + listener.enterFromClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFromClause" ): + listener.exitFromClause(self) + + + + + def fromClause(self): + + localctx = SqlBaseParser.FromClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 118, self.RULE_fromClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1850 + self.match(SqlBaseParser.FROM) + self.state = 1851 + self.relation() + self.state = 1856 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,224,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1852 + self.match(SqlBaseParser.T__3) + self.state = 1853 + self.relation() + self.state = 1858 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,224,self._ctx) + + self.state = 1862 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,225,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1859 + self.lateralView() + self.state = 1864 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,225,self._ctx) + + self.state = 1866 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,226,self._ctx) + if la_ == 1: + self.state = 1865 + self.pivotClause() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class AggregationClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._expression = None # ExpressionContext + self.groupingExpressions = list() # of ExpressionContexts + self.kind = None # Token + + def GROUP(self): + return self.getToken(SqlBaseParser.GROUP, 0) + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + + def SETS(self): + return self.getToken(SqlBaseParser.SETS, 0) + + def groupingSet(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.GroupingSetContext) + else: + return self.getTypedRuleContext(SqlBaseParser.GroupingSetContext,i) + + + def ROLLUP(self): + return self.getToken(SqlBaseParser.ROLLUP, 0) + + def CUBE(self): + return self.getToken(SqlBaseParser.CUBE, 0) + + def GROUPING(self): + return self.getToken(SqlBaseParser.GROUPING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_aggregationClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAggregationClause" ): + listener.enterAggregationClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAggregationClause" ): + listener.exitAggregationClause(self) + + + + + def aggregationClause(self): + + localctx = SqlBaseParser.AggregationClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 120, self.RULE_aggregationClause) + self._la = 0 # Token type + try: + self.state = 1912 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,231,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1868 + self.match(SqlBaseParser.GROUP) + self.state = 1869 + self.match(SqlBaseParser.BY) + self.state = 1870 + localctx._expression = self.expression() + localctx.groupingExpressions.append(localctx._expression) + self.state = 1875 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,227,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1871 + self.match(SqlBaseParser.T__3) + self.state = 1872 + localctx._expression = self.expression() + localctx.groupingExpressions.append(localctx._expression) + self.state = 1877 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,227,self._ctx) + + self.state = 1895 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,229,self._ctx) + if la_ == 1: + self.state = 1878 + self.match(SqlBaseParser.WITH) + self.state = 1879 + localctx.kind = self.match(SqlBaseParser.ROLLUP) + + elif la_ == 2: + self.state = 1880 + self.match(SqlBaseParser.WITH) + self.state = 1881 + localctx.kind = self.match(SqlBaseParser.CUBE) + + elif la_ == 3: + self.state = 1882 + localctx.kind = self.match(SqlBaseParser.GROUPING) + self.state = 1883 + self.match(SqlBaseParser.SETS) + self.state = 1884 + self.match(SqlBaseParser.T__1) + self.state = 1885 + self.groupingSet() + self.state = 1890 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1886 + self.match(SqlBaseParser.T__3) + self.state = 1887 + self.groupingSet() + self.state = 1892 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1893 + self.match(SqlBaseParser.T__2) + + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1897 + self.match(SqlBaseParser.GROUP) + self.state = 1898 + self.match(SqlBaseParser.BY) + self.state = 1899 + localctx.kind = self.match(SqlBaseParser.GROUPING) + self.state = 1900 + self.match(SqlBaseParser.SETS) + self.state = 1901 + self.match(SqlBaseParser.T__1) + self.state = 1902 + self.groupingSet() + self.state = 1907 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1903 + self.match(SqlBaseParser.T__3) + self.state = 1904 + self.groupingSet() + self.state = 1909 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1910 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class GroupingSetContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_groupingSet + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGroupingSet" ): + listener.enterGroupingSet(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGroupingSet" ): + listener.exitGroupingSet(self) + + + + + def groupingSet(self): + + localctx = SqlBaseParser.GroupingSetContext(self, self._ctx, self.state) + self.enterRule(localctx, 122, self.RULE_groupingSet) + self._la = 0 # Token type + try: + self.state = 1927 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,234,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1914 + self.match(SqlBaseParser.T__1) + self.state = 1923 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,233,self._ctx) + if la_ == 1: + self.state = 1915 + self.expression() + self.state = 1920 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1916 + self.match(SqlBaseParser.T__3) + self.state = 1917 + self.expression() + self.state = 1922 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 1925 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1926 + self.expression() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PivotClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.aggregates = None # NamedExpressionSeqContext + self._pivotValue = None # PivotValueContext + self.pivotValues = list() # of PivotValueContexts + + def PIVOT(self): + return self.getToken(SqlBaseParser.PIVOT, 0) + + def FOR(self): + return self.getToken(SqlBaseParser.FOR, 0) + + def pivotColumn(self): + return self.getTypedRuleContext(SqlBaseParser.PivotColumnContext,0) + + + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + + def namedExpressionSeq(self): + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) + + + def pivotValue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.PivotValueContext) + else: + return self.getTypedRuleContext(SqlBaseParser.PivotValueContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_pivotClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPivotClause" ): + listener.enterPivotClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPivotClause" ): + listener.exitPivotClause(self) + + + + + def pivotClause(self): + + localctx = SqlBaseParser.PivotClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 124, self.RULE_pivotClause) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1929 + self.match(SqlBaseParser.PIVOT) + self.state = 1930 + self.match(SqlBaseParser.T__1) + self.state = 1931 + localctx.aggregates = self.namedExpressionSeq() + self.state = 1932 + self.match(SqlBaseParser.FOR) + self.state = 1933 + self.pivotColumn() + self.state = 1934 + self.match(SqlBaseParser.IN) + self.state = 1935 + self.match(SqlBaseParser.T__1) + self.state = 1936 + localctx._pivotValue = self.pivotValue() + localctx.pivotValues.append(localctx._pivotValue) + self.state = 1941 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1937 + self.match(SqlBaseParser.T__3) + self.state = 1938 + localctx._pivotValue = self.pivotValue() + localctx.pivotValues.append(localctx._pivotValue) + self.state = 1943 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1944 + self.match(SqlBaseParser.T__2) + self.state = 1945 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PivotColumnContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._identifier = None # IdentifierContext + self.identifiers = list() # of IdentifierContexts + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_pivotColumn + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPivotColumn" ): + listener.enterPivotColumn(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPivotColumn" ): + listener.exitPivotColumn(self) + + + + + def pivotColumn(self): + + localctx = SqlBaseParser.PivotColumnContext(self, self._ctx, self.state) + self.enterRule(localctx, 126, self.RULE_pivotColumn) + self._la = 0 # Token type + try: + self.state = 1959 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,237,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1947 + localctx._identifier = self.identifier() + localctx.identifiers.append(localctx._identifier) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1948 + self.match(SqlBaseParser.T__1) + self.state = 1949 + localctx._identifier = self.identifier() + localctx.identifiers.append(localctx._identifier) + self.state = 1954 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1950 + self.match(SqlBaseParser.T__3) + self.state = 1951 + localctx._identifier = self.identifier() + localctx.identifiers.append(localctx._identifier) + self.state = 1956 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 1957 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PivotValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_pivotValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPivotValue" ): + listener.enterPivotValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPivotValue" ): + listener.exitPivotValue(self) + + + + + def pivotValue(self): + + localctx = SqlBaseParser.PivotValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 128, self.RULE_pivotValue) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1961 + self.expression() + self.state = 1966 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,239,self._ctx) + if la_ == 1: + self.state = 1963 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,238,self._ctx) + if la_ == 1: + self.state = 1962 + self.match(SqlBaseParser.AS) + + + self.state = 1965 + self.identifier() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class LateralViewContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.tblName = None # IdentifierContext + self._identifier = None # IdentifierContext + self.colName = list() # of IdentifierContexts + + def LATERAL(self): + return self.getToken(SqlBaseParser.LATERAL, 0) + + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def OUTER(self): + return self.getToken(SqlBaseParser.OUTER, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_lateralView + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLateralView" ): + listener.enterLateralView(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLateralView" ): + listener.exitLateralView(self) + + + + + def lateralView(self): + + localctx = SqlBaseParser.LateralViewContext(self, self._ctx, self.state) + self.enterRule(localctx, 130, self.RULE_lateralView) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1968 + self.match(SqlBaseParser.LATERAL) + self.state = 1969 + self.match(SqlBaseParser.VIEW) + self.state = 1971 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,240,self._ctx) + if la_ == 1: + self.state = 1970 + self.match(SqlBaseParser.OUTER) + + + self.state = 1973 + self.qualifiedName() + self.state = 1974 + self.match(SqlBaseParser.T__1) + self.state = 1983 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,242,self._ctx) + if la_ == 1: + self.state = 1975 + self.expression() + self.state = 1980 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 1976 + self.match(SqlBaseParser.T__3) + self.state = 1977 + self.expression() + self.state = 1982 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 1985 + self.match(SqlBaseParser.T__2) + self.state = 1986 + localctx.tblName = self.identifier() + self.state = 1998 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,245,self._ctx) + if la_ == 1: + self.state = 1988 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,243,self._ctx) + if la_ == 1: + self.state = 1987 + self.match(SqlBaseParser.AS) + + + self.state = 1990 + localctx._identifier = self.identifier() + localctx.colName.append(localctx._identifier) + self.state = 1995 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,244,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 1991 + self.match(SqlBaseParser.T__3) + self.state = 1992 + localctx._identifier = self.identifier() + localctx.colName.append(localctx._identifier) + self.state = 1997 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,244,self._ctx) + + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SetQuantifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def DISTINCT(self): + return self.getToken(SqlBaseParser.DISTINCT, 0) + + def ALL(self): + return self.getToken(SqlBaseParser.ALL, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_setQuantifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSetQuantifier" ): + listener.enterSetQuantifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSetQuantifier" ): + listener.exitSetQuantifier(self) + + + + + def setQuantifier(self): + + localctx = SqlBaseParser.SetQuantifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 132, self.RULE_setQuantifier) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2000 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class RelationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def relationPrimary(self): + return self.getTypedRuleContext(SqlBaseParser.RelationPrimaryContext,0) + + + def joinRelation(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.JoinRelationContext) + else: + return self.getTypedRuleContext(SqlBaseParser.JoinRelationContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_relation + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRelation" ): + listener.enterRelation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRelation" ): + listener.exitRelation(self) + + + + + def relation(self): + + localctx = SqlBaseParser.RelationContext(self, self._ctx, self.state) + self.enterRule(localctx, 134, self.RULE_relation) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2002 + self.relationPrimary() + self.state = 2006 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,246,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2003 + self.joinRelation() + self.state = 2008 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,246,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class JoinRelationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.right = None # RelationPrimaryContext + + def JOIN(self): + return self.getToken(SqlBaseParser.JOIN, 0) + + def relationPrimary(self): + return self.getTypedRuleContext(SqlBaseParser.RelationPrimaryContext,0) + + + def joinType(self): + return self.getTypedRuleContext(SqlBaseParser.JoinTypeContext,0) + + + def joinCriteria(self): + return self.getTypedRuleContext(SqlBaseParser.JoinCriteriaContext,0) + + + def NATURAL(self): + return self.getToken(SqlBaseParser.NATURAL, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_joinRelation + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterJoinRelation" ): + listener.enterJoinRelation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitJoinRelation" ): + listener.exitJoinRelation(self) + + + + + def joinRelation(self): + + localctx = SqlBaseParser.JoinRelationContext(self, self._ctx, self.state) + self.enterRule(localctx, 136, self.RULE_joinRelation) + try: + self.state = 2020 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.ANTI, SqlBaseParser.CROSS, SqlBaseParser.FULL, SqlBaseParser.INNER, SqlBaseParser.JOIN, SqlBaseParser.LEFT, SqlBaseParser.RIGHT, SqlBaseParser.SEMI]: + self.enterOuterAlt(localctx, 1) + self.state = 2009 + self.joinType() + self.state = 2010 + self.match(SqlBaseParser.JOIN) + self.state = 2011 + localctx.right = self.relationPrimary() + self.state = 2013 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,247,self._ctx) + if la_ == 1: + self.state = 2012 + self.joinCriteria() + + + pass + elif token in [SqlBaseParser.NATURAL]: + self.enterOuterAlt(localctx, 2) + self.state = 2015 + self.match(SqlBaseParser.NATURAL) + self.state = 2016 + self.joinType() + self.state = 2017 + self.match(SqlBaseParser.JOIN) + self.state = 2018 + localctx.right = self.relationPrimary() + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class JoinTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def INNER(self): + return self.getToken(SqlBaseParser.INNER, 0) + + def CROSS(self): + return self.getToken(SqlBaseParser.CROSS, 0) + + def LEFT(self): + return self.getToken(SqlBaseParser.LEFT, 0) + + def OUTER(self): + return self.getToken(SqlBaseParser.OUTER, 0) + + def SEMI(self): + return self.getToken(SqlBaseParser.SEMI, 0) + + def RIGHT(self): + return self.getToken(SqlBaseParser.RIGHT, 0) + + def FULL(self): + return self.getToken(SqlBaseParser.FULL, 0) + + def ANTI(self): + return self.getToken(SqlBaseParser.ANTI, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_joinType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterJoinType" ): + listener.enterJoinType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitJoinType" ): + listener.exitJoinType(self) + + + + + def joinType(self): + + localctx = SqlBaseParser.JoinTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 138, self.RULE_joinType) + self._la = 0 # Token type + try: + self.state = 2046 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,255,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2023 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.INNER: + self.state = 2022 + self.match(SqlBaseParser.INNER) + + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2025 + self.match(SqlBaseParser.CROSS) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2026 + self.match(SqlBaseParser.LEFT) + self.state = 2028 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OUTER: + self.state = 2027 + self.match(SqlBaseParser.OUTER) + + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 2031 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LEFT: + self.state = 2030 + self.match(SqlBaseParser.LEFT) + + + self.state = 2033 + self.match(SqlBaseParser.SEMI) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 2034 + self.match(SqlBaseParser.RIGHT) + self.state = 2036 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OUTER: + self.state = 2035 + self.match(SqlBaseParser.OUTER) + + + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 2038 + self.match(SqlBaseParser.FULL) + self.state = 2040 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.OUTER: + self.state = 2039 + self.match(SqlBaseParser.OUTER) + + + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 2043 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.LEFT: + self.state = 2042 + self.match(SqlBaseParser.LEFT) + + + self.state = 2045 + self.match(SqlBaseParser.ANTI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class JoinCriteriaContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_joinCriteria + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterJoinCriteria" ): + listener.enterJoinCriteria(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitJoinCriteria" ): + listener.exitJoinCriteria(self) + + + + + def joinCriteria(self): + + localctx = SqlBaseParser.JoinCriteriaContext(self, self._ctx, self.state) + self.enterRule(localctx, 140, self.RULE_joinCriteria) + try: + self.state = 2052 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.ON]: + self.enterOuterAlt(localctx, 1) + self.state = 2048 + self.match(SqlBaseParser.ON) + self.state = 2049 + self.booleanExpression(0) + pass + elif token in [SqlBaseParser.USING]: + self.enterOuterAlt(localctx, 2) + self.state = 2050 + self.match(SqlBaseParser.USING) + self.state = 2051 + self.identifierList() + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SampleContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def TABLESAMPLE(self): + return self.getToken(SqlBaseParser.TABLESAMPLE, 0) + + def sampleMethod(self): + return self.getTypedRuleContext(SqlBaseParser.SampleMethodContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_sample + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSample" ): + listener.enterSample(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSample" ): + listener.exitSample(self) + + + + + def sample(self): + + localctx = SqlBaseParser.SampleContext(self, self._ctx, self.state) + self.enterRule(localctx, 142, self.RULE_sample) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2054 + self.match(SqlBaseParser.TABLESAMPLE) + self.state = 2055 + self.match(SqlBaseParser.T__1) + self.state = 2057 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,257,self._ctx) + if la_ == 1: + self.state = 2056 + self.sampleMethod() + + + self.state = 2059 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class SampleMethodContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_sampleMethod + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class SampleByRowsContext(SampleMethodContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + def ROWS(self): + return self.getToken(SqlBaseParser.ROWS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSampleByRows" ): + listener.enterSampleByRows(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSampleByRows" ): + listener.exitSampleByRows(self) + + + class SampleByPercentileContext(SampleMethodContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext + super().__init__(parser) + self.negativeSign = None # Token + self.percentage = None # Token + self.copyFrom(ctx) + + def PERCENTLIT(self): + return self.getToken(SqlBaseParser.PERCENTLIT, 0) + def INTEGER_VALUE(self): + return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) + def DECIMAL_VALUE(self): + return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSampleByPercentile" ): + listener.enterSampleByPercentile(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSampleByPercentile" ): + listener.exitSampleByPercentile(self) + + + class SampleByBucketContext(SampleMethodContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext + super().__init__(parser) + self.sampleType = None # Token + self.numerator = None # Token + self.denominator = None # Token + self.copyFrom(ctx) + + def OUT(self): + return self.getToken(SqlBaseParser.OUT, 0) + def OF(self): + return self.getToken(SqlBaseParser.OF, 0) + def BUCKET(self): + return self.getToken(SqlBaseParser.BUCKET, 0) + def INTEGER_VALUE(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.INTEGER_VALUE) + else: + return self.getToken(SqlBaseParser.INTEGER_VALUE, i) + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSampleByBucket" ): + listener.enterSampleByBucket(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSampleByBucket" ): + listener.exitSampleByBucket(self) + + + class SampleByBytesContext(SampleMethodContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext + super().__init__(parser) + self.bytes = None # ExpressionContext + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSampleByBytes" ): + listener.enterSampleByBytes(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSampleByBytes" ): + listener.exitSampleByBytes(self) + + + + def sampleMethod(self): + + localctx = SqlBaseParser.SampleMethodContext(self, self._ctx, self.state) + self.enterRule(localctx, 144, self.RULE_sampleMethod) + self._la = 0 # Token type + try: + self.state = 2085 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,261,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.SampleByPercentileContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2062 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2061 + localctx.negativeSign = self.match(SqlBaseParser.MINUS) + + + self.state = 2064 + localctx.percentage = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.INTEGER_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): + localctx.percentage = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2065 + self.match(SqlBaseParser.PERCENTLIT) + pass + + elif la_ == 2: + localctx = SqlBaseParser.SampleByRowsContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2066 + self.expression() + self.state = 2067 + self.match(SqlBaseParser.ROWS) + pass + + elif la_ == 3: + localctx = SqlBaseParser.SampleByBucketContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2069 + localctx.sampleType = self.match(SqlBaseParser.BUCKET) + self.state = 2070 + localctx.numerator = self.match(SqlBaseParser.INTEGER_VALUE) + self.state = 2071 + self.match(SqlBaseParser.OUT) + self.state = 2072 + self.match(SqlBaseParser.OF) + self.state = 2073 + localctx.denominator = self.match(SqlBaseParser.INTEGER_VALUE) + self.state = 2082 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ON: + self.state = 2074 + self.match(SqlBaseParser.ON) + self.state = 2080 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,259,self._ctx) + if la_ == 1: + self.state = 2075 + self.identifier() + pass + + elif la_ == 2: + self.state = 2076 + self.qualifiedName() + self.state = 2077 + self.match(SqlBaseParser.T__1) + self.state = 2078 + self.match(SqlBaseParser.T__2) + pass + + + + + pass + + elif la_ == 4: + localctx = SqlBaseParser.SampleByBytesContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2084 + localctx.bytes = self.expression() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdentifierListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifierSeq(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_identifierList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifierList" ): + listener.enterIdentifierList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifierList" ): + listener.exitIdentifierList(self) + + + + + def identifierList(self): + + localctx = SqlBaseParser.IdentifierListContext(self, self._ctx, self.state) + self.enterRule(localctx, 146, self.RULE_identifierList) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2087 + self.match(SqlBaseParser.T__1) + self.state = 2088 + self.identifierSeq() + self.state = 2089 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdentifierSeqContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._errorCapturingIdentifier = None # ErrorCapturingIdentifierContext + self.ident = list() # of ErrorCapturingIdentifierContexts + + def errorCapturingIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_identifierSeq + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifierSeq" ): + listener.enterIdentifierSeq(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifierSeq" ): + listener.exitIdentifierSeq(self) + + + + + def identifierSeq(self): + + localctx = SqlBaseParser.IdentifierSeqContext(self, self._ctx, self.state) + self.enterRule(localctx, 148, self.RULE_identifierSeq) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2091 + localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() + localctx.ident.append(localctx._errorCapturingIdentifier) + self.state = 2096 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,262,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2092 + self.match(SqlBaseParser.T__3) + self.state = 2093 + localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() + localctx.ident.append(localctx._errorCapturingIdentifier) + self.state = 2098 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,262,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class OrderedIdentifierListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def orderedIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.OrderedIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.OrderedIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_orderedIdentifierList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterOrderedIdentifierList" ): + listener.enterOrderedIdentifierList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitOrderedIdentifierList" ): + listener.exitOrderedIdentifierList(self) + + + + + def orderedIdentifierList(self): + + localctx = SqlBaseParser.OrderedIdentifierListContext(self, self._ctx, self.state) + self.enterRule(localctx, 150, self.RULE_orderedIdentifierList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2099 + self.match(SqlBaseParser.T__1) + self.state = 2100 + self.orderedIdentifier() + self.state = 2105 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2101 + self.match(SqlBaseParser.T__3) + self.state = 2102 + self.orderedIdentifier() + self.state = 2107 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2108 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class OrderedIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.ident = None # ErrorCapturingIdentifierContext + self.ordering = None # Token + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def ASC(self): + return self.getToken(SqlBaseParser.ASC, 0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_orderedIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterOrderedIdentifier" ): + listener.enterOrderedIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitOrderedIdentifier" ): + listener.exitOrderedIdentifier(self) + + + + + def orderedIdentifier(self): + + localctx = SqlBaseParser.OrderedIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 152, self.RULE_orderedIdentifier) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2110 + localctx.ident = self.errorCapturingIdentifier() + self.state = 2112 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC: + self.state = 2111 + localctx.ordering = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC): + localctx.ordering = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdentifierCommentListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifierComment(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierCommentContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierCommentContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_identifierCommentList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifierCommentList" ): + listener.enterIdentifierCommentList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifierCommentList" ): + listener.exitIdentifierCommentList(self) + + + + + def identifierCommentList(self): + + localctx = SqlBaseParser.IdentifierCommentListContext(self, self._ctx, self.state) + self.enterRule(localctx, 154, self.RULE_identifierCommentList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2114 + self.match(SqlBaseParser.T__1) + self.state = 2115 + self.identifierComment() + self.state = 2120 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2116 + self.match(SqlBaseParser.T__3) + self.state = 2117 + self.identifierComment() + self.state = 2122 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2123 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdentifierCommentContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def commentSpec(self): + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_identifierComment + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifierComment" ): + listener.enterIdentifierComment(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifierComment" ): + listener.exitIdentifierComment(self) + + + + + def identifierComment(self): + + localctx = SqlBaseParser.IdentifierCommentContext(self, self._ctx, self.state) + self.enterRule(localctx, 156, self.RULE_identifierComment) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2125 + self.identifier() + self.state = 2127 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.COMMENT: + self.state = 2126 + self.commentSpec() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class RelationPrimaryContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_relationPrimary + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class TableValuedFunctionContext(RelationPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def functionTable(self): + return self.getTypedRuleContext(SqlBaseParser.FunctionTableContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableValuedFunction" ): + listener.enterTableValuedFunction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableValuedFunction" ): + listener.exitTableValuedFunction(self) + + + class InlineTableDefault2Context(RelationPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def inlineTable(self): + return self.getTypedRuleContext(SqlBaseParser.InlineTableContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInlineTableDefault2" ): + listener.enterInlineTableDefault2(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInlineTableDefault2" ): + listener.exitInlineTableDefault2(self) + + + class AliasedRelationContext(RelationPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def relation(self): + return self.getTypedRuleContext(SqlBaseParser.RelationContext,0) + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + def sample(self): + return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAliasedRelation" ): + listener.enterAliasedRelation(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAliasedRelation" ): + listener.exitAliasedRelation(self) + + + class AliasedQueryContext(RelationPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + def sample(self): + return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAliasedQuery" ): + listener.enterAliasedQuery(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAliasedQuery" ): + listener.exitAliasedQuery(self) + + + class TableNameContext(RelationPrimaryContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext + super().__init__(parser) + self.copyFrom(ctx) + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + def sample(self): + return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableName" ): + listener.enterTableName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableName" ): + listener.exitTableName(self) + + + + def relationPrimary(self): + + localctx = SqlBaseParser.RelationPrimaryContext(self, self._ctx, self.state) + self.enterRule(localctx, 158, self.RULE_relationPrimary) + try: + self.state = 2153 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,270,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.TableNameContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2129 + self.multipartIdentifier() + self.state = 2131 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,267,self._ctx) + if la_ == 1: + self.state = 2130 + self.sample() + + + self.state = 2133 + self.tableAlias() + pass + + elif la_ == 2: + localctx = SqlBaseParser.AliasedQueryContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2135 + self.match(SqlBaseParser.T__1) + self.state = 2136 + self.query() + self.state = 2137 + self.match(SqlBaseParser.T__2) + self.state = 2139 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,268,self._ctx) + if la_ == 1: + self.state = 2138 + self.sample() + + + self.state = 2141 + self.tableAlias() + pass + + elif la_ == 3: + localctx = SqlBaseParser.AliasedRelationContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2143 + self.match(SqlBaseParser.T__1) + self.state = 2144 + self.relation() + self.state = 2145 + self.match(SqlBaseParser.T__2) + self.state = 2147 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,269,self._ctx) + if la_ == 1: + self.state = 2146 + self.sample() + + + self.state = 2149 + self.tableAlias() + pass + + elif la_ == 4: + localctx = SqlBaseParser.InlineTableDefault2Context(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2151 + self.inlineTable() + pass + + elif la_ == 5: + localctx = SqlBaseParser.TableValuedFunctionContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 2152 + self.functionTable() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class InlineTableContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def VALUES(self): + return self.getToken(SqlBaseParser.VALUES, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_inlineTable + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInlineTable" ): + listener.enterInlineTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInlineTable" ): + listener.exitInlineTable(self) + + + + + def inlineTable(self): + + localctx = SqlBaseParser.InlineTableContext(self, self._ctx, self.state) + self.enterRule(localctx, 160, self.RULE_inlineTable) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2155 + self.match(SqlBaseParser.VALUES) + self.state = 2156 + self.expression() + self.state = 2161 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,271,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2157 + self.match(SqlBaseParser.T__3) + self.state = 2158 + self.expression() + self.state = 2163 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,271,self._ctx) + + self.state = 2164 + self.tableAlias() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FunctionTableContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.funcName = None # ErrorCapturingIdentifierContext + + def tableAlias(self): + return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) + + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_functionTable + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionTable" ): + listener.enterFunctionTable(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionTable" ): + listener.exitFunctionTable(self) + + + + + def functionTable(self): + + localctx = SqlBaseParser.FunctionTableContext(self, self._ctx, self.state) + self.enterRule(localctx, 162, self.RULE_functionTable) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2166 + localctx.funcName = self.errorCapturingIdentifier() + self.state = 2167 + self.match(SqlBaseParser.T__1) + self.state = 2176 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,273,self._ctx) + if la_ == 1: + self.state = 2168 + self.expression() + self.state = 2173 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2169 + self.match(SqlBaseParser.T__3) + self.state = 2170 + self.expression() + self.state = 2175 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 2178 + self.match(SqlBaseParser.T__2) + self.state = 2179 + self.tableAlias() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TableAliasContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def strictIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.StrictIdentifierContext,0) + + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_tableAlias + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableAlias" ): + listener.enterTableAlias(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableAlias" ): + listener.exitTableAlias(self) + + + + + def tableAlias(self): + + localctx = SqlBaseParser.TableAliasContext(self, self._ctx, self.state) + self.enterRule(localctx, 164, self.RULE_tableAlias) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2188 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,276,self._ctx) + if la_ == 1: + self.state = 2182 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,274,self._ctx) + if la_ == 1: + self.state = 2181 + self.match(SqlBaseParser.AS) + + + self.state = 2184 + self.strictIdentifier() + self.state = 2186 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,275,self._ctx) + if la_ == 1: + self.state = 2185 + self.identifierList() + + + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class RowFormatContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_rowFormat + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class RowFormatSerdeContext(RowFormatContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RowFormatContext + super().__init__(parser) + self.name = None # Token + self.props = None # TablePropertyListContext + self.copyFrom(ctx) + + def ROW(self): + return self.getToken(SqlBaseParser.ROW, 0) + def FORMAT(self): + return self.getToken(SqlBaseParser.FORMAT, 0) + def SERDE(self): + return self.getToken(SqlBaseParser.SERDE, 0) + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + def SERDEPROPERTIES(self): + return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) + def tablePropertyList(self): + return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRowFormatSerde" ): + listener.enterRowFormatSerde(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRowFormatSerde" ): + listener.exitRowFormatSerde(self) + + + class RowFormatDelimitedContext(RowFormatContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RowFormatContext + super().__init__(parser) + self.fieldsTerminatedBy = None # Token + self.escapedBy = None # Token + self.collectionItemsTerminatedBy = None # Token + self.keysTerminatedBy = None # Token + self.linesSeparatedBy = None # Token + self.nullDefinedAs = None # Token + self.copyFrom(ctx) + + def ROW(self): + return self.getToken(SqlBaseParser.ROW, 0) + def FORMAT(self): + return self.getToken(SqlBaseParser.FORMAT, 0) + def DELIMITED(self): + return self.getToken(SqlBaseParser.DELIMITED, 0) + def FIELDS(self): + return self.getToken(SqlBaseParser.FIELDS, 0) + def TERMINATED(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.TERMINATED) + else: + return self.getToken(SqlBaseParser.TERMINATED, i) + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + def COLLECTION(self): + return self.getToken(SqlBaseParser.COLLECTION, 0) + def ITEMS(self): + return self.getToken(SqlBaseParser.ITEMS, 0) + def MAP(self): + return self.getToken(SqlBaseParser.MAP, 0) + def KEYS(self): + return self.getToken(SqlBaseParser.KEYS, 0) + def LINES(self): + return self.getToken(SqlBaseParser.LINES, 0) + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + def DEFINED(self): + return self.getToken(SqlBaseParser.DEFINED, 0) + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + def STRING(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.STRING) + else: + return self.getToken(SqlBaseParser.STRING, i) + def ESCAPED(self): + return self.getToken(SqlBaseParser.ESCAPED, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRowFormatDelimited" ): + listener.enterRowFormatDelimited(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRowFormatDelimited" ): + listener.exitRowFormatDelimited(self) + + + + def rowFormat(self): + + localctx = SqlBaseParser.RowFormatContext(self, self._ctx, self.state) + self.enterRule(localctx, 166, self.RULE_rowFormat) + try: + self.state = 2239 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,284,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.RowFormatSerdeContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2190 + self.match(SqlBaseParser.ROW) + self.state = 2191 + self.match(SqlBaseParser.FORMAT) + self.state = 2192 + self.match(SqlBaseParser.SERDE) + self.state = 2193 + localctx.name = self.match(SqlBaseParser.STRING) + self.state = 2197 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,277,self._ctx) + if la_ == 1: + self.state = 2194 + self.match(SqlBaseParser.WITH) + self.state = 2195 + self.match(SqlBaseParser.SERDEPROPERTIES) + self.state = 2196 + localctx.props = self.tablePropertyList() + + + pass + + elif la_ == 2: + localctx = SqlBaseParser.RowFormatDelimitedContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2199 + self.match(SqlBaseParser.ROW) + self.state = 2200 + self.match(SqlBaseParser.FORMAT) + self.state = 2201 + self.match(SqlBaseParser.DELIMITED) + self.state = 2211 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,279,self._ctx) + if la_ == 1: + self.state = 2202 + self.match(SqlBaseParser.FIELDS) + self.state = 2203 + self.match(SqlBaseParser.TERMINATED) + self.state = 2204 + self.match(SqlBaseParser.BY) + self.state = 2205 + localctx.fieldsTerminatedBy = self.match(SqlBaseParser.STRING) + self.state = 2209 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,278,self._ctx) + if la_ == 1: + self.state = 2206 + self.match(SqlBaseParser.ESCAPED) + self.state = 2207 + self.match(SqlBaseParser.BY) + self.state = 2208 + localctx.escapedBy = self.match(SqlBaseParser.STRING) + + + + + self.state = 2218 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,280,self._ctx) + if la_ == 1: + self.state = 2213 + self.match(SqlBaseParser.COLLECTION) + self.state = 2214 + self.match(SqlBaseParser.ITEMS) + self.state = 2215 + self.match(SqlBaseParser.TERMINATED) + self.state = 2216 + self.match(SqlBaseParser.BY) + self.state = 2217 + localctx.collectionItemsTerminatedBy = self.match(SqlBaseParser.STRING) + + + self.state = 2225 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,281,self._ctx) + if la_ == 1: + self.state = 2220 + self.match(SqlBaseParser.MAP) + self.state = 2221 + self.match(SqlBaseParser.KEYS) + self.state = 2222 + self.match(SqlBaseParser.TERMINATED) + self.state = 2223 + self.match(SqlBaseParser.BY) + self.state = 2224 + localctx.keysTerminatedBy = self.match(SqlBaseParser.STRING) + + + self.state = 2231 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,282,self._ctx) + if la_ == 1: + self.state = 2227 + self.match(SqlBaseParser.LINES) + self.state = 2228 + self.match(SqlBaseParser.TERMINATED) + self.state = 2229 + self.match(SqlBaseParser.BY) + self.state = 2230 + localctx.linesSeparatedBy = self.match(SqlBaseParser.STRING) + + + self.state = 2237 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,283,self._ctx) + if la_ == 1: + self.state = 2233 + self.match(SqlBaseParser.NULL) + self.state = 2234 + self.match(SqlBaseParser.DEFINED) + self.state = 2235 + self.match(SqlBaseParser.AS) + self.state = 2236 + localctx.nullDefinedAs = self.match(SqlBaseParser.STRING) + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MultipartIdentifierListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def multipartIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_multipartIdentifierList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMultipartIdentifierList" ): + listener.enterMultipartIdentifierList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMultipartIdentifierList" ): + listener.exitMultipartIdentifierList(self) + + + + + def multipartIdentifierList(self): + + localctx = SqlBaseParser.MultipartIdentifierListContext(self, self._ctx, self.state) + self.enterRule(localctx, 168, self.RULE_multipartIdentifierList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2241 + self.multipartIdentifier() + self.state = 2246 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2242 + self.match(SqlBaseParser.T__3) + self.state = 2243 + self.multipartIdentifier() + self.state = 2248 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MultipartIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._errorCapturingIdentifier = None # ErrorCapturingIdentifierContext + self.parts = list() # of ErrorCapturingIdentifierContexts + + def errorCapturingIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_multipartIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMultipartIdentifier" ): + listener.enterMultipartIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMultipartIdentifier" ): + listener.exitMultipartIdentifier(self) + + + + + def multipartIdentifier(self): + + localctx = SqlBaseParser.MultipartIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 170, self.RULE_multipartIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2249 + localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() + localctx.parts.append(localctx._errorCapturingIdentifier) + self.state = 2254 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,286,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2250 + self.match(SqlBaseParser.T__4) + self.state = 2251 + localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() + localctx.parts.append(localctx._errorCapturingIdentifier) + self.state = 2256 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,286,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TableIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.db = None # ErrorCapturingIdentifierContext + self.table = None # ErrorCapturingIdentifierContext + + def errorCapturingIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_tableIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTableIdentifier" ): + listener.enterTableIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTableIdentifier" ): + listener.exitTableIdentifier(self) + + + + + def tableIdentifier(self): + + localctx = SqlBaseParser.TableIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 172, self.RULE_tableIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2260 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,287,self._ctx) + if la_ == 1: + self.state = 2257 + localctx.db = self.errorCapturingIdentifier() + self.state = 2258 + self.match(SqlBaseParser.T__4) + + + self.state = 2262 + localctx.table = self.errorCapturingIdentifier() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FunctionIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.db = None # ErrorCapturingIdentifierContext + self.function = None # ErrorCapturingIdentifierContext + + def errorCapturingIdentifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_functionIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionIdentifier" ): + listener.enterFunctionIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionIdentifier" ): + listener.exitFunctionIdentifier(self) + + + + + def functionIdentifier(self): + + localctx = SqlBaseParser.FunctionIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 174, self.RULE_functionIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2267 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,288,self._ctx) + if la_ == 1: + self.state = 2264 + localctx.db = self.errorCapturingIdentifier() + self.state = 2265 + self.match(SqlBaseParser.T__4) + + + self.state = 2269 + localctx.function = self.errorCapturingIdentifier() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NamedExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # ErrorCapturingIdentifierContext + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def identifierList(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) + + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_namedExpression + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedExpression" ): + listener.enterNamedExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedExpression" ): + listener.exitNamedExpression(self) + + + + + def namedExpression(self): + + localctx = SqlBaseParser.NamedExpressionContext(self, self._ctx, self.state) + self.enterRule(localctx, 176, self.RULE_namedExpression) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2271 + self.expression() + self.state = 2279 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,291,self._ctx) + if la_ == 1: + self.state = 2273 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,289,self._ctx) + if la_ == 1: + self.state = 2272 + self.match(SqlBaseParser.AS) + + + self.state = 2277 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,290,self._ctx) + if la_ == 1: + self.state = 2275 + localctx.name = self.errorCapturingIdentifier() + pass + + elif la_ == 2: + self.state = 2276 + self.identifierList() + pass + + + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NamedExpressionSeqContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def namedExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_namedExpressionSeq + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedExpressionSeq" ): + listener.enterNamedExpressionSeq(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedExpressionSeq" ): + listener.exitNamedExpressionSeq(self) + + + + + def namedExpressionSeq(self): + + localctx = SqlBaseParser.NamedExpressionSeqContext(self, self._ctx, self.state) + self.enterRule(localctx, 178, self.RULE_namedExpressionSeq) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2281 + self.namedExpression() + self.state = 2286 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,292,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2282 + self.match(SqlBaseParser.T__3) + self.state = 2283 + self.namedExpression() + self.state = 2288 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,292,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TransformListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._transform = None # TransformContext + self.transforms = list() # of TransformContexts + + def transform(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TransformContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TransformContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_transformList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTransformList" ): + listener.enterTransformList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTransformList" ): + listener.exitTransformList(self) + + + + + def transformList(self): + + localctx = SqlBaseParser.TransformListContext(self, self._ctx, self.state) + self.enterRule(localctx, 180, self.RULE_transformList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2289 + self.match(SqlBaseParser.T__1) + self.state = 2290 + localctx._transform = self.transform() + localctx.transforms.append(localctx._transform) + self.state = 2295 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2291 + self.match(SqlBaseParser.T__3) + self.state = 2292 + localctx._transform = self.transform() + localctx.transforms.append(localctx._transform) + self.state = 2297 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2298 + self.match(SqlBaseParser.T__2) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TransformContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_transform + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class IdentityTransformContext(TransformContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.TransformContext + super().__init__(parser) + self.copyFrom(ctx) + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentityTransform" ): + listener.enterIdentityTransform(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentityTransform" ): + listener.exitIdentityTransform(self) + + + class ApplyTransformContext(TransformContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.TransformContext + super().__init__(parser) + self.transformName = None # IdentifierContext + self._transformArgument = None # TransformArgumentContext + self.argument = list() # of TransformArgumentContexts + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def transformArgument(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.TransformArgumentContext) + else: + return self.getTypedRuleContext(SqlBaseParser.TransformArgumentContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterApplyTransform" ): + listener.enterApplyTransform(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitApplyTransform" ): + listener.exitApplyTransform(self) + + + + def transform(self): + + localctx = SqlBaseParser.TransformContext(self, self._ctx, self.state) + self.enterRule(localctx, 182, self.RULE_transform) + self._la = 0 # Token type + try: + self.state = 2313 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,295,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.IdentityTransformContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2300 + self.qualifiedName() + pass + + elif la_ == 2: + localctx = SqlBaseParser.ApplyTransformContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2301 + localctx.transformName = self.identifier() + self.state = 2302 + self.match(SqlBaseParser.T__1) + self.state = 2303 + localctx._transformArgument = self.transformArgument() + localctx.argument.append(localctx._transformArgument) + self.state = 2308 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2304 + self.match(SqlBaseParser.T__3) + self.state = 2305 + localctx._transformArgument = self.transformArgument() + localctx.argument.append(localctx._transformArgument) + self.state = 2310 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2311 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class TransformArgumentContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def constant(self): + return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_transformArgument + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTransformArgument" ): + listener.enterTransformArgument(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTransformArgument" ): + listener.exitTransformArgument(self) + + + + + def transformArgument(self): + + localctx = SqlBaseParser.TransformArgumentContext(self, self._ctx, self.state) + self.enterRule(localctx, 184, self.RULE_transformArgument) + try: + self.state = 2317 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,296,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2315 + self.qualifiedName() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2316 + self.constant() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_expression + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpression" ): + listener.enterExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpression" ): + listener.exitExpression(self) + + + + + def expression(self): + + localctx = SqlBaseParser.ExpressionContext(self, self._ctx, self.state) + self.enterRule(localctx, 186, self.RULE_expression) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2319 + self.booleanExpression(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class BooleanExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_booleanExpression + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + class LogicalNotContext(BooleanExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogicalNot" ): + listener.enterLogicalNot(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogicalNot" ): + listener.exitLogicalNot(self) + + + class PredicatedContext(BooleanExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def valueExpression(self): + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) + + def predicate(self): + return self.getTypedRuleContext(SqlBaseParser.PredicateContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPredicated" ): + listener.enterPredicated(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPredicated" ): + listener.exitPredicated(self) + + + class ExistsContext(BooleanExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExists" ): + listener.enterExists(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExists" ): + listener.exitExists(self) + + + class LogicalBinaryContext(BooleanExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext + super().__init__(parser) + self.left = None # BooleanExpressionContext + self.operator = None # Token + self.right = None # BooleanExpressionContext + self.copyFrom(ctx) + + def booleanExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.BooleanExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,i) + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogicalBinary" ): + listener.enterLogicalBinary(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogicalBinary" ): + listener.exitLogicalBinary(self) + + + + def booleanExpression(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = SqlBaseParser.BooleanExpressionContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 188 + self.enterRecursionRule(localctx, 188, self.RULE_booleanExpression, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2333 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,298,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.LogicalNotContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 2322 + self.match(SqlBaseParser.NOT) + self.state = 2323 + self.booleanExpression(5) + pass + + elif la_ == 2: + localctx = SqlBaseParser.ExistsContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2324 + self.match(SqlBaseParser.EXISTS) + self.state = 2325 + self.match(SqlBaseParser.T__1) + self.state = 2326 + self.query() + self.state = 2327 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 3: + localctx = SqlBaseParser.PredicatedContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2329 + self.valueExpression(0) + self.state = 2331 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,297,self._ctx) + if la_ == 1: + self.state = 2330 + self.predicate() + + + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 2343 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,300,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 2341 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,299,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.LogicalBinaryContext(self, SqlBaseParser.BooleanExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_booleanExpression) + self.state = 2335 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 2336 + localctx.operator = self.match(SqlBaseParser.AND) + self.state = 2337 + localctx.right = self.booleanExpression(3) + pass + + elif la_ == 2: + localctx = SqlBaseParser.LogicalBinaryContext(self, SqlBaseParser.BooleanExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_booleanExpression) + self.state = 2338 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 2339 + localctx.operator = self.match(SqlBaseParser.OR) + self.state = 2340 + localctx.right = self.booleanExpression(2) + pass + + + self.state = 2345 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,300,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + class PredicateContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.kind = None # Token + self.lower = None # ValueExpressionContext + self.upper = None # ValueExpressionContext + self.pattern = None # ValueExpressionContext + self.quantifier = None # Token + self.escapeChar = None # Token + self.right = None # ValueExpressionContext + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def BETWEEN(self): + return self.getToken(SqlBaseParser.BETWEEN, 0) + + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def RLIKE(self): + return self.getToken(SqlBaseParser.RLIKE, 0) + + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def ANY(self): + return self.getToken(SqlBaseParser.ANY, 0) + + def SOME(self): + return self.getToken(SqlBaseParser.SOME, 0) + + def ALL(self): + return self.getToken(SqlBaseParser.ALL, 0) + + def ESCAPE(self): + return self.getToken(SqlBaseParser.ESCAPE, 0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def IS(self): + return self.getToken(SqlBaseParser.IS, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def TRUE(self): + return self.getToken(SqlBaseParser.TRUE, 0) + + def FALSE(self): + return self.getToken(SqlBaseParser.FALSE, 0) + + def UNKNOWN(self): + return self.getToken(SqlBaseParser.UNKNOWN, 0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + + def DISTINCT(self): + return self.getToken(SqlBaseParser.DISTINCT, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_predicate + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPredicate" ): + listener.enterPredicate(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPredicate" ): + listener.exitPredicate(self) + + + + + def predicate(self): + + localctx = SqlBaseParser.PredicateContext(self, self._ctx, self.state) + self.enterRule(localctx, 190, self.RULE_predicate) + self._la = 0 # Token type + try: + self.state = 2428 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,314,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2347 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2346 + self.match(SqlBaseParser.NOT) + + + self.state = 2349 + localctx.kind = self.match(SqlBaseParser.BETWEEN) + self.state = 2350 + localctx.lower = self.valueExpression(0) + self.state = 2351 + self.match(SqlBaseParser.AND) + self.state = 2352 + localctx.upper = self.valueExpression(0) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2355 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2354 + self.match(SqlBaseParser.NOT) + + + self.state = 2357 + localctx.kind = self.match(SqlBaseParser.IN) + self.state = 2358 + self.match(SqlBaseParser.T__1) + self.state = 2359 + self.expression() + self.state = 2364 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2360 + self.match(SqlBaseParser.T__3) + self.state = 2361 + self.expression() + self.state = 2366 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2367 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2370 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2369 + self.match(SqlBaseParser.NOT) + + + self.state = 2372 + localctx.kind = self.match(SqlBaseParser.IN) + self.state = 2373 + self.match(SqlBaseParser.T__1) + self.state = 2374 + self.query() + self.state = 2375 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 2378 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2377 + self.match(SqlBaseParser.NOT) + + + self.state = 2380 + localctx.kind = self.match(SqlBaseParser.RLIKE) + self.state = 2381 + localctx.pattern = self.valueExpression(0) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 2383 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2382 + self.match(SqlBaseParser.NOT) + + + self.state = 2385 + localctx.kind = self.match(SqlBaseParser.LIKE) + self.state = 2386 + localctx.quantifier = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ALL or _la==SqlBaseParser.ANY or _la==SqlBaseParser.SOME): + localctx.quantifier = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2400 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,308,self._ctx) + if la_ == 1: + self.state = 2387 + self.match(SqlBaseParser.T__1) + self.state = 2388 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 2: + self.state = 2389 + self.match(SqlBaseParser.T__1) + self.state = 2390 + self.expression() + self.state = 2395 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2391 + self.match(SqlBaseParser.T__3) + self.state = 2392 + self.expression() + self.state = 2397 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2398 + self.match(SqlBaseParser.T__2) + pass + + + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 2403 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2402 + self.match(SqlBaseParser.NOT) + + + self.state = 2405 + localctx.kind = self.match(SqlBaseParser.LIKE) + self.state = 2406 + localctx.pattern = self.valueExpression(0) + self.state = 2409 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,310,self._ctx) + if la_ == 1: + self.state = 2407 + self.match(SqlBaseParser.ESCAPE) + self.state = 2408 + localctx.escapeChar = self.match(SqlBaseParser.STRING) + + + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 2411 + self.match(SqlBaseParser.IS) + self.state = 2413 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2412 + self.match(SqlBaseParser.NOT) + + + self.state = 2415 + localctx.kind = self.match(SqlBaseParser.NULL) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 2416 + self.match(SqlBaseParser.IS) + self.state = 2418 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2417 + self.match(SqlBaseParser.NOT) + + + self.state = 2420 + localctx.kind = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FALSE or _la==SqlBaseParser.TRUE or _la==SqlBaseParser.UNKNOWN): + localctx.kind = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 2421 + self.match(SqlBaseParser.IS) + self.state = 2423 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2422 + self.match(SqlBaseParser.NOT) + + + self.state = 2425 + localctx.kind = self.match(SqlBaseParser.DISTINCT) + self.state = 2426 + self.match(SqlBaseParser.FROM) + self.state = 2427 + localctx.right = self.valueExpression(0) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ValueExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_valueExpression + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + class ValueExpressionDefaultContext(ValueExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def primaryExpression(self): + return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterValueExpressionDefault" ): + listener.enterValueExpressionDefault(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitValueExpressionDefault" ): + listener.exitValueExpressionDefault(self) + + + class ComparisonContext(ValueExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext + super().__init__(parser) + self.left = None # ValueExpressionContext + self.right = None # ValueExpressionContext + self.copyFrom(ctx) + + def comparisonOperator(self): + return self.getTypedRuleContext(SqlBaseParser.ComparisonOperatorContext,0) + + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterComparison" ): + listener.enterComparison(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitComparison" ): + listener.exitComparison(self) + + + class ArithmeticBinaryContext(ValueExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext + super().__init__(parser) + self.left = None # ValueExpressionContext + self.operator = None # Token + self.right = None # ValueExpressionContext + self.copyFrom(ctx) + + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + def ASTERISK(self): + return self.getToken(SqlBaseParser.ASTERISK, 0) + def SLASH(self): + return self.getToken(SqlBaseParser.SLASH, 0) + def PERCENT(self): + return self.getToken(SqlBaseParser.PERCENT, 0) + def DIV(self): + return self.getToken(SqlBaseParser.DIV, 0) + def PLUS(self): + return self.getToken(SqlBaseParser.PLUS, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + def CONCAT_PIPE(self): + return self.getToken(SqlBaseParser.CONCAT_PIPE, 0) + def AMPERSAND(self): + return self.getToken(SqlBaseParser.AMPERSAND, 0) + def HAT(self): + return self.getToken(SqlBaseParser.HAT, 0) + def PIPE(self): + return self.getToken(SqlBaseParser.PIPE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterArithmeticBinary" ): + listener.enterArithmeticBinary(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitArithmeticBinary" ): + listener.exitArithmeticBinary(self) + + + class ArithmeticUnaryContext(ValueExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext + super().__init__(parser) + self.operator = None # Token + self.copyFrom(ctx) + + def valueExpression(self): + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) + + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + def PLUS(self): + return self.getToken(SqlBaseParser.PLUS, 0) + def TILDE(self): + return self.getToken(SqlBaseParser.TILDE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterArithmeticUnary" ): + listener.enterArithmeticUnary(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitArithmeticUnary" ): + listener.exitArithmeticUnary(self) + + + + def valueExpression(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = SqlBaseParser.ValueExpressionContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 192 + self.enterRecursionRule(localctx, 192, self.RULE_valueExpression, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2434 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,315,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.ValueExpressionDefaultContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 2431 + self.primaryExpression(0) + pass + + elif la_ == 2: + localctx = SqlBaseParser.ArithmeticUnaryContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2432 + localctx.operator = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.TILDE - 272)))) != 0)): + localctx.operator = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2433 + self.valueExpression(7) + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 2457 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,317,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 2455 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,316,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2436 + if not self.precpred(self._ctx, 6): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") + self.state = 2437 + localctx.operator = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 274)) & ~0x3f) == 0 and ((1 << (_la - 274)) & ((1 << (SqlBaseParser.ASTERISK - 274)) | (1 << (SqlBaseParser.SLASH - 274)) | (1 << (SqlBaseParser.PERCENT - 274)) | (1 << (SqlBaseParser.DIV - 274)))) != 0)): + localctx.operator = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2438 + localctx.right = self.valueExpression(7) + pass + + elif la_ == 2: + localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2439 + if not self.precpred(self._ctx, 5): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 5)") + self.state = 2440 + localctx.operator = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.CONCAT_PIPE - 272)))) != 0)): + localctx.operator = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2441 + localctx.right = self.valueExpression(6) + pass + + elif la_ == 3: + localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2442 + if not self.precpred(self._ctx, 4): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 4)") + self.state = 2443 + localctx.operator = self.match(SqlBaseParser.AMPERSAND) + self.state = 2444 + localctx.right = self.valueExpression(5) + pass + + elif la_ == 4: + localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2445 + if not self.precpred(self._ctx, 3): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") + self.state = 2446 + localctx.operator = self.match(SqlBaseParser.HAT) + self.state = 2447 + localctx.right = self.valueExpression(4) + pass + + elif la_ == 5: + localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2448 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 2449 + localctx.operator = self.match(SqlBaseParser.PIPE) + self.state = 2450 + localctx.right = self.valueExpression(3) + pass + + elif la_ == 6: + localctx = SqlBaseParser.ComparisonContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) + localctx.left = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) + self.state = 2451 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 2452 + self.comparisonOperator() + self.state = 2453 + localctx.right = self.valueExpression(2) + pass + + + self.state = 2459 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,317,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + class PrimaryExpressionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_primaryExpression + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + class StructContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self._namedExpression = None # NamedExpressionContext + self.argument = list() # of NamedExpressionContexts + self.copyFrom(ctx) + + def STRUCT(self): + return self.getToken(SqlBaseParser.STRUCT, 0) + def namedExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStruct" ): + listener.enterStruct(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStruct" ): + listener.exitStruct(self) + + + class DereferenceContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.base = None # PrimaryExpressionContext + self.fieldName = None # IdentifierContext + self.copyFrom(ctx) + + def primaryExpression(self): + return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDereference" ): + listener.enterDereference(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDereference" ): + listener.exitDereference(self) + + + class SimpleCaseContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.value = None # ExpressionContext + self.elseExpression = None # ExpressionContext + self.copyFrom(ctx) + + def CASE(self): + return self.getToken(SqlBaseParser.CASE, 0) + def END(self): + return self.getToken(SqlBaseParser.END, 0) + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + def whenClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.WhenClauseContext) + else: + return self.getTypedRuleContext(SqlBaseParser.WhenClauseContext,i) + + def ELSE(self): + return self.getToken(SqlBaseParser.ELSE, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSimpleCase" ): + listener.enterSimpleCase(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSimpleCase" ): + listener.exitSimpleCase(self) + + + class ColumnReferenceContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterColumnReference" ): + listener.enterColumnReference(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitColumnReference" ): + listener.exitColumnReference(self) + + + class RowConstructorContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def namedExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRowConstructor" ): + listener.enterRowConstructor(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRowConstructor" ): + listener.exitRowConstructor(self) + + + class LastContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def LAST(self): + return self.getToken(SqlBaseParser.LAST, 0) + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + def IGNORE(self): + return self.getToken(SqlBaseParser.IGNORE, 0) + def NULLS(self): + return self.getToken(SqlBaseParser.NULLS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLast" ): + listener.enterLast(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLast" ): + listener.exitLast(self) + + + class StarContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def ASTERISK(self): + return self.getToken(SqlBaseParser.ASTERISK, 0) + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStar" ): + listener.enterStar(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStar" ): + listener.exitStar(self) + + + class OverlayContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.input = None # ValueExpressionContext + self.replace = None # ValueExpressionContext + self.position = None # ValueExpressionContext + self.length = None # ValueExpressionContext + self.copyFrom(ctx) + + def OVERLAY(self): + return self.getToken(SqlBaseParser.OVERLAY, 0) + def PLACING(self): + return self.getToken(SqlBaseParser.PLACING, 0) + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + def FOR(self): + return self.getToken(SqlBaseParser.FOR, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterOverlay" ): + listener.enterOverlay(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitOverlay" ): + listener.exitOverlay(self) + + + class SubscriptContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.value = None # PrimaryExpressionContext + self.index = None # ValueExpressionContext + self.copyFrom(ctx) + + def primaryExpression(self): + return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) + + def valueExpression(self): + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSubscript" ): + listener.enterSubscript(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSubscript" ): + listener.exitSubscript(self) + + + class SubqueryExpressionContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def query(self): + return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSubqueryExpression" ): + listener.enterSubqueryExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSubqueryExpression" ): + listener.exitSubqueryExpression(self) + + + class SubstringContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.str = None # ValueExpressionContext + self.pos = None # ValueExpressionContext + self.len = None # ValueExpressionContext + self.copyFrom(ctx) + + def SUBSTR(self): + return self.getToken(SqlBaseParser.SUBSTR, 0) + def SUBSTRING(self): + return self.getToken(SqlBaseParser.SUBSTRING, 0) + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def FOR(self): + return self.getToken(SqlBaseParser.FOR, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSubstring" ): + listener.enterSubstring(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSubstring" ): + listener.exitSubstring(self) + + + class CurrentDatetimeContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.name = None # Token + self.copyFrom(ctx) + + def CURRENT_DATE(self): + return self.getToken(SqlBaseParser.CURRENT_DATE, 0) + def CURRENT_TIMESTAMP(self): + return self.getToken(SqlBaseParser.CURRENT_TIMESTAMP, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCurrentDatetime" ): + listener.enterCurrentDatetime(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCurrentDatetime" ): + listener.exitCurrentDatetime(self) + + + class CastContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def CAST(self): + return self.getToken(SqlBaseParser.CAST, 0) + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCast" ): + listener.enterCast(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCast" ): + listener.exitCast(self) + + + class ConstantDefaultContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def constant(self): + return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstantDefault" ): + listener.enterConstantDefault(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstantDefault" ): + listener.exitConstantDefault(self) + + + class LambdaContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLambda" ): + listener.enterLambda(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLambda" ): + listener.exitLambda(self) + + + class ParenthesizedExpressionContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterParenthesizedExpression" ): + listener.enterParenthesizedExpression(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitParenthesizedExpression" ): + listener.exitParenthesizedExpression(self) + + + class ExtractContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.field = None # IdentifierContext + self.source = None # ValueExpressionContext + self.copyFrom(ctx) + + def EXTRACT(self): + return self.getToken(SqlBaseParser.EXTRACT, 0) + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def valueExpression(self): + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExtract" ): + listener.enterExtract(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExtract" ): + listener.exitExtract(self) + + + class TrimContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.trimOption = None # Token + self.trimStr = None # ValueExpressionContext + self.srcStr = None # ValueExpressionContext + self.copyFrom(ctx) + + def TRIM(self): + return self.getToken(SqlBaseParser.TRIM, 0) + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + def BOTH(self): + return self.getToken(SqlBaseParser.BOTH, 0) + def LEADING(self): + return self.getToken(SqlBaseParser.LEADING, 0) + def TRAILING(self): + return self.getToken(SqlBaseParser.TRAILING, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTrim" ): + listener.enterTrim(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTrim" ): + listener.exitTrim(self) + + + class FunctionCallContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self._expression = None # ExpressionContext + self.argument = list() # of ExpressionContexts + self.where = None # BooleanExpressionContext + self.copyFrom(ctx) + + def functionName(self): + return self.getTypedRuleContext(SqlBaseParser.FunctionNameContext,0) + + def FILTER(self): + return self.getToken(SqlBaseParser.FILTER, 0) + def WHERE(self): + return self.getToken(SqlBaseParser.WHERE, 0) + def OVER(self): + return self.getToken(SqlBaseParser.OVER, 0) + def windowSpec(self): + return self.getTypedRuleContext(SqlBaseParser.WindowSpecContext,0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + def booleanExpression(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) + + def setQuantifier(self): + return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionCall" ): + listener.enterFunctionCall(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionCall" ): + listener.exitFunctionCall(self) + + + class SearchedCaseContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.elseExpression = None # ExpressionContext + self.copyFrom(ctx) + + def CASE(self): + return self.getToken(SqlBaseParser.CASE, 0) + def END(self): + return self.getToken(SqlBaseParser.END, 0) + def whenClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.WhenClauseContext) + else: + return self.getTypedRuleContext(SqlBaseParser.WhenClauseContext,i) + + def ELSE(self): + return self.getToken(SqlBaseParser.ELSE, 0) + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSearchedCase" ): + listener.enterSearchedCase(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSearchedCase" ): + listener.exitSearchedCase(self) + + + class PositionContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.substr = None # ValueExpressionContext + self.str = None # ValueExpressionContext + self.copyFrom(ctx) + + def POSITION(self): + return self.getToken(SqlBaseParser.POSITION, 0) + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + def valueExpression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPosition" ): + listener.enterPosition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPosition" ): + listener.exitPosition(self) + + + class FirstContext(PrimaryExpressionContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext + super().__init__(parser) + self.copyFrom(ctx) + + def FIRST(self): + return self.getToken(SqlBaseParser.FIRST, 0) + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + def IGNORE(self): + return self.getToken(SqlBaseParser.IGNORE, 0) + def NULLS(self): + return self.getToken(SqlBaseParser.NULLS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFirst" ): + listener.enterFirst(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFirst" ): + listener.exitFirst(self) + + + + def primaryExpression(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = SqlBaseParser.PrimaryExpressionContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 194 + self.enterRecursionRule(localctx, 194, self.RULE_primaryExpression, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2644 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,337,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.CurrentDatetimeContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 2461 + localctx.name = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.CURRENT_DATE or _la==SqlBaseParser.CURRENT_TIMESTAMP): + localctx.name = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 2: + localctx = SqlBaseParser.SearchedCaseContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2462 + self.match(SqlBaseParser.CASE) + self.state = 2464 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 2463 + self.whenClause() + self.state = 2466 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.WHEN): + break + + self.state = 2470 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ELSE: + self.state = 2468 + self.match(SqlBaseParser.ELSE) + self.state = 2469 + localctx.elseExpression = self.expression() + + + self.state = 2472 + self.match(SqlBaseParser.END) + pass + + elif la_ == 3: + localctx = SqlBaseParser.SimpleCaseContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2474 + self.match(SqlBaseParser.CASE) + self.state = 2475 + localctx.value = self.expression() + self.state = 2477 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 2476 + self.whenClause() + self.state = 2479 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.WHEN): + break + + self.state = 2483 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ELSE: + self.state = 2481 + self.match(SqlBaseParser.ELSE) + self.state = 2482 + localctx.elseExpression = self.expression() + + + self.state = 2485 + self.match(SqlBaseParser.END) + pass + + elif la_ == 4: + localctx = SqlBaseParser.CastContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2487 + self.match(SqlBaseParser.CAST) + self.state = 2488 + self.match(SqlBaseParser.T__1) + self.state = 2489 + self.expression() + self.state = 2490 + self.match(SqlBaseParser.AS) + self.state = 2491 + self.dataType() + self.state = 2492 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 5: + localctx = SqlBaseParser.StructContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2494 + self.match(SqlBaseParser.STRUCT) + self.state = 2495 + self.match(SqlBaseParser.T__1) + self.state = 2504 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,323,self._ctx) + if la_ == 1: + self.state = 2496 + localctx._namedExpression = self.namedExpression() + localctx.argument.append(localctx._namedExpression) + self.state = 2501 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2497 + self.match(SqlBaseParser.T__3) + self.state = 2498 + localctx._namedExpression = self.namedExpression() + localctx.argument.append(localctx._namedExpression) + self.state = 2503 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 2506 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 6: + localctx = SqlBaseParser.FirstContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2507 + self.match(SqlBaseParser.FIRST) + self.state = 2508 + self.match(SqlBaseParser.T__1) + self.state = 2509 + self.expression() + self.state = 2512 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IGNORE: + self.state = 2510 + self.match(SqlBaseParser.IGNORE) + self.state = 2511 + self.match(SqlBaseParser.NULLS) + + + self.state = 2514 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 7: + localctx = SqlBaseParser.LastContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2516 + self.match(SqlBaseParser.LAST) + self.state = 2517 + self.match(SqlBaseParser.T__1) + self.state = 2518 + self.expression() + self.state = 2521 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.IGNORE: + self.state = 2519 + self.match(SqlBaseParser.IGNORE) + self.state = 2520 + self.match(SqlBaseParser.NULLS) + + + self.state = 2523 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 8: + localctx = SqlBaseParser.PositionContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2525 + self.match(SqlBaseParser.POSITION) + self.state = 2526 + self.match(SqlBaseParser.T__1) + self.state = 2527 + localctx.substr = self.valueExpression(0) + self.state = 2528 + self.match(SqlBaseParser.IN) + self.state = 2529 + localctx.str = self.valueExpression(0) + self.state = 2530 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 9: + localctx = SqlBaseParser.ConstantDefaultContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2532 + self.constant() + pass + + elif la_ == 10: + localctx = SqlBaseParser.StarContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2533 + self.match(SqlBaseParser.ASTERISK) + pass + + elif la_ == 11: + localctx = SqlBaseParser.StarContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2534 + self.qualifiedName() + self.state = 2535 + self.match(SqlBaseParser.T__4) + self.state = 2536 + self.match(SqlBaseParser.ASTERISK) + pass + + elif la_ == 12: + localctx = SqlBaseParser.RowConstructorContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2538 + self.match(SqlBaseParser.T__1) + self.state = 2539 + self.namedExpression() + self.state = 2542 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 2540 + self.match(SqlBaseParser.T__3) + self.state = 2541 + self.namedExpression() + self.state = 2544 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.T__3): + break + + self.state = 2546 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 13: + localctx = SqlBaseParser.SubqueryExpressionContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2548 + self.match(SqlBaseParser.T__1) + self.state = 2549 + self.query() + self.state = 2550 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 14: + localctx = SqlBaseParser.FunctionCallContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2552 + self.functionName() + self.state = 2553 + self.match(SqlBaseParser.T__1) + self.state = 2565 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,329,self._ctx) + if la_ == 1: + self.state = 2555 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,327,self._ctx) + if la_ == 1: + self.state = 2554 + self.setQuantifier() + + + self.state = 2557 + localctx._expression = self.expression() + localctx.argument.append(localctx._expression) + self.state = 2562 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2558 + self.match(SqlBaseParser.T__3) + self.state = 2559 + localctx._expression = self.expression() + localctx.argument.append(localctx._expression) + self.state = 2564 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 2567 + self.match(SqlBaseParser.T__2) + self.state = 2574 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,330,self._ctx) + if la_ == 1: + self.state = 2568 + self.match(SqlBaseParser.FILTER) + self.state = 2569 + self.match(SqlBaseParser.T__1) + self.state = 2570 + self.match(SqlBaseParser.WHERE) + self.state = 2571 + localctx.where = self.booleanExpression(0) + self.state = 2572 + self.match(SqlBaseParser.T__2) + + + self.state = 2578 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,331,self._ctx) + if la_ == 1: + self.state = 2576 + self.match(SqlBaseParser.OVER) + self.state = 2577 + self.windowSpec() + + + pass + + elif la_ == 15: + localctx = SqlBaseParser.LambdaContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2580 + self.identifier() + self.state = 2581 + self.match(SqlBaseParser.T__7) + self.state = 2582 + self.expression() + pass + + elif la_ == 16: + localctx = SqlBaseParser.LambdaContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2584 + self.match(SqlBaseParser.T__1) + self.state = 2585 + self.identifier() + self.state = 2588 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 2586 + self.match(SqlBaseParser.T__3) + self.state = 2587 + self.identifier() + self.state = 2590 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==SqlBaseParser.T__3): + break + + self.state = 2592 + self.match(SqlBaseParser.T__2) + self.state = 2593 + self.match(SqlBaseParser.T__7) + self.state = 2594 + self.expression() + pass + + elif la_ == 17: + localctx = SqlBaseParser.ColumnReferenceContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2596 + self.identifier() + pass + + elif la_ == 18: + localctx = SqlBaseParser.ParenthesizedExpressionContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2597 + self.match(SqlBaseParser.T__1) + self.state = 2598 + self.expression() + self.state = 2599 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 19: + localctx = SqlBaseParser.ExtractContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2601 + self.match(SqlBaseParser.EXTRACT) + self.state = 2602 + self.match(SqlBaseParser.T__1) + self.state = 2603 + localctx.field = self.identifier() + self.state = 2604 + self.match(SqlBaseParser.FROM) + self.state = 2605 + localctx.source = self.valueExpression(0) + self.state = 2606 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 20: + localctx = SqlBaseParser.SubstringContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2608 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.SUBSTR or _la==SqlBaseParser.SUBSTRING): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2609 + self.match(SqlBaseParser.T__1) + self.state = 2610 + localctx.str = self.valueExpression(0) + self.state = 2611 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.T__3 or _la==SqlBaseParser.FROM): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2612 + localctx.pos = self.valueExpression(0) + self.state = 2615 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.T__3 or _la==SqlBaseParser.FOR: + self.state = 2613 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.T__3 or _la==SqlBaseParser.FOR): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2614 + localctx.len = self.valueExpression(0) + + + self.state = 2617 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 21: + localctx = SqlBaseParser.TrimContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2619 + self.match(SqlBaseParser.TRIM) + self.state = 2620 + self.match(SqlBaseParser.T__1) + self.state = 2622 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,334,self._ctx) + if la_ == 1: + self.state = 2621 + localctx.trimOption = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.BOTH or _la==SqlBaseParser.LEADING or _la==SqlBaseParser.TRAILING): + localctx.trimOption = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 2625 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,335,self._ctx) + if la_ == 1: + self.state = 2624 + localctx.trimStr = self.valueExpression(0) + + + self.state = 2627 + self.match(SqlBaseParser.FROM) + self.state = 2628 + localctx.srcStr = self.valueExpression(0) + self.state = 2629 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 22: + localctx = SqlBaseParser.OverlayContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 2631 + self.match(SqlBaseParser.OVERLAY) + self.state = 2632 + self.match(SqlBaseParser.T__1) + self.state = 2633 + localctx.input = self.valueExpression(0) + self.state = 2634 + self.match(SqlBaseParser.PLACING) + self.state = 2635 + localctx.replace = self.valueExpression(0) + self.state = 2636 + self.match(SqlBaseParser.FROM) + self.state = 2637 + localctx.position = self.valueExpression(0) + self.state = 2640 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.FOR: + self.state = 2638 + self.match(SqlBaseParser.FOR) + self.state = 2639 + localctx.length = self.valueExpression(0) + + + self.state = 2642 + self.match(SqlBaseParser.T__2) + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 2656 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,339,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 2654 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,338,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.SubscriptContext(self, SqlBaseParser.PrimaryExpressionContext(self, _parentctx, _parentState)) + localctx.value = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_primaryExpression) + self.state = 2646 + if not self.precpred(self._ctx, 8): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") + self.state = 2647 + self.match(SqlBaseParser.T__8) + self.state = 2648 + localctx.index = self.valueExpression(0) + self.state = 2649 + self.match(SqlBaseParser.T__9) + pass + + elif la_ == 2: + localctx = SqlBaseParser.DereferenceContext(self, SqlBaseParser.PrimaryExpressionContext(self, _parentctx, _parentState)) + localctx.base = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_primaryExpression) + self.state = 2651 + if not self.precpred(self._ctx, 6): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") + self.state = 2652 + self.match(SqlBaseParser.T__4) + self.state = 2653 + localctx.fieldName = self.identifier() + pass + + + self.state = 2658 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,339,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + class ConstantContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_constant + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class NullLiteralContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNullLiteral" ): + listener.enterNullLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNullLiteral" ): + listener.exitNullLiteral(self) + + + class StringLiteralContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def STRING(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.STRING) + else: + return self.getToken(SqlBaseParser.STRING, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStringLiteral" ): + listener.enterStringLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStringLiteral" ): + listener.exitStringLiteral(self) + + + class TypeConstructorContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTypeConstructor" ): + listener.enterTypeConstructor(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTypeConstructor" ): + listener.exitTypeConstructor(self) + + + class IntervalLiteralContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def interval(self): + return self.getTypedRuleContext(SqlBaseParser.IntervalContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIntervalLiteral" ): + listener.enterIntervalLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIntervalLiteral" ): + listener.exitIntervalLiteral(self) + + + class NumericLiteralContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def number(self): + return self.getTypedRuleContext(SqlBaseParser.NumberContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNumericLiteral" ): + listener.enterNumericLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNumericLiteral" ): + listener.exitNumericLiteral(self) + + + class BooleanLiteralContext(ConstantContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext + super().__init__(parser) + self.copyFrom(ctx) + + def booleanValue(self): + return self.getTypedRuleContext(SqlBaseParser.BooleanValueContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBooleanLiteral" ): + listener.enterBooleanLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBooleanLiteral" ): + listener.exitBooleanLiteral(self) + + + + def constant(self): + + localctx = SqlBaseParser.ConstantContext(self, self._ctx, self.state) + self.enterRule(localctx, 196, self.RULE_constant) + try: + self.state = 2671 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,341,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.NullLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2659 + self.match(SqlBaseParser.NULL) + pass + + elif la_ == 2: + localctx = SqlBaseParser.IntervalLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2660 + self.interval() + pass + + elif la_ == 3: + localctx = SqlBaseParser.TypeConstructorContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2661 + self.identifier() + self.state = 2662 + self.match(SqlBaseParser.STRING) + pass + + elif la_ == 4: + localctx = SqlBaseParser.NumericLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2664 + self.number() + pass + + elif la_ == 5: + localctx = SqlBaseParser.BooleanLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 2665 + self.booleanValue() + pass + + elif la_ == 6: + localctx = SqlBaseParser.StringLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 2667 + self._errHandler.sync(self) + _alt = 1 + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt == 1: + self.state = 2666 + self.match(SqlBaseParser.STRING) + + else: + raise NoViableAltException(self) + self.state = 2669 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,340,self._ctx) + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ComparisonOperatorContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def EQ(self): + return self.getToken(SqlBaseParser.EQ, 0) + + def NEQ(self): + return self.getToken(SqlBaseParser.NEQ, 0) + + def NEQJ(self): + return self.getToken(SqlBaseParser.NEQJ, 0) + + def LT(self): + return self.getToken(SqlBaseParser.LT, 0) + + def LTE(self): + return self.getToken(SqlBaseParser.LTE, 0) + + def GT(self): + return self.getToken(SqlBaseParser.GT, 0) + + def GTE(self): + return self.getToken(SqlBaseParser.GTE, 0) + + def NSEQ(self): + return self.getToken(SqlBaseParser.NSEQ, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_comparisonOperator + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterComparisonOperator" ): + listener.enterComparisonOperator(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitComparisonOperator" ): + listener.exitComparisonOperator(self) + + + + + def comparisonOperator(self): + + localctx = SqlBaseParser.ComparisonOperatorContext(self, self._ctx, self.state) + self.enterRule(localctx, 198, self.RULE_comparisonOperator) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2673 + _la = self._input.LA(1) + if not(((((_la - 264)) & ~0x3f) == 0 and ((1 << (_la - 264)) & ((1 << (SqlBaseParser.EQ - 264)) | (1 << (SqlBaseParser.NSEQ - 264)) | (1 << (SqlBaseParser.NEQ - 264)) | (1 << (SqlBaseParser.NEQJ - 264)) | (1 << (SqlBaseParser.LT - 264)) | (1 << (SqlBaseParser.LTE - 264)) | (1 << (SqlBaseParser.GT - 264)) | (1 << (SqlBaseParser.GTE - 264)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ArithmeticOperatorContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def PLUS(self): + return self.getToken(SqlBaseParser.PLUS, 0) + + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def ASTERISK(self): + return self.getToken(SqlBaseParser.ASTERISK, 0) + + def SLASH(self): + return self.getToken(SqlBaseParser.SLASH, 0) + + def PERCENT(self): + return self.getToken(SqlBaseParser.PERCENT, 0) + + def DIV(self): + return self.getToken(SqlBaseParser.DIV, 0) + + def TILDE(self): + return self.getToken(SqlBaseParser.TILDE, 0) + + def AMPERSAND(self): + return self.getToken(SqlBaseParser.AMPERSAND, 0) + + def PIPE(self): + return self.getToken(SqlBaseParser.PIPE, 0) + + def CONCAT_PIPE(self): + return self.getToken(SqlBaseParser.CONCAT_PIPE, 0) + + def HAT(self): + return self.getToken(SqlBaseParser.HAT, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_arithmeticOperator + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterArithmeticOperator" ): + listener.enterArithmeticOperator(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitArithmeticOperator" ): + listener.exitArithmeticOperator(self) + + + + + def arithmeticOperator(self): + + localctx = SqlBaseParser.ArithmeticOperatorContext(self, self._ctx, self.state) + self.enterRule(localctx, 200, self.RULE_arithmeticOperator) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2675 + _la = self._input.LA(1) + if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.ASTERISK - 272)) | (1 << (SqlBaseParser.SLASH - 272)) | (1 << (SqlBaseParser.PERCENT - 272)) | (1 << (SqlBaseParser.DIV - 272)) | (1 << (SqlBaseParser.TILDE - 272)) | (1 << (SqlBaseParser.AMPERSAND - 272)) | (1 << (SqlBaseParser.PIPE - 272)) | (1 << (SqlBaseParser.CONCAT_PIPE - 272)) | (1 << (SqlBaseParser.HAT - 272)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class PredicateOperatorContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_predicateOperator + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPredicateOperator" ): + listener.enterPredicateOperator(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPredicateOperator" ): + listener.exitPredicateOperator(self) + + + + + def predicateOperator(self): + + localctx = SqlBaseParser.PredicateOperatorContext(self, self._ctx, self.state) + self.enterRule(localctx, 202, self.RULE_predicateOperator) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2677 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.AND or ((((_la - 113)) & ~0x3f) == 0 and ((1 << (_la - 113)) & ((1 << (SqlBaseParser.IN - 113)) | (1 << (SqlBaseParser.NOT - 113)) | (1 << (SqlBaseParser.OR - 113)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class BooleanValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def TRUE(self): + return self.getToken(SqlBaseParser.TRUE, 0) + + def FALSE(self): + return self.getToken(SqlBaseParser.FALSE, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_booleanValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBooleanValue" ): + listener.enterBooleanValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBooleanValue" ): + listener.exitBooleanValue(self) + + + + + def booleanValue(self): + + localctx = SqlBaseParser.BooleanValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 204, self.RULE_booleanValue) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2679 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FALSE or _la==SqlBaseParser.TRUE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IntervalContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def INTERVAL(self): + return self.getToken(SqlBaseParser.INTERVAL, 0) + + def errorCapturingMultiUnitsInterval(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext,0) + + + def errorCapturingUnitToUnitInterval(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_interval + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInterval" ): + listener.enterInterval(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInterval" ): + listener.exitInterval(self) + + + + + def interval(self): + + localctx = SqlBaseParser.IntervalContext(self, self._ctx, self.state) + self.enterRule(localctx, 206, self.RULE_interval) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2681 + self.match(SqlBaseParser.INTERVAL) + self.state = 2684 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,342,self._ctx) + if la_ == 1: + self.state = 2682 + self.errorCapturingMultiUnitsInterval() + + elif la_ == 2: + self.state = 2683 + self.errorCapturingUnitToUnitInterval() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ErrorCapturingMultiUnitsIntervalContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def multiUnitsInterval(self): + return self.getTypedRuleContext(SqlBaseParser.MultiUnitsIntervalContext,0) + + + def unitToUnitInterval(self): + return self.getTypedRuleContext(SqlBaseParser.UnitToUnitIntervalContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_errorCapturingMultiUnitsInterval + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterErrorCapturingMultiUnitsInterval" ): + listener.enterErrorCapturingMultiUnitsInterval(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitErrorCapturingMultiUnitsInterval" ): + listener.exitErrorCapturingMultiUnitsInterval(self) + + + + + def errorCapturingMultiUnitsInterval(self): + + localctx = SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext(self, self._ctx, self.state) + self.enterRule(localctx, 208, self.RULE_errorCapturingMultiUnitsInterval) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2686 + self.multiUnitsInterval() + self.state = 2688 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,343,self._ctx) + if la_ == 1: + self.state = 2687 + self.unitToUnitInterval() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MultiUnitsIntervalContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def intervalValue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IntervalValueContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IntervalValueContext,i) + + + def intervalUnit(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IntervalUnitContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IntervalUnitContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_multiUnitsInterval + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMultiUnitsInterval" ): + listener.enterMultiUnitsInterval(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMultiUnitsInterval" ): + listener.exitMultiUnitsInterval(self) + + + + + def multiUnitsInterval(self): + + localctx = SqlBaseParser.MultiUnitsIntervalContext(self, self._ctx, self.state) + self.enterRule(localctx, 210, self.RULE_multiUnitsInterval) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2693 + self._errHandler.sync(self) + _alt = 1 + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt == 1: + self.state = 2690 + self.intervalValue() + self.state = 2691 + self.intervalUnit() + + else: + raise NoViableAltException(self) + self.state = 2695 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,344,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ErrorCapturingUnitToUnitIntervalContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.body = None # UnitToUnitIntervalContext + self.error1 = None # MultiUnitsIntervalContext + self.error2 = None # UnitToUnitIntervalContext + + def unitToUnitInterval(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.UnitToUnitIntervalContext) + else: + return self.getTypedRuleContext(SqlBaseParser.UnitToUnitIntervalContext,i) + + + def multiUnitsInterval(self): + return self.getTypedRuleContext(SqlBaseParser.MultiUnitsIntervalContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_errorCapturingUnitToUnitInterval + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterErrorCapturingUnitToUnitInterval" ): + listener.enterErrorCapturingUnitToUnitInterval(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitErrorCapturingUnitToUnitInterval" ): + listener.exitErrorCapturingUnitToUnitInterval(self) + + + + + def errorCapturingUnitToUnitInterval(self): + + localctx = SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext(self, self._ctx, self.state) + self.enterRule(localctx, 212, self.RULE_errorCapturingUnitToUnitInterval) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2697 + localctx.body = self.unitToUnitInterval() + self.state = 2700 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,345,self._ctx) + if la_ == 1: + self.state = 2698 + localctx.error1 = self.multiUnitsInterval() + + elif la_ == 2: + self.state = 2699 + localctx.error2 = self.unitToUnitInterval() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class UnitToUnitIntervalContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.value = None # IntervalValueContext + self.from_ = None # IntervalUnitContext + self.to = None # IntervalUnitContext + + def TO(self): + return self.getToken(SqlBaseParser.TO, 0) + + def intervalValue(self): + return self.getTypedRuleContext(SqlBaseParser.IntervalValueContext,0) + + + def intervalUnit(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IntervalUnitContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IntervalUnitContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_unitToUnitInterval + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnitToUnitInterval" ): + listener.enterUnitToUnitInterval(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnitToUnitInterval" ): + listener.exitUnitToUnitInterval(self) + + + + + def unitToUnitInterval(self): + + localctx = SqlBaseParser.UnitToUnitIntervalContext(self, self._ctx, self.state) + self.enterRule(localctx, 214, self.RULE_unitToUnitInterval) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2702 + localctx.value = self.intervalValue() + self.state = 2703 + localctx.from_ = self.intervalUnit() + self.state = 2704 + self.match(SqlBaseParser.TO) + self.state = 2705 + localctx.to = self.intervalUnit() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IntervalValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def INTEGER_VALUE(self): + return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) + + def DECIMAL_VALUE(self): + return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) + + def PLUS(self): + return self.getToken(SqlBaseParser.PLUS, 0) + + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def STRING(self): + return self.getToken(SqlBaseParser.STRING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_intervalValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIntervalValue" ): + listener.enterIntervalValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIntervalValue" ): + listener.exitIntervalValue(self) + + + + + def intervalValue(self): + + localctx = SqlBaseParser.IntervalValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 216, self.RULE_intervalValue) + self._la = 0 # Token type + try: + self.state = 2712 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.PLUS, SqlBaseParser.MINUS, SqlBaseParser.INTEGER_VALUE, SqlBaseParser.DECIMAL_VALUE]: + self.enterOuterAlt(localctx, 1) + self.state = 2708 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.PLUS or _la==SqlBaseParser.MINUS: + self.state = 2707 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.PLUS or _la==SqlBaseParser.MINUS): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 2710 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.INTEGER_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + elif token in [SqlBaseParser.STRING]: + self.enterOuterAlt(localctx, 2) + self.state = 2711 + self.match(SqlBaseParser.STRING) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IntervalUnitContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def DAY(self): + return self.getToken(SqlBaseParser.DAY, 0) + + def HOUR(self): + return self.getToken(SqlBaseParser.HOUR, 0) + + def MINUTE(self): + return self.getToken(SqlBaseParser.MINUTE, 0) + + def MONTH(self): + return self.getToken(SqlBaseParser.MONTH, 0) + + def SECOND(self): + return self.getToken(SqlBaseParser.SECOND, 0) + + def YEAR(self): + return self.getToken(SqlBaseParser.YEAR, 0) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_intervalUnit + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIntervalUnit" ): + listener.enterIntervalUnit(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIntervalUnit" ): + listener.exitIntervalUnit(self) + + + + + def intervalUnit(self): + + localctx = SqlBaseParser.IntervalUnitContext(self, self._ctx, self.state) + self.enterRule(localctx, 218, self.RULE_intervalUnit) + try: + self.state = 2721 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,348,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2714 + self.match(SqlBaseParser.DAY) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2715 + self.match(SqlBaseParser.HOUR) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2716 + self.match(SqlBaseParser.MINUTE) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 2717 + self.match(SqlBaseParser.MONTH) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 2718 + self.match(SqlBaseParser.SECOND) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 2719 + self.match(SqlBaseParser.YEAR) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 2720 + self.identifier() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ColPositionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.position = None # Token + self.afterCol = None # ErrorCapturingIdentifierContext + + def FIRST(self): + return self.getToken(SqlBaseParser.FIRST, 0) + + def AFTER(self): + return self.getToken(SqlBaseParser.AFTER, 0) + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_colPosition + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterColPosition" ): + listener.enterColPosition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitColPosition" ): + listener.exitColPosition(self) + + + + + def colPosition(self): + + localctx = SqlBaseParser.ColPositionContext(self, self._ctx, self.state) + self.enterRule(localctx, 220, self.RULE_colPosition) + try: + self.state = 2726 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.FIRST]: + self.enterOuterAlt(localctx, 1) + self.state = 2723 + localctx.position = self.match(SqlBaseParser.FIRST) + pass + elif token in [SqlBaseParser.AFTER]: + self.enterOuterAlt(localctx, 2) + self.state = 2724 + localctx.position = self.match(SqlBaseParser.AFTER) + self.state = 2725 + localctx.afterCol = self.errorCapturingIdentifier() + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class DataTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_dataType + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class ComplexDataTypeContext(DataTypeContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DataTypeContext + super().__init__(parser) + self.complex = None # Token + self.copyFrom(ctx) + + def dataType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.DataTypeContext) + else: + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,i) + + def ARRAY(self): + return self.getToken(SqlBaseParser.ARRAY, 0) + def MAP(self): + return self.getToken(SqlBaseParser.MAP, 0) + def STRUCT(self): + return self.getToken(SqlBaseParser.STRUCT, 0) + def NEQ(self): + return self.getToken(SqlBaseParser.NEQ, 0) + def complexColTypeList(self): + return self.getTypedRuleContext(SqlBaseParser.ComplexColTypeListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterComplexDataType" ): + listener.enterComplexDataType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitComplexDataType" ): + listener.exitComplexDataType(self) + + + class PrimitiveDataTypeContext(DataTypeContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DataTypeContext + super().__init__(parser) + self.copyFrom(ctx) + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + def INTEGER_VALUE(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.INTEGER_VALUE) + else: + return self.getToken(SqlBaseParser.INTEGER_VALUE, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrimitiveDataType" ): + listener.enterPrimitiveDataType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrimitiveDataType" ): + listener.exitPrimitiveDataType(self) + + + + def dataType(self): + + localctx = SqlBaseParser.DataTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 222, self.RULE_dataType) + self._la = 0 # Token type + try: + self.state = 2762 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,354,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2728 + localctx.complex = self.match(SqlBaseParser.ARRAY) + self.state = 2729 + self.match(SqlBaseParser.LT) + self.state = 2730 + self.dataType() + self.state = 2731 + self.match(SqlBaseParser.GT) + pass + + elif la_ == 2: + localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2733 + localctx.complex = self.match(SqlBaseParser.MAP) + self.state = 2734 + self.match(SqlBaseParser.LT) + self.state = 2735 + self.dataType() + self.state = 2736 + self.match(SqlBaseParser.T__3) + self.state = 2737 + self.dataType() + self.state = 2738 + self.match(SqlBaseParser.GT) + pass + + elif la_ == 3: + localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2740 + localctx.complex = self.match(SqlBaseParser.STRUCT) + self.state = 2747 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.LT]: + self.state = 2741 + self.match(SqlBaseParser.LT) + self.state = 2743 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,350,self._ctx) + if la_ == 1: + self.state = 2742 + self.complexColTypeList() + + + self.state = 2745 + self.match(SqlBaseParser.GT) + pass + elif token in [SqlBaseParser.NEQ]: + self.state = 2746 + self.match(SqlBaseParser.NEQ) + pass + else: + raise NoViableAltException(self) + + pass + + elif la_ == 4: + localctx = SqlBaseParser.PrimitiveDataTypeContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2749 + self.identifier() + self.state = 2760 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,353,self._ctx) + if la_ == 1: + self.state = 2750 + self.match(SqlBaseParser.T__1) + self.state = 2751 + self.match(SqlBaseParser.INTEGER_VALUE) + self.state = 2756 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2752 + self.match(SqlBaseParser.T__3) + self.state = 2753 + self.match(SqlBaseParser.INTEGER_VALUE) + self.state = 2758 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 2759 + self.match(SqlBaseParser.T__2) + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QualifiedColTypeWithPositionListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def qualifiedColTypeWithPosition(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.QualifiedColTypeWithPositionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_qualifiedColTypeWithPositionList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQualifiedColTypeWithPositionList" ): + listener.enterQualifiedColTypeWithPositionList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQualifiedColTypeWithPositionList" ): + listener.exitQualifiedColTypeWithPositionList(self) + + + + + def qualifiedColTypeWithPositionList(self): + + localctx = SqlBaseParser.QualifiedColTypeWithPositionListContext(self, self._ctx, self.state) + self.enterRule(localctx, 224, self.RULE_qualifiedColTypeWithPositionList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2764 + self.qualifiedColTypeWithPosition() + self.state = 2769 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2765 + self.match(SqlBaseParser.T__3) + self.state = 2766 + self.qualifiedColTypeWithPosition() + self.state = 2771 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QualifiedColTypeWithPositionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # MultipartIdentifierContext + + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def multipartIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def commentSpec(self): + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) + + + def colPosition(self): + return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_qualifiedColTypeWithPosition + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQualifiedColTypeWithPosition" ): + listener.enterQualifiedColTypeWithPosition(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQualifiedColTypeWithPosition" ): + listener.exitQualifiedColTypeWithPosition(self) + + + + + def qualifiedColTypeWithPosition(self): + + localctx = SqlBaseParser.QualifiedColTypeWithPositionContext(self, self._ctx, self.state) + self.enterRule(localctx, 226, self.RULE_qualifiedColTypeWithPosition) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2772 + localctx.name = self.multipartIdentifier() + self.state = 2773 + self.dataType() + self.state = 2776 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2774 + self.match(SqlBaseParser.NOT) + self.state = 2775 + self.match(SqlBaseParser.NULL) + + + self.state = 2779 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.COMMENT: + self.state = 2778 + self.commentSpec() + + + self.state = 2782 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.FIRST: + self.state = 2781 + self.colPosition() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ColTypeListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def colType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ColTypeContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ColTypeContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_colTypeList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterColTypeList" ): + listener.enterColTypeList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitColTypeList" ): + listener.exitColTypeList(self) + + + + + def colTypeList(self): + + localctx = SqlBaseParser.ColTypeListContext(self, self._ctx, self.state) + self.enterRule(localctx, 228, self.RULE_colTypeList) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2784 + self.colType() + self.state = 2789 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,359,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2785 + self.match(SqlBaseParser.T__3) + self.state = 2786 + self.colType() + self.state = 2791 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,359,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ColTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.colName = None # ErrorCapturingIdentifierContext + + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def commentSpec(self): + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_colType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterColType" ): + listener.enterColType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitColType" ): + listener.exitColType(self) + + + + + def colType(self): + + localctx = SqlBaseParser.ColTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 230, self.RULE_colType) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2792 + localctx.colName = self.errorCapturingIdentifier() + self.state = 2793 + self.dataType() + self.state = 2796 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,360,self._ctx) + if la_ == 1: + self.state = 2794 + self.match(SqlBaseParser.NOT) + self.state = 2795 + self.match(SqlBaseParser.NULL) + + + self.state = 2799 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,361,self._ctx) + if la_ == 1: + self.state = 2798 + self.commentSpec() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ComplexColTypeListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def complexColType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ComplexColTypeContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ComplexColTypeContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_complexColTypeList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterComplexColTypeList" ): + listener.enterComplexColTypeList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitComplexColTypeList" ): + listener.exitComplexColTypeList(self) + + + + + def complexColTypeList(self): + + localctx = SqlBaseParser.ComplexColTypeListContext(self, self._ctx, self.state) + self.enterRule(localctx, 232, self.RULE_complexColTypeList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2801 + self.complexColType() + self.state = 2806 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2802 + self.match(SqlBaseParser.T__3) + self.state = 2803 + self.complexColType() + self.state = 2808 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ComplexColTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def commentSpec(self): + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_complexColType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterComplexColType" ): + listener.enterComplexColType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitComplexColType" ): + listener.exitComplexColType(self) + + + + + def complexColType(self): + + localctx = SqlBaseParser.ComplexColTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 234, self.RULE_complexColType) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2809 + self.identifier() + self.state = 2810 + self.match(SqlBaseParser.T__10) + self.state = 2811 + self.dataType() + self.state = 2814 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.NOT: + self.state = 2812 + self.match(SqlBaseParser.NOT) + self.state = 2813 + self.match(SqlBaseParser.NULL) + + + self.state = 2817 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.COMMENT: + self.state = 2816 + self.commentSpec() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class WhenClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.condition = None # ExpressionContext + self.result = None # ExpressionContext + + def WHEN(self): + return self.getToken(SqlBaseParser.WHEN, 0) + + def THEN(self): + return self.getToken(SqlBaseParser.THEN, 0) + + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_whenClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWhenClause" ): + listener.enterWhenClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWhenClause" ): + listener.exitWhenClause(self) + + + + + def whenClause(self): + + localctx = SqlBaseParser.WhenClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 236, self.RULE_whenClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2819 + self.match(SqlBaseParser.WHEN) + self.state = 2820 + localctx.condition = self.expression() + self.state = 2821 + self.match(SqlBaseParser.THEN) + self.state = 2822 + localctx.result = self.expression() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class WindowClauseContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def WINDOW(self): + return self.getToken(SqlBaseParser.WINDOW, 0) + + def namedWindow(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.NamedWindowContext) + else: + return self.getTypedRuleContext(SqlBaseParser.NamedWindowContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_windowClause + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWindowClause" ): + listener.enterWindowClause(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWindowClause" ): + listener.exitWindowClause(self) + + + + + def windowClause(self): + + localctx = SqlBaseParser.WindowClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 238, self.RULE_windowClause) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2824 + self.match(SqlBaseParser.WINDOW) + self.state = 2825 + self.namedWindow() + self.state = 2830 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,365,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2826 + self.match(SqlBaseParser.T__3) + self.state = 2827 + self.namedWindow() + self.state = 2832 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,365,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NamedWindowContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # ErrorCapturingIdentifierContext + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def windowSpec(self): + return self.getTypedRuleContext(SqlBaseParser.WindowSpecContext,0) + + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_namedWindow + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedWindow" ): + listener.enterNamedWindow(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedWindow" ): + listener.exitNamedWindow(self) + + + + + def namedWindow(self): + + localctx = SqlBaseParser.NamedWindowContext(self, self._ctx, self.state) + self.enterRule(localctx, 240, self.RULE_namedWindow) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2833 + localctx.name = self.errorCapturingIdentifier() + self.state = 2834 + self.match(SqlBaseParser.AS) + self.state = 2835 + self.windowSpec() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class WindowSpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_windowSpec + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class WindowRefContext(WindowSpecContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.WindowSpecContext + super().__init__(parser) + self.name = None # ErrorCapturingIdentifierContext + self.copyFrom(ctx) + + def errorCapturingIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWindowRef" ): + listener.enterWindowRef(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWindowRef" ): + listener.exitWindowRef(self) + + + class WindowDefContext(WindowSpecContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.WindowSpecContext + super().__init__(parser) + self._expression = None # ExpressionContext + self.partition = list() # of ExpressionContexts + self.copyFrom(ctx) + + def CLUSTER(self): + return self.getToken(SqlBaseParser.CLUSTER, 0) + def BY(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.BY) + else: + return self.getToken(SqlBaseParser.BY, i) + def expression(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) + else: + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) + + def windowFrame(self): + return self.getTypedRuleContext(SqlBaseParser.WindowFrameContext,0) + + def sortItem(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.SortItemContext) + else: + return self.getTypedRuleContext(SqlBaseParser.SortItemContext,i) + + def PARTITION(self): + return self.getToken(SqlBaseParser.PARTITION, 0) + def DISTRIBUTE(self): + return self.getToken(SqlBaseParser.DISTRIBUTE, 0) + def ORDER(self): + return self.getToken(SqlBaseParser.ORDER, 0) + def SORT(self): + return self.getToken(SqlBaseParser.SORT, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWindowDef" ): + listener.enterWindowDef(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWindowDef" ): + listener.exitWindowDef(self) + + + + def windowSpec(self): + + localctx = SqlBaseParser.WindowSpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 242, self.RULE_windowSpec) + self._la = 0 # Token type + try: + self.state = 2883 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,373,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.WindowRefContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2837 + localctx.name = self.errorCapturingIdentifier() + pass + + elif la_ == 2: + localctx = SqlBaseParser.WindowRefContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2838 + self.match(SqlBaseParser.T__1) + self.state = 2839 + localctx.name = self.errorCapturingIdentifier() + self.state = 2840 + self.match(SqlBaseParser.T__2) + pass + + elif la_ == 3: + localctx = SqlBaseParser.WindowDefContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2842 + self.match(SqlBaseParser.T__1) + self.state = 2877 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.CLUSTER]: + self.state = 2843 + self.match(SqlBaseParser.CLUSTER) + self.state = 2844 + self.match(SqlBaseParser.BY) + self.state = 2845 + localctx._expression = self.expression() + localctx.partition.append(localctx._expression) + self.state = 2850 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2846 + self.match(SqlBaseParser.T__3) + self.state = 2847 + localctx._expression = self.expression() + localctx.partition.append(localctx._expression) + self.state = 2852 + self._errHandler.sync(self) + _la = self._input.LA(1) + + pass + elif token in [SqlBaseParser.T__2, SqlBaseParser.DISTRIBUTE, SqlBaseParser.ORDER, SqlBaseParser.PARTITION, SqlBaseParser.RANGE, SqlBaseParser.ROWS, SqlBaseParser.SORT]: + self.state = 2863 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.DISTRIBUTE or _la==SqlBaseParser.PARTITION: + self.state = 2853 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DISTRIBUTE or _la==SqlBaseParser.PARTITION): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2854 + self.match(SqlBaseParser.BY) + self.state = 2855 + localctx._expression = self.expression() + localctx.partition.append(localctx._expression) + self.state = 2860 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2856 + self.match(SqlBaseParser.T__3) + self.state = 2857 + localctx._expression = self.expression() + localctx.partition.append(localctx._expression) + self.state = 2862 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 2875 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.ORDER or _la==SqlBaseParser.SORT: + self.state = 2865 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.ORDER or _la==SqlBaseParser.SORT): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 2866 + self.match(SqlBaseParser.BY) + self.state = 2867 + self.sortItem() + self.state = 2872 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2868 + self.match(SqlBaseParser.T__3) + self.state = 2869 + self.sortItem() + self.state = 2874 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + pass + else: + raise NoViableAltException(self) + + self.state = 2880 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.RANGE or _la==SqlBaseParser.ROWS: + self.state = 2879 + self.windowFrame() + + + self.state = 2882 + self.match(SqlBaseParser.T__2) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class WindowFrameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.frameType = None # Token + self.start = None # FrameBoundContext + self.end = None # FrameBoundContext + + def RANGE(self): + return self.getToken(SqlBaseParser.RANGE, 0) + + def frameBound(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.FrameBoundContext) + else: + return self.getTypedRuleContext(SqlBaseParser.FrameBoundContext,i) + + + def ROWS(self): + return self.getToken(SqlBaseParser.ROWS, 0) + + def BETWEEN(self): + return self.getToken(SqlBaseParser.BETWEEN, 0) + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_windowFrame + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterWindowFrame" ): + listener.enterWindowFrame(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitWindowFrame" ): + listener.exitWindowFrame(self) + + + + + def windowFrame(self): + + localctx = SqlBaseParser.WindowFrameContext(self, self._ctx, self.state) + self.enterRule(localctx, 244, self.RULE_windowFrame) + try: + self.state = 2901 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,374,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2885 + localctx.frameType = self.match(SqlBaseParser.RANGE) + self.state = 2886 + localctx.start = self.frameBound() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2887 + localctx.frameType = self.match(SqlBaseParser.ROWS) + self.state = 2888 + localctx.start = self.frameBound() + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2889 + localctx.frameType = self.match(SqlBaseParser.RANGE) + self.state = 2890 + self.match(SqlBaseParser.BETWEEN) + self.state = 2891 + localctx.start = self.frameBound() + self.state = 2892 + self.match(SqlBaseParser.AND) + self.state = 2893 + localctx.end = self.frameBound() + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 2895 + localctx.frameType = self.match(SqlBaseParser.ROWS) + self.state = 2896 + self.match(SqlBaseParser.BETWEEN) + self.state = 2897 + localctx.start = self.frameBound() + self.state = 2898 + self.match(SqlBaseParser.AND) + self.state = 2899 + localctx.end = self.frameBound() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FrameBoundContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.boundType = None # Token + + def UNBOUNDED(self): + return self.getToken(SqlBaseParser.UNBOUNDED, 0) + + def PRECEDING(self): + return self.getToken(SqlBaseParser.PRECEDING, 0) + + def FOLLOWING(self): + return self.getToken(SqlBaseParser.FOLLOWING, 0) + + def ROW(self): + return self.getToken(SqlBaseParser.ROW, 0) + + def CURRENT(self): + return self.getToken(SqlBaseParser.CURRENT, 0) + + def expression(self): + return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_frameBound + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFrameBound" ): + listener.enterFrameBound(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFrameBound" ): + listener.exitFrameBound(self) + + + + + def frameBound(self): + + localctx = SqlBaseParser.FrameBoundContext(self, self._ctx, self.state) + self.enterRule(localctx, 246, self.RULE_frameBound) + self._la = 0 # Token type + try: + self.state = 2910 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,375,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2903 + self.match(SqlBaseParser.UNBOUNDED) + self.state = 2904 + localctx.boundType = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FOLLOWING or _la==SqlBaseParser.PRECEDING): + localctx.boundType = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2905 + localctx.boundType = self.match(SqlBaseParser.CURRENT) + self.state = 2906 + self.match(SqlBaseParser.ROW) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2907 + self.expression() + self.state = 2908 + localctx.boundType = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.FOLLOWING or _la==SqlBaseParser.PRECEDING): + localctx.boundType = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QualifiedNameListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def qualifiedName(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.QualifiedNameContext) + else: + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_qualifiedNameList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQualifiedNameList" ): + listener.enterQualifiedNameList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQualifiedNameList" ): + listener.exitQualifiedNameList(self) + + + + + def qualifiedNameList(self): + + localctx = SqlBaseParser.QualifiedNameListContext(self, self._ctx, self.state) + self.enterRule(localctx, 248, self.RULE_qualifiedNameList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 2912 + self.qualifiedName() + self.state = 2917 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==SqlBaseParser.T__3: + self.state = 2913 + self.match(SqlBaseParser.T__3) + self.state = 2914 + self.qualifiedName() + self.state = 2919 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class FunctionNameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def qualifiedName(self): + return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) + + + def FILTER(self): + return self.getToken(SqlBaseParser.FILTER, 0) + + def LEFT(self): + return self.getToken(SqlBaseParser.LEFT, 0) + + def RIGHT(self): + return self.getToken(SqlBaseParser.RIGHT, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_functionName + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionName" ): + listener.enterFunctionName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionName" ): + listener.exitFunctionName(self) + + + + + def functionName(self): + + localctx = SqlBaseParser.FunctionNameContext(self, self._ctx, self.state) + self.enterRule(localctx, 250, self.RULE_functionName) + try: + self.state = 2924 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,377,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2920 + self.qualifiedName() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2921 + self.match(SqlBaseParser.FILTER) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 2922 + self.match(SqlBaseParser.LEFT) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 2923 + self.match(SqlBaseParser.RIGHT) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QualifiedNameContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_qualifiedName + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQualifiedName" ): + listener.enterQualifiedName(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQualifiedName" ): + listener.exitQualifiedName(self) + + + + + def qualifiedName(self): + + localctx = SqlBaseParser.QualifiedNameContext(self, self._ctx, self.state) + self.enterRule(localctx, 252, self.RULE_qualifiedName) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2926 + self.identifier() + self.state = 2931 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,378,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 2927 + self.match(SqlBaseParser.T__4) + self.state = 2928 + self.identifier() + self.state = 2933 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,378,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ErrorCapturingIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def identifier(self): + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) + + + def errorCapturingIdentifierExtra(self): + return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierExtraContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_errorCapturingIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterErrorCapturingIdentifier" ): + listener.enterErrorCapturingIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitErrorCapturingIdentifier" ): + listener.exitErrorCapturingIdentifier(self) + + + + + def errorCapturingIdentifier(self): + + localctx = SqlBaseParser.ErrorCapturingIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 254, self.RULE_errorCapturingIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2934 + self.identifier() + self.state = 2935 + self.errorCapturingIdentifierExtra() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ErrorCapturingIdentifierExtraContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_errorCapturingIdentifierExtra + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class ErrorIdentContext(ErrorCapturingIdentifierExtraContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ErrorCapturingIdentifierExtraContext + super().__init__(parser) + self.copyFrom(ctx) + + def MINUS(self, i:int=None): + if i is None: + return self.getTokens(SqlBaseParser.MINUS) + else: + return self.getToken(SqlBaseParser.MINUS, i) + def identifier(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) + else: + return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterErrorIdent" ): + listener.enterErrorIdent(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitErrorIdent" ): + listener.exitErrorIdent(self) + + + class RealIdentContext(ErrorCapturingIdentifierExtraContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ErrorCapturingIdentifierExtraContext + super().__init__(parser) + self.copyFrom(ctx) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRealIdent" ): + listener.enterRealIdent(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRealIdent" ): + listener.exitRealIdent(self) + + + + def errorCapturingIdentifierExtra(self): + + localctx = SqlBaseParser.ErrorCapturingIdentifierExtraContext(self, self._ctx, self.state) + self.enterRule(localctx, 256, self.RULE_errorCapturingIdentifierExtra) + try: + self.state = 2944 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,380,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.ErrorIdentContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2939 + self._errHandler.sync(self) + _alt = 1 + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt == 1: + self.state = 2937 + self.match(SqlBaseParser.MINUS) + self.state = 2938 + self.identifier() + + else: + raise NoViableAltException(self) + self.state = 2941 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,379,self._ctx) + + pass + + elif la_ == 2: + localctx = SqlBaseParser.RealIdentContext(self, localctx) + self.enterOuterAlt(localctx, 2) + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def strictIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.StrictIdentifierContext,0) + + + def strictNonReserved(self): + return self.getTypedRuleContext(SqlBaseParser.StrictNonReservedContext,0) + + + def getRuleIndex(self): + return SqlBaseParser.RULE_identifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdentifier" ): + listener.enterIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdentifier" ): + listener.exitIdentifier(self) + + + + + def identifier(self): + + localctx = SqlBaseParser.IdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 258, self.RULE_identifier) + try: + self.state = 2949 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,381,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 2946 + self.strictIdentifier() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 2947 + if not not self.SQL_standard_keyword_behavior: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.SQL_standard_keyword_behavior") + self.state = 2948 + self.strictNonReserved() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class StrictIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_strictIdentifier + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class QuotedIdentifierAlternativeContext(StrictIdentifierContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StrictIdentifierContext + super().__init__(parser) + self.copyFrom(ctx) + + def quotedIdentifier(self): + return self.getTypedRuleContext(SqlBaseParser.QuotedIdentifierContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQuotedIdentifierAlternative" ): + listener.enterQuotedIdentifierAlternative(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQuotedIdentifierAlternative" ): + listener.exitQuotedIdentifierAlternative(self) + + + class UnquotedIdentifierContext(StrictIdentifierContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StrictIdentifierContext + super().__init__(parser) + self.copyFrom(ctx) + + def IDENTIFIER(self): + return self.getToken(SqlBaseParser.IDENTIFIER, 0) + def ansiNonReserved(self): + return self.getTypedRuleContext(SqlBaseParser.AnsiNonReservedContext,0) + + def nonReserved(self): + return self.getTypedRuleContext(SqlBaseParser.NonReservedContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnquotedIdentifier" ): + listener.enterUnquotedIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnquotedIdentifier" ): + listener.exitUnquotedIdentifier(self) + + + + def strictIdentifier(self): + + localctx = SqlBaseParser.StrictIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 260, self.RULE_strictIdentifier) + try: + self.state = 2957 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,382,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2951 + self.match(SqlBaseParser.IDENTIFIER) + pass + + elif la_ == 2: + localctx = SqlBaseParser.QuotedIdentifierAlternativeContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2952 + self.quotedIdentifier() + pass + + elif la_ == 3: + localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2953 + if not self.SQL_standard_keyword_behavior: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.SQL_standard_keyword_behavior") + self.state = 2954 + self.ansiNonReserved() + pass + + elif la_ == 4: + localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2955 + if not not self.SQL_standard_keyword_behavior: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.SQL_standard_keyword_behavior") + self.state = 2956 + self.nonReserved() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class QuotedIdentifierContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def BACKQUOTED_IDENTIFIER(self): + return self.getToken(SqlBaseParser.BACKQUOTED_IDENTIFIER, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_quotedIdentifier + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQuotedIdentifier" ): + listener.enterQuotedIdentifier(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQuotedIdentifier" ): + listener.exitQuotedIdentifier(self) + + + + + def quotedIdentifier(self): + + localctx = SqlBaseParser.QuotedIdentifierContext(self, self._ctx, self.state) + self.enterRule(localctx, 262, self.RULE_quotedIdentifier) + try: + self.enterOuterAlt(localctx, 1) + self.state = 2959 + self.match(SqlBaseParser.BACKQUOTED_IDENTIFIER) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NumberContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return SqlBaseParser.RULE_number + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class DecimalLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def DECIMAL_VALUE(self): + return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDecimalLiteral" ): + listener.enterDecimalLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDecimalLiteral" ): + listener.exitDecimalLiteral(self) + + + class BigIntLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def BIGINT_LITERAL(self): + return self.getToken(SqlBaseParser.BIGINT_LITERAL, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBigIntLiteral" ): + listener.enterBigIntLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBigIntLiteral" ): + listener.exitBigIntLiteral(self) + + + class TinyIntLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def TINYINT_LITERAL(self): + return self.getToken(SqlBaseParser.TINYINT_LITERAL, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTinyIntLiteral" ): + listener.enterTinyIntLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTinyIntLiteral" ): + listener.exitTinyIntLiteral(self) + + + class LegacyDecimalLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def EXPONENT_VALUE(self): + return self.getToken(SqlBaseParser.EXPONENT_VALUE, 0) + def DECIMAL_VALUE(self): + return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLegacyDecimalLiteral" ): + listener.enterLegacyDecimalLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLegacyDecimalLiteral" ): + listener.exitLegacyDecimalLiteral(self) + + + class BigDecimalLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def BIGDECIMAL_LITERAL(self): + return self.getToken(SqlBaseParser.BIGDECIMAL_LITERAL, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBigDecimalLiteral" ): + listener.enterBigDecimalLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBigDecimalLiteral" ): + listener.exitBigDecimalLiteral(self) + + + class ExponentLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def EXPONENT_VALUE(self): + return self.getToken(SqlBaseParser.EXPONENT_VALUE, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExponentLiteral" ): + listener.enterExponentLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExponentLiteral" ): + listener.exitExponentLiteral(self) + + + class DoubleLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def DOUBLE_LITERAL(self): + return self.getToken(SqlBaseParser.DOUBLE_LITERAL, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDoubleLiteral" ): + listener.enterDoubleLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDoubleLiteral" ): + listener.exitDoubleLiteral(self) + + + class IntegerLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def INTEGER_VALUE(self): + return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIntegerLiteral" ): + listener.enterIntegerLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIntegerLiteral" ): + listener.exitIntegerLiteral(self) + + + class SmallIntLiteralContext(NumberContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext + super().__init__(parser) + self.copyFrom(ctx) + + def SMALLINT_LITERAL(self): + return self.getToken(SqlBaseParser.SMALLINT_LITERAL, 0) + def MINUS(self): + return self.getToken(SqlBaseParser.MINUS, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSmallIntLiteral" ): + listener.enterSmallIntLiteral(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSmallIntLiteral" ): + listener.exitSmallIntLiteral(self) + + + + def number(self): + + localctx = SqlBaseParser.NumberContext(self, self._ctx, self.state) + self.enterRule(localctx, 264, self.RULE_number) + self._la = 0 # Token type + try: + self.state = 3000 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,392,self._ctx) + if la_ == 1: + localctx = SqlBaseParser.ExponentLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 2961 + if not not self.legacy_exponent_literal_as_decimal_enabled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.legacy_exponent_literal_as_decimal_enabled") + self.state = 2963 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2962 + self.match(SqlBaseParser.MINUS) + + + self.state = 2965 + self.match(SqlBaseParser.EXPONENT_VALUE) + pass + + elif la_ == 2: + localctx = SqlBaseParser.DecimalLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 2) + self.state = 2966 + if not not self.legacy_exponent_literal_as_decimal_enabled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "not self.legacy_exponent_literal_as_decimal_enabled") + self.state = 2968 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2967 + self.match(SqlBaseParser.MINUS) + + + self.state = 2970 + self.match(SqlBaseParser.DECIMAL_VALUE) + pass + + elif la_ == 3: + localctx = SqlBaseParser.LegacyDecimalLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 2971 + if not self.legacy_exponent_literal_as_decimal_enabled: + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.legacy_exponent_literal_as_decimal_enabled") + self.state = 2973 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2972 + self.match(SqlBaseParser.MINUS) + + + self.state = 2975 + _la = self._input.LA(1) + if not(_la==SqlBaseParser.EXPONENT_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + pass + + elif la_ == 4: + localctx = SqlBaseParser.IntegerLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 2977 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2976 + self.match(SqlBaseParser.MINUS) + + + self.state = 2979 + self.match(SqlBaseParser.INTEGER_VALUE) + pass + + elif la_ == 5: + localctx = SqlBaseParser.BigIntLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 2981 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2980 + self.match(SqlBaseParser.MINUS) + + + self.state = 2983 + self.match(SqlBaseParser.BIGINT_LITERAL) + pass + + elif la_ == 6: + localctx = SqlBaseParser.SmallIntLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 2985 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2984 + self.match(SqlBaseParser.MINUS) + + + self.state = 2987 + self.match(SqlBaseParser.SMALLINT_LITERAL) + pass + + elif la_ == 7: + localctx = SqlBaseParser.TinyIntLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 7) + self.state = 2989 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2988 + self.match(SqlBaseParser.MINUS) + + + self.state = 2991 + self.match(SqlBaseParser.TINYINT_LITERAL) + pass + + elif la_ == 8: + localctx = SqlBaseParser.DoubleLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 8) + self.state = 2993 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2992 + self.match(SqlBaseParser.MINUS) + + + self.state = 2995 + self.match(SqlBaseParser.DOUBLE_LITERAL) + pass + + elif la_ == 9: + localctx = SqlBaseParser.BigDecimalLiteralContext(self, localctx) + self.enterOuterAlt(localctx, 9) + self.state = 2997 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==SqlBaseParser.MINUS: + self.state = 2996 + self.match(SqlBaseParser.MINUS) + + + self.state = 2999 + self.match(SqlBaseParser.BIGDECIMAL_LITERAL) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class AlterColumnActionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.setOrDrop = None # Token + + def TYPE(self): + return self.getToken(SqlBaseParser.TYPE, 0) + + def dataType(self): + return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) + + + def commentSpec(self): + return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) + + + def colPosition(self): + return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) + + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_alterColumnAction + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAlterColumnAction" ): + listener.enterAlterColumnAction(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAlterColumnAction" ): + listener.exitAlterColumnAction(self) + + + + + def alterColumnAction(self): + + localctx = SqlBaseParser.AlterColumnActionContext(self, self._ctx, self.state) + self.enterRule(localctx, 266, self.RULE_alterColumnAction) + self._la = 0 # Token type + try: + self.state = 3009 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [SqlBaseParser.TYPE]: + self.enterOuterAlt(localctx, 1) + self.state = 3002 + self.match(SqlBaseParser.TYPE) + self.state = 3003 + self.dataType() + pass + elif token in [SqlBaseParser.COMMENT]: + self.enterOuterAlt(localctx, 2) + self.state = 3004 + self.commentSpec() + pass + elif token in [SqlBaseParser.AFTER, SqlBaseParser.FIRST]: + self.enterOuterAlt(localctx, 3) + self.state = 3005 + self.colPosition() + pass + elif token in [SqlBaseParser.DROP, SqlBaseParser.SET]: + self.enterOuterAlt(localctx, 4) + self.state = 3006 + localctx.setOrDrop = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==SqlBaseParser.DROP or _la==SqlBaseParser.SET): + localctx.setOrDrop = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 3007 + self.match(SqlBaseParser.NOT) + self.state = 3008 + self.match(SqlBaseParser.NULL) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class AnsiNonReservedContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ADD(self): + return self.getToken(SqlBaseParser.ADD, 0) + + def AFTER(self): + return self.getToken(SqlBaseParser.AFTER, 0) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + + def ANALYZE(self): + return self.getToken(SqlBaseParser.ANALYZE, 0) + + def ARCHIVE(self): + return self.getToken(SqlBaseParser.ARCHIVE, 0) + + def ARRAY(self): + return self.getToken(SqlBaseParser.ARRAY, 0) + + def ASC(self): + return self.getToken(SqlBaseParser.ASC, 0) + + def AT(self): + return self.getToken(SqlBaseParser.AT, 0) + + def BETWEEN(self): + return self.getToken(SqlBaseParser.BETWEEN, 0) + + def BUCKET(self): + return self.getToken(SqlBaseParser.BUCKET, 0) + + def BUCKETS(self): + return self.getToken(SqlBaseParser.BUCKETS, 0) + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def CACHE(self): + return self.getToken(SqlBaseParser.CACHE, 0) + + def CASCADE(self): + return self.getToken(SqlBaseParser.CASCADE, 0) + + def CHANGE(self): + return self.getToken(SqlBaseParser.CHANGE, 0) + + def CLEAR(self): + return self.getToken(SqlBaseParser.CLEAR, 0) + + def CLUSTER(self): + return self.getToken(SqlBaseParser.CLUSTER, 0) + + def CLUSTERED(self): + return self.getToken(SqlBaseParser.CLUSTERED, 0) + + def CODEGEN(self): + return self.getToken(SqlBaseParser.CODEGEN, 0) + + def COLLECTION(self): + return self.getToken(SqlBaseParser.COLLECTION, 0) + + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + + def COMMENT(self): + return self.getToken(SqlBaseParser.COMMENT, 0) + + def COMMIT(self): + return self.getToken(SqlBaseParser.COMMIT, 0) + + def COMPACT(self): + return self.getToken(SqlBaseParser.COMPACT, 0) + + def COMPACTIONS(self): + return self.getToken(SqlBaseParser.COMPACTIONS, 0) + + def COMPUTE(self): + return self.getToken(SqlBaseParser.COMPUTE, 0) + + def CONCATENATE(self): + return self.getToken(SqlBaseParser.CONCATENATE, 0) + + def COST(self): + return self.getToken(SqlBaseParser.COST, 0) + + def CUBE(self): + return self.getToken(SqlBaseParser.CUBE, 0) + + def CURRENT(self): + return self.getToken(SqlBaseParser.CURRENT, 0) + + def DATA(self): + return self.getToken(SqlBaseParser.DATA, 0) + + def DATABASE(self): + return self.getToken(SqlBaseParser.DATABASE, 0) + + def DATABASES(self): + return self.getToken(SqlBaseParser.DATABASES, 0) + + def DBPROPERTIES(self): + return self.getToken(SqlBaseParser.DBPROPERTIES, 0) + + def DEFINED(self): + return self.getToken(SqlBaseParser.DEFINED, 0) + + def DELETE(self): + return self.getToken(SqlBaseParser.DELETE, 0) + + def DELIMITED(self): + return self.getToken(SqlBaseParser.DELIMITED, 0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + + def DFS(self): + return self.getToken(SqlBaseParser.DFS, 0) + + def DIRECTORIES(self): + return self.getToken(SqlBaseParser.DIRECTORIES, 0) + + def DIRECTORY(self): + return self.getToken(SqlBaseParser.DIRECTORY, 0) + + def DISTRIBUTE(self): + return self.getToken(SqlBaseParser.DISTRIBUTE, 0) + + def DIV(self): + return self.getToken(SqlBaseParser.DIV, 0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + + def ESCAPED(self): + return self.getToken(SqlBaseParser.ESCAPED, 0) + + def EXCHANGE(self): + return self.getToken(SqlBaseParser.EXCHANGE, 0) + + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def EXPLAIN(self): + return self.getToken(SqlBaseParser.EXPLAIN, 0) + + def EXPORT(self): + return self.getToken(SqlBaseParser.EXPORT, 0) + + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + + def EXTERNAL(self): + return self.getToken(SqlBaseParser.EXTERNAL, 0) + + def EXTRACT(self): + return self.getToken(SqlBaseParser.EXTRACT, 0) + + def FIELDS(self): + return self.getToken(SqlBaseParser.FIELDS, 0) + + def FILEFORMAT(self): + return self.getToken(SqlBaseParser.FILEFORMAT, 0) + + def FIRST(self): + return self.getToken(SqlBaseParser.FIRST, 0) + + def FOLLOWING(self): + return self.getToken(SqlBaseParser.FOLLOWING, 0) + + def FORMAT(self): + return self.getToken(SqlBaseParser.FORMAT, 0) + + def FORMATTED(self): + return self.getToken(SqlBaseParser.FORMATTED, 0) + + def FUNCTION(self): + return self.getToken(SqlBaseParser.FUNCTION, 0) + + def FUNCTIONS(self): + return self.getToken(SqlBaseParser.FUNCTIONS, 0) + + def GLOBAL(self): + return self.getToken(SqlBaseParser.GLOBAL, 0) + + def GROUPING(self): + return self.getToken(SqlBaseParser.GROUPING, 0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + + def IGNORE(self): + return self.getToken(SqlBaseParser.IGNORE, 0) + + def IMPORT(self): + return self.getToken(SqlBaseParser.IMPORT, 0) + + def INDEX(self): + return self.getToken(SqlBaseParser.INDEX, 0) + + def INDEXES(self): + return self.getToken(SqlBaseParser.INDEXES, 0) + + def INPATH(self): + return self.getToken(SqlBaseParser.INPATH, 0) + + def INPUTFORMAT(self): + return self.getToken(SqlBaseParser.INPUTFORMAT, 0) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + + def INTERVAL(self): + return self.getToken(SqlBaseParser.INTERVAL, 0) + + def ITEMS(self): + return self.getToken(SqlBaseParser.ITEMS, 0) + + def KEYS(self): + return self.getToken(SqlBaseParser.KEYS, 0) + + def LAST(self): + return self.getToken(SqlBaseParser.LAST, 0) + + def LATERAL(self): + return self.getToken(SqlBaseParser.LATERAL, 0) + + def LAZY(self): + return self.getToken(SqlBaseParser.LAZY, 0) + + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def LIMIT(self): + return self.getToken(SqlBaseParser.LIMIT, 0) + + def LINES(self): + return self.getToken(SqlBaseParser.LINES, 0) + + def LIST(self): + return self.getToken(SqlBaseParser.LIST, 0) + + def LOAD(self): + return self.getToken(SqlBaseParser.LOAD, 0) + + def LOCAL(self): + return self.getToken(SqlBaseParser.LOCAL, 0) + + def LOCATION(self): + return self.getToken(SqlBaseParser.LOCATION, 0) + + def LOCK(self): + return self.getToken(SqlBaseParser.LOCK, 0) + + def LOCKS(self): + return self.getToken(SqlBaseParser.LOCKS, 0) + + def LOGICAL(self): + return self.getToken(SqlBaseParser.LOGICAL, 0) + + def MACRO(self): + return self.getToken(SqlBaseParser.MACRO, 0) + + def MAP(self): + return self.getToken(SqlBaseParser.MAP, 0) + + def MATCHED(self): + return self.getToken(SqlBaseParser.MATCHED, 0) + + def MERGE(self): + return self.getToken(SqlBaseParser.MERGE, 0) + + def MSCK(self): + return self.getToken(SqlBaseParser.MSCK, 0) + + def NAMESPACE(self): + return self.getToken(SqlBaseParser.NAMESPACE, 0) + + def NAMESPACES(self): + return self.getToken(SqlBaseParser.NAMESPACES, 0) + + def NO(self): + return self.getToken(SqlBaseParser.NO, 0) + + def NULLS(self): + return self.getToken(SqlBaseParser.NULLS, 0) + + def OF(self): + return self.getToken(SqlBaseParser.OF, 0) + + def OPTION(self): + return self.getToken(SqlBaseParser.OPTION, 0) + + def OPTIONS(self): + return self.getToken(SqlBaseParser.OPTIONS, 0) + + def OUT(self): + return self.getToken(SqlBaseParser.OUT, 0) + + def OUTPUTFORMAT(self): + return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) + + def OVER(self): + return self.getToken(SqlBaseParser.OVER, 0) + + def OVERLAY(self): + return self.getToken(SqlBaseParser.OVERLAY, 0) + + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + + def PARTITION(self): + return self.getToken(SqlBaseParser.PARTITION, 0) + + def PARTITIONED(self): + return self.getToken(SqlBaseParser.PARTITIONED, 0) + + def PARTITIONS(self): + return self.getToken(SqlBaseParser.PARTITIONS, 0) + + def PERCENTLIT(self): + return self.getToken(SqlBaseParser.PERCENTLIT, 0) + + def PIVOT(self): + return self.getToken(SqlBaseParser.PIVOT, 0) + + def PLACING(self): + return self.getToken(SqlBaseParser.PLACING, 0) + + def POSITION(self): + return self.getToken(SqlBaseParser.POSITION, 0) + + def PRECEDING(self): + return self.getToken(SqlBaseParser.PRECEDING, 0) + + def PRINCIPALS(self): + return self.getToken(SqlBaseParser.PRINCIPALS, 0) + + def PROPERTIES(self): + return self.getToken(SqlBaseParser.PROPERTIES, 0) + + def PURGE(self): + return self.getToken(SqlBaseParser.PURGE, 0) + + def QUERY(self): + return self.getToken(SqlBaseParser.QUERY, 0) + + def RANGE(self): + return self.getToken(SqlBaseParser.RANGE, 0) + + def RECORDREADER(self): + return self.getToken(SqlBaseParser.RECORDREADER, 0) + + def RECORDWRITER(self): + return self.getToken(SqlBaseParser.RECORDWRITER, 0) + + def RECOVER(self): + return self.getToken(SqlBaseParser.RECOVER, 0) + + def REDUCE(self): + return self.getToken(SqlBaseParser.REDUCE, 0) + + def REFRESH(self): + return self.getToken(SqlBaseParser.REFRESH, 0) + + def RENAME(self): + return self.getToken(SqlBaseParser.RENAME, 0) + + def REPAIR(self): + return self.getToken(SqlBaseParser.REPAIR, 0) + + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + + def RESET(self): + return self.getToken(SqlBaseParser.RESET, 0) + + def RESTRICT(self): + return self.getToken(SqlBaseParser.RESTRICT, 0) + + def REVOKE(self): + return self.getToken(SqlBaseParser.REVOKE, 0) + + def RLIKE(self): + return self.getToken(SqlBaseParser.RLIKE, 0) + + def ROLE(self): + return self.getToken(SqlBaseParser.ROLE, 0) + + def ROLES(self): + return self.getToken(SqlBaseParser.ROLES, 0) + + def ROLLBACK(self): + return self.getToken(SqlBaseParser.ROLLBACK, 0) + + def ROLLUP(self): + return self.getToken(SqlBaseParser.ROLLUP, 0) + + def ROW(self): + return self.getToken(SqlBaseParser.ROW, 0) + + def ROWS(self): + return self.getToken(SqlBaseParser.ROWS, 0) + + def SCHEMA(self): + return self.getToken(SqlBaseParser.SCHEMA, 0) + + def SEPARATED(self): + return self.getToken(SqlBaseParser.SEPARATED, 0) + + def SERDE(self): + return self.getToken(SqlBaseParser.SERDE, 0) + + def SERDEPROPERTIES(self): + return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def SETS(self): + return self.getToken(SqlBaseParser.SETS, 0) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + + def SKEWED(self): + return self.getToken(SqlBaseParser.SKEWED, 0) + + def SORT(self): + return self.getToken(SqlBaseParser.SORT, 0) + + def SORTED(self): + return self.getToken(SqlBaseParser.SORTED, 0) + + def START(self): + return self.getToken(SqlBaseParser.START, 0) + + def STATISTICS(self): + return self.getToken(SqlBaseParser.STATISTICS, 0) + + def STORED(self): + return self.getToken(SqlBaseParser.STORED, 0) + + def STRATIFY(self): + return self.getToken(SqlBaseParser.STRATIFY, 0) + + def STRUCT(self): + return self.getToken(SqlBaseParser.STRUCT, 0) + + def SUBSTR(self): + return self.getToken(SqlBaseParser.SUBSTR, 0) + + def SUBSTRING(self): + return self.getToken(SqlBaseParser.SUBSTRING, 0) + + def TABLES(self): + return self.getToken(SqlBaseParser.TABLES, 0) + + def TABLESAMPLE(self): + return self.getToken(SqlBaseParser.TABLESAMPLE, 0) + + def TBLPROPERTIES(self): + return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) + + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + + def TERMINATED(self): + return self.getToken(SqlBaseParser.TERMINATED, 0) + + def TOUCH(self): + return self.getToken(SqlBaseParser.TOUCH, 0) + + def TRANSACTION(self): + return self.getToken(SqlBaseParser.TRANSACTION, 0) + + def TRANSACTIONS(self): + return self.getToken(SqlBaseParser.TRANSACTIONS, 0) + + def TRANSFORM(self): + return self.getToken(SqlBaseParser.TRANSFORM, 0) + + def TRIM(self): + return self.getToken(SqlBaseParser.TRIM, 0) + + def TRUE(self): + return self.getToken(SqlBaseParser.TRUE, 0) + + def TRUNCATE(self): + return self.getToken(SqlBaseParser.TRUNCATE, 0) + + def UNARCHIVE(self): + return self.getToken(SqlBaseParser.UNARCHIVE, 0) + + def UNBOUNDED(self): + return self.getToken(SqlBaseParser.UNBOUNDED, 0) + + def UNCACHE(self): + return self.getToken(SqlBaseParser.UNCACHE, 0) + + def UNLOCK(self): + return self.getToken(SqlBaseParser.UNLOCK, 0) + + def UNSET(self): + return self.getToken(SqlBaseParser.UNSET, 0) + + def UPDATE(self): + return self.getToken(SqlBaseParser.UPDATE, 0) + + def USE(self): + return self.getToken(SqlBaseParser.USE, 0) + + def VALUES(self): + return self.getToken(SqlBaseParser.VALUES, 0) + + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + + def VIEWS(self): + return self.getToken(SqlBaseParser.VIEWS, 0) + + def WINDOW(self): + return self.getToken(SqlBaseParser.WINDOW, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_ansiNonReserved + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAnsiNonReserved" ): + listener.enterAnsiNonReserved(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAnsiNonReserved" ): + listener.exitAnsiNonReserved(self) + + + + + def ansiNonReserved(self): + + localctx = SqlBaseParser.AnsiNonReservedContext(self, self._ctx, self.state) + self.enterRule(localctx, 268, self.RULE_ansiNonReserved) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 3011 + _la = self._input.LA(1) + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << SqlBaseParser.ADD) | (1 << SqlBaseParser.AFTER) | (1 << SqlBaseParser.ALTER) | (1 << SqlBaseParser.ANALYZE) | (1 << SqlBaseParser.ARCHIVE) | (1 << SqlBaseParser.ARRAY) | (1 << SqlBaseParser.ASC) | (1 << SqlBaseParser.AT) | (1 << SqlBaseParser.BETWEEN) | (1 << SqlBaseParser.BUCKET) | (1 << SqlBaseParser.BUCKETS) | (1 << SqlBaseParser.BY) | (1 << SqlBaseParser.CACHE) | (1 << SqlBaseParser.CASCADE) | (1 << SqlBaseParser.CHANGE) | (1 << SqlBaseParser.CLEAR) | (1 << SqlBaseParser.CLUSTER) | (1 << SqlBaseParser.CLUSTERED) | (1 << SqlBaseParser.CODEGEN) | (1 << SqlBaseParser.COLLECTION) | (1 << SqlBaseParser.COLUMNS) | (1 << SqlBaseParser.COMMENT) | (1 << SqlBaseParser.COMMIT) | (1 << SqlBaseParser.COMPACT) | (1 << SqlBaseParser.COMPACTIONS) | (1 << SqlBaseParser.COMPUTE) | (1 << SqlBaseParser.CONCATENATE) | (1 << SqlBaseParser.COST) | (1 << SqlBaseParser.CUBE) | (1 << SqlBaseParser.CURRENT) | (1 << SqlBaseParser.DATA) | (1 << SqlBaseParser.DATABASE) | (1 << SqlBaseParser.DATABASES))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (SqlBaseParser.DBPROPERTIES - 65)) | (1 << (SqlBaseParser.DEFINED - 65)) | (1 << (SqlBaseParser.DELETE - 65)) | (1 << (SqlBaseParser.DELIMITED - 65)) | (1 << (SqlBaseParser.DESC - 65)) | (1 << (SqlBaseParser.DESCRIBE - 65)) | (1 << (SqlBaseParser.DFS - 65)) | (1 << (SqlBaseParser.DIRECTORIES - 65)) | (1 << (SqlBaseParser.DIRECTORY - 65)) | (1 << (SqlBaseParser.DISTRIBUTE - 65)) | (1 << (SqlBaseParser.DROP - 65)) | (1 << (SqlBaseParser.ESCAPED - 65)) | (1 << (SqlBaseParser.EXCHANGE - 65)) | (1 << (SqlBaseParser.EXISTS - 65)) | (1 << (SqlBaseParser.EXPLAIN - 65)) | (1 << (SqlBaseParser.EXPORT - 65)) | (1 << (SqlBaseParser.EXTENDED - 65)) | (1 << (SqlBaseParser.EXTERNAL - 65)) | (1 << (SqlBaseParser.EXTRACT - 65)) | (1 << (SqlBaseParser.FIELDS - 65)) | (1 << (SqlBaseParser.FILEFORMAT - 65)) | (1 << (SqlBaseParser.FIRST - 65)) | (1 << (SqlBaseParser.FOLLOWING - 65)) | (1 << (SqlBaseParser.FORMAT - 65)) | (1 << (SqlBaseParser.FORMATTED - 65)) | (1 << (SqlBaseParser.FUNCTION - 65)) | (1 << (SqlBaseParser.FUNCTIONS - 65)) | (1 << (SqlBaseParser.GLOBAL - 65)) | (1 << (SqlBaseParser.GROUPING - 65)) | (1 << (SqlBaseParser.IF - 65)) | (1 << (SqlBaseParser.IGNORE - 65)) | (1 << (SqlBaseParser.IMPORT - 65)) | (1 << (SqlBaseParser.INDEX - 65)) | (1 << (SqlBaseParser.INDEXES - 65)) | (1 << (SqlBaseParser.INPATH - 65)) | (1 << (SqlBaseParser.INPUTFORMAT - 65)) | (1 << (SqlBaseParser.INSERT - 65)) | (1 << (SqlBaseParser.INTERVAL - 65)) | (1 << (SqlBaseParser.ITEMS - 65)) | (1 << (SqlBaseParser.KEYS - 65)) | (1 << (SqlBaseParser.LAST - 65)) | (1 << (SqlBaseParser.LATERAL - 65)))) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & ((1 << (SqlBaseParser.LAZY - 129)) | (1 << (SqlBaseParser.LIKE - 129)) | (1 << (SqlBaseParser.LIMIT - 129)) | (1 << (SqlBaseParser.LINES - 129)) | (1 << (SqlBaseParser.LIST - 129)) | (1 << (SqlBaseParser.LOAD - 129)) | (1 << (SqlBaseParser.LOCAL - 129)) | (1 << (SqlBaseParser.LOCATION - 129)) | (1 << (SqlBaseParser.LOCK - 129)) | (1 << (SqlBaseParser.LOCKS - 129)) | (1 << (SqlBaseParser.LOGICAL - 129)) | (1 << (SqlBaseParser.MACRO - 129)) | (1 << (SqlBaseParser.MAP - 129)) | (1 << (SqlBaseParser.MATCHED - 129)) | (1 << (SqlBaseParser.MERGE - 129)) | (1 << (SqlBaseParser.MSCK - 129)) | (1 << (SqlBaseParser.NAMESPACE - 129)) | (1 << (SqlBaseParser.NAMESPACES - 129)) | (1 << (SqlBaseParser.NO - 129)) | (1 << (SqlBaseParser.NULLS - 129)) | (1 << (SqlBaseParser.OF - 129)) | (1 << (SqlBaseParser.OPTION - 129)) | (1 << (SqlBaseParser.OPTIONS - 129)) | (1 << (SqlBaseParser.OUT - 129)) | (1 << (SqlBaseParser.OUTPUTFORMAT - 129)) | (1 << (SqlBaseParser.OVER - 129)) | (1 << (SqlBaseParser.OVERLAY - 129)) | (1 << (SqlBaseParser.OVERWRITE - 129)) | (1 << (SqlBaseParser.PARTITION - 129)) | (1 << (SqlBaseParser.PARTITIONED - 129)) | (1 << (SqlBaseParser.PARTITIONS - 129)) | (1 << (SqlBaseParser.PERCENTLIT - 129)) | (1 << (SqlBaseParser.PIVOT - 129)) | (1 << (SqlBaseParser.PLACING - 129)) | (1 << (SqlBaseParser.POSITION - 129)) | (1 << (SqlBaseParser.PRECEDING - 129)) | (1 << (SqlBaseParser.PRINCIPALS - 129)) | (1 << (SqlBaseParser.PROPERTIES - 129)) | (1 << (SqlBaseParser.PURGE - 129)) | (1 << (SqlBaseParser.QUERY - 129)) | (1 << (SqlBaseParser.RANGE - 129)) | (1 << (SqlBaseParser.RECORDREADER - 129)) | (1 << (SqlBaseParser.RECORDWRITER - 129)) | (1 << (SqlBaseParser.RECOVER - 129)) | (1 << (SqlBaseParser.REDUCE - 129)) | (1 << (SqlBaseParser.REFRESH - 129)) | (1 << (SqlBaseParser.RENAME - 129)) | (1 << (SqlBaseParser.REPAIR - 129)) | (1 << (SqlBaseParser.REPLACE - 129)))) != 0) or ((((_la - 193)) & ~0x3f) == 0 and ((1 << (_la - 193)) & ((1 << (SqlBaseParser.RESET - 193)) | (1 << (SqlBaseParser.RESTRICT - 193)) | (1 << (SqlBaseParser.REVOKE - 193)) | (1 << (SqlBaseParser.RLIKE - 193)) | (1 << (SqlBaseParser.ROLE - 193)) | (1 << (SqlBaseParser.ROLES - 193)) | (1 << (SqlBaseParser.ROLLBACK - 193)) | (1 << (SqlBaseParser.ROLLUP - 193)) | (1 << (SqlBaseParser.ROW - 193)) | (1 << (SqlBaseParser.ROWS - 193)) | (1 << (SqlBaseParser.SCHEMA - 193)) | (1 << (SqlBaseParser.SEPARATED - 193)) | (1 << (SqlBaseParser.SERDE - 193)) | (1 << (SqlBaseParser.SERDEPROPERTIES - 193)) | (1 << (SqlBaseParser.SET - 193)) | (1 << (SqlBaseParser.SETS - 193)) | (1 << (SqlBaseParser.SHOW - 193)) | (1 << (SqlBaseParser.SKEWED - 193)) | (1 << (SqlBaseParser.SORT - 193)) | (1 << (SqlBaseParser.SORTED - 193)) | (1 << (SqlBaseParser.START - 193)) | (1 << (SqlBaseParser.STATISTICS - 193)) | (1 << (SqlBaseParser.STORED - 193)) | (1 << (SqlBaseParser.STRATIFY - 193)) | (1 << (SqlBaseParser.STRUCT - 193)) | (1 << (SqlBaseParser.SUBSTR - 193)) | (1 << (SqlBaseParser.SUBSTRING - 193)) | (1 << (SqlBaseParser.TABLES - 193)) | (1 << (SqlBaseParser.TABLESAMPLE - 193)) | (1 << (SqlBaseParser.TBLPROPERTIES - 193)) | (1 << (SqlBaseParser.TEMPORARY - 193)) | (1 << (SqlBaseParser.TERMINATED - 193)) | (1 << (SqlBaseParser.TOUCH - 193)) | (1 << (SqlBaseParser.TRANSACTION - 193)) | (1 << (SqlBaseParser.TRANSACTIONS - 193)) | (1 << (SqlBaseParser.TRANSFORM - 193)) | (1 << (SqlBaseParser.TRIM - 193)) | (1 << (SqlBaseParser.TRUE - 193)) | (1 << (SqlBaseParser.TRUNCATE - 193)) | (1 << (SqlBaseParser.UNARCHIVE - 193)) | (1 << (SqlBaseParser.UNBOUNDED - 193)) | (1 << (SqlBaseParser.UNCACHE - 193)) | (1 << (SqlBaseParser.UNLOCK - 193)) | (1 << (SqlBaseParser.UNSET - 193)) | (1 << (SqlBaseParser.UPDATE - 193)) | (1 << (SqlBaseParser.USE - 193)) | (1 << (SqlBaseParser.VALUES - 193)))) != 0) or ((((_la - 257)) & ~0x3f) == 0 and ((1 << (_la - 257)) & ((1 << (SqlBaseParser.VIEW - 257)) | (1 << (SqlBaseParser.VIEWS - 257)) | (1 << (SqlBaseParser.WINDOW - 257)) | (1 << (SqlBaseParser.DIV - 257)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class StrictNonReservedContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ANTI(self): + return self.getToken(SqlBaseParser.ANTI, 0) + + def CROSS(self): + return self.getToken(SqlBaseParser.CROSS, 0) + + def EXCEPT(self): + return self.getToken(SqlBaseParser.EXCEPT, 0) + + def FULL(self): + return self.getToken(SqlBaseParser.FULL, 0) + + def INNER(self): + return self.getToken(SqlBaseParser.INNER, 0) + + def INTERSECT(self): + return self.getToken(SqlBaseParser.INTERSECT, 0) + + def JOIN(self): + return self.getToken(SqlBaseParser.JOIN, 0) + + def LEFT(self): + return self.getToken(SqlBaseParser.LEFT, 0) + + def NATURAL(self): + return self.getToken(SqlBaseParser.NATURAL, 0) + + def ON(self): + return self.getToken(SqlBaseParser.ON, 0) + + def RIGHT(self): + return self.getToken(SqlBaseParser.RIGHT, 0) + + def SEMI(self): + return self.getToken(SqlBaseParser.SEMI, 0) + + def SETMINUS(self): + return self.getToken(SqlBaseParser.SETMINUS, 0) + + def UNION(self): + return self.getToken(SqlBaseParser.UNION, 0) + + def USING(self): + return self.getToken(SqlBaseParser.USING, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_strictNonReserved + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStrictNonReserved" ): + listener.enterStrictNonReserved(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStrictNonReserved" ): + listener.exitStrictNonReserved(self) + + + + + def strictNonReserved(self): + + localctx = SqlBaseParser.StrictNonReservedContext(self, self._ctx, self.state) + self.enterRule(localctx, 270, self.RULE_strictNonReserved) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 3013 + _la = self._input.LA(1) + if not(((((_la - 18)) & ~0x3f) == 0 and ((1 << (_la - 18)) & ((1 << (SqlBaseParser.ANTI - 18)) | (1 << (SqlBaseParser.CROSS - 18)) | (1 << (SqlBaseParser.EXCEPT - 18)))) != 0) or ((((_la - 101)) & ~0x3f) == 0 and ((1 << (_la - 101)) & ((1 << (SqlBaseParser.FULL - 101)) | (1 << (SqlBaseParser.INNER - 101)) | (1 << (SqlBaseParser.INTERSECT - 101)) | (1 << (SqlBaseParser.JOIN - 101)) | (1 << (SqlBaseParser.LEFT - 101)) | (1 << (SqlBaseParser.NATURAL - 101)) | (1 << (SqlBaseParser.ON - 101)))) != 0) or ((((_la - 196)) & ~0x3f) == 0 and ((1 << (_la - 196)) & ((1 << (SqlBaseParser.RIGHT - 196)) | (1 << (SqlBaseParser.SEMI - 196)) | (1 << (SqlBaseParser.SETMINUS - 196)) | (1 << (SqlBaseParser.UNION - 196)) | (1 << (SqlBaseParser.USING - 196)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class NonReservedContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ADD(self): + return self.getToken(SqlBaseParser.ADD, 0) + + def AFTER(self): + return self.getToken(SqlBaseParser.AFTER, 0) + + def ALL(self): + return self.getToken(SqlBaseParser.ALL, 0) + + def ALTER(self): + return self.getToken(SqlBaseParser.ALTER, 0) + + def ANALYZE(self): + return self.getToken(SqlBaseParser.ANALYZE, 0) + + def AND(self): + return self.getToken(SqlBaseParser.AND, 0) + + def ANY(self): + return self.getToken(SqlBaseParser.ANY, 0) + + def ARCHIVE(self): + return self.getToken(SqlBaseParser.ARCHIVE, 0) + + def ARRAY(self): + return self.getToken(SqlBaseParser.ARRAY, 0) + + def AS(self): + return self.getToken(SqlBaseParser.AS, 0) + + def ASC(self): + return self.getToken(SqlBaseParser.ASC, 0) + + def AT(self): + return self.getToken(SqlBaseParser.AT, 0) + + def AUTHORIZATION(self): + return self.getToken(SqlBaseParser.AUTHORIZATION, 0) + + def BETWEEN(self): + return self.getToken(SqlBaseParser.BETWEEN, 0) + + def BOTH(self): + return self.getToken(SqlBaseParser.BOTH, 0) + + def BUCKET(self): + return self.getToken(SqlBaseParser.BUCKET, 0) + + def BUCKETS(self): + return self.getToken(SqlBaseParser.BUCKETS, 0) + + def BY(self): + return self.getToken(SqlBaseParser.BY, 0) + + def CACHE(self): + return self.getToken(SqlBaseParser.CACHE, 0) + + def CASCADE(self): + return self.getToken(SqlBaseParser.CASCADE, 0) + + def CASE(self): + return self.getToken(SqlBaseParser.CASE, 0) + + def CAST(self): + return self.getToken(SqlBaseParser.CAST, 0) + + def CHANGE(self): + return self.getToken(SqlBaseParser.CHANGE, 0) + + def CHECK(self): + return self.getToken(SqlBaseParser.CHECK, 0) + + def CLEAR(self): + return self.getToken(SqlBaseParser.CLEAR, 0) + + def CLUSTER(self): + return self.getToken(SqlBaseParser.CLUSTER, 0) + + def CLUSTERED(self): + return self.getToken(SqlBaseParser.CLUSTERED, 0) + + def CODEGEN(self): + return self.getToken(SqlBaseParser.CODEGEN, 0) + + def COLLATE(self): + return self.getToken(SqlBaseParser.COLLATE, 0) + + def COLLECTION(self): + return self.getToken(SqlBaseParser.COLLECTION, 0) + + def COLUMN(self): + return self.getToken(SqlBaseParser.COLUMN, 0) + + def COLUMNS(self): + return self.getToken(SqlBaseParser.COLUMNS, 0) + + def COMMENT(self): + return self.getToken(SqlBaseParser.COMMENT, 0) + + def COMMIT(self): + return self.getToken(SqlBaseParser.COMMIT, 0) + + def COMPACT(self): + return self.getToken(SqlBaseParser.COMPACT, 0) + + def COMPACTIONS(self): + return self.getToken(SqlBaseParser.COMPACTIONS, 0) + + def COMPUTE(self): + return self.getToken(SqlBaseParser.COMPUTE, 0) + + def CONCATENATE(self): + return self.getToken(SqlBaseParser.CONCATENATE, 0) + + def CONSTRAINT(self): + return self.getToken(SqlBaseParser.CONSTRAINT, 0) + + def COST(self): + return self.getToken(SqlBaseParser.COST, 0) + + def CREATE(self): + return self.getToken(SqlBaseParser.CREATE, 0) + + def CUBE(self): + return self.getToken(SqlBaseParser.CUBE, 0) + + def CURRENT(self): + return self.getToken(SqlBaseParser.CURRENT, 0) + + def CURRENT_DATE(self): + return self.getToken(SqlBaseParser.CURRENT_DATE, 0) + + def CURRENT_TIME(self): + return self.getToken(SqlBaseParser.CURRENT_TIME, 0) + + def CURRENT_TIMESTAMP(self): + return self.getToken(SqlBaseParser.CURRENT_TIMESTAMP, 0) + + def CURRENT_USER(self): + return self.getToken(SqlBaseParser.CURRENT_USER, 0) + + def DATA(self): + return self.getToken(SqlBaseParser.DATA, 0) + + def DATABASE(self): + return self.getToken(SqlBaseParser.DATABASE, 0) + + def DATABASES(self): + return self.getToken(SqlBaseParser.DATABASES, 0) + + def DAY(self): + return self.getToken(SqlBaseParser.DAY, 0) + + def DBPROPERTIES(self): + return self.getToken(SqlBaseParser.DBPROPERTIES, 0) + + def DEFINED(self): + return self.getToken(SqlBaseParser.DEFINED, 0) + + def DELETE(self): + return self.getToken(SqlBaseParser.DELETE, 0) + + def DELIMITED(self): + return self.getToken(SqlBaseParser.DELIMITED, 0) + + def DESC(self): + return self.getToken(SqlBaseParser.DESC, 0) + + def DESCRIBE(self): + return self.getToken(SqlBaseParser.DESCRIBE, 0) + + def DFS(self): + return self.getToken(SqlBaseParser.DFS, 0) + + def DIRECTORIES(self): + return self.getToken(SqlBaseParser.DIRECTORIES, 0) + + def DIRECTORY(self): + return self.getToken(SqlBaseParser.DIRECTORY, 0) + + def DISTINCT(self): + return self.getToken(SqlBaseParser.DISTINCT, 0) + + def DISTRIBUTE(self): + return self.getToken(SqlBaseParser.DISTRIBUTE, 0) + + def DIV(self): + return self.getToken(SqlBaseParser.DIV, 0) + + def DROP(self): + return self.getToken(SqlBaseParser.DROP, 0) + + def ELSE(self): + return self.getToken(SqlBaseParser.ELSE, 0) + + def END(self): + return self.getToken(SqlBaseParser.END, 0) + + def ESCAPE(self): + return self.getToken(SqlBaseParser.ESCAPE, 0) + + def ESCAPED(self): + return self.getToken(SqlBaseParser.ESCAPED, 0) + + def EXCHANGE(self): + return self.getToken(SqlBaseParser.EXCHANGE, 0) + + def EXISTS(self): + return self.getToken(SqlBaseParser.EXISTS, 0) + + def EXPLAIN(self): + return self.getToken(SqlBaseParser.EXPLAIN, 0) + + def EXPORT(self): + return self.getToken(SqlBaseParser.EXPORT, 0) + + def EXTENDED(self): + return self.getToken(SqlBaseParser.EXTENDED, 0) + + def EXTERNAL(self): + return self.getToken(SqlBaseParser.EXTERNAL, 0) + + def EXTRACT(self): + return self.getToken(SqlBaseParser.EXTRACT, 0) + + def FALSE(self): + return self.getToken(SqlBaseParser.FALSE, 0) + + def FETCH(self): + return self.getToken(SqlBaseParser.FETCH, 0) + + def FILTER(self): + return self.getToken(SqlBaseParser.FILTER, 0) + + def FIELDS(self): + return self.getToken(SqlBaseParser.FIELDS, 0) + + def FILEFORMAT(self): + return self.getToken(SqlBaseParser.FILEFORMAT, 0) + + def FIRST(self): + return self.getToken(SqlBaseParser.FIRST, 0) + + def FOLLOWING(self): + return self.getToken(SqlBaseParser.FOLLOWING, 0) + + def FOR(self): + return self.getToken(SqlBaseParser.FOR, 0) + + def FOREIGN(self): + return self.getToken(SqlBaseParser.FOREIGN, 0) + + def FORMAT(self): + return self.getToken(SqlBaseParser.FORMAT, 0) + + def FORMATTED(self): + return self.getToken(SqlBaseParser.FORMATTED, 0) + + def FROM(self): + return self.getToken(SqlBaseParser.FROM, 0) + + def FUNCTION(self): + return self.getToken(SqlBaseParser.FUNCTION, 0) + + def FUNCTIONS(self): + return self.getToken(SqlBaseParser.FUNCTIONS, 0) + + def GLOBAL(self): + return self.getToken(SqlBaseParser.GLOBAL, 0) + + def GRANT(self): + return self.getToken(SqlBaseParser.GRANT, 0) + + def GROUP(self): + return self.getToken(SqlBaseParser.GROUP, 0) + + def GROUPING(self): + return self.getToken(SqlBaseParser.GROUPING, 0) + + def HAVING(self): + return self.getToken(SqlBaseParser.HAVING, 0) + + def HOUR(self): + return self.getToken(SqlBaseParser.HOUR, 0) + + def IF(self): + return self.getToken(SqlBaseParser.IF, 0) + + def IGNORE(self): + return self.getToken(SqlBaseParser.IGNORE, 0) + + def IMPORT(self): + return self.getToken(SqlBaseParser.IMPORT, 0) + + def IN(self): + return self.getToken(SqlBaseParser.IN, 0) + + def INDEX(self): + return self.getToken(SqlBaseParser.INDEX, 0) + + def INDEXES(self): + return self.getToken(SqlBaseParser.INDEXES, 0) + + def INPATH(self): + return self.getToken(SqlBaseParser.INPATH, 0) + + def INPUTFORMAT(self): + return self.getToken(SqlBaseParser.INPUTFORMAT, 0) + + def INSERT(self): + return self.getToken(SqlBaseParser.INSERT, 0) + + def INTERVAL(self): + return self.getToken(SqlBaseParser.INTERVAL, 0) + + def INTO(self): + return self.getToken(SqlBaseParser.INTO, 0) + + def IS(self): + return self.getToken(SqlBaseParser.IS, 0) + + def ITEMS(self): + return self.getToken(SqlBaseParser.ITEMS, 0) + + def KEYS(self): + return self.getToken(SqlBaseParser.KEYS, 0) + + def LAST(self): + return self.getToken(SqlBaseParser.LAST, 0) + + def LATERAL(self): + return self.getToken(SqlBaseParser.LATERAL, 0) + + def LAZY(self): + return self.getToken(SqlBaseParser.LAZY, 0) + + def LEADING(self): + return self.getToken(SqlBaseParser.LEADING, 0) + + def LIKE(self): + return self.getToken(SqlBaseParser.LIKE, 0) + + def LIMIT(self): + return self.getToken(SqlBaseParser.LIMIT, 0) + + def LINES(self): + return self.getToken(SqlBaseParser.LINES, 0) + + def LIST(self): + return self.getToken(SqlBaseParser.LIST, 0) + + def LOAD(self): + return self.getToken(SqlBaseParser.LOAD, 0) + + def LOCAL(self): + return self.getToken(SqlBaseParser.LOCAL, 0) + + def LOCATION(self): + return self.getToken(SqlBaseParser.LOCATION, 0) + + def LOCK(self): + return self.getToken(SqlBaseParser.LOCK, 0) + + def LOCKS(self): + return self.getToken(SqlBaseParser.LOCKS, 0) + + def LOGICAL(self): + return self.getToken(SqlBaseParser.LOGICAL, 0) + + def MACRO(self): + return self.getToken(SqlBaseParser.MACRO, 0) + + def MAP(self): + return self.getToken(SqlBaseParser.MAP, 0) + + def MATCHED(self): + return self.getToken(SqlBaseParser.MATCHED, 0) + + def MERGE(self): + return self.getToken(SqlBaseParser.MERGE, 0) + + def MINUTE(self): + return self.getToken(SqlBaseParser.MINUTE, 0) + + def MONTH(self): + return self.getToken(SqlBaseParser.MONTH, 0) + + def MSCK(self): + return self.getToken(SqlBaseParser.MSCK, 0) + + def NAMESPACE(self): + return self.getToken(SqlBaseParser.NAMESPACE, 0) + + def NAMESPACES(self): + return self.getToken(SqlBaseParser.NAMESPACES, 0) + + def NO(self): + return self.getToken(SqlBaseParser.NO, 0) + + def NOT(self): + return self.getToken(SqlBaseParser.NOT, 0) + + def NULL(self): + return self.getToken(SqlBaseParser.NULL, 0) + + def NULLS(self): + return self.getToken(SqlBaseParser.NULLS, 0) + + def OF(self): + return self.getToken(SqlBaseParser.OF, 0) + + def ONLY(self): + return self.getToken(SqlBaseParser.ONLY, 0) + + def OPTION(self): + return self.getToken(SqlBaseParser.OPTION, 0) + + def OPTIONS(self): + return self.getToken(SqlBaseParser.OPTIONS, 0) + + def OR(self): + return self.getToken(SqlBaseParser.OR, 0) + + def ORDER(self): + return self.getToken(SqlBaseParser.ORDER, 0) + + def OUT(self): + return self.getToken(SqlBaseParser.OUT, 0) + + def OUTER(self): + return self.getToken(SqlBaseParser.OUTER, 0) + + def OUTPUTFORMAT(self): + return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) + + def OVER(self): + return self.getToken(SqlBaseParser.OVER, 0) + + def OVERLAPS(self): + return self.getToken(SqlBaseParser.OVERLAPS, 0) + + def OVERLAY(self): + return self.getToken(SqlBaseParser.OVERLAY, 0) + + def OVERWRITE(self): + return self.getToken(SqlBaseParser.OVERWRITE, 0) + + def PARTITION(self): + return self.getToken(SqlBaseParser.PARTITION, 0) + + def PARTITIONED(self): + return self.getToken(SqlBaseParser.PARTITIONED, 0) + + def PARTITIONS(self): + return self.getToken(SqlBaseParser.PARTITIONS, 0) + + def PERCENTLIT(self): + return self.getToken(SqlBaseParser.PERCENTLIT, 0) + + def PIVOT(self): + return self.getToken(SqlBaseParser.PIVOT, 0) + + def PLACING(self): + return self.getToken(SqlBaseParser.PLACING, 0) + + def POSITION(self): + return self.getToken(SqlBaseParser.POSITION, 0) + + def PRECEDING(self): + return self.getToken(SqlBaseParser.PRECEDING, 0) + + def PRIMARY(self): + return self.getToken(SqlBaseParser.PRIMARY, 0) + + def PRINCIPALS(self): + return self.getToken(SqlBaseParser.PRINCIPALS, 0) + + def PROPERTIES(self): + return self.getToken(SqlBaseParser.PROPERTIES, 0) + + def PURGE(self): + return self.getToken(SqlBaseParser.PURGE, 0) + + def QUERY(self): + return self.getToken(SqlBaseParser.QUERY, 0) + + def RANGE(self): + return self.getToken(SqlBaseParser.RANGE, 0) + + def RECORDREADER(self): + return self.getToken(SqlBaseParser.RECORDREADER, 0) + + def RECORDWRITER(self): + return self.getToken(SqlBaseParser.RECORDWRITER, 0) + + def RECOVER(self): + return self.getToken(SqlBaseParser.RECOVER, 0) + + def REDUCE(self): + return self.getToken(SqlBaseParser.REDUCE, 0) + + def REFERENCES(self): + return self.getToken(SqlBaseParser.REFERENCES, 0) + + def REFRESH(self): + return self.getToken(SqlBaseParser.REFRESH, 0) + + def RENAME(self): + return self.getToken(SqlBaseParser.RENAME, 0) + + def REPAIR(self): + return self.getToken(SqlBaseParser.REPAIR, 0) + + def REPLACE(self): + return self.getToken(SqlBaseParser.REPLACE, 0) + + def RESET(self): + return self.getToken(SqlBaseParser.RESET, 0) + + def RESTRICT(self): + return self.getToken(SqlBaseParser.RESTRICT, 0) + + def REVOKE(self): + return self.getToken(SqlBaseParser.REVOKE, 0) + + def RLIKE(self): + return self.getToken(SqlBaseParser.RLIKE, 0) + + def ROLE(self): + return self.getToken(SqlBaseParser.ROLE, 0) + + def ROLES(self): + return self.getToken(SqlBaseParser.ROLES, 0) + + def ROLLBACK(self): + return self.getToken(SqlBaseParser.ROLLBACK, 0) + + def ROLLUP(self): + return self.getToken(SqlBaseParser.ROLLUP, 0) + + def ROW(self): + return self.getToken(SqlBaseParser.ROW, 0) + + def ROWS(self): + return self.getToken(SqlBaseParser.ROWS, 0) + + def SCHEMA(self): + return self.getToken(SqlBaseParser.SCHEMA, 0) + + def SECOND(self): + return self.getToken(SqlBaseParser.SECOND, 0) + + def SELECT(self): + return self.getToken(SqlBaseParser.SELECT, 0) + + def SEPARATED(self): + return self.getToken(SqlBaseParser.SEPARATED, 0) + + def SERDE(self): + return self.getToken(SqlBaseParser.SERDE, 0) + + def SERDEPROPERTIES(self): + return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) + + def SESSION_USER(self): + return self.getToken(SqlBaseParser.SESSION_USER, 0) + + def SET(self): + return self.getToken(SqlBaseParser.SET, 0) + + def SETS(self): + return self.getToken(SqlBaseParser.SETS, 0) + + def SHOW(self): + return self.getToken(SqlBaseParser.SHOW, 0) + + def SKEWED(self): + return self.getToken(SqlBaseParser.SKEWED, 0) + + def SOME(self): + return self.getToken(SqlBaseParser.SOME, 0) + + def SORT(self): + return self.getToken(SqlBaseParser.SORT, 0) + + def SORTED(self): + return self.getToken(SqlBaseParser.SORTED, 0) + + def START(self): + return self.getToken(SqlBaseParser.START, 0) + + def STATISTICS(self): + return self.getToken(SqlBaseParser.STATISTICS, 0) + + def STORED(self): + return self.getToken(SqlBaseParser.STORED, 0) + + def STRATIFY(self): + return self.getToken(SqlBaseParser.STRATIFY, 0) + + def STRUCT(self): + return self.getToken(SqlBaseParser.STRUCT, 0) + + def SUBSTR(self): + return self.getToken(SqlBaseParser.SUBSTR, 0) + + def SUBSTRING(self): + return self.getToken(SqlBaseParser.SUBSTRING, 0) + + def TABLE(self): + return self.getToken(SqlBaseParser.TABLE, 0) + + def TABLES(self): + return self.getToken(SqlBaseParser.TABLES, 0) + + def TABLESAMPLE(self): + return self.getToken(SqlBaseParser.TABLESAMPLE, 0) + + def TBLPROPERTIES(self): + return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) + + def TEMPORARY(self): + return self.getToken(SqlBaseParser.TEMPORARY, 0) + + def TERMINATED(self): + return self.getToken(SqlBaseParser.TERMINATED, 0) + + def THEN(self): + return self.getToken(SqlBaseParser.THEN, 0) + + def TO(self): + return self.getToken(SqlBaseParser.TO, 0) + + def TOUCH(self): + return self.getToken(SqlBaseParser.TOUCH, 0) + + def TRAILING(self): + return self.getToken(SqlBaseParser.TRAILING, 0) + + def TRANSACTION(self): + return self.getToken(SqlBaseParser.TRANSACTION, 0) + + def TRANSACTIONS(self): + return self.getToken(SqlBaseParser.TRANSACTIONS, 0) + + def TRANSFORM(self): + return self.getToken(SqlBaseParser.TRANSFORM, 0) + + def TRIM(self): + return self.getToken(SqlBaseParser.TRIM, 0) + + def TRUE(self): + return self.getToken(SqlBaseParser.TRUE, 0) + + def TRUNCATE(self): + return self.getToken(SqlBaseParser.TRUNCATE, 0) + + def TYPE(self): + return self.getToken(SqlBaseParser.TYPE, 0) + + def UNARCHIVE(self): + return self.getToken(SqlBaseParser.UNARCHIVE, 0) + + def UNBOUNDED(self): + return self.getToken(SqlBaseParser.UNBOUNDED, 0) + + def UNCACHE(self): + return self.getToken(SqlBaseParser.UNCACHE, 0) + + def UNIQUE(self): + return self.getToken(SqlBaseParser.UNIQUE, 0) + + def UNKNOWN(self): + return self.getToken(SqlBaseParser.UNKNOWN, 0) + + def UNLOCK(self): + return self.getToken(SqlBaseParser.UNLOCK, 0) + + def UNSET(self): + return self.getToken(SqlBaseParser.UNSET, 0) + + def UPDATE(self): + return self.getToken(SqlBaseParser.UPDATE, 0) + + def USE(self): + return self.getToken(SqlBaseParser.USE, 0) + + def USER(self): + return self.getToken(SqlBaseParser.USER, 0) + + def VALUES(self): + return self.getToken(SqlBaseParser.VALUES, 0) + + def VIEW(self): + return self.getToken(SqlBaseParser.VIEW, 0) + + def VIEWS(self): + return self.getToken(SqlBaseParser.VIEWS, 0) + + def WHEN(self): + return self.getToken(SqlBaseParser.WHEN, 0) + + def WHERE(self): + return self.getToken(SqlBaseParser.WHERE, 0) + + def WINDOW(self): + return self.getToken(SqlBaseParser.WINDOW, 0) + + def WITH(self): + return self.getToken(SqlBaseParser.WITH, 0) + + def YEAR(self): + return self.getToken(SqlBaseParser.YEAR, 0) + + def getRuleIndex(self): + return SqlBaseParser.RULE_nonReserved + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNonReserved" ): + listener.enterNonReserved(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNonReserved" ): + listener.exitNonReserved(self) + + + + + def nonReserved(self): + + localctx = SqlBaseParser.NonReservedContext(self, self._ctx, self.state) + self.enterRule(localctx, 272, self.RULE_nonReserved) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 3015 + _la = self._input.LA(1) + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << SqlBaseParser.ADD) | (1 << SqlBaseParser.AFTER) | (1 << SqlBaseParser.ALL) | (1 << SqlBaseParser.ALTER) | (1 << SqlBaseParser.ANALYZE) | (1 << SqlBaseParser.AND) | (1 << SqlBaseParser.ANY) | (1 << SqlBaseParser.ARCHIVE) | (1 << SqlBaseParser.ARRAY) | (1 << SqlBaseParser.AS) | (1 << SqlBaseParser.ASC) | (1 << SqlBaseParser.AT) | (1 << SqlBaseParser.AUTHORIZATION) | (1 << SqlBaseParser.BETWEEN) | (1 << SqlBaseParser.BOTH) | (1 << SqlBaseParser.BUCKET) | (1 << SqlBaseParser.BUCKETS) | (1 << SqlBaseParser.BY) | (1 << SqlBaseParser.CACHE) | (1 << SqlBaseParser.CASCADE) | (1 << SqlBaseParser.CASE) | (1 << SqlBaseParser.CAST) | (1 << SqlBaseParser.CHANGE) | (1 << SqlBaseParser.CHECK) | (1 << SqlBaseParser.CLEAR) | (1 << SqlBaseParser.CLUSTER) | (1 << SqlBaseParser.CLUSTERED) | (1 << SqlBaseParser.CODEGEN) | (1 << SqlBaseParser.COLLATE) | (1 << SqlBaseParser.COLLECTION) | (1 << SqlBaseParser.COLUMN) | (1 << SqlBaseParser.COLUMNS) | (1 << SqlBaseParser.COMMENT) | (1 << SqlBaseParser.COMMIT) | (1 << SqlBaseParser.COMPACT) | (1 << SqlBaseParser.COMPACTIONS) | (1 << SqlBaseParser.COMPUTE) | (1 << SqlBaseParser.CONCATENATE) | (1 << SqlBaseParser.CONSTRAINT) | (1 << SqlBaseParser.COST) | (1 << SqlBaseParser.CREATE) | (1 << SqlBaseParser.CUBE) | (1 << SqlBaseParser.CURRENT) | (1 << SqlBaseParser.CURRENT_DATE) | (1 << SqlBaseParser.CURRENT_TIME) | (1 << SqlBaseParser.CURRENT_TIMESTAMP) | (1 << SqlBaseParser.CURRENT_USER) | (1 << SqlBaseParser.DATA) | (1 << SqlBaseParser.DATABASE) | (1 << SqlBaseParser.DATABASES))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (SqlBaseParser.DAY - 64)) | (1 << (SqlBaseParser.DBPROPERTIES - 64)) | (1 << (SqlBaseParser.DEFINED - 64)) | (1 << (SqlBaseParser.DELETE - 64)) | (1 << (SqlBaseParser.DELIMITED - 64)) | (1 << (SqlBaseParser.DESC - 64)) | (1 << (SqlBaseParser.DESCRIBE - 64)) | (1 << (SqlBaseParser.DFS - 64)) | (1 << (SqlBaseParser.DIRECTORIES - 64)) | (1 << (SqlBaseParser.DIRECTORY - 64)) | (1 << (SqlBaseParser.DISTINCT - 64)) | (1 << (SqlBaseParser.DISTRIBUTE - 64)) | (1 << (SqlBaseParser.DROP - 64)) | (1 << (SqlBaseParser.ELSE - 64)) | (1 << (SqlBaseParser.END - 64)) | (1 << (SqlBaseParser.ESCAPE - 64)) | (1 << (SqlBaseParser.ESCAPED - 64)) | (1 << (SqlBaseParser.EXCHANGE - 64)) | (1 << (SqlBaseParser.EXISTS - 64)) | (1 << (SqlBaseParser.EXPLAIN - 64)) | (1 << (SqlBaseParser.EXPORT - 64)) | (1 << (SqlBaseParser.EXTENDED - 64)) | (1 << (SqlBaseParser.EXTERNAL - 64)) | (1 << (SqlBaseParser.EXTRACT - 64)) | (1 << (SqlBaseParser.FALSE - 64)) | (1 << (SqlBaseParser.FETCH - 64)) | (1 << (SqlBaseParser.FIELDS - 64)) | (1 << (SqlBaseParser.FILTER - 64)) | (1 << (SqlBaseParser.FILEFORMAT - 64)) | (1 << (SqlBaseParser.FIRST - 64)) | (1 << (SqlBaseParser.FOLLOWING - 64)) | (1 << (SqlBaseParser.FOR - 64)) | (1 << (SqlBaseParser.FOREIGN - 64)) | (1 << (SqlBaseParser.FORMAT - 64)) | (1 << (SqlBaseParser.FORMATTED - 64)) | (1 << (SqlBaseParser.FROM - 64)) | (1 << (SqlBaseParser.FUNCTION - 64)) | (1 << (SqlBaseParser.FUNCTIONS - 64)) | (1 << (SqlBaseParser.GLOBAL - 64)) | (1 << (SqlBaseParser.GRANT - 64)) | (1 << (SqlBaseParser.GROUP - 64)) | (1 << (SqlBaseParser.GROUPING - 64)) | (1 << (SqlBaseParser.HAVING - 64)) | (1 << (SqlBaseParser.HOUR - 64)) | (1 << (SqlBaseParser.IF - 64)) | (1 << (SqlBaseParser.IGNORE - 64)) | (1 << (SqlBaseParser.IMPORT - 64)) | (1 << (SqlBaseParser.IN - 64)) | (1 << (SqlBaseParser.INDEX - 64)) | (1 << (SqlBaseParser.INDEXES - 64)) | (1 << (SqlBaseParser.INPATH - 64)) | (1 << (SqlBaseParser.INPUTFORMAT - 64)) | (1 << (SqlBaseParser.INSERT - 64)) | (1 << (SqlBaseParser.INTERVAL - 64)) | (1 << (SqlBaseParser.INTO - 64)) | (1 << (SqlBaseParser.IS - 64)) | (1 << (SqlBaseParser.ITEMS - 64)) | (1 << (SqlBaseParser.KEYS - 64)) | (1 << (SqlBaseParser.LAST - 64)))) != 0) or ((((_la - 128)) & ~0x3f) == 0 and ((1 << (_la - 128)) & ((1 << (SqlBaseParser.LATERAL - 128)) | (1 << (SqlBaseParser.LAZY - 128)) | (1 << (SqlBaseParser.LEADING - 128)) | (1 << (SqlBaseParser.LIKE - 128)) | (1 << (SqlBaseParser.LIMIT - 128)) | (1 << (SqlBaseParser.LINES - 128)) | (1 << (SqlBaseParser.LIST - 128)) | (1 << (SqlBaseParser.LOAD - 128)) | (1 << (SqlBaseParser.LOCAL - 128)) | (1 << (SqlBaseParser.LOCATION - 128)) | (1 << (SqlBaseParser.LOCK - 128)) | (1 << (SqlBaseParser.LOCKS - 128)) | (1 << (SqlBaseParser.LOGICAL - 128)) | (1 << (SqlBaseParser.MACRO - 128)) | (1 << (SqlBaseParser.MAP - 128)) | (1 << (SqlBaseParser.MATCHED - 128)) | (1 << (SqlBaseParser.MERGE - 128)) | (1 << (SqlBaseParser.MINUTE - 128)) | (1 << (SqlBaseParser.MONTH - 128)) | (1 << (SqlBaseParser.MSCK - 128)) | (1 << (SqlBaseParser.NAMESPACE - 128)) | (1 << (SqlBaseParser.NAMESPACES - 128)) | (1 << (SqlBaseParser.NO - 128)) | (1 << (SqlBaseParser.NOT - 128)) | (1 << (SqlBaseParser.NULL - 128)) | (1 << (SqlBaseParser.NULLS - 128)) | (1 << (SqlBaseParser.OF - 128)) | (1 << (SqlBaseParser.ONLY - 128)) | (1 << (SqlBaseParser.OPTION - 128)) | (1 << (SqlBaseParser.OPTIONS - 128)) | (1 << (SqlBaseParser.OR - 128)) | (1 << (SqlBaseParser.ORDER - 128)) | (1 << (SqlBaseParser.OUT - 128)) | (1 << (SqlBaseParser.OUTER - 128)) | (1 << (SqlBaseParser.OUTPUTFORMAT - 128)) | (1 << (SqlBaseParser.OVER - 128)) | (1 << (SqlBaseParser.OVERLAPS - 128)) | (1 << (SqlBaseParser.OVERLAY - 128)) | (1 << (SqlBaseParser.OVERWRITE - 128)) | (1 << (SqlBaseParser.PARTITION - 128)) | (1 << (SqlBaseParser.PARTITIONED - 128)) | (1 << (SqlBaseParser.PARTITIONS - 128)) | (1 << (SqlBaseParser.PERCENTLIT - 128)) | (1 << (SqlBaseParser.PIVOT - 128)) | (1 << (SqlBaseParser.PLACING - 128)) | (1 << (SqlBaseParser.POSITION - 128)) | (1 << (SqlBaseParser.PRECEDING - 128)) | (1 << (SqlBaseParser.PRIMARY - 128)) | (1 << (SqlBaseParser.PRINCIPALS - 128)) | (1 << (SqlBaseParser.PROPERTIES - 128)) | (1 << (SqlBaseParser.PURGE - 128)) | (1 << (SqlBaseParser.QUERY - 128)) | (1 << (SqlBaseParser.RANGE - 128)) | (1 << (SqlBaseParser.RECORDREADER - 128)) | (1 << (SqlBaseParser.RECORDWRITER - 128)) | (1 << (SqlBaseParser.RECOVER - 128)) | (1 << (SqlBaseParser.REDUCE - 128)) | (1 << (SqlBaseParser.REFERENCES - 128)) | (1 << (SqlBaseParser.REFRESH - 128)) | (1 << (SqlBaseParser.RENAME - 128)) | (1 << (SqlBaseParser.REPAIR - 128)))) != 0) or ((((_la - 192)) & ~0x3f) == 0 and ((1 << (_la - 192)) & ((1 << (SqlBaseParser.REPLACE - 192)) | (1 << (SqlBaseParser.RESET - 192)) | (1 << (SqlBaseParser.RESTRICT - 192)) | (1 << (SqlBaseParser.REVOKE - 192)) | (1 << (SqlBaseParser.RLIKE - 192)) | (1 << (SqlBaseParser.ROLE - 192)) | (1 << (SqlBaseParser.ROLES - 192)) | (1 << (SqlBaseParser.ROLLBACK - 192)) | (1 << (SqlBaseParser.ROLLUP - 192)) | (1 << (SqlBaseParser.ROW - 192)) | (1 << (SqlBaseParser.ROWS - 192)) | (1 << (SqlBaseParser.SCHEMA - 192)) | (1 << (SqlBaseParser.SECOND - 192)) | (1 << (SqlBaseParser.SELECT - 192)) | (1 << (SqlBaseParser.SEPARATED - 192)) | (1 << (SqlBaseParser.SERDE - 192)) | (1 << (SqlBaseParser.SERDEPROPERTIES - 192)) | (1 << (SqlBaseParser.SESSION_USER - 192)) | (1 << (SqlBaseParser.SET - 192)) | (1 << (SqlBaseParser.SETS - 192)) | (1 << (SqlBaseParser.SHOW - 192)) | (1 << (SqlBaseParser.SKEWED - 192)) | (1 << (SqlBaseParser.SOME - 192)) | (1 << (SqlBaseParser.SORT - 192)) | (1 << (SqlBaseParser.SORTED - 192)) | (1 << (SqlBaseParser.START - 192)) | (1 << (SqlBaseParser.STATISTICS - 192)) | (1 << (SqlBaseParser.STORED - 192)) | (1 << (SqlBaseParser.STRATIFY - 192)) | (1 << (SqlBaseParser.STRUCT - 192)) | (1 << (SqlBaseParser.SUBSTR - 192)) | (1 << (SqlBaseParser.SUBSTRING - 192)) | (1 << (SqlBaseParser.TABLE - 192)) | (1 << (SqlBaseParser.TABLES - 192)) | (1 << (SqlBaseParser.TABLESAMPLE - 192)) | (1 << (SqlBaseParser.TBLPROPERTIES - 192)) | (1 << (SqlBaseParser.TEMPORARY - 192)) | (1 << (SqlBaseParser.TERMINATED - 192)) | (1 << (SqlBaseParser.THEN - 192)) | (1 << (SqlBaseParser.TO - 192)) | (1 << (SqlBaseParser.TOUCH - 192)) | (1 << (SqlBaseParser.TRAILING - 192)) | (1 << (SqlBaseParser.TRANSACTION - 192)) | (1 << (SqlBaseParser.TRANSACTIONS - 192)) | (1 << (SqlBaseParser.TRANSFORM - 192)) | (1 << (SqlBaseParser.TRIM - 192)) | (1 << (SqlBaseParser.TRUE - 192)) | (1 << (SqlBaseParser.TRUNCATE - 192)) | (1 << (SqlBaseParser.TYPE - 192)) | (1 << (SqlBaseParser.UNARCHIVE - 192)) | (1 << (SqlBaseParser.UNBOUNDED - 192)) | (1 << (SqlBaseParser.UNCACHE - 192)) | (1 << (SqlBaseParser.UNIQUE - 192)) | (1 << (SqlBaseParser.UNKNOWN - 192)) | (1 << (SqlBaseParser.UNLOCK - 192)) | (1 << (SqlBaseParser.UNSET - 192)) | (1 << (SqlBaseParser.UPDATE - 192)) | (1 << (SqlBaseParser.USE - 192)) | (1 << (SqlBaseParser.USER - 192)))) != 0) or ((((_la - 256)) & ~0x3f) == 0 and ((1 << (_la - 256)) & ((1 << (SqlBaseParser.VALUES - 256)) | (1 << (SqlBaseParser.VIEW - 256)) | (1 << (SqlBaseParser.VIEWS - 256)) | (1 << (SqlBaseParser.WHEN - 256)) | (1 << (SqlBaseParser.WHERE - 256)) | (1 << (SqlBaseParser.WINDOW - 256)) | (1 << (SqlBaseParser.WITH - 256)) | (1 << (SqlBaseParser.YEAR - 256)) | (1 << (SqlBaseParser.DIV - 256)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[7] = self.statement_sempred + self._predicates[40] = self.queryTerm_sempred + self._predicates[94] = self.booleanExpression_sempred + self._predicates[96] = self.valueExpression_sempred + self._predicates[97] = self.primaryExpression_sempred + self._predicates[129] = self.identifier_sempred + self._predicates[130] = self.strictIdentifier_sempred + self._predicates[132] = self.number_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def statement_sempred(self, localctx:StatementContext, predIndex:int): + if predIndex == 0: + return not self.legacy_create_hive_table_by_default_enabled + + + if predIndex == 1: + return self.legacy_create_hive_table_by_default_enabled + + + def queryTerm_sempred(self, localctx:QueryTermContext, predIndex:int): + if predIndex == 2: + return self.precpred(self._ctx, 3) + + + if predIndex == 3: + return self.legacy_setops_precedence_enbled + + + if predIndex == 4: + return self.precpred(self._ctx, 2) + + + if predIndex == 5: + return not self.legacy_setops_precedence_enbled + + + if predIndex == 6: + return self.precpred(self._ctx, 1) + + + if predIndex == 7: + return not self.legacy_setops_precedence_enbled + + + def booleanExpression_sempred(self, localctx:BooleanExpressionContext, predIndex:int): + if predIndex == 8: + return self.precpred(self._ctx, 2) + + + if predIndex == 9: + return self.precpred(self._ctx, 1) + + + def valueExpression_sempred(self, localctx:ValueExpressionContext, predIndex:int): + if predIndex == 10: + return self.precpred(self._ctx, 6) + + + if predIndex == 11: + return self.precpred(self._ctx, 5) + + + if predIndex == 12: + return self.precpred(self._ctx, 4) + + + if predIndex == 13: + return self.precpred(self._ctx, 3) + + + if predIndex == 14: + return self.precpred(self._ctx, 2) + + + if predIndex == 15: + return self.precpred(self._ctx, 1) + + + def primaryExpression_sempred(self, localctx:PrimaryExpressionContext, predIndex:int): + if predIndex == 16: + return self.precpred(self._ctx, 8) + + + if predIndex == 17: + return self.precpred(self._ctx, 6) + + + def identifier_sempred(self, localctx:IdentifierContext, predIndex:int): + if predIndex == 18: + return not self.SQL_standard_keyword_behavior + + + def strictIdentifier_sempred(self, localctx:StrictIdentifierContext, predIndex:int): + if predIndex == 19: + return self.SQL_standard_keyword_behavior + + + if predIndex == 20: + return not self.SQL_standard_keyword_behavior + + + def number_sempred(self, localctx:NumberContext, predIndex:int): + if predIndex == 21: + return not self.legacy_exponent_literal_as_decimal_enabled + + + if predIndex == 22: + return not self.legacy_exponent_literal_as_decimal_enabled + + + if predIndex == 23: + return self.legacy_exponent_literal_as_decimal_enabled + + + + + diff --git a/pysparkling/sql/ast/generated/__init__.py b/pysparkling/sql/ast/generated/__init__.py new file mode 100644 index 000000000..e69de29bb From ac2f991fd85e4cc416fe4f77e81abb392f55b197 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 18:54:25 +0200 Subject: [PATCH 003/118] Document grammar file status --- pysparkling/sql/ast/generated/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 pysparkling/sql/ast/generated/README.md diff --git a/pysparkling/sql/ast/generated/README.md b/pysparkling/sql/ast/generated/README.md new file mode 100644 index 000000000..8408340af --- /dev/null +++ b/pysparkling/sql/ast/generated/README.md @@ -0,0 +1,4 @@ +Python files in this folder were generated based on the antl4r grammar +localed in `pysparkling/sql/ast/grammar/SqlBase.g4`. + +NB: They could be generated only in Pysparkling package, but it would make it harder to contribute to the project. From a7eb397f54b1841c9334cc0145bdafb1cffdd3fd Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:02:58 +0200 Subject: [PATCH 004/118] Translate BRACKETED_COMMENT scala condition in python --- pysparkling/sql/ast/generated/SqlBaseLexer.py | 4 +- pysparkling/sql/ast/grammar/SqlBase.g4 | 1829 +++++++++++++++++ 2 files changed, 1831 insertions(+), 2 deletions(-) create mode 100644 pysparkling/sql/ast/grammar/SqlBase.g4 diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.py b/pysparkling/sql/ast/generated/SqlBaseLexer.py index 1dcbd240a..8fab2f10c 100644 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.py +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.py @@ -1872,7 +1872,7 @@ def BIGDECIMAL_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): def BRACKETED_COMMENT_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 4: - return not isHint() - + return not self.isHint() + diff --git a/pysparkling/sql/ast/grammar/SqlBase.g4 b/pysparkling/sql/ast/grammar/SqlBase.g4 new file mode 100644 index 000000000..4ed997959 --- /dev/null +++ b/pysparkling/sql/ast/grammar/SqlBase.g4 @@ -0,0 +1,1829 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is an adaptation of Presto's presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 grammar. + */ + +grammar SqlBase; + +@members { +""" +When false, INTERSECT is given the greater precedence over the other set +operations (UNION, EXCEPT and MINUS) as per the SQL standard. +""" +legacy_setops_precedence_enbled = False + +""" +When false, a literal with an exponent would be converted into +double type rather than decimal type. +""" +legacy_exponent_literal_as_decimal_enabled = False + +""" +When false, CREATE TABLE syntax without a provider will use +the value of spark.sql.sources.default as its provider. +""" +legacy_create_hive_table_by_default_enabled = False + +""" +When true, the behavior of keywords follows ANSI SQL standard. +""" +SQL_standard_keyword_behavior = False + +def isValidDecimal(self): + """ + Verify whether current token is a valid decimal token (which contains dot). + Returns true if the character that follows the token is not a digit or letter or underscore. + + For example: + For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. + For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. + For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. + For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed + by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' + which is not a digit or letter or underscore. + """ + nextChar = self._input.LA(1) + if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': + return False + else: + return True + +def isHint(self): + """ + This method will be called when we see '/*' and try to match it as a bracketed comment. + If the next character is '+', it should be parsed as hint later, and we cannot match + it as a bracketed comment. + + Returns true if the next character is '+'. + """ + nextChar = self._input.LA(1) + if nextChar == '+': + return True + else: + return False +} + +singleStatement + : statement ';'* EOF + ; + +singleExpression + : namedExpression EOF + ; + +singleTableIdentifier + : tableIdentifier EOF + ; + +singleMultipartIdentifier + : multipartIdentifier EOF + ; + +singleFunctionIdentifier + : functionIdentifier EOF + ; + +singleDataType + : dataType EOF + ; + +singleTableSchema + : colTypeList EOF + ; + +statement + : query #statementDefault + | ctes? dmlStatementNoWith #dmlStatement + | USE NAMESPACE? multipartIdentifier #use + | CREATE namespace (IF NOT EXISTS)? multipartIdentifier + (commentSpec | + locationSpec | + (WITH (DBPROPERTIES | PROPERTIES) tablePropertyList))* #createNamespace + | ALTER namespace multipartIdentifier + SET (DBPROPERTIES | PROPERTIES) tablePropertyList #setNamespaceProperties + | ALTER namespace multipartIdentifier + SET locationSpec #setNamespaceLocation + | DROP namespace (IF EXISTS)? multipartIdentifier + (RESTRICT | CASCADE)? #dropNamespace + | SHOW (DATABASES | NAMESPACES) ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showNamespaces + | {not self.legacy_create_hive_table_by_default_enabled}? + createTableHeader ('(' colTypeList ')')? tableProvider? + createTableClauses + (AS? query)? #createTable + | {self.legacy_create_hive_table_by_default_enabled}? + createTableHeader ('(' colTypeList ')')? tableProvider + createTableClauses + (AS? query)? #createTable + | createTableHeader ('(' columns=colTypeList ')')? + (commentSpec | + (PARTITIONED BY '(' partitionColumns=colTypeList ')' | + PARTITIONED BY partitionColumnNames=identifierList) | + bucketSpec | + skewSpec | + rowFormat | + createFileFormat | + locationSpec | + (TBLPROPERTIES tableProps=tablePropertyList))* + (AS? query)? #createHiveTable + | CREATE TABLE (IF NOT EXISTS)? target=tableIdentifier + LIKE source=tableIdentifier + (tableProvider | + rowFormat | + createFileFormat | + locationSpec | + (TBLPROPERTIES tableProps=tablePropertyList))* #createTableLike + | replaceTableHeader ('(' colTypeList ')')? tableProvider + createTableClauses + (AS? query)? #replaceTable + | ANALYZE TABLE multipartIdentifier partitionSpec? COMPUTE STATISTICS + (identifier | FOR COLUMNS identifierSeq | FOR ALL COLUMNS)? #analyze + | ALTER TABLE multipartIdentifier + ADD (COLUMN | COLUMNS) + columns=qualifiedColTypeWithPositionList #addTableColumns + | ALTER TABLE multipartIdentifier + ADD (COLUMN | COLUMNS) + '(' columns=qualifiedColTypeWithPositionList ')' #addTableColumns + | ALTER TABLE table=multipartIdentifier + RENAME COLUMN + from_=multipartIdentifier TO to=errorCapturingIdentifier #renameTableColumn + | ALTER TABLE multipartIdentifier + DROP (COLUMN | COLUMNS) + '(' columns=multipartIdentifierList ')' #dropTableColumns + | ALTER TABLE multipartIdentifier + DROP (COLUMN | COLUMNS) columns=multipartIdentifierList #dropTableColumns + | ALTER (TABLE | VIEW) from_=multipartIdentifier + RENAME TO to=multipartIdentifier #renameTable + | ALTER (TABLE | VIEW) multipartIdentifier + SET TBLPROPERTIES tablePropertyList #setTableProperties + | ALTER (TABLE | VIEW) multipartIdentifier + UNSET TBLPROPERTIES (IF EXISTS)? tablePropertyList #unsetTableProperties + | ALTER TABLE table=multipartIdentifier + (ALTER | CHANGE) COLUMN? column=multipartIdentifier + alterColumnAction? #alterTableAlterColumn + | ALTER TABLE table=multipartIdentifier partitionSpec? + CHANGE COLUMN? + colName=multipartIdentifier colType colPosition? #hiveChangeColumn + | ALTER TABLE table=multipartIdentifier partitionSpec? + REPLACE COLUMNS + '(' columns=qualifiedColTypeWithPositionList ')' #hiveReplaceColumns + | ALTER TABLE multipartIdentifier (partitionSpec)? + SET SERDE STRING (WITH SERDEPROPERTIES tablePropertyList)? #setTableSerDe + | ALTER TABLE multipartIdentifier (partitionSpec)? + SET SERDEPROPERTIES tablePropertyList #setTableSerDe + | ALTER (TABLE | VIEW) multipartIdentifier ADD (IF NOT EXISTS)? + partitionSpecLocation+ #addTablePartition + | ALTER TABLE multipartIdentifier + from_=partitionSpec RENAME TO to=partitionSpec #renameTablePartition + | ALTER (TABLE | VIEW) multipartIdentifier + DROP (IF EXISTS)? partitionSpec (',' partitionSpec)* PURGE? #dropTablePartitions + | ALTER TABLE multipartIdentifier + (partitionSpec)? SET locationSpec #setTableLocation + | ALTER TABLE multipartIdentifier RECOVER PARTITIONS #recoverPartitions + | DROP TABLE (IF EXISTS)? multipartIdentifier PURGE? #dropTable + | DROP VIEW (IF EXISTS)? multipartIdentifier #dropView + | CREATE (OR REPLACE)? (GLOBAL? TEMPORARY)? + VIEW (IF NOT EXISTS)? multipartIdentifier + identifierCommentList? + (commentSpec | + (PARTITIONED ON identifierList) | + (TBLPROPERTIES tablePropertyList))* + AS query #createView + | CREATE (OR REPLACE)? GLOBAL? TEMPORARY VIEW + tableIdentifier ('(' colTypeList ')')? tableProvider + (OPTIONS tablePropertyList)? #createTempViewUsing + | ALTER VIEW multipartIdentifier AS? query #alterViewQuery + | CREATE (OR REPLACE)? TEMPORARY? FUNCTION (IF NOT EXISTS)? + multipartIdentifier AS className=STRING + (USING resource (',' resource)*)? #createFunction + | DROP TEMPORARY? FUNCTION (IF EXISTS)? multipartIdentifier #dropFunction + | EXPLAIN (LOGICAL | FORMATTED | EXTENDED | CODEGEN | COST)? + statement #explain + | SHOW TABLES ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showTables + | SHOW TABLE EXTENDED ((FROM | IN) ns=multipartIdentifier)? + LIKE pattern=STRING partitionSpec? #showTable + | SHOW TBLPROPERTIES table=multipartIdentifier + ('(' key=tablePropertyKey ')')? #showTblProperties + | SHOW COLUMNS (FROM | IN) table=multipartIdentifier + ((FROM | IN) ns=multipartIdentifier)? #showColumns + | SHOW VIEWS ((FROM | IN) multipartIdentifier)? + (LIKE? pattern=STRING)? #showViews + | SHOW PARTITIONS multipartIdentifier partitionSpec? #showPartitions + | SHOW identifier? FUNCTIONS + (LIKE? (multipartIdentifier | pattern=STRING))? #showFunctions + | SHOW CREATE TABLE multipartIdentifier (AS SERDE)? #showCreateTable + | SHOW CURRENT NAMESPACE #showCurrentNamespace + | (DESC | DESCRIBE) FUNCTION EXTENDED? describeFuncName #describeFunction + | (DESC | DESCRIBE) namespace EXTENDED? + multipartIdentifier #describeNamespace + | (DESC | DESCRIBE) TABLE? option=(EXTENDED | FORMATTED)? + multipartIdentifier partitionSpec? describeColName? #describeRelation + | (DESC | DESCRIBE) QUERY? query #describeQuery + | COMMENT ON namespace multipartIdentifier IS + comment=(STRING | NULL) #commentNamespace + | COMMENT ON TABLE multipartIdentifier IS comment=(STRING | NULL) #commentTable + | REFRESH TABLE multipartIdentifier #refreshTable + | REFRESH (STRING | .*?) #refreshResource + | CACHE LAZY? TABLE multipartIdentifier + (OPTIONS options=tablePropertyList)? (AS? query)? #cacheTable + | UNCACHE TABLE (IF EXISTS)? multipartIdentifier #uncacheTable + | CLEAR CACHE #clearCache + | LOAD DATA LOCAL? INPATH path=STRING OVERWRITE? INTO TABLE + multipartIdentifier partitionSpec? #loadData + | TRUNCATE TABLE multipartIdentifier partitionSpec? #truncateTable + | MSCK REPAIR TABLE multipartIdentifier #repairTable + | op=(ADD | LIST) identifier (STRING | .*?) #manageResource + | SET ROLE .*? #failNativeCommand + | SET .*? #setConfiguration + | RESET #resetConfiguration + | unsupportedHiveNativeCommands .*? #failNativeCommand + ; + +unsupportedHiveNativeCommands + : kw1=CREATE kw2=ROLE + | kw1=DROP kw2=ROLE + | kw1=GRANT kw2=ROLE? + | kw1=REVOKE kw2=ROLE? + | kw1=SHOW kw2=GRANT + | kw1=SHOW kw2=ROLE kw3=GRANT? + | kw1=SHOW kw2=PRINCIPALS + | kw1=SHOW kw2=ROLES + | kw1=SHOW kw2=CURRENT kw3=ROLES + | kw1=EXPORT kw2=TABLE + | kw1=IMPORT kw2=TABLE + | kw1=SHOW kw2=COMPACTIONS + | kw1=SHOW kw2=CREATE kw3=TABLE + | kw1=SHOW kw2=TRANSACTIONS + | kw1=SHOW kw2=INDEXES + | kw1=SHOW kw2=LOCKS + | kw1=CREATE kw2=INDEX + | kw1=DROP kw2=INDEX + | kw1=ALTER kw2=INDEX + | kw1=LOCK kw2=TABLE + | kw1=LOCK kw2=DATABASE + | kw1=UNLOCK kw2=TABLE + | kw1=UNLOCK kw2=DATABASE + | kw1=CREATE kw2=TEMPORARY kw3=MACRO + | kw1=DROP kw2=TEMPORARY kw3=MACRO + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=CLUSTERED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=CLUSTERED kw4=BY + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SORTED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=SKEWED kw4=BY + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SKEWED + | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=STORED kw5=AS kw6=DIRECTORIES + | kw1=ALTER kw2=TABLE tableIdentifier kw3=SET kw4=SKEWED kw5=LOCATION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=EXCHANGE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=ARCHIVE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=UNARCHIVE kw4=PARTITION + | kw1=ALTER kw2=TABLE tableIdentifier kw3=TOUCH + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=COMPACT + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=CONCATENATE + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=SET kw4=FILEFORMAT + | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=REPLACE kw4=COLUMNS + | kw1=START kw2=TRANSACTION + | kw1=COMMIT + | kw1=ROLLBACK + | kw1=DFS + ; + +createTableHeader + : CREATE TEMPORARY? EXTERNAL? TABLE (IF NOT EXISTS)? multipartIdentifier + ; + +replaceTableHeader + : (CREATE OR)? REPLACE TABLE multipartIdentifier + ; + +bucketSpec + : CLUSTERED BY identifierList + (SORTED BY orderedIdentifierList)? + INTO INTEGER_VALUE BUCKETS + ; + +skewSpec + : SKEWED BY identifierList + ON (constantList | nestedConstantList) + (STORED AS DIRECTORIES)? + ; + +locationSpec + : LOCATION STRING + ; + +commentSpec + : COMMENT STRING + ; + +query + : ctes? queryTerm queryOrganization + ; + +insertInto + : INSERT OVERWRITE TABLE? multipartIdentifier (partitionSpec (IF NOT EXISTS)?)? #insertOverwriteTable + | INSERT INTO TABLE? multipartIdentifier partitionSpec? (IF NOT EXISTS)? #insertIntoTable + | INSERT OVERWRITE LOCAL? DIRECTORY path=STRING rowFormat? createFileFormat? #insertOverwriteHiveDir + | INSERT OVERWRITE LOCAL? DIRECTORY (path=STRING)? tableProvider (OPTIONS options=tablePropertyList)? #insertOverwriteDir + ; + +partitionSpecLocation + : partitionSpec locationSpec? + ; + +partitionSpec + : PARTITION '(' partitionVal (',' partitionVal)* ')' + ; + +partitionVal + : identifier (EQ constant)? + ; + +namespace + : NAMESPACE + | DATABASE + | SCHEMA + ; + +describeFuncName + : qualifiedName + | STRING + | comparisonOperator + | arithmeticOperator + | predicateOperator + ; + +describeColName + : nameParts+=identifier ('.' nameParts+=identifier)* + ; + +ctes + : WITH namedQuery (',' namedQuery)* + ; + +namedQuery + : name=errorCapturingIdentifier (columnAliases=identifierList)? AS? '(' query ')' + ; + +tableProvider + : USING multipartIdentifier + ; + +createTableClauses + :((OPTIONS options=tablePropertyList) | + (PARTITIONED BY partitioning=transformList) | + bucketSpec | + locationSpec | + commentSpec | + (TBLPROPERTIES tableProps=tablePropertyList))* + ; + +tablePropertyList + : '(' tableProperty (',' tableProperty)* ')' + ; + +tableProperty + : key=tablePropertyKey (EQ? value=tablePropertyValue)? + ; + +tablePropertyKey + : identifier ('.' identifier)* + | STRING + ; + +tablePropertyValue + : INTEGER_VALUE + | DECIMAL_VALUE + | booleanValue + | STRING + ; + +constantList + : '(' constant (',' constant)* ')' + ; + +nestedConstantList + : '(' constantList (',' constantList)* ')' + ; + +createFileFormat + : STORED AS fileFormat + | STORED BY storageHandler + ; + +fileFormat + : INPUTFORMAT inFmt=STRING OUTPUTFORMAT outFmt=STRING #tableFileFormat + | identifier #genericFileFormat + ; + +storageHandler + : STRING (WITH SERDEPROPERTIES tablePropertyList)? + ; + +resource + : identifier STRING + ; + +dmlStatementNoWith + : insertInto queryTerm queryOrganization #singleInsertQuery + | fromClause multiInsertQueryBody+ #multiInsertQuery + | DELETE FROM multipartIdentifier tableAlias whereClause? #deleteFromTable + | UPDATE multipartIdentifier tableAlias setClause whereClause? #updateTable + | MERGE INTO target=multipartIdentifier targetAlias=tableAlias + USING (source=multipartIdentifier | + '(' sourceQuery=query')') sourceAlias=tableAlias + ON mergeCondition=booleanExpression + matchedClause* + notMatchedClause* #mergeIntoTable + ; + +queryOrganization + : (ORDER BY order+=sortItem (',' order+=sortItem)*)? + (CLUSTER BY clusterBy+=expression (',' clusterBy+=expression)*)? + (DISTRIBUTE BY distributeBy+=expression (',' distributeBy+=expression)*)? + (SORT BY sort+=sortItem (',' sort+=sortItem)*)? + windowClause? + (LIMIT (ALL | limit=expression))? + ; + +multiInsertQueryBody + : insertInto fromStatementBody + ; + +queryTerm + : queryPrimary #queryTermDefault + | left=queryTerm {self.legacy_setops_precedence_enbled}? + operator=(INTERSECT | UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation + | left=queryTerm {not self.legacy_setops_precedence_enbled}? + operator=INTERSECT setQuantifier? right=queryTerm #setOperation + | left=queryTerm {not self.legacy_setops_precedence_enbled}? + operator=(UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation + ; + +queryPrimary + : querySpecification #queryPrimaryDefault + | fromStatement #fromStmt + | TABLE multipartIdentifier #table + | inlineTable #inlineTableDefault1 + | '(' query ')' #subquery + ; + +sortItem + : expression ordering=(ASC | DESC)? (NULLS nullOrder=(LAST | FIRST))? + ; + +fromStatement + : fromClause fromStatementBody+ + ; + +fromStatementBody + : transformClause + whereClause? + queryOrganization + | selectClause + lateralView* + whereClause? + aggregationClause? + havingClause? + windowClause? + queryOrganization + ; + +querySpecification + : transformClause + fromClause? + whereClause? #transformQuerySpecification + | selectClause + fromClause? + lateralView* + whereClause? + aggregationClause? + havingClause? + windowClause? #regularQuerySpecification + ; + +transformClause + : (SELECT kind=TRANSFORM '(' namedExpressionSeq ')' + | kind=MAP namedExpressionSeq + | kind=REDUCE namedExpressionSeq) + inRowFormat=rowFormat? + (RECORDWRITER recordWriter=STRING)? + USING script=STRING + (AS (identifierSeq | colTypeList | ('(' (identifierSeq | colTypeList) ')')))? + outRowFormat=rowFormat? + (RECORDREADER recordReader=STRING)? + ; + +selectClause + : SELECT (hints+=hint)* setQuantifier? namedExpressionSeq + ; + +setClause + : SET assignmentList + ; + +matchedClause + : WHEN MATCHED (AND matchedCond=booleanExpression)? THEN matchedAction + ; +notMatchedClause + : WHEN NOT MATCHED (AND notMatchedCond=booleanExpression)? THEN notMatchedAction + ; + +matchedAction + : DELETE + | UPDATE SET ASTERISK + | UPDATE SET assignmentList + ; + +notMatchedAction + : INSERT ASTERISK + | INSERT '(' columns=multipartIdentifierList ')' + VALUES '(' expression (',' expression)* ')' + ; + +assignmentList + : assignment (',' assignment)* + ; + +assignment + : key=multipartIdentifier EQ value=expression + ; + +whereClause + : WHERE booleanExpression + ; + +havingClause + : HAVING booleanExpression + ; + +hint + : '/*+' hintStatements+=hintStatement (','? hintStatements+=hintStatement)* '*/' + ; + +hintStatement + : hintName=identifier + | hintName=identifier '(' parameters+=primaryExpression (',' parameters+=primaryExpression)* ')' + ; + +fromClause + : FROM relation (',' relation)* lateralView* pivotClause? + ; + +aggregationClause + : GROUP BY groupingExpressions+=expression (',' groupingExpressions+=expression)* ( + WITH kind=ROLLUP + | WITH kind=CUBE + | kind=GROUPING SETS '(' groupingSet (',' groupingSet)* ')')? + | GROUP BY kind=GROUPING SETS '(' groupingSet (',' groupingSet)* ')' + ; + +groupingSet + : '(' (expression (',' expression)*)? ')' + | expression + ; + +pivotClause + : PIVOT '(' aggregates=namedExpressionSeq FOR pivotColumn IN '(' pivotValues+=pivotValue (',' pivotValues+=pivotValue)* ')' ')' + ; + +pivotColumn + : identifiers+=identifier + | '(' identifiers+=identifier (',' identifiers+=identifier)* ')' + ; + +pivotValue + : expression (AS? identifier)? + ; + +lateralView + : LATERAL VIEW (OUTER)? qualifiedName '(' (expression (',' expression)*)? ')' tblName=identifier (AS? colName+=identifier (',' colName+=identifier)*)? + ; + +setQuantifier + : DISTINCT + | ALL + ; + +relation + : relationPrimary joinRelation* + ; + +joinRelation + : (joinType) JOIN right=relationPrimary joinCriteria? + | NATURAL joinType JOIN right=relationPrimary + ; + +joinType + : INNER? + | CROSS + | LEFT OUTER? + | LEFT? SEMI + | RIGHT OUTER? + | FULL OUTER? + | LEFT? ANTI + ; + +joinCriteria + : ON booleanExpression + | USING identifierList + ; + +sample + : TABLESAMPLE '(' sampleMethod? ')' + ; + +sampleMethod + : negativeSign=MINUS? percentage=(INTEGER_VALUE | DECIMAL_VALUE) PERCENTLIT #sampleByPercentile + | expression ROWS #sampleByRows + | sampleType=BUCKET numerator=INTEGER_VALUE OUT OF denominator=INTEGER_VALUE + (ON (identifier | qualifiedName '(' ')'))? #sampleByBucket + | bytes=expression #sampleByBytes + ; + +identifierList + : '(' identifierSeq ')' + ; + +identifierSeq + : ident+=errorCapturingIdentifier (',' ident+=errorCapturingIdentifier)* + ; + +orderedIdentifierList + : '(' orderedIdentifier (',' orderedIdentifier)* ')' + ; + +orderedIdentifier + : ident=errorCapturingIdentifier ordering=(ASC | DESC)? + ; + +identifierCommentList + : '(' identifierComment (',' identifierComment)* ')' + ; + +identifierComment + : identifier commentSpec? + ; + +relationPrimary + : multipartIdentifier sample? tableAlias #tableName + | '(' query ')' sample? tableAlias #aliasedQuery + | '(' relation ')' sample? tableAlias #aliasedRelation + | inlineTable #inlineTableDefault2 + | functionTable #tableValuedFunction + ; + +inlineTable + : VALUES expression (',' expression)* tableAlias + ; + +functionTable + : funcName=errorCapturingIdentifier '(' (expression (',' expression)*)? ')' tableAlias + ; + +tableAlias + : (AS? strictIdentifier identifierList?)? + ; + +rowFormat + : ROW FORMAT SERDE name=STRING (WITH SERDEPROPERTIES props=tablePropertyList)? #rowFormatSerde + | ROW FORMAT DELIMITED + (FIELDS TERMINATED BY fieldsTerminatedBy=STRING (ESCAPED BY escapedBy=STRING)?)? + (COLLECTION ITEMS TERMINATED BY collectionItemsTerminatedBy=STRING)? + (MAP KEYS TERMINATED BY keysTerminatedBy=STRING)? + (LINES TERMINATED BY linesSeparatedBy=STRING)? + (NULL DEFINED AS nullDefinedAs=STRING)? #rowFormatDelimited + ; + +multipartIdentifierList + : multipartIdentifier (',' multipartIdentifier)* + ; + +multipartIdentifier + : parts+=errorCapturingIdentifier ('.' parts+=errorCapturingIdentifier)* + ; + +tableIdentifier + : (db=errorCapturingIdentifier '.')? table=errorCapturingIdentifier + ; + +functionIdentifier + : (db=errorCapturingIdentifier '.')? function=errorCapturingIdentifier + ; + +namedExpression + : expression (AS? (name=errorCapturingIdentifier | identifierList))? + ; + +namedExpressionSeq + : namedExpression (',' namedExpression)* + ; + +transformList + : '(' transforms+=transform (',' transforms+=transform)* ')' + ; + +transform + : qualifiedName #identityTransform + | transformName=identifier + '(' argument+=transformArgument (',' argument+=transformArgument)* ')' #applyTransform + ; + +transformArgument + : qualifiedName + | constant + ; + +expression + : booleanExpression + ; + +booleanExpression + : NOT booleanExpression #logicalNot + | EXISTS '(' query ')' #exists + | valueExpression predicate? #predicated + | left=booleanExpression operator=AND right=booleanExpression #logicalBinary + | left=booleanExpression operator=OR right=booleanExpression #logicalBinary + ; + +predicate + : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression + | NOT? kind=IN '(' expression (',' expression)* ')' + | NOT? kind=IN '(' query ')' + | NOT? kind=RLIKE pattern=valueExpression + | NOT? kind=LIKE quantifier=(ANY | SOME | ALL) ('('')' | '(' expression (',' expression)* ')') + | NOT? kind=LIKE pattern=valueExpression (ESCAPE escapeChar=STRING)? + | IS NOT? kind=NULL + | IS NOT? kind=(TRUE | FALSE | UNKNOWN) + | IS NOT? kind=DISTINCT FROM right=valueExpression + ; + +valueExpression + : primaryExpression #valueExpressionDefault + | operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary + | left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary + | left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression #arithmeticBinary + | left=valueExpression operator=AMPERSAND right=valueExpression #arithmeticBinary + | left=valueExpression operator=HAT right=valueExpression #arithmeticBinary + | left=valueExpression operator=PIPE right=valueExpression #arithmeticBinary + | left=valueExpression comparisonOperator right=valueExpression #comparison + ; + +primaryExpression + : name=(CURRENT_DATE | CURRENT_TIMESTAMP) #currentDatetime + | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase + | CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase + | CAST '(' expression AS dataType ')' #cast + | STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct + | FIRST '(' expression (IGNORE NULLS)? ')' #first + | LAST '(' expression (IGNORE NULLS)? ')' #last + | POSITION '(' substr=valueExpression IN str=valueExpression ')' #position + | constant #constantDefault + | ASTERISK #star + | qualifiedName '.' ASTERISK #star + | '(' namedExpression (',' namedExpression)+ ')' #rowConstructor + | '(' query ')' #subqueryExpression + | functionName '(' (setQuantifier? argument+=expression (',' argument+=expression)*)? ')' + (FILTER '(' WHERE where=booleanExpression ')')? (OVER windowSpec)? #functionCall + | identifier '->' expression #lambda + | '(' identifier (',' identifier)+ ')' '->' expression #lambda + | value=primaryExpression '[' index=valueExpression ']' #subscript + | identifier #columnReference + | base=primaryExpression '.' fieldName=identifier #dereference + | '(' expression ')' #parenthesizedExpression + | EXTRACT '(' field=identifier FROM source=valueExpression ')' #extract + | (SUBSTR | SUBSTRING) '(' str=valueExpression (FROM | ',') pos=valueExpression + ((FOR | ',') len=valueExpression)? ')' #substring + | TRIM '(' trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)? + FROM srcStr=valueExpression ')' #trim + | OVERLAY '(' input=valueExpression PLACING replace=valueExpression + FROM position=valueExpression (FOR length=valueExpression)? ')' #overlay + ; + +constant + : NULL #nullLiteral + | interval #intervalLiteral + | identifier STRING #typeConstructor + | number #numericLiteral + | booleanValue #booleanLiteral + | STRING+ #stringLiteral + ; + +comparisonOperator + : EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ + ; + +arithmeticOperator + : PLUS | MINUS | ASTERISK | SLASH | PERCENT | DIV | TILDE | AMPERSAND | PIPE | CONCAT_PIPE | HAT + ; + +predicateOperator + : OR | AND | IN | NOT + ; + +booleanValue + : TRUE | FALSE + ; + +interval + : INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)? + ; + +errorCapturingMultiUnitsInterval + : multiUnitsInterval unitToUnitInterval? + ; + +multiUnitsInterval + : (intervalValue intervalUnit)+ + ; + +errorCapturingUnitToUnitInterval + : body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)? + ; + +unitToUnitInterval + : value=intervalValue from_=intervalUnit TO to=intervalUnit + ; + +intervalValue + : (PLUS | MINUS)? (INTEGER_VALUE | DECIMAL_VALUE) + | STRING + ; + +intervalUnit + : DAY + | HOUR + | MINUTE + | MONTH + | SECOND + | YEAR + | identifier + ; + +colPosition + : position=FIRST | position=AFTER afterCol=errorCapturingIdentifier + ; + +dataType + : complex=ARRAY '<' dataType '>' #complexDataType + | complex=MAP '<' dataType ',' dataType '>' #complexDataType + | complex=STRUCT ('<' complexColTypeList? '>' | NEQ) #complexDataType + | identifier ('(' INTEGER_VALUE (',' INTEGER_VALUE)* ')')? #primitiveDataType + ; + +qualifiedColTypeWithPositionList + : qualifiedColTypeWithPosition (',' qualifiedColTypeWithPosition)* + ; + +qualifiedColTypeWithPosition + : name=multipartIdentifier dataType (NOT NULL)? commentSpec? colPosition? + ; + +colTypeList + : colType (',' colType)* + ; + +colType + : colName=errorCapturingIdentifier dataType (NOT NULL)? commentSpec? + ; + +complexColTypeList + : complexColType (',' complexColType)* + ; + +complexColType + : identifier ':' dataType (NOT NULL)? commentSpec? + ; + +whenClause + : WHEN condition=expression THEN result=expression + ; + +windowClause + : WINDOW namedWindow (',' namedWindow)* + ; + +namedWindow + : name=errorCapturingIdentifier AS windowSpec + ; + +windowSpec + : name=errorCapturingIdentifier #windowRef + | '('name=errorCapturingIdentifier')' #windowRef + | '(' + ( CLUSTER BY partition+=expression (',' partition+=expression)* + | ((PARTITION | DISTRIBUTE) BY partition+=expression (',' partition+=expression)*)? + ((ORDER | SORT) BY sortItem (',' sortItem)*)?) + windowFrame? + ')' #windowDef + ; + +windowFrame + : frameType=RANGE start=frameBound + | frameType=ROWS start=frameBound + | frameType=RANGE BETWEEN start=frameBound AND end=frameBound + | frameType=ROWS BETWEEN start=frameBound AND end=frameBound + ; + +frameBound + : UNBOUNDED boundType=(PRECEDING | FOLLOWING) + | boundType=CURRENT ROW + | expression boundType=(PRECEDING | FOLLOWING) + ; + +qualifiedNameList + : qualifiedName (',' qualifiedName)* + ; + +functionName + : qualifiedName + | FILTER + | LEFT + | RIGHT + ; + +qualifiedName + : identifier ('.' identifier)* + ; + +// this rule is used for explicitly capturing wrong identifiers such as test-table, which should actually be `test-table` +// replace identifier with errorCapturingIdentifier where the immediate follow symbol is not an expression, otherwise +// valid expressions such as "a-b" can be recognized as an identifier +errorCapturingIdentifier + : identifier errorCapturingIdentifierExtra + ; + +// extra left-factoring grammar +errorCapturingIdentifierExtra + : (MINUS identifier)+ #errorIdent + | #realIdent + ; + +identifier + : strictIdentifier + | {not self.SQL_standard_keyword_behavior}? strictNonReserved + ; + +strictIdentifier + : IDENTIFIER #unquotedIdentifier + | quotedIdentifier #quotedIdentifierAlternative + | {self.SQL_standard_keyword_behavior}? ansiNonReserved #unquotedIdentifier + | {not self.SQL_standard_keyword_behavior}? nonReserved #unquotedIdentifier + ; + +quotedIdentifier + : BACKQUOTED_IDENTIFIER + ; + +number + : {not self.legacy_exponent_literal_as_decimal_enabled}? MINUS? EXPONENT_VALUE #exponentLiteral + | {not self.legacy_exponent_literal_as_decimal_enabled}? MINUS? DECIMAL_VALUE #decimalLiteral + | {self.legacy_exponent_literal_as_decimal_enabled}? MINUS? (EXPONENT_VALUE | DECIMAL_VALUE) #legacyDecimalLiteral + | MINUS? INTEGER_VALUE #integerLiteral + | MINUS? BIGINT_LITERAL #bigIntLiteral + | MINUS? SMALLINT_LITERAL #smallIntLiteral + | MINUS? TINYINT_LITERAL #tinyIntLiteral + | MINUS? DOUBLE_LITERAL #doubleLiteral + | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral + ; + +alterColumnAction + : TYPE dataType + | commentSpec + | colPosition + | setOrDrop=(SET | DROP) NOT NULL + ; + +// When `SQL_standard_keyword_behavior=true`, there are 2 kinds of keywords in Spark SQL. +// - Reserved keywords: +// Keywords that are reserved and can't be used as identifiers for table, view, column, +// function, alias, etc. +// - Non-reserved keywords: +// Keywords that have a special meaning only in particular contexts and can be used as +// identifiers in other contexts. For example, `EXPLAIN SELECT ...` is a command, but EXPLAIN +// can be used as identifiers in other places. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The non-reserved keywords are listed below. Keywords not in this list are reserved keywords. +ansiNonReserved + : ADD + | AFTER + | ALTER + | ANALYZE + | ARCHIVE + | ARRAY + | ASC + | AT + | BETWEEN + | BUCKET + | BUCKETS + | BY + | CACHE + | CASCADE + | CHANGE + | CLEAR + | CLUSTER + | CLUSTERED + | CODEGEN + | COLLECTION + | COLUMNS + | COMMENT + | COMMIT + | COMPACT + | COMPACTIONS + | COMPUTE + | CONCATENATE + | COST + | CUBE + | CURRENT + | DATA + | DATABASE + | DATABASES + | DBPROPERTIES + | DEFINED + | DELETE + | DELIMITED + | DESC + | DESCRIBE + | DFS + | DIRECTORIES + | DIRECTORY + | DISTRIBUTE + | DIV + | DROP + | ESCAPED + | EXCHANGE + | EXISTS + | EXPLAIN + | EXPORT + | EXTENDED + | EXTERNAL + | EXTRACT + | FIELDS + | FILEFORMAT + | FIRST + | FOLLOWING + | FORMAT + | FORMATTED + | FUNCTION + | FUNCTIONS + | GLOBAL + | GROUPING + | IF + | IGNORE + | IMPORT + | INDEX + | INDEXES + | INPATH + | INPUTFORMAT + | INSERT + | INTERVAL + | ITEMS + | KEYS + | LAST + | LATERAL + | LAZY + | LIKE + | LIMIT + | LINES + | LIST + | LOAD + | LOCAL + | LOCATION + | LOCK + | LOCKS + | LOGICAL + | MACRO + | MAP + | MATCHED + | MERGE + | MSCK + | NAMESPACE + | NAMESPACES + | NO + | NULLS + | OF + | OPTION + | OPTIONS + | OUT + | OUTPUTFORMAT + | OVER + | OVERLAY + | OVERWRITE + | PARTITION + | PARTITIONED + | PARTITIONS + | PERCENTLIT + | PIVOT + | PLACING + | POSITION + | PRECEDING + | PRINCIPALS + | PROPERTIES + | PURGE + | QUERY + | RANGE + | RECORDREADER + | RECORDWRITER + | RECOVER + | REDUCE + | REFRESH + | RENAME + | REPAIR + | REPLACE + | RESET + | RESTRICT + | REVOKE + | RLIKE + | ROLE + | ROLES + | ROLLBACK + | ROLLUP + | ROW + | ROWS + | SCHEMA + | SEPARATED + | SERDE + | SERDEPROPERTIES + | SET + | SETS + | SHOW + | SKEWED + | SORT + | SORTED + | START + | STATISTICS + | STORED + | STRATIFY + | STRUCT + | SUBSTR + | SUBSTRING + | TABLES + | TABLESAMPLE + | TBLPROPERTIES + | TEMPORARY + | TERMINATED + | TOUCH + | TRANSACTION + | TRANSACTIONS + | TRANSFORM + | TRIM + | TRUE + | TRUNCATE + | UNARCHIVE + | UNBOUNDED + | UNCACHE + | UNLOCK + | UNSET + | UPDATE + | USE + | VALUES + | VIEW + | VIEWS + | WINDOW + ; + +// When `SQL_standard_keyword_behavior=false`, there are 2 kinds of keywords in Spark SQL. +// - Non-reserved keywords: +// Same definition as the one when `SQL_standard_keyword_behavior=true`. +// - Strict-non-reserved keywords: +// A strict version of non-reserved keywords, which can not be used as table alias. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The strict-non-reserved keywords are listed in `strictNonReserved`. +// The non-reserved keywords are listed in `nonReserved`. +// These 2 together contain all the keywords. +strictNonReserved + : ANTI + | CROSS + | EXCEPT + | FULL + | INNER + | INTERSECT + | JOIN + | LEFT + | NATURAL + | ON + | RIGHT + | SEMI + | SETMINUS + | UNION + | USING + ; + +nonReserved + : ADD + | AFTER + | ALL + | ALTER + | ANALYZE + | AND + | ANY + | ARCHIVE + | ARRAY + | AS + | ASC + | AT + | AUTHORIZATION + | BETWEEN + | BOTH + | BUCKET + | BUCKETS + | BY + | CACHE + | CASCADE + | CASE + | CAST + | CHANGE + | CHECK + | CLEAR + | CLUSTER + | CLUSTERED + | CODEGEN + | COLLATE + | COLLECTION + | COLUMN + | COLUMNS + | COMMENT + | COMMIT + | COMPACT + | COMPACTIONS + | COMPUTE + | CONCATENATE + | CONSTRAINT + | COST + | CREATE + | CUBE + | CURRENT + | CURRENT_DATE + | CURRENT_TIME + | CURRENT_TIMESTAMP + | CURRENT_USER + | DATA + | DATABASE + | DATABASES + | DAY + | DBPROPERTIES + | DEFINED + | DELETE + | DELIMITED + | DESC + | DESCRIBE + | DFS + | DIRECTORIES + | DIRECTORY + | DISTINCT + | DISTRIBUTE + | DIV + | DROP + | ELSE + | END + | ESCAPE + | ESCAPED + | EXCHANGE + | EXISTS + | EXPLAIN + | EXPORT + | EXTENDED + | EXTERNAL + | EXTRACT + | FALSE + | FETCH + | FILTER + | FIELDS + | FILEFORMAT + | FIRST + | FOLLOWING + | FOR + | FOREIGN + | FORMAT + | FORMATTED + | FROM + | FUNCTION + | FUNCTIONS + | GLOBAL + | GRANT + | GROUP + | GROUPING + | HAVING + | HOUR + | IF + | IGNORE + | IMPORT + | IN + | INDEX + | INDEXES + | INPATH + | INPUTFORMAT + | INSERT + | INTERVAL + | INTO + | IS + | ITEMS + | KEYS + | LAST + | LATERAL + | LAZY + | LEADING + | LIKE + | LIMIT + | LINES + | LIST + | LOAD + | LOCAL + | LOCATION + | LOCK + | LOCKS + | LOGICAL + | MACRO + | MAP + | MATCHED + | MERGE + | MINUTE + | MONTH + | MSCK + | NAMESPACE + | NAMESPACES + | NO + | NOT + | NULL + | NULLS + | OF + | ONLY + | OPTION + | OPTIONS + | OR + | ORDER + | OUT + | OUTER + | OUTPUTFORMAT + | OVER + | OVERLAPS + | OVERLAY + | OVERWRITE + | PARTITION + | PARTITIONED + | PARTITIONS + | PERCENTLIT + | PIVOT + | PLACING + | POSITION + | PRECEDING + | PRIMARY + | PRINCIPALS + | PROPERTIES + | PURGE + | QUERY + | RANGE + | RECORDREADER + | RECORDWRITER + | RECOVER + | REDUCE + | REFERENCES + | REFRESH + | RENAME + | REPAIR + | REPLACE + | RESET + | RESTRICT + | REVOKE + | RLIKE + | ROLE + | ROLES + | ROLLBACK + | ROLLUP + | ROW + | ROWS + | SCHEMA + | SECOND + | SELECT + | SEPARATED + | SERDE + | SERDEPROPERTIES + | SESSION_USER + | SET + | SETS + | SHOW + | SKEWED + | SOME + | SORT + | SORTED + | START + | STATISTICS + | STORED + | STRATIFY + | STRUCT + | SUBSTR + | SUBSTRING + | TABLE + | TABLES + | TABLESAMPLE + | TBLPROPERTIES + | TEMPORARY + | TERMINATED + | THEN + | TO + | TOUCH + | TRAILING + | TRANSACTION + | TRANSACTIONS + | TRANSFORM + | TRIM + | TRUE + | TRUNCATE + | TYPE + | UNARCHIVE + | UNBOUNDED + | UNCACHE + | UNIQUE + | UNKNOWN + | UNLOCK + | UNSET + | UPDATE + | USE + | USER + | VALUES + | VIEW + | VIEWS + | WHEN + | WHERE + | WINDOW + | WITH + | YEAR + ; + +// NOTE: If you add a new token in the list below, you should update the list of keywords +// in `docs/sql-keywords.md`. If the token is a non-reserved keyword, +// please update `ansiNonReserved` and `nonReserved` as well. + +//============================ +// Start of the keywords list +//============================ +ADD: 'ADD'; +AFTER: 'AFTER'; +ALL: 'ALL'; +ALTER: 'ALTER'; +ANALYZE: 'ANALYZE'; +AND: 'AND'; +ANTI: 'ANTI'; +ANY: 'ANY'; +ARCHIVE: 'ARCHIVE'; +ARRAY: 'ARRAY'; +AS: 'AS'; +ASC: 'ASC'; +AT: 'AT'; +AUTHORIZATION: 'AUTHORIZATION'; +BETWEEN: 'BETWEEN'; +BOTH: 'BOTH'; +BUCKET: 'BUCKET'; +BUCKETS: 'BUCKETS'; +BY: 'BY'; +CACHE: 'CACHE'; +CASCADE: 'CASCADE'; +CASE: 'CASE'; +CAST: 'CAST'; +CHANGE: 'CHANGE'; +CHECK: 'CHECK'; +CLEAR: 'CLEAR'; +CLUSTER: 'CLUSTER'; +CLUSTERED: 'CLUSTERED'; +CODEGEN: 'CODEGEN'; +COLLATE: 'COLLATE'; +COLLECTION: 'COLLECTION'; +COLUMN: 'COLUMN'; +COLUMNS: 'COLUMNS'; +COMMENT: 'COMMENT'; +COMMIT: 'COMMIT'; +COMPACT: 'COMPACT'; +COMPACTIONS: 'COMPACTIONS'; +COMPUTE: 'COMPUTE'; +CONCATENATE: 'CONCATENATE'; +CONSTRAINT: 'CONSTRAINT'; +COST: 'COST'; +CREATE: 'CREATE'; +CROSS: 'CROSS'; +CUBE: 'CUBE'; +CURRENT: 'CURRENT'; +CURRENT_DATE: 'CURRENT_DATE'; +CURRENT_TIME: 'CURRENT_TIME'; +CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; +CURRENT_USER: 'CURRENT_USER'; +DATA: 'DATA'; +DATABASE: 'DATABASE'; +DATABASES: 'DATABASES' | 'SCHEMAS'; +DAY: 'DAY'; +DBPROPERTIES: 'DBPROPERTIES'; +DEFINED: 'DEFINED'; +DELETE: 'DELETE'; +DELIMITED: 'DELIMITED'; +DESC: 'DESC'; +DESCRIBE: 'DESCRIBE'; +DFS: 'DFS'; +DIRECTORIES: 'DIRECTORIES'; +DIRECTORY: 'DIRECTORY'; +DISTINCT: 'DISTINCT'; +DISTRIBUTE: 'DISTRIBUTE'; +DROP: 'DROP'; +ELSE: 'ELSE'; +END: 'END'; +ESCAPE: 'ESCAPE'; +ESCAPED: 'ESCAPED'; +EXCEPT: 'EXCEPT'; +EXCHANGE: 'EXCHANGE'; +EXISTS: 'EXISTS'; +EXPLAIN: 'EXPLAIN'; +EXPORT: 'EXPORT'; +EXTENDED: 'EXTENDED'; +EXTERNAL: 'EXTERNAL'; +EXTRACT: 'EXTRACT'; +FALSE: 'FALSE'; +FETCH: 'FETCH'; +FIELDS: 'FIELDS'; +FILTER: 'FILTER'; +FILEFORMAT: 'FILEFORMAT'; +FIRST: 'FIRST'; +FOLLOWING: 'FOLLOWING'; +FOR: 'FOR'; +FOREIGN: 'FOREIGN'; +FORMAT: 'FORMAT'; +FORMATTED: 'FORMATTED'; +FROM: 'FROM'; +FULL: 'FULL'; +FUNCTION: 'FUNCTION'; +FUNCTIONS: 'FUNCTIONS'; +GLOBAL: 'GLOBAL'; +GRANT: 'GRANT'; +GROUP: 'GROUP'; +GROUPING: 'GROUPING'; +HAVING: 'HAVING'; +HOUR: 'HOUR'; +IF: 'IF'; +IGNORE: 'IGNORE'; +IMPORT: 'IMPORT'; +IN: 'IN'; +INDEX: 'INDEX'; +INDEXES: 'INDEXES'; +INNER: 'INNER'; +INPATH: 'INPATH'; +INPUTFORMAT: 'INPUTFORMAT'; +INSERT: 'INSERT'; +INTERSECT: 'INTERSECT'; +INTERVAL: 'INTERVAL'; +INTO: 'INTO'; +IS: 'IS'; +ITEMS: 'ITEMS'; +JOIN: 'JOIN'; +KEYS: 'KEYS'; +LAST: 'LAST'; +LATERAL: 'LATERAL'; +LAZY: 'LAZY'; +LEADING: 'LEADING'; +LEFT: 'LEFT'; +LIKE: 'LIKE'; +LIMIT: 'LIMIT'; +LINES: 'LINES'; +LIST: 'LIST'; +LOAD: 'LOAD'; +LOCAL: 'LOCAL'; +LOCATION: 'LOCATION'; +LOCK: 'LOCK'; +LOCKS: 'LOCKS'; +LOGICAL: 'LOGICAL'; +MACRO: 'MACRO'; +MAP: 'MAP'; +MATCHED: 'MATCHED'; +MERGE: 'MERGE'; +MINUTE: 'MINUTE'; +MONTH: 'MONTH'; +MSCK: 'MSCK'; +NAMESPACE: 'NAMESPACE'; +NAMESPACES: 'NAMESPACES'; +NATURAL: 'NATURAL'; +NO: 'NO'; +NOT: 'NOT' | '!'; +NULL: 'NULL'; +NULLS: 'NULLS'; +OF: 'OF'; +ON: 'ON'; +ONLY: 'ONLY'; +OPTION: 'OPTION'; +OPTIONS: 'OPTIONS'; +OR: 'OR'; +ORDER: 'ORDER'; +OUT: 'OUT'; +OUTER: 'OUTER'; +OUTPUTFORMAT: 'OUTPUTFORMAT'; +OVER: 'OVER'; +OVERLAPS: 'OVERLAPS'; +OVERLAY: 'OVERLAY'; +OVERWRITE: 'OVERWRITE'; +PARTITION: 'PARTITION'; +PARTITIONED: 'PARTITIONED'; +PARTITIONS: 'PARTITIONS'; +PERCENTLIT: 'PERCENT'; +PIVOT: 'PIVOT'; +PLACING: 'PLACING'; +POSITION: 'POSITION'; +PRECEDING: 'PRECEDING'; +PRIMARY: 'PRIMARY'; +PRINCIPALS: 'PRINCIPALS'; +PROPERTIES: 'PROPERTIES'; +PURGE: 'PURGE'; +QUERY: 'QUERY'; +RANGE: 'RANGE'; +RECORDREADER: 'RECORDREADER'; +RECORDWRITER: 'RECORDWRITER'; +RECOVER: 'RECOVER'; +REDUCE: 'REDUCE'; +REFERENCES: 'REFERENCES'; +REFRESH: 'REFRESH'; +RENAME: 'RENAME'; +REPAIR: 'REPAIR'; +REPLACE: 'REPLACE'; +RESET: 'RESET'; +RESTRICT: 'RESTRICT'; +REVOKE: 'REVOKE'; +RIGHT: 'RIGHT'; +RLIKE: 'RLIKE' | 'REGEXP'; +ROLE: 'ROLE'; +ROLES: 'ROLES'; +ROLLBACK: 'ROLLBACK'; +ROLLUP: 'ROLLUP'; +ROW: 'ROW'; +ROWS: 'ROWS'; +SCHEMA: 'SCHEMA'; +SECOND: 'SECOND'; +SELECT: 'SELECT'; +SEMI: 'SEMI'; +SEPARATED: 'SEPARATED'; +SERDE: 'SERDE'; +SERDEPROPERTIES: 'SERDEPROPERTIES'; +SESSION_USER: 'SESSION_USER'; +SET: 'SET'; +SETMINUS: 'MINUS'; +SETS: 'SETS'; +SHOW: 'SHOW'; +SKEWED: 'SKEWED'; +SOME: 'SOME'; +SORT: 'SORT'; +SORTED: 'SORTED'; +START: 'START'; +STATISTICS: 'STATISTICS'; +STORED: 'STORED'; +STRATIFY: 'STRATIFY'; +STRUCT: 'STRUCT'; +SUBSTR: 'SUBSTR'; +SUBSTRING: 'SUBSTRING'; +TABLE: 'TABLE'; +TABLES: 'TABLES'; +TABLESAMPLE: 'TABLESAMPLE'; +TBLPROPERTIES: 'TBLPROPERTIES'; +TEMPORARY: 'TEMPORARY' | 'TEMP'; +TERMINATED: 'TERMINATED'; +THEN: 'THEN'; +TO: 'TO'; +TOUCH: 'TOUCH'; +TRAILING: 'TRAILING'; +TRANSACTION: 'TRANSACTION'; +TRANSACTIONS: 'TRANSACTIONS'; +TRANSFORM: 'TRANSFORM'; +TRIM: 'TRIM'; +TRUE: 'TRUE'; +TRUNCATE: 'TRUNCATE'; +TYPE: 'TYPE'; +UNARCHIVE: 'UNARCHIVE'; +UNBOUNDED: 'UNBOUNDED'; +UNCACHE: 'UNCACHE'; +UNION: 'UNION'; +UNIQUE: 'UNIQUE'; +UNKNOWN: 'UNKNOWN'; +UNLOCK: 'UNLOCK'; +UNSET: 'UNSET'; +UPDATE: 'UPDATE'; +USE: 'USE'; +USER: 'USER'; +USING: 'USING'; +VALUES: 'VALUES'; +VIEW: 'VIEW'; +VIEWS: 'VIEWS'; +WHEN: 'WHEN'; +WHERE: 'WHERE'; +WINDOW: 'WINDOW'; +WITH: 'WITH'; +YEAR: 'YEAR'; +//============================ +// End of the keywords list +//============================ + +EQ : '=' | '=='; +NSEQ: '<=>'; +NEQ : '<>'; +NEQJ: '!='; +LT : '<'; +LTE : '<=' | '!>'; +GT : '>'; +GTE : '>=' | '!<'; + +PLUS: '+'; +MINUS: '-'; +ASTERISK: '*'; +SLASH: '/'; +PERCENT: '%'; +DIV: 'DIV'; +TILDE: '~'; +AMPERSAND: '&'; +PIPE: '|'; +CONCAT_PIPE: '||'; +HAT: '^'; + +STRING + : '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' + | '"' ( ~('"'|'\\') | ('\\' .) )* '"' + ; + +BIGINT_LITERAL + : DIGIT+ 'L' + ; + +SMALLINT_LITERAL + : DIGIT+ 'S' + ; + +TINYINT_LITERAL + : DIGIT+ 'Y' + ; + +INTEGER_VALUE + : DIGIT+ + ; + +EXPONENT_VALUE + : DIGIT+ EXPONENT + | DECIMAL_DIGITS EXPONENT {self.isValidDecimal()}? + ; + +DECIMAL_VALUE + : DECIMAL_DIGITS {self.isValidDecimal()}? + ; + +DOUBLE_LITERAL + : DIGIT+ EXPONENT? 'D' + | DECIMAL_DIGITS EXPONENT? 'D' {self.isValidDecimal()}? + ; + +BIGDECIMAL_LITERAL + : DIGIT+ EXPONENT? 'BD' + | DECIMAL_DIGITS EXPONENT? 'BD' {self.isValidDecimal()}? + ; + +IDENTIFIER + : (LETTER | DIGIT | '_')+ + ; + +BACKQUOTED_IDENTIFIER + : '`' ( ~'`' | '``' )* '`' + ; + +fragment DECIMAL_DIGITS + : DIGIT+ '.' DIGIT* + | '.' DIGIT+ + ; + +fragment EXPONENT + : 'E' [+-]? DIGIT+ + ; + +fragment DIGIT + : [0-9] + ; + +fragment LETTER + : [A-Z] + ; + +SIMPLE_COMMENT + : '--' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN) + ; + +BRACKETED_COMMENT + : '/*' {not self.isHint()}? (BRACKETED_COMMENT|.)*? '*/' -> channel(HIDDEN) + ; + +WS + : [ \r\n\t]+ -> channel(HIDDEN) + ; + +// Catch-all for anything we can't recognize. +// We use this to be able to ignore and recover all the text +// when splitting statements with DelimiterLexer +UNRECOGNIZED + : . + ; From c2eb27508bc561d23adc58ebd528c70207c98617 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:03:34 +0200 Subject: [PATCH 005/118] Align generated code format with project one --- pysparkling/sql/ast/generated/SqlBaseLexer.py | 302 +++++++++--------- 1 file changed, 151 insertions(+), 151 deletions(-) diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.py b/pysparkling/sql/ast/generated/SqlBaseLexer.py index 8fab2f10c..583ad6a05 100644 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.py +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.py @@ -1614,158 +1614,158 @@ class SqlBaseLexer(Lexer): modeNames = [ "DEFAULT_MODE" ] literalNames = [ "", - "';'", "'('", "')'", "','", "'.'", "'/*+'", "'*/'", "'->'", - "'['", "']'", "':'", "'ADD'", "'AFTER'", "'ALL'", "'ALTER'", - "'ANALYZE'", "'AND'", "'ANTI'", "'ANY'", "'ARCHIVE'", "'ARRAY'", - "'AS'", "'ASC'", "'AT'", "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", - "'BUCKET'", "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", - "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", "'CLUSTERED'", - "'CODEGEN'", "'COLLATE'", "'COLLECTION'", "'COLUMN'", "'COLUMNS'", - "'COMMENT'", "'COMMIT'", "'COMPACT'", "'COMPACTIONS'", "'COMPUTE'", - "'CONCATENATE'", "'CONSTRAINT'", "'COST'", "'CREATE'", "'CROSS'", - "'CUBE'", "'CURRENT'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", - "'CURRENT_USER'", "'DATA'", "'DATABASE'", "'DAY'", "'DBPROPERTIES'", - "'DEFINED'", "'DELETE'", "'DELIMITED'", "'DESC'", "'DESCRIBE'", - "'DFS'", "'DIRECTORIES'", "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", - "'DROP'", "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", - "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", "'EXTENDED'", - "'EXTERNAL'", "'EXTRACT'", "'FALSE'", "'FETCH'", "'FIELDS'", - "'FILTER'", "'FILEFORMAT'", "'FIRST'", "'FOLLOWING'", "'FOR'", - "'FOREIGN'", "'FORMAT'", "'FORMATTED'", "'FROM'", "'FULL'", - "'FUNCTION'", "'FUNCTIONS'", "'GLOBAL'", "'GRANT'", "'GROUP'", - "'GROUPING'", "'HAVING'", "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", - "'IN'", "'INDEX'", "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", - "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", "'IS'", "'ITEMS'", - "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", "'LAZY'", "'LEADING'", - "'LEFT'", "'LIKE'", "'LIMIT'", "'LINES'", "'LIST'", "'LOAD'", - "'LOCAL'", "'LOCATION'", "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", - "'MAP'", "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", - "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", "'NULL'", - "'NULLS'", "'OF'", "'ON'", "'ONLY'", "'OPTION'", "'OPTIONS'", - "'OR'", "'ORDER'", "'OUT'", "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", - "'OVERLAPS'", "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", - "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", "'POSITION'", - "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", "'PROPERTIES'", - "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", "'RECORDWRITER'", - "'RECOVER'", "'REDUCE'", "'REFERENCES'", "'REFRESH'", "'RENAME'", - "'REPAIR'", "'REPLACE'", "'RESET'", "'RESTRICT'", "'REVOKE'", - "'RIGHT'", "'ROLE'", "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", - "'ROWS'", "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", - "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", "'MINUS'", - "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", "'SORT'", "'SORTED'", - "'START'", "'STATISTICS'", "'STORED'", "'STRATIFY'", "'STRUCT'", - "'SUBSTR'", "'SUBSTRING'", "'TABLE'", "'TABLES'", "'TABLESAMPLE'", - "'TBLPROPERTIES'", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", - "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", - "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", "'UNBOUNDED'", - "'UNCACHE'", "'UNION'", "'UNIQUE'", "'UNKNOWN'", "'UNLOCK'", - "'UNSET'", "'UPDATE'", "'USE'", "'USER'", "'USING'", "'VALUES'", - "'VIEW'", "'VIEWS'", "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", - "'YEAR'", "'<=>'", "'<>'", "'!='", "'<'", "'>'", "'+'", "'-'", + "';'", "'('", "')'", "','", "'.'", "'/*+'", "'*/'", "'->'", + "'['", "']'", "':'", "'ADD'", "'AFTER'", "'ALL'", "'ALTER'", + "'ANALYZE'", "'AND'", "'ANTI'", "'ANY'", "'ARCHIVE'", "'ARRAY'", + "'AS'", "'ASC'", "'AT'", "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", + "'BUCKET'", "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", + "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", "'CLUSTERED'", + "'CODEGEN'", "'COLLATE'", "'COLLECTION'", "'COLUMN'", "'COLUMNS'", + "'COMMENT'", "'COMMIT'", "'COMPACT'", "'COMPACTIONS'", "'COMPUTE'", + "'CONCATENATE'", "'CONSTRAINT'", "'COST'", "'CREATE'", "'CROSS'", + "'CUBE'", "'CURRENT'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", + "'CURRENT_USER'", "'DATA'", "'DATABASE'", "'DAY'", "'DBPROPERTIES'", + "'DEFINED'", "'DELETE'", "'DELIMITED'", "'DESC'", "'DESCRIBE'", + "'DFS'", "'DIRECTORIES'", "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", + "'DROP'", "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", + "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", "'EXTENDED'", + "'EXTERNAL'", "'EXTRACT'", "'FALSE'", "'FETCH'", "'FIELDS'", + "'FILTER'", "'FILEFORMAT'", "'FIRST'", "'FOLLOWING'", "'FOR'", + "'FOREIGN'", "'FORMAT'", "'FORMATTED'", "'FROM'", "'FULL'", + "'FUNCTION'", "'FUNCTIONS'", "'GLOBAL'", "'GRANT'", "'GROUP'", + "'GROUPING'", "'HAVING'", "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", + "'IN'", "'INDEX'", "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", + "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", "'IS'", "'ITEMS'", + "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", "'LAZY'", "'LEADING'", + "'LEFT'", "'LIKE'", "'LIMIT'", "'LINES'", "'LIST'", "'LOAD'", + "'LOCAL'", "'LOCATION'", "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", + "'MAP'", "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", + "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", "'NULL'", + "'NULLS'", "'OF'", "'ON'", "'ONLY'", "'OPTION'", "'OPTIONS'", + "'OR'", "'ORDER'", "'OUT'", "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", + "'OVERLAPS'", "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", + "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", "'POSITION'", + "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", "'PROPERTIES'", + "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", "'RECORDWRITER'", + "'RECOVER'", "'REDUCE'", "'REFERENCES'", "'REFRESH'", "'RENAME'", + "'REPAIR'", "'REPLACE'", "'RESET'", "'RESTRICT'", "'REVOKE'", + "'RIGHT'", "'ROLE'", "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", + "'ROWS'", "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", + "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", "'MINUS'", + "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", "'SORT'", "'SORTED'", + "'START'", "'STATISTICS'", "'STORED'", "'STRATIFY'", "'STRUCT'", + "'SUBSTR'", "'SUBSTRING'", "'TABLE'", "'TABLES'", "'TABLESAMPLE'", + "'TBLPROPERTIES'", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", + "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", + "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", "'UNBOUNDED'", + "'UNCACHE'", "'UNION'", "'UNIQUE'", "'UNKNOWN'", "'UNLOCK'", + "'UNSET'", "'UPDATE'", "'USE'", "'USER'", "'USING'", "'VALUES'", + "'VIEW'", "'VIEWS'", "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", + "'YEAR'", "'<=>'", "'<>'", "'!='", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'DIV'", "'~'", "'&'", "'|'", "'||'", "'^'" ] symbolicNames = [ "", - "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "ANTI", "ANY", - "ARCHIVE", "ARRAY", "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", - "BOTH", "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", - "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", - "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", - "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", - "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", - "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", - "DATA", "DATABASE", "DATABASES", "DAY", "DBPROPERTIES", "DEFINED", - "DELETE", "DELIMITED", "DESC", "DESCRIBE", "DFS", "DIRECTORIES", - "DIRECTORY", "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", - "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", - "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", - "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", - "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", - "FUNCTIONS", "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", - "HOUR", "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", - "INNER", "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", - "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", "LAZY", - "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", "LOAD", - "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", "MAP", - "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", - "NAMESPACES", "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", - "ON", "ONLY", "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", - "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", - "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", "PIVOT", - "PLACING", "POSITION", "PRECEDING", "PRIMARY", "PRINCIPALS", - "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", - "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", - "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", - "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", - "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", - "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", - "SOME", "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", - "STRUCT", "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", - "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", - "TRAILING", "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", - "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", - "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", - "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", - "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", - "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", - "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", "STRING", - "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", - "EXPONENT_VALUE", "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", - "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", + "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "ANTI", "ANY", + "ARCHIVE", "ARRAY", "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", + "BOTH", "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", + "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", + "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", + "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", + "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", + "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", + "DATA", "DATABASE", "DATABASES", "DAY", "DBPROPERTIES", "DEFINED", + "DELETE", "DELIMITED", "DESC", "DESCRIBE", "DFS", "DIRECTORIES", + "DIRECTORY", "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", + "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", + "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", + "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", + "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", + "FUNCTIONS", "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", + "HOUR", "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", + "INNER", "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", + "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", "LAZY", + "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", "LOAD", + "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", "MAP", + "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", + "NAMESPACES", "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", + "ON", "ONLY", "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", + "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", + "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", "PIVOT", + "PLACING", "POSITION", "PRECEDING", "PRIMARY", "PRINCIPALS", + "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", + "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", + "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", + "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", + "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", + "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", + "SOME", "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", + "STRUCT", "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", + "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", + "TRAILING", "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", + "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", + "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", + "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", + "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", + "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", "STRING", + "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", + "EXPONENT_VALUE", "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", + "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" ] - ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", - "T__7", "T__8", "T__9", "T__10", "ADD", "AFTER", "ALL", - "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", - "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", "BOTH", - "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", - "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", - "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", - "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", - "CONCATENATE", "CONSTRAINT", "COST", "CREATE", "CROSS", - "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", - "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", - "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", - "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", - "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", - "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", - "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIELDS", "FILTER", - "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", "FOREIGN", - "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", - "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", - "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", - "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", - "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", - "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", - "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", - "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", - "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", "NO", "NOT", - "NULL", "NULLS", "OF", "ON", "ONLY", "OPTION", "OPTIONS", - "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", - "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", - "PARTITIONS", "PERCENTLIT", "PIVOT", "PLACING", "POSITION", - "PRECEDING", "PRIMARY", "PRINCIPALS", "PROPERTIES", "PURGE", - "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", "RECOVER", - "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", - "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", - "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", - "SCHEMA", "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", - "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", - "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", "START", - "STATISTICS", "STORED", "STRATIFY", "STRUCT", "SUBSTR", - "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", - "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", "TRAILING", - "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", - "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", - "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", - "USE", "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", - "WHERE", "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", - "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", - "CONCAT_PIPE", "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", - "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", - "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", - "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "DECIMAL_DIGITS", - "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", + ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", + "T__7", "T__8", "T__9", "T__10", "ADD", "AFTER", "ALL", + "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", + "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", "BOTH", + "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", + "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", + "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", + "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", + "CONCATENATE", "CONSTRAINT", "COST", "CREATE", "CROSS", + "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", + "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", + "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", + "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", + "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", + "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", + "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIELDS", "FILTER", + "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", "FOREIGN", + "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", + "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", + "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", + "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", + "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", + "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", + "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", + "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", + "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", "NO", "NOT", + "NULL", "NULLS", "OF", "ON", "ONLY", "OPTION", "OPTIONS", + "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", + "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", + "PARTITIONS", "PERCENTLIT", "PIVOT", "PLACING", "POSITION", + "PRECEDING", "PRIMARY", "PRINCIPALS", "PROPERTIES", "PURGE", + "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", "RECOVER", + "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", + "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", + "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", + "SCHEMA", "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", + "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", + "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", "START", + "STATISTICS", "STORED", "STRATIFY", "STRUCT", "SUBSTR", + "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", + "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", "TRAILING", + "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", + "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", + "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", + "USE", "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", + "WHERE", "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", + "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", + "CONCAT_PIPE", "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", + "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", + "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", + "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "DECIMAL_DIGITS", + "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" ] grammarFileName = "SqlBase.g4" @@ -1853,22 +1853,22 @@ def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): def EXPONENT_VALUE_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 0: return self.isValidDecimal() - + def DECIMAL_VALUE_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 1: return self.isValidDecimal() - + def DOUBLE_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 2: return self.isValidDecimal() - + def BIGDECIMAL_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 3: return self.isValidDecimal() - + def BRACKETED_COMMENT_sempred(self, localctx:RuleContext, predIndex:int): if predIndex == 4: From eee456451bda4ec90f0a8fa0e998f90564126f30 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:04:36 +0200 Subject: [PATCH 006/118] Implement AST builder --- pysparkling/sql/ast/parser.py | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 pysparkling/sql/ast/parser.py diff --git a/pysparkling/sql/ast/parser.py b/pysparkling/sql/ast/parser.py new file mode 100644 index 000000000..0492e4525 --- /dev/null +++ b/pysparkling/sql/ast/parser.py @@ -0,0 +1,70 @@ +import antlr4 +from antlr4.error.ErrorListener import ErrorListener + +from pysparkling.sql.ast.generated.SqlBaseLexer import SqlBaseLexer +from pysparkling.sql.ast.generated.SqlBaseParser import SqlBaseParser + + +class PostProcessor(antlr4.ParseTreeListener): + def exitQuotedIdentifier(self, ctx): + def identity(token): + return token + + return identity + + def enterNonReserved(self, ctx): + def add_backtick(token): + return "`{0}`".format(token) + + return add_backtick + + def replace_token_by_identifier(self, ctx): + def do_replace_token_by_identifier(token): + parent = ctx.parent + parent.removeLastChild() + token = ctx.getChild(0).getPayload + parent.addChild() + + return do_replace_token_by_identifier + + +class ParseErrorListener(ErrorListener): + def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): + raise Exception("Parse error", msg) + + +class UpperCaseCharStream: + """ + Make SQL token detection case insensitive + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def getText(self, interval, *args): + if args or (self.size() > 0 and (interval.b - interval.a >= 0)): + return self.wrapped.getText(interval, *args) + else: + return "" + + def LA(self, i: int): + la = self.wrapped.LA(i) + if la == 0 or la == -1: + return la + else: + return ord(chr(la).upper()) + + def __getattr__(self, item): + return getattr(self.wrapped, item) + + +def build_ast(stream): + lexer = SqlBaseLexer(UpperCaseCharStream(stream)) + lexer.removeErrorListeners() + lexer.addErrorListener(ParseErrorListener()) + token_stream = antlr4.CommonTokenStream(lexer) + parser = SqlBaseParser(token_stream) + parser.addParseListener(PostProcessor()) + parser.removeErrorListeners() + parser.addErrorListener(ParseErrorListener()) + return parser From cefb1a1c475a2487142569fc3a9a9422522cfcee Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:04:46 +0200 Subject: [PATCH 007/118] Document AST module --- pysparkling/sql/ast/README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 pysparkling/sql/ast/README.md diff --git a/pysparkling/sql/ast/README.md b/pysparkling/sql/ast/README.md new file mode 100644 index 000000000..87745e9c7 --- /dev/null +++ b/pysparkling/sql/ast/README.md @@ -0,0 +1,26 @@ +# Python Abstract Syntax Tree for Spark SQL + +This folder uses ANTLR4 to convert a SQL statement in an Abstract Syntax Tree in Python. + +This AST is then transformed in the corresponding pysparkling abtrasaction. + +## Example + + +## Recreate generated files + +First, download the ANTLR complete JAR from [the ANTLR site][antlr]. + +[antlr]:http://www.antlr.org/ + +Next, install the required dev ANTLR4 Python 3 runtime package: + +``` +pip install antlr4-python3-runtime +``` + +Then, run ANTLR to compile the SQL grammar and generate Python code. + +``` +java -Xmx500M -cp ":$CLASSPATH" org.antlr.v4.Tool -Dlanguage=Python3 SqlBase.g4 +``` From 517d12237d1cb5ecceaa0ac76475de1f3721af22 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:05:02 +0200 Subject: [PATCH 008/118] Add AST utils --- pysparkling/sql/ast/utils.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pysparkling/sql/ast/utils.py diff --git a/pysparkling/sql/ast/utils.py b/pysparkling/sql/ast/utils.py new file mode 100644 index 000000000..98e6bb965 --- /dev/null +++ b/pysparkling/sql/ast/utils.py @@ -0,0 +1,14 @@ +def print_tree(tree): + print(type(tree).__name__) + print_sub_tree(tree, indent=0) + + +def print_sub_tree(tree, indent=0): + for c in tree.children: + print( + "|" + "-" * indent, + type(c).__name__, + "\033[0;34m" + (c.symbol.text if hasattr(c, "symbol") else "") + "\033[0m" + ) + if hasattr(c, 'children') and c.children: + print_sub_tree(c, indent + 2) From 308396e5bfd46241a3aca940d03eacc2c05b7828 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:06:17 +0200 Subject: [PATCH 009/118] Convert AST to Python objects --- pysparkling/sql/ast/ast_to_python.py | 143 +++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 pysparkling/sql/ast/ast_to_python.py diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py new file mode 100644 index 000000000..117fc2f15 --- /dev/null +++ b/pysparkling/sql/ast/ast_to_python.py @@ -0,0 +1,143 @@ +import ast + +from pysparkling.sql.expressions.operators import Equal + + +class SqlParsingError(Exception): + pass + + +def check_children(expected, children): + if len(children) != expected: + raise SqlParsingError("Expecting {0} children, got {1}: {2}".format(expected, len(children), children)) + + +def unwrap(*children): + check_children(1, children) + return convert_tree(children[0]) + + +def first_child_only(*children): + return convert_tree(children[0]) + + +def child_and_eof(*children): + check_children(2, children) + return convert_tree(children[0]) + + +def convert_tree(tree): + tree_type = tree.__class__.__name__ + print(tree_type) + if not hasattr(tree, "children"): + return get_leaf_value(tree) + converter = CONVERTERS[tree_type] + return converter(*tree.children) + + +def ctx_to_comparison(*children): + check_children(3, children) + left, operator, right = children + cls = comparison_converters[convert_tree(operator)] + return cls( + convert_tree(left), + convert_tree(right) + ) + + +def get_leaf_value(*children): + check_children(1, children) + value = children[0] + if value.__class__.__name__ != "TerminalNodeImpl": + raise Exception("Expecting TerminalNodeImpl, got {0}".format(value.__class__.__name__)) + if not hasattr(value, "symbol"): + raise Exception("Got leaf value but without symbol") + return value.symbol.text + + +def explicit_list(*children): + return tuple( + convert_tree(c) + for c in children[1:-1:2] + ) + + +def implicit_list(*children): + return tuple( + convert_tree(c) + for c in children[::2] + ) + + +def concat_to_literal(*children): + return ast.literal_eval("".join(convert_tree(c) for c in children)) + + +CONVERTERS = { + "SingleStatementContext": first_child_only, + "SingleExpressionContext": child_and_eof, + "SingleTableIdentifierContext": child_and_eof, + "SingleMultipartIdentifierContext": child_and_eof, + "SingleFunctionIdentifierContext": child_and_eof, + "SingleDataTypeContext": child_and_eof, + "SingleTableSchemaContext": child_and_eof, + 'NamespaceContext': get_leaf_value, + 'SetQuantifierContext': get_leaf_value, + 'ComparisonOperatorContext': get_leaf_value, + 'ArithmeticOperatorContext': get_leaf_value, + 'PredicateOperatorContext': get_leaf_value, + 'BooleanValueContext': get_leaf_value, + 'QuotedIdentifierContext': get_leaf_value, + 'AnsiNonReservedContext': get_leaf_value, + 'StrictNonReservedContext': get_leaf_value, + 'NonReservedContext': get_leaf_value, + 'TerminalNodeImpl': get_leaf_value, + 'DescribeFuncNameContext': unwrap, + 'TablePropertyValueContext': unwrap, + 'TransformArgumentContext': unwrap, + 'ExpressionContext': unwrap, + 'IntervalUnitContext': unwrap, + 'FunctionNameContext': unwrap, + 'ExponentLiteralContext': concat_to_literal, + 'DecimalLiteralContext': concat_to_literal, + 'LegacyDecimalLiteralContext': concat_to_literal, + 'IntegerLiteralContext': concat_to_literal, + 'BigIntLiteralContext': concat_to_literal, + 'SmallIntLiteralContext': concat_to_literal, + 'TinyIntLiteralContext': concat_to_literal, + 'DoubleLiteralContext': concat_to_literal, + 'BigDecimalLiteralContext': concat_to_literal, + 'NumberContext': concat_to_literal, + 'TablePropertyListContext': explicit_list, + 'ConstantListContext': explicit_list, + 'NestedConstantListContext': explicit_list, + 'IdentifierListContext': explicit_list, + 'OrderedIdentifierListContext': explicit_list, + 'IdentifierCommentListContext': explicit_list, + 'TransformListContext': explicit_list, + 'AssignmentListContext': implicit_list, + 'MultipartIdentifierListContext': implicit_list, + 'QualifiedColTypeWithPositionListContext': implicit_list, + 'ColTypeListContext': implicit_list, + 'ComplexColTypeListContext': implicit_list, + 'QualifiedNameListContext': implicit_list, + # WIP! + # todo: check that all context are there + # including yyy: definition + # and definition #xxx + "NamedExpressionContext": unwrap, + "PredicatedContext": unwrap, + "ValueExpressionDefaultContext": unwrap, + "ColumnReferenceContext": unwrap, + "ComparisonContext": ctx_to_comparison, + "IdentifierContext": unwrap, + "ConstantDefaultContext": unwrap, + "NumericLiteralContext": unwrap, + "QuotedIdentifierAlternativeContext": unwrap, + "UnquotedIdentifierContext": get_leaf_value, + "StringLiteralContext": get_leaf_value, +} + +comparison_converters = { + "=": Equal +} From 4e1477f1d67da4adf5bcc6d5433072836f0e52c8 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Fri, 18 Sep 2020 21:08:00 +0200 Subject: [PATCH 010/118] Add basic unittest on SQL parsing --- pysparkling/sql/ast/tests/__init__.py | 0 pysparkling/sql/ast/tests/test-where.sql | 1 + pysparkling/sql/ast/tests/test_parser.py | 19 +++++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 pysparkling/sql/ast/tests/__init__.py create mode 100644 pysparkling/sql/ast/tests/test-where.sql create mode 100644 pysparkling/sql/ast/tests/test_parser.py diff --git a/pysparkling/sql/ast/tests/__init__.py b/pysparkling/sql/ast/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pysparkling/sql/ast/tests/test-where.sql b/pysparkling/sql/ast/tests/test-where.sql new file mode 100644 index 000000000..36789f2a4 --- /dev/null +++ b/pysparkling/sql/ast/tests/test-where.sql @@ -0,0 +1 @@ +doesItWorks = "In progress!" diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py new file mode 100644 index 000000000..193f37fb3 --- /dev/null +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -0,0 +1,19 @@ +import sys +from unittest import TestCase + +import antlr4 + +from pysparkling.sql.ast.ast_to_python import convert_tree +from pysparkling.sql.ast.parser import build_ast +from pysparkling.sql.ast.utils import print_tree + + +class TestParser(TestCase): + def test_where(self): + parser = build_ast(antlr4.FileStream("test-where.sql")) + tree = parser.booleanExpression() + print_tree(tree) + sys.stdin.flush() + col = convert_tree(tree) + print(col) + self.assertEqual(str(col), '(doesItWorks = "In progress!")') From 53ff4ab808ec66107c057f2ffbebae597e2a499c Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 14:44:16 +0200 Subject: [PATCH 011/118] Base implementation of binary operation --- pysparkling/sql/ast/ast_to_python.py | 49 ++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 117fc2f15..b729af495 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,6 +1,9 @@ import ast -from pysparkling.sql.expressions.operators import Equal +from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ + GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or +from pysparkling.sql.functions import concat +from pysparkling.sql.types import DoubleType, StringType class SqlParsingError(Exception): @@ -17,6 +20,10 @@ def unwrap(*children): return convert_tree(children[0]) +def empty(*children): + check_children(0, children) + + def first_child_only(*children): return convert_tree(children[0]) @@ -35,16 +42,21 @@ def convert_tree(tree): return converter(*tree.children) -def ctx_to_comparison(*children): +def binary_operation(*children): check_children(3, children) left, operator, right = children - cls = comparison_converters[convert_tree(operator)] + cls = binary_operations[convert_tree(operator)] return cls( convert_tree(left), convert_tree(right) ) +def parenthesis_context(*children): + check_children(3, children) + return convert_tree(children[1]) + + def get_leaf_value(*children): check_children(1, children) value = children[0] @@ -121,6 +133,11 @@ def concat_to_literal(*children): 'ColTypeListContext': implicit_list, 'ComplexColTypeListContext': implicit_list, 'QualifiedNameListContext': implicit_list, + "ComparisonContext": binary_operation, + "ArithmeticBinaryContext": binary_operation, + "LogicalBinaryContext": binary_operation, + "RealIdentContext": empty, + "ParenthesizedExpressionContext": parenthesis_context, # WIP! # todo: check that all context are there # including yyy: definition @@ -129,7 +146,6 @@ def concat_to_literal(*children): "PredicatedContext": unwrap, "ValueExpressionDefaultContext": unwrap, "ColumnReferenceContext": unwrap, - "ComparisonContext": ctx_to_comparison, "IdentifierContext": unwrap, "ConstantDefaultContext": unwrap, "NumericLiteralContext": unwrap, @@ -138,6 +154,27 @@ def concat_to_literal(*children): "StringLiteralContext": get_leaf_value, } -comparison_converters = { - "=": Equal +binary_operations = { + "=": Equal, + "==": Equal, + "<>": lambda *args: Invert(Equal(*args)), + "!=": lambda *args: Invert(Equal(*args)), + "<": LessThan, + "<=": LessThanOrEqual, + "!>": LessThanOrEqual, + ">": GreaterThan, + ">=": GreaterThanOrEqual, + "!<": GreaterThanOrEqual, + "+": Add, + "-": Minus, + '*': Time, + '/': lambda a, b: Divide(Cast(a, DoubleType), Cast(b, DoubleType)), + '%': Mod, + 'DIV': lambda a, b: Divide(Cast(a, DoubleType), Cast(b, DoubleType)), + '&': BitwiseAnd, + '|': BitwiseOr, + '||': lambda a, b: concat(Cast(a, StringType), Cast(b, StringType)), + '^': BitwiseXor, + 'AND': And, + 'OR': Or, } From 3ea3b1646430fc2b826c4bc0db9b11a51d39d9c7 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 15:05:29 +0200 Subject: [PATCH 012/118] Parse unary operations --- pysparkling/sql/ast/ast_to_python.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index b729af495..d06e61ef3 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,8 +1,10 @@ import ast +from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ - GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or -from pysparkling.sql.functions import concat + GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ + BitwiseNot, UnaryPositive +from pysparkling.sql.functions import Concat from pysparkling.sql.types import DoubleType, StringType @@ -52,6 +54,15 @@ def binary_operation(*children): ) +def unary_operation(*children): + check_children(2, children) + operator, value = children + cls = unary_operations[convert_tree(operator)] + return cls( + convert_tree(value) + ) + + def parenthesis_context(*children): check_children(3, children) return convert_tree(children[1]) @@ -82,7 +93,7 @@ def implicit_list(*children): def concat_to_literal(*children): - return ast.literal_eval("".join(convert_tree(c) for c in children)) + return Literal(ast.literal_eval("".join(convert_tree(c) for c in children))) CONVERTERS = { @@ -138,6 +149,7 @@ def concat_to_literal(*children): "LogicalBinaryContext": binary_operation, "RealIdentContext": empty, "ParenthesizedExpressionContext": parenthesis_context, + "ArithmeticUnaryContext": unary_operation, # WIP! # todo: check that all context are there # including yyy: definition @@ -173,8 +185,14 @@ def concat_to_literal(*children): 'DIV': lambda a, b: Divide(Cast(a, DoubleType), Cast(b, DoubleType)), '&': BitwiseAnd, '|': BitwiseOr, - '||': lambda a, b: concat(Cast(a, StringType), Cast(b, StringType)), + '||': lambda a, b: Concat([Cast(a, StringType), Cast(b, StringType)]), '^': BitwiseXor, 'AND': And, 'OR': Or, } + +unary_operations = { + "+": UnaryPositive, + "-": Negate, + "~": BitwiseNot, +} From 85c0546d1790a4e815dec235ed6bc4ca88266989 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 15:37:21 +0200 Subject: [PATCH 013/118] Add missing wrapper --- pysparkling/sql/ast/ast_to_python.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index d06e61ef3..0890c21e6 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -121,6 +121,7 @@ def concat_to_literal(*children): 'ExpressionContext': unwrap, 'IntervalUnitContext': unwrap, 'FunctionNameContext': unwrap, + 'BooleanLiteralContext': unwrap, 'ExponentLiteralContext': concat_to_literal, 'DecimalLiteralContext': concat_to_literal, 'LegacyDecimalLiteralContext': concat_to_literal, From 9940076a8c8b85314c1eab0282416c3ef2b994de Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 15:38:31 +0200 Subject: [PATCH 014/118] Add wrappers that should never be encountered (only their children should) --- pysparkling/sql/ast/ast_to_python.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 0890c21e6..9c8f2cb67 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,4 +1,5 @@ import ast +import logging from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ @@ -22,6 +23,11 @@ def unwrap(*children): return convert_tree(children[0]) +def never_found(*children): + logging.warning("We should never have encounter this node.") + return unwrap(*children) + + def empty(*children): check_children(0, children) @@ -122,6 +128,25 @@ def concat_to_literal(*children): 'IntervalUnitContext': unwrap, 'FunctionNameContext': unwrap, 'BooleanLiteralContext': unwrap, + "BooleanExpressionContext": never_found, + "ConstantContext": never_found, + "DataTypeContext": never_found, + "DmlStatementNoWithContext": never_found, + "ErrorCapturingIdentifierExtraContext": never_found, + "FileFormatContext": never_found, + "InsertIntoContext": never_found, + "NumberContext": never_found, + "PrimaryExpressionContext": never_found, + "QueryPrimaryContext": never_found, + "QueryTermContext": never_found, + "RelationPrimaryContext": never_found, + "RowFormatContext": never_found, + "SampleMethodContext": never_found, + "StatementContext": never_found, + "StrictIdentifierContext": never_found, + "TransformContext": never_found, + "ValueExpressionContext": never_found, + "WindowSpecContext": never_found, 'ExponentLiteralContext': concat_to_literal, 'DecimalLiteralContext': concat_to_literal, 'LegacyDecimalLiteralContext': concat_to_literal, @@ -131,7 +156,6 @@ def concat_to_literal(*children): 'TinyIntLiteralContext': concat_to_literal, 'DoubleLiteralContext': concat_to_literal, 'BigDecimalLiteralContext': concat_to_literal, - 'NumberContext': concat_to_literal, 'TablePropertyListContext': explicit_list, 'ConstantListContext': explicit_list, 'NestedConstantListContext': explicit_list, From e2b4cdd13d9d5db2ce88ac4425cfa2f827b28034 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 15:38:45 +0200 Subject: [PATCH 015/118] Add parenthesis-like contexts --- pysparkling/sql/ast/ast_to_python.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 9c8f2cb67..ef1f3ad64 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -174,6 +174,8 @@ def concat_to_literal(*children): "LogicalBinaryContext": binary_operation, "RealIdentContext": empty, "ParenthesizedExpressionContext": parenthesis_context, + "SubqueryContext": parenthesis_context, + "SubqueryExpressionContext": parenthesis_context, "ArithmeticUnaryContext": unary_operation, # WIP! # todo: check that all context are there From b313b71685cd31ae30491a56c62f27f1dd82ff49 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 15:38:56 +0200 Subject: [PATCH 016/118] Fix isValidDecimal --- pysparkling/sql/ast/generated/SqlBaseLexer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.py b/pysparkling/sql/ast/generated/SqlBaseLexer.py index 583ad6a05..2e59ffff0 100644 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.py +++ b/pysparkling/sql/ast/generated/SqlBaseLexer.py @@ -1814,7 +1814,7 @@ def isValidDecimal(self): by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' which is not a digit or letter or underscore. """ - nextChar = self._input.LA(1) + nextChar = chr(self._input.LA(1)) if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': return False else: From a8fffeb560b9fdde3b966ab433f401400f5e8439 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 16:19:17 +0200 Subject: [PATCH 017/118] Clarify support status of some statements --- pysparkling/sql/ast/ast_to_python.py | 82 ++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index ef1f3ad64..080fa620d 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -28,6 +28,10 @@ def never_found(*children): return unwrap(*children) +def unsupported(*children): + raise Exception("Unsupported statement") + + def empty(*children): check_children(0, children) @@ -121,13 +125,31 @@ def concat_to_literal(*children): 'StrictNonReservedContext': get_leaf_value, 'NonReservedContext': get_leaf_value, 'TerminalNodeImpl': get_leaf_value, + "StringLiteralContext": get_leaf_value, 'DescribeFuncNameContext': unwrap, 'TablePropertyValueContext': unwrap, 'TransformArgumentContext': unwrap, 'ExpressionContext': unwrap, 'IntervalUnitContext': unwrap, 'FunctionNameContext': unwrap, + 'StatementDefaultContext': unwrap, + 'ResetConfigurationContext': unwrap, + 'GenericFileFormatContext': unwrap, + 'QueryTermDefaultContext': unwrap, + 'QueryPrimaryDefaultContext': unwrap, + 'FromStmtContext': unwrap, + 'InlineTableDefault1Context': unwrap, + 'InlineTableDefault2Context': unwrap, + 'TableValuedFunctionContext': unwrap, + 'IdentityTransformContext': unwrap, + 'ValueExpressionDefaultContext': unwrap, + 'ConstantDefaultContext': unwrap, + 'ColumnReferenceContext': unwrap, + 'NullLiteralContext': unwrap, + 'IntervalLiteralContext': unwrap, + 'NumericLiteralContext': unwrap, 'BooleanLiteralContext': unwrap, + 'QuotedIdentifierAlternativeContext': unwrap, "BooleanExpressionContext": never_found, "ConstantContext": never_found, "DataTypeContext": never_found, @@ -177,20 +199,68 @@ def concat_to_literal(*children): "SubqueryContext": parenthesis_context, "SubqueryExpressionContext": parenthesis_context, "ArithmeticUnaryContext": unary_operation, + 'CreateTableHeaderContext': unsupported, + 'ReplaceTableHeaderContext': unsupported, + 'CreateTableClausesContext': unsupported, + 'InlineTableContext': unsupported, + 'FunctionTableContext': unsupported, + 'CreateTableContext': unsupported, + 'CreateHiveTableContext': unsupported, + 'CreateTableLikeContext': unsupported, + 'ReplaceTableContext': unsupported, + 'AnalyzeContext': unsupported, + 'AddTableColumnsContext': unsupported, + 'RenameTableColumnContext': unsupported, + 'DropTableColumnsContext': unsupported, + 'RenameTableContext': unsupported, + 'SetTablePropertiesContext': unsupported, + 'UnsetTablePropertiesContext': unsupported, + 'AlterTableAlterColumnContext': unsupported, + 'HiveChangeColumnContext': unsupported, + 'HiveReplaceColumnsContext': unsupported, + 'SetTableSerDeContext': unsupported, + 'AddTablePartitionContext': unsupported, + 'RenameTablePartitionContext': unsupported, + 'DropTablePartitionsContext': unsupported, + 'SetTableLocationContext': unsupported, + 'RecoverPartitionsContext': unsupported, + 'DropTableContext': unsupported, + 'ShowTablesContext': unsupported, + 'ShowTableContext': unsupported, + 'ShowCreateTableContext': unsupported, + 'DescribeRelationContext': unsupported, + 'CommentTableContext': unsupported, + 'RefreshTableContext': unsupported, + 'CacheTableContext': unsupported, + 'UncacheTableContext': unsupported, + 'LoadDataContext': unsupported, + 'TruncateTableContext': unsupported, + 'RepairTableContext': unsupported, + 'InsertOverwriteTableContext': unsupported, + 'InsertIntoTableContext': unsupported, + 'DeleteFromTableContext': unsupported, + 'UpdateTableContext': unsupported, + 'MergeIntoTableContext': unsupported, + 'UnsupportedHiveNativeCommandsContext': unsupported, + 'CreateFileFormatContext': unsupported, + 'CreateNamespaceContext': unsupported, + 'CreateViewContext': unsupported, + 'CreateTempViewUsingContext': unsupported, + 'CreateFunctionContext': unsupported, + 'DropNamespaceContext': unsupported, + 'DropViewContext': unsupported, + 'DropFunctionContext': unsupported, + 'LateralViewContext': unsupported, + 'AlterViewQueryContext': unsupported, + 'ShowViewsContext': unsupported, # WIP! # todo: check that all context are there # including yyy: definition # and definition #xxx "NamedExpressionContext": unwrap, "PredicatedContext": unwrap, - "ValueExpressionDefaultContext": unwrap, - "ColumnReferenceContext": unwrap, "IdentifierContext": unwrap, - "ConstantDefaultContext": unwrap, - "NumericLiteralContext": unwrap, - "QuotedIdentifierAlternativeContext": unwrap, "UnquotedIdentifierContext": get_leaf_value, - "StringLiteralContext": get_leaf_value, } binary_operations = { From 57dbe303b36f7823f1daa7eb13a4f13f883ab60b Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 18:58:27 +0200 Subject: [PATCH 018/118] Clarify namespace support status --- pysparkling/sql/ast/ast_to_python.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 080fa620d..a5ddf985d 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -253,6 +253,13 @@ def concat_to_literal(*children): 'LateralViewContext': unsupported, 'AlterViewQueryContext': unsupported, 'ShowViewsContext': unsupported, + 'SetNamespacePropertiesContext': unsupported, + 'SetNamespaceLocationContext': unsupported, + 'ShowNamespacesContext': unsupported, + 'ShowCurrentNamespaceContext': unsupported, + 'DescribeNamespaceContext': unsupported, + 'CommentNamespaceContext': unsupported, + 'UseContext': unsupported, # WIP! # todo: check that all context are there # including yyy: definition From 89e71c03fb96bf03b54a1bd8335b7ebc91d857a6 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 18:59:00 +0200 Subject: [PATCH 019/118] Parse join types --- pysparkling/sql/ast/ast_to_python.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index a5ddf985d..9cc42c86d 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -106,6 +106,10 @@ def concat_to_literal(*children): return Literal(ast.literal_eval("".join(convert_tree(c) for c in children))) +def concat_keywords(*children): + return " ".join(convert_tree(c) for c in children) + + CONVERTERS = { "SingleStatementContext": first_child_only, "SingleExpressionContext": child_and_eof, @@ -260,6 +264,7 @@ def concat_to_literal(*children): 'DescribeNamespaceContext': unsupported, 'CommentNamespaceContext': unsupported, 'UseContext': unsupported, + 'JoinTypeContext': concat_keywords, # WIP! # todo: check that all context are there # including yyy: definition From 7742cf01176c618241c8598cbe005e3e5c427231 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:00:05 +0200 Subject: [PATCH 020/118] Move correctly implemented parsers --- pysparkling/sql/ast/ast_to_python.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 9cc42c86d..4db5ec793 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -130,6 +130,7 @@ def concat_keywords(*children): 'NonReservedContext': get_leaf_value, 'TerminalNodeImpl': get_leaf_value, "StringLiteralContext": get_leaf_value, + "UnquotedIdentifierContext": get_leaf_value, 'DescribeFuncNameContext': unwrap, 'TablePropertyValueContext': unwrap, 'TransformArgumentContext': unwrap, @@ -154,6 +155,7 @@ def concat_keywords(*children): 'NumericLiteralContext': unwrap, 'BooleanLiteralContext': unwrap, 'QuotedIdentifierAlternativeContext': unwrap, + "IdentifierContext": unwrap, "BooleanExpressionContext": never_found, "ConstantContext": never_found, "DataTypeContext": never_found, @@ -271,8 +273,6 @@ def concat_keywords(*children): # and definition #xxx "NamedExpressionContext": unwrap, "PredicatedContext": unwrap, - "IdentifierContext": unwrap, - "UnquotedIdentifierContext": get_leaf_value, } binary_operations = { From 6d460fd32ea3d1e7059ca4e60c1555181a442554 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:00:27 +0200 Subject: [PATCH 021/118] Enhance logging integration in unittests --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 4db5ec793..d2dea68e4 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -47,7 +47,7 @@ def child_and_eof(*children): def convert_tree(tree): tree_type = tree.__class__.__name__ - print(tree_type) + logging.warning(tree_type) if not hasattr(tree, "children"): return get_leaf_value(tree) converter = CONVERTERS[tree_type] From 0fc115b5ebb912d4a2e0f5f3b48a5cc6cc4e2477 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:00:44 +0200 Subject: [PATCH 022/118] Fix antlr4 warning --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bb5832071..a855806ef 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ 'pandas': ['pandas>=0.23.2'], 'performance': ['matplotlib>=1.5.3'], 'streaming': ['tornado>=4.3'], - 'dev': ['antlr4-python3-runtime>=4.8,<5.0'], + 'dev': ['antlr4-python3-runtime==4.7.1'], 'sql': [ 'numpy', 'pandas>=0.23.2', From dde6a5d8c9ca31fb967934a40d42b03f0c472d36 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:02:08 +0200 Subject: [PATCH 023/118] Make method that can be static static --- pysparkling/sql/ast/parser.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/ast/parser.py b/pysparkling/sql/ast/parser.py index 0492e4525..0546fad34 100644 --- a/pysparkling/sql/ast/parser.py +++ b/pysparkling/sql/ast/parser.py @@ -6,19 +6,22 @@ class PostProcessor(antlr4.ParseTreeListener): - def exitQuotedIdentifier(self, ctx): + @staticmethod + def exitQuotedIdentifier(ctx): def identity(token): return token return identity - def enterNonReserved(self, ctx): + @staticmethod + def enterNonReserved(ctx): def add_backtick(token): return "`{0}`".format(token) return add_backtick - def replace_token_by_identifier(self, ctx): + @staticmethod + def replace_token_by_identifier(ctx): def do_replace_token_by_identifier(token): parent = ctx.parent parent.removeLastChild() From e24646bbd65e3512280ba8a8550dfc81c49b83b2 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:02:33 +0200 Subject: [PATCH 024/118] Add a method to convert a SQL string to an AST --- pysparkling/sql/ast/parser.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pysparkling/sql/ast/parser.py b/pysparkling/sql/ast/parser.py index 0546fad34..1b5d6a609 100644 --- a/pysparkling/sql/ast/parser.py +++ b/pysparkling/sql/ast/parser.py @@ -1,4 +1,5 @@ import antlr4 +from antlr4 import InputStream from antlr4.error.ErrorListener import ErrorListener from pysparkling.sql.ast.generated.SqlBaseLexer import SqlBaseLexer @@ -71,3 +72,7 @@ def build_ast(stream): parser.removeErrorListeners() parser.addErrorListener(ParseErrorListener()) return parser + + +def ast_parser(string): + return build_ast(InputStream(string)) From 7f95491da94a3936c439bc5d7b30d5be74ae5f3f Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:07:07 +0200 Subject: [PATCH 025/118] Fix string parsing --- pysparkling/sql/ast/ast_to_python.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index d2dea68e4..40f2d4e94 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -88,6 +88,11 @@ def get_leaf_value(*children): return value.symbol.text +def remove_delimiter(*children): + delimited_value = get_leaf_value(*children) + return delimited_value[1:-1] + + def explicit_list(*children): return tuple( convert_tree(c) @@ -129,7 +134,7 @@ def concat_keywords(*children): 'StrictNonReservedContext': get_leaf_value, 'NonReservedContext': get_leaf_value, 'TerminalNodeImpl': get_leaf_value, - "StringLiteralContext": get_leaf_value, + "StringLiteralContext": remove_delimiter, "UnquotedIdentifierContext": get_leaf_value, 'DescribeFuncNameContext': unwrap, 'TablePropertyValueContext': unwrap, From ff4e7bbc088040c5be06be38d4414c55d6ef3ca3 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:07:40 +0200 Subject: [PATCH 026/118] Simplify test --- pysparkling/sql/ast/tests/test-where.sql | 1 - pysparkling/sql/ast/tests/test_parser.py | 8 +++----- 2 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 pysparkling/sql/ast/tests/test-where.sql diff --git a/pysparkling/sql/ast/tests/test-where.sql b/pysparkling/sql/ast/tests/test-where.sql deleted file mode 100644 index 36789f2a4..000000000 --- a/pysparkling/sql/ast/tests/test-where.sql +++ /dev/null @@ -1 +0,0 @@ -doesItWorks = "In progress!" diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py index 193f37fb3..127fc82dc 100644 --- a/pysparkling/sql/ast/tests/test_parser.py +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -1,19 +1,17 @@ import sys from unittest import TestCase -import antlr4 - from pysparkling.sql.ast.ast_to_python import convert_tree -from pysparkling.sql.ast.parser import build_ast +from pysparkling.sql.ast.parser import ast_parser from pysparkling.sql.ast.utils import print_tree class TestParser(TestCase): def test_where(self): - parser = build_ast(antlr4.FileStream("test-where.sql")) + parser = ast_parser("doesItWorks = 'In progress!'") tree = parser.booleanExpression() print_tree(tree) sys.stdin.flush() col = convert_tree(tree) print(col) - self.assertEqual(str(col), '(doesItWorks = "In progress!")') + self.assertEqual(str(col), "(doesItWorks = In progress!)") From 6914b50e8e79834ad67f46ab03dad778eaa03811 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:09:14 +0200 Subject: [PATCH 027/118] Use SQL to parse types --- pysparkling/sql/ast/ast_to_python.py | 36 +++++++++++++++++++++++++++- pysparkling/sql/column.py | 3 ++- pysparkling/sql/types.py | 20 +++++++++------- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 40f2d4e94..9cf2be640 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,12 +1,14 @@ import ast import logging +from pysparkling.sql.ast.parser import ast_parser +from pysparkling.sql.column import parse from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ BitwiseNot, UnaryPositive from pysparkling.sql.functions import Concat -from pysparkling.sql.types import DoubleType, StringType +from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type class SqlParsingError(Exception): @@ -64,6 +66,25 @@ def binary_operation(*children): ) +def cast_context(*children): + """ + Children are: + CAST '(' expression AS dataType ')' + + """ + check_children(6, children) + expression = convert_tree(children[2]) + data_type = convert_tree(children[4]) + return parse(expression).cast(data_type) + + +def detect_data_type(*children): + # check_children(1, children) + data_type = convert_tree(children[0]) + params = [convert_tree(c) for c in children[2:-1:2]] + return parsed_string_to_type(data_type, params) + + def unary_operation(*children): check_children(2, children) operator, value = children @@ -272,6 +293,8 @@ def concat_keywords(*children): 'CommentNamespaceContext': unsupported, 'UseContext': unsupported, 'JoinTypeContext': concat_keywords, + 'CastContext': cast_context, + 'PrimitiveDataTypeContext': detect_data_type, # WIP! # todo: check that all context are there # including yyy: definition @@ -310,3 +333,14 @@ def concat_keywords(*children): "-": Negate, "~": BitwiseNot, } + + +def parse_sql(string, rule): + parser = ast_parser(string) + tree = getattr(parser, rule)() + return convert_tree(tree) + + +def string_to_type(string): + ret = parse_sql(string, "singleDataType") + return ret diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index 42f15e337..210b6dee4 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -1,3 +1,4 @@ +from .ast.ast_to_python import string_to_type from .expressions.expressions import Expression from .expressions.fields import find_position_in_schema from .expressions.literals import Literal @@ -8,7 +9,7 @@ Or, Pow, StartsWith, Substring, Time ) from .expressions.orders import Asc, AscNullsFirst, AscNullsLast, Desc, DescNullsFirst, DescNullsLast, SortOrder -from .types import DataType, string_to_type, StructField +from .types import DataType, StructField from .utils import AnalysisException, IllegalArgumentException diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 3b6574e05..06935e73f 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1854,17 +1854,19 @@ def _check_series_convert_timestamps_tz_local(s, timezone): ) -def string_to_type(string): - if string in STRING_TO_TYPE: - return STRING_TO_TYPE[string] - if string.startswith("decimal("): - arguments = string[8:-1] - if arguments.count(",") == 1: - precision, scale = arguments.split(",") +def parsed_string_to_type(data_type, arguments): + data_type = data_type.lower() + if not arguments and data_type in STRING_TO_TYPE: + return STRING_TO_TYPE[data_type] + if data_type == "decimal": + if len(arguments) == 2: + precision, scale = arguments + elif len(arguments) == 1: + precision, scale = arguments[0], 0 else: - precision, scale = arguments, 0 + raise ParseException("Unrecognized decimal parameters: {0}".format(arguments)) return DecimalType(precision=int(precision), scale=int(scale)) - raise ParseException(f"Unable to parse data type {string}") + raise ParseException("Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "")) # Internal type hierarchy: From 8ecd9b86c46e93a96602bd9fbb6ef332a719bb62 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:33:22 +0200 Subject: [PATCH 028/118] Add type aliases --- pysparkling/sql/types.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 06935e73f..2e03ae1c8 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1845,12 +1845,15 @@ def _check_series_convert_timestamps_tz_local(s, timezone): bigint=LongType(), long=LongType(), float=FloatType(), + real=FloatType(), double=DoubleType(), date=DateType(), timestamp=TimestampType(), string=StringType(), binary=BinaryType(), - decimal=DecimalType() + decimal=DecimalType(), + dec=DecimalType(), + numeric=DecimalType() ) From 330b6dd55f9a51744a6fb2fe15a4fb9d11b0bc7e Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:33:33 +0200 Subject: [PATCH 029/118] Test type parsing --- .../sql/ast/tests/test_type_parsing.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pysparkling/sql/ast/tests/test_type_parsing.py diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py new file mode 100644 index 000000000..e3f0a94f8 --- /dev/null +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -0,0 +1,39 @@ +from unittest import TestCase + +import pytest +from numpy.testing._private.parameterized import parameterized + +from pysparkling.sql.types import * + +from pysparkling.sql.ast.ast_to_python import string_to_type + + +class TypeParsingTest(TestCase): + SCENARIOS = { + "boolean": BooleanType(), + "tinyint": ByteType(), + "byte": ByteType(), + "smallint": ShortType(), + "short": ShortType(), + "int": IntegerType(), + "integer": IntegerType(), + "bigint": LongType(), + "long": LongType(), + "float": FloatType(), + "real": FloatType(), + "double": DoubleType(), + "date": DateType(), + "timestamp": TimestampType(), + "string": StringType(), + "binary": BinaryType(), + "decimal": DecimalType(10, 0), + "decimal(5)": DecimalType(5, 0), + "decimal(5, 2)": DecimalType(5, 2), + "dec": DecimalType(10, 0), + "numeric": DecimalType(10, 0), + # todo: "interval": CalendarIntervalType(), + } + + @parameterized.expand(SCENARIOS.items()) + def test_equal(self, string, data_type): + self.assertEqual(string_to_type(string), data_type) From 16ef30ed8532c6b01e7b147432fd81024f98c5ad Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:45:55 +0200 Subject: [PATCH 030/118] Add parameterized as a dependency --- pysparkling/sql/ast/tests/test_type_parsing.py | 3 +-- setup.py | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index e3f0a94f8..03c743cda 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -1,7 +1,6 @@ from unittest import TestCase -import pytest -from numpy.testing._private.parameterized import parameterized +from parameterized import parameterized from pysparkling.sql.types import * diff --git a/setup.py b/setup.py index a855806ef..da27c42f7 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,7 @@ 'pytest-cov', 'isort', 'tornado>=4.3', + 'parameterized>=0.7.4', ], 'scripts': [ 'ipyparallel', From a6932a88d50b70a011a16d4483a2c06c55036b49 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:46:55 +0200 Subject: [PATCH 031/118] Clarify function name --- pysparkling/sql/ast/ast_to_python.py | 6 +++--- pysparkling/sql/ast/tests/test_type_parsing.py | 7 +++++-- pysparkling/sql/column.py | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 9cf2be640..f807699c0 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -341,6 +341,6 @@ def parse_sql(string, rule): return convert_tree(tree) -def string_to_type(string): - ret = parse_sql(string, "singleDataType") - return ret +def parse_data_type(string): + return parse_sql(string, "singleDataType") + diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index 03c743cda..b80db5000 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -4,7 +4,7 @@ from pysparkling.sql.types import * -from pysparkling.sql.ast.ast_to_python import string_to_type +from pysparkling.sql.ast.ast_to_python import parse_data_type class TypeParsingTest(TestCase): @@ -31,8 +31,11 @@ class TypeParsingTest(TestCase): "dec": DecimalType(10, 0), "numeric": DecimalType(10, 0), # todo: "interval": CalendarIntervalType(), + # todo: "char": CharType(), + with param + # todo: "character": CharType(), + with param + # todo: "varchar": VarChar(), + with param } @parameterized.expand(SCENARIOS.items()) def test_equal(self, string, data_type): - self.assertEqual(string_to_type(string), data_type) + self.assertEqual(parse_data_type(string), data_type) diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index 210b6dee4..f62c36ab6 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -1,4 +1,4 @@ -from .ast.ast_to_python import string_to_type +from pysparkling.sql.ast.ast_to_python import parse_data_type from .expressions.expressions import Expression from .expressions.fields import find_position_in_schema from .expressions.literals import Literal @@ -512,7 +512,7 @@ def cast(self, dataType): """ if isinstance(dataType, str): - dataType = string_to_type(dataType) + dataType = parse_data_type(dataType) elif not isinstance(dataType, DataType): raise NotImplementedError(f"Unknown cast type: {dataType}") From ef94080a401903cdfd8b1edcef48ef7abea02479 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:53:03 +0200 Subject: [PATCH 032/118] Remove unused check --- pysparkling/sql/ast/ast_to_python.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index f807699c0..aeb986326 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -79,7 +79,6 @@ def cast_context(*children): def detect_data_type(*children): - # check_children(1, children) data_type = convert_tree(children[0]) params = [convert_tree(c) for c in children[2:-1:2]] return parsed_string_to_type(data_type, params) From 8572580da5fe1a7538848254961bcc35ef34c3f4 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 19:53:34 +0200 Subject: [PATCH 033/118] Detect array types --- pysparkling/sql/ast/ast_to_python.py | 7 +++++++ pysparkling/sql/ast/tests/test_type_parsing.py | 2 ++ pysparkling/sql/types.py | 2 ++ 3 files changed, 11 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index aeb986326..4df6315c8 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -84,6 +84,12 @@ def detect_data_type(*children): return parsed_string_to_type(data_type, params) +def detect_complex_data_type(*children): + data_type = convert_tree(children[0]) + params = [convert_tree(c) for c in children[2:-1:2]] + return parsed_string_to_type(data_type, params) + + def unary_operation(*children): check_children(2, children) operator, value = children @@ -294,6 +300,7 @@ def concat_keywords(*children): 'JoinTypeContext': concat_keywords, 'CastContext': cast_context, 'PrimitiveDataTypeContext': detect_data_type, + 'ComplexDataTypeContext': detect_complex_data_type, # WIP! # todo: check that all context are there # including yyy: definition diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index b80db5000..f2b8ea566 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -30,6 +30,8 @@ class TypeParsingTest(TestCase): "decimal(5, 2)": DecimalType(5, 2), "dec": DecimalType(10, 0), "numeric": DecimalType(10, 0), + "array": ArrayType(StringType()), + "array": ArrayType(IntegerType()), # todo: "interval": CalendarIntervalType(), # todo: "char": CharType(), + with param # todo: "character": CharType(), + with param diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 2e03ae1c8..8bf100515 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1869,6 +1869,8 @@ def parsed_string_to_type(data_type, arguments): else: raise ParseException("Unrecognized decimal parameters: {0}".format(arguments)) return DecimalType(precision=int(precision), scale=int(scale)) + if data_type == "array" and len(arguments) == 1: + return ArrayType(arguments[0]) raise ParseException("Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "")) From 83fe840859f8f01443ddb83fb4f6259411ebfb6d Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 20:01:45 +0200 Subject: [PATCH 034/118] Detect map types --- pysparkling/sql/types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 8bf100515..48cab3e98 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1871,6 +1871,8 @@ def parsed_string_to_type(data_type, arguments): return DecimalType(precision=int(precision), scale=int(scale)) if data_type == "array" and len(arguments) == 1: return ArrayType(arguments[0]) + if data_type == "map" and len(arguments) == 2: + return MapType(arguments[0], arguments[1]) raise ParseException("Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "")) From 4d5beff045caced62fddd0136a5fd16b43da4711 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 20:03:05 +0200 Subject: [PATCH 035/118] Detect struct type --- pysparkling/sql/ast/ast_to_python.py | 1 + pysparkling/sql/ast/tests/test_type_parsing.py | 10 ++++++++-- pysparkling/sql/types.py | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 4df6315c8..4bbf1aea7 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -228,6 +228,7 @@ def concat_keywords(*children): 'ColTypeListContext': implicit_list, 'ComplexColTypeListContext': implicit_list, 'QualifiedNameListContext': implicit_list, + 'ComplexColTypeContext': implicit_list, "ComparisonContext": binary_operation, "ArithmeticBinaryContext": binary_operation, "LogicalBinaryContext": binary_operation, diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index f2b8ea566..16487bf9b 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -30,8 +30,14 @@ class TypeParsingTest(TestCase): "decimal(5, 2)": DecimalType(5, 2), "dec": DecimalType(10, 0), "numeric": DecimalType(10, 0), - "array": ArrayType(StringType()), - "array": ArrayType(IntegerType()), + "Array": ArrayType(StringType()), + "Array": ArrayType(IntegerType()), + "Map": MapType(StringType(), IntegerType()), + "Map < integer, String >": MapType(IntegerType(), StringType()), + "Struct": StructType([ + StructField(name="name", dataType=StringType()), + StructField(name="age", dataType=IntegerType()), + ]), # todo: "interval": CalendarIntervalType(), # todo: "char": CharType(), + with param # todo: "character": CharType(), + with param diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 48cab3e98..211eec109 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1873,6 +1873,11 @@ def parsed_string_to_type(data_type, arguments): return ArrayType(arguments[0]) if data_type == "map" and len(arguments) == 2: return MapType(arguments[0], arguments[1]) + if data_type == "struct" and len(arguments) == 1: + return StructType([ + StructField(name, data_type) + for name, data_type in arguments[0] + ]) raise ParseException("Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "")) From fb032eb72787c55aa76a740f740105ccf2d50312 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 19 Sep 2020 20:52:21 +0200 Subject: [PATCH 036/118] Remove duplicated code --- pysparkling/sql/ast/ast_to_python.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 4bbf1aea7..2ade661c9 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -84,12 +84,6 @@ def detect_data_type(*children): return parsed_string_to_type(data_type, params) -def detect_complex_data_type(*children): - data_type = convert_tree(children[0]) - params = [convert_tree(c) for c in children[2:-1:2]] - return parsed_string_to_type(data_type, params) - - def unary_operation(*children): check_children(2, children) operator, value = children @@ -301,7 +295,7 @@ def concat_keywords(*children): 'JoinTypeContext': concat_keywords, 'CastContext': cast_context, 'PrimitiveDataTypeContext': detect_data_type, - 'ComplexDataTypeContext': detect_complex_data_type, + 'ComplexDataTypeContext': detect_data_type, # WIP! # todo: check that all context are there # including yyy: definition From 5af7c2231690e8fe0cf76e0cef01167fab07e1a1 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 20 Sep 2020 12:20:56 +0200 Subject: [PATCH 037/118] Implement SQL struct builder --- pysparkling/sql/ast/ast_to_python.py | 6 ++++++ pysparkling/sql/ast/tests/test_parser.py | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 2ade661c9..cd631f545 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -4,6 +4,7 @@ from pysparkling.sql.ast.parser import ast_parser from pysparkling.sql.column import parse from pysparkling.sql.expressions.literals import Literal +from pysparkling.sql.expressions.mappers import CreateStruct from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ BitwiseNot, UnaryPositive @@ -135,6 +136,10 @@ def concat_keywords(*children): return " ".join(convert_tree(c) for c in children) +def build_struct(*children): + return CreateStruct([convert_tree(c) for c in children[2:-1:2]]) + + CONVERTERS = { "SingleStatementContext": first_child_only, "SingleExpressionContext": child_and_eof, @@ -296,6 +301,7 @@ def concat_keywords(*children): 'CastContext': cast_context, 'PrimitiveDataTypeContext': detect_data_type, 'ComplexDataTypeContext': detect_data_type, + 'StructContext': build_struct, # WIP! # todo: check that all context are there # including yyy: definition diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py index 127fc82dc..3aaba5b4c 100644 --- a/pysparkling/sql/ast/tests/test_parser.py +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -13,5 +13,12 @@ def test_where(self): print_tree(tree) sys.stdin.flush() col = convert_tree(tree) - print(col) self.assertEqual(str(col), "(doesItWorks = In progress!)") + + def test_struct(self): + parser = ast_parser("Struct('Alice', 2)") + tree = parser.primaryExpression() + print_tree(tree) + sys.stdin.flush() + col = convert_tree(tree) + self.assertEqual(str(col), "struct(Alice, 2)") From aafb26ad2d0ff24ec964ae3618c2455abe6b3d58 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 20 Sep 2020 12:21:11 +0200 Subject: [PATCH 038/118] Implement logical Not --- pysparkling/sql/ast/ast_to_python.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index cd631f545..77945c955 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -236,6 +236,7 @@ def build_struct(*children): "SubqueryContext": parenthesis_context, "SubqueryExpressionContext": parenthesis_context, "ArithmeticUnaryContext": unary_operation, + "LogicalNot": unary_operation, 'CreateTableHeaderContext': unsupported, 'ReplaceTableHeaderContext': unsupported, 'CreateTableClausesContext': unsupported, @@ -339,6 +340,7 @@ def build_struct(*children): "+": UnaryPositive, "-": Negate, "~": BitwiseNot, + 'NOT': Invert } From ad570cfbf638bf85fa4e1ac81aab6ef2b1fb6e41 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:43:26 +0200 Subject: [PATCH 039/118] Add a debug mode to sql parsing function --- pysparkling/sql/ast/ast_to_python.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 77945c955..ba4492c3a 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,7 +1,9 @@ import ast import logging +import sys from pysparkling.sql.ast.parser import ast_parser +from pysparkling.sql.ast.utils import print_tree from pysparkling.sql.column import parse from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.mappers import CreateStruct @@ -344,9 +346,12 @@ def build_struct(*children): } -def parse_sql(string, rule): +def parse_sql(string, rule, debug=False): parser = ast_parser(string) tree = getattr(parser, rule)() + if debug: + print_tree(tree) + sys.stdin.flush() return convert_tree(tree) From fd9e65971d6d839565d65b98ce2638c959aac7ca Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:46:35 +0200 Subject: [PATCH 040/118] Fix operation lookup when name contains letters --- pysparkling/sql/ast/ast_to_python.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index ba4492c3a..4142eec9a 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -62,7 +62,7 @@ def convert_tree(tree): def binary_operation(*children): check_children(3, children) left, operator, right = children - cls = binary_operations[convert_tree(operator)] + cls = binary_operations[convert_tree(operator).upper()] return cls( convert_tree(left), convert_tree(right) @@ -90,7 +90,7 @@ def detect_data_type(*children): def unary_operation(*children): check_children(2, children) operator, value = children - cls = unary_operations[convert_tree(operator)] + cls = unary_operations[convert_tree(operator).lower()] return cls( convert_tree(value) ) From d81073d47325c8066a9098fa1099b891a1a406cc Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:47:08 +0200 Subject: [PATCH 041/118] Clarify exception class --- pysparkling/sql/ast/ast_to_python.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 4142eec9a..cc0223dd6 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -34,7 +34,7 @@ def never_found(*children): def unsupported(*children): - raise Exception("Unsupported statement") + raise SqlParsingError("Unsupported statement") def empty(*children): @@ -105,9 +105,9 @@ def get_leaf_value(*children): check_children(1, children) value = children[0] if value.__class__.__name__ != "TerminalNodeImpl": - raise Exception("Expecting TerminalNodeImpl, got {0}".format(value.__class__.__name__)) + raise SqlParsingError("Expecting TerminalNodeImpl, got {0}".format(value.__class__.__name__)) if not hasattr(value, "symbol"): - raise Exception("Got leaf value but without symbol") + raise SqlParsingError("Got leaf value but without symbol") return value.symbol.text From f0f95231b9c3c4bbb2eb576a3b241ac4d2df2da5 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:47:34 +0200 Subject: [PATCH 042/118] Add expression parser --- pysparkling/sql/ast/ast_to_python.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index cc0223dd6..0db93d6aa 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -355,6 +355,9 @@ def parse_sql(string, rule, debug=False): return convert_tree(tree) -def parse_data_type(string): - return parse_sql(string, "singleDataType") +def parse_data_type(string, debug=False): + return parse_sql(string, "singleDataType", debug) + +def parse_expression(string, debug=False): + return parse_sql(string, "singleExpression", debug) From 569f27132cc11e48a51d8c642a6da2b2dc107bdc Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:48:52 +0200 Subject: [PATCH 043/118] Enhance literal parsing --- pysparkling/sql/ast/ast_to_python.py | 48 ++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 0db93d6aa..2893a5f25 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -101,6 +101,26 @@ def parenthesis_context(*children): return convert_tree(children[1]) +def parse_boolean(*children): + check_children(1, children) + value = convert_tree(children[0]) + if value.lower() == "false": + return False + if value.lower() == "true": + return True + raise SqlParsingError("Expecting boolean value, got {0}".format(children)) + + +def convert_to_literal(*children): + check_children(1, children) + value = convert_tree(children[0]) + return Literal(value) + + +def convert_to_null(*children): + return None + + def get_leaf_value(*children): check_children(1, children) value = children[0] @@ -130,8 +150,8 @@ def implicit_list(*children): ) -def concat_to_literal(*children): - return Literal(ast.literal_eval("".join(convert_tree(c) for c in children))) +def concat_to_value(*children): + return ast.literal_eval("".join(convert_tree(c) for c in children)) def concat_keywords(*children): @@ -155,7 +175,7 @@ def build_struct(*children): 'ComparisonOperatorContext': get_leaf_value, 'ArithmeticOperatorContext': get_leaf_value, 'PredicateOperatorContext': get_leaf_value, - 'BooleanValueContext': get_leaf_value, + 'BooleanValueContext': parse_boolean, 'QuotedIdentifierContext': get_leaf_value, 'AnsiNonReservedContext': get_leaf_value, 'StrictNonReservedContext': get_leaf_value, @@ -180,9 +200,9 @@ def build_struct(*children): 'TableValuedFunctionContext': unwrap, 'IdentityTransformContext': unwrap, 'ValueExpressionDefaultContext': unwrap, - 'ConstantDefaultContext': unwrap, + 'ConstantDefaultContext': convert_to_literal, 'ColumnReferenceContext': unwrap, - 'NullLiteralContext': unwrap, + 'NullLiteralContext': convert_to_null, 'IntervalLiteralContext': unwrap, 'NumericLiteralContext': unwrap, 'BooleanLiteralContext': unwrap, @@ -207,15 +227,15 @@ def build_struct(*children): "TransformContext": never_found, "ValueExpressionContext": never_found, "WindowSpecContext": never_found, - 'ExponentLiteralContext': concat_to_literal, - 'DecimalLiteralContext': concat_to_literal, - 'LegacyDecimalLiteralContext': concat_to_literal, - 'IntegerLiteralContext': concat_to_literal, - 'BigIntLiteralContext': concat_to_literal, - 'SmallIntLiteralContext': concat_to_literal, - 'TinyIntLiteralContext': concat_to_literal, - 'DoubleLiteralContext': concat_to_literal, - 'BigDecimalLiteralContext': concat_to_literal, + 'ExponentLiteralContext': concat_to_value, + 'DecimalLiteralContext': concat_to_value, + 'LegacyDecimalLiteralContext': concat_to_value, + 'IntegerLiteralContext': concat_to_value, + 'BigIntLiteralContext': concat_to_value, + 'SmallIntLiteralContext': concat_to_value, + 'TinyIntLiteralContext': concat_to_value, + 'DoubleLiteralContext': concat_to_value, + 'BigDecimalLiteralContext': concat_to_value, 'TablePropertyListContext': explicit_list, 'ConstantListContext': explicit_list, 'NestedConstantListContext': explicit_list, From 2cdc6c97eda4c319c1eed6022a68d3ec9073ba25 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 21:49:28 +0200 Subject: [PATCH 044/118] Test operation parsing --- pysparkling/sql/ast/tests/test_operations.py | 59 ++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 pysparkling/sql/ast/tests/test_operations.py diff --git a/pysparkling/sql/ast/tests/test_operations.py b/pysparkling/sql/ast/tests/test_operations.py new file mode 100644 index 000000000..4b010fa1f --- /dev/null +++ b/pysparkling/sql/ast/tests/test_operations.py @@ -0,0 +1,59 @@ +from unittest import TestCase + +from parameterized import parameterized +from parameterized.parameterized import default_name_func + +from pysparkling import Row +from pysparkling.sql.ast.ast_to_python import parse_expression +from pysparkling.sql.types import StructType + +ROW = Row() +SCHEMA = StructType() + + +def test_name(func, num, p): + base_name = default_name_func(func, num, p) + if len(p.args) > 1 and isinstance(p.args[1], tuple) and isinstance(p.args[1][0], str): + return base_name + "_" + parameterized.to_safe_name(p.args[1][0]) + return base_name + + +class TestOperations(TestCase): + SCENARIOS = { + '60=60': ('EQ', '(60 = 60)', True), + '60=12': ('EQ', '(60 = 12)', False), + '60==12': ('EQ2', '(60 = 12)', False), + '12<>12': ('NEQ', '(NOT (12 = 12))', False), + '60<>12': ('NEQ', '(NOT (60 = 12))', True), + '60!=12': ('NEQ2', '(NOT (60 = 12))', True), + '60<12': ('LT', '(60 < 12)', False), + '60<=12': ('LTE', '(60 <= 12)', False), + '60!>12': ('LTE2', '(60 <= 12)', False), + '60>12': ('GT', '(60 > 12)', True), + '60>=12': ('GTE', '(60 >= 12)', True), + '60!<12': ('GTE2', '(60 >= 12)', True), + '60+12': ('PLUS', '(60 + 12)', 72), + '60-12': ('MINUS', '(60 - 12)', 48), + '60*12': ('TIMES', '(60 * 12)', 720), + # '60/12': ('DIVIDE', '(60 / 12)', None), + '60%12': ('MODULO', '(60 % 12)', 0), + # '60 div 12': ('DIV', '(60 DIV 12)', None), + '6&3': ('BITWISE_AND', '(6 & 3)', 2), + '6|3': ('BITWISE_OR', '(6 | 3)', 7), + # '60||12': ('CONCAT', '(60 || 12)', None), + '6^3': ('BITWISE_XOR', '(6 ^ 3)', 5), + 'true and false': ('LOGICAL_AND', '(true AND false)', False), + 'TRUE AND TRUE': ('LOGICAL_AND', '(true AND true)', True), + 'true AND null': ('LOGICAL_AND', '(true AND NULL)', None), + 'True or False': ('LOGICAL_OR', '(true OR false)', True), + 'false or false': ('LOGICAL_OR', '(false OR false)', False), + 'true or NULL': ('LOGICAL_OR', '(true OR NULL)', None), + } + + @parameterized.expand(SCENARIOS.items(), name_func=test_name) + def test_operations(self, string, expected): + operator, expected_parsed, expected_result = expected + actual_parsed = parse_expression(string, True) + self.assertEqual(expected_parsed, str(actual_parsed)) + actual_result = actual_parsed.eval(Row(), SCHEMA) + self.assertEqual(expected_result, actual_result) From 8da031edd8103df859c8bdf59449e4e7ca67d129 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:19:41 +0200 Subject: [PATCH 045/118] Resolve conflict in function name with pytest convention --- pysparkling/sql/ast/tests/test_operations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_operations.py b/pysparkling/sql/ast/tests/test_operations.py index 4b010fa1f..48813f4c8 100644 --- a/pysparkling/sql/ast/tests/test_operations.py +++ b/pysparkling/sql/ast/tests/test_operations.py @@ -11,7 +11,7 @@ SCHEMA = StructType() -def test_name(func, num, p): +def format_test_name(func, num, p): base_name = default_name_func(func, num, p) if len(p.args) > 1 and isinstance(p.args[1], tuple) and isinstance(p.args[1][0], str): return base_name + "_" + parameterized.to_safe_name(p.args[1][0]) @@ -50,7 +50,7 @@ class TestOperations(TestCase): 'true or NULL': ('LOGICAL_OR', '(true OR NULL)', None), } - @parameterized.expand(SCENARIOS.items(), name_func=test_name) + @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) def test_operations(self, string, expected): operator, expected_parsed, expected_result = expected actual_parsed = parse_expression(string, True) From 4d02d8fb631bc5142b3507d7bd8df55e1a30f346 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:19:55 +0200 Subject: [PATCH 046/118] Use new utils in tests --- pysparkling/sql/ast/tests/test_parser.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py index 3aaba5b4c..97df9825f 100644 --- a/pysparkling/sql/ast/tests/test_parser.py +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -1,24 +1,13 @@ -import sys from unittest import TestCase -from pysparkling.sql.ast.ast_to_python import convert_tree -from pysparkling.sql.ast.parser import ast_parser -from pysparkling.sql.ast.utils import print_tree +from pysparkling.sql.ast.ast_to_python import parse_sql class TestParser(TestCase): def test_where(self): - parser = ast_parser("doesItWorks = 'In progress!'") - tree = parser.booleanExpression() - print_tree(tree) - sys.stdin.flush() - col = convert_tree(tree) + col = parse_sql("doesItWorks = 'In progress!'", rule="booleanExpression", debug=True) self.assertEqual(str(col), "(doesItWorks = In progress!)") def test_struct(self): - parser = ast_parser("Struct('Alice', 2)") - tree = parser.primaryExpression() - print_tree(tree) - sys.stdin.flush() - col = convert_tree(tree) + col = parse_sql("Struct('Alice', 2)", rule="primaryExpression", debug=True) self.assertEqual(str(col), "struct(Alice, 2)") From dfa899ad650031c83d1733291b90cf3b577ab3d9 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:20:15 +0200 Subject: [PATCH 047/118] Fix unary operation lookup --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 2893a5f25..942932687 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -90,7 +90,7 @@ def detect_data_type(*children): def unary_operation(*children): check_children(2, children) operator, value = children - cls = unary_operations[convert_tree(operator).lower()] + cls = unary_operations[convert_tree(operator).upper()] return cls( convert_tree(value) ) From f9fe965b48a9ff461ee040162ef8dcb63f096817 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:20:37 +0200 Subject: [PATCH 048/118] Fix implementation of not --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 942932687..1e2171bbb 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -258,7 +258,7 @@ def build_struct(*children): "SubqueryContext": parenthesis_context, "SubqueryExpressionContext": parenthesis_context, "ArithmeticUnaryContext": unary_operation, - "LogicalNot": unary_operation, + "LogicalNotContext": unary_operation, 'CreateTableHeaderContext': unsupported, 'ReplaceTableHeaderContext': unsupported, 'CreateTableClausesContext': unsupported, From d5ba0b1fc09f57b6986aa8f984d66128b5a457a5 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:21:02 +0200 Subject: [PATCH 049/118] Flush the correct streams in debug mode --- pysparkling/sql/ast/ast_to_python.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 1e2171bbb..e9ca3aa49 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -370,8 +370,9 @@ def parse_sql(string, rule, debug=False): parser = ast_parser(string) tree = getattr(parser, rule)() if debug: + sys.stderr.flush() print_tree(tree) - sys.stdin.flush() + sys.stdout.flush() return convert_tree(tree) From 9d05b0c2fbfa9633269fe3fb936d66a64655782c Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 22:37:47 +0200 Subject: [PATCH 050/118] Test unary operations --- pysparkling/sql/ast/tests/test_operations.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pysparkling/sql/ast/tests/test_operations.py b/pysparkling/sql/ast/tests/test_operations.py index 48813f4c8..76f556321 100644 --- a/pysparkling/sql/ast/tests/test_operations.py +++ b/pysparkling/sql/ast/tests/test_operations.py @@ -48,6 +48,11 @@ class TestOperations(TestCase): 'True or False': ('LOGICAL_OR', '(true OR false)', True), 'false or false': ('LOGICAL_OR', '(false OR false)', False), 'true or NULL': ('LOGICAL_OR', '(true OR NULL)', None), + "+1": ("UNARY_PLUS", '(+ 1)', 1), + "-(1)": ("UNARY_MINUS", '(- 1)', -1), + "~8": ("BITWISE_NOT", '~8', -9), + 'not true': ("NOT", '(NOT true)', False), + 'Not Null': ("NOT", '(NOT NULL)', None), } @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) From 2d60baea6b3321a65c416e1b56a7277c956dd424 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Tue, 22 Sep 2020 23:08:01 +0200 Subject: [PATCH 051/118] Handle aliases --- pysparkling/sql/ast/ast_to_python.py | 36 ++++++++++++++++++++++-- pysparkling/sql/ast/tests/test_parser.py | 31 ++++++++++++++++---- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index e9ca3aa49..46cd2ea61 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -9,7 +9,7 @@ from pysparkling.sql.expressions.mappers import CreateStruct from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ - BitwiseNot, UnaryPositive + BitwiseNot, UnaryPositive, Alias from pysparkling.sql.functions import Concat from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type @@ -158,10 +158,40 @@ def concat_keywords(*children): return " ".join(convert_tree(c) for c in children) +def concat_strings(*children): + return "".join(convert_tree(c) for c in children) + + def build_struct(*children): return CreateStruct([convert_tree(c) for c in children[2:-1:2]]) +def potential_alias(*chidren): + if len(chidren) == 1: + return convert_tree(chidren[0]) + if len(chidren) in (2, 3): + return Alias( + convert_tree(chidren[0]), + convert_tree(chidren[-1]) + ) + raise SqlParsingError("Expecting 1, 2 or 3 children, got {0}".format(len(chidren))) + + +def check_identifier(*children): + check_children(2, children) + identifier = convert_tree(children[0]) + if children[1].children: + extra = convert_tree(children[1]) + raise SqlParsingError(( + "Possibly unquoted identifier {0}{1} detected. " + "Please consider quoting it with back-quotes as `{0}{1}`" + ).format(identifier, extra)) + return identifier + + +def debug(*children): + pass + CONVERTERS = { "SingleStatementContext": first_child_only, "SingleExpressionContext": child_and_eof, @@ -325,11 +355,13 @@ def build_struct(*children): 'PrimitiveDataTypeContext': detect_data_type, 'ComplexDataTypeContext': detect_data_type, 'StructContext': build_struct, + "NamedExpressionContext": potential_alias, + "ErrorCapturingIdentifierContext": check_identifier, + "ErrorIdentContext": concat_strings, # WIP! # todo: check that all context are there # including yyy: definition # and definition #xxx - "NamedExpressionContext": unwrap, "PredicatedContext": unwrap, } diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py index 97df9825f..c1edefd55 100644 --- a/pysparkling/sql/ast/tests/test_parser.py +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -1,13 +1,34 @@ from unittest import TestCase -from pysparkling.sql.ast.ast_to_python import parse_sql +from pysparkling.sql.ast.ast_to_python import parse_sql, SqlParsingError class TestParser(TestCase): def test_where(self): - col = parse_sql("doesItWorks = 'In progress!'", rule="booleanExpression", debug=True) - self.assertEqual(str(col), "(doesItWorks = In progress!)") + col = parse_sql("doesItWorks = 'In progress!'", rule="booleanExpression") + self.assertEqual("(doesItWorks = In progress!)", str(col)) + + def test_named_expression_no_alias(self): + col = parse_sql("1 + 2", rule="singleExpression") + self.assertEqual("(1 + 2)", str(col)) + + def test_named_expression_implicit_alias(self): + col = parse_sql("(1 + 2) sum", rule="singleExpression") + self.assertEqual("sum", str(col)) + + def test_named_expression_explicit_alias(self): + col = parse_sql("1 + 2 as sum", rule="singleExpression") + self.assertEqual("sum", str(col)) + + def test_named_expression_bad_alias(self): + with self.assertRaises(SqlParsingError) as ctx: + parse_sql("1 + 2 as invalid-alias", rule="singleExpression") + self.assertEqual( + 'Possibly unquoted identifier invalid-alias detected. ' + 'Please consider quoting it with back-quotes as `invalid-alias`', + str(ctx.exception) + ) def test_struct(self): - col = parse_sql("Struct('Alice', 2)", rule="primaryExpression", debug=True) - self.assertEqual(str(col), "struct(Alice, 2)") + col = parse_sql("Struct('Alice', 2)", rule="primaryExpression") + self.assertEqual("struct(Alice, 2)", str(col)) From 97e0c69bf61b79b60226111aca5d66d5cf12f5e2 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 3 Oct 2020 12:57:06 +0200 Subject: [PATCH 052/118] Implement basic function call --- pysparkling/sql/ast/ast_to_python.py | 41 ++++++++++++++++++--- pysparkling/sql/ast/tests/test_functions.py | 35 ++++++++++++++++++ pysparkling/sql/ast/tests/test_parser.py | 8 ++++ 3 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 pysparkling/sql/ast/tests/test_functions.py diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 46cd2ea61..f58564644 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -6,11 +6,11 @@ from pysparkling.sql.ast.utils import print_tree from pysparkling.sql.column import parse from pysparkling.sql.expressions.literals import Literal -from pysparkling.sql.expressions.mappers import CreateStruct +from pysparkling.sql.expressions.mappers import CreateStruct, Concat from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ BitwiseNot, UnaryPositive, Alias -from pysparkling.sql.functions import Concat +from pysparkling.sql import functions from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type @@ -52,13 +52,39 @@ def child_and_eof(*children): def convert_tree(tree): tree_type = tree.__class__.__name__ - logging.warning(tree_type) if not hasattr(tree, "children"): return get_leaf_value(tree) converter = CONVERTERS[tree_type] return converter(*tree.children) +def call_function(*children): + raw_function_name = convert_tree(children[0]) + function_name = next( + (name for name in functions.__all__ if name.lower() == raw_function_name.lower()), + None + ) + function = getattr(functions, function_name) + + params = [convert_tree(c) for c in children[2:-1]] + + complex_function = ')' in params + if not complex_function: + last_argument_position = None + filter_clause = None + over_clause = None + set_clause = None + else: + last_argument_position = params.index(")") + filter_clause = ... # todo + over_clause = ... # todo + set_clause = ... # todo + + # parameters are comma separated + function_arguments = params[0:last_argument_position:2] + return function(*function_arguments) + + def binary_operation(*children): check_children(3, children) left, operator, right = children @@ -183,15 +209,16 @@ def check_identifier(*children): if children[1].children: extra = convert_tree(children[1]) raise SqlParsingError(( - "Possibly unquoted identifier {0}{1} detected. " - "Please consider quoting it with back-quotes as `{0}{1}`" - ).format(identifier, extra)) + "Possibly unquoted identifier {0}{1} detected. " + "Please consider quoting it with back-quotes as `{0}{1}`" + ).format(identifier, extra)) return identifier def debug(*children): pass + CONVERTERS = { "SingleStatementContext": first_child_only, "SingleExpressionContext": child_and_eof, @@ -358,6 +385,8 @@ def debug(*children): "NamedExpressionContext": potential_alias, "ErrorCapturingIdentifierContext": check_identifier, "ErrorIdentContext": concat_strings, + "FunctionCallContext": call_function, + "QualifiedNameContext": concat_strings, # WIP! # todo: check that all context are there # including yyy: definition diff --git a/pysparkling/sql/ast/tests/test_functions.py b/pysparkling/sql/ast/tests/test_functions.py new file mode 100644 index 000000000..fe2037625 --- /dev/null +++ b/pysparkling/sql/ast/tests/test_functions.py @@ -0,0 +1,35 @@ +from unittest import TestCase + +from parameterized import parameterized +from parameterized.parameterized import default_name_func + +from pysparkling import Row +from pysparkling.sql.ast.ast_to_python import parse_expression +from pysparkling.sql.types import StructType + +ROW = Row() +SCHEMA = StructType() + + +def format_test_name(func, num, p): + base_name = default_name_func(func, num, p) + if len(p.args) > 1 and isinstance(p.args[1], tuple) and isinstance(p.args[1][0], str): + return base_name + "_" + parameterized.to_safe_name(p.args[1][0]) + return base_name + + +class TestFunctions(TestCase): + SCENARIOS = { + 'Least(-1,0,1)': ('least', 'least(-1, 0, 1)', -1), + 'GREATEST(-1,0,1)': ('greatest', 'greatest(-1, 0, 1)', 1), + 'shiftRight ( 42, 1 )': ('shiftRight', 'shiftRight(42, 1)', 1), + 'ShiftLeft ( 42, 1 )': ('shiftRight', 'shiftleft(42, 1)', 1), + } + + @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) + def test_functions(self, string, expected): + operator, expected_parsed, expected_result = expected + actual_parsed = parse_expression(string, True) + self.assertEqual(expected_parsed, str(actual_parsed)) + actual_result = actual_parsed.eval(Row(), SCHEMA) + self.assertEqual(expected_result, actual_result) diff --git a/pysparkling/sql/ast/tests/test_parser.py b/pysparkling/sql/ast/tests/test_parser.py index c1edefd55..c6d142af4 100644 --- a/pysparkling/sql/ast/tests/test_parser.py +++ b/pysparkling/sql/ast/tests/test_parser.py @@ -32,3 +32,11 @@ def test_named_expression_bad_alias(self): def test_struct(self): col = parse_sql("Struct('Alice', 2)", rule="primaryExpression") self.assertEqual("struct(Alice, 2)", str(col)) + + def test_function(self): + col = parse_sql("GREATEST(1,2,3)", rule="singleExpression") + self.assertEqual("greatest(1, 2, 3)", str(col)) + + # def test_where_filter(self): + # col = parse_sql("concat(1,2 ,3) filter (where id<2)", rule="singleExpression") + # self.assertEqual("..", str(col)) From e08b7d1c2b4403e0ba98170dd31862a9a7008560 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Mon, 26 Oct 2020 17:34:57 +0100 Subject: [PATCH 053/118] Extract sql parsing in a dedicated package --- .../sql/ast/{generated => }/__init__.py | 0 pysparkling/sql/ast/ast_to_python.py | 11 +- pysparkling/sql/ast/generated/README.md | 4 - pysparkling/sql/ast/generated/SqlBase.interp | 742 - pysparkling/sql/ast/generated/SqlBase.tokens | 572 - .../sql/ast/generated/SqlBaseLexer.interp | 912 - pysparkling/sql/ast/generated/SqlBaseLexer.py | 1878 -- .../sql/ast/generated/SqlBaseLexer.tokens | 572 - .../sql/ast/generated/SqlBaseListener.py | 2404 -- .../sql/ast/generated/SqlBaseParser.py | 22167 ---------------- pysparkling/sql/ast/grammar/SqlBase.g4 | 1829 -- pysparkling/sql/ast/parser.py | 78 - pysparkling/sql/ast/tests/test_functions.py | 17 +- pysparkling/sql/ast/utils.py | 14 - setup.py | 3 +- 15 files changed, 16 insertions(+), 31187 deletions(-) rename pysparkling/sql/ast/{generated => }/__init__.py (100%) delete mode 100644 pysparkling/sql/ast/generated/README.md delete mode 100644 pysparkling/sql/ast/generated/SqlBase.interp delete mode 100644 pysparkling/sql/ast/generated/SqlBase.tokens delete mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.interp delete mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.py delete mode 100644 pysparkling/sql/ast/generated/SqlBaseLexer.tokens delete mode 100644 pysparkling/sql/ast/generated/SqlBaseListener.py delete mode 100644 pysparkling/sql/ast/generated/SqlBaseParser.py delete mode 100644 pysparkling/sql/ast/grammar/SqlBase.g4 delete mode 100644 pysparkling/sql/ast/parser.py delete mode 100644 pysparkling/sql/ast/utils.py diff --git a/pysparkling/sql/ast/generated/__init__.py b/pysparkling/sql/ast/__init__.py similarity index 100% rename from pysparkling/sql/ast/generated/__init__.py rename to pysparkling/sql/ast/__init__.py diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index f58564644..d302a7aed 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -64,8 +64,8 @@ def call_function(*children): (name for name in functions.__all__ if name.lower() == raw_function_name.lower()), None ) - function = getattr(functions, function_name) - + # function = getattr(functions, function_name) + this should get an Expression init, not a function params = [convert_tree(c) for c in children[2:-1]] complex_function = ')' in params @@ -428,12 +428,7 @@ def debug(*children): def parse_sql(string, rule, debug=False): - parser = ast_parser(string) - tree = getattr(parser, rule)() - if debug: - sys.stderr.flush() - print_tree(tree) - sys.stdout.flush() + tree = string_to_ast(string, rule, debug) return convert_tree(tree) diff --git a/pysparkling/sql/ast/generated/README.md b/pysparkling/sql/ast/generated/README.md deleted file mode 100644 index 8408340af..000000000 --- a/pysparkling/sql/ast/generated/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Python files in this folder were generated based on the antl4r grammar -localed in `pysparkling/sql/ast/grammar/SqlBase.g4`. - -NB: They could be generated only in Pysparkling package, but it would make it harder to contribute to the project. diff --git a/pysparkling/sql/ast/generated/SqlBase.interp b/pysparkling/sql/ast/generated/SqlBase.interp deleted file mode 100644 index 216d07eac..000000000 --- a/pysparkling/sql/ast/generated/SqlBase.interp +++ /dev/null @@ -1,742 +0,0 @@ -token literal names: -null -';' -'(' -')' -',' -'.' -'/*+' -'*/' -'->' -'[' -']' -':' -'ADD' -'AFTER' -'ALL' -'ALTER' -'ANALYZE' -'AND' -'ANTI' -'ANY' -'ARCHIVE' -'ARRAY' -'AS' -'ASC' -'AT' -'AUTHORIZATION' -'BETWEEN' -'BOTH' -'BUCKET' -'BUCKETS' -'BY' -'CACHE' -'CASCADE' -'CASE' -'CAST' -'CHANGE' -'CHECK' -'CLEAR' -'CLUSTER' -'CLUSTERED' -'CODEGEN' -'COLLATE' -'COLLECTION' -'COLUMN' -'COLUMNS' -'COMMENT' -'COMMIT' -'COMPACT' -'COMPACTIONS' -'COMPUTE' -'CONCATENATE' -'CONSTRAINT' -'COST' -'CREATE' -'CROSS' -'CUBE' -'CURRENT' -'CURRENT_DATE' -'CURRENT_TIME' -'CURRENT_TIMESTAMP' -'CURRENT_USER' -'DATA' -'DATABASE' -null -'DAY' -'DBPROPERTIES' -'DEFINED' -'DELETE' -'DELIMITED' -'DESC' -'DESCRIBE' -'DFS' -'DIRECTORIES' -'DIRECTORY' -'DISTINCT' -'DISTRIBUTE' -'DROP' -'ELSE' -'END' -'ESCAPE' -'ESCAPED' -'EXCEPT' -'EXCHANGE' -'EXISTS' -'EXPLAIN' -'EXPORT' -'EXTENDED' -'EXTERNAL' -'EXTRACT' -'FALSE' -'FETCH' -'FIELDS' -'FILTER' -'FILEFORMAT' -'FIRST' -'FOLLOWING' -'FOR' -'FOREIGN' -'FORMAT' -'FORMATTED' -'FROM' -'FULL' -'FUNCTION' -'FUNCTIONS' -'GLOBAL' -'GRANT' -'GROUP' -'GROUPING' -'HAVING' -'HOUR' -'IF' -'IGNORE' -'IMPORT' -'IN' -'INDEX' -'INDEXES' -'INNER' -'INPATH' -'INPUTFORMAT' -'INSERT' -'INTERSECT' -'INTERVAL' -'INTO' -'IS' -'ITEMS' -'JOIN' -'KEYS' -'LAST' -'LATERAL' -'LAZY' -'LEADING' -'LEFT' -'LIKE' -'LIMIT' -'LINES' -'LIST' -'LOAD' -'LOCAL' -'LOCATION' -'LOCK' -'LOCKS' -'LOGICAL' -'MACRO' -'MAP' -'MATCHED' -'MERGE' -'MINUTE' -'MONTH' -'MSCK' -'NAMESPACE' -'NAMESPACES' -'NATURAL' -'NO' -null -'NULL' -'NULLS' -'OF' -'ON' -'ONLY' -'OPTION' -'OPTIONS' -'OR' -'ORDER' -'OUT' -'OUTER' -'OUTPUTFORMAT' -'OVER' -'OVERLAPS' -'OVERLAY' -'OVERWRITE' -'PARTITION' -'PARTITIONED' -'PARTITIONS' -'PERCENT' -'PIVOT' -'PLACING' -'POSITION' -'PRECEDING' -'PRIMARY' -'PRINCIPALS' -'PROPERTIES' -'PURGE' -'QUERY' -'RANGE' -'RECORDREADER' -'RECORDWRITER' -'RECOVER' -'REDUCE' -'REFERENCES' -'REFRESH' -'RENAME' -'REPAIR' -'REPLACE' -'RESET' -'RESTRICT' -'REVOKE' -'RIGHT' -null -'ROLE' -'ROLES' -'ROLLBACK' -'ROLLUP' -'ROW' -'ROWS' -'SCHEMA' -'SECOND' -'SELECT' -'SEMI' -'SEPARATED' -'SERDE' -'SERDEPROPERTIES' -'SESSION_USER' -'SET' -'MINUS' -'SETS' -'SHOW' -'SKEWED' -'SOME' -'SORT' -'SORTED' -'START' -'STATISTICS' -'STORED' -'STRATIFY' -'STRUCT' -'SUBSTR' -'SUBSTRING' -'TABLE' -'TABLES' -'TABLESAMPLE' -'TBLPROPERTIES' -null -'TERMINATED' -'THEN' -'TO' -'TOUCH' -'TRAILING' -'TRANSACTION' -'TRANSACTIONS' -'TRANSFORM' -'TRIM' -'TRUE' -'TRUNCATE' -'TYPE' -'UNARCHIVE' -'UNBOUNDED' -'UNCACHE' -'UNION' -'UNIQUE' -'UNKNOWN' -'UNLOCK' -'UNSET' -'UPDATE' -'USE' -'USER' -'USING' -'VALUES' -'VIEW' -'VIEWS' -'WHEN' -'WHERE' -'WINDOW' -'WITH' -'YEAR' -null -'<=>' -'<>' -'!=' -'<' -null -'>' -null -'+' -'-' -'*' -'/' -'%' -'DIV' -'~' -'&' -'|' -'||' -'^' -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null - -token symbolic names: -null -null -null -null -null -null -null -null -null -null -null -null -ADD -AFTER -ALL -ALTER -ANALYZE -AND -ANTI -ANY -ARCHIVE -ARRAY -AS -ASC -AT -AUTHORIZATION -BETWEEN -BOTH -BUCKET -BUCKETS -BY -CACHE -CASCADE -CASE -CAST -CHANGE -CHECK -CLEAR -CLUSTER -CLUSTERED -CODEGEN -COLLATE -COLLECTION -COLUMN -COLUMNS -COMMENT -COMMIT -COMPACT -COMPACTIONS -COMPUTE -CONCATENATE -CONSTRAINT -COST -CREATE -CROSS -CUBE -CURRENT -CURRENT_DATE -CURRENT_TIME -CURRENT_TIMESTAMP -CURRENT_USER -DATA -DATABASE -DATABASES -DAY -DBPROPERTIES -DEFINED -DELETE -DELIMITED -DESC -DESCRIBE -DFS -DIRECTORIES -DIRECTORY -DISTINCT -DISTRIBUTE -DROP -ELSE -END -ESCAPE -ESCAPED -EXCEPT -EXCHANGE -EXISTS -EXPLAIN -EXPORT -EXTENDED -EXTERNAL -EXTRACT -FALSE -FETCH -FIELDS -FILTER -FILEFORMAT -FIRST -FOLLOWING -FOR -FOREIGN -FORMAT -FORMATTED -FROM -FULL -FUNCTION -FUNCTIONS -GLOBAL -GRANT -GROUP -GROUPING -HAVING -HOUR -IF -IGNORE -IMPORT -IN -INDEX -INDEXES -INNER -INPATH -INPUTFORMAT -INSERT -INTERSECT -INTERVAL -INTO -IS -ITEMS -JOIN -KEYS -LAST -LATERAL -LAZY -LEADING -LEFT -LIKE -LIMIT -LINES -LIST -LOAD -LOCAL -LOCATION -LOCK -LOCKS -LOGICAL -MACRO -MAP -MATCHED -MERGE -MINUTE -MONTH -MSCK -NAMESPACE -NAMESPACES -NATURAL -NO -NOT -NULL -NULLS -OF -ON -ONLY -OPTION -OPTIONS -OR -ORDER -OUT -OUTER -OUTPUTFORMAT -OVER -OVERLAPS -OVERLAY -OVERWRITE -PARTITION -PARTITIONED -PARTITIONS -PERCENTLIT -PIVOT -PLACING -POSITION -PRECEDING -PRIMARY -PRINCIPALS -PROPERTIES -PURGE -QUERY -RANGE -RECORDREADER -RECORDWRITER -RECOVER -REDUCE -REFERENCES -REFRESH -RENAME -REPAIR -REPLACE -RESET -RESTRICT -REVOKE -RIGHT -RLIKE -ROLE -ROLES -ROLLBACK -ROLLUP -ROW -ROWS -SCHEMA -SECOND -SELECT -SEMI -SEPARATED -SERDE -SERDEPROPERTIES -SESSION_USER -SET -SETMINUS -SETS -SHOW -SKEWED -SOME -SORT -SORTED -START -STATISTICS -STORED -STRATIFY -STRUCT -SUBSTR -SUBSTRING -TABLE -TABLES -TABLESAMPLE -TBLPROPERTIES -TEMPORARY -TERMINATED -THEN -TO -TOUCH -TRAILING -TRANSACTION -TRANSACTIONS -TRANSFORM -TRIM -TRUE -TRUNCATE -TYPE -UNARCHIVE -UNBOUNDED -UNCACHE -UNION -UNIQUE -UNKNOWN -UNLOCK -UNSET -UPDATE -USE -USER -USING -VALUES -VIEW -VIEWS -WHEN -WHERE -WINDOW -WITH -YEAR -EQ -NSEQ -NEQ -NEQJ -LT -LTE -GT -GTE -PLUS -MINUS -ASTERISK -SLASH -PERCENT -DIV -TILDE -AMPERSAND -PIPE -CONCAT_PIPE -HAT -STRING -BIGINT_LITERAL -SMALLINT_LITERAL -TINYINT_LITERAL -INTEGER_VALUE -EXPONENT_VALUE -DECIMAL_VALUE -DOUBLE_LITERAL -BIGDECIMAL_LITERAL -IDENTIFIER -BACKQUOTED_IDENTIFIER -SIMPLE_COMMENT -BRACKETED_COMMENT -WS -UNRECOGNIZED - -rule names: -singleStatement -singleExpression -singleTableIdentifier -singleMultipartIdentifier -singleFunctionIdentifier -singleDataType -singleTableSchema -statement -unsupportedHiveNativeCommands -createTableHeader -replaceTableHeader -bucketSpec -skewSpec -locationSpec -commentSpec -query -insertInto -partitionSpecLocation -partitionSpec -partitionVal -namespace -describeFuncName -describeColName -ctes -namedQuery -tableProvider -createTableClauses -tablePropertyList -tableProperty -tablePropertyKey -tablePropertyValue -constantList -nestedConstantList -createFileFormat -fileFormat -storageHandler -resource -dmlStatementNoWith -queryOrganization -multiInsertQueryBody -queryTerm -queryPrimary -sortItem -fromStatement -fromStatementBody -querySpecification -transformClause -selectClause -setClause -matchedClause -notMatchedClause -matchedAction -notMatchedAction -assignmentList -assignment -whereClause -havingClause -hint -hintStatement -fromClause -aggregationClause -groupingSet -pivotClause -pivotColumn -pivotValue -lateralView -setQuantifier -relation -joinRelation -joinType -joinCriteria -sample -sampleMethod -identifierList -identifierSeq -orderedIdentifierList -orderedIdentifier -identifierCommentList -identifierComment -relationPrimary -inlineTable -functionTable -tableAlias -rowFormat -multipartIdentifierList -multipartIdentifier -tableIdentifier -functionIdentifier -namedExpression -namedExpressionSeq -transformList -transform -transformArgument -expression -booleanExpression -predicate -valueExpression -primaryExpression -constant -comparisonOperator -arithmeticOperator -predicateOperator -booleanValue -interval -errorCapturingMultiUnitsInterval -multiUnitsInterval -errorCapturingUnitToUnitInterval -unitToUnitInterval -intervalValue -intervalUnit -colPosition -dataType -qualifiedColTypeWithPositionList -qualifiedColTypeWithPosition -colTypeList -colType -complexColTypeList -complexColType -whenClause -windowClause -namedWindow -windowSpec -windowFrame -frameBound -qualifiedNameList -functionName -qualifiedName -errorCapturingIdentifier -errorCapturingIdentifierExtra -identifier -strictIdentifier -quotedIdentifier -number -alterColumnAction -ansiNonReserved -strictNonReserved -nonReserved - - -atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 299, 3020, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 3, 2, 3, 2, 7, 2, 279, 10, 2, 12, 2, 14, 2, 282, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 5, 9, 306, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 311, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 319, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 327, 10, 9, 12, 9, 14, 9, 330, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 349, 10, 9, 3, 9, 3, 9, 5, 9, 353, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 359, 10, 9, 3, 9, 5, 9, 362, 10, 9, 3, 9, 5, 9, 365, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 373, 10, 9, 3, 9, 5, 9, 376, 10, 9, 3, 9, 3, 9, 5, 9, 380, 10, 9, 3, 9, 5, 9, 383, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 391, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 396, 10, 9, 3, 9, 5, 9, 399, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 406, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 418, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 427, 10, 9, 12, 9, 14, 9, 430, 11, 9, 3, 9, 5, 9, 433, 10, 9, 3, 9, 5, 9, 436, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 443, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 454, 10, 9, 12, 9, 14, 9, 457, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 464, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 469, 10, 9, 3, 9, 5, 9, 472, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 478, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 489, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 553, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 562, 10, 9, 3, 9, 3, 9, 5, 9, 566, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 572, 10, 9, 3, 9, 3, 9, 5, 9, 576, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 581, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 587, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 599, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 607, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 613, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 626, 10, 9, 3, 9, 6, 9, 629, 10, 9, 13, 9, 14, 9, 630, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 647, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 652, 10, 9, 12, 9, 14, 9, 655, 11, 9, 3, 9, 5, 9, 658, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 664, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 679, 10, 9, 3, 9, 3, 9, 5, 9, 683, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 689, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 695, 10, 9, 3, 9, 5, 9, 698, 10, 9, 3, 9, 5, 9, 701, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 707, 10, 9, 3, 9, 3, 9, 5, 9, 711, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 719, 10, 9, 12, 9, 14, 9, 722, 11, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 730, 10, 9, 3, 9, 5, 9, 733, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 742, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 747, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 753, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 760, 10, 9, 3, 9, 5, 9, 763, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 769, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 778, 10, 9, 12, 9, 14, 9, 781, 11, 9, 5, 9, 783, 10, 9, 3, 9, 3, 9, 5, 9, 787, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 792, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 797, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 804, 10, 9, 3, 9, 5, 9, 807, 10, 9, 3, 9, 5, 9, 810, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 817, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 822, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 831, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 839, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 845, 10, 9, 3, 9, 5, 9, 848, 10, 9, 3, 9, 5, 9, 851, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 857, 10, 9, 3, 9, 3, 9, 5, 9, 861, 10, 9, 3, 9, 3, 9, 5, 9, 865, 10, 9, 3, 9, 3, 9, 5, 9, 869, 10, 9, 5, 9, 871, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 879, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 887, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 893, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 899, 10, 9, 3, 9, 5, 9, 902, 10, 9, 3, 9, 3, 9, 5, 9, 906, 10, 9, 3, 9, 5, 9, 909, 10, 9, 3, 9, 3, 9, 5, 9, 913, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 936, 10, 9, 12, 9, 14, 9, 939, 11, 9, 5, 9, 941, 10, 9, 3, 9, 3, 9, 5, 9, 945, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 951, 10, 9, 3, 9, 5, 9, 954, 10, 9, 3, 9, 5, 9, 957, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 963, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 971, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 976, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 982, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 988, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 998, 10, 9, 12, 9, 14, 9, 1001, 11, 9, 5, 9, 1003, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1008, 10, 9, 12, 9, 14, 9, 1011, 11, 9, 3, 9, 3, 9, 7, 9, 1015, 10, 9, 12, 9, 14, 9, 1018, 11, 9, 3, 9, 3, 9, 3, 9, 7, 9, 1023, 10, 9, 12, 9, 14, 9, 1026, 11, 9, 5, 9, 1028, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1036, 10, 10, 3, 10, 3, 10, 5, 10, 1040, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1047, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1163, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1171, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1179, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1188, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 1198, 10, 10, 3, 11, 3, 11, 5, 11, 1202, 10, 11, 3, 11, 5, 11, 1205, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 1211, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 1217, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 1229, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 1241, 10, 14, 3, 14, 3, 14, 3, 14, 5, 14, 1246, 10, 14, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 5, 17, 1255, 10, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 5, 18, 1263, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1270, 10, 18, 5, 18, 1272, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1277, 10, 18, 3, 18, 3, 18, 5, 18, 1281, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1286, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1291, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1296, 10, 18, 3, 18, 5, 18, 1299, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1304, 10, 18, 3, 18, 3, 18, 5, 18, 1308, 10, 18, 3, 18, 3, 18, 3, 18, 5, 18, 1313, 10, 18, 5, 18, 1315, 10, 18, 3, 19, 3, 19, 5, 19, 1319, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 1326, 10, 20, 12, 20, 14, 20, 1329, 11, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 5, 21, 1336, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 1345, 10, 23, 3, 24, 3, 24, 3, 24, 7, 24, 1350, 10, 24, 12, 24, 14, 24, 1353, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 1359, 10, 25, 12, 25, 14, 25, 1362, 11, 25, 3, 26, 3, 26, 5, 26, 1366, 10, 26, 3, 26, 5, 26, 1369, 10, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 1388, 10, 28, 12, 28, 14, 28, 1391, 11, 28, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 1397, 10, 29, 12, 29, 14, 29, 1400, 11, 29, 3, 29, 3, 29, 3, 30, 3, 30, 5, 30, 1406, 10, 30, 3, 30, 5, 30, 1409, 10, 30, 3, 31, 3, 31, 3, 31, 7, 31, 1414, 10, 31, 12, 31, 14, 31, 1417, 11, 31, 3, 31, 5, 31, 1420, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 1426, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 1432, 10, 33, 12, 33, 14, 33, 1435, 11, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 1443, 10, 34, 12, 34, 14, 34, 1446, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 1456, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 1463, 10, 36, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 1469, 10, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 6, 39, 1480, 10, 39, 13, 39, 14, 39, 1481, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1489, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1496, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 1508, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 1514, 10, 39, 12, 39, 14, 39, 1517, 11, 39, 3, 39, 7, 39, 1520, 10, 39, 12, 39, 14, 39, 1523, 11, 39, 5, 39, 1525, 10, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1532, 10, 40, 12, 40, 14, 40, 1535, 11, 40, 5, 40, 1537, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1544, 10, 40, 12, 40, 14, 40, 1547, 11, 40, 5, 40, 1549, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1556, 10, 40, 12, 40, 14, 40, 1559, 11, 40, 5, 40, 1561, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 1568, 10, 40, 12, 40, 14, 40, 1571, 11, 40, 5, 40, 1573, 10, 40, 3, 40, 5, 40, 1576, 10, 40, 3, 40, 3, 40, 3, 40, 5, 40, 1581, 10, 40, 5, 40, 1583, 10, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1595, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1602, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1609, 10, 42, 3, 42, 7, 42, 1612, 10, 42, 12, 42, 14, 42, 1615, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 1626, 10, 43, 3, 44, 3, 44, 5, 44, 1630, 10, 44, 3, 44, 3, 44, 5, 44, 1634, 10, 44, 3, 45, 3, 45, 6, 45, 1638, 10, 45, 13, 45, 14, 45, 1639, 3, 46, 3, 46, 5, 46, 1644, 10, 46, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 1650, 10, 46, 12, 46, 14, 46, 1653, 11, 46, 3, 46, 5, 46, 1656, 10, 46, 3, 46, 5, 46, 1659, 10, 46, 3, 46, 5, 46, 1662, 10, 46, 3, 46, 5, 46, 1665, 10, 46, 3, 46, 3, 46, 5, 46, 1669, 10, 46, 3, 47, 3, 47, 5, 47, 1673, 10, 47, 3, 47, 5, 47, 1676, 10, 47, 3, 47, 3, 47, 5, 47, 1680, 10, 47, 3, 47, 7, 47, 1683, 10, 47, 12, 47, 14, 47, 1686, 11, 47, 3, 47, 5, 47, 1689, 10, 47, 3, 47, 5, 47, 1692, 10, 47, 3, 47, 5, 47, 1695, 10, 47, 3, 47, 5, 47, 1698, 10, 47, 5, 47, 1700, 10, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 1712, 10, 48, 3, 48, 5, 48, 1715, 10, 48, 3, 48, 3, 48, 5, 48, 1719, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 1729, 10, 48, 3, 48, 3, 48, 5, 48, 1733, 10, 48, 5, 48, 1735, 10, 48, 3, 48, 5, 48, 1738, 10, 48, 3, 48, 3, 48, 5, 48, 1742, 10, 48, 3, 49, 3, 49, 7, 49, 1746, 10, 49, 12, 49, 14, 49, 1749, 11, 49, 3, 49, 5, 49, 1752, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 5, 51, 1763, 10, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 1773, 10, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 1785, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 1798, 10, 54, 12, 54, 14, 54, 1801, 11, 54, 3, 54, 3, 54, 5, 54, 1805, 10, 54, 3, 55, 3, 55, 3, 55, 7, 55, 1810, 10, 55, 12, 55, 14, 55, 1813, 11, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 5, 59, 1828, 10, 59, 3, 59, 7, 59, 1831, 10, 59, 12, 59, 14, 59, 1834, 11, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 7, 60, 1844, 10, 60, 12, 60, 14, 60, 1847, 11, 60, 3, 60, 3, 60, 5, 60, 1851, 10, 60, 3, 61, 3, 61, 3, 61, 3, 61, 7, 61, 1857, 10, 61, 12, 61, 14, 61, 1860, 11, 61, 3, 61, 7, 61, 1863, 10, 61, 12, 61, 14, 61, 1866, 11, 61, 3, 61, 5, 61, 1869, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1876, 10, 62, 12, 62, 14, 62, 1879, 11, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1891, 10, 62, 12, 62, 14, 62, 1894, 11, 62, 3, 62, 3, 62, 5, 62, 1898, 10, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 1908, 10, 62, 12, 62, 14, 62, 1911, 11, 62, 3, 62, 3, 62, 5, 62, 1915, 10, 62, 3, 63, 3, 63, 3, 63, 3, 63, 7, 63, 1921, 10, 63, 12, 63, 14, 63, 1924, 11, 63, 5, 63, 1926, 10, 63, 3, 63, 3, 63, 5, 63, 1930, 10, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 1942, 10, 64, 12, 64, 14, 64, 1945, 11, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 7, 65, 1955, 10, 65, 12, 65, 14, 65, 1958, 11, 65, 3, 65, 3, 65, 5, 65, 1962, 10, 65, 3, 66, 3, 66, 5, 66, 1966, 10, 66, 3, 66, 5, 66, 1969, 10, 66, 3, 67, 3, 67, 3, 67, 5, 67, 1974, 10, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 1981, 10, 67, 12, 67, 14, 67, 1984, 11, 67, 5, 67, 1986, 10, 67, 3, 67, 3, 67, 3, 67, 5, 67, 1991, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 1996, 10, 67, 12, 67, 14, 67, 1999, 11, 67, 5, 67, 2001, 10, 67, 3, 68, 3, 68, 3, 69, 3, 69, 7, 69, 2007, 10, 69, 12, 69, 14, 69, 2010, 11, 69, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 2016, 10, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 2023, 10, 70, 3, 71, 5, 71, 2026, 10, 71, 3, 71, 3, 71, 3, 71, 5, 71, 2031, 10, 71, 3, 71, 5, 71, 2034, 10, 71, 3, 71, 3, 71, 3, 71, 5, 71, 2039, 10, 71, 3, 71, 3, 71, 5, 71, 2043, 10, 71, 3, 71, 5, 71, 2046, 10, 71, 3, 71, 5, 71, 2049, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 5, 72, 2055, 10, 72, 3, 73, 3, 73, 3, 73, 5, 73, 2060, 10, 73, 3, 73, 3, 73, 3, 74, 5, 74, 2065, 10, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 5, 74, 2083, 10, 74, 5, 74, 2085, 10, 74, 3, 74, 5, 74, 2088, 10, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 7, 76, 2097, 10, 76, 12, 76, 14, 76, 2100, 11, 76, 3, 77, 3, 77, 3, 77, 3, 77, 7, 77, 2106, 10, 77, 12, 77, 14, 77, 2109, 11, 77, 3, 77, 3, 77, 3, 78, 3, 78, 5, 78, 2115, 10, 78, 3, 79, 3, 79, 3, 79, 3, 79, 7, 79, 2121, 10, 79, 12, 79, 14, 79, 2124, 11, 79, 3, 79, 3, 79, 3, 80, 3, 80, 5, 80, 2130, 10, 80, 3, 81, 3, 81, 5, 81, 2134, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2142, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2150, 10, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 2156, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 7, 82, 2162, 10, 82, 12, 82, 14, 82, 2165, 11, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 7, 83, 2174, 10, 83, 12, 83, 14, 83, 2177, 11, 83, 5, 83, 2179, 10, 83, 3, 83, 3, 83, 3, 83, 3, 84, 5, 84, 2185, 10, 84, 3, 84, 3, 84, 5, 84, 2189, 10, 84, 5, 84, 2191, 10, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2200, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2212, 10, 85, 5, 85, 2214, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2221, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2228, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2234, 10, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 2240, 10, 85, 5, 85, 2242, 10, 85, 3, 86, 3, 86, 3, 86, 7, 86, 2247, 10, 86, 12, 86, 14, 86, 2250, 11, 86, 3, 87, 3, 87, 3, 87, 7, 87, 2255, 10, 87, 12, 87, 14, 87, 2258, 11, 87, 3, 88, 3, 88, 3, 88, 5, 88, 2263, 10, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 5, 89, 2270, 10, 89, 3, 89, 3, 89, 3, 90, 3, 90, 5, 90, 2276, 10, 90, 3, 90, 3, 90, 5, 90, 2280, 10, 90, 5, 90, 2282, 10, 90, 3, 91, 3, 91, 3, 91, 7, 91, 2287, 10, 91, 12, 91, 14, 91, 2290, 11, 91, 3, 92, 3, 92, 3, 92, 3, 92, 7, 92, 2296, 10, 92, 12, 92, 14, 92, 2299, 11, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 7, 93, 2309, 10, 93, 12, 93, 14, 93, 2312, 11, 93, 3, 93, 3, 93, 5, 93, 2316, 10, 93, 3, 94, 3, 94, 5, 94, 2320, 10, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 5, 96, 2334, 10, 96, 5, 96, 2336, 10, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 7, 96, 2344, 10, 96, 12, 96, 14, 96, 2347, 11, 96, 3, 97, 5, 97, 2350, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2358, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 7, 97, 2365, 10, 97, 12, 97, 14, 97, 2368, 11, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2373, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2381, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2386, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 7, 97, 2396, 10, 97, 12, 97, 14, 97, 2399, 11, 97, 3, 97, 3, 97, 5, 97, 2403, 10, 97, 3, 97, 5, 97, 2406, 10, 97, 3, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2412, 10, 97, 3, 97, 3, 97, 5, 97, 2416, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2421, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2426, 10, 97, 3, 97, 3, 97, 3, 97, 5, 97, 2431, 10, 97, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 2437, 10, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 7, 98, 2458, 10, 98, 12, 98, 14, 98, 2461, 11, 98, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2467, 10, 99, 13, 99, 14, 99, 2468, 3, 99, 3, 99, 5, 99, 2473, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2480, 10, 99, 13, 99, 14, 99, 2481, 3, 99, 3, 99, 5, 99, 2486, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2502, 10, 99, 12, 99, 14, 99, 2505, 11, 99, 5, 99, 2507, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2515, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2524, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2545, 10, 99, 13, 99, 14, 99, 2546, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2558, 10, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2563, 10, 99, 12, 99, 14, 99, 2566, 11, 99, 5, 99, 2568, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2577, 10, 99, 3, 99, 3, 99, 5, 99, 2581, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 6, 99, 2591, 10, 99, 13, 99, 14, 99, 2592, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2618, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2625, 10, 99, 3, 99, 5, 99, 2628, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 2643, 10, 99, 3, 99, 3, 99, 5, 99, 2647, 10, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 7, 99, 2657, 10, 99, 12, 99, 14, 99, 2660, 11, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 6, 100, 2670, 10, 100, 13, 100, 14, 100, 2671, 5, 100, 2674, 10, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 5, 105, 2687, 10, 105, 3, 106, 3, 106, 5, 106, 2691, 10, 106, 3, 107, 3, 107, 3, 107, 6, 107, 2696, 10, 107, 13, 107, 14, 107, 2697, 3, 108, 3, 108, 3, 108, 5, 108, 2703, 10, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 5, 110, 2711, 10, 110, 3, 110, 3, 110, 5, 110, 2715, 10, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 5, 111, 2724, 10, 111, 3, 112, 3, 112, 3, 112, 5, 112, 2729, 10, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 5, 113, 2746, 10, 113, 3, 113, 3, 113, 5, 113, 2750, 10, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 2757, 10, 113, 12, 113, 14, 113, 2760, 11, 113, 3, 113, 5, 113, 2763, 10, 113, 5, 113, 2765, 10, 113, 3, 114, 3, 114, 3, 114, 7, 114, 2770, 10, 114, 12, 114, 14, 114, 2773, 11, 114, 3, 115, 3, 115, 3, 115, 3, 115, 5, 115, 2779, 10, 115, 3, 115, 5, 115, 2782, 10, 115, 3, 115, 5, 115, 2785, 10, 115, 3, 116, 3, 116, 3, 116, 7, 116, 2790, 10, 116, 12, 116, 14, 116, 2793, 11, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 2799, 10, 117, 3, 117, 5, 117, 2802, 10, 117, 3, 118, 3, 118, 3, 118, 7, 118, 2807, 10, 118, 12, 118, 14, 118, 2810, 11, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 5, 119, 2817, 10, 119, 3, 119, 5, 119, 2820, 10, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 2831, 10, 121, 12, 121, 14, 121, 2834, 11, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2851, 10, 123, 12, 123, 14, 123, 2854, 11, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2861, 10, 123, 12, 123, 14, 123, 2864, 11, 123, 5, 123, 2866, 10, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 2873, 10, 123, 12, 123, 14, 123, 2876, 11, 123, 5, 123, 2878, 10, 123, 5, 123, 2880, 10, 123, 3, 123, 5, 123, 2883, 10, 123, 3, 123, 5, 123, 2886, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 5, 124, 2904, 10, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 5, 125, 2913, 10, 125, 3, 126, 3, 126, 3, 126, 7, 126, 2918, 10, 126, 12, 126, 14, 126, 2921, 11, 126, 3, 127, 3, 127, 3, 127, 3, 127, 5, 127, 2927, 10, 127, 3, 128, 3, 128, 3, 128, 7, 128, 2932, 10, 128, 12, 128, 14, 128, 2935, 11, 128, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 6, 130, 2942, 10, 130, 13, 130, 14, 130, 2943, 3, 130, 5, 130, 2947, 10, 130, 3, 131, 3, 131, 3, 131, 5, 131, 2952, 10, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 5, 132, 2960, 10, 132, 3, 133, 3, 133, 3, 134, 3, 134, 5, 134, 2966, 10, 134, 3, 134, 3, 134, 3, 134, 5, 134, 2971, 10, 134, 3, 134, 3, 134, 3, 134, 5, 134, 2976, 10, 134, 3, 134, 3, 134, 5, 134, 2980, 10, 134, 3, 134, 3, 134, 5, 134, 2984, 10, 134, 3, 134, 3, 134, 5, 134, 2988, 10, 134, 3, 134, 3, 134, 5, 134, 2992, 10, 134, 3, 134, 3, 134, 5, 134, 2996, 10, 134, 3, 134, 3, 134, 5, 134, 3000, 10, 134, 3, 134, 5, 134, 3003, 10, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 5, 135, 3012, 10, 135, 3, 136, 3, 136, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 7, 937, 999, 1009, 1016, 1024, 6, 82, 190, 194, 196, 139, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 2, 44, 4, 2, 67, 67, 182, 182, 4, 2, 34, 34, 196, 196, 4, 2, 65, 65, 152, 152, 4, 2, 102, 102, 115, 115, 3, 2, 45, 46, 4, 2, 229, 229, 259, 259, 4, 2, 17, 17, 37, 37, 7, 2, 42, 42, 54, 54, 88, 88, 101, 101, 143, 143, 3, 2, 71, 72, 4, 2, 88, 88, 101, 101, 4, 2, 156, 156, 285, 285, 4, 2, 14, 14, 137, 137, 5, 2, 64, 64, 151, 151, 206, 206, 6, 2, 83, 83, 122, 122, 215, 215, 249, 249, 5, 2, 83, 83, 215, 215, 249, 249, 4, 2, 25, 25, 71, 71, 4, 2, 96, 96, 129, 129, 4, 2, 16, 16, 76, 76, 4, 2, 289, 289, 291, 291, 5, 2, 16, 16, 21, 21, 219, 219, 5, 2, 91, 91, 243, 243, 251, 251, 4, 2, 274, 275, 280, 280, 3, 2, 276, 279, 4, 2, 274, 275, 283, 283, 4, 2, 59, 59, 61, 61, 3, 2, 227, 228, 4, 2, 6, 6, 102, 102, 4, 2, 6, 6, 98, 98, 5, 2, 29, 29, 132, 132, 238, 238, 3, 2, 266, 273, 3, 2, 274, 284, 6, 2, 19, 19, 115, 115, 155, 155, 163, 163, 4, 2, 91, 91, 243, 243, 3, 2, 274, 275, 4, 2, 77, 77, 172, 172, 4, 2, 164, 164, 220, 220, 4, 2, 97, 97, 179, 179, 3, 2, 290, 291, 4, 2, 78, 78, 214, 214, 53, 2, 14, 15, 17, 18, 22, 23, 25, 26, 28, 28, 30, 34, 37, 37, 39, 42, 44, 44, 46, 52, 54, 54, 57, 58, 63, 65, 67, 75, 77, 78, 82, 82, 84, 90, 93, 93, 95, 97, 100, 101, 104, 106, 109, 109, 112, 114, 116, 117, 119, 121, 123, 123, 126, 126, 128, 131, 134, 147, 150, 152, 154, 154, 157, 158, 161, 162, 165, 165, 167, 168, 170, 179, 181, 189, 191, 197, 199, 206, 210, 212, 214, 214, 216, 218, 220, 228, 230, 234, 237, 237, 239, 244, 246, 248, 252, 255, 258, 260, 263, 263, 279, 279, 17, 2, 20, 20, 56, 56, 83, 83, 103, 103, 118, 118, 122, 122, 127, 127, 133, 133, 153, 153, 159, 159, 198, 198, 209, 209, 215, 215, 249, 249, 257, 257, 19, 2, 14, 19, 21, 55, 57, 82, 84, 102, 104, 117, 119, 121, 123, 126, 128, 132, 134, 152, 154, 158, 160, 197, 199, 208, 210, 214, 216, 248, 250, 256, 258, 265, 279, 279, 2, 3492, 2, 276, 3, 2, 2, 2, 4, 285, 3, 2, 2, 2, 6, 288, 3, 2, 2, 2, 8, 291, 3, 2, 2, 2, 10, 294, 3, 2, 2, 2, 12, 297, 3, 2, 2, 2, 14, 300, 3, 2, 2, 2, 16, 1027, 3, 2, 2, 2, 18, 1197, 3, 2, 2, 2, 20, 1199, 3, 2, 2, 2, 22, 1216, 3, 2, 2, 2, 24, 1222, 3, 2, 2, 2, 26, 1234, 3, 2, 2, 2, 28, 1247, 3, 2, 2, 2, 30, 1250, 3, 2, 2, 2, 32, 1254, 3, 2, 2, 2, 34, 1314, 3, 2, 2, 2, 36, 1316, 3, 2, 2, 2, 38, 1320, 3, 2, 2, 2, 40, 1332, 3, 2, 2, 2, 42, 1337, 3, 2, 2, 2, 44, 1344, 3, 2, 2, 2, 46, 1346, 3, 2, 2, 2, 48, 1354, 3, 2, 2, 2, 50, 1363, 3, 2, 2, 2, 52, 1374, 3, 2, 2, 2, 54, 1389, 3, 2, 2, 2, 56, 1392, 3, 2, 2, 2, 58, 1403, 3, 2, 2, 2, 60, 1419, 3, 2, 2, 2, 62, 1425, 3, 2, 2, 2, 64, 1427, 3, 2, 2, 2, 66, 1438, 3, 2, 2, 2, 68, 1455, 3, 2, 2, 2, 70, 1462, 3, 2, 2, 2, 72, 1464, 3, 2, 2, 2, 74, 1470, 3, 2, 2, 2, 76, 1524, 3, 2, 2, 2, 78, 1536, 3, 2, 2, 2, 80, 1584, 3, 2, 2, 2, 82, 1587, 3, 2, 2, 2, 84, 1625, 3, 2, 2, 2, 86, 1627, 3, 2, 2, 2, 88, 1635, 3, 2, 2, 2, 90, 1668, 3, 2, 2, 2, 92, 1699, 3, 2, 2, 2, 94, 1711, 3, 2, 2, 2, 96, 1743, 3, 2, 2, 2, 98, 1755, 3, 2, 2, 2, 100, 1758, 3, 2, 2, 2, 102, 1767, 3, 2, 2, 2, 104, 1784, 3, 2, 2, 2, 106, 1804, 3, 2, 2, 2, 108, 1806, 3, 2, 2, 2, 110, 1814, 3, 2, 2, 2, 112, 1818, 3, 2, 2, 2, 114, 1821, 3, 2, 2, 2, 116, 1824, 3, 2, 2, 2, 118, 1850, 3, 2, 2, 2, 120, 1852, 3, 2, 2, 2, 122, 1914, 3, 2, 2, 2, 124, 1929, 3, 2, 2, 2, 126, 1931, 3, 2, 2, 2, 128, 1961, 3, 2, 2, 2, 130, 1963, 3, 2, 2, 2, 132, 1970, 3, 2, 2, 2, 134, 2002, 3, 2, 2, 2, 136, 2004, 3, 2, 2, 2, 138, 2022, 3, 2, 2, 2, 140, 2048, 3, 2, 2, 2, 142, 2054, 3, 2, 2, 2, 144, 2056, 3, 2, 2, 2, 146, 2087, 3, 2, 2, 2, 148, 2089, 3, 2, 2, 2, 150, 2093, 3, 2, 2, 2, 152, 2101, 3, 2, 2, 2, 154, 2112, 3, 2, 2, 2, 156, 2116, 3, 2, 2, 2, 158, 2127, 3, 2, 2, 2, 160, 2155, 3, 2, 2, 2, 162, 2157, 3, 2, 2, 2, 164, 2168, 3, 2, 2, 2, 166, 2190, 3, 2, 2, 2, 168, 2241, 3, 2, 2, 2, 170, 2243, 3, 2, 2, 2, 172, 2251, 3, 2, 2, 2, 174, 2262, 3, 2, 2, 2, 176, 2269, 3, 2, 2, 2, 178, 2273, 3, 2, 2, 2, 180, 2283, 3, 2, 2, 2, 182, 2291, 3, 2, 2, 2, 184, 2315, 3, 2, 2, 2, 186, 2319, 3, 2, 2, 2, 188, 2321, 3, 2, 2, 2, 190, 2335, 3, 2, 2, 2, 192, 2430, 3, 2, 2, 2, 194, 2436, 3, 2, 2, 2, 196, 2646, 3, 2, 2, 2, 198, 2673, 3, 2, 2, 2, 200, 2675, 3, 2, 2, 2, 202, 2677, 3, 2, 2, 2, 204, 2679, 3, 2, 2, 2, 206, 2681, 3, 2, 2, 2, 208, 2683, 3, 2, 2, 2, 210, 2688, 3, 2, 2, 2, 212, 2695, 3, 2, 2, 2, 214, 2699, 3, 2, 2, 2, 216, 2704, 3, 2, 2, 2, 218, 2714, 3, 2, 2, 2, 220, 2723, 3, 2, 2, 2, 222, 2728, 3, 2, 2, 2, 224, 2764, 3, 2, 2, 2, 226, 2766, 3, 2, 2, 2, 228, 2774, 3, 2, 2, 2, 230, 2786, 3, 2, 2, 2, 232, 2794, 3, 2, 2, 2, 234, 2803, 3, 2, 2, 2, 236, 2811, 3, 2, 2, 2, 238, 2821, 3, 2, 2, 2, 240, 2826, 3, 2, 2, 2, 242, 2835, 3, 2, 2, 2, 244, 2885, 3, 2, 2, 2, 246, 2903, 3, 2, 2, 2, 248, 2912, 3, 2, 2, 2, 250, 2914, 3, 2, 2, 2, 252, 2926, 3, 2, 2, 2, 254, 2928, 3, 2, 2, 2, 256, 2936, 3, 2, 2, 2, 258, 2946, 3, 2, 2, 2, 260, 2951, 3, 2, 2, 2, 262, 2959, 3, 2, 2, 2, 264, 2961, 3, 2, 2, 2, 266, 3002, 3, 2, 2, 2, 268, 3011, 3, 2, 2, 2, 270, 3013, 3, 2, 2, 2, 272, 3015, 3, 2, 2, 2, 274, 3017, 3, 2, 2, 2, 276, 280, 5, 16, 9, 2, 277, 279, 7, 3, 2, 2, 278, 277, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 2, 2, 3, 284, 3, 3, 2, 2, 2, 285, 286, 5, 178, 90, 2, 286, 287, 7, 2, 2, 3, 287, 5, 3, 2, 2, 2, 288, 289, 5, 174, 88, 2, 289, 290, 7, 2, 2, 3, 290, 7, 3, 2, 2, 2, 291, 292, 5, 172, 87, 2, 292, 293, 7, 2, 2, 3, 293, 9, 3, 2, 2, 2, 294, 295, 5, 176, 89, 2, 295, 296, 7, 2, 2, 3, 296, 11, 3, 2, 2, 2, 297, 298, 5, 224, 113, 2, 298, 299, 7, 2, 2, 3, 299, 13, 3, 2, 2, 2, 300, 301, 5, 230, 116, 2, 301, 302, 7, 2, 2, 3, 302, 15, 3, 2, 2, 2, 303, 1028, 5, 32, 17, 2, 304, 306, 5, 48, 25, 2, 305, 304, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 1028, 5, 76, 39, 2, 308, 310, 7, 255, 2, 2, 309, 311, 7, 151, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 1028, 5, 172, 87, 2, 313, 314, 7, 55, 2, 2, 314, 318, 5, 42, 22, 2, 315, 316, 7, 112, 2, 2, 316, 317, 7, 155, 2, 2, 317, 319, 7, 85, 2, 2, 318, 315, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 328, 5, 172, 87, 2, 321, 327, 5, 30, 16, 2, 322, 327, 5, 28, 15, 2, 323, 324, 7, 264, 2, 2, 324, 325, 9, 2, 2, 2, 325, 327, 5, 56, 29, 2, 326, 321, 3, 2, 2, 2, 326, 322, 3, 2, 2, 2, 326, 323, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 1028, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 17, 2, 2, 332, 333, 5, 42, 22, 2, 333, 334, 5, 172, 87, 2, 334, 335, 7, 214, 2, 2, 335, 336, 9, 2, 2, 2, 336, 337, 5, 56, 29, 2, 337, 1028, 3, 2, 2, 2, 338, 339, 7, 17, 2, 2, 339, 340, 5, 42, 22, 2, 340, 341, 5, 172, 87, 2, 341, 342, 7, 214, 2, 2, 342, 343, 5, 28, 15, 2, 343, 1028, 3, 2, 2, 2, 344, 345, 7, 78, 2, 2, 345, 348, 5, 42, 22, 2, 346, 347, 7, 112, 2, 2, 347, 349, 7, 85, 2, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 352, 5, 172, 87, 2, 351, 353, 9, 3, 2, 2, 352, 351, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 1028, 3, 2, 2, 2, 354, 355, 7, 217, 2, 2, 355, 358, 9, 4, 2, 2, 356, 357, 9, 5, 2, 2, 357, 359, 5, 172, 87, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 364, 3, 2, 2, 2, 360, 362, 7, 134, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 7, 285, 2, 2, 364, 361, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 1028, 3, 2, 2, 2, 366, 367, 6, 9, 2, 2, 367, 372, 5, 20, 11, 2, 368, 369, 7, 4, 2, 2, 369, 370, 5, 230, 116, 2, 370, 371, 7, 5, 2, 2, 371, 373, 3, 2, 2, 2, 372, 368, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 375, 3, 2, 2, 2, 374, 376, 5, 52, 27, 2, 375, 374, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 382, 5, 54, 28, 2, 378, 380, 7, 24, 2, 2, 379, 378, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 383, 5, 32, 17, 2, 382, 379, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 1028, 3, 2, 2, 2, 384, 385, 6, 9, 3, 2, 385, 390, 5, 20, 11, 2, 386, 387, 7, 4, 2, 2, 387, 388, 5, 230, 116, 2, 388, 389, 7, 5, 2, 2, 389, 391, 3, 2, 2, 2, 390, 386, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 5, 52, 27, 2, 393, 398, 5, 54, 28, 2, 394, 396, 7, 24, 2, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 399, 5, 32, 17, 2, 398, 395, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 1028, 3, 2, 2, 2, 400, 405, 5, 20, 11, 2, 401, 402, 7, 4, 2, 2, 402, 403, 5, 230, 116, 2, 403, 404, 7, 5, 2, 2, 404, 406, 3, 2, 2, 2, 405, 401, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 428, 3, 2, 2, 2, 407, 427, 5, 30, 16, 2, 408, 409, 7, 173, 2, 2, 409, 410, 7, 32, 2, 2, 410, 411, 7, 4, 2, 2, 411, 412, 5, 230, 116, 2, 412, 413, 7, 5, 2, 2, 413, 418, 3, 2, 2, 2, 414, 415, 7, 173, 2, 2, 415, 416, 7, 32, 2, 2, 416, 418, 5, 148, 75, 2, 417, 408, 3, 2, 2, 2, 417, 414, 3, 2, 2, 2, 418, 427, 3, 2, 2, 2, 419, 427, 5, 24, 13, 2, 420, 427, 5, 26, 14, 2, 421, 427, 5, 168, 85, 2, 422, 427, 5, 68, 35, 2, 423, 427, 5, 28, 15, 2, 424, 425, 7, 232, 2, 2, 425, 427, 5, 56, 29, 2, 426, 407, 3, 2, 2, 2, 426, 417, 3, 2, 2, 2, 426, 419, 3, 2, 2, 2, 426, 420, 3, 2, 2, 2, 426, 421, 3, 2, 2, 2, 426, 422, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 435, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 433, 7, 24, 2, 2, 432, 431, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 436, 5, 32, 17, 2, 435, 432, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 1028, 3, 2, 2, 2, 437, 438, 7, 55, 2, 2, 438, 442, 7, 229, 2, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 155, 2, 2, 441, 443, 7, 85, 2, 2, 442, 439, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 5, 174, 88, 2, 445, 446, 7, 134, 2, 2, 446, 455, 5, 174, 88, 2, 447, 454, 5, 52, 27, 2, 448, 454, 5, 168, 85, 2, 449, 454, 5, 68, 35, 2, 450, 454, 5, 28, 15, 2, 451, 452, 7, 232, 2, 2, 452, 454, 5, 56, 29, 2, 453, 447, 3, 2, 2, 2, 453, 448, 3, 2, 2, 2, 453, 449, 3, 2, 2, 2, 453, 450, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 457, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 1028, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 458, 463, 5, 22, 12, 2, 459, 460, 7, 4, 2, 2, 460, 461, 5, 230, 116, 2, 461, 462, 7, 5, 2, 2, 462, 464, 3, 2, 2, 2, 463, 459, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 5, 52, 27, 2, 466, 471, 5, 54, 28, 2, 467, 469, 7, 24, 2, 2, 468, 467, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 472, 5, 32, 17, 2, 471, 468, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 1028, 3, 2, 2, 2, 473, 474, 7, 18, 2, 2, 474, 475, 7, 229, 2, 2, 475, 477, 5, 172, 87, 2, 476, 478, 5, 38, 20, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 51, 2, 2, 480, 488, 7, 223, 2, 2, 481, 489, 5, 260, 131, 2, 482, 483, 7, 98, 2, 2, 483, 484, 7, 46, 2, 2, 484, 489, 5, 150, 76, 2, 485, 486, 7, 98, 2, 2, 486, 487, 7, 16, 2, 2, 487, 489, 7, 46, 2, 2, 488, 481, 3, 2, 2, 2, 488, 482, 3, 2, 2, 2, 488, 485, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 1028, 3, 2, 2, 2, 490, 491, 7, 17, 2, 2, 491, 492, 7, 229, 2, 2, 492, 493, 5, 172, 87, 2, 493, 494, 7, 14, 2, 2, 494, 495, 9, 6, 2, 2, 495, 496, 5, 226, 114, 2, 496, 1028, 3, 2, 2, 2, 497, 498, 7, 17, 2, 2, 498, 499, 7, 229, 2, 2, 499, 500, 5, 172, 87, 2, 500, 501, 7, 14, 2, 2, 501, 502, 9, 6, 2, 2, 502, 503, 7, 4, 2, 2, 503, 504, 5, 226, 114, 2, 504, 505, 7, 5, 2, 2, 505, 1028, 3, 2, 2, 2, 506, 507, 7, 17, 2, 2, 507, 508, 7, 229, 2, 2, 508, 509, 5, 172, 87, 2, 509, 510, 7, 192, 2, 2, 510, 511, 7, 45, 2, 2, 511, 512, 5, 172, 87, 2, 512, 513, 7, 236, 2, 2, 513, 514, 5, 256, 129, 2, 514, 1028, 3, 2, 2, 2, 515, 516, 7, 17, 2, 2, 516, 517, 7, 229, 2, 2, 517, 518, 5, 172, 87, 2, 518, 519, 7, 78, 2, 2, 519, 520, 9, 6, 2, 2, 520, 521, 7, 4, 2, 2, 521, 522, 5, 170, 86, 2, 522, 523, 7, 5, 2, 2, 523, 1028, 3, 2, 2, 2, 524, 525, 7, 17, 2, 2, 525, 526, 7, 229, 2, 2, 526, 527, 5, 172, 87, 2, 527, 528, 7, 78, 2, 2, 528, 529, 9, 6, 2, 2, 529, 530, 5, 170, 86, 2, 530, 1028, 3, 2, 2, 2, 531, 532, 7, 17, 2, 2, 532, 533, 9, 7, 2, 2, 533, 534, 5, 172, 87, 2, 534, 535, 7, 192, 2, 2, 535, 536, 7, 236, 2, 2, 536, 537, 5, 172, 87, 2, 537, 1028, 3, 2, 2, 2, 538, 539, 7, 17, 2, 2, 539, 540, 9, 7, 2, 2, 540, 541, 5, 172, 87, 2, 541, 542, 7, 214, 2, 2, 542, 543, 7, 232, 2, 2, 543, 544, 5, 56, 29, 2, 544, 1028, 3, 2, 2, 2, 545, 546, 7, 17, 2, 2, 546, 547, 9, 7, 2, 2, 547, 548, 5, 172, 87, 2, 548, 549, 7, 253, 2, 2, 549, 552, 7, 232, 2, 2, 550, 551, 7, 112, 2, 2, 551, 553, 7, 85, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 5, 56, 29, 2, 555, 1028, 3, 2, 2, 2, 556, 557, 7, 17, 2, 2, 557, 558, 7, 229, 2, 2, 558, 559, 5, 172, 87, 2, 559, 561, 9, 8, 2, 2, 560, 562, 7, 45, 2, 2, 561, 560, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 563, 3, 2, 2, 2, 563, 565, 5, 172, 87, 2, 564, 566, 5, 268, 135, 2, 565, 564, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 1028, 3, 2, 2, 2, 567, 568, 7, 17, 2, 2, 568, 569, 7, 229, 2, 2, 569, 571, 5, 172, 87, 2, 570, 572, 5, 38, 20, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 7, 37, 2, 2, 574, 576, 7, 45, 2, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 5, 172, 87, 2, 578, 580, 5, 232, 117, 2, 579, 581, 5, 222, 112, 2, 580, 579, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 1028, 3, 2, 2, 2, 582, 583, 7, 17, 2, 2, 583, 584, 7, 229, 2, 2, 584, 586, 5, 172, 87, 2, 585, 587, 5, 38, 20, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 194, 2, 2, 589, 590, 7, 46, 2, 2, 590, 591, 7, 4, 2, 2, 591, 592, 5, 226, 114, 2, 592, 593, 7, 5, 2, 2, 593, 1028, 3, 2, 2, 2, 594, 595, 7, 17, 2, 2, 595, 596, 7, 229, 2, 2, 596, 598, 5, 172, 87, 2, 597, 599, 5, 38, 20, 2, 598, 597, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 601, 7, 214, 2, 2, 601, 602, 7, 211, 2, 2, 602, 606, 7, 285, 2, 2, 603, 604, 7, 264, 2, 2, 604, 605, 7, 212, 2, 2, 605, 607, 5, 56, 29, 2, 606, 603, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 1028, 3, 2, 2, 2, 608, 609, 7, 17, 2, 2, 609, 610, 7, 229, 2, 2, 610, 612, 5, 172, 87, 2, 611, 613, 5, 38, 20, 2, 612, 611, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 615, 7, 214, 2, 2, 615, 616, 7, 212, 2, 2, 616, 617, 5, 56, 29, 2, 617, 1028, 3, 2, 2, 2, 618, 619, 7, 17, 2, 2, 619, 620, 9, 7, 2, 2, 620, 621, 5, 172, 87, 2, 621, 625, 7, 14, 2, 2, 622, 623, 7, 112, 2, 2, 623, 624, 7, 155, 2, 2, 624, 626, 7, 85, 2, 2, 625, 622, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 628, 3, 2, 2, 2, 627, 629, 5, 36, 19, 2, 628, 627, 3, 2, 2, 2, 629, 630, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 1028, 3, 2, 2, 2, 632, 633, 7, 17, 2, 2, 633, 634, 7, 229, 2, 2, 634, 635, 5, 172, 87, 2, 635, 636, 5, 38, 20, 2, 636, 637, 7, 192, 2, 2, 637, 638, 7, 236, 2, 2, 638, 639, 5, 38, 20, 2, 639, 1028, 3, 2, 2, 2, 640, 641, 7, 17, 2, 2, 641, 642, 9, 7, 2, 2, 642, 643, 5, 172, 87, 2, 643, 646, 7, 78, 2, 2, 644, 645, 7, 112, 2, 2, 645, 647, 7, 85, 2, 2, 646, 644, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 653, 5, 38, 20, 2, 649, 650, 7, 6, 2, 2, 650, 652, 5, 38, 20, 2, 651, 649, 3, 2, 2, 2, 652, 655, 3, 2, 2, 2, 653, 651, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 656, 658, 7, 183, 2, 2, 657, 656, 3, 2, 2, 2, 657, 658, 3, 2, 2, 2, 658, 1028, 3, 2, 2, 2, 659, 660, 7, 17, 2, 2, 660, 661, 7, 229, 2, 2, 661, 663, 5, 172, 87, 2, 662, 664, 5, 38, 20, 2, 663, 662, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 666, 7, 214, 2, 2, 666, 667, 5, 28, 15, 2, 667, 1028, 3, 2, 2, 2, 668, 669, 7, 17, 2, 2, 669, 670, 7, 229, 2, 2, 670, 671, 5, 172, 87, 2, 671, 672, 7, 188, 2, 2, 672, 673, 7, 174, 2, 2, 673, 1028, 3, 2, 2, 2, 674, 675, 7, 78, 2, 2, 675, 678, 7, 229, 2, 2, 676, 677, 7, 112, 2, 2, 677, 679, 7, 85, 2, 2, 678, 676, 3, 2, 2, 2, 678, 679, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 682, 5, 172, 87, 2, 681, 683, 7, 183, 2, 2, 682, 681, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 1028, 3, 2, 2, 2, 684, 685, 7, 78, 2, 2, 685, 688, 7, 259, 2, 2, 686, 687, 7, 112, 2, 2, 687, 689, 7, 85, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 690, 3, 2, 2, 2, 690, 1028, 5, 172, 87, 2, 691, 694, 7, 55, 2, 2, 692, 693, 7, 163, 2, 2, 693, 695, 7, 194, 2, 2, 694, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 700, 3, 2, 2, 2, 696, 698, 7, 106, 2, 2, 697, 696, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 701, 7, 233, 2, 2, 700, 697, 3, 2, 2, 2, 700, 701, 3, 2, 2, 2, 701, 702, 3, 2, 2, 2, 702, 706, 7, 259, 2, 2, 703, 704, 7, 112, 2, 2, 704, 705, 7, 155, 2, 2, 705, 707, 7, 85, 2, 2, 706, 703, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 710, 5, 172, 87, 2, 709, 711, 5, 156, 79, 2, 710, 709, 3, 2, 2, 2, 710, 711, 3, 2, 2, 2, 711, 720, 3, 2, 2, 2, 712, 719, 5, 30, 16, 2, 713, 714, 7, 173, 2, 2, 714, 715, 7, 159, 2, 2, 715, 719, 5, 148, 75, 2, 716, 717, 7, 232, 2, 2, 717, 719, 5, 56, 29, 2, 718, 712, 3, 2, 2, 2, 718, 713, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 24, 2, 2, 724, 725, 5, 32, 17, 2, 725, 1028, 3, 2, 2, 2, 726, 729, 7, 55, 2, 2, 727, 728, 7, 163, 2, 2, 728, 730, 7, 194, 2, 2, 729, 727, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 732, 3, 2, 2, 2, 731, 733, 7, 106, 2, 2, 732, 731, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 7, 233, 2, 2, 735, 736, 7, 259, 2, 2, 736, 741, 5, 174, 88, 2, 737, 738, 7, 4, 2, 2, 738, 739, 5, 230, 116, 2, 739, 740, 7, 5, 2, 2, 740, 742, 3, 2, 2, 2, 741, 737, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 746, 5, 52, 27, 2, 744, 745, 7, 162, 2, 2, 745, 747, 5, 56, 29, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 1028, 3, 2, 2, 2, 748, 749, 7, 17, 2, 2, 749, 750, 7, 259, 2, 2, 750, 752, 5, 172, 87, 2, 751, 753, 7, 24, 2, 2, 752, 751, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 5, 32, 17, 2, 755, 1028, 3, 2, 2, 2, 756, 759, 7, 55, 2, 2, 757, 758, 7, 163, 2, 2, 758, 760, 7, 194, 2, 2, 759, 757, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 762, 3, 2, 2, 2, 761, 763, 7, 233, 2, 2, 762, 761, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 768, 7, 104, 2, 2, 765, 766, 7, 112, 2, 2, 766, 767, 7, 155, 2, 2, 767, 769, 7, 85, 2, 2, 768, 765, 3, 2, 2, 2, 768, 769, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 771, 5, 172, 87, 2, 771, 772, 7, 24, 2, 2, 772, 782, 7, 285, 2, 2, 773, 774, 7, 257, 2, 2, 774, 779, 5, 74, 38, 2, 775, 776, 7, 6, 2, 2, 776, 778, 5, 74, 38, 2, 777, 775, 3, 2, 2, 2, 778, 781, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 779, 780, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 782, 773, 3, 2, 2, 2, 782, 783, 3, 2, 2, 2, 783, 1028, 3, 2, 2, 2, 784, 786, 7, 78, 2, 2, 785, 787, 7, 233, 2, 2, 786, 785, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 788, 791, 7, 104, 2, 2, 789, 790, 7, 112, 2, 2, 790, 792, 7, 85, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 793, 3, 2, 2, 2, 793, 1028, 5, 172, 87, 2, 794, 796, 7, 86, 2, 2, 795, 797, 9, 9, 2, 2, 796, 795, 3, 2, 2, 2, 796, 797, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 1028, 5, 16, 9, 2, 799, 800, 7, 217, 2, 2, 800, 803, 7, 230, 2, 2, 801, 802, 9, 5, 2, 2, 802, 804, 5, 172, 87, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 809, 3, 2, 2, 2, 805, 807, 7, 134, 2, 2, 806, 805, 3, 2, 2, 2, 806, 807, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 810, 7, 285, 2, 2, 809, 806, 3, 2, 2, 2, 809, 810, 3, 2, 2, 2, 810, 1028, 3, 2, 2, 2, 811, 812, 7, 217, 2, 2, 812, 813, 7, 229, 2, 2, 813, 816, 7, 88, 2, 2, 814, 815, 9, 5, 2, 2, 815, 817, 5, 172, 87, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 819, 7, 134, 2, 2, 819, 821, 7, 285, 2, 2, 820, 822, 5, 38, 20, 2, 821, 820, 3, 2, 2, 2, 821, 822, 3, 2, 2, 2, 822, 1028, 3, 2, 2, 2, 823, 824, 7, 217, 2, 2, 824, 825, 7, 232, 2, 2, 825, 830, 5, 172, 87, 2, 826, 827, 7, 4, 2, 2, 827, 828, 5, 60, 31, 2, 828, 829, 7, 5, 2, 2, 829, 831, 3, 2, 2, 2, 830, 826, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 1028, 3, 2, 2, 2, 832, 833, 7, 217, 2, 2, 833, 834, 7, 46, 2, 2, 834, 835, 9, 5, 2, 2, 835, 838, 5, 172, 87, 2, 836, 837, 9, 5, 2, 2, 837, 839, 5, 172, 87, 2, 838, 836, 3, 2, 2, 2, 838, 839, 3, 2, 2, 2, 839, 1028, 3, 2, 2, 2, 840, 841, 7, 217, 2, 2, 841, 844, 7, 260, 2, 2, 842, 843, 9, 5, 2, 2, 843, 845, 5, 172, 87, 2, 844, 842, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 850, 3, 2, 2, 2, 846, 848, 7, 134, 2, 2, 847, 846, 3, 2, 2, 2, 847, 848, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 851, 7, 285, 2, 2, 850, 847, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 1028, 3, 2, 2, 2, 852, 853, 7, 217, 2, 2, 853, 854, 7, 174, 2, 2, 854, 856, 5, 172, 87, 2, 855, 857, 5, 38, 20, 2, 856, 855, 3, 2, 2, 2, 856, 857, 3, 2, 2, 2, 857, 1028, 3, 2, 2, 2, 858, 860, 7, 217, 2, 2, 859, 861, 5, 260, 131, 2, 860, 859, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 870, 7, 105, 2, 2, 863, 865, 7, 134, 2, 2, 864, 863, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 868, 3, 2, 2, 2, 866, 869, 5, 172, 87, 2, 867, 869, 7, 285, 2, 2, 868, 866, 3, 2, 2, 2, 868, 867, 3, 2, 2, 2, 869, 871, 3, 2, 2, 2, 870, 864, 3, 2, 2, 2, 870, 871, 3, 2, 2, 2, 871, 1028, 3, 2, 2, 2, 872, 873, 7, 217, 2, 2, 873, 874, 7, 55, 2, 2, 874, 875, 7, 229, 2, 2, 875, 878, 5, 172, 87, 2, 876, 877, 7, 24, 2, 2, 877, 879, 7, 211, 2, 2, 878, 876, 3, 2, 2, 2, 878, 879, 3, 2, 2, 2, 879, 1028, 3, 2, 2, 2, 880, 881, 7, 217, 2, 2, 881, 882, 7, 58, 2, 2, 882, 1028, 7, 151, 2, 2, 883, 884, 9, 10, 2, 2, 884, 886, 7, 104, 2, 2, 885, 887, 7, 88, 2, 2, 886, 885, 3, 2, 2, 2, 886, 887, 3, 2, 2, 2, 887, 888, 3, 2, 2, 2, 888, 1028, 5, 44, 23, 2, 889, 890, 9, 10, 2, 2, 890, 892, 5, 42, 22, 2, 891, 893, 7, 88, 2, 2, 892, 891, 3, 2, 2, 2, 892, 893, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 895, 5, 172, 87, 2, 895, 1028, 3, 2, 2, 2, 896, 898, 9, 10, 2, 2, 897, 899, 7, 229, 2, 2, 898, 897, 3, 2, 2, 2, 898, 899, 3, 2, 2, 2, 899, 901, 3, 2, 2, 2, 900, 902, 9, 11, 2, 2, 901, 900, 3, 2, 2, 2, 901, 902, 3, 2, 2, 2, 902, 903, 3, 2, 2, 2, 903, 905, 5, 172, 87, 2, 904, 906, 5, 38, 20, 2, 905, 904, 3, 2, 2, 2, 905, 906, 3, 2, 2, 2, 906, 908, 3, 2, 2, 2, 907, 909, 5, 46, 24, 2, 908, 907, 3, 2, 2, 2, 908, 909, 3, 2, 2, 2, 909, 1028, 3, 2, 2, 2, 910, 912, 9, 10, 2, 2, 911, 913, 7, 184, 2, 2, 912, 911, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 3, 2, 2, 2, 914, 1028, 5, 32, 17, 2, 915, 916, 7, 47, 2, 2, 916, 917, 7, 159, 2, 2, 917, 918, 5, 42, 22, 2, 918, 919, 5, 172, 87, 2, 919, 920, 7, 125, 2, 2, 920, 921, 9, 12, 2, 2, 921, 1028, 3, 2, 2, 2, 922, 923, 7, 47, 2, 2, 923, 924, 7, 159, 2, 2, 924, 925, 7, 229, 2, 2, 925, 926, 5, 172, 87, 2, 926, 927, 7, 125, 2, 2, 927, 928, 9, 12, 2, 2, 928, 1028, 3, 2, 2, 2, 929, 930, 7, 191, 2, 2, 930, 931, 7, 229, 2, 2, 931, 1028, 5, 172, 87, 2, 932, 940, 7, 191, 2, 2, 933, 941, 7, 285, 2, 2, 934, 936, 11, 2, 2, 2, 935, 934, 3, 2, 2, 2, 936, 939, 3, 2, 2, 2, 937, 938, 3, 2, 2, 2, 937, 935, 3, 2, 2, 2, 938, 941, 3, 2, 2, 2, 939, 937, 3, 2, 2, 2, 940, 933, 3, 2, 2, 2, 940, 937, 3, 2, 2, 2, 941, 1028, 3, 2, 2, 2, 942, 944, 7, 33, 2, 2, 943, 945, 7, 131, 2, 2, 944, 943, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 946, 3, 2, 2, 2, 946, 947, 7, 229, 2, 2, 947, 950, 5, 172, 87, 2, 948, 949, 7, 162, 2, 2, 949, 951, 5, 56, 29, 2, 950, 948, 3, 2, 2, 2, 950, 951, 3, 2, 2, 2, 951, 956, 3, 2, 2, 2, 952, 954, 7, 24, 2, 2, 953, 952, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 957, 5, 32, 17, 2, 956, 953, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 1028, 3, 2, 2, 2, 958, 959, 7, 248, 2, 2, 959, 962, 7, 229, 2, 2, 960, 961, 7, 112, 2, 2, 961, 963, 7, 85, 2, 2, 962, 960, 3, 2, 2, 2, 962, 963, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 964, 1028, 5, 172, 87, 2, 965, 966, 7, 39, 2, 2, 966, 1028, 7, 33, 2, 2, 967, 968, 7, 138, 2, 2, 968, 970, 7, 63, 2, 2, 969, 971, 7, 139, 2, 2, 970, 969, 3, 2, 2, 2, 970, 971, 3, 2, 2, 2, 971, 972, 3, 2, 2, 2, 972, 973, 7, 119, 2, 2, 973, 975, 7, 285, 2, 2, 974, 976, 7, 171, 2, 2, 975, 974, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 978, 7, 124, 2, 2, 978, 979, 7, 229, 2, 2, 979, 981, 5, 172, 87, 2, 980, 982, 5, 38, 20, 2, 981, 980, 3, 2, 2, 2, 981, 982, 3, 2, 2, 2, 982, 1028, 3, 2, 2, 2, 983, 984, 7, 244, 2, 2, 984, 985, 7, 229, 2, 2, 985, 987, 5, 172, 87, 2, 986, 988, 5, 38, 20, 2, 987, 986, 3, 2, 2, 2, 987, 988, 3, 2, 2, 2, 988, 1028, 3, 2, 2, 2, 989, 990, 7, 150, 2, 2, 990, 991, 7, 193, 2, 2, 991, 992, 7, 229, 2, 2, 992, 1028, 5, 172, 87, 2, 993, 994, 9, 13, 2, 2, 994, 1002, 5, 260, 131, 2, 995, 1003, 7, 285, 2, 2, 996, 998, 11, 2, 2, 2, 997, 996, 3, 2, 2, 2, 998, 1001, 3, 2, 2, 2, 999, 1000, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 1000, 1003, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1002, 995, 3, 2, 2, 2, 1002, 999, 3, 2, 2, 2, 1003, 1028, 3, 2, 2, 2, 1004, 1005, 7, 214, 2, 2, 1005, 1009, 7, 200, 2, 2, 1006, 1008, 11, 2, 2, 2, 1007, 1006, 3, 2, 2, 2, 1008, 1011, 3, 2, 2, 2, 1009, 1010, 3, 2, 2, 2, 1009, 1007, 3, 2, 2, 2, 1010, 1028, 3, 2, 2, 2, 1011, 1009, 3, 2, 2, 2, 1012, 1016, 7, 214, 2, 2, 1013, 1015, 11, 2, 2, 2, 1014, 1013, 3, 2, 2, 2, 1015, 1018, 3, 2, 2, 2, 1016, 1017, 3, 2, 2, 2, 1016, 1014, 3, 2, 2, 2, 1017, 1028, 3, 2, 2, 2, 1018, 1016, 3, 2, 2, 2, 1019, 1028, 7, 195, 2, 2, 1020, 1024, 5, 18, 10, 2, 1021, 1023, 11, 2, 2, 2, 1022, 1021, 3, 2, 2, 2, 1023, 1026, 3, 2, 2, 2, 1024, 1025, 3, 2, 2, 2, 1024, 1022, 3, 2, 2, 2, 1025, 1028, 3, 2, 2, 2, 1026, 1024, 3, 2, 2, 2, 1027, 303, 3, 2, 2, 2, 1027, 305, 3, 2, 2, 2, 1027, 308, 3, 2, 2, 2, 1027, 313, 3, 2, 2, 2, 1027, 331, 3, 2, 2, 2, 1027, 338, 3, 2, 2, 2, 1027, 344, 3, 2, 2, 2, 1027, 354, 3, 2, 2, 2, 1027, 366, 3, 2, 2, 2, 1027, 384, 3, 2, 2, 2, 1027, 400, 3, 2, 2, 2, 1027, 437, 3, 2, 2, 2, 1027, 458, 3, 2, 2, 2, 1027, 473, 3, 2, 2, 2, 1027, 490, 3, 2, 2, 2, 1027, 497, 3, 2, 2, 2, 1027, 506, 3, 2, 2, 2, 1027, 515, 3, 2, 2, 2, 1027, 524, 3, 2, 2, 2, 1027, 531, 3, 2, 2, 2, 1027, 538, 3, 2, 2, 2, 1027, 545, 3, 2, 2, 2, 1027, 556, 3, 2, 2, 2, 1027, 567, 3, 2, 2, 2, 1027, 582, 3, 2, 2, 2, 1027, 594, 3, 2, 2, 2, 1027, 608, 3, 2, 2, 2, 1027, 618, 3, 2, 2, 2, 1027, 632, 3, 2, 2, 2, 1027, 640, 3, 2, 2, 2, 1027, 659, 3, 2, 2, 2, 1027, 668, 3, 2, 2, 2, 1027, 674, 3, 2, 2, 2, 1027, 684, 3, 2, 2, 2, 1027, 691, 3, 2, 2, 2, 1027, 726, 3, 2, 2, 2, 1027, 748, 3, 2, 2, 2, 1027, 756, 3, 2, 2, 2, 1027, 784, 3, 2, 2, 2, 1027, 794, 3, 2, 2, 2, 1027, 799, 3, 2, 2, 2, 1027, 811, 3, 2, 2, 2, 1027, 823, 3, 2, 2, 2, 1027, 832, 3, 2, 2, 2, 1027, 840, 3, 2, 2, 2, 1027, 852, 3, 2, 2, 2, 1027, 858, 3, 2, 2, 2, 1027, 872, 3, 2, 2, 2, 1027, 880, 3, 2, 2, 2, 1027, 883, 3, 2, 2, 2, 1027, 889, 3, 2, 2, 2, 1027, 896, 3, 2, 2, 2, 1027, 910, 3, 2, 2, 2, 1027, 915, 3, 2, 2, 2, 1027, 922, 3, 2, 2, 2, 1027, 929, 3, 2, 2, 2, 1027, 932, 3, 2, 2, 2, 1027, 942, 3, 2, 2, 2, 1027, 958, 3, 2, 2, 2, 1027, 965, 3, 2, 2, 2, 1027, 967, 3, 2, 2, 2, 1027, 983, 3, 2, 2, 2, 1027, 989, 3, 2, 2, 2, 1027, 993, 3, 2, 2, 2, 1027, 1004, 3, 2, 2, 2, 1027, 1012, 3, 2, 2, 2, 1027, 1019, 3, 2, 2, 2, 1027, 1020, 3, 2, 2, 2, 1028, 17, 3, 2, 2, 2, 1029, 1030, 7, 55, 2, 2, 1030, 1198, 7, 200, 2, 2, 1031, 1032, 7, 78, 2, 2, 1032, 1198, 7, 200, 2, 2, 1033, 1035, 7, 107, 2, 2, 1034, 1036, 7, 200, 2, 2, 1035, 1034, 3, 2, 2, 2, 1035, 1036, 3, 2, 2, 2, 1036, 1198, 3, 2, 2, 2, 1037, 1039, 7, 197, 2, 2, 1038, 1040, 7, 200, 2, 2, 1039, 1038, 3, 2, 2, 2, 1039, 1040, 3, 2, 2, 2, 1040, 1198, 3, 2, 2, 2, 1041, 1042, 7, 217, 2, 2, 1042, 1198, 7, 107, 2, 2, 1043, 1044, 7, 217, 2, 2, 1044, 1046, 7, 200, 2, 2, 1045, 1047, 7, 107, 2, 2, 1046, 1045, 3, 2, 2, 2, 1046, 1047, 3, 2, 2, 2, 1047, 1198, 3, 2, 2, 2, 1048, 1049, 7, 217, 2, 2, 1049, 1198, 7, 181, 2, 2, 1050, 1051, 7, 217, 2, 2, 1051, 1198, 7, 201, 2, 2, 1052, 1053, 7, 217, 2, 2, 1053, 1054, 7, 58, 2, 2, 1054, 1198, 7, 201, 2, 2, 1055, 1056, 7, 87, 2, 2, 1056, 1198, 7, 229, 2, 2, 1057, 1058, 7, 114, 2, 2, 1058, 1198, 7, 229, 2, 2, 1059, 1060, 7, 217, 2, 2, 1060, 1198, 7, 50, 2, 2, 1061, 1062, 7, 217, 2, 2, 1062, 1063, 7, 55, 2, 2, 1063, 1198, 7, 229, 2, 2, 1064, 1065, 7, 217, 2, 2, 1065, 1198, 7, 240, 2, 2, 1066, 1067, 7, 217, 2, 2, 1067, 1198, 7, 117, 2, 2, 1068, 1069, 7, 217, 2, 2, 1069, 1198, 7, 142, 2, 2, 1070, 1071, 7, 55, 2, 2, 1071, 1198, 7, 116, 2, 2, 1072, 1073, 7, 78, 2, 2, 1073, 1198, 7, 116, 2, 2, 1074, 1075, 7, 17, 2, 2, 1075, 1198, 7, 116, 2, 2, 1076, 1077, 7, 141, 2, 2, 1077, 1198, 7, 229, 2, 2, 1078, 1079, 7, 141, 2, 2, 1079, 1198, 7, 64, 2, 2, 1080, 1081, 7, 252, 2, 2, 1081, 1198, 7, 229, 2, 2, 1082, 1083, 7, 252, 2, 2, 1083, 1198, 7, 64, 2, 2, 1084, 1085, 7, 55, 2, 2, 1085, 1086, 7, 233, 2, 2, 1086, 1198, 7, 144, 2, 2, 1087, 1088, 7, 78, 2, 2, 1088, 1089, 7, 233, 2, 2, 1089, 1198, 7, 144, 2, 2, 1090, 1091, 7, 17, 2, 2, 1091, 1092, 7, 229, 2, 2, 1092, 1093, 5, 174, 88, 2, 1093, 1094, 7, 155, 2, 2, 1094, 1095, 7, 41, 2, 2, 1095, 1198, 3, 2, 2, 2, 1096, 1097, 7, 17, 2, 2, 1097, 1098, 7, 229, 2, 2, 1098, 1099, 5, 174, 88, 2, 1099, 1100, 7, 41, 2, 2, 1100, 1101, 7, 32, 2, 2, 1101, 1198, 3, 2, 2, 2, 1102, 1103, 7, 17, 2, 2, 1103, 1104, 7, 229, 2, 2, 1104, 1105, 5, 174, 88, 2, 1105, 1106, 7, 155, 2, 2, 1106, 1107, 7, 221, 2, 2, 1107, 1198, 3, 2, 2, 2, 1108, 1109, 7, 17, 2, 2, 1109, 1110, 7, 229, 2, 2, 1110, 1111, 5, 174, 88, 2, 1111, 1112, 7, 218, 2, 2, 1112, 1113, 7, 32, 2, 2, 1113, 1198, 3, 2, 2, 2, 1114, 1115, 7, 17, 2, 2, 1115, 1116, 7, 229, 2, 2, 1116, 1117, 5, 174, 88, 2, 1117, 1118, 7, 155, 2, 2, 1118, 1119, 7, 218, 2, 2, 1119, 1198, 3, 2, 2, 2, 1120, 1121, 7, 17, 2, 2, 1121, 1122, 7, 229, 2, 2, 1122, 1123, 5, 174, 88, 2, 1123, 1124, 7, 155, 2, 2, 1124, 1125, 7, 224, 2, 2, 1125, 1126, 7, 24, 2, 2, 1126, 1127, 7, 74, 2, 2, 1127, 1198, 3, 2, 2, 2, 1128, 1129, 7, 17, 2, 2, 1129, 1130, 7, 229, 2, 2, 1130, 1131, 5, 174, 88, 2, 1131, 1132, 7, 214, 2, 2, 1132, 1133, 7, 218, 2, 2, 1133, 1134, 7, 140, 2, 2, 1134, 1198, 3, 2, 2, 2, 1135, 1136, 7, 17, 2, 2, 1136, 1137, 7, 229, 2, 2, 1137, 1138, 5, 174, 88, 2, 1138, 1139, 7, 84, 2, 2, 1139, 1140, 7, 172, 2, 2, 1140, 1198, 3, 2, 2, 2, 1141, 1142, 7, 17, 2, 2, 1142, 1143, 7, 229, 2, 2, 1143, 1144, 5, 174, 88, 2, 1144, 1145, 7, 22, 2, 2, 1145, 1146, 7, 172, 2, 2, 1146, 1198, 3, 2, 2, 2, 1147, 1148, 7, 17, 2, 2, 1148, 1149, 7, 229, 2, 2, 1149, 1150, 5, 174, 88, 2, 1150, 1151, 7, 246, 2, 2, 1151, 1152, 7, 172, 2, 2, 1152, 1198, 3, 2, 2, 2, 1153, 1154, 7, 17, 2, 2, 1154, 1155, 7, 229, 2, 2, 1155, 1156, 5, 174, 88, 2, 1156, 1157, 7, 237, 2, 2, 1157, 1198, 3, 2, 2, 2, 1158, 1159, 7, 17, 2, 2, 1159, 1160, 7, 229, 2, 2, 1160, 1162, 5, 174, 88, 2, 1161, 1163, 5, 38, 20, 2, 1162, 1161, 3, 2, 2, 2, 1162, 1163, 3, 2, 2, 2, 1163, 1164, 3, 2, 2, 2, 1164, 1165, 7, 49, 2, 2, 1165, 1198, 3, 2, 2, 2, 1166, 1167, 7, 17, 2, 2, 1167, 1168, 7, 229, 2, 2, 1168, 1170, 5, 174, 88, 2, 1169, 1171, 5, 38, 20, 2, 1170, 1169, 3, 2, 2, 2, 1170, 1171, 3, 2, 2, 2, 1171, 1172, 3, 2, 2, 2, 1172, 1173, 7, 52, 2, 2, 1173, 1198, 3, 2, 2, 2, 1174, 1175, 7, 17, 2, 2, 1175, 1176, 7, 229, 2, 2, 1176, 1178, 5, 174, 88, 2, 1177, 1179, 5, 38, 20, 2, 1178, 1177, 3, 2, 2, 2, 1178, 1179, 3, 2, 2, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 7, 214, 2, 2, 1181, 1182, 7, 95, 2, 2, 1182, 1198, 3, 2, 2, 2, 1183, 1184, 7, 17, 2, 2, 1184, 1185, 7, 229, 2, 2, 1185, 1187, 5, 174, 88, 2, 1186, 1188, 5, 38, 20, 2, 1187, 1186, 3, 2, 2, 2, 1187, 1188, 3, 2, 2, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 7, 194, 2, 2, 1190, 1191, 7, 46, 2, 2, 1191, 1198, 3, 2, 2, 2, 1192, 1193, 7, 222, 2, 2, 1193, 1198, 7, 239, 2, 2, 1194, 1198, 7, 48, 2, 2, 1195, 1198, 7, 202, 2, 2, 1196, 1198, 7, 73, 2, 2, 1197, 1029, 3, 2, 2, 2, 1197, 1031, 3, 2, 2, 2, 1197, 1033, 3, 2, 2, 2, 1197, 1037, 3, 2, 2, 2, 1197, 1041, 3, 2, 2, 2, 1197, 1043, 3, 2, 2, 2, 1197, 1048, 3, 2, 2, 2, 1197, 1050, 3, 2, 2, 2, 1197, 1052, 3, 2, 2, 2, 1197, 1055, 3, 2, 2, 2, 1197, 1057, 3, 2, 2, 2, 1197, 1059, 3, 2, 2, 2, 1197, 1061, 3, 2, 2, 2, 1197, 1064, 3, 2, 2, 2, 1197, 1066, 3, 2, 2, 2, 1197, 1068, 3, 2, 2, 2, 1197, 1070, 3, 2, 2, 2, 1197, 1072, 3, 2, 2, 2, 1197, 1074, 3, 2, 2, 2, 1197, 1076, 3, 2, 2, 2, 1197, 1078, 3, 2, 2, 2, 1197, 1080, 3, 2, 2, 2, 1197, 1082, 3, 2, 2, 2, 1197, 1084, 3, 2, 2, 2, 1197, 1087, 3, 2, 2, 2, 1197, 1090, 3, 2, 2, 2, 1197, 1096, 3, 2, 2, 2, 1197, 1102, 3, 2, 2, 2, 1197, 1108, 3, 2, 2, 2, 1197, 1114, 3, 2, 2, 2, 1197, 1120, 3, 2, 2, 2, 1197, 1128, 3, 2, 2, 2, 1197, 1135, 3, 2, 2, 2, 1197, 1141, 3, 2, 2, 2, 1197, 1147, 3, 2, 2, 2, 1197, 1153, 3, 2, 2, 2, 1197, 1158, 3, 2, 2, 2, 1197, 1166, 3, 2, 2, 2, 1197, 1174, 3, 2, 2, 2, 1197, 1183, 3, 2, 2, 2, 1197, 1192, 3, 2, 2, 2, 1197, 1194, 3, 2, 2, 2, 1197, 1195, 3, 2, 2, 2, 1197, 1196, 3, 2, 2, 2, 1198, 19, 3, 2, 2, 2, 1199, 1201, 7, 55, 2, 2, 1200, 1202, 7, 233, 2, 2, 1201, 1200, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1204, 3, 2, 2, 2, 1203, 1205, 7, 89, 2, 2, 1204, 1203, 3, 2, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 3, 2, 2, 2, 1206, 1210, 7, 229, 2, 2, 1207, 1208, 7, 112, 2, 2, 1208, 1209, 7, 155, 2, 2, 1209, 1211, 7, 85, 2, 2, 1210, 1207, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1212, 3, 2, 2, 2, 1212, 1213, 5, 172, 87, 2, 1213, 21, 3, 2, 2, 2, 1214, 1215, 7, 55, 2, 2, 1215, 1217, 7, 163, 2, 2, 1216, 1214, 3, 2, 2, 2, 1216, 1217, 3, 2, 2, 2, 1217, 1218, 3, 2, 2, 2, 1218, 1219, 7, 194, 2, 2, 1219, 1220, 7, 229, 2, 2, 1220, 1221, 5, 172, 87, 2, 1221, 23, 3, 2, 2, 2, 1222, 1223, 7, 41, 2, 2, 1223, 1224, 7, 32, 2, 2, 1224, 1228, 5, 148, 75, 2, 1225, 1226, 7, 221, 2, 2, 1226, 1227, 7, 32, 2, 2, 1227, 1229, 5, 152, 77, 2, 1228, 1225, 3, 2, 2, 2, 1228, 1229, 3, 2, 2, 2, 1229, 1230, 3, 2, 2, 2, 1230, 1231, 7, 124, 2, 2, 1231, 1232, 7, 289, 2, 2, 1232, 1233, 7, 31, 2, 2, 1233, 25, 3, 2, 2, 2, 1234, 1235, 7, 218, 2, 2, 1235, 1236, 7, 32, 2, 2, 1236, 1237, 5, 148, 75, 2, 1237, 1240, 7, 159, 2, 2, 1238, 1241, 5, 64, 33, 2, 1239, 1241, 5, 66, 34, 2, 1240, 1238, 3, 2, 2, 2, 1240, 1239, 3, 2, 2, 2, 1241, 1245, 3, 2, 2, 2, 1242, 1243, 7, 224, 2, 2, 1243, 1244, 7, 24, 2, 2, 1244, 1246, 7, 74, 2, 2, 1245, 1242, 3, 2, 2, 2, 1245, 1246, 3, 2, 2, 2, 1246, 27, 3, 2, 2, 2, 1247, 1248, 7, 140, 2, 2, 1248, 1249, 7, 285, 2, 2, 1249, 29, 3, 2, 2, 2, 1250, 1251, 7, 47, 2, 2, 1251, 1252, 7, 285, 2, 2, 1252, 31, 3, 2, 2, 2, 1253, 1255, 5, 48, 25, 2, 1254, 1253, 3, 2, 2, 2, 1254, 1255, 3, 2, 2, 2, 1255, 1256, 3, 2, 2, 2, 1256, 1257, 5, 82, 42, 2, 1257, 1258, 5, 78, 40, 2, 1258, 33, 3, 2, 2, 2, 1259, 1260, 7, 121, 2, 2, 1260, 1262, 7, 171, 2, 2, 1261, 1263, 7, 229, 2, 2, 1262, 1261, 3, 2, 2, 2, 1262, 1263, 3, 2, 2, 2, 1263, 1264, 3, 2, 2, 2, 1264, 1271, 5, 172, 87, 2, 1265, 1269, 5, 38, 20, 2, 1266, 1267, 7, 112, 2, 2, 1267, 1268, 7, 155, 2, 2, 1268, 1270, 7, 85, 2, 2, 1269, 1266, 3, 2, 2, 2, 1269, 1270, 3, 2, 2, 2, 1270, 1272, 3, 2, 2, 2, 1271, 1265, 3, 2, 2, 2, 1271, 1272, 3, 2, 2, 2, 1272, 1315, 3, 2, 2, 2, 1273, 1274, 7, 121, 2, 2, 1274, 1276, 7, 124, 2, 2, 1275, 1277, 7, 229, 2, 2, 1276, 1275, 3, 2, 2, 2, 1276, 1277, 3, 2, 2, 2, 1277, 1278, 3, 2, 2, 2, 1278, 1280, 5, 172, 87, 2, 1279, 1281, 5, 38, 20, 2, 1280, 1279, 3, 2, 2, 2, 1280, 1281, 3, 2, 2, 2, 1281, 1285, 3, 2, 2, 2, 1282, 1283, 7, 112, 2, 2, 1283, 1284, 7, 155, 2, 2, 1284, 1286, 7, 85, 2, 2, 1285, 1282, 3, 2, 2, 2, 1285, 1286, 3, 2, 2, 2, 1286, 1315, 3, 2, 2, 2, 1287, 1288, 7, 121, 2, 2, 1288, 1290, 7, 171, 2, 2, 1289, 1291, 7, 139, 2, 2, 1290, 1289, 3, 2, 2, 2, 1290, 1291, 3, 2, 2, 2, 1291, 1292, 3, 2, 2, 2, 1292, 1293, 7, 75, 2, 2, 1293, 1295, 7, 285, 2, 2, 1294, 1296, 5, 168, 85, 2, 1295, 1294, 3, 2, 2, 2, 1295, 1296, 3, 2, 2, 2, 1296, 1298, 3, 2, 2, 2, 1297, 1299, 5, 68, 35, 2, 1298, 1297, 3, 2, 2, 2, 1298, 1299, 3, 2, 2, 2, 1299, 1315, 3, 2, 2, 2, 1300, 1301, 7, 121, 2, 2, 1301, 1303, 7, 171, 2, 2, 1302, 1304, 7, 139, 2, 2, 1303, 1302, 3, 2, 2, 2, 1303, 1304, 3, 2, 2, 2, 1304, 1305, 3, 2, 2, 2, 1305, 1307, 7, 75, 2, 2, 1306, 1308, 7, 285, 2, 2, 1307, 1306, 3, 2, 2, 2, 1307, 1308, 3, 2, 2, 2, 1308, 1309, 3, 2, 2, 2, 1309, 1312, 5, 52, 27, 2, 1310, 1311, 7, 162, 2, 2, 1311, 1313, 5, 56, 29, 2, 1312, 1310, 3, 2, 2, 2, 1312, 1313, 3, 2, 2, 2, 1313, 1315, 3, 2, 2, 2, 1314, 1259, 3, 2, 2, 2, 1314, 1273, 3, 2, 2, 2, 1314, 1287, 3, 2, 2, 2, 1314, 1300, 3, 2, 2, 2, 1315, 35, 3, 2, 2, 2, 1316, 1318, 5, 38, 20, 2, 1317, 1319, 5, 28, 15, 2, 1318, 1317, 3, 2, 2, 2, 1318, 1319, 3, 2, 2, 2, 1319, 37, 3, 2, 2, 2, 1320, 1321, 7, 172, 2, 2, 1321, 1322, 7, 4, 2, 2, 1322, 1327, 5, 40, 21, 2, 1323, 1324, 7, 6, 2, 2, 1324, 1326, 5, 40, 21, 2, 1325, 1323, 3, 2, 2, 2, 1326, 1329, 3, 2, 2, 2, 1327, 1325, 3, 2, 2, 2, 1327, 1328, 3, 2, 2, 2, 1328, 1330, 3, 2, 2, 2, 1329, 1327, 3, 2, 2, 2, 1330, 1331, 7, 5, 2, 2, 1331, 39, 3, 2, 2, 2, 1332, 1335, 5, 260, 131, 2, 1333, 1334, 7, 266, 2, 2, 1334, 1336, 5, 198, 100, 2, 1335, 1333, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 41, 3, 2, 2, 2, 1337, 1338, 9, 14, 2, 2, 1338, 43, 3, 2, 2, 2, 1339, 1345, 5, 254, 128, 2, 1340, 1345, 7, 285, 2, 2, 1341, 1345, 5, 200, 101, 2, 1342, 1345, 5, 202, 102, 2, 1343, 1345, 5, 204, 103, 2, 1344, 1339, 3, 2, 2, 2, 1344, 1340, 3, 2, 2, 2, 1344, 1341, 3, 2, 2, 2, 1344, 1342, 3, 2, 2, 2, 1344, 1343, 3, 2, 2, 2, 1345, 45, 3, 2, 2, 2, 1346, 1351, 5, 260, 131, 2, 1347, 1348, 7, 7, 2, 2, 1348, 1350, 5, 260, 131, 2, 1349, 1347, 3, 2, 2, 2, 1350, 1353, 3, 2, 2, 2, 1351, 1349, 3, 2, 2, 2, 1351, 1352, 3, 2, 2, 2, 1352, 47, 3, 2, 2, 2, 1353, 1351, 3, 2, 2, 2, 1354, 1355, 7, 264, 2, 2, 1355, 1360, 5, 50, 26, 2, 1356, 1357, 7, 6, 2, 2, 1357, 1359, 5, 50, 26, 2, 1358, 1356, 3, 2, 2, 2, 1359, 1362, 3, 2, 2, 2, 1360, 1358, 3, 2, 2, 2, 1360, 1361, 3, 2, 2, 2, 1361, 49, 3, 2, 2, 2, 1362, 1360, 3, 2, 2, 2, 1363, 1365, 5, 256, 129, 2, 1364, 1366, 5, 148, 75, 2, 1365, 1364, 3, 2, 2, 2, 1365, 1366, 3, 2, 2, 2, 1366, 1368, 3, 2, 2, 2, 1367, 1369, 7, 24, 2, 2, 1368, 1367, 3, 2, 2, 2, 1368, 1369, 3, 2, 2, 2, 1369, 1370, 3, 2, 2, 2, 1370, 1371, 7, 4, 2, 2, 1371, 1372, 5, 32, 17, 2, 1372, 1373, 7, 5, 2, 2, 1373, 51, 3, 2, 2, 2, 1374, 1375, 7, 257, 2, 2, 1375, 1376, 5, 172, 87, 2, 1376, 53, 3, 2, 2, 2, 1377, 1378, 7, 162, 2, 2, 1378, 1388, 5, 56, 29, 2, 1379, 1380, 7, 173, 2, 2, 1380, 1381, 7, 32, 2, 2, 1381, 1388, 5, 182, 92, 2, 1382, 1388, 5, 24, 13, 2, 1383, 1388, 5, 28, 15, 2, 1384, 1388, 5, 30, 16, 2, 1385, 1386, 7, 232, 2, 2, 1386, 1388, 5, 56, 29, 2, 1387, 1377, 3, 2, 2, 2, 1387, 1379, 3, 2, 2, 2, 1387, 1382, 3, 2, 2, 2, 1387, 1383, 3, 2, 2, 2, 1387, 1384, 3, 2, 2, 2, 1387, 1385, 3, 2, 2, 2, 1388, 1391, 3, 2, 2, 2, 1389, 1387, 3, 2, 2, 2, 1389, 1390, 3, 2, 2, 2, 1390, 55, 3, 2, 2, 2, 1391, 1389, 3, 2, 2, 2, 1392, 1393, 7, 4, 2, 2, 1393, 1398, 5, 58, 30, 2, 1394, 1395, 7, 6, 2, 2, 1395, 1397, 5, 58, 30, 2, 1396, 1394, 3, 2, 2, 2, 1397, 1400, 3, 2, 2, 2, 1398, 1396, 3, 2, 2, 2, 1398, 1399, 3, 2, 2, 2, 1399, 1401, 3, 2, 2, 2, 1400, 1398, 3, 2, 2, 2, 1401, 1402, 7, 5, 2, 2, 1402, 57, 3, 2, 2, 2, 1403, 1408, 5, 60, 31, 2, 1404, 1406, 7, 266, 2, 2, 1405, 1404, 3, 2, 2, 2, 1405, 1406, 3, 2, 2, 2, 1406, 1407, 3, 2, 2, 2, 1407, 1409, 5, 62, 32, 2, 1408, 1405, 3, 2, 2, 2, 1408, 1409, 3, 2, 2, 2, 1409, 59, 3, 2, 2, 2, 1410, 1415, 5, 260, 131, 2, 1411, 1412, 7, 7, 2, 2, 1412, 1414, 5, 260, 131, 2, 1413, 1411, 3, 2, 2, 2, 1414, 1417, 3, 2, 2, 2, 1415, 1413, 3, 2, 2, 2, 1415, 1416, 3, 2, 2, 2, 1416, 1420, 3, 2, 2, 2, 1417, 1415, 3, 2, 2, 2, 1418, 1420, 7, 285, 2, 2, 1419, 1410, 3, 2, 2, 2, 1419, 1418, 3, 2, 2, 2, 1420, 61, 3, 2, 2, 2, 1421, 1426, 7, 289, 2, 2, 1422, 1426, 7, 291, 2, 2, 1423, 1426, 5, 206, 104, 2, 1424, 1426, 7, 285, 2, 2, 1425, 1421, 3, 2, 2, 2, 1425, 1422, 3, 2, 2, 2, 1425, 1423, 3, 2, 2, 2, 1425, 1424, 3, 2, 2, 2, 1426, 63, 3, 2, 2, 2, 1427, 1428, 7, 4, 2, 2, 1428, 1433, 5, 198, 100, 2, 1429, 1430, 7, 6, 2, 2, 1430, 1432, 5, 198, 100, 2, 1431, 1429, 3, 2, 2, 2, 1432, 1435, 3, 2, 2, 2, 1433, 1431, 3, 2, 2, 2, 1433, 1434, 3, 2, 2, 2, 1434, 1436, 3, 2, 2, 2, 1435, 1433, 3, 2, 2, 2, 1436, 1437, 7, 5, 2, 2, 1437, 65, 3, 2, 2, 2, 1438, 1439, 7, 4, 2, 2, 1439, 1444, 5, 64, 33, 2, 1440, 1441, 7, 6, 2, 2, 1441, 1443, 5, 64, 33, 2, 1442, 1440, 3, 2, 2, 2, 1443, 1446, 3, 2, 2, 2, 1444, 1442, 3, 2, 2, 2, 1444, 1445, 3, 2, 2, 2, 1445, 1447, 3, 2, 2, 2, 1446, 1444, 3, 2, 2, 2, 1447, 1448, 7, 5, 2, 2, 1448, 67, 3, 2, 2, 2, 1449, 1450, 7, 224, 2, 2, 1450, 1451, 7, 24, 2, 2, 1451, 1456, 5, 70, 36, 2, 1452, 1453, 7, 224, 2, 2, 1453, 1454, 7, 32, 2, 2, 1454, 1456, 5, 72, 37, 2, 1455, 1449, 3, 2, 2, 2, 1455, 1452, 3, 2, 2, 2, 1456, 69, 3, 2, 2, 2, 1457, 1458, 7, 120, 2, 2, 1458, 1459, 7, 285, 2, 2, 1459, 1460, 7, 167, 2, 2, 1460, 1463, 7, 285, 2, 2, 1461, 1463, 5, 260, 131, 2, 1462, 1457, 3, 2, 2, 2, 1462, 1461, 3, 2, 2, 2, 1463, 71, 3, 2, 2, 2, 1464, 1468, 7, 285, 2, 2, 1465, 1466, 7, 264, 2, 2, 1466, 1467, 7, 212, 2, 2, 1467, 1469, 5, 56, 29, 2, 1468, 1465, 3, 2, 2, 2, 1468, 1469, 3, 2, 2, 2, 1469, 73, 3, 2, 2, 2, 1470, 1471, 5, 260, 131, 2, 1471, 1472, 7, 285, 2, 2, 1472, 75, 3, 2, 2, 2, 1473, 1474, 5, 34, 18, 2, 1474, 1475, 5, 82, 42, 2, 1475, 1476, 5, 78, 40, 2, 1476, 1525, 3, 2, 2, 2, 1477, 1479, 5, 120, 61, 2, 1478, 1480, 5, 80, 41, 2, 1479, 1478, 3, 2, 2, 2, 1480, 1481, 3, 2, 2, 2, 1481, 1479, 3, 2, 2, 2, 1481, 1482, 3, 2, 2, 2, 1482, 1525, 3, 2, 2, 2, 1483, 1484, 7, 69, 2, 2, 1484, 1485, 7, 102, 2, 2, 1485, 1486, 5, 172, 87, 2, 1486, 1488, 5, 166, 84, 2, 1487, 1489, 5, 112, 57, 2, 1488, 1487, 3, 2, 2, 2, 1488, 1489, 3, 2, 2, 2, 1489, 1525, 3, 2, 2, 2, 1490, 1491, 7, 254, 2, 2, 1491, 1492, 5, 172, 87, 2, 1492, 1493, 5, 166, 84, 2, 1493, 1495, 5, 98, 50, 2, 1494, 1496, 5, 112, 57, 2, 1495, 1494, 3, 2, 2, 2, 1495, 1496, 3, 2, 2, 2, 1496, 1525, 3, 2, 2, 2, 1497, 1498, 7, 147, 2, 2, 1498, 1499, 7, 124, 2, 2, 1499, 1500, 5, 172, 87, 2, 1500, 1501, 5, 166, 84, 2, 1501, 1507, 7, 257, 2, 2, 1502, 1508, 5, 172, 87, 2, 1503, 1504, 7, 4, 2, 2, 1504, 1505, 5, 32, 17, 2, 1505, 1506, 7, 5, 2, 2, 1506, 1508, 3, 2, 2, 2, 1507, 1502, 3, 2, 2, 2, 1507, 1503, 3, 2, 2, 2, 1508, 1509, 3, 2, 2, 2, 1509, 1510, 5, 166, 84, 2, 1510, 1511, 7, 159, 2, 2, 1511, 1515, 5, 190, 96, 2, 1512, 1514, 5, 100, 51, 2, 1513, 1512, 3, 2, 2, 2, 1514, 1517, 3, 2, 2, 2, 1515, 1513, 3, 2, 2, 2, 1515, 1516, 3, 2, 2, 2, 1516, 1521, 3, 2, 2, 2, 1517, 1515, 3, 2, 2, 2, 1518, 1520, 5, 102, 52, 2, 1519, 1518, 3, 2, 2, 2, 1520, 1523, 3, 2, 2, 2, 1521, 1519, 3, 2, 2, 2, 1521, 1522, 3, 2, 2, 2, 1522, 1525, 3, 2, 2, 2, 1523, 1521, 3, 2, 2, 2, 1524, 1473, 3, 2, 2, 2, 1524, 1477, 3, 2, 2, 2, 1524, 1483, 3, 2, 2, 2, 1524, 1490, 3, 2, 2, 2, 1524, 1497, 3, 2, 2, 2, 1525, 77, 3, 2, 2, 2, 1526, 1527, 7, 164, 2, 2, 1527, 1528, 7, 32, 2, 2, 1528, 1533, 5, 86, 44, 2, 1529, 1530, 7, 6, 2, 2, 1530, 1532, 5, 86, 44, 2, 1531, 1529, 3, 2, 2, 2, 1532, 1535, 3, 2, 2, 2, 1533, 1531, 3, 2, 2, 2, 1533, 1534, 3, 2, 2, 2, 1534, 1537, 3, 2, 2, 2, 1535, 1533, 3, 2, 2, 2, 1536, 1526, 3, 2, 2, 2, 1536, 1537, 3, 2, 2, 2, 1537, 1548, 3, 2, 2, 2, 1538, 1539, 7, 40, 2, 2, 1539, 1540, 7, 32, 2, 2, 1540, 1545, 5, 188, 95, 2, 1541, 1542, 7, 6, 2, 2, 1542, 1544, 5, 188, 95, 2, 1543, 1541, 3, 2, 2, 2, 1544, 1547, 3, 2, 2, 2, 1545, 1543, 3, 2, 2, 2, 1545, 1546, 3, 2, 2, 2, 1546, 1549, 3, 2, 2, 2, 1547, 1545, 3, 2, 2, 2, 1548, 1538, 3, 2, 2, 2, 1548, 1549, 3, 2, 2, 2, 1549, 1560, 3, 2, 2, 2, 1550, 1551, 7, 77, 2, 2, 1551, 1552, 7, 32, 2, 2, 1552, 1557, 5, 188, 95, 2, 1553, 1554, 7, 6, 2, 2, 1554, 1556, 5, 188, 95, 2, 1555, 1553, 3, 2, 2, 2, 1556, 1559, 3, 2, 2, 2, 1557, 1555, 3, 2, 2, 2, 1557, 1558, 3, 2, 2, 2, 1558, 1561, 3, 2, 2, 2, 1559, 1557, 3, 2, 2, 2, 1560, 1550, 3, 2, 2, 2, 1560, 1561, 3, 2, 2, 2, 1561, 1572, 3, 2, 2, 2, 1562, 1563, 7, 220, 2, 2, 1563, 1564, 7, 32, 2, 2, 1564, 1569, 5, 86, 44, 2, 1565, 1566, 7, 6, 2, 2, 1566, 1568, 5, 86, 44, 2, 1567, 1565, 3, 2, 2, 2, 1568, 1571, 3, 2, 2, 2, 1569, 1567, 3, 2, 2, 2, 1569, 1570, 3, 2, 2, 2, 1570, 1573, 3, 2, 2, 2, 1571, 1569, 3, 2, 2, 2, 1572, 1562, 3, 2, 2, 2, 1572, 1573, 3, 2, 2, 2, 1573, 1575, 3, 2, 2, 2, 1574, 1576, 5, 240, 121, 2, 1575, 1574, 3, 2, 2, 2, 1575, 1576, 3, 2, 2, 2, 1576, 1582, 3, 2, 2, 2, 1577, 1580, 7, 135, 2, 2, 1578, 1581, 7, 16, 2, 2, 1579, 1581, 5, 188, 95, 2, 1580, 1578, 3, 2, 2, 2, 1580, 1579, 3, 2, 2, 2, 1581, 1583, 3, 2, 2, 2, 1582, 1577, 3, 2, 2, 2, 1582, 1583, 3, 2, 2, 2, 1583, 79, 3, 2, 2, 2, 1584, 1585, 5, 34, 18, 2, 1585, 1586, 5, 90, 46, 2, 1586, 81, 3, 2, 2, 2, 1587, 1588, 8, 42, 1, 2, 1588, 1589, 5, 84, 43, 2, 1589, 1613, 3, 2, 2, 2, 1590, 1591, 12, 5, 2, 2, 1591, 1592, 6, 42, 5, 2, 1592, 1594, 9, 15, 2, 2, 1593, 1595, 5, 134, 68, 2, 1594, 1593, 3, 2, 2, 2, 1594, 1595, 3, 2, 2, 2, 1595, 1596, 3, 2, 2, 2, 1596, 1612, 5, 82, 42, 6, 1597, 1598, 12, 4, 2, 2, 1598, 1599, 6, 42, 7, 2, 1599, 1601, 7, 122, 2, 2, 1600, 1602, 5, 134, 68, 2, 1601, 1600, 3, 2, 2, 2, 1601, 1602, 3, 2, 2, 2, 1602, 1603, 3, 2, 2, 2, 1603, 1612, 5, 82, 42, 5, 1604, 1605, 12, 3, 2, 2, 1605, 1606, 6, 42, 9, 2, 1606, 1608, 9, 16, 2, 2, 1607, 1609, 5, 134, 68, 2, 1608, 1607, 3, 2, 2, 2, 1608, 1609, 3, 2, 2, 2, 1609, 1610, 3, 2, 2, 2, 1610, 1612, 5, 82, 42, 4, 1611, 1590, 3, 2, 2, 2, 1611, 1597, 3, 2, 2, 2, 1611, 1604, 3, 2, 2, 2, 1612, 1615, 3, 2, 2, 2, 1613, 1611, 3, 2, 2, 2, 1613, 1614, 3, 2, 2, 2, 1614, 83, 3, 2, 2, 2, 1615, 1613, 3, 2, 2, 2, 1616, 1626, 5, 92, 47, 2, 1617, 1626, 5, 88, 45, 2, 1618, 1619, 7, 229, 2, 2, 1619, 1626, 5, 172, 87, 2, 1620, 1626, 5, 162, 82, 2, 1621, 1622, 7, 4, 2, 2, 1622, 1623, 5, 32, 17, 2, 1623, 1624, 7, 5, 2, 2, 1624, 1626, 3, 2, 2, 2, 1625, 1616, 3, 2, 2, 2, 1625, 1617, 3, 2, 2, 2, 1625, 1618, 3, 2, 2, 2, 1625, 1620, 3, 2, 2, 2, 1625, 1621, 3, 2, 2, 2, 1626, 85, 3, 2, 2, 2, 1627, 1629, 5, 188, 95, 2, 1628, 1630, 9, 17, 2, 2, 1629, 1628, 3, 2, 2, 2, 1629, 1630, 3, 2, 2, 2, 1630, 1633, 3, 2, 2, 2, 1631, 1632, 7, 157, 2, 2, 1632, 1634, 9, 18, 2, 2, 1633, 1631, 3, 2, 2, 2, 1633, 1634, 3, 2, 2, 2, 1634, 87, 3, 2, 2, 2, 1635, 1637, 5, 120, 61, 2, 1636, 1638, 5, 90, 46, 2, 1637, 1636, 3, 2, 2, 2, 1638, 1639, 3, 2, 2, 2, 1639, 1637, 3, 2, 2, 2, 1639, 1640, 3, 2, 2, 2, 1640, 89, 3, 2, 2, 2, 1641, 1643, 5, 94, 48, 2, 1642, 1644, 5, 112, 57, 2, 1643, 1642, 3, 2, 2, 2, 1643, 1644, 3, 2, 2, 2, 1644, 1645, 3, 2, 2, 2, 1645, 1646, 5, 78, 40, 2, 1646, 1669, 3, 2, 2, 2, 1647, 1651, 5, 96, 49, 2, 1648, 1650, 5, 132, 67, 2, 1649, 1648, 3, 2, 2, 2, 1650, 1653, 3, 2, 2, 2, 1651, 1649, 3, 2, 2, 2, 1651, 1652, 3, 2, 2, 2, 1652, 1655, 3, 2, 2, 2, 1653, 1651, 3, 2, 2, 2, 1654, 1656, 5, 112, 57, 2, 1655, 1654, 3, 2, 2, 2, 1655, 1656, 3, 2, 2, 2, 1656, 1658, 3, 2, 2, 2, 1657, 1659, 5, 122, 62, 2, 1658, 1657, 3, 2, 2, 2, 1658, 1659, 3, 2, 2, 2, 1659, 1661, 3, 2, 2, 2, 1660, 1662, 5, 114, 58, 2, 1661, 1660, 3, 2, 2, 2, 1661, 1662, 3, 2, 2, 2, 1662, 1664, 3, 2, 2, 2, 1663, 1665, 5, 240, 121, 2, 1664, 1663, 3, 2, 2, 2, 1664, 1665, 3, 2, 2, 2, 1665, 1666, 3, 2, 2, 2, 1666, 1667, 5, 78, 40, 2, 1667, 1669, 3, 2, 2, 2, 1668, 1641, 3, 2, 2, 2, 1668, 1647, 3, 2, 2, 2, 1669, 91, 3, 2, 2, 2, 1670, 1672, 5, 94, 48, 2, 1671, 1673, 5, 120, 61, 2, 1672, 1671, 3, 2, 2, 2, 1672, 1673, 3, 2, 2, 2, 1673, 1675, 3, 2, 2, 2, 1674, 1676, 5, 112, 57, 2, 1675, 1674, 3, 2, 2, 2, 1675, 1676, 3, 2, 2, 2, 1676, 1700, 3, 2, 2, 2, 1677, 1679, 5, 96, 49, 2, 1678, 1680, 5, 120, 61, 2, 1679, 1678, 3, 2, 2, 2, 1679, 1680, 3, 2, 2, 2, 1680, 1684, 3, 2, 2, 2, 1681, 1683, 5, 132, 67, 2, 1682, 1681, 3, 2, 2, 2, 1683, 1686, 3, 2, 2, 2, 1684, 1682, 3, 2, 2, 2, 1684, 1685, 3, 2, 2, 2, 1685, 1688, 3, 2, 2, 2, 1686, 1684, 3, 2, 2, 2, 1687, 1689, 5, 112, 57, 2, 1688, 1687, 3, 2, 2, 2, 1688, 1689, 3, 2, 2, 2, 1689, 1691, 3, 2, 2, 2, 1690, 1692, 5, 122, 62, 2, 1691, 1690, 3, 2, 2, 2, 1691, 1692, 3, 2, 2, 2, 1692, 1694, 3, 2, 2, 2, 1693, 1695, 5, 114, 58, 2, 1694, 1693, 3, 2, 2, 2, 1694, 1695, 3, 2, 2, 2, 1695, 1697, 3, 2, 2, 2, 1696, 1698, 5, 240, 121, 2, 1697, 1696, 3, 2, 2, 2, 1697, 1698, 3, 2, 2, 2, 1698, 1700, 3, 2, 2, 2, 1699, 1670, 3, 2, 2, 2, 1699, 1677, 3, 2, 2, 2, 1700, 93, 3, 2, 2, 2, 1701, 1702, 7, 208, 2, 2, 1702, 1703, 7, 241, 2, 2, 1703, 1704, 7, 4, 2, 2, 1704, 1705, 5, 180, 91, 2, 1705, 1706, 7, 5, 2, 2, 1706, 1712, 3, 2, 2, 2, 1707, 1708, 7, 145, 2, 2, 1708, 1712, 5, 180, 91, 2, 1709, 1710, 7, 189, 2, 2, 1710, 1712, 5, 180, 91, 2, 1711, 1701, 3, 2, 2, 2, 1711, 1707, 3, 2, 2, 2, 1711, 1709, 3, 2, 2, 2, 1712, 1714, 3, 2, 2, 2, 1713, 1715, 5, 168, 85, 2, 1714, 1713, 3, 2, 2, 2, 1714, 1715, 3, 2, 2, 2, 1715, 1718, 3, 2, 2, 2, 1716, 1717, 7, 187, 2, 2, 1717, 1719, 7, 285, 2, 2, 1718, 1716, 3, 2, 2, 2, 1718, 1719, 3, 2, 2, 2, 1719, 1720, 3, 2, 2, 2, 1720, 1721, 7, 257, 2, 2, 1721, 1734, 7, 285, 2, 2, 1722, 1732, 7, 24, 2, 2, 1723, 1733, 5, 150, 76, 2, 1724, 1733, 5, 230, 116, 2, 1725, 1728, 7, 4, 2, 2, 1726, 1729, 5, 150, 76, 2, 1727, 1729, 5, 230, 116, 2, 1728, 1726, 3, 2, 2, 2, 1728, 1727, 3, 2, 2, 2, 1729, 1730, 3, 2, 2, 2, 1730, 1731, 7, 5, 2, 2, 1731, 1733, 3, 2, 2, 2, 1732, 1723, 3, 2, 2, 2, 1732, 1724, 3, 2, 2, 2, 1732, 1725, 3, 2, 2, 2, 1733, 1735, 3, 2, 2, 2, 1734, 1722, 3, 2, 2, 2, 1734, 1735, 3, 2, 2, 2, 1735, 1737, 3, 2, 2, 2, 1736, 1738, 5, 168, 85, 2, 1737, 1736, 3, 2, 2, 2, 1737, 1738, 3, 2, 2, 2, 1738, 1741, 3, 2, 2, 2, 1739, 1740, 7, 186, 2, 2, 1740, 1742, 7, 285, 2, 2, 1741, 1739, 3, 2, 2, 2, 1741, 1742, 3, 2, 2, 2, 1742, 95, 3, 2, 2, 2, 1743, 1747, 7, 208, 2, 2, 1744, 1746, 5, 116, 59, 2, 1745, 1744, 3, 2, 2, 2, 1746, 1749, 3, 2, 2, 2, 1747, 1745, 3, 2, 2, 2, 1747, 1748, 3, 2, 2, 2, 1748, 1751, 3, 2, 2, 2, 1749, 1747, 3, 2, 2, 2, 1750, 1752, 5, 134, 68, 2, 1751, 1750, 3, 2, 2, 2, 1751, 1752, 3, 2, 2, 2, 1752, 1753, 3, 2, 2, 2, 1753, 1754, 5, 180, 91, 2, 1754, 97, 3, 2, 2, 2, 1755, 1756, 7, 214, 2, 2, 1756, 1757, 5, 108, 55, 2, 1757, 99, 3, 2, 2, 2, 1758, 1759, 7, 261, 2, 2, 1759, 1762, 7, 146, 2, 2, 1760, 1761, 7, 19, 2, 2, 1761, 1763, 5, 190, 96, 2, 1762, 1760, 3, 2, 2, 2, 1762, 1763, 3, 2, 2, 2, 1763, 1764, 3, 2, 2, 2, 1764, 1765, 7, 235, 2, 2, 1765, 1766, 5, 104, 53, 2, 1766, 101, 3, 2, 2, 2, 1767, 1768, 7, 261, 2, 2, 1768, 1769, 7, 155, 2, 2, 1769, 1772, 7, 146, 2, 2, 1770, 1771, 7, 19, 2, 2, 1771, 1773, 5, 190, 96, 2, 1772, 1770, 3, 2, 2, 2, 1772, 1773, 3, 2, 2, 2, 1773, 1774, 3, 2, 2, 2, 1774, 1775, 7, 235, 2, 2, 1775, 1776, 5, 106, 54, 2, 1776, 103, 3, 2, 2, 2, 1777, 1785, 7, 69, 2, 2, 1778, 1779, 7, 254, 2, 2, 1779, 1780, 7, 214, 2, 2, 1780, 1785, 7, 276, 2, 2, 1781, 1782, 7, 254, 2, 2, 1782, 1783, 7, 214, 2, 2, 1783, 1785, 5, 108, 55, 2, 1784, 1777, 3, 2, 2, 2, 1784, 1778, 3, 2, 2, 2, 1784, 1781, 3, 2, 2, 2, 1785, 105, 3, 2, 2, 2, 1786, 1787, 7, 121, 2, 2, 1787, 1805, 7, 276, 2, 2, 1788, 1789, 7, 121, 2, 2, 1789, 1790, 7, 4, 2, 2, 1790, 1791, 5, 170, 86, 2, 1791, 1792, 7, 5, 2, 2, 1792, 1793, 7, 258, 2, 2, 1793, 1794, 7, 4, 2, 2, 1794, 1799, 5, 188, 95, 2, 1795, 1796, 7, 6, 2, 2, 1796, 1798, 5, 188, 95, 2, 1797, 1795, 3, 2, 2, 2, 1798, 1801, 3, 2, 2, 2, 1799, 1797, 3, 2, 2, 2, 1799, 1800, 3, 2, 2, 2, 1800, 1802, 3, 2, 2, 2, 1801, 1799, 3, 2, 2, 2, 1802, 1803, 7, 5, 2, 2, 1803, 1805, 3, 2, 2, 2, 1804, 1786, 3, 2, 2, 2, 1804, 1788, 3, 2, 2, 2, 1805, 107, 3, 2, 2, 2, 1806, 1811, 5, 110, 56, 2, 1807, 1808, 7, 6, 2, 2, 1808, 1810, 5, 110, 56, 2, 1809, 1807, 3, 2, 2, 2, 1810, 1813, 3, 2, 2, 2, 1811, 1809, 3, 2, 2, 2, 1811, 1812, 3, 2, 2, 2, 1812, 109, 3, 2, 2, 2, 1813, 1811, 3, 2, 2, 2, 1814, 1815, 5, 172, 87, 2, 1815, 1816, 7, 266, 2, 2, 1816, 1817, 5, 188, 95, 2, 1817, 111, 3, 2, 2, 2, 1818, 1819, 7, 262, 2, 2, 1819, 1820, 5, 190, 96, 2, 1820, 113, 3, 2, 2, 2, 1821, 1822, 7, 110, 2, 2, 1822, 1823, 5, 190, 96, 2, 1823, 115, 3, 2, 2, 2, 1824, 1825, 7, 8, 2, 2, 1825, 1832, 5, 118, 60, 2, 1826, 1828, 7, 6, 2, 2, 1827, 1826, 3, 2, 2, 2, 1827, 1828, 3, 2, 2, 2, 1828, 1829, 3, 2, 2, 2, 1829, 1831, 5, 118, 60, 2, 1830, 1827, 3, 2, 2, 2, 1831, 1834, 3, 2, 2, 2, 1832, 1830, 3, 2, 2, 2, 1832, 1833, 3, 2, 2, 2, 1833, 1835, 3, 2, 2, 2, 1834, 1832, 3, 2, 2, 2, 1835, 1836, 7, 9, 2, 2, 1836, 117, 3, 2, 2, 2, 1837, 1851, 5, 260, 131, 2, 1838, 1839, 5, 260, 131, 2, 1839, 1840, 7, 4, 2, 2, 1840, 1845, 5, 196, 99, 2, 1841, 1842, 7, 6, 2, 2, 1842, 1844, 5, 196, 99, 2, 1843, 1841, 3, 2, 2, 2, 1844, 1847, 3, 2, 2, 2, 1845, 1843, 3, 2, 2, 2, 1845, 1846, 3, 2, 2, 2, 1846, 1848, 3, 2, 2, 2, 1847, 1845, 3, 2, 2, 2, 1848, 1849, 7, 5, 2, 2, 1849, 1851, 3, 2, 2, 2, 1850, 1837, 3, 2, 2, 2, 1850, 1838, 3, 2, 2, 2, 1851, 119, 3, 2, 2, 2, 1852, 1853, 7, 102, 2, 2, 1853, 1858, 5, 136, 69, 2, 1854, 1855, 7, 6, 2, 2, 1855, 1857, 5, 136, 69, 2, 1856, 1854, 3, 2, 2, 2, 1857, 1860, 3, 2, 2, 2, 1858, 1856, 3, 2, 2, 2, 1858, 1859, 3, 2, 2, 2, 1859, 1864, 3, 2, 2, 2, 1860, 1858, 3, 2, 2, 2, 1861, 1863, 5, 132, 67, 2, 1862, 1861, 3, 2, 2, 2, 1863, 1866, 3, 2, 2, 2, 1864, 1862, 3, 2, 2, 2, 1864, 1865, 3, 2, 2, 2, 1865, 1868, 3, 2, 2, 2, 1866, 1864, 3, 2, 2, 2, 1867, 1869, 5, 126, 64, 2, 1868, 1867, 3, 2, 2, 2, 1868, 1869, 3, 2, 2, 2, 1869, 121, 3, 2, 2, 2, 1870, 1871, 7, 108, 2, 2, 1871, 1872, 7, 32, 2, 2, 1872, 1877, 5, 188, 95, 2, 1873, 1874, 7, 6, 2, 2, 1874, 1876, 5, 188, 95, 2, 1875, 1873, 3, 2, 2, 2, 1876, 1879, 3, 2, 2, 2, 1877, 1875, 3, 2, 2, 2, 1877, 1878, 3, 2, 2, 2, 1878, 1897, 3, 2, 2, 2, 1879, 1877, 3, 2, 2, 2, 1880, 1881, 7, 264, 2, 2, 1881, 1898, 7, 203, 2, 2, 1882, 1883, 7, 264, 2, 2, 1883, 1898, 7, 57, 2, 2, 1884, 1885, 7, 109, 2, 2, 1885, 1886, 7, 216, 2, 2, 1886, 1887, 7, 4, 2, 2, 1887, 1892, 5, 124, 63, 2, 1888, 1889, 7, 6, 2, 2, 1889, 1891, 5, 124, 63, 2, 1890, 1888, 3, 2, 2, 2, 1891, 1894, 3, 2, 2, 2, 1892, 1890, 3, 2, 2, 2, 1892, 1893, 3, 2, 2, 2, 1893, 1895, 3, 2, 2, 2, 1894, 1892, 3, 2, 2, 2, 1895, 1896, 7, 5, 2, 2, 1896, 1898, 3, 2, 2, 2, 1897, 1880, 3, 2, 2, 2, 1897, 1882, 3, 2, 2, 2, 1897, 1884, 3, 2, 2, 2, 1897, 1898, 3, 2, 2, 2, 1898, 1915, 3, 2, 2, 2, 1899, 1900, 7, 108, 2, 2, 1900, 1901, 7, 32, 2, 2, 1901, 1902, 7, 109, 2, 2, 1902, 1903, 7, 216, 2, 2, 1903, 1904, 7, 4, 2, 2, 1904, 1909, 5, 124, 63, 2, 1905, 1906, 7, 6, 2, 2, 1906, 1908, 5, 124, 63, 2, 1907, 1905, 3, 2, 2, 2, 1908, 1911, 3, 2, 2, 2, 1909, 1907, 3, 2, 2, 2, 1909, 1910, 3, 2, 2, 2, 1910, 1912, 3, 2, 2, 2, 1911, 1909, 3, 2, 2, 2, 1912, 1913, 7, 5, 2, 2, 1913, 1915, 3, 2, 2, 2, 1914, 1870, 3, 2, 2, 2, 1914, 1899, 3, 2, 2, 2, 1915, 123, 3, 2, 2, 2, 1916, 1925, 7, 4, 2, 2, 1917, 1922, 5, 188, 95, 2, 1918, 1919, 7, 6, 2, 2, 1919, 1921, 5, 188, 95, 2, 1920, 1918, 3, 2, 2, 2, 1921, 1924, 3, 2, 2, 2, 1922, 1920, 3, 2, 2, 2, 1922, 1923, 3, 2, 2, 2, 1923, 1926, 3, 2, 2, 2, 1924, 1922, 3, 2, 2, 2, 1925, 1917, 3, 2, 2, 2, 1925, 1926, 3, 2, 2, 2, 1926, 1927, 3, 2, 2, 2, 1927, 1930, 7, 5, 2, 2, 1928, 1930, 5, 188, 95, 2, 1929, 1916, 3, 2, 2, 2, 1929, 1928, 3, 2, 2, 2, 1930, 125, 3, 2, 2, 2, 1931, 1932, 7, 176, 2, 2, 1932, 1933, 7, 4, 2, 2, 1933, 1934, 5, 180, 91, 2, 1934, 1935, 7, 98, 2, 2, 1935, 1936, 5, 128, 65, 2, 1936, 1937, 7, 115, 2, 2, 1937, 1938, 7, 4, 2, 2, 1938, 1943, 5, 130, 66, 2, 1939, 1940, 7, 6, 2, 2, 1940, 1942, 5, 130, 66, 2, 1941, 1939, 3, 2, 2, 2, 1942, 1945, 3, 2, 2, 2, 1943, 1941, 3, 2, 2, 2, 1943, 1944, 3, 2, 2, 2, 1944, 1946, 3, 2, 2, 2, 1945, 1943, 3, 2, 2, 2, 1946, 1947, 7, 5, 2, 2, 1947, 1948, 7, 5, 2, 2, 1948, 127, 3, 2, 2, 2, 1949, 1962, 5, 260, 131, 2, 1950, 1951, 7, 4, 2, 2, 1951, 1956, 5, 260, 131, 2, 1952, 1953, 7, 6, 2, 2, 1953, 1955, 5, 260, 131, 2, 1954, 1952, 3, 2, 2, 2, 1955, 1958, 3, 2, 2, 2, 1956, 1954, 3, 2, 2, 2, 1956, 1957, 3, 2, 2, 2, 1957, 1959, 3, 2, 2, 2, 1958, 1956, 3, 2, 2, 2, 1959, 1960, 7, 5, 2, 2, 1960, 1962, 3, 2, 2, 2, 1961, 1949, 3, 2, 2, 2, 1961, 1950, 3, 2, 2, 2, 1962, 129, 3, 2, 2, 2, 1963, 1968, 5, 188, 95, 2, 1964, 1966, 7, 24, 2, 2, 1965, 1964, 3, 2, 2, 2, 1965, 1966, 3, 2, 2, 2, 1966, 1967, 3, 2, 2, 2, 1967, 1969, 5, 260, 131, 2, 1968, 1965, 3, 2, 2, 2, 1968, 1969, 3, 2, 2, 2, 1969, 131, 3, 2, 2, 2, 1970, 1971, 7, 130, 2, 2, 1971, 1973, 7, 259, 2, 2, 1972, 1974, 7, 166, 2, 2, 1973, 1972, 3, 2, 2, 2, 1973, 1974, 3, 2, 2, 2, 1974, 1975, 3, 2, 2, 2, 1975, 1976, 5, 254, 128, 2, 1976, 1985, 7, 4, 2, 2, 1977, 1982, 5, 188, 95, 2, 1978, 1979, 7, 6, 2, 2, 1979, 1981, 5, 188, 95, 2, 1980, 1978, 3, 2, 2, 2, 1981, 1984, 3, 2, 2, 2, 1982, 1980, 3, 2, 2, 2, 1982, 1983, 3, 2, 2, 2, 1983, 1986, 3, 2, 2, 2, 1984, 1982, 3, 2, 2, 2, 1985, 1977, 3, 2, 2, 2, 1985, 1986, 3, 2, 2, 2, 1986, 1987, 3, 2, 2, 2, 1987, 1988, 7, 5, 2, 2, 1988, 2000, 5, 260, 131, 2, 1989, 1991, 7, 24, 2, 2, 1990, 1989, 3, 2, 2, 2, 1990, 1991, 3, 2, 2, 2, 1991, 1992, 3, 2, 2, 2, 1992, 1997, 5, 260, 131, 2, 1993, 1994, 7, 6, 2, 2, 1994, 1996, 5, 260, 131, 2, 1995, 1993, 3, 2, 2, 2, 1996, 1999, 3, 2, 2, 2, 1997, 1995, 3, 2, 2, 2, 1997, 1998, 3, 2, 2, 2, 1998, 2001, 3, 2, 2, 2, 1999, 1997, 3, 2, 2, 2, 2000, 1990, 3, 2, 2, 2, 2000, 2001, 3, 2, 2, 2, 2001, 133, 3, 2, 2, 2, 2002, 2003, 9, 19, 2, 2, 2003, 135, 3, 2, 2, 2, 2004, 2008, 5, 160, 81, 2, 2005, 2007, 5, 138, 70, 2, 2006, 2005, 3, 2, 2, 2, 2007, 2010, 3, 2, 2, 2, 2008, 2006, 3, 2, 2, 2, 2008, 2009, 3, 2, 2, 2, 2009, 137, 3, 2, 2, 2, 2010, 2008, 3, 2, 2, 2, 2011, 2012, 5, 140, 71, 2, 2012, 2013, 7, 127, 2, 2, 2013, 2015, 5, 160, 81, 2, 2014, 2016, 5, 142, 72, 2, 2015, 2014, 3, 2, 2, 2, 2015, 2016, 3, 2, 2, 2, 2016, 2023, 3, 2, 2, 2, 2017, 2018, 7, 153, 2, 2, 2018, 2019, 5, 140, 71, 2, 2019, 2020, 7, 127, 2, 2, 2020, 2021, 5, 160, 81, 2, 2021, 2023, 3, 2, 2, 2, 2022, 2011, 3, 2, 2, 2, 2022, 2017, 3, 2, 2, 2, 2023, 139, 3, 2, 2, 2, 2024, 2026, 7, 118, 2, 2, 2025, 2024, 3, 2, 2, 2, 2025, 2026, 3, 2, 2, 2, 2026, 2049, 3, 2, 2, 2, 2027, 2049, 7, 56, 2, 2, 2028, 2030, 7, 133, 2, 2, 2029, 2031, 7, 166, 2, 2, 2030, 2029, 3, 2, 2, 2, 2030, 2031, 3, 2, 2, 2, 2031, 2049, 3, 2, 2, 2, 2032, 2034, 7, 133, 2, 2, 2033, 2032, 3, 2, 2, 2, 2033, 2034, 3, 2, 2, 2, 2034, 2035, 3, 2, 2, 2, 2035, 2049, 7, 209, 2, 2, 2036, 2038, 7, 198, 2, 2, 2037, 2039, 7, 166, 2, 2, 2038, 2037, 3, 2, 2, 2, 2038, 2039, 3, 2, 2, 2, 2039, 2049, 3, 2, 2, 2, 2040, 2042, 7, 103, 2, 2, 2041, 2043, 7, 166, 2, 2, 2042, 2041, 3, 2, 2, 2, 2042, 2043, 3, 2, 2, 2, 2043, 2049, 3, 2, 2, 2, 2044, 2046, 7, 133, 2, 2, 2045, 2044, 3, 2, 2, 2, 2045, 2046, 3, 2, 2, 2, 2046, 2047, 3, 2, 2, 2, 2047, 2049, 7, 20, 2, 2, 2048, 2025, 3, 2, 2, 2, 2048, 2027, 3, 2, 2, 2, 2048, 2028, 3, 2, 2, 2, 2048, 2033, 3, 2, 2, 2, 2048, 2036, 3, 2, 2, 2, 2048, 2040, 3, 2, 2, 2, 2048, 2045, 3, 2, 2, 2, 2049, 141, 3, 2, 2, 2, 2050, 2051, 7, 159, 2, 2, 2051, 2055, 5, 190, 96, 2, 2052, 2053, 7, 257, 2, 2, 2053, 2055, 5, 148, 75, 2, 2054, 2050, 3, 2, 2, 2, 2054, 2052, 3, 2, 2, 2, 2055, 143, 3, 2, 2, 2, 2056, 2057, 7, 231, 2, 2, 2057, 2059, 7, 4, 2, 2, 2058, 2060, 5, 146, 74, 2, 2059, 2058, 3, 2, 2, 2, 2059, 2060, 3, 2, 2, 2, 2060, 2061, 3, 2, 2, 2, 2061, 2062, 7, 5, 2, 2, 2062, 145, 3, 2, 2, 2, 2063, 2065, 7, 275, 2, 2, 2064, 2063, 3, 2, 2, 2, 2064, 2065, 3, 2, 2, 2, 2065, 2066, 3, 2, 2, 2, 2066, 2067, 9, 20, 2, 2, 2067, 2088, 7, 175, 2, 2, 2068, 2069, 5, 188, 95, 2, 2069, 2070, 7, 205, 2, 2, 2070, 2088, 3, 2, 2, 2, 2071, 2072, 7, 30, 2, 2, 2072, 2073, 7, 289, 2, 2, 2073, 2074, 7, 165, 2, 2, 2074, 2075, 7, 158, 2, 2, 2075, 2084, 7, 289, 2, 2, 2076, 2082, 7, 159, 2, 2, 2077, 2083, 5, 260, 131, 2, 2078, 2079, 5, 254, 128, 2, 2079, 2080, 7, 4, 2, 2, 2080, 2081, 7, 5, 2, 2, 2081, 2083, 3, 2, 2, 2, 2082, 2077, 3, 2, 2, 2, 2082, 2078, 3, 2, 2, 2, 2083, 2085, 3, 2, 2, 2, 2084, 2076, 3, 2, 2, 2, 2084, 2085, 3, 2, 2, 2, 2085, 2088, 3, 2, 2, 2, 2086, 2088, 5, 188, 95, 2, 2087, 2064, 3, 2, 2, 2, 2087, 2068, 3, 2, 2, 2, 2087, 2071, 3, 2, 2, 2, 2087, 2086, 3, 2, 2, 2, 2088, 147, 3, 2, 2, 2, 2089, 2090, 7, 4, 2, 2, 2090, 2091, 5, 150, 76, 2, 2091, 2092, 7, 5, 2, 2, 2092, 149, 3, 2, 2, 2, 2093, 2098, 5, 256, 129, 2, 2094, 2095, 7, 6, 2, 2, 2095, 2097, 5, 256, 129, 2, 2096, 2094, 3, 2, 2, 2, 2097, 2100, 3, 2, 2, 2, 2098, 2096, 3, 2, 2, 2, 2098, 2099, 3, 2, 2, 2, 2099, 151, 3, 2, 2, 2, 2100, 2098, 3, 2, 2, 2, 2101, 2102, 7, 4, 2, 2, 2102, 2107, 5, 154, 78, 2, 2103, 2104, 7, 6, 2, 2, 2104, 2106, 5, 154, 78, 2, 2105, 2103, 3, 2, 2, 2, 2106, 2109, 3, 2, 2, 2, 2107, 2105, 3, 2, 2, 2, 2107, 2108, 3, 2, 2, 2, 2108, 2110, 3, 2, 2, 2, 2109, 2107, 3, 2, 2, 2, 2110, 2111, 7, 5, 2, 2, 2111, 153, 3, 2, 2, 2, 2112, 2114, 5, 256, 129, 2, 2113, 2115, 9, 17, 2, 2, 2114, 2113, 3, 2, 2, 2, 2114, 2115, 3, 2, 2, 2, 2115, 155, 3, 2, 2, 2, 2116, 2117, 7, 4, 2, 2, 2117, 2122, 5, 158, 80, 2, 2118, 2119, 7, 6, 2, 2, 2119, 2121, 5, 158, 80, 2, 2120, 2118, 3, 2, 2, 2, 2121, 2124, 3, 2, 2, 2, 2122, 2120, 3, 2, 2, 2, 2122, 2123, 3, 2, 2, 2, 2123, 2125, 3, 2, 2, 2, 2124, 2122, 3, 2, 2, 2, 2125, 2126, 7, 5, 2, 2, 2126, 157, 3, 2, 2, 2, 2127, 2129, 5, 260, 131, 2, 2128, 2130, 5, 30, 16, 2, 2129, 2128, 3, 2, 2, 2, 2129, 2130, 3, 2, 2, 2, 2130, 159, 3, 2, 2, 2, 2131, 2133, 5, 172, 87, 2, 2132, 2134, 5, 144, 73, 2, 2133, 2132, 3, 2, 2, 2, 2133, 2134, 3, 2, 2, 2, 2134, 2135, 3, 2, 2, 2, 2135, 2136, 5, 166, 84, 2, 2136, 2156, 3, 2, 2, 2, 2137, 2138, 7, 4, 2, 2, 2138, 2139, 5, 32, 17, 2, 2139, 2141, 7, 5, 2, 2, 2140, 2142, 5, 144, 73, 2, 2141, 2140, 3, 2, 2, 2, 2141, 2142, 3, 2, 2, 2, 2142, 2143, 3, 2, 2, 2, 2143, 2144, 5, 166, 84, 2, 2144, 2156, 3, 2, 2, 2, 2145, 2146, 7, 4, 2, 2, 2146, 2147, 5, 136, 69, 2, 2147, 2149, 7, 5, 2, 2, 2148, 2150, 5, 144, 73, 2, 2149, 2148, 3, 2, 2, 2, 2149, 2150, 3, 2, 2, 2, 2150, 2151, 3, 2, 2, 2, 2151, 2152, 5, 166, 84, 2, 2152, 2156, 3, 2, 2, 2, 2153, 2156, 5, 162, 82, 2, 2154, 2156, 5, 164, 83, 2, 2155, 2131, 3, 2, 2, 2, 2155, 2137, 3, 2, 2, 2, 2155, 2145, 3, 2, 2, 2, 2155, 2153, 3, 2, 2, 2, 2155, 2154, 3, 2, 2, 2, 2156, 161, 3, 2, 2, 2, 2157, 2158, 7, 258, 2, 2, 2158, 2163, 5, 188, 95, 2, 2159, 2160, 7, 6, 2, 2, 2160, 2162, 5, 188, 95, 2, 2161, 2159, 3, 2, 2, 2, 2162, 2165, 3, 2, 2, 2, 2163, 2161, 3, 2, 2, 2, 2163, 2164, 3, 2, 2, 2, 2164, 2166, 3, 2, 2, 2, 2165, 2163, 3, 2, 2, 2, 2166, 2167, 5, 166, 84, 2, 2167, 163, 3, 2, 2, 2, 2168, 2169, 5, 256, 129, 2, 2169, 2178, 7, 4, 2, 2, 2170, 2175, 5, 188, 95, 2, 2171, 2172, 7, 6, 2, 2, 2172, 2174, 5, 188, 95, 2, 2173, 2171, 3, 2, 2, 2, 2174, 2177, 3, 2, 2, 2, 2175, 2173, 3, 2, 2, 2, 2175, 2176, 3, 2, 2, 2, 2176, 2179, 3, 2, 2, 2, 2177, 2175, 3, 2, 2, 2, 2178, 2170, 3, 2, 2, 2, 2178, 2179, 3, 2, 2, 2, 2179, 2180, 3, 2, 2, 2, 2180, 2181, 7, 5, 2, 2, 2181, 2182, 5, 166, 84, 2, 2182, 165, 3, 2, 2, 2, 2183, 2185, 7, 24, 2, 2, 2184, 2183, 3, 2, 2, 2, 2184, 2185, 3, 2, 2, 2, 2185, 2186, 3, 2, 2, 2, 2186, 2188, 5, 262, 132, 2, 2187, 2189, 5, 148, 75, 2, 2188, 2187, 3, 2, 2, 2, 2188, 2189, 3, 2, 2, 2, 2189, 2191, 3, 2, 2, 2, 2190, 2184, 3, 2, 2, 2, 2190, 2191, 3, 2, 2, 2, 2191, 167, 3, 2, 2, 2, 2192, 2193, 7, 204, 2, 2, 2193, 2194, 7, 100, 2, 2, 2194, 2195, 7, 211, 2, 2, 2195, 2199, 7, 285, 2, 2, 2196, 2197, 7, 264, 2, 2, 2197, 2198, 7, 212, 2, 2, 2198, 2200, 5, 56, 29, 2, 2199, 2196, 3, 2, 2, 2, 2199, 2200, 3, 2, 2, 2, 2200, 2242, 3, 2, 2, 2, 2201, 2202, 7, 204, 2, 2, 2202, 2203, 7, 100, 2, 2, 2203, 2213, 7, 70, 2, 2, 2204, 2205, 7, 93, 2, 2, 2205, 2206, 7, 234, 2, 2, 2206, 2207, 7, 32, 2, 2, 2207, 2211, 7, 285, 2, 2, 2208, 2209, 7, 82, 2, 2, 2209, 2210, 7, 32, 2, 2, 2210, 2212, 7, 285, 2, 2, 2211, 2208, 3, 2, 2, 2, 2211, 2212, 3, 2, 2, 2, 2212, 2214, 3, 2, 2, 2, 2213, 2204, 3, 2, 2, 2, 2213, 2214, 3, 2, 2, 2, 2214, 2220, 3, 2, 2, 2, 2215, 2216, 7, 44, 2, 2, 2216, 2217, 7, 126, 2, 2, 2217, 2218, 7, 234, 2, 2, 2218, 2219, 7, 32, 2, 2, 2219, 2221, 7, 285, 2, 2, 2220, 2215, 3, 2, 2, 2, 2220, 2221, 3, 2, 2, 2, 2221, 2227, 3, 2, 2, 2, 2222, 2223, 7, 145, 2, 2, 2223, 2224, 7, 128, 2, 2, 2224, 2225, 7, 234, 2, 2, 2225, 2226, 7, 32, 2, 2, 2226, 2228, 7, 285, 2, 2, 2227, 2222, 3, 2, 2, 2, 2227, 2228, 3, 2, 2, 2, 2228, 2233, 3, 2, 2, 2, 2229, 2230, 7, 136, 2, 2, 2230, 2231, 7, 234, 2, 2, 2231, 2232, 7, 32, 2, 2, 2232, 2234, 7, 285, 2, 2, 2233, 2229, 3, 2, 2, 2, 2233, 2234, 3, 2, 2, 2, 2234, 2239, 3, 2, 2, 2, 2235, 2236, 7, 156, 2, 2, 2236, 2237, 7, 68, 2, 2, 2237, 2238, 7, 24, 2, 2, 2238, 2240, 7, 285, 2, 2, 2239, 2235, 3, 2, 2, 2, 2239, 2240, 3, 2, 2, 2, 2240, 2242, 3, 2, 2, 2, 2241, 2192, 3, 2, 2, 2, 2241, 2201, 3, 2, 2, 2, 2242, 169, 3, 2, 2, 2, 2243, 2248, 5, 172, 87, 2, 2244, 2245, 7, 6, 2, 2, 2245, 2247, 5, 172, 87, 2, 2246, 2244, 3, 2, 2, 2, 2247, 2250, 3, 2, 2, 2, 2248, 2246, 3, 2, 2, 2, 2248, 2249, 3, 2, 2, 2, 2249, 171, 3, 2, 2, 2, 2250, 2248, 3, 2, 2, 2, 2251, 2256, 5, 256, 129, 2, 2252, 2253, 7, 7, 2, 2, 2253, 2255, 5, 256, 129, 2, 2254, 2252, 3, 2, 2, 2, 2255, 2258, 3, 2, 2, 2, 2256, 2254, 3, 2, 2, 2, 2256, 2257, 3, 2, 2, 2, 2257, 173, 3, 2, 2, 2, 2258, 2256, 3, 2, 2, 2, 2259, 2260, 5, 256, 129, 2, 2260, 2261, 7, 7, 2, 2, 2261, 2263, 3, 2, 2, 2, 2262, 2259, 3, 2, 2, 2, 2262, 2263, 3, 2, 2, 2, 2263, 2264, 3, 2, 2, 2, 2264, 2265, 5, 256, 129, 2, 2265, 175, 3, 2, 2, 2, 2266, 2267, 5, 256, 129, 2, 2267, 2268, 7, 7, 2, 2, 2268, 2270, 3, 2, 2, 2, 2269, 2266, 3, 2, 2, 2, 2269, 2270, 3, 2, 2, 2, 2270, 2271, 3, 2, 2, 2, 2271, 2272, 5, 256, 129, 2, 2272, 177, 3, 2, 2, 2, 2273, 2281, 5, 188, 95, 2, 2274, 2276, 7, 24, 2, 2, 2275, 2274, 3, 2, 2, 2, 2275, 2276, 3, 2, 2, 2, 2276, 2279, 3, 2, 2, 2, 2277, 2280, 5, 256, 129, 2, 2278, 2280, 5, 148, 75, 2, 2279, 2277, 3, 2, 2, 2, 2279, 2278, 3, 2, 2, 2, 2280, 2282, 3, 2, 2, 2, 2281, 2275, 3, 2, 2, 2, 2281, 2282, 3, 2, 2, 2, 2282, 179, 3, 2, 2, 2, 2283, 2288, 5, 178, 90, 2, 2284, 2285, 7, 6, 2, 2, 2285, 2287, 5, 178, 90, 2, 2286, 2284, 3, 2, 2, 2, 2287, 2290, 3, 2, 2, 2, 2288, 2286, 3, 2, 2, 2, 2288, 2289, 3, 2, 2, 2, 2289, 181, 3, 2, 2, 2, 2290, 2288, 3, 2, 2, 2, 2291, 2292, 7, 4, 2, 2, 2292, 2297, 5, 184, 93, 2, 2293, 2294, 7, 6, 2, 2, 2294, 2296, 5, 184, 93, 2, 2295, 2293, 3, 2, 2, 2, 2296, 2299, 3, 2, 2, 2, 2297, 2295, 3, 2, 2, 2, 2297, 2298, 3, 2, 2, 2, 2298, 2300, 3, 2, 2, 2, 2299, 2297, 3, 2, 2, 2, 2300, 2301, 7, 5, 2, 2, 2301, 183, 3, 2, 2, 2, 2302, 2316, 5, 254, 128, 2, 2303, 2304, 5, 260, 131, 2, 2304, 2305, 7, 4, 2, 2, 2305, 2310, 5, 186, 94, 2, 2306, 2307, 7, 6, 2, 2, 2307, 2309, 5, 186, 94, 2, 2308, 2306, 3, 2, 2, 2, 2309, 2312, 3, 2, 2, 2, 2310, 2308, 3, 2, 2, 2, 2310, 2311, 3, 2, 2, 2, 2311, 2313, 3, 2, 2, 2, 2312, 2310, 3, 2, 2, 2, 2313, 2314, 7, 5, 2, 2, 2314, 2316, 3, 2, 2, 2, 2315, 2302, 3, 2, 2, 2, 2315, 2303, 3, 2, 2, 2, 2316, 185, 3, 2, 2, 2, 2317, 2320, 5, 254, 128, 2, 2318, 2320, 5, 198, 100, 2, 2319, 2317, 3, 2, 2, 2, 2319, 2318, 3, 2, 2, 2, 2320, 187, 3, 2, 2, 2, 2321, 2322, 5, 190, 96, 2, 2322, 189, 3, 2, 2, 2, 2323, 2324, 8, 96, 1, 2, 2324, 2325, 7, 155, 2, 2, 2325, 2336, 5, 190, 96, 7, 2326, 2327, 7, 85, 2, 2, 2327, 2328, 7, 4, 2, 2, 2328, 2329, 5, 32, 17, 2, 2329, 2330, 7, 5, 2, 2, 2330, 2336, 3, 2, 2, 2, 2331, 2333, 5, 194, 98, 2, 2332, 2334, 5, 192, 97, 2, 2333, 2332, 3, 2, 2, 2, 2333, 2334, 3, 2, 2, 2, 2334, 2336, 3, 2, 2, 2, 2335, 2323, 3, 2, 2, 2, 2335, 2326, 3, 2, 2, 2, 2335, 2331, 3, 2, 2, 2, 2336, 2345, 3, 2, 2, 2, 2337, 2338, 12, 4, 2, 2, 2338, 2339, 7, 19, 2, 2, 2339, 2344, 5, 190, 96, 5, 2340, 2341, 12, 3, 2, 2, 2341, 2342, 7, 163, 2, 2, 2342, 2344, 5, 190, 96, 4, 2343, 2337, 3, 2, 2, 2, 2343, 2340, 3, 2, 2, 2, 2344, 2347, 3, 2, 2, 2, 2345, 2343, 3, 2, 2, 2, 2345, 2346, 3, 2, 2, 2, 2346, 191, 3, 2, 2, 2, 2347, 2345, 3, 2, 2, 2, 2348, 2350, 7, 155, 2, 2, 2349, 2348, 3, 2, 2, 2, 2349, 2350, 3, 2, 2, 2, 2350, 2351, 3, 2, 2, 2, 2351, 2352, 7, 28, 2, 2, 2352, 2353, 5, 194, 98, 2, 2353, 2354, 7, 19, 2, 2, 2354, 2355, 5, 194, 98, 2, 2355, 2431, 3, 2, 2, 2, 2356, 2358, 7, 155, 2, 2, 2357, 2356, 3, 2, 2, 2, 2357, 2358, 3, 2, 2, 2, 2358, 2359, 3, 2, 2, 2, 2359, 2360, 7, 115, 2, 2, 2360, 2361, 7, 4, 2, 2, 2361, 2366, 5, 188, 95, 2, 2362, 2363, 7, 6, 2, 2, 2363, 2365, 5, 188, 95, 2, 2364, 2362, 3, 2, 2, 2, 2365, 2368, 3, 2, 2, 2, 2366, 2364, 3, 2, 2, 2, 2366, 2367, 3, 2, 2, 2, 2367, 2369, 3, 2, 2, 2, 2368, 2366, 3, 2, 2, 2, 2369, 2370, 7, 5, 2, 2, 2370, 2431, 3, 2, 2, 2, 2371, 2373, 7, 155, 2, 2, 2372, 2371, 3, 2, 2, 2, 2372, 2373, 3, 2, 2, 2, 2373, 2374, 3, 2, 2, 2, 2374, 2375, 7, 115, 2, 2, 2375, 2376, 7, 4, 2, 2, 2376, 2377, 5, 32, 17, 2, 2377, 2378, 7, 5, 2, 2, 2378, 2431, 3, 2, 2, 2, 2379, 2381, 7, 155, 2, 2, 2380, 2379, 3, 2, 2, 2, 2380, 2381, 3, 2, 2, 2, 2381, 2382, 3, 2, 2, 2, 2382, 2383, 7, 199, 2, 2, 2383, 2431, 5, 194, 98, 2, 2384, 2386, 7, 155, 2, 2, 2385, 2384, 3, 2, 2, 2, 2385, 2386, 3, 2, 2, 2, 2386, 2387, 3, 2, 2, 2, 2387, 2388, 7, 134, 2, 2, 2388, 2402, 9, 21, 2, 2, 2389, 2390, 7, 4, 2, 2, 2390, 2403, 7, 5, 2, 2, 2391, 2392, 7, 4, 2, 2, 2392, 2397, 5, 188, 95, 2, 2393, 2394, 7, 6, 2, 2, 2394, 2396, 5, 188, 95, 2, 2395, 2393, 3, 2, 2, 2, 2396, 2399, 3, 2, 2, 2, 2397, 2395, 3, 2, 2, 2, 2397, 2398, 3, 2, 2, 2, 2398, 2400, 3, 2, 2, 2, 2399, 2397, 3, 2, 2, 2, 2400, 2401, 7, 5, 2, 2, 2401, 2403, 3, 2, 2, 2, 2402, 2389, 3, 2, 2, 2, 2402, 2391, 3, 2, 2, 2, 2403, 2431, 3, 2, 2, 2, 2404, 2406, 7, 155, 2, 2, 2405, 2404, 3, 2, 2, 2, 2405, 2406, 3, 2, 2, 2, 2406, 2407, 3, 2, 2, 2, 2407, 2408, 7, 134, 2, 2, 2408, 2411, 5, 194, 98, 2, 2409, 2410, 7, 81, 2, 2, 2410, 2412, 7, 285, 2, 2, 2411, 2409, 3, 2, 2, 2, 2411, 2412, 3, 2, 2, 2, 2412, 2431, 3, 2, 2, 2, 2413, 2415, 7, 125, 2, 2, 2414, 2416, 7, 155, 2, 2, 2415, 2414, 3, 2, 2, 2, 2415, 2416, 3, 2, 2, 2, 2416, 2417, 3, 2, 2, 2, 2417, 2431, 7, 156, 2, 2, 2418, 2420, 7, 125, 2, 2, 2419, 2421, 7, 155, 2, 2, 2420, 2419, 3, 2, 2, 2, 2420, 2421, 3, 2, 2, 2, 2421, 2422, 3, 2, 2, 2, 2422, 2431, 9, 22, 2, 2, 2423, 2425, 7, 125, 2, 2, 2424, 2426, 7, 155, 2, 2, 2425, 2424, 3, 2, 2, 2, 2425, 2426, 3, 2, 2, 2, 2426, 2427, 3, 2, 2, 2, 2427, 2428, 7, 76, 2, 2, 2428, 2429, 7, 102, 2, 2, 2429, 2431, 5, 194, 98, 2, 2430, 2349, 3, 2, 2, 2, 2430, 2357, 3, 2, 2, 2, 2430, 2372, 3, 2, 2, 2, 2430, 2380, 3, 2, 2, 2, 2430, 2385, 3, 2, 2, 2, 2430, 2405, 3, 2, 2, 2, 2430, 2413, 3, 2, 2, 2, 2430, 2418, 3, 2, 2, 2, 2430, 2423, 3, 2, 2, 2, 2431, 193, 3, 2, 2, 2, 2432, 2433, 8, 98, 1, 2, 2433, 2437, 5, 196, 99, 2, 2434, 2435, 9, 23, 2, 2, 2435, 2437, 5, 194, 98, 9, 2436, 2432, 3, 2, 2, 2, 2436, 2434, 3, 2, 2, 2, 2437, 2459, 3, 2, 2, 2, 2438, 2439, 12, 8, 2, 2, 2439, 2440, 9, 24, 2, 2, 2440, 2458, 5, 194, 98, 9, 2441, 2442, 12, 7, 2, 2, 2442, 2443, 9, 25, 2, 2, 2443, 2458, 5, 194, 98, 8, 2444, 2445, 12, 6, 2, 2, 2445, 2446, 7, 281, 2, 2, 2446, 2458, 5, 194, 98, 7, 2447, 2448, 12, 5, 2, 2, 2448, 2449, 7, 284, 2, 2, 2449, 2458, 5, 194, 98, 6, 2450, 2451, 12, 4, 2, 2, 2451, 2452, 7, 282, 2, 2, 2452, 2458, 5, 194, 98, 5, 2453, 2454, 12, 3, 2, 2, 2454, 2455, 5, 200, 101, 2, 2455, 2456, 5, 194, 98, 4, 2456, 2458, 3, 2, 2, 2, 2457, 2438, 3, 2, 2, 2, 2457, 2441, 3, 2, 2, 2, 2457, 2444, 3, 2, 2, 2, 2457, 2447, 3, 2, 2, 2, 2457, 2450, 3, 2, 2, 2, 2457, 2453, 3, 2, 2, 2, 2458, 2461, 3, 2, 2, 2, 2459, 2457, 3, 2, 2, 2, 2459, 2460, 3, 2, 2, 2, 2460, 195, 3, 2, 2, 2, 2461, 2459, 3, 2, 2, 2, 2462, 2463, 8, 99, 1, 2, 2463, 2647, 9, 26, 2, 2, 2464, 2466, 7, 35, 2, 2, 2465, 2467, 5, 238, 120, 2, 2466, 2465, 3, 2, 2, 2, 2467, 2468, 3, 2, 2, 2, 2468, 2466, 3, 2, 2, 2, 2468, 2469, 3, 2, 2, 2, 2469, 2472, 3, 2, 2, 2, 2470, 2471, 7, 79, 2, 2, 2471, 2473, 5, 188, 95, 2, 2472, 2470, 3, 2, 2, 2, 2472, 2473, 3, 2, 2, 2, 2473, 2474, 3, 2, 2, 2, 2474, 2475, 7, 80, 2, 2, 2475, 2647, 3, 2, 2, 2, 2476, 2477, 7, 35, 2, 2, 2477, 2479, 5, 188, 95, 2, 2478, 2480, 5, 238, 120, 2, 2479, 2478, 3, 2, 2, 2, 2480, 2481, 3, 2, 2, 2, 2481, 2479, 3, 2, 2, 2, 2481, 2482, 3, 2, 2, 2, 2482, 2485, 3, 2, 2, 2, 2483, 2484, 7, 79, 2, 2, 2484, 2486, 5, 188, 95, 2, 2485, 2483, 3, 2, 2, 2, 2485, 2486, 3, 2, 2, 2, 2486, 2487, 3, 2, 2, 2, 2487, 2488, 7, 80, 2, 2, 2488, 2647, 3, 2, 2, 2, 2489, 2490, 7, 36, 2, 2, 2490, 2491, 7, 4, 2, 2, 2491, 2492, 5, 188, 95, 2, 2492, 2493, 7, 24, 2, 2, 2493, 2494, 5, 224, 113, 2, 2494, 2495, 7, 5, 2, 2, 2495, 2647, 3, 2, 2, 2, 2496, 2497, 7, 226, 2, 2, 2497, 2506, 7, 4, 2, 2, 2498, 2503, 5, 178, 90, 2, 2499, 2500, 7, 6, 2, 2, 2500, 2502, 5, 178, 90, 2, 2501, 2499, 3, 2, 2, 2, 2502, 2505, 3, 2, 2, 2, 2503, 2501, 3, 2, 2, 2, 2503, 2504, 3, 2, 2, 2, 2504, 2507, 3, 2, 2, 2, 2505, 2503, 3, 2, 2, 2, 2506, 2498, 3, 2, 2, 2, 2506, 2507, 3, 2, 2, 2, 2507, 2508, 3, 2, 2, 2, 2508, 2647, 7, 5, 2, 2, 2509, 2510, 7, 96, 2, 2, 2510, 2511, 7, 4, 2, 2, 2511, 2514, 5, 188, 95, 2, 2512, 2513, 7, 113, 2, 2, 2513, 2515, 7, 157, 2, 2, 2514, 2512, 3, 2, 2, 2, 2514, 2515, 3, 2, 2, 2, 2515, 2516, 3, 2, 2, 2, 2516, 2517, 7, 5, 2, 2, 2517, 2647, 3, 2, 2, 2, 2518, 2519, 7, 129, 2, 2, 2519, 2520, 7, 4, 2, 2, 2520, 2523, 5, 188, 95, 2, 2521, 2522, 7, 113, 2, 2, 2522, 2524, 7, 157, 2, 2, 2523, 2521, 3, 2, 2, 2, 2523, 2524, 3, 2, 2, 2, 2524, 2525, 3, 2, 2, 2, 2525, 2526, 7, 5, 2, 2, 2526, 2647, 3, 2, 2, 2, 2527, 2528, 7, 178, 2, 2, 2528, 2529, 7, 4, 2, 2, 2529, 2530, 5, 194, 98, 2, 2530, 2531, 7, 115, 2, 2, 2531, 2532, 5, 194, 98, 2, 2532, 2533, 7, 5, 2, 2, 2533, 2647, 3, 2, 2, 2, 2534, 2647, 5, 198, 100, 2, 2535, 2647, 7, 276, 2, 2, 2536, 2537, 5, 254, 128, 2, 2537, 2538, 7, 7, 2, 2, 2538, 2539, 7, 276, 2, 2, 2539, 2647, 3, 2, 2, 2, 2540, 2541, 7, 4, 2, 2, 2541, 2544, 5, 178, 90, 2, 2542, 2543, 7, 6, 2, 2, 2543, 2545, 5, 178, 90, 2, 2544, 2542, 3, 2, 2, 2, 2545, 2546, 3, 2, 2, 2, 2546, 2544, 3, 2, 2, 2, 2546, 2547, 3, 2, 2, 2, 2547, 2548, 3, 2, 2, 2, 2548, 2549, 7, 5, 2, 2, 2549, 2647, 3, 2, 2, 2, 2550, 2551, 7, 4, 2, 2, 2551, 2552, 5, 32, 17, 2, 2552, 2553, 7, 5, 2, 2, 2553, 2647, 3, 2, 2, 2, 2554, 2555, 5, 252, 127, 2, 2555, 2567, 7, 4, 2, 2, 2556, 2558, 5, 134, 68, 2, 2557, 2556, 3, 2, 2, 2, 2557, 2558, 3, 2, 2, 2, 2558, 2559, 3, 2, 2, 2, 2559, 2564, 5, 188, 95, 2, 2560, 2561, 7, 6, 2, 2, 2561, 2563, 5, 188, 95, 2, 2562, 2560, 3, 2, 2, 2, 2563, 2566, 3, 2, 2, 2, 2564, 2562, 3, 2, 2, 2, 2564, 2565, 3, 2, 2, 2, 2565, 2568, 3, 2, 2, 2, 2566, 2564, 3, 2, 2, 2, 2567, 2557, 3, 2, 2, 2, 2567, 2568, 3, 2, 2, 2, 2568, 2569, 3, 2, 2, 2, 2569, 2576, 7, 5, 2, 2, 2570, 2571, 7, 94, 2, 2, 2571, 2572, 7, 4, 2, 2, 2572, 2573, 7, 262, 2, 2, 2573, 2574, 5, 190, 96, 2, 2574, 2575, 7, 5, 2, 2, 2575, 2577, 3, 2, 2, 2, 2576, 2570, 3, 2, 2, 2, 2576, 2577, 3, 2, 2, 2, 2577, 2580, 3, 2, 2, 2, 2578, 2579, 7, 168, 2, 2, 2579, 2581, 5, 244, 123, 2, 2580, 2578, 3, 2, 2, 2, 2580, 2581, 3, 2, 2, 2, 2581, 2647, 3, 2, 2, 2, 2582, 2583, 5, 260, 131, 2, 2583, 2584, 7, 10, 2, 2, 2584, 2585, 5, 188, 95, 2, 2585, 2647, 3, 2, 2, 2, 2586, 2587, 7, 4, 2, 2, 2587, 2590, 5, 260, 131, 2, 2588, 2589, 7, 6, 2, 2, 2589, 2591, 5, 260, 131, 2, 2590, 2588, 3, 2, 2, 2, 2591, 2592, 3, 2, 2, 2, 2592, 2590, 3, 2, 2, 2, 2592, 2593, 3, 2, 2, 2, 2593, 2594, 3, 2, 2, 2, 2594, 2595, 7, 5, 2, 2, 2595, 2596, 7, 10, 2, 2, 2596, 2597, 5, 188, 95, 2, 2597, 2647, 3, 2, 2, 2, 2598, 2647, 5, 260, 131, 2, 2599, 2600, 7, 4, 2, 2, 2600, 2601, 5, 188, 95, 2, 2601, 2602, 7, 5, 2, 2, 2602, 2647, 3, 2, 2, 2, 2603, 2604, 7, 90, 2, 2, 2604, 2605, 7, 4, 2, 2, 2605, 2606, 5, 260, 131, 2, 2606, 2607, 7, 102, 2, 2, 2607, 2608, 5, 194, 98, 2, 2608, 2609, 7, 5, 2, 2, 2609, 2647, 3, 2, 2, 2, 2610, 2611, 9, 27, 2, 2, 2611, 2612, 7, 4, 2, 2, 2612, 2613, 5, 194, 98, 2, 2613, 2614, 9, 28, 2, 2, 2614, 2617, 5, 194, 98, 2, 2615, 2616, 9, 29, 2, 2, 2616, 2618, 5, 194, 98, 2, 2617, 2615, 3, 2, 2, 2, 2617, 2618, 3, 2, 2, 2, 2618, 2619, 3, 2, 2, 2, 2619, 2620, 7, 5, 2, 2, 2620, 2647, 3, 2, 2, 2, 2621, 2622, 7, 242, 2, 2, 2622, 2624, 7, 4, 2, 2, 2623, 2625, 9, 30, 2, 2, 2624, 2623, 3, 2, 2, 2, 2624, 2625, 3, 2, 2, 2, 2625, 2627, 3, 2, 2, 2, 2626, 2628, 5, 194, 98, 2, 2627, 2626, 3, 2, 2, 2, 2627, 2628, 3, 2, 2, 2, 2628, 2629, 3, 2, 2, 2, 2629, 2630, 7, 102, 2, 2, 2630, 2631, 5, 194, 98, 2, 2631, 2632, 7, 5, 2, 2, 2632, 2647, 3, 2, 2, 2, 2633, 2634, 7, 170, 2, 2, 2634, 2635, 7, 4, 2, 2, 2635, 2636, 5, 194, 98, 2, 2636, 2637, 7, 177, 2, 2, 2637, 2638, 5, 194, 98, 2, 2638, 2639, 7, 102, 2, 2, 2639, 2642, 5, 194, 98, 2, 2640, 2641, 7, 98, 2, 2, 2641, 2643, 5, 194, 98, 2, 2642, 2640, 3, 2, 2, 2, 2642, 2643, 3, 2, 2, 2, 2643, 2644, 3, 2, 2, 2, 2644, 2645, 7, 5, 2, 2, 2645, 2647, 3, 2, 2, 2, 2646, 2462, 3, 2, 2, 2, 2646, 2464, 3, 2, 2, 2, 2646, 2476, 3, 2, 2, 2, 2646, 2489, 3, 2, 2, 2, 2646, 2496, 3, 2, 2, 2, 2646, 2509, 3, 2, 2, 2, 2646, 2518, 3, 2, 2, 2, 2646, 2527, 3, 2, 2, 2, 2646, 2534, 3, 2, 2, 2, 2646, 2535, 3, 2, 2, 2, 2646, 2536, 3, 2, 2, 2, 2646, 2540, 3, 2, 2, 2, 2646, 2550, 3, 2, 2, 2, 2646, 2554, 3, 2, 2, 2, 2646, 2582, 3, 2, 2, 2, 2646, 2586, 3, 2, 2, 2, 2646, 2598, 3, 2, 2, 2, 2646, 2599, 3, 2, 2, 2, 2646, 2603, 3, 2, 2, 2, 2646, 2610, 3, 2, 2, 2, 2646, 2621, 3, 2, 2, 2, 2646, 2633, 3, 2, 2, 2, 2647, 2658, 3, 2, 2, 2, 2648, 2649, 12, 10, 2, 2, 2649, 2650, 7, 11, 2, 2, 2650, 2651, 5, 194, 98, 2, 2651, 2652, 7, 12, 2, 2, 2652, 2657, 3, 2, 2, 2, 2653, 2654, 12, 8, 2, 2, 2654, 2655, 7, 7, 2, 2, 2655, 2657, 5, 260, 131, 2, 2656, 2648, 3, 2, 2, 2, 2656, 2653, 3, 2, 2, 2, 2657, 2660, 3, 2, 2, 2, 2658, 2656, 3, 2, 2, 2, 2658, 2659, 3, 2, 2, 2, 2659, 197, 3, 2, 2, 2, 2660, 2658, 3, 2, 2, 2, 2661, 2674, 7, 156, 2, 2, 2662, 2674, 5, 208, 105, 2, 2663, 2664, 5, 260, 131, 2, 2664, 2665, 7, 285, 2, 2, 2665, 2674, 3, 2, 2, 2, 2666, 2674, 5, 266, 134, 2, 2667, 2674, 5, 206, 104, 2, 2668, 2670, 7, 285, 2, 2, 2669, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2669, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2674, 3, 2, 2, 2, 2673, 2661, 3, 2, 2, 2, 2673, 2662, 3, 2, 2, 2, 2673, 2663, 3, 2, 2, 2, 2673, 2666, 3, 2, 2, 2, 2673, 2667, 3, 2, 2, 2, 2673, 2669, 3, 2, 2, 2, 2674, 199, 3, 2, 2, 2, 2675, 2676, 9, 31, 2, 2, 2676, 201, 3, 2, 2, 2, 2677, 2678, 9, 32, 2, 2, 2678, 203, 3, 2, 2, 2, 2679, 2680, 9, 33, 2, 2, 2680, 205, 3, 2, 2, 2, 2681, 2682, 9, 34, 2, 2, 2682, 207, 3, 2, 2, 2, 2683, 2686, 7, 123, 2, 2, 2684, 2687, 5, 210, 106, 2, 2685, 2687, 5, 214, 108, 2, 2686, 2684, 3, 2, 2, 2, 2686, 2685, 3, 2, 2, 2, 2686, 2687, 3, 2, 2, 2, 2687, 209, 3, 2, 2, 2, 2688, 2690, 5, 212, 107, 2, 2689, 2691, 5, 216, 109, 2, 2690, 2689, 3, 2, 2, 2, 2690, 2691, 3, 2, 2, 2, 2691, 211, 3, 2, 2, 2, 2692, 2693, 5, 218, 110, 2, 2693, 2694, 5, 220, 111, 2, 2694, 2696, 3, 2, 2, 2, 2695, 2692, 3, 2, 2, 2, 2696, 2697, 3, 2, 2, 2, 2697, 2695, 3, 2, 2, 2, 2697, 2698, 3, 2, 2, 2, 2698, 213, 3, 2, 2, 2, 2699, 2702, 5, 216, 109, 2, 2700, 2703, 5, 212, 107, 2, 2701, 2703, 5, 216, 109, 2, 2702, 2700, 3, 2, 2, 2, 2702, 2701, 3, 2, 2, 2, 2702, 2703, 3, 2, 2, 2, 2703, 215, 3, 2, 2, 2, 2704, 2705, 5, 218, 110, 2, 2705, 2706, 5, 220, 111, 2, 2706, 2707, 7, 236, 2, 2, 2707, 2708, 5, 220, 111, 2, 2708, 217, 3, 2, 2, 2, 2709, 2711, 9, 35, 2, 2, 2710, 2709, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2712, 3, 2, 2, 2, 2712, 2715, 9, 20, 2, 2, 2713, 2715, 7, 285, 2, 2, 2714, 2710, 3, 2, 2, 2, 2714, 2713, 3, 2, 2, 2, 2715, 219, 3, 2, 2, 2, 2716, 2724, 7, 66, 2, 2, 2717, 2724, 7, 111, 2, 2, 2718, 2724, 7, 148, 2, 2, 2719, 2724, 7, 149, 2, 2, 2720, 2724, 7, 207, 2, 2, 2721, 2724, 7, 265, 2, 2, 2722, 2724, 5, 260, 131, 2, 2723, 2716, 3, 2, 2, 2, 2723, 2717, 3, 2, 2, 2, 2723, 2718, 3, 2, 2, 2, 2723, 2719, 3, 2, 2, 2, 2723, 2720, 3, 2, 2, 2, 2723, 2721, 3, 2, 2, 2, 2723, 2722, 3, 2, 2, 2, 2724, 221, 3, 2, 2, 2, 2725, 2729, 7, 96, 2, 2, 2726, 2727, 7, 15, 2, 2, 2727, 2729, 5, 256, 129, 2, 2728, 2725, 3, 2, 2, 2, 2728, 2726, 3, 2, 2, 2, 2729, 223, 3, 2, 2, 2, 2730, 2731, 7, 23, 2, 2, 2731, 2732, 7, 270, 2, 2, 2732, 2733, 5, 224, 113, 2, 2733, 2734, 7, 272, 2, 2, 2734, 2765, 3, 2, 2, 2, 2735, 2736, 7, 145, 2, 2, 2736, 2737, 7, 270, 2, 2, 2737, 2738, 5, 224, 113, 2, 2738, 2739, 7, 6, 2, 2, 2739, 2740, 5, 224, 113, 2, 2740, 2741, 7, 272, 2, 2, 2741, 2765, 3, 2, 2, 2, 2742, 2749, 7, 226, 2, 2, 2743, 2745, 7, 270, 2, 2, 2744, 2746, 5, 234, 118, 2, 2745, 2744, 3, 2, 2, 2, 2745, 2746, 3, 2, 2, 2, 2746, 2747, 3, 2, 2, 2, 2747, 2750, 7, 272, 2, 2, 2748, 2750, 7, 268, 2, 2, 2749, 2743, 3, 2, 2, 2, 2749, 2748, 3, 2, 2, 2, 2750, 2765, 3, 2, 2, 2, 2751, 2762, 5, 260, 131, 2, 2752, 2753, 7, 4, 2, 2, 2753, 2758, 7, 289, 2, 2, 2754, 2755, 7, 6, 2, 2, 2755, 2757, 7, 289, 2, 2, 2756, 2754, 3, 2, 2, 2, 2757, 2760, 3, 2, 2, 2, 2758, 2756, 3, 2, 2, 2, 2758, 2759, 3, 2, 2, 2, 2759, 2761, 3, 2, 2, 2, 2760, 2758, 3, 2, 2, 2, 2761, 2763, 7, 5, 2, 2, 2762, 2752, 3, 2, 2, 2, 2762, 2763, 3, 2, 2, 2, 2763, 2765, 3, 2, 2, 2, 2764, 2730, 3, 2, 2, 2, 2764, 2735, 3, 2, 2, 2, 2764, 2742, 3, 2, 2, 2, 2764, 2751, 3, 2, 2, 2, 2765, 225, 3, 2, 2, 2, 2766, 2771, 5, 228, 115, 2, 2767, 2768, 7, 6, 2, 2, 2768, 2770, 5, 228, 115, 2, 2769, 2767, 3, 2, 2, 2, 2770, 2773, 3, 2, 2, 2, 2771, 2769, 3, 2, 2, 2, 2771, 2772, 3, 2, 2, 2, 2772, 227, 3, 2, 2, 2, 2773, 2771, 3, 2, 2, 2, 2774, 2775, 5, 172, 87, 2, 2775, 2778, 5, 224, 113, 2, 2776, 2777, 7, 155, 2, 2, 2777, 2779, 7, 156, 2, 2, 2778, 2776, 3, 2, 2, 2, 2778, 2779, 3, 2, 2, 2, 2779, 2781, 3, 2, 2, 2, 2780, 2782, 5, 30, 16, 2, 2781, 2780, 3, 2, 2, 2, 2781, 2782, 3, 2, 2, 2, 2782, 2784, 3, 2, 2, 2, 2783, 2785, 5, 222, 112, 2, 2784, 2783, 3, 2, 2, 2, 2784, 2785, 3, 2, 2, 2, 2785, 229, 3, 2, 2, 2, 2786, 2791, 5, 232, 117, 2, 2787, 2788, 7, 6, 2, 2, 2788, 2790, 5, 232, 117, 2, 2789, 2787, 3, 2, 2, 2, 2790, 2793, 3, 2, 2, 2, 2791, 2789, 3, 2, 2, 2, 2791, 2792, 3, 2, 2, 2, 2792, 231, 3, 2, 2, 2, 2793, 2791, 3, 2, 2, 2, 2794, 2795, 5, 256, 129, 2, 2795, 2798, 5, 224, 113, 2, 2796, 2797, 7, 155, 2, 2, 2797, 2799, 7, 156, 2, 2, 2798, 2796, 3, 2, 2, 2, 2798, 2799, 3, 2, 2, 2, 2799, 2801, 3, 2, 2, 2, 2800, 2802, 5, 30, 16, 2, 2801, 2800, 3, 2, 2, 2, 2801, 2802, 3, 2, 2, 2, 2802, 233, 3, 2, 2, 2, 2803, 2808, 5, 236, 119, 2, 2804, 2805, 7, 6, 2, 2, 2805, 2807, 5, 236, 119, 2, 2806, 2804, 3, 2, 2, 2, 2807, 2810, 3, 2, 2, 2, 2808, 2806, 3, 2, 2, 2, 2808, 2809, 3, 2, 2, 2, 2809, 235, 3, 2, 2, 2, 2810, 2808, 3, 2, 2, 2, 2811, 2812, 5, 260, 131, 2, 2812, 2813, 7, 13, 2, 2, 2813, 2816, 5, 224, 113, 2, 2814, 2815, 7, 155, 2, 2, 2815, 2817, 7, 156, 2, 2, 2816, 2814, 3, 2, 2, 2, 2816, 2817, 3, 2, 2, 2, 2817, 2819, 3, 2, 2, 2, 2818, 2820, 5, 30, 16, 2, 2819, 2818, 3, 2, 2, 2, 2819, 2820, 3, 2, 2, 2, 2820, 237, 3, 2, 2, 2, 2821, 2822, 7, 261, 2, 2, 2822, 2823, 5, 188, 95, 2, 2823, 2824, 7, 235, 2, 2, 2824, 2825, 5, 188, 95, 2, 2825, 239, 3, 2, 2, 2, 2826, 2827, 7, 263, 2, 2, 2827, 2832, 5, 242, 122, 2, 2828, 2829, 7, 6, 2, 2, 2829, 2831, 5, 242, 122, 2, 2830, 2828, 3, 2, 2, 2, 2831, 2834, 3, 2, 2, 2, 2832, 2830, 3, 2, 2, 2, 2832, 2833, 3, 2, 2, 2, 2833, 241, 3, 2, 2, 2, 2834, 2832, 3, 2, 2, 2, 2835, 2836, 5, 256, 129, 2, 2836, 2837, 7, 24, 2, 2, 2837, 2838, 5, 244, 123, 2, 2838, 243, 3, 2, 2, 2, 2839, 2886, 5, 256, 129, 2, 2840, 2841, 7, 4, 2, 2, 2841, 2842, 5, 256, 129, 2, 2842, 2843, 7, 5, 2, 2, 2843, 2886, 3, 2, 2, 2, 2844, 2879, 7, 4, 2, 2, 2845, 2846, 7, 40, 2, 2, 2846, 2847, 7, 32, 2, 2, 2847, 2852, 5, 188, 95, 2, 2848, 2849, 7, 6, 2, 2, 2849, 2851, 5, 188, 95, 2, 2850, 2848, 3, 2, 2, 2, 2851, 2854, 3, 2, 2, 2, 2852, 2850, 3, 2, 2, 2, 2852, 2853, 3, 2, 2, 2, 2853, 2880, 3, 2, 2, 2, 2854, 2852, 3, 2, 2, 2, 2855, 2856, 9, 36, 2, 2, 2856, 2857, 7, 32, 2, 2, 2857, 2862, 5, 188, 95, 2, 2858, 2859, 7, 6, 2, 2, 2859, 2861, 5, 188, 95, 2, 2860, 2858, 3, 2, 2, 2, 2861, 2864, 3, 2, 2, 2, 2862, 2860, 3, 2, 2, 2, 2862, 2863, 3, 2, 2, 2, 2863, 2866, 3, 2, 2, 2, 2864, 2862, 3, 2, 2, 2, 2865, 2855, 3, 2, 2, 2, 2865, 2866, 3, 2, 2, 2, 2866, 2877, 3, 2, 2, 2, 2867, 2868, 9, 37, 2, 2, 2868, 2869, 7, 32, 2, 2, 2869, 2874, 5, 86, 44, 2, 2870, 2871, 7, 6, 2, 2, 2871, 2873, 5, 86, 44, 2, 2872, 2870, 3, 2, 2, 2, 2873, 2876, 3, 2, 2, 2, 2874, 2872, 3, 2, 2, 2, 2874, 2875, 3, 2, 2, 2, 2875, 2878, 3, 2, 2, 2, 2876, 2874, 3, 2, 2, 2, 2877, 2867, 3, 2, 2, 2, 2877, 2878, 3, 2, 2, 2, 2878, 2880, 3, 2, 2, 2, 2879, 2845, 3, 2, 2, 2, 2879, 2865, 3, 2, 2, 2, 2880, 2882, 3, 2, 2, 2, 2881, 2883, 5, 246, 124, 2, 2882, 2881, 3, 2, 2, 2, 2882, 2883, 3, 2, 2, 2, 2883, 2884, 3, 2, 2, 2, 2884, 2886, 7, 5, 2, 2, 2885, 2839, 3, 2, 2, 2, 2885, 2840, 3, 2, 2, 2, 2885, 2844, 3, 2, 2, 2, 2886, 245, 3, 2, 2, 2, 2887, 2888, 7, 185, 2, 2, 2888, 2904, 5, 248, 125, 2, 2889, 2890, 7, 205, 2, 2, 2890, 2904, 5, 248, 125, 2, 2891, 2892, 7, 185, 2, 2, 2892, 2893, 7, 28, 2, 2, 2893, 2894, 5, 248, 125, 2, 2894, 2895, 7, 19, 2, 2, 2895, 2896, 5, 248, 125, 2, 2896, 2904, 3, 2, 2, 2, 2897, 2898, 7, 205, 2, 2, 2898, 2899, 7, 28, 2, 2, 2899, 2900, 5, 248, 125, 2, 2900, 2901, 7, 19, 2, 2, 2901, 2902, 5, 248, 125, 2, 2902, 2904, 3, 2, 2, 2, 2903, 2887, 3, 2, 2, 2, 2903, 2889, 3, 2, 2, 2, 2903, 2891, 3, 2, 2, 2, 2903, 2897, 3, 2, 2, 2, 2904, 247, 3, 2, 2, 2, 2905, 2906, 7, 247, 2, 2, 2906, 2913, 9, 38, 2, 2, 2907, 2908, 7, 58, 2, 2, 2908, 2913, 7, 204, 2, 2, 2909, 2910, 5, 188, 95, 2, 2910, 2911, 9, 38, 2, 2, 2911, 2913, 3, 2, 2, 2, 2912, 2905, 3, 2, 2, 2, 2912, 2907, 3, 2, 2, 2, 2912, 2909, 3, 2, 2, 2, 2913, 249, 3, 2, 2, 2, 2914, 2919, 5, 254, 128, 2, 2915, 2916, 7, 6, 2, 2, 2916, 2918, 5, 254, 128, 2, 2917, 2915, 3, 2, 2, 2, 2918, 2921, 3, 2, 2, 2, 2919, 2917, 3, 2, 2, 2, 2919, 2920, 3, 2, 2, 2, 2920, 251, 3, 2, 2, 2, 2921, 2919, 3, 2, 2, 2, 2922, 2927, 5, 254, 128, 2, 2923, 2927, 7, 94, 2, 2, 2924, 2927, 7, 133, 2, 2, 2925, 2927, 7, 198, 2, 2, 2926, 2922, 3, 2, 2, 2, 2926, 2923, 3, 2, 2, 2, 2926, 2924, 3, 2, 2, 2, 2926, 2925, 3, 2, 2, 2, 2927, 253, 3, 2, 2, 2, 2928, 2933, 5, 260, 131, 2, 2929, 2930, 7, 7, 2, 2, 2930, 2932, 5, 260, 131, 2, 2931, 2929, 3, 2, 2, 2, 2932, 2935, 3, 2, 2, 2, 2933, 2931, 3, 2, 2, 2, 2933, 2934, 3, 2, 2, 2, 2934, 255, 3, 2, 2, 2, 2935, 2933, 3, 2, 2, 2, 2936, 2937, 5, 260, 131, 2, 2937, 2938, 5, 258, 130, 2, 2938, 257, 3, 2, 2, 2, 2939, 2940, 7, 275, 2, 2, 2940, 2942, 5, 260, 131, 2, 2941, 2939, 3, 2, 2, 2, 2942, 2943, 3, 2, 2, 2, 2943, 2941, 3, 2, 2, 2, 2943, 2944, 3, 2, 2, 2, 2944, 2947, 3, 2, 2, 2, 2945, 2947, 3, 2, 2, 2, 2946, 2941, 3, 2, 2, 2, 2946, 2945, 3, 2, 2, 2, 2947, 259, 3, 2, 2, 2, 2948, 2952, 5, 262, 132, 2, 2949, 2950, 6, 131, 20, 2, 2950, 2952, 5, 272, 137, 2, 2951, 2948, 3, 2, 2, 2, 2951, 2949, 3, 2, 2, 2, 2952, 261, 3, 2, 2, 2, 2953, 2960, 7, 294, 2, 2, 2954, 2960, 5, 264, 133, 2, 2955, 2956, 6, 132, 21, 2, 2956, 2960, 5, 270, 136, 2, 2957, 2958, 6, 132, 22, 2, 2958, 2960, 5, 274, 138, 2, 2959, 2953, 3, 2, 2, 2, 2959, 2954, 3, 2, 2, 2, 2959, 2955, 3, 2, 2, 2, 2959, 2957, 3, 2, 2, 2, 2960, 263, 3, 2, 2, 2, 2961, 2962, 7, 295, 2, 2, 2962, 265, 3, 2, 2, 2, 2963, 2965, 6, 134, 23, 2, 2964, 2966, 7, 275, 2, 2, 2965, 2964, 3, 2, 2, 2, 2965, 2966, 3, 2, 2, 2, 2966, 2967, 3, 2, 2, 2, 2967, 3003, 7, 290, 2, 2, 2968, 2970, 6, 134, 24, 2, 2969, 2971, 7, 275, 2, 2, 2970, 2969, 3, 2, 2, 2, 2970, 2971, 3, 2, 2, 2, 2971, 2972, 3, 2, 2, 2, 2972, 3003, 7, 291, 2, 2, 2973, 2975, 6, 134, 25, 2, 2974, 2976, 7, 275, 2, 2, 2975, 2974, 3, 2, 2, 2, 2975, 2976, 3, 2, 2, 2, 2976, 2977, 3, 2, 2, 2, 2977, 3003, 9, 39, 2, 2, 2978, 2980, 7, 275, 2, 2, 2979, 2978, 3, 2, 2, 2, 2979, 2980, 3, 2, 2, 2, 2980, 2981, 3, 2, 2, 2, 2981, 3003, 7, 289, 2, 2, 2982, 2984, 7, 275, 2, 2, 2983, 2982, 3, 2, 2, 2, 2983, 2984, 3, 2, 2, 2, 2984, 2985, 3, 2, 2, 2, 2985, 3003, 7, 286, 2, 2, 2986, 2988, 7, 275, 2, 2, 2987, 2986, 3, 2, 2, 2, 2987, 2988, 3, 2, 2, 2, 2988, 2989, 3, 2, 2, 2, 2989, 3003, 7, 287, 2, 2, 2990, 2992, 7, 275, 2, 2, 2991, 2990, 3, 2, 2, 2, 2991, 2992, 3, 2, 2, 2, 2992, 2993, 3, 2, 2, 2, 2993, 3003, 7, 288, 2, 2, 2994, 2996, 7, 275, 2, 2, 2995, 2994, 3, 2, 2, 2, 2995, 2996, 3, 2, 2, 2, 2996, 2997, 3, 2, 2, 2, 2997, 3003, 7, 292, 2, 2, 2998, 3000, 7, 275, 2, 2, 2999, 2998, 3, 2, 2, 2, 2999, 3000, 3, 2, 2, 2, 3000, 3001, 3, 2, 2, 2, 3001, 3003, 7, 293, 2, 2, 3002, 2963, 3, 2, 2, 2, 3002, 2968, 3, 2, 2, 2, 3002, 2973, 3, 2, 2, 2, 3002, 2979, 3, 2, 2, 2, 3002, 2983, 3, 2, 2, 2, 3002, 2987, 3, 2, 2, 2, 3002, 2991, 3, 2, 2, 2, 3002, 2995, 3, 2, 2, 2, 3002, 2999, 3, 2, 2, 2, 3003, 267, 3, 2, 2, 2, 3004, 3005, 7, 245, 2, 2, 3005, 3012, 5, 224, 113, 2, 3006, 3012, 5, 30, 16, 2, 3007, 3012, 5, 222, 112, 2, 3008, 3009, 9, 40, 2, 2, 3009, 3010, 7, 155, 2, 2, 3010, 3012, 7, 156, 2, 2, 3011, 3004, 3, 2, 2, 2, 3011, 3006, 3, 2, 2, 2, 3011, 3007, 3, 2, 2, 2, 3011, 3008, 3, 2, 2, 2, 3012, 269, 3, 2, 2, 2, 3013, 3014, 9, 41, 2, 2, 3014, 271, 3, 2, 2, 2, 3015, 3016, 9, 42, 2, 2, 3016, 273, 3, 2, 2, 2, 3017, 3018, 9, 43, 2, 2, 3018, 275, 3, 2, 2, 2, 396, 280, 305, 310, 318, 326, 328, 348, 352, 358, 361, 364, 372, 375, 379, 382, 390, 395, 398, 405, 417, 426, 428, 432, 435, 442, 453, 455, 463, 468, 471, 477, 488, 552, 561, 565, 571, 575, 580, 586, 598, 606, 612, 625, 630, 646, 653, 657, 663, 678, 682, 688, 694, 697, 700, 706, 710, 718, 720, 729, 732, 741, 746, 752, 759, 762, 768, 779, 782, 786, 791, 796, 803, 806, 809, 816, 821, 830, 838, 844, 847, 850, 856, 860, 864, 868, 870, 878, 886, 892, 898, 901, 905, 908, 912, 937, 940, 944, 950, 953, 956, 962, 970, 975, 981, 987, 999, 1002, 1009, 1016, 1024, 1027, 1035, 1039, 1046, 1162, 1170, 1178, 1187, 1197, 1201, 1204, 1210, 1216, 1228, 1240, 1245, 1254, 1262, 1269, 1271, 1276, 1280, 1285, 1290, 1295, 1298, 1303, 1307, 1312, 1314, 1318, 1327, 1335, 1344, 1351, 1360, 1365, 1368, 1387, 1389, 1398, 1405, 1408, 1415, 1419, 1425, 1433, 1444, 1455, 1462, 1468, 1481, 1488, 1495, 1507, 1515, 1521, 1524, 1533, 1536, 1545, 1548, 1557, 1560, 1569, 1572, 1575, 1580, 1582, 1594, 1601, 1608, 1611, 1613, 1625, 1629, 1633, 1639, 1643, 1651, 1655, 1658, 1661, 1664, 1668, 1672, 1675, 1679, 1684, 1688, 1691, 1694, 1697, 1699, 1711, 1714, 1718, 1728, 1732, 1734, 1737, 1741, 1747, 1751, 1762, 1772, 1784, 1799, 1804, 1811, 1827, 1832, 1845, 1850, 1858, 1864, 1868, 1877, 1892, 1897, 1909, 1914, 1922, 1925, 1929, 1943, 1956, 1961, 1965, 1968, 1973, 1982, 1985, 1990, 1997, 2000, 2008, 2015, 2022, 2025, 2030, 2033, 2038, 2042, 2045, 2048, 2054, 2059, 2064, 2082, 2084, 2087, 2098, 2107, 2114, 2122, 2129, 2133, 2141, 2149, 2155, 2163, 2175, 2178, 2184, 2188, 2190, 2199, 2211, 2213, 2220, 2227, 2233, 2239, 2241, 2248, 2256, 2262, 2269, 2275, 2279, 2281, 2288, 2297, 2310, 2315, 2319, 2333, 2335, 2343, 2345, 2349, 2357, 2366, 2372, 2380, 2385, 2397, 2402, 2405, 2411, 2415, 2420, 2425, 2430, 2436, 2457, 2459, 2468, 2472, 2481, 2485, 2503, 2506, 2514, 2523, 2546, 2557, 2564, 2567, 2576, 2580, 2592, 2617, 2624, 2627, 2642, 2646, 2656, 2658, 2671, 2673, 2686, 2690, 2697, 2702, 2710, 2714, 2723, 2728, 2745, 2749, 2758, 2762, 2764, 2771, 2778, 2781, 2784, 2791, 2798, 2801, 2808, 2816, 2819, 2832, 2852, 2862, 2865, 2874, 2877, 2879, 2882, 2885, 2903, 2912, 2919, 2926, 2933, 2943, 2946, 2951, 2959, 2965, 2970, 2975, 2979, 2983, 2987, 2991, 2995, 2999, 3002, 3011] \ No newline at end of file diff --git a/pysparkling/sql/ast/generated/SqlBase.tokens b/pysparkling/sql/ast/generated/SqlBase.tokens deleted file mode 100644 index 0d0385147..000000000 --- a/pysparkling/sql/ast/generated/SqlBase.tokens +++ /dev/null @@ -1,572 +0,0 @@ -T__0=1 -T__1=2 -T__2=3 -T__3=4 -T__4=5 -T__5=6 -T__6=7 -T__7=8 -T__8=9 -T__9=10 -T__10=11 -ADD=12 -AFTER=13 -ALL=14 -ALTER=15 -ANALYZE=16 -AND=17 -ANTI=18 -ANY=19 -ARCHIVE=20 -ARRAY=21 -AS=22 -ASC=23 -AT=24 -AUTHORIZATION=25 -BETWEEN=26 -BOTH=27 -BUCKET=28 -BUCKETS=29 -BY=30 -CACHE=31 -CASCADE=32 -CASE=33 -CAST=34 -CHANGE=35 -CHECK=36 -CLEAR=37 -CLUSTER=38 -CLUSTERED=39 -CODEGEN=40 -COLLATE=41 -COLLECTION=42 -COLUMN=43 -COLUMNS=44 -COMMENT=45 -COMMIT=46 -COMPACT=47 -COMPACTIONS=48 -COMPUTE=49 -CONCATENATE=50 -CONSTRAINT=51 -COST=52 -CREATE=53 -CROSS=54 -CUBE=55 -CURRENT=56 -CURRENT_DATE=57 -CURRENT_TIME=58 -CURRENT_TIMESTAMP=59 -CURRENT_USER=60 -DATA=61 -DATABASE=62 -DATABASES=63 -DAY=64 -DBPROPERTIES=65 -DEFINED=66 -DELETE=67 -DELIMITED=68 -DESC=69 -DESCRIBE=70 -DFS=71 -DIRECTORIES=72 -DIRECTORY=73 -DISTINCT=74 -DISTRIBUTE=75 -DROP=76 -ELSE=77 -END=78 -ESCAPE=79 -ESCAPED=80 -EXCEPT=81 -EXCHANGE=82 -EXISTS=83 -EXPLAIN=84 -EXPORT=85 -EXTENDED=86 -EXTERNAL=87 -EXTRACT=88 -FALSE=89 -FETCH=90 -FIELDS=91 -FILTER=92 -FILEFORMAT=93 -FIRST=94 -FOLLOWING=95 -FOR=96 -FOREIGN=97 -FORMAT=98 -FORMATTED=99 -FROM=100 -FULL=101 -FUNCTION=102 -FUNCTIONS=103 -GLOBAL=104 -GRANT=105 -GROUP=106 -GROUPING=107 -HAVING=108 -HOUR=109 -IF=110 -IGNORE=111 -IMPORT=112 -IN=113 -INDEX=114 -INDEXES=115 -INNER=116 -INPATH=117 -INPUTFORMAT=118 -INSERT=119 -INTERSECT=120 -INTERVAL=121 -INTO=122 -IS=123 -ITEMS=124 -JOIN=125 -KEYS=126 -LAST=127 -LATERAL=128 -LAZY=129 -LEADING=130 -LEFT=131 -LIKE=132 -LIMIT=133 -LINES=134 -LIST=135 -LOAD=136 -LOCAL=137 -LOCATION=138 -LOCK=139 -LOCKS=140 -LOGICAL=141 -MACRO=142 -MAP=143 -MATCHED=144 -MERGE=145 -MINUTE=146 -MONTH=147 -MSCK=148 -NAMESPACE=149 -NAMESPACES=150 -NATURAL=151 -NO=152 -NOT=153 -NULL=154 -NULLS=155 -OF=156 -ON=157 -ONLY=158 -OPTION=159 -OPTIONS=160 -OR=161 -ORDER=162 -OUT=163 -OUTER=164 -OUTPUTFORMAT=165 -OVER=166 -OVERLAPS=167 -OVERLAY=168 -OVERWRITE=169 -PARTITION=170 -PARTITIONED=171 -PARTITIONS=172 -PERCENTLIT=173 -PIVOT=174 -PLACING=175 -POSITION=176 -PRECEDING=177 -PRIMARY=178 -PRINCIPALS=179 -PROPERTIES=180 -PURGE=181 -QUERY=182 -RANGE=183 -RECORDREADER=184 -RECORDWRITER=185 -RECOVER=186 -REDUCE=187 -REFERENCES=188 -REFRESH=189 -RENAME=190 -REPAIR=191 -REPLACE=192 -RESET=193 -RESTRICT=194 -REVOKE=195 -RIGHT=196 -RLIKE=197 -ROLE=198 -ROLES=199 -ROLLBACK=200 -ROLLUP=201 -ROW=202 -ROWS=203 -SCHEMA=204 -SECOND=205 -SELECT=206 -SEMI=207 -SEPARATED=208 -SERDE=209 -SERDEPROPERTIES=210 -SESSION_USER=211 -SET=212 -SETMINUS=213 -SETS=214 -SHOW=215 -SKEWED=216 -SOME=217 -SORT=218 -SORTED=219 -START=220 -STATISTICS=221 -STORED=222 -STRATIFY=223 -STRUCT=224 -SUBSTR=225 -SUBSTRING=226 -TABLE=227 -TABLES=228 -TABLESAMPLE=229 -TBLPROPERTIES=230 -TEMPORARY=231 -TERMINATED=232 -THEN=233 -TO=234 -TOUCH=235 -TRAILING=236 -TRANSACTION=237 -TRANSACTIONS=238 -TRANSFORM=239 -TRIM=240 -TRUE=241 -TRUNCATE=242 -TYPE=243 -UNARCHIVE=244 -UNBOUNDED=245 -UNCACHE=246 -UNION=247 -UNIQUE=248 -UNKNOWN=249 -UNLOCK=250 -UNSET=251 -UPDATE=252 -USE=253 -USER=254 -USING=255 -VALUES=256 -VIEW=257 -VIEWS=258 -WHEN=259 -WHERE=260 -WINDOW=261 -WITH=262 -YEAR=263 -EQ=264 -NSEQ=265 -NEQ=266 -NEQJ=267 -LT=268 -LTE=269 -GT=270 -GTE=271 -PLUS=272 -MINUS=273 -ASTERISK=274 -SLASH=275 -PERCENT=276 -DIV=277 -TILDE=278 -AMPERSAND=279 -PIPE=280 -CONCAT_PIPE=281 -HAT=282 -STRING=283 -BIGINT_LITERAL=284 -SMALLINT_LITERAL=285 -TINYINT_LITERAL=286 -INTEGER_VALUE=287 -EXPONENT_VALUE=288 -DECIMAL_VALUE=289 -DOUBLE_LITERAL=290 -BIGDECIMAL_LITERAL=291 -IDENTIFIER=292 -BACKQUOTED_IDENTIFIER=293 -SIMPLE_COMMENT=294 -BRACKETED_COMMENT=295 -WS=296 -UNRECOGNIZED=297 -';'=1 -'('=2 -')'=3 -','=4 -'.'=5 -'/*+'=6 -'*/'=7 -'->'=8 -'['=9 -']'=10 -':'=11 -'ADD'=12 -'AFTER'=13 -'ALL'=14 -'ALTER'=15 -'ANALYZE'=16 -'AND'=17 -'ANTI'=18 -'ANY'=19 -'ARCHIVE'=20 -'ARRAY'=21 -'AS'=22 -'ASC'=23 -'AT'=24 -'AUTHORIZATION'=25 -'BETWEEN'=26 -'BOTH'=27 -'BUCKET'=28 -'BUCKETS'=29 -'BY'=30 -'CACHE'=31 -'CASCADE'=32 -'CASE'=33 -'CAST'=34 -'CHANGE'=35 -'CHECK'=36 -'CLEAR'=37 -'CLUSTER'=38 -'CLUSTERED'=39 -'CODEGEN'=40 -'COLLATE'=41 -'COLLECTION'=42 -'COLUMN'=43 -'COLUMNS'=44 -'COMMENT'=45 -'COMMIT'=46 -'COMPACT'=47 -'COMPACTIONS'=48 -'COMPUTE'=49 -'CONCATENATE'=50 -'CONSTRAINT'=51 -'COST'=52 -'CREATE'=53 -'CROSS'=54 -'CUBE'=55 -'CURRENT'=56 -'CURRENT_DATE'=57 -'CURRENT_TIME'=58 -'CURRENT_TIMESTAMP'=59 -'CURRENT_USER'=60 -'DATA'=61 -'DATABASE'=62 -'DAY'=64 -'DBPROPERTIES'=65 -'DEFINED'=66 -'DELETE'=67 -'DELIMITED'=68 -'DESC'=69 -'DESCRIBE'=70 -'DFS'=71 -'DIRECTORIES'=72 -'DIRECTORY'=73 -'DISTINCT'=74 -'DISTRIBUTE'=75 -'DROP'=76 -'ELSE'=77 -'END'=78 -'ESCAPE'=79 -'ESCAPED'=80 -'EXCEPT'=81 -'EXCHANGE'=82 -'EXISTS'=83 -'EXPLAIN'=84 -'EXPORT'=85 -'EXTENDED'=86 -'EXTERNAL'=87 -'EXTRACT'=88 -'FALSE'=89 -'FETCH'=90 -'FIELDS'=91 -'FILTER'=92 -'FILEFORMAT'=93 -'FIRST'=94 -'FOLLOWING'=95 -'FOR'=96 -'FOREIGN'=97 -'FORMAT'=98 -'FORMATTED'=99 -'FROM'=100 -'FULL'=101 -'FUNCTION'=102 -'FUNCTIONS'=103 -'GLOBAL'=104 -'GRANT'=105 -'GROUP'=106 -'GROUPING'=107 -'HAVING'=108 -'HOUR'=109 -'IF'=110 -'IGNORE'=111 -'IMPORT'=112 -'IN'=113 -'INDEX'=114 -'INDEXES'=115 -'INNER'=116 -'INPATH'=117 -'INPUTFORMAT'=118 -'INSERT'=119 -'INTERSECT'=120 -'INTERVAL'=121 -'INTO'=122 -'IS'=123 -'ITEMS'=124 -'JOIN'=125 -'KEYS'=126 -'LAST'=127 -'LATERAL'=128 -'LAZY'=129 -'LEADING'=130 -'LEFT'=131 -'LIKE'=132 -'LIMIT'=133 -'LINES'=134 -'LIST'=135 -'LOAD'=136 -'LOCAL'=137 -'LOCATION'=138 -'LOCK'=139 -'LOCKS'=140 -'LOGICAL'=141 -'MACRO'=142 -'MAP'=143 -'MATCHED'=144 -'MERGE'=145 -'MINUTE'=146 -'MONTH'=147 -'MSCK'=148 -'NAMESPACE'=149 -'NAMESPACES'=150 -'NATURAL'=151 -'NO'=152 -'NULL'=154 -'NULLS'=155 -'OF'=156 -'ON'=157 -'ONLY'=158 -'OPTION'=159 -'OPTIONS'=160 -'OR'=161 -'ORDER'=162 -'OUT'=163 -'OUTER'=164 -'OUTPUTFORMAT'=165 -'OVER'=166 -'OVERLAPS'=167 -'OVERLAY'=168 -'OVERWRITE'=169 -'PARTITION'=170 -'PARTITIONED'=171 -'PARTITIONS'=172 -'PERCENT'=173 -'PIVOT'=174 -'PLACING'=175 -'POSITION'=176 -'PRECEDING'=177 -'PRIMARY'=178 -'PRINCIPALS'=179 -'PROPERTIES'=180 -'PURGE'=181 -'QUERY'=182 -'RANGE'=183 -'RECORDREADER'=184 -'RECORDWRITER'=185 -'RECOVER'=186 -'REDUCE'=187 -'REFERENCES'=188 -'REFRESH'=189 -'RENAME'=190 -'REPAIR'=191 -'REPLACE'=192 -'RESET'=193 -'RESTRICT'=194 -'REVOKE'=195 -'RIGHT'=196 -'ROLE'=198 -'ROLES'=199 -'ROLLBACK'=200 -'ROLLUP'=201 -'ROW'=202 -'ROWS'=203 -'SCHEMA'=204 -'SECOND'=205 -'SELECT'=206 -'SEMI'=207 -'SEPARATED'=208 -'SERDE'=209 -'SERDEPROPERTIES'=210 -'SESSION_USER'=211 -'SET'=212 -'MINUS'=213 -'SETS'=214 -'SHOW'=215 -'SKEWED'=216 -'SOME'=217 -'SORT'=218 -'SORTED'=219 -'START'=220 -'STATISTICS'=221 -'STORED'=222 -'STRATIFY'=223 -'STRUCT'=224 -'SUBSTR'=225 -'SUBSTRING'=226 -'TABLE'=227 -'TABLES'=228 -'TABLESAMPLE'=229 -'TBLPROPERTIES'=230 -'TERMINATED'=232 -'THEN'=233 -'TO'=234 -'TOUCH'=235 -'TRAILING'=236 -'TRANSACTION'=237 -'TRANSACTIONS'=238 -'TRANSFORM'=239 -'TRIM'=240 -'TRUE'=241 -'TRUNCATE'=242 -'TYPE'=243 -'UNARCHIVE'=244 -'UNBOUNDED'=245 -'UNCACHE'=246 -'UNION'=247 -'UNIQUE'=248 -'UNKNOWN'=249 -'UNLOCK'=250 -'UNSET'=251 -'UPDATE'=252 -'USE'=253 -'USER'=254 -'USING'=255 -'VALUES'=256 -'VIEW'=257 -'VIEWS'=258 -'WHEN'=259 -'WHERE'=260 -'WINDOW'=261 -'WITH'=262 -'YEAR'=263 -'<=>'=265 -'<>'=266 -'!='=267 -'<'=268 -'>'=270 -'+'=272 -'-'=273 -'*'=274 -'/'=275 -'%'=276 -'DIV'=277 -'~'=278 -'&'=279 -'|'=280 -'||'=281 -'^'=282 diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.interp b/pysparkling/sql/ast/generated/SqlBaseLexer.interp deleted file mode 100644 index d5a2997a4..000000000 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.interp +++ /dev/null @@ -1,912 +0,0 @@ -token literal names: -null -';' -'(' -')' -',' -'.' -'/*+' -'*/' -'->' -'[' -']' -':' -'ADD' -'AFTER' -'ALL' -'ALTER' -'ANALYZE' -'AND' -'ANTI' -'ANY' -'ARCHIVE' -'ARRAY' -'AS' -'ASC' -'AT' -'AUTHORIZATION' -'BETWEEN' -'BOTH' -'BUCKET' -'BUCKETS' -'BY' -'CACHE' -'CASCADE' -'CASE' -'CAST' -'CHANGE' -'CHECK' -'CLEAR' -'CLUSTER' -'CLUSTERED' -'CODEGEN' -'COLLATE' -'COLLECTION' -'COLUMN' -'COLUMNS' -'COMMENT' -'COMMIT' -'COMPACT' -'COMPACTIONS' -'COMPUTE' -'CONCATENATE' -'CONSTRAINT' -'COST' -'CREATE' -'CROSS' -'CUBE' -'CURRENT' -'CURRENT_DATE' -'CURRENT_TIME' -'CURRENT_TIMESTAMP' -'CURRENT_USER' -'DATA' -'DATABASE' -null -'DAY' -'DBPROPERTIES' -'DEFINED' -'DELETE' -'DELIMITED' -'DESC' -'DESCRIBE' -'DFS' -'DIRECTORIES' -'DIRECTORY' -'DISTINCT' -'DISTRIBUTE' -'DROP' -'ELSE' -'END' -'ESCAPE' -'ESCAPED' -'EXCEPT' -'EXCHANGE' -'EXISTS' -'EXPLAIN' -'EXPORT' -'EXTENDED' -'EXTERNAL' -'EXTRACT' -'FALSE' -'FETCH' -'FIELDS' -'FILTER' -'FILEFORMAT' -'FIRST' -'FOLLOWING' -'FOR' -'FOREIGN' -'FORMAT' -'FORMATTED' -'FROM' -'FULL' -'FUNCTION' -'FUNCTIONS' -'GLOBAL' -'GRANT' -'GROUP' -'GROUPING' -'HAVING' -'HOUR' -'IF' -'IGNORE' -'IMPORT' -'IN' -'INDEX' -'INDEXES' -'INNER' -'INPATH' -'INPUTFORMAT' -'INSERT' -'INTERSECT' -'INTERVAL' -'INTO' -'IS' -'ITEMS' -'JOIN' -'KEYS' -'LAST' -'LATERAL' -'LAZY' -'LEADING' -'LEFT' -'LIKE' -'LIMIT' -'LINES' -'LIST' -'LOAD' -'LOCAL' -'LOCATION' -'LOCK' -'LOCKS' -'LOGICAL' -'MACRO' -'MAP' -'MATCHED' -'MERGE' -'MINUTE' -'MONTH' -'MSCK' -'NAMESPACE' -'NAMESPACES' -'NATURAL' -'NO' -null -'NULL' -'NULLS' -'OF' -'ON' -'ONLY' -'OPTION' -'OPTIONS' -'OR' -'ORDER' -'OUT' -'OUTER' -'OUTPUTFORMAT' -'OVER' -'OVERLAPS' -'OVERLAY' -'OVERWRITE' -'PARTITION' -'PARTITIONED' -'PARTITIONS' -'PERCENT' -'PIVOT' -'PLACING' -'POSITION' -'PRECEDING' -'PRIMARY' -'PRINCIPALS' -'PROPERTIES' -'PURGE' -'QUERY' -'RANGE' -'RECORDREADER' -'RECORDWRITER' -'RECOVER' -'REDUCE' -'REFERENCES' -'REFRESH' -'RENAME' -'REPAIR' -'REPLACE' -'RESET' -'RESTRICT' -'REVOKE' -'RIGHT' -null -'ROLE' -'ROLES' -'ROLLBACK' -'ROLLUP' -'ROW' -'ROWS' -'SCHEMA' -'SECOND' -'SELECT' -'SEMI' -'SEPARATED' -'SERDE' -'SERDEPROPERTIES' -'SESSION_USER' -'SET' -'MINUS' -'SETS' -'SHOW' -'SKEWED' -'SOME' -'SORT' -'SORTED' -'START' -'STATISTICS' -'STORED' -'STRATIFY' -'STRUCT' -'SUBSTR' -'SUBSTRING' -'TABLE' -'TABLES' -'TABLESAMPLE' -'TBLPROPERTIES' -null -'TERMINATED' -'THEN' -'TO' -'TOUCH' -'TRAILING' -'TRANSACTION' -'TRANSACTIONS' -'TRANSFORM' -'TRIM' -'TRUE' -'TRUNCATE' -'TYPE' -'UNARCHIVE' -'UNBOUNDED' -'UNCACHE' -'UNION' -'UNIQUE' -'UNKNOWN' -'UNLOCK' -'UNSET' -'UPDATE' -'USE' -'USER' -'USING' -'VALUES' -'VIEW' -'VIEWS' -'WHEN' -'WHERE' -'WINDOW' -'WITH' -'YEAR' -null -'<=>' -'<>' -'!=' -'<' -null -'>' -null -'+' -'-' -'*' -'/' -'%' -'DIV' -'~' -'&' -'|' -'||' -'^' -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null - -token symbolic names: -null -null -null -null -null -null -null -null -null -null -null -null -ADD -AFTER -ALL -ALTER -ANALYZE -AND -ANTI -ANY -ARCHIVE -ARRAY -AS -ASC -AT -AUTHORIZATION -BETWEEN -BOTH -BUCKET -BUCKETS -BY -CACHE -CASCADE -CASE -CAST -CHANGE -CHECK -CLEAR -CLUSTER -CLUSTERED -CODEGEN -COLLATE -COLLECTION -COLUMN -COLUMNS -COMMENT -COMMIT -COMPACT -COMPACTIONS -COMPUTE -CONCATENATE -CONSTRAINT -COST -CREATE -CROSS -CUBE -CURRENT -CURRENT_DATE -CURRENT_TIME -CURRENT_TIMESTAMP -CURRENT_USER -DATA -DATABASE -DATABASES -DAY -DBPROPERTIES -DEFINED -DELETE -DELIMITED -DESC -DESCRIBE -DFS -DIRECTORIES -DIRECTORY -DISTINCT -DISTRIBUTE -DROP -ELSE -END -ESCAPE -ESCAPED -EXCEPT -EXCHANGE -EXISTS -EXPLAIN -EXPORT -EXTENDED -EXTERNAL -EXTRACT -FALSE -FETCH -FIELDS -FILTER -FILEFORMAT -FIRST -FOLLOWING -FOR -FOREIGN -FORMAT -FORMATTED -FROM -FULL -FUNCTION -FUNCTIONS -GLOBAL -GRANT -GROUP -GROUPING -HAVING -HOUR -IF -IGNORE -IMPORT -IN -INDEX -INDEXES -INNER -INPATH -INPUTFORMAT -INSERT -INTERSECT -INTERVAL -INTO -IS -ITEMS -JOIN -KEYS -LAST -LATERAL -LAZY -LEADING -LEFT -LIKE -LIMIT -LINES -LIST -LOAD -LOCAL -LOCATION -LOCK -LOCKS -LOGICAL -MACRO -MAP -MATCHED -MERGE -MINUTE -MONTH -MSCK -NAMESPACE -NAMESPACES -NATURAL -NO -NOT -NULL -NULLS -OF -ON -ONLY -OPTION -OPTIONS -OR -ORDER -OUT -OUTER -OUTPUTFORMAT -OVER -OVERLAPS -OVERLAY -OVERWRITE -PARTITION -PARTITIONED -PARTITIONS -PERCENTLIT -PIVOT -PLACING -POSITION -PRECEDING -PRIMARY -PRINCIPALS -PROPERTIES -PURGE -QUERY -RANGE -RECORDREADER -RECORDWRITER -RECOVER -REDUCE -REFERENCES -REFRESH -RENAME -REPAIR -REPLACE -RESET -RESTRICT -REVOKE -RIGHT -RLIKE -ROLE -ROLES -ROLLBACK -ROLLUP -ROW -ROWS -SCHEMA -SECOND -SELECT -SEMI -SEPARATED -SERDE -SERDEPROPERTIES -SESSION_USER -SET -SETMINUS -SETS -SHOW -SKEWED -SOME -SORT -SORTED -START -STATISTICS -STORED -STRATIFY -STRUCT -SUBSTR -SUBSTRING -TABLE -TABLES -TABLESAMPLE -TBLPROPERTIES -TEMPORARY -TERMINATED -THEN -TO -TOUCH -TRAILING -TRANSACTION -TRANSACTIONS -TRANSFORM -TRIM -TRUE -TRUNCATE -TYPE -UNARCHIVE -UNBOUNDED -UNCACHE -UNION -UNIQUE -UNKNOWN -UNLOCK -UNSET -UPDATE -USE -USER -USING -VALUES -VIEW -VIEWS -WHEN -WHERE -WINDOW -WITH -YEAR -EQ -NSEQ -NEQ -NEQJ -LT -LTE -GT -GTE -PLUS -MINUS -ASTERISK -SLASH -PERCENT -DIV -TILDE -AMPERSAND -PIPE -CONCAT_PIPE -HAT -STRING -BIGINT_LITERAL -SMALLINT_LITERAL -TINYINT_LITERAL -INTEGER_VALUE -EXPONENT_VALUE -DECIMAL_VALUE -DOUBLE_LITERAL -BIGDECIMAL_LITERAL -IDENTIFIER -BACKQUOTED_IDENTIFIER -SIMPLE_COMMENT -BRACKETED_COMMENT -WS -UNRECOGNIZED - -rule names: -T__0 -T__1 -T__2 -T__3 -T__4 -T__5 -T__6 -T__7 -T__8 -T__9 -T__10 -ADD -AFTER -ALL -ALTER -ANALYZE -AND -ANTI -ANY -ARCHIVE -ARRAY -AS -ASC -AT -AUTHORIZATION -BETWEEN -BOTH -BUCKET -BUCKETS -BY -CACHE -CASCADE -CASE -CAST -CHANGE -CHECK -CLEAR -CLUSTER -CLUSTERED -CODEGEN -COLLATE -COLLECTION -COLUMN -COLUMNS -COMMENT -COMMIT -COMPACT -COMPACTIONS -COMPUTE -CONCATENATE -CONSTRAINT -COST -CREATE -CROSS -CUBE -CURRENT -CURRENT_DATE -CURRENT_TIME -CURRENT_TIMESTAMP -CURRENT_USER -DATA -DATABASE -DATABASES -DAY -DBPROPERTIES -DEFINED -DELETE -DELIMITED -DESC -DESCRIBE -DFS -DIRECTORIES -DIRECTORY -DISTINCT -DISTRIBUTE -DROP -ELSE -END -ESCAPE -ESCAPED -EXCEPT -EXCHANGE -EXISTS -EXPLAIN -EXPORT -EXTENDED -EXTERNAL -EXTRACT -FALSE -FETCH -FIELDS -FILTER -FILEFORMAT -FIRST -FOLLOWING -FOR -FOREIGN -FORMAT -FORMATTED -FROM -FULL -FUNCTION -FUNCTIONS -GLOBAL -GRANT -GROUP -GROUPING -HAVING -HOUR -IF -IGNORE -IMPORT -IN -INDEX -INDEXES -INNER -INPATH -INPUTFORMAT -INSERT -INTERSECT -INTERVAL -INTO -IS -ITEMS -JOIN -KEYS -LAST -LATERAL -LAZY -LEADING -LEFT -LIKE -LIMIT -LINES -LIST -LOAD -LOCAL -LOCATION -LOCK -LOCKS -LOGICAL -MACRO -MAP -MATCHED -MERGE -MINUTE -MONTH -MSCK -NAMESPACE -NAMESPACES -NATURAL -NO -NOT -NULL -NULLS -OF -ON -ONLY -OPTION -OPTIONS -OR -ORDER -OUT -OUTER -OUTPUTFORMAT -OVER -OVERLAPS -OVERLAY -OVERWRITE -PARTITION -PARTITIONED -PARTITIONS -PERCENTLIT -PIVOT -PLACING -POSITION -PRECEDING -PRIMARY -PRINCIPALS -PROPERTIES -PURGE -QUERY -RANGE -RECORDREADER -RECORDWRITER -RECOVER -REDUCE -REFERENCES -REFRESH -RENAME -REPAIR -REPLACE -RESET -RESTRICT -REVOKE -RIGHT -RLIKE -ROLE -ROLES -ROLLBACK -ROLLUP -ROW -ROWS -SCHEMA -SECOND -SELECT -SEMI -SEPARATED -SERDE -SERDEPROPERTIES -SESSION_USER -SET -SETMINUS -SETS -SHOW -SKEWED -SOME -SORT -SORTED -START -STATISTICS -STORED -STRATIFY -STRUCT -SUBSTR -SUBSTRING -TABLE -TABLES -TABLESAMPLE -TBLPROPERTIES -TEMPORARY -TERMINATED -THEN -TO -TOUCH -TRAILING -TRANSACTION -TRANSACTIONS -TRANSFORM -TRIM -TRUE -TRUNCATE -TYPE -UNARCHIVE -UNBOUNDED -UNCACHE -UNION -UNIQUE -UNKNOWN -UNLOCK -UNSET -UPDATE -USE -USER -USING -VALUES -VIEW -VIEWS -WHEN -WHERE -WINDOW -WITH -YEAR -EQ -NSEQ -NEQ -NEQJ -LT -LTE -GT -GTE -PLUS -MINUS -ASTERISK -SLASH -PERCENT -DIV -TILDE -AMPERSAND -PIPE -CONCAT_PIPE -HAT -STRING -BIGINT_LITERAL -SMALLINT_LITERAL -TINYINT_LITERAL -INTEGER_VALUE -EXPONENT_VALUE -DECIMAL_VALUE -DOUBLE_LITERAL -BIGDECIMAL_LITERAL -IDENTIFIER -BACKQUOTED_IDENTIFIER -DECIMAL_DIGITS -EXPONENT -DIGIT -LETTER -SIMPLE_COMMENT -BRACKETED_COMMENT -WS -UNRECOGNIZED - -channel names: -DEFAULT_TOKEN_CHANNEL -HIDDEN - -mode names: -DEFAULT_MODE - -atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 299, 2742, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 4, 224, 9, 224, 4, 225, 9, 225, 4, 226, 9, 226, 4, 227, 9, 227, 4, 228, 9, 228, 4, 229, 9, 229, 4, 230, 9, 230, 4, 231, 9, 231, 4, 232, 9, 232, 4, 233, 9, 233, 4, 234, 9, 234, 4, 235, 9, 235, 4, 236, 9, 236, 4, 237, 9, 237, 4, 238, 9, 238, 4, 239, 9, 239, 4, 240, 9, 240, 4, 241, 9, 241, 4, 242, 9, 242, 4, 243, 9, 243, 4, 244, 9, 244, 4, 245, 9, 245, 4, 246, 9, 246, 4, 247, 9, 247, 4, 248, 9, 248, 4, 249, 9, 249, 4, 250, 9, 250, 4, 251, 9, 251, 4, 252, 9, 252, 4, 253, 9, 253, 4, 254, 9, 254, 4, 255, 9, 255, 4, 256, 9, 256, 4, 257, 9, 257, 4, 258, 9, 258, 4, 259, 9, 259, 4, 260, 9, 260, 4, 261, 9, 261, 4, 262, 9, 262, 4, 263, 9, 263, 4, 264, 9, 264, 4, 265, 9, 265, 4, 266, 9, 266, 4, 267, 9, 267, 4, 268, 9, 268, 4, 269, 9, 269, 4, 270, 9, 270, 4, 271, 9, 271, 4, 272, 9, 272, 4, 273, 9, 273, 4, 274, 9, 274, 4, 275, 9, 275, 4, 276, 9, 276, 4, 277, 9, 277, 4, 278, 9, 278, 4, 279, 9, 279, 4, 280, 9, 280, 4, 281, 9, 281, 4, 282, 9, 282, 4, 283, 9, 283, 4, 284, 9, 284, 4, 285, 9, 285, 4, 286, 9, 286, 4, 287, 9, 287, 4, 288, 9, 288, 4, 289, 9, 289, 4, 290, 9, 290, 4, 291, 9, 291, 4, 292, 9, 292, 4, 293, 9, 293, 4, 294, 9, 294, 4, 295, 9, 295, 4, 296, 9, 296, 4, 297, 9, 297, 4, 298, 9, 298, 4, 299, 9, 299, 4, 300, 9, 300, 4, 301, 9, 301, 4, 302, 9, 302, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 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, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 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, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 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, 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, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 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, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 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, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 1029, 10, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 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, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1656, 10, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 5, 198, 2002, 10, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 3, 208, 3, 208, 3, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 5, 232, 2264, 10, 232, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 265, 3, 265, 3, 265, 5, 265, 2492, 10, 265, 3, 266, 3, 266, 3, 266, 3, 266, 3, 267, 3, 267, 3, 267, 3, 268, 3, 268, 3, 268, 3, 269, 3, 269, 3, 270, 3, 270, 3, 270, 3, 270, 5, 270, 2510, 10, 270, 3, 271, 3, 271, 3, 272, 3, 272, 3, 272, 3, 272, 5, 272, 2518, 10, 272, 3, 273, 3, 273, 3, 274, 3, 274, 3, 275, 3, 275, 3, 276, 3, 276, 3, 277, 3, 277, 3, 278, 3, 278, 3, 278, 3, 278, 3, 279, 3, 279, 3, 280, 3, 280, 3, 281, 3, 281, 3, 282, 3, 282, 3, 282, 3, 283, 3, 283, 3, 284, 3, 284, 3, 284, 3, 284, 7, 284, 2549, 10, 284, 12, 284, 14, 284, 2552, 11, 284, 3, 284, 3, 284, 3, 284, 3, 284, 3, 284, 7, 284, 2559, 10, 284, 12, 284, 14, 284, 2562, 11, 284, 3, 284, 5, 284, 2565, 10, 284, 3, 285, 6, 285, 2568, 10, 285, 13, 285, 14, 285, 2569, 3, 285, 3, 285, 3, 286, 6, 286, 2575, 10, 286, 13, 286, 14, 286, 2576, 3, 286, 3, 286, 3, 287, 6, 287, 2582, 10, 287, 13, 287, 14, 287, 2583, 3, 287, 3, 287, 3, 288, 6, 288, 2589, 10, 288, 13, 288, 14, 288, 2590, 3, 289, 6, 289, 2594, 10, 289, 13, 289, 14, 289, 2595, 3, 289, 3, 289, 3, 289, 3, 289, 3, 289, 3, 289, 5, 289, 2604, 10, 289, 3, 290, 3, 290, 3, 290, 3, 291, 6, 291, 2610, 10, 291, 13, 291, 14, 291, 2611, 3, 291, 5, 291, 2615, 10, 291, 3, 291, 3, 291, 3, 291, 3, 291, 5, 291, 2621, 10, 291, 3, 291, 3, 291, 3, 291, 5, 291, 2626, 10, 291, 3, 292, 6, 292, 2629, 10, 292, 13, 292, 14, 292, 2630, 3, 292, 5, 292, 2634, 10, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 5, 292, 2641, 10, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 5, 292, 2648, 10, 292, 3, 293, 3, 293, 3, 293, 6, 293, 2653, 10, 293, 13, 293, 14, 293, 2654, 3, 294, 3, 294, 3, 294, 3, 294, 7, 294, 2661, 10, 294, 12, 294, 14, 294, 2664, 11, 294, 3, 294, 3, 294, 3, 295, 6, 295, 2669, 10, 295, 13, 295, 14, 295, 2670, 3, 295, 3, 295, 7, 295, 2675, 10, 295, 12, 295, 14, 295, 2678, 11, 295, 3, 295, 3, 295, 6, 295, 2682, 10, 295, 13, 295, 14, 295, 2683, 5, 295, 2686, 10, 295, 3, 296, 3, 296, 5, 296, 2690, 10, 296, 3, 296, 6, 296, 2693, 10, 296, 13, 296, 14, 296, 2694, 3, 297, 3, 297, 3, 298, 3, 298, 3, 299, 3, 299, 3, 299, 3, 299, 7, 299, 2705, 10, 299, 12, 299, 14, 299, 2708, 11, 299, 3, 299, 5, 299, 2711, 10, 299, 3, 299, 5, 299, 2714, 10, 299, 3, 299, 3, 299, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 7, 300, 2724, 10, 300, 12, 300, 14, 300, 2727, 11, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 300, 3, 301, 6, 301, 2735, 10, 301, 13, 301, 14, 301, 2736, 3, 301, 3, 301, 3, 302, 3, 302, 3, 2725, 2, 303, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 218, 435, 219, 437, 220, 439, 221, 441, 222, 443, 223, 445, 224, 447, 225, 449, 226, 451, 227, 453, 228, 455, 229, 457, 230, 459, 231, 461, 232, 463, 233, 465, 234, 467, 235, 469, 236, 471, 237, 473, 238, 475, 239, 477, 240, 479, 241, 481, 242, 483, 243, 485, 244, 487, 245, 489, 246, 491, 247, 493, 248, 495, 249, 497, 250, 499, 251, 501, 252, 503, 253, 505, 254, 507, 255, 509, 256, 511, 257, 513, 258, 515, 259, 517, 260, 519, 261, 521, 262, 523, 263, 525, 264, 527, 265, 529, 266, 531, 267, 533, 268, 535, 269, 537, 270, 539, 271, 541, 272, 543, 273, 545, 274, 547, 275, 549, 276, 551, 277, 553, 278, 555, 279, 557, 280, 559, 281, 561, 282, 563, 283, 565, 284, 567, 285, 569, 286, 571, 287, 573, 288, 575, 289, 577, 290, 579, 291, 581, 292, 583, 293, 585, 294, 587, 295, 589, 2, 591, 2, 593, 2, 595, 2, 597, 296, 599, 297, 601, 298, 603, 299, 3, 2, 10, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 3, 2, 67, 92, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2780, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 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, 29, 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, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 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, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 433, 3, 2, 2, 2, 2, 435, 3, 2, 2, 2, 2, 437, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 2, 447, 3, 2, 2, 2, 2, 449, 3, 2, 2, 2, 2, 451, 3, 2, 2, 2, 2, 453, 3, 2, 2, 2, 2, 455, 3, 2, 2, 2, 2, 457, 3, 2, 2, 2, 2, 459, 3, 2, 2, 2, 2, 461, 3, 2, 2, 2, 2, 463, 3, 2, 2, 2, 2, 465, 3, 2, 2, 2, 2, 467, 3, 2, 2, 2, 2, 469, 3, 2, 2, 2, 2, 471, 3, 2, 2, 2, 2, 473, 3, 2, 2, 2, 2, 475, 3, 2, 2, 2, 2, 477, 3, 2, 2, 2, 2, 479, 3, 2, 2, 2, 2, 481, 3, 2, 2, 2, 2, 483, 3, 2, 2, 2, 2, 485, 3, 2, 2, 2, 2, 487, 3, 2, 2, 2, 2, 489, 3, 2, 2, 2, 2, 491, 3, 2, 2, 2, 2, 493, 3, 2, 2, 2, 2, 495, 3, 2, 2, 2, 2, 497, 3, 2, 2, 2, 2, 499, 3, 2, 2, 2, 2, 501, 3, 2, 2, 2, 2, 503, 3, 2, 2, 2, 2, 505, 3, 2, 2, 2, 2, 507, 3, 2, 2, 2, 2, 509, 3, 2, 2, 2, 2, 511, 3, 2, 2, 2, 2, 513, 3, 2, 2, 2, 2, 515, 3, 2, 2, 2, 2, 517, 3, 2, 2, 2, 2, 519, 3, 2, 2, 2, 2, 521, 3, 2, 2, 2, 2, 523, 3, 2, 2, 2, 2, 525, 3, 2, 2, 2, 2, 527, 3, 2, 2, 2, 2, 529, 3, 2, 2, 2, 2, 531, 3, 2, 2, 2, 2, 533, 3, 2, 2, 2, 2, 535, 3, 2, 2, 2, 2, 537, 3, 2, 2, 2, 2, 539, 3, 2, 2, 2, 2, 541, 3, 2, 2, 2, 2, 543, 3, 2, 2, 2, 2, 545, 3, 2, 2, 2, 2, 547, 3, 2, 2, 2, 2, 549, 3, 2, 2, 2, 2, 551, 3, 2, 2, 2, 2, 553, 3, 2, 2, 2, 2, 555, 3, 2, 2, 2, 2, 557, 3, 2, 2, 2, 2, 559, 3, 2, 2, 2, 2, 561, 3, 2, 2, 2, 2, 563, 3, 2, 2, 2, 2, 565, 3, 2, 2, 2, 2, 567, 3, 2, 2, 2, 2, 569, 3, 2, 2, 2, 2, 571, 3, 2, 2, 2, 2, 573, 3, 2, 2, 2, 2, 575, 3, 2, 2, 2, 2, 577, 3, 2, 2, 2, 2, 579, 3, 2, 2, 2, 2, 581, 3, 2, 2, 2, 2, 583, 3, 2, 2, 2, 2, 585, 3, 2, 2, 2, 2, 587, 3, 2, 2, 2, 2, 597, 3, 2, 2, 2, 2, 599, 3, 2, 2, 2, 2, 601, 3, 2, 2, 2, 2, 603, 3, 2, 2, 2, 3, 605, 3, 2, 2, 2, 5, 607, 3, 2, 2, 2, 7, 609, 3, 2, 2, 2, 9, 611, 3, 2, 2, 2, 11, 613, 3, 2, 2, 2, 13, 615, 3, 2, 2, 2, 15, 619, 3, 2, 2, 2, 17, 622, 3, 2, 2, 2, 19, 625, 3, 2, 2, 2, 21, 627, 3, 2, 2, 2, 23, 629, 3, 2, 2, 2, 25, 631, 3, 2, 2, 2, 27, 635, 3, 2, 2, 2, 29, 641, 3, 2, 2, 2, 31, 645, 3, 2, 2, 2, 33, 651, 3, 2, 2, 2, 35, 659, 3, 2, 2, 2, 37, 663, 3, 2, 2, 2, 39, 668, 3, 2, 2, 2, 41, 672, 3, 2, 2, 2, 43, 680, 3, 2, 2, 2, 45, 686, 3, 2, 2, 2, 47, 689, 3, 2, 2, 2, 49, 693, 3, 2, 2, 2, 51, 696, 3, 2, 2, 2, 53, 710, 3, 2, 2, 2, 55, 718, 3, 2, 2, 2, 57, 723, 3, 2, 2, 2, 59, 730, 3, 2, 2, 2, 61, 738, 3, 2, 2, 2, 63, 741, 3, 2, 2, 2, 65, 747, 3, 2, 2, 2, 67, 755, 3, 2, 2, 2, 69, 760, 3, 2, 2, 2, 71, 765, 3, 2, 2, 2, 73, 772, 3, 2, 2, 2, 75, 778, 3, 2, 2, 2, 77, 784, 3, 2, 2, 2, 79, 792, 3, 2, 2, 2, 81, 802, 3, 2, 2, 2, 83, 810, 3, 2, 2, 2, 85, 818, 3, 2, 2, 2, 87, 829, 3, 2, 2, 2, 89, 836, 3, 2, 2, 2, 91, 844, 3, 2, 2, 2, 93, 852, 3, 2, 2, 2, 95, 859, 3, 2, 2, 2, 97, 867, 3, 2, 2, 2, 99, 879, 3, 2, 2, 2, 101, 887, 3, 2, 2, 2, 103, 899, 3, 2, 2, 2, 105, 910, 3, 2, 2, 2, 107, 915, 3, 2, 2, 2, 109, 922, 3, 2, 2, 2, 111, 928, 3, 2, 2, 2, 113, 933, 3, 2, 2, 2, 115, 941, 3, 2, 2, 2, 117, 954, 3, 2, 2, 2, 119, 967, 3, 2, 2, 2, 121, 985, 3, 2, 2, 2, 123, 998, 3, 2, 2, 2, 125, 1003, 3, 2, 2, 2, 127, 1028, 3, 2, 2, 2, 129, 1030, 3, 2, 2, 2, 131, 1034, 3, 2, 2, 2, 133, 1047, 3, 2, 2, 2, 135, 1055, 3, 2, 2, 2, 137, 1062, 3, 2, 2, 2, 139, 1072, 3, 2, 2, 2, 141, 1077, 3, 2, 2, 2, 143, 1086, 3, 2, 2, 2, 145, 1090, 3, 2, 2, 2, 147, 1102, 3, 2, 2, 2, 149, 1112, 3, 2, 2, 2, 151, 1121, 3, 2, 2, 2, 153, 1132, 3, 2, 2, 2, 155, 1137, 3, 2, 2, 2, 157, 1142, 3, 2, 2, 2, 159, 1146, 3, 2, 2, 2, 161, 1153, 3, 2, 2, 2, 163, 1161, 3, 2, 2, 2, 165, 1168, 3, 2, 2, 2, 167, 1177, 3, 2, 2, 2, 169, 1184, 3, 2, 2, 2, 171, 1192, 3, 2, 2, 2, 173, 1199, 3, 2, 2, 2, 175, 1208, 3, 2, 2, 2, 177, 1217, 3, 2, 2, 2, 179, 1225, 3, 2, 2, 2, 181, 1231, 3, 2, 2, 2, 183, 1237, 3, 2, 2, 2, 185, 1244, 3, 2, 2, 2, 187, 1251, 3, 2, 2, 2, 189, 1262, 3, 2, 2, 2, 191, 1268, 3, 2, 2, 2, 193, 1278, 3, 2, 2, 2, 195, 1282, 3, 2, 2, 2, 197, 1290, 3, 2, 2, 2, 199, 1297, 3, 2, 2, 2, 201, 1307, 3, 2, 2, 2, 203, 1312, 3, 2, 2, 2, 205, 1317, 3, 2, 2, 2, 207, 1326, 3, 2, 2, 2, 209, 1336, 3, 2, 2, 2, 211, 1343, 3, 2, 2, 2, 213, 1349, 3, 2, 2, 2, 215, 1355, 3, 2, 2, 2, 217, 1364, 3, 2, 2, 2, 219, 1371, 3, 2, 2, 2, 221, 1376, 3, 2, 2, 2, 223, 1379, 3, 2, 2, 2, 225, 1386, 3, 2, 2, 2, 227, 1393, 3, 2, 2, 2, 229, 1396, 3, 2, 2, 2, 231, 1402, 3, 2, 2, 2, 233, 1410, 3, 2, 2, 2, 235, 1416, 3, 2, 2, 2, 237, 1423, 3, 2, 2, 2, 239, 1435, 3, 2, 2, 2, 241, 1442, 3, 2, 2, 2, 243, 1452, 3, 2, 2, 2, 245, 1461, 3, 2, 2, 2, 247, 1466, 3, 2, 2, 2, 249, 1469, 3, 2, 2, 2, 251, 1475, 3, 2, 2, 2, 253, 1480, 3, 2, 2, 2, 255, 1485, 3, 2, 2, 2, 257, 1490, 3, 2, 2, 2, 259, 1498, 3, 2, 2, 2, 261, 1503, 3, 2, 2, 2, 263, 1511, 3, 2, 2, 2, 265, 1516, 3, 2, 2, 2, 267, 1521, 3, 2, 2, 2, 269, 1527, 3, 2, 2, 2, 271, 1533, 3, 2, 2, 2, 273, 1538, 3, 2, 2, 2, 275, 1543, 3, 2, 2, 2, 277, 1549, 3, 2, 2, 2, 279, 1558, 3, 2, 2, 2, 281, 1563, 3, 2, 2, 2, 283, 1569, 3, 2, 2, 2, 285, 1577, 3, 2, 2, 2, 287, 1583, 3, 2, 2, 2, 289, 1587, 3, 2, 2, 2, 291, 1595, 3, 2, 2, 2, 293, 1601, 3, 2, 2, 2, 295, 1608, 3, 2, 2, 2, 297, 1614, 3, 2, 2, 2, 299, 1619, 3, 2, 2, 2, 301, 1629, 3, 2, 2, 2, 303, 1640, 3, 2, 2, 2, 305, 1648, 3, 2, 2, 2, 307, 1655, 3, 2, 2, 2, 309, 1657, 3, 2, 2, 2, 311, 1662, 3, 2, 2, 2, 313, 1668, 3, 2, 2, 2, 315, 1671, 3, 2, 2, 2, 317, 1674, 3, 2, 2, 2, 319, 1679, 3, 2, 2, 2, 321, 1686, 3, 2, 2, 2, 323, 1694, 3, 2, 2, 2, 325, 1697, 3, 2, 2, 2, 327, 1703, 3, 2, 2, 2, 329, 1707, 3, 2, 2, 2, 331, 1713, 3, 2, 2, 2, 333, 1726, 3, 2, 2, 2, 335, 1731, 3, 2, 2, 2, 337, 1740, 3, 2, 2, 2, 339, 1748, 3, 2, 2, 2, 341, 1758, 3, 2, 2, 2, 343, 1768, 3, 2, 2, 2, 345, 1780, 3, 2, 2, 2, 347, 1791, 3, 2, 2, 2, 349, 1799, 3, 2, 2, 2, 351, 1805, 3, 2, 2, 2, 353, 1813, 3, 2, 2, 2, 355, 1822, 3, 2, 2, 2, 357, 1832, 3, 2, 2, 2, 359, 1840, 3, 2, 2, 2, 361, 1851, 3, 2, 2, 2, 363, 1862, 3, 2, 2, 2, 365, 1868, 3, 2, 2, 2, 367, 1874, 3, 2, 2, 2, 369, 1880, 3, 2, 2, 2, 371, 1893, 3, 2, 2, 2, 373, 1906, 3, 2, 2, 2, 375, 1914, 3, 2, 2, 2, 377, 1921, 3, 2, 2, 2, 379, 1932, 3, 2, 2, 2, 381, 1940, 3, 2, 2, 2, 383, 1947, 3, 2, 2, 2, 385, 1954, 3, 2, 2, 2, 387, 1962, 3, 2, 2, 2, 389, 1968, 3, 2, 2, 2, 391, 1977, 3, 2, 2, 2, 393, 1984, 3, 2, 2, 2, 395, 2001, 3, 2, 2, 2, 397, 2003, 3, 2, 2, 2, 399, 2008, 3, 2, 2, 2, 401, 2014, 3, 2, 2, 2, 403, 2023, 3, 2, 2, 2, 405, 2030, 3, 2, 2, 2, 407, 2034, 3, 2, 2, 2, 409, 2039, 3, 2, 2, 2, 411, 2046, 3, 2, 2, 2, 413, 2053, 3, 2, 2, 2, 415, 2060, 3, 2, 2, 2, 417, 2065, 3, 2, 2, 2, 419, 2075, 3, 2, 2, 2, 421, 2081, 3, 2, 2, 2, 423, 2097, 3, 2, 2, 2, 425, 2110, 3, 2, 2, 2, 427, 2114, 3, 2, 2, 2, 429, 2120, 3, 2, 2, 2, 431, 2125, 3, 2, 2, 2, 433, 2130, 3, 2, 2, 2, 435, 2137, 3, 2, 2, 2, 437, 2142, 3, 2, 2, 2, 439, 2147, 3, 2, 2, 2, 441, 2154, 3, 2, 2, 2, 443, 2160, 3, 2, 2, 2, 445, 2171, 3, 2, 2, 2, 447, 2178, 3, 2, 2, 2, 449, 2187, 3, 2, 2, 2, 451, 2194, 3, 2, 2, 2, 453, 2201, 3, 2, 2, 2, 455, 2211, 3, 2, 2, 2, 457, 2217, 3, 2, 2, 2, 459, 2224, 3, 2, 2, 2, 461, 2236, 3, 2, 2, 2, 463, 2263, 3, 2, 2, 2, 465, 2265, 3, 2, 2, 2, 467, 2276, 3, 2, 2, 2, 469, 2281, 3, 2, 2, 2, 471, 2284, 3, 2, 2, 2, 473, 2290, 3, 2, 2, 2, 475, 2299, 3, 2, 2, 2, 477, 2311, 3, 2, 2, 2, 479, 2324, 3, 2, 2, 2, 481, 2334, 3, 2, 2, 2, 483, 2339, 3, 2, 2, 2, 485, 2344, 3, 2, 2, 2, 487, 2353, 3, 2, 2, 2, 489, 2358, 3, 2, 2, 2, 491, 2368, 3, 2, 2, 2, 493, 2378, 3, 2, 2, 2, 495, 2386, 3, 2, 2, 2, 497, 2392, 3, 2, 2, 2, 499, 2399, 3, 2, 2, 2, 501, 2407, 3, 2, 2, 2, 503, 2414, 3, 2, 2, 2, 505, 2420, 3, 2, 2, 2, 507, 2427, 3, 2, 2, 2, 509, 2431, 3, 2, 2, 2, 511, 2436, 3, 2, 2, 2, 513, 2442, 3, 2, 2, 2, 515, 2449, 3, 2, 2, 2, 517, 2454, 3, 2, 2, 2, 519, 2460, 3, 2, 2, 2, 521, 2465, 3, 2, 2, 2, 523, 2471, 3, 2, 2, 2, 525, 2478, 3, 2, 2, 2, 527, 2483, 3, 2, 2, 2, 529, 2491, 3, 2, 2, 2, 531, 2493, 3, 2, 2, 2, 533, 2497, 3, 2, 2, 2, 535, 2500, 3, 2, 2, 2, 537, 2503, 3, 2, 2, 2, 539, 2509, 3, 2, 2, 2, 541, 2511, 3, 2, 2, 2, 543, 2517, 3, 2, 2, 2, 545, 2519, 3, 2, 2, 2, 547, 2521, 3, 2, 2, 2, 549, 2523, 3, 2, 2, 2, 551, 2525, 3, 2, 2, 2, 553, 2527, 3, 2, 2, 2, 555, 2529, 3, 2, 2, 2, 557, 2533, 3, 2, 2, 2, 559, 2535, 3, 2, 2, 2, 561, 2537, 3, 2, 2, 2, 563, 2539, 3, 2, 2, 2, 565, 2542, 3, 2, 2, 2, 567, 2564, 3, 2, 2, 2, 569, 2567, 3, 2, 2, 2, 571, 2574, 3, 2, 2, 2, 573, 2581, 3, 2, 2, 2, 575, 2588, 3, 2, 2, 2, 577, 2603, 3, 2, 2, 2, 579, 2605, 3, 2, 2, 2, 581, 2625, 3, 2, 2, 2, 583, 2647, 3, 2, 2, 2, 585, 2652, 3, 2, 2, 2, 587, 2656, 3, 2, 2, 2, 589, 2685, 3, 2, 2, 2, 591, 2687, 3, 2, 2, 2, 593, 2696, 3, 2, 2, 2, 595, 2698, 3, 2, 2, 2, 597, 2700, 3, 2, 2, 2, 599, 2717, 3, 2, 2, 2, 601, 2734, 3, 2, 2, 2, 603, 2740, 3, 2, 2, 2, 605, 606, 7, 61, 2, 2, 606, 4, 3, 2, 2, 2, 607, 608, 7, 42, 2, 2, 608, 6, 3, 2, 2, 2, 609, 610, 7, 43, 2, 2, 610, 8, 3, 2, 2, 2, 611, 612, 7, 46, 2, 2, 612, 10, 3, 2, 2, 2, 613, 614, 7, 48, 2, 2, 614, 12, 3, 2, 2, 2, 615, 616, 7, 49, 2, 2, 616, 617, 7, 44, 2, 2, 617, 618, 7, 45, 2, 2, 618, 14, 3, 2, 2, 2, 619, 620, 7, 44, 2, 2, 620, 621, 7, 49, 2, 2, 621, 16, 3, 2, 2, 2, 622, 623, 7, 47, 2, 2, 623, 624, 7, 64, 2, 2, 624, 18, 3, 2, 2, 2, 625, 626, 7, 93, 2, 2, 626, 20, 3, 2, 2, 2, 627, 628, 7, 95, 2, 2, 628, 22, 3, 2, 2, 2, 629, 630, 7, 60, 2, 2, 630, 24, 3, 2, 2, 2, 631, 632, 7, 67, 2, 2, 632, 633, 7, 70, 2, 2, 633, 634, 7, 70, 2, 2, 634, 26, 3, 2, 2, 2, 635, 636, 7, 67, 2, 2, 636, 637, 7, 72, 2, 2, 637, 638, 7, 86, 2, 2, 638, 639, 7, 71, 2, 2, 639, 640, 7, 84, 2, 2, 640, 28, 3, 2, 2, 2, 641, 642, 7, 67, 2, 2, 642, 643, 7, 78, 2, 2, 643, 644, 7, 78, 2, 2, 644, 30, 3, 2, 2, 2, 645, 646, 7, 67, 2, 2, 646, 647, 7, 78, 2, 2, 647, 648, 7, 86, 2, 2, 648, 649, 7, 71, 2, 2, 649, 650, 7, 84, 2, 2, 650, 32, 3, 2, 2, 2, 651, 652, 7, 67, 2, 2, 652, 653, 7, 80, 2, 2, 653, 654, 7, 67, 2, 2, 654, 655, 7, 78, 2, 2, 655, 656, 7, 91, 2, 2, 656, 657, 7, 92, 2, 2, 657, 658, 7, 71, 2, 2, 658, 34, 3, 2, 2, 2, 659, 660, 7, 67, 2, 2, 660, 661, 7, 80, 2, 2, 661, 662, 7, 70, 2, 2, 662, 36, 3, 2, 2, 2, 663, 664, 7, 67, 2, 2, 664, 665, 7, 80, 2, 2, 665, 666, 7, 86, 2, 2, 666, 667, 7, 75, 2, 2, 667, 38, 3, 2, 2, 2, 668, 669, 7, 67, 2, 2, 669, 670, 7, 80, 2, 2, 670, 671, 7, 91, 2, 2, 671, 40, 3, 2, 2, 2, 672, 673, 7, 67, 2, 2, 673, 674, 7, 84, 2, 2, 674, 675, 7, 69, 2, 2, 675, 676, 7, 74, 2, 2, 676, 677, 7, 75, 2, 2, 677, 678, 7, 88, 2, 2, 678, 679, 7, 71, 2, 2, 679, 42, 3, 2, 2, 2, 680, 681, 7, 67, 2, 2, 681, 682, 7, 84, 2, 2, 682, 683, 7, 84, 2, 2, 683, 684, 7, 67, 2, 2, 684, 685, 7, 91, 2, 2, 685, 44, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 85, 2, 2, 688, 46, 3, 2, 2, 2, 689, 690, 7, 67, 2, 2, 690, 691, 7, 85, 2, 2, 691, 692, 7, 69, 2, 2, 692, 48, 3, 2, 2, 2, 693, 694, 7, 67, 2, 2, 694, 695, 7, 86, 2, 2, 695, 50, 3, 2, 2, 2, 696, 697, 7, 67, 2, 2, 697, 698, 7, 87, 2, 2, 698, 699, 7, 86, 2, 2, 699, 700, 7, 74, 2, 2, 700, 701, 7, 81, 2, 2, 701, 702, 7, 84, 2, 2, 702, 703, 7, 75, 2, 2, 703, 704, 7, 92, 2, 2, 704, 705, 7, 67, 2, 2, 705, 706, 7, 86, 2, 2, 706, 707, 7, 75, 2, 2, 707, 708, 7, 81, 2, 2, 708, 709, 7, 80, 2, 2, 709, 52, 3, 2, 2, 2, 710, 711, 7, 68, 2, 2, 711, 712, 7, 71, 2, 2, 712, 713, 7, 86, 2, 2, 713, 714, 7, 89, 2, 2, 714, 715, 7, 71, 2, 2, 715, 716, 7, 71, 2, 2, 716, 717, 7, 80, 2, 2, 717, 54, 3, 2, 2, 2, 718, 719, 7, 68, 2, 2, 719, 720, 7, 81, 2, 2, 720, 721, 7, 86, 2, 2, 721, 722, 7, 74, 2, 2, 722, 56, 3, 2, 2, 2, 723, 724, 7, 68, 2, 2, 724, 725, 7, 87, 2, 2, 725, 726, 7, 69, 2, 2, 726, 727, 7, 77, 2, 2, 727, 728, 7, 71, 2, 2, 728, 729, 7, 86, 2, 2, 729, 58, 3, 2, 2, 2, 730, 731, 7, 68, 2, 2, 731, 732, 7, 87, 2, 2, 732, 733, 7, 69, 2, 2, 733, 734, 7, 77, 2, 2, 734, 735, 7, 71, 2, 2, 735, 736, 7, 86, 2, 2, 736, 737, 7, 85, 2, 2, 737, 60, 3, 2, 2, 2, 738, 739, 7, 68, 2, 2, 739, 740, 7, 91, 2, 2, 740, 62, 3, 2, 2, 2, 741, 742, 7, 69, 2, 2, 742, 743, 7, 67, 2, 2, 743, 744, 7, 69, 2, 2, 744, 745, 7, 74, 2, 2, 745, 746, 7, 71, 2, 2, 746, 64, 3, 2, 2, 2, 747, 748, 7, 69, 2, 2, 748, 749, 7, 67, 2, 2, 749, 750, 7, 85, 2, 2, 750, 751, 7, 69, 2, 2, 751, 752, 7, 67, 2, 2, 752, 753, 7, 70, 2, 2, 753, 754, 7, 71, 2, 2, 754, 66, 3, 2, 2, 2, 755, 756, 7, 69, 2, 2, 756, 757, 7, 67, 2, 2, 757, 758, 7, 85, 2, 2, 758, 759, 7, 71, 2, 2, 759, 68, 3, 2, 2, 2, 760, 761, 7, 69, 2, 2, 761, 762, 7, 67, 2, 2, 762, 763, 7, 85, 2, 2, 763, 764, 7, 86, 2, 2, 764, 70, 3, 2, 2, 2, 765, 766, 7, 69, 2, 2, 766, 767, 7, 74, 2, 2, 767, 768, 7, 67, 2, 2, 768, 769, 7, 80, 2, 2, 769, 770, 7, 73, 2, 2, 770, 771, 7, 71, 2, 2, 771, 72, 3, 2, 2, 2, 772, 773, 7, 69, 2, 2, 773, 774, 7, 74, 2, 2, 774, 775, 7, 71, 2, 2, 775, 776, 7, 69, 2, 2, 776, 777, 7, 77, 2, 2, 777, 74, 3, 2, 2, 2, 778, 779, 7, 69, 2, 2, 779, 780, 7, 78, 2, 2, 780, 781, 7, 71, 2, 2, 781, 782, 7, 67, 2, 2, 782, 783, 7, 84, 2, 2, 783, 76, 3, 2, 2, 2, 784, 785, 7, 69, 2, 2, 785, 786, 7, 78, 2, 2, 786, 787, 7, 87, 2, 2, 787, 788, 7, 85, 2, 2, 788, 789, 7, 86, 2, 2, 789, 790, 7, 71, 2, 2, 790, 791, 7, 84, 2, 2, 791, 78, 3, 2, 2, 2, 792, 793, 7, 69, 2, 2, 793, 794, 7, 78, 2, 2, 794, 795, 7, 87, 2, 2, 795, 796, 7, 85, 2, 2, 796, 797, 7, 86, 2, 2, 797, 798, 7, 71, 2, 2, 798, 799, 7, 84, 2, 2, 799, 800, 7, 71, 2, 2, 800, 801, 7, 70, 2, 2, 801, 80, 3, 2, 2, 2, 802, 803, 7, 69, 2, 2, 803, 804, 7, 81, 2, 2, 804, 805, 7, 70, 2, 2, 805, 806, 7, 71, 2, 2, 806, 807, 7, 73, 2, 2, 807, 808, 7, 71, 2, 2, 808, 809, 7, 80, 2, 2, 809, 82, 3, 2, 2, 2, 810, 811, 7, 69, 2, 2, 811, 812, 7, 81, 2, 2, 812, 813, 7, 78, 2, 2, 813, 814, 7, 78, 2, 2, 814, 815, 7, 67, 2, 2, 815, 816, 7, 86, 2, 2, 816, 817, 7, 71, 2, 2, 817, 84, 3, 2, 2, 2, 818, 819, 7, 69, 2, 2, 819, 820, 7, 81, 2, 2, 820, 821, 7, 78, 2, 2, 821, 822, 7, 78, 2, 2, 822, 823, 7, 71, 2, 2, 823, 824, 7, 69, 2, 2, 824, 825, 7, 86, 2, 2, 825, 826, 7, 75, 2, 2, 826, 827, 7, 81, 2, 2, 827, 828, 7, 80, 2, 2, 828, 86, 3, 2, 2, 2, 829, 830, 7, 69, 2, 2, 830, 831, 7, 81, 2, 2, 831, 832, 7, 78, 2, 2, 832, 833, 7, 87, 2, 2, 833, 834, 7, 79, 2, 2, 834, 835, 7, 80, 2, 2, 835, 88, 3, 2, 2, 2, 836, 837, 7, 69, 2, 2, 837, 838, 7, 81, 2, 2, 838, 839, 7, 78, 2, 2, 839, 840, 7, 87, 2, 2, 840, 841, 7, 79, 2, 2, 841, 842, 7, 80, 2, 2, 842, 843, 7, 85, 2, 2, 843, 90, 3, 2, 2, 2, 844, 845, 7, 69, 2, 2, 845, 846, 7, 81, 2, 2, 846, 847, 7, 79, 2, 2, 847, 848, 7, 79, 2, 2, 848, 849, 7, 71, 2, 2, 849, 850, 7, 80, 2, 2, 850, 851, 7, 86, 2, 2, 851, 92, 3, 2, 2, 2, 852, 853, 7, 69, 2, 2, 853, 854, 7, 81, 2, 2, 854, 855, 7, 79, 2, 2, 855, 856, 7, 79, 2, 2, 856, 857, 7, 75, 2, 2, 857, 858, 7, 86, 2, 2, 858, 94, 3, 2, 2, 2, 859, 860, 7, 69, 2, 2, 860, 861, 7, 81, 2, 2, 861, 862, 7, 79, 2, 2, 862, 863, 7, 82, 2, 2, 863, 864, 7, 67, 2, 2, 864, 865, 7, 69, 2, 2, 865, 866, 7, 86, 2, 2, 866, 96, 3, 2, 2, 2, 867, 868, 7, 69, 2, 2, 868, 869, 7, 81, 2, 2, 869, 870, 7, 79, 2, 2, 870, 871, 7, 82, 2, 2, 871, 872, 7, 67, 2, 2, 872, 873, 7, 69, 2, 2, 873, 874, 7, 86, 2, 2, 874, 875, 7, 75, 2, 2, 875, 876, 7, 81, 2, 2, 876, 877, 7, 80, 2, 2, 877, 878, 7, 85, 2, 2, 878, 98, 3, 2, 2, 2, 879, 880, 7, 69, 2, 2, 880, 881, 7, 81, 2, 2, 881, 882, 7, 79, 2, 2, 882, 883, 7, 82, 2, 2, 883, 884, 7, 87, 2, 2, 884, 885, 7, 86, 2, 2, 885, 886, 7, 71, 2, 2, 886, 100, 3, 2, 2, 2, 887, 888, 7, 69, 2, 2, 888, 889, 7, 81, 2, 2, 889, 890, 7, 80, 2, 2, 890, 891, 7, 69, 2, 2, 891, 892, 7, 67, 2, 2, 892, 893, 7, 86, 2, 2, 893, 894, 7, 71, 2, 2, 894, 895, 7, 80, 2, 2, 895, 896, 7, 67, 2, 2, 896, 897, 7, 86, 2, 2, 897, 898, 7, 71, 2, 2, 898, 102, 3, 2, 2, 2, 899, 900, 7, 69, 2, 2, 900, 901, 7, 81, 2, 2, 901, 902, 7, 80, 2, 2, 902, 903, 7, 85, 2, 2, 903, 904, 7, 86, 2, 2, 904, 905, 7, 84, 2, 2, 905, 906, 7, 67, 2, 2, 906, 907, 7, 75, 2, 2, 907, 908, 7, 80, 2, 2, 908, 909, 7, 86, 2, 2, 909, 104, 3, 2, 2, 2, 910, 911, 7, 69, 2, 2, 911, 912, 7, 81, 2, 2, 912, 913, 7, 85, 2, 2, 913, 914, 7, 86, 2, 2, 914, 106, 3, 2, 2, 2, 915, 916, 7, 69, 2, 2, 916, 917, 7, 84, 2, 2, 917, 918, 7, 71, 2, 2, 918, 919, 7, 67, 2, 2, 919, 920, 7, 86, 2, 2, 920, 921, 7, 71, 2, 2, 921, 108, 3, 2, 2, 2, 922, 923, 7, 69, 2, 2, 923, 924, 7, 84, 2, 2, 924, 925, 7, 81, 2, 2, 925, 926, 7, 85, 2, 2, 926, 927, 7, 85, 2, 2, 927, 110, 3, 2, 2, 2, 928, 929, 7, 69, 2, 2, 929, 930, 7, 87, 2, 2, 930, 931, 7, 68, 2, 2, 931, 932, 7, 71, 2, 2, 932, 112, 3, 2, 2, 2, 933, 934, 7, 69, 2, 2, 934, 935, 7, 87, 2, 2, 935, 936, 7, 84, 2, 2, 936, 937, 7, 84, 2, 2, 937, 938, 7, 71, 2, 2, 938, 939, 7, 80, 2, 2, 939, 940, 7, 86, 2, 2, 940, 114, 3, 2, 2, 2, 941, 942, 7, 69, 2, 2, 942, 943, 7, 87, 2, 2, 943, 944, 7, 84, 2, 2, 944, 945, 7, 84, 2, 2, 945, 946, 7, 71, 2, 2, 946, 947, 7, 80, 2, 2, 947, 948, 7, 86, 2, 2, 948, 949, 7, 97, 2, 2, 949, 950, 7, 70, 2, 2, 950, 951, 7, 67, 2, 2, 951, 952, 7, 86, 2, 2, 952, 953, 7, 71, 2, 2, 953, 116, 3, 2, 2, 2, 954, 955, 7, 69, 2, 2, 955, 956, 7, 87, 2, 2, 956, 957, 7, 84, 2, 2, 957, 958, 7, 84, 2, 2, 958, 959, 7, 71, 2, 2, 959, 960, 7, 80, 2, 2, 960, 961, 7, 86, 2, 2, 961, 962, 7, 97, 2, 2, 962, 963, 7, 86, 2, 2, 963, 964, 7, 75, 2, 2, 964, 965, 7, 79, 2, 2, 965, 966, 7, 71, 2, 2, 966, 118, 3, 2, 2, 2, 967, 968, 7, 69, 2, 2, 968, 969, 7, 87, 2, 2, 969, 970, 7, 84, 2, 2, 970, 971, 7, 84, 2, 2, 971, 972, 7, 71, 2, 2, 972, 973, 7, 80, 2, 2, 973, 974, 7, 86, 2, 2, 974, 975, 7, 97, 2, 2, 975, 976, 7, 86, 2, 2, 976, 977, 7, 75, 2, 2, 977, 978, 7, 79, 2, 2, 978, 979, 7, 71, 2, 2, 979, 980, 7, 85, 2, 2, 980, 981, 7, 86, 2, 2, 981, 982, 7, 67, 2, 2, 982, 983, 7, 79, 2, 2, 983, 984, 7, 82, 2, 2, 984, 120, 3, 2, 2, 2, 985, 986, 7, 69, 2, 2, 986, 987, 7, 87, 2, 2, 987, 988, 7, 84, 2, 2, 988, 989, 7, 84, 2, 2, 989, 990, 7, 71, 2, 2, 990, 991, 7, 80, 2, 2, 991, 992, 7, 86, 2, 2, 992, 993, 7, 97, 2, 2, 993, 994, 7, 87, 2, 2, 994, 995, 7, 85, 2, 2, 995, 996, 7, 71, 2, 2, 996, 997, 7, 84, 2, 2, 997, 122, 3, 2, 2, 2, 998, 999, 7, 70, 2, 2, 999, 1000, 7, 67, 2, 2, 1000, 1001, 7, 86, 2, 2, 1001, 1002, 7, 67, 2, 2, 1002, 124, 3, 2, 2, 2, 1003, 1004, 7, 70, 2, 2, 1004, 1005, 7, 67, 2, 2, 1005, 1006, 7, 86, 2, 2, 1006, 1007, 7, 67, 2, 2, 1007, 1008, 7, 68, 2, 2, 1008, 1009, 7, 67, 2, 2, 1009, 1010, 7, 85, 2, 2, 1010, 1011, 7, 71, 2, 2, 1011, 126, 3, 2, 2, 2, 1012, 1013, 7, 70, 2, 2, 1013, 1014, 7, 67, 2, 2, 1014, 1015, 7, 86, 2, 2, 1015, 1016, 7, 67, 2, 2, 1016, 1017, 7, 68, 2, 2, 1017, 1018, 7, 67, 2, 2, 1018, 1019, 7, 85, 2, 2, 1019, 1020, 7, 71, 2, 2, 1020, 1029, 7, 85, 2, 2, 1021, 1022, 7, 85, 2, 2, 1022, 1023, 7, 69, 2, 2, 1023, 1024, 7, 74, 2, 2, 1024, 1025, 7, 71, 2, 2, 1025, 1026, 7, 79, 2, 2, 1026, 1027, 7, 67, 2, 2, 1027, 1029, 7, 85, 2, 2, 1028, 1012, 3, 2, 2, 2, 1028, 1021, 3, 2, 2, 2, 1029, 128, 3, 2, 2, 2, 1030, 1031, 7, 70, 2, 2, 1031, 1032, 7, 67, 2, 2, 1032, 1033, 7, 91, 2, 2, 1033, 130, 3, 2, 2, 2, 1034, 1035, 7, 70, 2, 2, 1035, 1036, 7, 68, 2, 2, 1036, 1037, 7, 82, 2, 2, 1037, 1038, 7, 84, 2, 2, 1038, 1039, 7, 81, 2, 2, 1039, 1040, 7, 82, 2, 2, 1040, 1041, 7, 71, 2, 2, 1041, 1042, 7, 84, 2, 2, 1042, 1043, 7, 86, 2, 2, 1043, 1044, 7, 75, 2, 2, 1044, 1045, 7, 71, 2, 2, 1045, 1046, 7, 85, 2, 2, 1046, 132, 3, 2, 2, 2, 1047, 1048, 7, 70, 2, 2, 1048, 1049, 7, 71, 2, 2, 1049, 1050, 7, 72, 2, 2, 1050, 1051, 7, 75, 2, 2, 1051, 1052, 7, 80, 2, 2, 1052, 1053, 7, 71, 2, 2, 1053, 1054, 7, 70, 2, 2, 1054, 134, 3, 2, 2, 2, 1055, 1056, 7, 70, 2, 2, 1056, 1057, 7, 71, 2, 2, 1057, 1058, 7, 78, 2, 2, 1058, 1059, 7, 71, 2, 2, 1059, 1060, 7, 86, 2, 2, 1060, 1061, 7, 71, 2, 2, 1061, 136, 3, 2, 2, 2, 1062, 1063, 7, 70, 2, 2, 1063, 1064, 7, 71, 2, 2, 1064, 1065, 7, 78, 2, 2, 1065, 1066, 7, 75, 2, 2, 1066, 1067, 7, 79, 2, 2, 1067, 1068, 7, 75, 2, 2, 1068, 1069, 7, 86, 2, 2, 1069, 1070, 7, 71, 2, 2, 1070, 1071, 7, 70, 2, 2, 1071, 138, 3, 2, 2, 2, 1072, 1073, 7, 70, 2, 2, 1073, 1074, 7, 71, 2, 2, 1074, 1075, 7, 85, 2, 2, 1075, 1076, 7, 69, 2, 2, 1076, 140, 3, 2, 2, 2, 1077, 1078, 7, 70, 2, 2, 1078, 1079, 7, 71, 2, 2, 1079, 1080, 7, 85, 2, 2, 1080, 1081, 7, 69, 2, 2, 1081, 1082, 7, 84, 2, 2, 1082, 1083, 7, 75, 2, 2, 1083, 1084, 7, 68, 2, 2, 1084, 1085, 7, 71, 2, 2, 1085, 142, 3, 2, 2, 2, 1086, 1087, 7, 70, 2, 2, 1087, 1088, 7, 72, 2, 2, 1088, 1089, 7, 85, 2, 2, 1089, 144, 3, 2, 2, 2, 1090, 1091, 7, 70, 2, 2, 1091, 1092, 7, 75, 2, 2, 1092, 1093, 7, 84, 2, 2, 1093, 1094, 7, 71, 2, 2, 1094, 1095, 7, 69, 2, 2, 1095, 1096, 7, 86, 2, 2, 1096, 1097, 7, 81, 2, 2, 1097, 1098, 7, 84, 2, 2, 1098, 1099, 7, 75, 2, 2, 1099, 1100, 7, 71, 2, 2, 1100, 1101, 7, 85, 2, 2, 1101, 146, 3, 2, 2, 2, 1102, 1103, 7, 70, 2, 2, 1103, 1104, 7, 75, 2, 2, 1104, 1105, 7, 84, 2, 2, 1105, 1106, 7, 71, 2, 2, 1106, 1107, 7, 69, 2, 2, 1107, 1108, 7, 86, 2, 2, 1108, 1109, 7, 81, 2, 2, 1109, 1110, 7, 84, 2, 2, 1110, 1111, 7, 91, 2, 2, 1111, 148, 3, 2, 2, 2, 1112, 1113, 7, 70, 2, 2, 1113, 1114, 7, 75, 2, 2, 1114, 1115, 7, 85, 2, 2, 1115, 1116, 7, 86, 2, 2, 1116, 1117, 7, 75, 2, 2, 1117, 1118, 7, 80, 2, 2, 1118, 1119, 7, 69, 2, 2, 1119, 1120, 7, 86, 2, 2, 1120, 150, 3, 2, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1123, 7, 75, 2, 2, 1123, 1124, 7, 85, 2, 2, 1124, 1125, 7, 86, 2, 2, 1125, 1126, 7, 84, 2, 2, 1126, 1127, 7, 75, 2, 2, 1127, 1128, 7, 68, 2, 2, 1128, 1129, 7, 87, 2, 2, 1129, 1130, 7, 86, 2, 2, 1130, 1131, 7, 71, 2, 2, 1131, 152, 3, 2, 2, 2, 1132, 1133, 7, 70, 2, 2, 1133, 1134, 7, 84, 2, 2, 1134, 1135, 7, 81, 2, 2, 1135, 1136, 7, 82, 2, 2, 1136, 154, 3, 2, 2, 2, 1137, 1138, 7, 71, 2, 2, 1138, 1139, 7, 78, 2, 2, 1139, 1140, 7, 85, 2, 2, 1140, 1141, 7, 71, 2, 2, 1141, 156, 3, 2, 2, 2, 1142, 1143, 7, 71, 2, 2, 1143, 1144, 7, 80, 2, 2, 1144, 1145, 7, 70, 2, 2, 1145, 158, 3, 2, 2, 2, 1146, 1147, 7, 71, 2, 2, 1147, 1148, 7, 85, 2, 2, 1148, 1149, 7, 69, 2, 2, 1149, 1150, 7, 67, 2, 2, 1150, 1151, 7, 82, 2, 2, 1151, 1152, 7, 71, 2, 2, 1152, 160, 3, 2, 2, 2, 1153, 1154, 7, 71, 2, 2, 1154, 1155, 7, 85, 2, 2, 1155, 1156, 7, 69, 2, 2, 1156, 1157, 7, 67, 2, 2, 1157, 1158, 7, 82, 2, 2, 1158, 1159, 7, 71, 2, 2, 1159, 1160, 7, 70, 2, 2, 1160, 162, 3, 2, 2, 2, 1161, 1162, 7, 71, 2, 2, 1162, 1163, 7, 90, 2, 2, 1163, 1164, 7, 69, 2, 2, 1164, 1165, 7, 71, 2, 2, 1165, 1166, 7, 82, 2, 2, 1166, 1167, 7, 86, 2, 2, 1167, 164, 3, 2, 2, 2, 1168, 1169, 7, 71, 2, 2, 1169, 1170, 7, 90, 2, 2, 1170, 1171, 7, 69, 2, 2, 1171, 1172, 7, 74, 2, 2, 1172, 1173, 7, 67, 2, 2, 1173, 1174, 7, 80, 2, 2, 1174, 1175, 7, 73, 2, 2, 1175, 1176, 7, 71, 2, 2, 1176, 166, 3, 2, 2, 2, 1177, 1178, 7, 71, 2, 2, 1178, 1179, 7, 90, 2, 2, 1179, 1180, 7, 75, 2, 2, 1180, 1181, 7, 85, 2, 2, 1181, 1182, 7, 86, 2, 2, 1182, 1183, 7, 85, 2, 2, 1183, 168, 3, 2, 2, 2, 1184, 1185, 7, 71, 2, 2, 1185, 1186, 7, 90, 2, 2, 1186, 1187, 7, 82, 2, 2, 1187, 1188, 7, 78, 2, 2, 1188, 1189, 7, 67, 2, 2, 1189, 1190, 7, 75, 2, 2, 1190, 1191, 7, 80, 2, 2, 1191, 170, 3, 2, 2, 2, 1192, 1193, 7, 71, 2, 2, 1193, 1194, 7, 90, 2, 2, 1194, 1195, 7, 82, 2, 2, 1195, 1196, 7, 81, 2, 2, 1196, 1197, 7, 84, 2, 2, 1197, 1198, 7, 86, 2, 2, 1198, 172, 3, 2, 2, 2, 1199, 1200, 7, 71, 2, 2, 1200, 1201, 7, 90, 2, 2, 1201, 1202, 7, 86, 2, 2, 1202, 1203, 7, 71, 2, 2, 1203, 1204, 7, 80, 2, 2, 1204, 1205, 7, 70, 2, 2, 1205, 1206, 7, 71, 2, 2, 1206, 1207, 7, 70, 2, 2, 1207, 174, 3, 2, 2, 2, 1208, 1209, 7, 71, 2, 2, 1209, 1210, 7, 90, 2, 2, 1210, 1211, 7, 86, 2, 2, 1211, 1212, 7, 71, 2, 2, 1212, 1213, 7, 84, 2, 2, 1213, 1214, 7, 80, 2, 2, 1214, 1215, 7, 67, 2, 2, 1215, 1216, 7, 78, 2, 2, 1216, 176, 3, 2, 2, 2, 1217, 1218, 7, 71, 2, 2, 1218, 1219, 7, 90, 2, 2, 1219, 1220, 7, 86, 2, 2, 1220, 1221, 7, 84, 2, 2, 1221, 1222, 7, 67, 2, 2, 1222, 1223, 7, 69, 2, 2, 1223, 1224, 7, 86, 2, 2, 1224, 178, 3, 2, 2, 2, 1225, 1226, 7, 72, 2, 2, 1226, 1227, 7, 67, 2, 2, 1227, 1228, 7, 78, 2, 2, 1228, 1229, 7, 85, 2, 2, 1229, 1230, 7, 71, 2, 2, 1230, 180, 3, 2, 2, 2, 1231, 1232, 7, 72, 2, 2, 1232, 1233, 7, 71, 2, 2, 1233, 1234, 7, 86, 2, 2, 1234, 1235, 7, 69, 2, 2, 1235, 1236, 7, 74, 2, 2, 1236, 182, 3, 2, 2, 2, 1237, 1238, 7, 72, 2, 2, 1238, 1239, 7, 75, 2, 2, 1239, 1240, 7, 71, 2, 2, 1240, 1241, 7, 78, 2, 2, 1241, 1242, 7, 70, 2, 2, 1242, 1243, 7, 85, 2, 2, 1243, 184, 3, 2, 2, 2, 1244, 1245, 7, 72, 2, 2, 1245, 1246, 7, 75, 2, 2, 1246, 1247, 7, 78, 2, 2, 1247, 1248, 7, 86, 2, 2, 1248, 1249, 7, 71, 2, 2, 1249, 1250, 7, 84, 2, 2, 1250, 186, 3, 2, 2, 2, 1251, 1252, 7, 72, 2, 2, 1252, 1253, 7, 75, 2, 2, 1253, 1254, 7, 78, 2, 2, 1254, 1255, 7, 71, 2, 2, 1255, 1256, 7, 72, 2, 2, 1256, 1257, 7, 81, 2, 2, 1257, 1258, 7, 84, 2, 2, 1258, 1259, 7, 79, 2, 2, 1259, 1260, 7, 67, 2, 2, 1260, 1261, 7, 86, 2, 2, 1261, 188, 3, 2, 2, 2, 1262, 1263, 7, 72, 2, 2, 1263, 1264, 7, 75, 2, 2, 1264, 1265, 7, 84, 2, 2, 1265, 1266, 7, 85, 2, 2, 1266, 1267, 7, 86, 2, 2, 1267, 190, 3, 2, 2, 2, 1268, 1269, 7, 72, 2, 2, 1269, 1270, 7, 81, 2, 2, 1270, 1271, 7, 78, 2, 2, 1271, 1272, 7, 78, 2, 2, 1272, 1273, 7, 81, 2, 2, 1273, 1274, 7, 89, 2, 2, 1274, 1275, 7, 75, 2, 2, 1275, 1276, 7, 80, 2, 2, 1276, 1277, 7, 73, 2, 2, 1277, 192, 3, 2, 2, 2, 1278, 1279, 7, 72, 2, 2, 1279, 1280, 7, 81, 2, 2, 1280, 1281, 7, 84, 2, 2, 1281, 194, 3, 2, 2, 2, 1282, 1283, 7, 72, 2, 2, 1283, 1284, 7, 81, 2, 2, 1284, 1285, 7, 84, 2, 2, 1285, 1286, 7, 71, 2, 2, 1286, 1287, 7, 75, 2, 2, 1287, 1288, 7, 73, 2, 2, 1288, 1289, 7, 80, 2, 2, 1289, 196, 3, 2, 2, 2, 1290, 1291, 7, 72, 2, 2, 1291, 1292, 7, 81, 2, 2, 1292, 1293, 7, 84, 2, 2, 1293, 1294, 7, 79, 2, 2, 1294, 1295, 7, 67, 2, 2, 1295, 1296, 7, 86, 2, 2, 1296, 198, 3, 2, 2, 2, 1297, 1298, 7, 72, 2, 2, 1298, 1299, 7, 81, 2, 2, 1299, 1300, 7, 84, 2, 2, 1300, 1301, 7, 79, 2, 2, 1301, 1302, 7, 67, 2, 2, 1302, 1303, 7, 86, 2, 2, 1303, 1304, 7, 86, 2, 2, 1304, 1305, 7, 71, 2, 2, 1305, 1306, 7, 70, 2, 2, 1306, 200, 3, 2, 2, 2, 1307, 1308, 7, 72, 2, 2, 1308, 1309, 7, 84, 2, 2, 1309, 1310, 7, 81, 2, 2, 1310, 1311, 7, 79, 2, 2, 1311, 202, 3, 2, 2, 2, 1312, 1313, 7, 72, 2, 2, 1313, 1314, 7, 87, 2, 2, 1314, 1315, 7, 78, 2, 2, 1315, 1316, 7, 78, 2, 2, 1316, 204, 3, 2, 2, 2, 1317, 1318, 7, 72, 2, 2, 1318, 1319, 7, 87, 2, 2, 1319, 1320, 7, 80, 2, 2, 1320, 1321, 7, 69, 2, 2, 1321, 1322, 7, 86, 2, 2, 1322, 1323, 7, 75, 2, 2, 1323, 1324, 7, 81, 2, 2, 1324, 1325, 7, 80, 2, 2, 1325, 206, 3, 2, 2, 2, 1326, 1327, 7, 72, 2, 2, 1327, 1328, 7, 87, 2, 2, 1328, 1329, 7, 80, 2, 2, 1329, 1330, 7, 69, 2, 2, 1330, 1331, 7, 86, 2, 2, 1331, 1332, 7, 75, 2, 2, 1332, 1333, 7, 81, 2, 2, 1333, 1334, 7, 80, 2, 2, 1334, 1335, 7, 85, 2, 2, 1335, 208, 3, 2, 2, 2, 1336, 1337, 7, 73, 2, 2, 1337, 1338, 7, 78, 2, 2, 1338, 1339, 7, 81, 2, 2, 1339, 1340, 7, 68, 2, 2, 1340, 1341, 7, 67, 2, 2, 1341, 1342, 7, 78, 2, 2, 1342, 210, 3, 2, 2, 2, 1343, 1344, 7, 73, 2, 2, 1344, 1345, 7, 84, 2, 2, 1345, 1346, 7, 67, 2, 2, 1346, 1347, 7, 80, 2, 2, 1347, 1348, 7, 86, 2, 2, 1348, 212, 3, 2, 2, 2, 1349, 1350, 7, 73, 2, 2, 1350, 1351, 7, 84, 2, 2, 1351, 1352, 7, 81, 2, 2, 1352, 1353, 7, 87, 2, 2, 1353, 1354, 7, 82, 2, 2, 1354, 214, 3, 2, 2, 2, 1355, 1356, 7, 73, 2, 2, 1356, 1357, 7, 84, 2, 2, 1357, 1358, 7, 81, 2, 2, 1358, 1359, 7, 87, 2, 2, 1359, 1360, 7, 82, 2, 2, 1360, 1361, 7, 75, 2, 2, 1361, 1362, 7, 80, 2, 2, 1362, 1363, 7, 73, 2, 2, 1363, 216, 3, 2, 2, 2, 1364, 1365, 7, 74, 2, 2, 1365, 1366, 7, 67, 2, 2, 1366, 1367, 7, 88, 2, 2, 1367, 1368, 7, 75, 2, 2, 1368, 1369, 7, 80, 2, 2, 1369, 1370, 7, 73, 2, 2, 1370, 218, 3, 2, 2, 2, 1371, 1372, 7, 74, 2, 2, 1372, 1373, 7, 81, 2, 2, 1373, 1374, 7, 87, 2, 2, 1374, 1375, 7, 84, 2, 2, 1375, 220, 3, 2, 2, 2, 1376, 1377, 7, 75, 2, 2, 1377, 1378, 7, 72, 2, 2, 1378, 222, 3, 2, 2, 2, 1379, 1380, 7, 75, 2, 2, 1380, 1381, 7, 73, 2, 2, 1381, 1382, 7, 80, 2, 2, 1382, 1383, 7, 81, 2, 2, 1383, 1384, 7, 84, 2, 2, 1384, 1385, 7, 71, 2, 2, 1385, 224, 3, 2, 2, 2, 1386, 1387, 7, 75, 2, 2, 1387, 1388, 7, 79, 2, 2, 1388, 1389, 7, 82, 2, 2, 1389, 1390, 7, 81, 2, 2, 1390, 1391, 7, 84, 2, 2, 1391, 1392, 7, 86, 2, 2, 1392, 226, 3, 2, 2, 2, 1393, 1394, 7, 75, 2, 2, 1394, 1395, 7, 80, 2, 2, 1395, 228, 3, 2, 2, 2, 1396, 1397, 7, 75, 2, 2, 1397, 1398, 7, 80, 2, 2, 1398, 1399, 7, 70, 2, 2, 1399, 1400, 7, 71, 2, 2, 1400, 1401, 7, 90, 2, 2, 1401, 230, 3, 2, 2, 2, 1402, 1403, 7, 75, 2, 2, 1403, 1404, 7, 80, 2, 2, 1404, 1405, 7, 70, 2, 2, 1405, 1406, 7, 71, 2, 2, 1406, 1407, 7, 90, 2, 2, 1407, 1408, 7, 71, 2, 2, 1408, 1409, 7, 85, 2, 2, 1409, 232, 3, 2, 2, 2, 1410, 1411, 7, 75, 2, 2, 1411, 1412, 7, 80, 2, 2, 1412, 1413, 7, 80, 2, 2, 1413, 1414, 7, 71, 2, 2, 1414, 1415, 7, 84, 2, 2, 1415, 234, 3, 2, 2, 2, 1416, 1417, 7, 75, 2, 2, 1417, 1418, 7, 80, 2, 2, 1418, 1419, 7, 82, 2, 2, 1419, 1420, 7, 67, 2, 2, 1420, 1421, 7, 86, 2, 2, 1421, 1422, 7, 74, 2, 2, 1422, 236, 3, 2, 2, 2, 1423, 1424, 7, 75, 2, 2, 1424, 1425, 7, 80, 2, 2, 1425, 1426, 7, 82, 2, 2, 1426, 1427, 7, 87, 2, 2, 1427, 1428, 7, 86, 2, 2, 1428, 1429, 7, 72, 2, 2, 1429, 1430, 7, 81, 2, 2, 1430, 1431, 7, 84, 2, 2, 1431, 1432, 7, 79, 2, 2, 1432, 1433, 7, 67, 2, 2, 1433, 1434, 7, 86, 2, 2, 1434, 238, 3, 2, 2, 2, 1435, 1436, 7, 75, 2, 2, 1436, 1437, 7, 80, 2, 2, 1437, 1438, 7, 85, 2, 2, 1438, 1439, 7, 71, 2, 2, 1439, 1440, 7, 84, 2, 2, 1440, 1441, 7, 86, 2, 2, 1441, 240, 3, 2, 2, 2, 1442, 1443, 7, 75, 2, 2, 1443, 1444, 7, 80, 2, 2, 1444, 1445, 7, 86, 2, 2, 1445, 1446, 7, 71, 2, 2, 1446, 1447, 7, 84, 2, 2, 1447, 1448, 7, 85, 2, 2, 1448, 1449, 7, 71, 2, 2, 1449, 1450, 7, 69, 2, 2, 1450, 1451, 7, 86, 2, 2, 1451, 242, 3, 2, 2, 2, 1452, 1453, 7, 75, 2, 2, 1453, 1454, 7, 80, 2, 2, 1454, 1455, 7, 86, 2, 2, 1455, 1456, 7, 71, 2, 2, 1456, 1457, 7, 84, 2, 2, 1457, 1458, 7, 88, 2, 2, 1458, 1459, 7, 67, 2, 2, 1459, 1460, 7, 78, 2, 2, 1460, 244, 3, 2, 2, 2, 1461, 1462, 7, 75, 2, 2, 1462, 1463, 7, 80, 2, 2, 1463, 1464, 7, 86, 2, 2, 1464, 1465, 7, 81, 2, 2, 1465, 246, 3, 2, 2, 2, 1466, 1467, 7, 75, 2, 2, 1467, 1468, 7, 85, 2, 2, 1468, 248, 3, 2, 2, 2, 1469, 1470, 7, 75, 2, 2, 1470, 1471, 7, 86, 2, 2, 1471, 1472, 7, 71, 2, 2, 1472, 1473, 7, 79, 2, 2, 1473, 1474, 7, 85, 2, 2, 1474, 250, 3, 2, 2, 2, 1475, 1476, 7, 76, 2, 2, 1476, 1477, 7, 81, 2, 2, 1477, 1478, 7, 75, 2, 2, 1478, 1479, 7, 80, 2, 2, 1479, 252, 3, 2, 2, 2, 1480, 1481, 7, 77, 2, 2, 1481, 1482, 7, 71, 2, 2, 1482, 1483, 7, 91, 2, 2, 1483, 1484, 7, 85, 2, 2, 1484, 254, 3, 2, 2, 2, 1485, 1486, 7, 78, 2, 2, 1486, 1487, 7, 67, 2, 2, 1487, 1488, 7, 85, 2, 2, 1488, 1489, 7, 86, 2, 2, 1489, 256, 3, 2, 2, 2, 1490, 1491, 7, 78, 2, 2, 1491, 1492, 7, 67, 2, 2, 1492, 1493, 7, 86, 2, 2, 1493, 1494, 7, 71, 2, 2, 1494, 1495, 7, 84, 2, 2, 1495, 1496, 7, 67, 2, 2, 1496, 1497, 7, 78, 2, 2, 1497, 258, 3, 2, 2, 2, 1498, 1499, 7, 78, 2, 2, 1499, 1500, 7, 67, 2, 2, 1500, 1501, 7, 92, 2, 2, 1501, 1502, 7, 91, 2, 2, 1502, 260, 3, 2, 2, 2, 1503, 1504, 7, 78, 2, 2, 1504, 1505, 7, 71, 2, 2, 1505, 1506, 7, 67, 2, 2, 1506, 1507, 7, 70, 2, 2, 1507, 1508, 7, 75, 2, 2, 1508, 1509, 7, 80, 2, 2, 1509, 1510, 7, 73, 2, 2, 1510, 262, 3, 2, 2, 2, 1511, 1512, 7, 78, 2, 2, 1512, 1513, 7, 71, 2, 2, 1513, 1514, 7, 72, 2, 2, 1514, 1515, 7, 86, 2, 2, 1515, 264, 3, 2, 2, 2, 1516, 1517, 7, 78, 2, 2, 1517, 1518, 7, 75, 2, 2, 1518, 1519, 7, 77, 2, 2, 1519, 1520, 7, 71, 2, 2, 1520, 266, 3, 2, 2, 2, 1521, 1522, 7, 78, 2, 2, 1522, 1523, 7, 75, 2, 2, 1523, 1524, 7, 79, 2, 2, 1524, 1525, 7, 75, 2, 2, 1525, 1526, 7, 86, 2, 2, 1526, 268, 3, 2, 2, 2, 1527, 1528, 7, 78, 2, 2, 1528, 1529, 7, 75, 2, 2, 1529, 1530, 7, 80, 2, 2, 1530, 1531, 7, 71, 2, 2, 1531, 1532, 7, 85, 2, 2, 1532, 270, 3, 2, 2, 2, 1533, 1534, 7, 78, 2, 2, 1534, 1535, 7, 75, 2, 2, 1535, 1536, 7, 85, 2, 2, 1536, 1537, 7, 86, 2, 2, 1537, 272, 3, 2, 2, 2, 1538, 1539, 7, 78, 2, 2, 1539, 1540, 7, 81, 2, 2, 1540, 1541, 7, 67, 2, 2, 1541, 1542, 7, 70, 2, 2, 1542, 274, 3, 2, 2, 2, 1543, 1544, 7, 78, 2, 2, 1544, 1545, 7, 81, 2, 2, 1545, 1546, 7, 69, 2, 2, 1546, 1547, 7, 67, 2, 2, 1547, 1548, 7, 78, 2, 2, 1548, 276, 3, 2, 2, 2, 1549, 1550, 7, 78, 2, 2, 1550, 1551, 7, 81, 2, 2, 1551, 1552, 7, 69, 2, 2, 1552, 1553, 7, 67, 2, 2, 1553, 1554, 7, 86, 2, 2, 1554, 1555, 7, 75, 2, 2, 1555, 1556, 7, 81, 2, 2, 1556, 1557, 7, 80, 2, 2, 1557, 278, 3, 2, 2, 2, 1558, 1559, 7, 78, 2, 2, 1559, 1560, 7, 81, 2, 2, 1560, 1561, 7, 69, 2, 2, 1561, 1562, 7, 77, 2, 2, 1562, 280, 3, 2, 2, 2, 1563, 1564, 7, 78, 2, 2, 1564, 1565, 7, 81, 2, 2, 1565, 1566, 7, 69, 2, 2, 1566, 1567, 7, 77, 2, 2, 1567, 1568, 7, 85, 2, 2, 1568, 282, 3, 2, 2, 2, 1569, 1570, 7, 78, 2, 2, 1570, 1571, 7, 81, 2, 2, 1571, 1572, 7, 73, 2, 2, 1572, 1573, 7, 75, 2, 2, 1573, 1574, 7, 69, 2, 2, 1574, 1575, 7, 67, 2, 2, 1575, 1576, 7, 78, 2, 2, 1576, 284, 3, 2, 2, 2, 1577, 1578, 7, 79, 2, 2, 1578, 1579, 7, 67, 2, 2, 1579, 1580, 7, 69, 2, 2, 1580, 1581, 7, 84, 2, 2, 1581, 1582, 7, 81, 2, 2, 1582, 286, 3, 2, 2, 2, 1583, 1584, 7, 79, 2, 2, 1584, 1585, 7, 67, 2, 2, 1585, 1586, 7, 82, 2, 2, 1586, 288, 3, 2, 2, 2, 1587, 1588, 7, 79, 2, 2, 1588, 1589, 7, 67, 2, 2, 1589, 1590, 7, 86, 2, 2, 1590, 1591, 7, 69, 2, 2, 1591, 1592, 7, 74, 2, 2, 1592, 1593, 7, 71, 2, 2, 1593, 1594, 7, 70, 2, 2, 1594, 290, 3, 2, 2, 2, 1595, 1596, 7, 79, 2, 2, 1596, 1597, 7, 71, 2, 2, 1597, 1598, 7, 84, 2, 2, 1598, 1599, 7, 73, 2, 2, 1599, 1600, 7, 71, 2, 2, 1600, 292, 3, 2, 2, 2, 1601, 1602, 7, 79, 2, 2, 1602, 1603, 7, 75, 2, 2, 1603, 1604, 7, 80, 2, 2, 1604, 1605, 7, 87, 2, 2, 1605, 1606, 7, 86, 2, 2, 1606, 1607, 7, 71, 2, 2, 1607, 294, 3, 2, 2, 2, 1608, 1609, 7, 79, 2, 2, 1609, 1610, 7, 81, 2, 2, 1610, 1611, 7, 80, 2, 2, 1611, 1612, 7, 86, 2, 2, 1612, 1613, 7, 74, 2, 2, 1613, 296, 3, 2, 2, 2, 1614, 1615, 7, 79, 2, 2, 1615, 1616, 7, 85, 2, 2, 1616, 1617, 7, 69, 2, 2, 1617, 1618, 7, 77, 2, 2, 1618, 298, 3, 2, 2, 2, 1619, 1620, 7, 80, 2, 2, 1620, 1621, 7, 67, 2, 2, 1621, 1622, 7, 79, 2, 2, 1622, 1623, 7, 71, 2, 2, 1623, 1624, 7, 85, 2, 2, 1624, 1625, 7, 82, 2, 2, 1625, 1626, 7, 67, 2, 2, 1626, 1627, 7, 69, 2, 2, 1627, 1628, 7, 71, 2, 2, 1628, 300, 3, 2, 2, 2, 1629, 1630, 7, 80, 2, 2, 1630, 1631, 7, 67, 2, 2, 1631, 1632, 7, 79, 2, 2, 1632, 1633, 7, 71, 2, 2, 1633, 1634, 7, 85, 2, 2, 1634, 1635, 7, 82, 2, 2, 1635, 1636, 7, 67, 2, 2, 1636, 1637, 7, 69, 2, 2, 1637, 1638, 7, 71, 2, 2, 1638, 1639, 7, 85, 2, 2, 1639, 302, 3, 2, 2, 2, 1640, 1641, 7, 80, 2, 2, 1641, 1642, 7, 67, 2, 2, 1642, 1643, 7, 86, 2, 2, 1643, 1644, 7, 87, 2, 2, 1644, 1645, 7, 84, 2, 2, 1645, 1646, 7, 67, 2, 2, 1646, 1647, 7, 78, 2, 2, 1647, 304, 3, 2, 2, 2, 1648, 1649, 7, 80, 2, 2, 1649, 1650, 7, 81, 2, 2, 1650, 306, 3, 2, 2, 2, 1651, 1652, 7, 80, 2, 2, 1652, 1653, 7, 81, 2, 2, 1653, 1656, 7, 86, 2, 2, 1654, 1656, 7, 35, 2, 2, 1655, 1651, 3, 2, 2, 2, 1655, 1654, 3, 2, 2, 2, 1656, 308, 3, 2, 2, 2, 1657, 1658, 7, 80, 2, 2, 1658, 1659, 7, 87, 2, 2, 1659, 1660, 7, 78, 2, 2, 1660, 1661, 7, 78, 2, 2, 1661, 310, 3, 2, 2, 2, 1662, 1663, 7, 80, 2, 2, 1663, 1664, 7, 87, 2, 2, 1664, 1665, 7, 78, 2, 2, 1665, 1666, 7, 78, 2, 2, 1666, 1667, 7, 85, 2, 2, 1667, 312, 3, 2, 2, 2, 1668, 1669, 7, 81, 2, 2, 1669, 1670, 7, 72, 2, 2, 1670, 314, 3, 2, 2, 2, 1671, 1672, 7, 81, 2, 2, 1672, 1673, 7, 80, 2, 2, 1673, 316, 3, 2, 2, 2, 1674, 1675, 7, 81, 2, 2, 1675, 1676, 7, 80, 2, 2, 1676, 1677, 7, 78, 2, 2, 1677, 1678, 7, 91, 2, 2, 1678, 318, 3, 2, 2, 2, 1679, 1680, 7, 81, 2, 2, 1680, 1681, 7, 82, 2, 2, 1681, 1682, 7, 86, 2, 2, 1682, 1683, 7, 75, 2, 2, 1683, 1684, 7, 81, 2, 2, 1684, 1685, 7, 80, 2, 2, 1685, 320, 3, 2, 2, 2, 1686, 1687, 7, 81, 2, 2, 1687, 1688, 7, 82, 2, 2, 1688, 1689, 7, 86, 2, 2, 1689, 1690, 7, 75, 2, 2, 1690, 1691, 7, 81, 2, 2, 1691, 1692, 7, 80, 2, 2, 1692, 1693, 7, 85, 2, 2, 1693, 322, 3, 2, 2, 2, 1694, 1695, 7, 81, 2, 2, 1695, 1696, 7, 84, 2, 2, 1696, 324, 3, 2, 2, 2, 1697, 1698, 7, 81, 2, 2, 1698, 1699, 7, 84, 2, 2, 1699, 1700, 7, 70, 2, 2, 1700, 1701, 7, 71, 2, 2, 1701, 1702, 7, 84, 2, 2, 1702, 326, 3, 2, 2, 2, 1703, 1704, 7, 81, 2, 2, 1704, 1705, 7, 87, 2, 2, 1705, 1706, 7, 86, 2, 2, 1706, 328, 3, 2, 2, 2, 1707, 1708, 7, 81, 2, 2, 1708, 1709, 7, 87, 2, 2, 1709, 1710, 7, 86, 2, 2, 1710, 1711, 7, 71, 2, 2, 1711, 1712, 7, 84, 2, 2, 1712, 330, 3, 2, 2, 2, 1713, 1714, 7, 81, 2, 2, 1714, 1715, 7, 87, 2, 2, 1715, 1716, 7, 86, 2, 2, 1716, 1717, 7, 82, 2, 2, 1717, 1718, 7, 87, 2, 2, 1718, 1719, 7, 86, 2, 2, 1719, 1720, 7, 72, 2, 2, 1720, 1721, 7, 81, 2, 2, 1721, 1722, 7, 84, 2, 2, 1722, 1723, 7, 79, 2, 2, 1723, 1724, 7, 67, 2, 2, 1724, 1725, 7, 86, 2, 2, 1725, 332, 3, 2, 2, 2, 1726, 1727, 7, 81, 2, 2, 1727, 1728, 7, 88, 2, 2, 1728, 1729, 7, 71, 2, 2, 1729, 1730, 7, 84, 2, 2, 1730, 334, 3, 2, 2, 2, 1731, 1732, 7, 81, 2, 2, 1732, 1733, 7, 88, 2, 2, 1733, 1734, 7, 71, 2, 2, 1734, 1735, 7, 84, 2, 2, 1735, 1736, 7, 78, 2, 2, 1736, 1737, 7, 67, 2, 2, 1737, 1738, 7, 82, 2, 2, 1738, 1739, 7, 85, 2, 2, 1739, 336, 3, 2, 2, 2, 1740, 1741, 7, 81, 2, 2, 1741, 1742, 7, 88, 2, 2, 1742, 1743, 7, 71, 2, 2, 1743, 1744, 7, 84, 2, 2, 1744, 1745, 7, 78, 2, 2, 1745, 1746, 7, 67, 2, 2, 1746, 1747, 7, 91, 2, 2, 1747, 338, 3, 2, 2, 2, 1748, 1749, 7, 81, 2, 2, 1749, 1750, 7, 88, 2, 2, 1750, 1751, 7, 71, 2, 2, 1751, 1752, 7, 84, 2, 2, 1752, 1753, 7, 89, 2, 2, 1753, 1754, 7, 84, 2, 2, 1754, 1755, 7, 75, 2, 2, 1755, 1756, 7, 86, 2, 2, 1756, 1757, 7, 71, 2, 2, 1757, 340, 3, 2, 2, 2, 1758, 1759, 7, 82, 2, 2, 1759, 1760, 7, 67, 2, 2, 1760, 1761, 7, 84, 2, 2, 1761, 1762, 7, 86, 2, 2, 1762, 1763, 7, 75, 2, 2, 1763, 1764, 7, 86, 2, 2, 1764, 1765, 7, 75, 2, 2, 1765, 1766, 7, 81, 2, 2, 1766, 1767, 7, 80, 2, 2, 1767, 342, 3, 2, 2, 2, 1768, 1769, 7, 82, 2, 2, 1769, 1770, 7, 67, 2, 2, 1770, 1771, 7, 84, 2, 2, 1771, 1772, 7, 86, 2, 2, 1772, 1773, 7, 75, 2, 2, 1773, 1774, 7, 86, 2, 2, 1774, 1775, 7, 75, 2, 2, 1775, 1776, 7, 81, 2, 2, 1776, 1777, 7, 80, 2, 2, 1777, 1778, 7, 71, 2, 2, 1778, 1779, 7, 70, 2, 2, 1779, 344, 3, 2, 2, 2, 1780, 1781, 7, 82, 2, 2, 1781, 1782, 7, 67, 2, 2, 1782, 1783, 7, 84, 2, 2, 1783, 1784, 7, 86, 2, 2, 1784, 1785, 7, 75, 2, 2, 1785, 1786, 7, 86, 2, 2, 1786, 1787, 7, 75, 2, 2, 1787, 1788, 7, 81, 2, 2, 1788, 1789, 7, 80, 2, 2, 1789, 1790, 7, 85, 2, 2, 1790, 346, 3, 2, 2, 2, 1791, 1792, 7, 82, 2, 2, 1792, 1793, 7, 71, 2, 2, 1793, 1794, 7, 84, 2, 2, 1794, 1795, 7, 69, 2, 2, 1795, 1796, 7, 71, 2, 2, 1796, 1797, 7, 80, 2, 2, 1797, 1798, 7, 86, 2, 2, 1798, 348, 3, 2, 2, 2, 1799, 1800, 7, 82, 2, 2, 1800, 1801, 7, 75, 2, 2, 1801, 1802, 7, 88, 2, 2, 1802, 1803, 7, 81, 2, 2, 1803, 1804, 7, 86, 2, 2, 1804, 350, 3, 2, 2, 2, 1805, 1806, 7, 82, 2, 2, 1806, 1807, 7, 78, 2, 2, 1807, 1808, 7, 67, 2, 2, 1808, 1809, 7, 69, 2, 2, 1809, 1810, 7, 75, 2, 2, 1810, 1811, 7, 80, 2, 2, 1811, 1812, 7, 73, 2, 2, 1812, 352, 3, 2, 2, 2, 1813, 1814, 7, 82, 2, 2, 1814, 1815, 7, 81, 2, 2, 1815, 1816, 7, 85, 2, 2, 1816, 1817, 7, 75, 2, 2, 1817, 1818, 7, 86, 2, 2, 1818, 1819, 7, 75, 2, 2, 1819, 1820, 7, 81, 2, 2, 1820, 1821, 7, 80, 2, 2, 1821, 354, 3, 2, 2, 2, 1822, 1823, 7, 82, 2, 2, 1823, 1824, 7, 84, 2, 2, 1824, 1825, 7, 71, 2, 2, 1825, 1826, 7, 69, 2, 2, 1826, 1827, 7, 71, 2, 2, 1827, 1828, 7, 70, 2, 2, 1828, 1829, 7, 75, 2, 2, 1829, 1830, 7, 80, 2, 2, 1830, 1831, 7, 73, 2, 2, 1831, 356, 3, 2, 2, 2, 1832, 1833, 7, 82, 2, 2, 1833, 1834, 7, 84, 2, 2, 1834, 1835, 7, 75, 2, 2, 1835, 1836, 7, 79, 2, 2, 1836, 1837, 7, 67, 2, 2, 1837, 1838, 7, 84, 2, 2, 1838, 1839, 7, 91, 2, 2, 1839, 358, 3, 2, 2, 2, 1840, 1841, 7, 82, 2, 2, 1841, 1842, 7, 84, 2, 2, 1842, 1843, 7, 75, 2, 2, 1843, 1844, 7, 80, 2, 2, 1844, 1845, 7, 69, 2, 2, 1845, 1846, 7, 75, 2, 2, 1846, 1847, 7, 82, 2, 2, 1847, 1848, 7, 67, 2, 2, 1848, 1849, 7, 78, 2, 2, 1849, 1850, 7, 85, 2, 2, 1850, 360, 3, 2, 2, 2, 1851, 1852, 7, 82, 2, 2, 1852, 1853, 7, 84, 2, 2, 1853, 1854, 7, 81, 2, 2, 1854, 1855, 7, 82, 2, 2, 1855, 1856, 7, 71, 2, 2, 1856, 1857, 7, 84, 2, 2, 1857, 1858, 7, 86, 2, 2, 1858, 1859, 7, 75, 2, 2, 1859, 1860, 7, 71, 2, 2, 1860, 1861, 7, 85, 2, 2, 1861, 362, 3, 2, 2, 2, 1862, 1863, 7, 82, 2, 2, 1863, 1864, 7, 87, 2, 2, 1864, 1865, 7, 84, 2, 2, 1865, 1866, 7, 73, 2, 2, 1866, 1867, 7, 71, 2, 2, 1867, 364, 3, 2, 2, 2, 1868, 1869, 7, 83, 2, 2, 1869, 1870, 7, 87, 2, 2, 1870, 1871, 7, 71, 2, 2, 1871, 1872, 7, 84, 2, 2, 1872, 1873, 7, 91, 2, 2, 1873, 366, 3, 2, 2, 2, 1874, 1875, 7, 84, 2, 2, 1875, 1876, 7, 67, 2, 2, 1876, 1877, 7, 80, 2, 2, 1877, 1878, 7, 73, 2, 2, 1878, 1879, 7, 71, 2, 2, 1879, 368, 3, 2, 2, 2, 1880, 1881, 7, 84, 2, 2, 1881, 1882, 7, 71, 2, 2, 1882, 1883, 7, 69, 2, 2, 1883, 1884, 7, 81, 2, 2, 1884, 1885, 7, 84, 2, 2, 1885, 1886, 7, 70, 2, 2, 1886, 1887, 7, 84, 2, 2, 1887, 1888, 7, 71, 2, 2, 1888, 1889, 7, 67, 2, 2, 1889, 1890, 7, 70, 2, 2, 1890, 1891, 7, 71, 2, 2, 1891, 1892, 7, 84, 2, 2, 1892, 370, 3, 2, 2, 2, 1893, 1894, 7, 84, 2, 2, 1894, 1895, 7, 71, 2, 2, 1895, 1896, 7, 69, 2, 2, 1896, 1897, 7, 81, 2, 2, 1897, 1898, 7, 84, 2, 2, 1898, 1899, 7, 70, 2, 2, 1899, 1900, 7, 89, 2, 2, 1900, 1901, 7, 84, 2, 2, 1901, 1902, 7, 75, 2, 2, 1902, 1903, 7, 86, 2, 2, 1903, 1904, 7, 71, 2, 2, 1904, 1905, 7, 84, 2, 2, 1905, 372, 3, 2, 2, 2, 1906, 1907, 7, 84, 2, 2, 1907, 1908, 7, 71, 2, 2, 1908, 1909, 7, 69, 2, 2, 1909, 1910, 7, 81, 2, 2, 1910, 1911, 7, 88, 2, 2, 1911, 1912, 7, 71, 2, 2, 1912, 1913, 7, 84, 2, 2, 1913, 374, 3, 2, 2, 2, 1914, 1915, 7, 84, 2, 2, 1915, 1916, 7, 71, 2, 2, 1916, 1917, 7, 70, 2, 2, 1917, 1918, 7, 87, 2, 2, 1918, 1919, 7, 69, 2, 2, 1919, 1920, 7, 71, 2, 2, 1920, 376, 3, 2, 2, 2, 1921, 1922, 7, 84, 2, 2, 1922, 1923, 7, 71, 2, 2, 1923, 1924, 7, 72, 2, 2, 1924, 1925, 7, 71, 2, 2, 1925, 1926, 7, 84, 2, 2, 1926, 1927, 7, 71, 2, 2, 1927, 1928, 7, 80, 2, 2, 1928, 1929, 7, 69, 2, 2, 1929, 1930, 7, 71, 2, 2, 1930, 1931, 7, 85, 2, 2, 1931, 378, 3, 2, 2, 2, 1932, 1933, 7, 84, 2, 2, 1933, 1934, 7, 71, 2, 2, 1934, 1935, 7, 72, 2, 2, 1935, 1936, 7, 84, 2, 2, 1936, 1937, 7, 71, 2, 2, 1937, 1938, 7, 85, 2, 2, 1938, 1939, 7, 74, 2, 2, 1939, 380, 3, 2, 2, 2, 1940, 1941, 7, 84, 2, 2, 1941, 1942, 7, 71, 2, 2, 1942, 1943, 7, 80, 2, 2, 1943, 1944, 7, 67, 2, 2, 1944, 1945, 7, 79, 2, 2, 1945, 1946, 7, 71, 2, 2, 1946, 382, 3, 2, 2, 2, 1947, 1948, 7, 84, 2, 2, 1948, 1949, 7, 71, 2, 2, 1949, 1950, 7, 82, 2, 2, 1950, 1951, 7, 67, 2, 2, 1951, 1952, 7, 75, 2, 2, 1952, 1953, 7, 84, 2, 2, 1953, 384, 3, 2, 2, 2, 1954, 1955, 7, 84, 2, 2, 1955, 1956, 7, 71, 2, 2, 1956, 1957, 7, 82, 2, 2, 1957, 1958, 7, 78, 2, 2, 1958, 1959, 7, 67, 2, 2, 1959, 1960, 7, 69, 2, 2, 1960, 1961, 7, 71, 2, 2, 1961, 386, 3, 2, 2, 2, 1962, 1963, 7, 84, 2, 2, 1963, 1964, 7, 71, 2, 2, 1964, 1965, 7, 85, 2, 2, 1965, 1966, 7, 71, 2, 2, 1966, 1967, 7, 86, 2, 2, 1967, 388, 3, 2, 2, 2, 1968, 1969, 7, 84, 2, 2, 1969, 1970, 7, 71, 2, 2, 1970, 1971, 7, 85, 2, 2, 1971, 1972, 7, 86, 2, 2, 1972, 1973, 7, 84, 2, 2, 1973, 1974, 7, 75, 2, 2, 1974, 1975, 7, 69, 2, 2, 1975, 1976, 7, 86, 2, 2, 1976, 390, 3, 2, 2, 2, 1977, 1978, 7, 84, 2, 2, 1978, 1979, 7, 71, 2, 2, 1979, 1980, 7, 88, 2, 2, 1980, 1981, 7, 81, 2, 2, 1981, 1982, 7, 77, 2, 2, 1982, 1983, 7, 71, 2, 2, 1983, 392, 3, 2, 2, 2, 1984, 1985, 7, 84, 2, 2, 1985, 1986, 7, 75, 2, 2, 1986, 1987, 7, 73, 2, 2, 1987, 1988, 7, 74, 2, 2, 1988, 1989, 7, 86, 2, 2, 1989, 394, 3, 2, 2, 2, 1990, 1991, 7, 84, 2, 2, 1991, 1992, 7, 78, 2, 2, 1992, 1993, 7, 75, 2, 2, 1993, 1994, 7, 77, 2, 2, 1994, 2002, 7, 71, 2, 2, 1995, 1996, 7, 84, 2, 2, 1996, 1997, 7, 71, 2, 2, 1997, 1998, 7, 73, 2, 2, 1998, 1999, 7, 71, 2, 2, 1999, 2000, 7, 90, 2, 2, 2000, 2002, 7, 82, 2, 2, 2001, 1990, 3, 2, 2, 2, 2001, 1995, 3, 2, 2, 2, 2002, 396, 3, 2, 2, 2, 2003, 2004, 7, 84, 2, 2, 2004, 2005, 7, 81, 2, 2, 2005, 2006, 7, 78, 2, 2, 2006, 2007, 7, 71, 2, 2, 2007, 398, 3, 2, 2, 2, 2008, 2009, 7, 84, 2, 2, 2009, 2010, 7, 81, 2, 2, 2010, 2011, 7, 78, 2, 2, 2011, 2012, 7, 71, 2, 2, 2012, 2013, 7, 85, 2, 2, 2013, 400, 3, 2, 2, 2, 2014, 2015, 7, 84, 2, 2, 2015, 2016, 7, 81, 2, 2, 2016, 2017, 7, 78, 2, 2, 2017, 2018, 7, 78, 2, 2, 2018, 2019, 7, 68, 2, 2, 2019, 2020, 7, 67, 2, 2, 2020, 2021, 7, 69, 2, 2, 2021, 2022, 7, 77, 2, 2, 2022, 402, 3, 2, 2, 2, 2023, 2024, 7, 84, 2, 2, 2024, 2025, 7, 81, 2, 2, 2025, 2026, 7, 78, 2, 2, 2026, 2027, 7, 78, 2, 2, 2027, 2028, 7, 87, 2, 2, 2028, 2029, 7, 82, 2, 2, 2029, 404, 3, 2, 2, 2, 2030, 2031, 7, 84, 2, 2, 2031, 2032, 7, 81, 2, 2, 2032, 2033, 7, 89, 2, 2, 2033, 406, 3, 2, 2, 2, 2034, 2035, 7, 84, 2, 2, 2035, 2036, 7, 81, 2, 2, 2036, 2037, 7, 89, 2, 2, 2037, 2038, 7, 85, 2, 2, 2038, 408, 3, 2, 2, 2, 2039, 2040, 7, 85, 2, 2, 2040, 2041, 7, 69, 2, 2, 2041, 2042, 7, 74, 2, 2, 2042, 2043, 7, 71, 2, 2, 2043, 2044, 7, 79, 2, 2, 2044, 2045, 7, 67, 2, 2, 2045, 410, 3, 2, 2, 2, 2046, 2047, 7, 85, 2, 2, 2047, 2048, 7, 71, 2, 2, 2048, 2049, 7, 69, 2, 2, 2049, 2050, 7, 81, 2, 2, 2050, 2051, 7, 80, 2, 2, 2051, 2052, 7, 70, 2, 2, 2052, 412, 3, 2, 2, 2, 2053, 2054, 7, 85, 2, 2, 2054, 2055, 7, 71, 2, 2, 2055, 2056, 7, 78, 2, 2, 2056, 2057, 7, 71, 2, 2, 2057, 2058, 7, 69, 2, 2, 2058, 2059, 7, 86, 2, 2, 2059, 414, 3, 2, 2, 2, 2060, 2061, 7, 85, 2, 2, 2061, 2062, 7, 71, 2, 2, 2062, 2063, 7, 79, 2, 2, 2063, 2064, 7, 75, 2, 2, 2064, 416, 3, 2, 2, 2, 2065, 2066, 7, 85, 2, 2, 2066, 2067, 7, 71, 2, 2, 2067, 2068, 7, 82, 2, 2, 2068, 2069, 7, 67, 2, 2, 2069, 2070, 7, 84, 2, 2, 2070, 2071, 7, 67, 2, 2, 2071, 2072, 7, 86, 2, 2, 2072, 2073, 7, 71, 2, 2, 2073, 2074, 7, 70, 2, 2, 2074, 418, 3, 2, 2, 2, 2075, 2076, 7, 85, 2, 2, 2076, 2077, 7, 71, 2, 2, 2077, 2078, 7, 84, 2, 2, 2078, 2079, 7, 70, 2, 2, 2079, 2080, 7, 71, 2, 2, 2080, 420, 3, 2, 2, 2, 2081, 2082, 7, 85, 2, 2, 2082, 2083, 7, 71, 2, 2, 2083, 2084, 7, 84, 2, 2, 2084, 2085, 7, 70, 2, 2, 2085, 2086, 7, 71, 2, 2, 2086, 2087, 7, 82, 2, 2, 2087, 2088, 7, 84, 2, 2, 2088, 2089, 7, 81, 2, 2, 2089, 2090, 7, 82, 2, 2, 2090, 2091, 7, 71, 2, 2, 2091, 2092, 7, 84, 2, 2, 2092, 2093, 7, 86, 2, 2, 2093, 2094, 7, 75, 2, 2, 2094, 2095, 7, 71, 2, 2, 2095, 2096, 7, 85, 2, 2, 2096, 422, 3, 2, 2, 2, 2097, 2098, 7, 85, 2, 2, 2098, 2099, 7, 71, 2, 2, 2099, 2100, 7, 85, 2, 2, 2100, 2101, 7, 85, 2, 2, 2101, 2102, 7, 75, 2, 2, 2102, 2103, 7, 81, 2, 2, 2103, 2104, 7, 80, 2, 2, 2104, 2105, 7, 97, 2, 2, 2105, 2106, 7, 87, 2, 2, 2106, 2107, 7, 85, 2, 2, 2107, 2108, 7, 71, 2, 2, 2108, 2109, 7, 84, 2, 2, 2109, 424, 3, 2, 2, 2, 2110, 2111, 7, 85, 2, 2, 2111, 2112, 7, 71, 2, 2, 2112, 2113, 7, 86, 2, 2, 2113, 426, 3, 2, 2, 2, 2114, 2115, 7, 79, 2, 2, 2115, 2116, 7, 75, 2, 2, 2116, 2117, 7, 80, 2, 2, 2117, 2118, 7, 87, 2, 2, 2118, 2119, 7, 85, 2, 2, 2119, 428, 3, 2, 2, 2, 2120, 2121, 7, 85, 2, 2, 2121, 2122, 7, 71, 2, 2, 2122, 2123, 7, 86, 2, 2, 2123, 2124, 7, 85, 2, 2, 2124, 430, 3, 2, 2, 2, 2125, 2126, 7, 85, 2, 2, 2126, 2127, 7, 74, 2, 2, 2127, 2128, 7, 81, 2, 2, 2128, 2129, 7, 89, 2, 2, 2129, 432, 3, 2, 2, 2, 2130, 2131, 7, 85, 2, 2, 2131, 2132, 7, 77, 2, 2, 2132, 2133, 7, 71, 2, 2, 2133, 2134, 7, 89, 2, 2, 2134, 2135, 7, 71, 2, 2, 2135, 2136, 7, 70, 2, 2, 2136, 434, 3, 2, 2, 2, 2137, 2138, 7, 85, 2, 2, 2138, 2139, 7, 81, 2, 2, 2139, 2140, 7, 79, 2, 2, 2140, 2141, 7, 71, 2, 2, 2141, 436, 3, 2, 2, 2, 2142, 2143, 7, 85, 2, 2, 2143, 2144, 7, 81, 2, 2, 2144, 2145, 7, 84, 2, 2, 2145, 2146, 7, 86, 2, 2, 2146, 438, 3, 2, 2, 2, 2147, 2148, 7, 85, 2, 2, 2148, 2149, 7, 81, 2, 2, 2149, 2150, 7, 84, 2, 2, 2150, 2151, 7, 86, 2, 2, 2151, 2152, 7, 71, 2, 2, 2152, 2153, 7, 70, 2, 2, 2153, 440, 3, 2, 2, 2, 2154, 2155, 7, 85, 2, 2, 2155, 2156, 7, 86, 2, 2, 2156, 2157, 7, 67, 2, 2, 2157, 2158, 7, 84, 2, 2, 2158, 2159, 7, 86, 2, 2, 2159, 442, 3, 2, 2, 2, 2160, 2161, 7, 85, 2, 2, 2161, 2162, 7, 86, 2, 2, 2162, 2163, 7, 67, 2, 2, 2163, 2164, 7, 86, 2, 2, 2164, 2165, 7, 75, 2, 2, 2165, 2166, 7, 85, 2, 2, 2166, 2167, 7, 86, 2, 2, 2167, 2168, 7, 75, 2, 2, 2168, 2169, 7, 69, 2, 2, 2169, 2170, 7, 85, 2, 2, 2170, 444, 3, 2, 2, 2, 2171, 2172, 7, 85, 2, 2, 2172, 2173, 7, 86, 2, 2, 2173, 2174, 7, 81, 2, 2, 2174, 2175, 7, 84, 2, 2, 2175, 2176, 7, 71, 2, 2, 2176, 2177, 7, 70, 2, 2, 2177, 446, 3, 2, 2, 2, 2178, 2179, 7, 85, 2, 2, 2179, 2180, 7, 86, 2, 2, 2180, 2181, 7, 84, 2, 2, 2181, 2182, 7, 67, 2, 2, 2182, 2183, 7, 86, 2, 2, 2183, 2184, 7, 75, 2, 2, 2184, 2185, 7, 72, 2, 2, 2185, 2186, 7, 91, 2, 2, 2186, 448, 3, 2, 2, 2, 2187, 2188, 7, 85, 2, 2, 2188, 2189, 7, 86, 2, 2, 2189, 2190, 7, 84, 2, 2, 2190, 2191, 7, 87, 2, 2, 2191, 2192, 7, 69, 2, 2, 2192, 2193, 7, 86, 2, 2, 2193, 450, 3, 2, 2, 2, 2194, 2195, 7, 85, 2, 2, 2195, 2196, 7, 87, 2, 2, 2196, 2197, 7, 68, 2, 2, 2197, 2198, 7, 85, 2, 2, 2198, 2199, 7, 86, 2, 2, 2199, 2200, 7, 84, 2, 2, 2200, 452, 3, 2, 2, 2, 2201, 2202, 7, 85, 2, 2, 2202, 2203, 7, 87, 2, 2, 2203, 2204, 7, 68, 2, 2, 2204, 2205, 7, 85, 2, 2, 2205, 2206, 7, 86, 2, 2, 2206, 2207, 7, 84, 2, 2, 2207, 2208, 7, 75, 2, 2, 2208, 2209, 7, 80, 2, 2, 2209, 2210, 7, 73, 2, 2, 2210, 454, 3, 2, 2, 2, 2211, 2212, 7, 86, 2, 2, 2212, 2213, 7, 67, 2, 2, 2213, 2214, 7, 68, 2, 2, 2214, 2215, 7, 78, 2, 2, 2215, 2216, 7, 71, 2, 2, 2216, 456, 3, 2, 2, 2, 2217, 2218, 7, 86, 2, 2, 2218, 2219, 7, 67, 2, 2, 2219, 2220, 7, 68, 2, 2, 2220, 2221, 7, 78, 2, 2, 2221, 2222, 7, 71, 2, 2, 2222, 2223, 7, 85, 2, 2, 2223, 458, 3, 2, 2, 2, 2224, 2225, 7, 86, 2, 2, 2225, 2226, 7, 67, 2, 2, 2226, 2227, 7, 68, 2, 2, 2227, 2228, 7, 78, 2, 2, 2228, 2229, 7, 71, 2, 2, 2229, 2230, 7, 85, 2, 2, 2230, 2231, 7, 67, 2, 2, 2231, 2232, 7, 79, 2, 2, 2232, 2233, 7, 82, 2, 2, 2233, 2234, 7, 78, 2, 2, 2234, 2235, 7, 71, 2, 2, 2235, 460, 3, 2, 2, 2, 2236, 2237, 7, 86, 2, 2, 2237, 2238, 7, 68, 2, 2, 2238, 2239, 7, 78, 2, 2, 2239, 2240, 7, 82, 2, 2, 2240, 2241, 7, 84, 2, 2, 2241, 2242, 7, 81, 2, 2, 2242, 2243, 7, 82, 2, 2, 2243, 2244, 7, 71, 2, 2, 2244, 2245, 7, 84, 2, 2, 2245, 2246, 7, 86, 2, 2, 2246, 2247, 7, 75, 2, 2, 2247, 2248, 7, 71, 2, 2, 2248, 2249, 7, 85, 2, 2, 2249, 462, 3, 2, 2, 2, 2250, 2251, 7, 86, 2, 2, 2251, 2252, 7, 71, 2, 2, 2252, 2253, 7, 79, 2, 2, 2253, 2254, 7, 82, 2, 2, 2254, 2255, 7, 81, 2, 2, 2255, 2256, 7, 84, 2, 2, 2256, 2257, 7, 67, 2, 2, 2257, 2258, 7, 84, 2, 2, 2258, 2264, 7, 91, 2, 2, 2259, 2260, 7, 86, 2, 2, 2260, 2261, 7, 71, 2, 2, 2261, 2262, 7, 79, 2, 2, 2262, 2264, 7, 82, 2, 2, 2263, 2250, 3, 2, 2, 2, 2263, 2259, 3, 2, 2, 2, 2264, 464, 3, 2, 2, 2, 2265, 2266, 7, 86, 2, 2, 2266, 2267, 7, 71, 2, 2, 2267, 2268, 7, 84, 2, 2, 2268, 2269, 7, 79, 2, 2, 2269, 2270, 7, 75, 2, 2, 2270, 2271, 7, 80, 2, 2, 2271, 2272, 7, 67, 2, 2, 2272, 2273, 7, 86, 2, 2, 2273, 2274, 7, 71, 2, 2, 2274, 2275, 7, 70, 2, 2, 2275, 466, 3, 2, 2, 2, 2276, 2277, 7, 86, 2, 2, 2277, 2278, 7, 74, 2, 2, 2278, 2279, 7, 71, 2, 2, 2279, 2280, 7, 80, 2, 2, 2280, 468, 3, 2, 2, 2, 2281, 2282, 7, 86, 2, 2, 2282, 2283, 7, 81, 2, 2, 2283, 470, 3, 2, 2, 2, 2284, 2285, 7, 86, 2, 2, 2285, 2286, 7, 81, 2, 2, 2286, 2287, 7, 87, 2, 2, 2287, 2288, 7, 69, 2, 2, 2288, 2289, 7, 74, 2, 2, 2289, 472, 3, 2, 2, 2, 2290, 2291, 7, 86, 2, 2, 2291, 2292, 7, 84, 2, 2, 2292, 2293, 7, 67, 2, 2, 2293, 2294, 7, 75, 2, 2, 2294, 2295, 7, 78, 2, 2, 2295, 2296, 7, 75, 2, 2, 2296, 2297, 7, 80, 2, 2, 2297, 2298, 7, 73, 2, 2, 2298, 474, 3, 2, 2, 2, 2299, 2300, 7, 86, 2, 2, 2300, 2301, 7, 84, 2, 2, 2301, 2302, 7, 67, 2, 2, 2302, 2303, 7, 80, 2, 2, 2303, 2304, 7, 85, 2, 2, 2304, 2305, 7, 67, 2, 2, 2305, 2306, 7, 69, 2, 2, 2306, 2307, 7, 86, 2, 2, 2307, 2308, 7, 75, 2, 2, 2308, 2309, 7, 81, 2, 2, 2309, 2310, 7, 80, 2, 2, 2310, 476, 3, 2, 2, 2, 2311, 2312, 7, 86, 2, 2, 2312, 2313, 7, 84, 2, 2, 2313, 2314, 7, 67, 2, 2, 2314, 2315, 7, 80, 2, 2, 2315, 2316, 7, 85, 2, 2, 2316, 2317, 7, 67, 2, 2, 2317, 2318, 7, 69, 2, 2, 2318, 2319, 7, 86, 2, 2, 2319, 2320, 7, 75, 2, 2, 2320, 2321, 7, 81, 2, 2, 2321, 2322, 7, 80, 2, 2, 2322, 2323, 7, 85, 2, 2, 2323, 478, 3, 2, 2, 2, 2324, 2325, 7, 86, 2, 2, 2325, 2326, 7, 84, 2, 2, 2326, 2327, 7, 67, 2, 2, 2327, 2328, 7, 80, 2, 2, 2328, 2329, 7, 85, 2, 2, 2329, 2330, 7, 72, 2, 2, 2330, 2331, 7, 81, 2, 2, 2331, 2332, 7, 84, 2, 2, 2332, 2333, 7, 79, 2, 2, 2333, 480, 3, 2, 2, 2, 2334, 2335, 7, 86, 2, 2, 2335, 2336, 7, 84, 2, 2, 2336, 2337, 7, 75, 2, 2, 2337, 2338, 7, 79, 2, 2, 2338, 482, 3, 2, 2, 2, 2339, 2340, 7, 86, 2, 2, 2340, 2341, 7, 84, 2, 2, 2341, 2342, 7, 87, 2, 2, 2342, 2343, 7, 71, 2, 2, 2343, 484, 3, 2, 2, 2, 2344, 2345, 7, 86, 2, 2, 2345, 2346, 7, 84, 2, 2, 2346, 2347, 7, 87, 2, 2, 2347, 2348, 7, 80, 2, 2, 2348, 2349, 7, 69, 2, 2, 2349, 2350, 7, 67, 2, 2, 2350, 2351, 7, 86, 2, 2, 2351, 2352, 7, 71, 2, 2, 2352, 486, 3, 2, 2, 2, 2353, 2354, 7, 86, 2, 2, 2354, 2355, 7, 91, 2, 2, 2355, 2356, 7, 82, 2, 2, 2356, 2357, 7, 71, 2, 2, 2357, 488, 3, 2, 2, 2, 2358, 2359, 7, 87, 2, 2, 2359, 2360, 7, 80, 2, 2, 2360, 2361, 7, 67, 2, 2, 2361, 2362, 7, 84, 2, 2, 2362, 2363, 7, 69, 2, 2, 2363, 2364, 7, 74, 2, 2, 2364, 2365, 7, 75, 2, 2, 2365, 2366, 7, 88, 2, 2, 2366, 2367, 7, 71, 2, 2, 2367, 490, 3, 2, 2, 2, 2368, 2369, 7, 87, 2, 2, 2369, 2370, 7, 80, 2, 2, 2370, 2371, 7, 68, 2, 2, 2371, 2372, 7, 81, 2, 2, 2372, 2373, 7, 87, 2, 2, 2373, 2374, 7, 80, 2, 2, 2374, 2375, 7, 70, 2, 2, 2375, 2376, 7, 71, 2, 2, 2376, 2377, 7, 70, 2, 2, 2377, 492, 3, 2, 2, 2, 2378, 2379, 7, 87, 2, 2, 2379, 2380, 7, 80, 2, 2, 2380, 2381, 7, 69, 2, 2, 2381, 2382, 7, 67, 2, 2, 2382, 2383, 7, 69, 2, 2, 2383, 2384, 7, 74, 2, 2, 2384, 2385, 7, 71, 2, 2, 2385, 494, 3, 2, 2, 2, 2386, 2387, 7, 87, 2, 2, 2387, 2388, 7, 80, 2, 2, 2388, 2389, 7, 75, 2, 2, 2389, 2390, 7, 81, 2, 2, 2390, 2391, 7, 80, 2, 2, 2391, 496, 3, 2, 2, 2, 2392, 2393, 7, 87, 2, 2, 2393, 2394, 7, 80, 2, 2, 2394, 2395, 7, 75, 2, 2, 2395, 2396, 7, 83, 2, 2, 2396, 2397, 7, 87, 2, 2, 2397, 2398, 7, 71, 2, 2, 2398, 498, 3, 2, 2, 2, 2399, 2400, 7, 87, 2, 2, 2400, 2401, 7, 80, 2, 2, 2401, 2402, 7, 77, 2, 2, 2402, 2403, 7, 80, 2, 2, 2403, 2404, 7, 81, 2, 2, 2404, 2405, 7, 89, 2, 2, 2405, 2406, 7, 80, 2, 2, 2406, 500, 3, 2, 2, 2, 2407, 2408, 7, 87, 2, 2, 2408, 2409, 7, 80, 2, 2, 2409, 2410, 7, 78, 2, 2, 2410, 2411, 7, 81, 2, 2, 2411, 2412, 7, 69, 2, 2, 2412, 2413, 7, 77, 2, 2, 2413, 502, 3, 2, 2, 2, 2414, 2415, 7, 87, 2, 2, 2415, 2416, 7, 80, 2, 2, 2416, 2417, 7, 85, 2, 2, 2417, 2418, 7, 71, 2, 2, 2418, 2419, 7, 86, 2, 2, 2419, 504, 3, 2, 2, 2, 2420, 2421, 7, 87, 2, 2, 2421, 2422, 7, 82, 2, 2, 2422, 2423, 7, 70, 2, 2, 2423, 2424, 7, 67, 2, 2, 2424, 2425, 7, 86, 2, 2, 2425, 2426, 7, 71, 2, 2, 2426, 506, 3, 2, 2, 2, 2427, 2428, 7, 87, 2, 2, 2428, 2429, 7, 85, 2, 2, 2429, 2430, 7, 71, 2, 2, 2430, 508, 3, 2, 2, 2, 2431, 2432, 7, 87, 2, 2, 2432, 2433, 7, 85, 2, 2, 2433, 2434, 7, 71, 2, 2, 2434, 2435, 7, 84, 2, 2, 2435, 510, 3, 2, 2, 2, 2436, 2437, 7, 87, 2, 2, 2437, 2438, 7, 85, 2, 2, 2438, 2439, 7, 75, 2, 2, 2439, 2440, 7, 80, 2, 2, 2440, 2441, 7, 73, 2, 2, 2441, 512, 3, 2, 2, 2, 2442, 2443, 7, 88, 2, 2, 2443, 2444, 7, 67, 2, 2, 2444, 2445, 7, 78, 2, 2, 2445, 2446, 7, 87, 2, 2, 2446, 2447, 7, 71, 2, 2, 2447, 2448, 7, 85, 2, 2, 2448, 514, 3, 2, 2, 2, 2449, 2450, 7, 88, 2, 2, 2450, 2451, 7, 75, 2, 2, 2451, 2452, 7, 71, 2, 2, 2452, 2453, 7, 89, 2, 2, 2453, 516, 3, 2, 2, 2, 2454, 2455, 7, 88, 2, 2, 2455, 2456, 7, 75, 2, 2, 2456, 2457, 7, 71, 2, 2, 2457, 2458, 7, 89, 2, 2, 2458, 2459, 7, 85, 2, 2, 2459, 518, 3, 2, 2, 2, 2460, 2461, 7, 89, 2, 2, 2461, 2462, 7, 74, 2, 2, 2462, 2463, 7, 71, 2, 2, 2463, 2464, 7, 80, 2, 2, 2464, 520, 3, 2, 2, 2, 2465, 2466, 7, 89, 2, 2, 2466, 2467, 7, 74, 2, 2, 2467, 2468, 7, 71, 2, 2, 2468, 2469, 7, 84, 2, 2, 2469, 2470, 7, 71, 2, 2, 2470, 522, 3, 2, 2, 2, 2471, 2472, 7, 89, 2, 2, 2472, 2473, 7, 75, 2, 2, 2473, 2474, 7, 80, 2, 2, 2474, 2475, 7, 70, 2, 2, 2475, 2476, 7, 81, 2, 2, 2476, 2477, 7, 89, 2, 2, 2477, 524, 3, 2, 2, 2, 2478, 2479, 7, 89, 2, 2, 2479, 2480, 7, 75, 2, 2, 2480, 2481, 7, 86, 2, 2, 2481, 2482, 7, 74, 2, 2, 2482, 526, 3, 2, 2, 2, 2483, 2484, 7, 91, 2, 2, 2484, 2485, 7, 71, 2, 2, 2485, 2486, 7, 67, 2, 2, 2486, 2487, 7, 84, 2, 2, 2487, 528, 3, 2, 2, 2, 2488, 2492, 7, 63, 2, 2, 2489, 2490, 7, 63, 2, 2, 2490, 2492, 7, 63, 2, 2, 2491, 2488, 3, 2, 2, 2, 2491, 2489, 3, 2, 2, 2, 2492, 530, 3, 2, 2, 2, 2493, 2494, 7, 62, 2, 2, 2494, 2495, 7, 63, 2, 2, 2495, 2496, 7, 64, 2, 2, 2496, 532, 3, 2, 2, 2, 2497, 2498, 7, 62, 2, 2, 2498, 2499, 7, 64, 2, 2, 2499, 534, 3, 2, 2, 2, 2500, 2501, 7, 35, 2, 2, 2501, 2502, 7, 63, 2, 2, 2502, 536, 3, 2, 2, 2, 2503, 2504, 7, 62, 2, 2, 2504, 538, 3, 2, 2, 2, 2505, 2506, 7, 62, 2, 2, 2506, 2510, 7, 63, 2, 2, 2507, 2508, 7, 35, 2, 2, 2508, 2510, 7, 64, 2, 2, 2509, 2505, 3, 2, 2, 2, 2509, 2507, 3, 2, 2, 2, 2510, 540, 3, 2, 2, 2, 2511, 2512, 7, 64, 2, 2, 2512, 542, 3, 2, 2, 2, 2513, 2514, 7, 64, 2, 2, 2514, 2518, 7, 63, 2, 2, 2515, 2516, 7, 35, 2, 2, 2516, 2518, 7, 62, 2, 2, 2517, 2513, 3, 2, 2, 2, 2517, 2515, 3, 2, 2, 2, 2518, 544, 3, 2, 2, 2, 2519, 2520, 7, 45, 2, 2, 2520, 546, 3, 2, 2, 2, 2521, 2522, 7, 47, 2, 2, 2522, 548, 3, 2, 2, 2, 2523, 2524, 7, 44, 2, 2, 2524, 550, 3, 2, 2, 2, 2525, 2526, 7, 49, 2, 2, 2526, 552, 3, 2, 2, 2, 2527, 2528, 7, 39, 2, 2, 2528, 554, 3, 2, 2, 2, 2529, 2530, 7, 70, 2, 2, 2530, 2531, 7, 75, 2, 2, 2531, 2532, 7, 88, 2, 2, 2532, 556, 3, 2, 2, 2, 2533, 2534, 7, 128, 2, 2, 2534, 558, 3, 2, 2, 2, 2535, 2536, 7, 40, 2, 2, 2536, 560, 3, 2, 2, 2, 2537, 2538, 7, 126, 2, 2, 2538, 562, 3, 2, 2, 2, 2539, 2540, 7, 126, 2, 2, 2540, 2541, 7, 126, 2, 2, 2541, 564, 3, 2, 2, 2, 2542, 2543, 7, 96, 2, 2, 2543, 566, 3, 2, 2, 2, 2544, 2550, 7, 41, 2, 2, 2545, 2549, 10, 2, 2, 2, 2546, 2547, 7, 94, 2, 2, 2547, 2549, 11, 2, 2, 2, 2548, 2545, 3, 2, 2, 2, 2548, 2546, 3, 2, 2, 2, 2549, 2552, 3, 2, 2, 2, 2550, 2548, 3, 2, 2, 2, 2550, 2551, 3, 2, 2, 2, 2551, 2553, 3, 2, 2, 2, 2552, 2550, 3, 2, 2, 2, 2553, 2565, 7, 41, 2, 2, 2554, 2560, 7, 36, 2, 2, 2555, 2559, 10, 3, 2, 2, 2556, 2557, 7, 94, 2, 2, 2557, 2559, 11, 2, 2, 2, 2558, 2555, 3, 2, 2, 2, 2558, 2556, 3, 2, 2, 2, 2559, 2562, 3, 2, 2, 2, 2560, 2558, 3, 2, 2, 2, 2560, 2561, 3, 2, 2, 2, 2561, 2563, 3, 2, 2, 2, 2562, 2560, 3, 2, 2, 2, 2563, 2565, 7, 36, 2, 2, 2564, 2544, 3, 2, 2, 2, 2564, 2554, 3, 2, 2, 2, 2565, 568, 3, 2, 2, 2, 2566, 2568, 5, 593, 297, 2, 2567, 2566, 3, 2, 2, 2, 2568, 2569, 3, 2, 2, 2, 2569, 2567, 3, 2, 2, 2, 2569, 2570, 3, 2, 2, 2, 2570, 2571, 3, 2, 2, 2, 2571, 2572, 7, 78, 2, 2, 2572, 570, 3, 2, 2, 2, 2573, 2575, 5, 593, 297, 2, 2574, 2573, 3, 2, 2, 2, 2575, 2576, 3, 2, 2, 2, 2576, 2574, 3, 2, 2, 2, 2576, 2577, 3, 2, 2, 2, 2577, 2578, 3, 2, 2, 2, 2578, 2579, 7, 85, 2, 2, 2579, 572, 3, 2, 2, 2, 2580, 2582, 5, 593, 297, 2, 2581, 2580, 3, 2, 2, 2, 2582, 2583, 3, 2, 2, 2, 2583, 2581, 3, 2, 2, 2, 2583, 2584, 3, 2, 2, 2, 2584, 2585, 3, 2, 2, 2, 2585, 2586, 7, 91, 2, 2, 2586, 574, 3, 2, 2, 2, 2587, 2589, 5, 593, 297, 2, 2588, 2587, 3, 2, 2, 2, 2589, 2590, 3, 2, 2, 2, 2590, 2588, 3, 2, 2, 2, 2590, 2591, 3, 2, 2, 2, 2591, 576, 3, 2, 2, 2, 2592, 2594, 5, 593, 297, 2, 2593, 2592, 3, 2, 2, 2, 2594, 2595, 3, 2, 2, 2, 2595, 2593, 3, 2, 2, 2, 2595, 2596, 3, 2, 2, 2, 2596, 2597, 3, 2, 2, 2, 2597, 2598, 5, 591, 296, 2, 2598, 2604, 3, 2, 2, 2, 2599, 2600, 5, 589, 295, 2, 2600, 2601, 5, 591, 296, 2, 2601, 2602, 6, 289, 2, 2, 2602, 2604, 3, 2, 2, 2, 2603, 2593, 3, 2, 2, 2, 2603, 2599, 3, 2, 2, 2, 2604, 578, 3, 2, 2, 2, 2605, 2606, 5, 589, 295, 2, 2606, 2607, 6, 290, 3, 2, 2607, 580, 3, 2, 2, 2, 2608, 2610, 5, 593, 297, 2, 2609, 2608, 3, 2, 2, 2, 2610, 2611, 3, 2, 2, 2, 2611, 2609, 3, 2, 2, 2, 2611, 2612, 3, 2, 2, 2, 2612, 2614, 3, 2, 2, 2, 2613, 2615, 5, 591, 296, 2, 2614, 2613, 3, 2, 2, 2, 2614, 2615, 3, 2, 2, 2, 2615, 2616, 3, 2, 2, 2, 2616, 2617, 7, 70, 2, 2, 2617, 2626, 3, 2, 2, 2, 2618, 2620, 5, 589, 295, 2, 2619, 2621, 5, 591, 296, 2, 2620, 2619, 3, 2, 2, 2, 2620, 2621, 3, 2, 2, 2, 2621, 2622, 3, 2, 2, 2, 2622, 2623, 7, 70, 2, 2, 2623, 2624, 6, 291, 4, 2, 2624, 2626, 3, 2, 2, 2, 2625, 2609, 3, 2, 2, 2, 2625, 2618, 3, 2, 2, 2, 2626, 582, 3, 2, 2, 2, 2627, 2629, 5, 593, 297, 2, 2628, 2627, 3, 2, 2, 2, 2629, 2630, 3, 2, 2, 2, 2630, 2628, 3, 2, 2, 2, 2630, 2631, 3, 2, 2, 2, 2631, 2633, 3, 2, 2, 2, 2632, 2634, 5, 591, 296, 2, 2633, 2632, 3, 2, 2, 2, 2633, 2634, 3, 2, 2, 2, 2634, 2635, 3, 2, 2, 2, 2635, 2636, 7, 68, 2, 2, 2636, 2637, 7, 70, 2, 2, 2637, 2648, 3, 2, 2, 2, 2638, 2640, 5, 589, 295, 2, 2639, 2641, 5, 591, 296, 2, 2640, 2639, 3, 2, 2, 2, 2640, 2641, 3, 2, 2, 2, 2641, 2642, 3, 2, 2, 2, 2642, 2643, 7, 68, 2, 2, 2643, 2644, 7, 70, 2, 2, 2644, 2645, 3, 2, 2, 2, 2645, 2646, 6, 292, 5, 2, 2646, 2648, 3, 2, 2, 2, 2647, 2628, 3, 2, 2, 2, 2647, 2638, 3, 2, 2, 2, 2648, 584, 3, 2, 2, 2, 2649, 2653, 5, 595, 298, 2, 2650, 2653, 5, 593, 297, 2, 2651, 2653, 7, 97, 2, 2, 2652, 2649, 3, 2, 2, 2, 2652, 2650, 3, 2, 2, 2, 2652, 2651, 3, 2, 2, 2, 2653, 2654, 3, 2, 2, 2, 2654, 2652, 3, 2, 2, 2, 2654, 2655, 3, 2, 2, 2, 2655, 586, 3, 2, 2, 2, 2656, 2662, 7, 98, 2, 2, 2657, 2661, 10, 4, 2, 2, 2658, 2659, 7, 98, 2, 2, 2659, 2661, 7, 98, 2, 2, 2660, 2657, 3, 2, 2, 2, 2660, 2658, 3, 2, 2, 2, 2661, 2664, 3, 2, 2, 2, 2662, 2660, 3, 2, 2, 2, 2662, 2663, 3, 2, 2, 2, 2663, 2665, 3, 2, 2, 2, 2664, 2662, 3, 2, 2, 2, 2665, 2666, 7, 98, 2, 2, 2666, 588, 3, 2, 2, 2, 2667, 2669, 5, 593, 297, 2, 2668, 2667, 3, 2, 2, 2, 2669, 2670, 3, 2, 2, 2, 2670, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2676, 7, 48, 2, 2, 2673, 2675, 5, 593, 297, 2, 2674, 2673, 3, 2, 2, 2, 2675, 2678, 3, 2, 2, 2, 2676, 2674, 3, 2, 2, 2, 2676, 2677, 3, 2, 2, 2, 2677, 2686, 3, 2, 2, 2, 2678, 2676, 3, 2, 2, 2, 2679, 2681, 7, 48, 2, 2, 2680, 2682, 5, 593, 297, 2, 2681, 2680, 3, 2, 2, 2, 2682, 2683, 3, 2, 2, 2, 2683, 2681, 3, 2, 2, 2, 2683, 2684, 3, 2, 2, 2, 2684, 2686, 3, 2, 2, 2, 2685, 2668, 3, 2, 2, 2, 2685, 2679, 3, 2, 2, 2, 2686, 590, 3, 2, 2, 2, 2687, 2689, 7, 71, 2, 2, 2688, 2690, 9, 5, 2, 2, 2689, 2688, 3, 2, 2, 2, 2689, 2690, 3, 2, 2, 2, 2690, 2692, 3, 2, 2, 2, 2691, 2693, 5, 593, 297, 2, 2692, 2691, 3, 2, 2, 2, 2693, 2694, 3, 2, 2, 2, 2694, 2692, 3, 2, 2, 2, 2694, 2695, 3, 2, 2, 2, 2695, 592, 3, 2, 2, 2, 2696, 2697, 9, 6, 2, 2, 2697, 594, 3, 2, 2, 2, 2698, 2699, 9, 7, 2, 2, 2699, 596, 3, 2, 2, 2, 2700, 2701, 7, 47, 2, 2, 2701, 2702, 7, 47, 2, 2, 2702, 2706, 3, 2, 2, 2, 2703, 2705, 10, 8, 2, 2, 2704, 2703, 3, 2, 2, 2, 2705, 2708, 3, 2, 2, 2, 2706, 2704, 3, 2, 2, 2, 2706, 2707, 3, 2, 2, 2, 2707, 2710, 3, 2, 2, 2, 2708, 2706, 3, 2, 2, 2, 2709, 2711, 7, 15, 2, 2, 2710, 2709, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2713, 3, 2, 2, 2, 2712, 2714, 7, 12, 2, 2, 2713, 2712, 3, 2, 2, 2, 2713, 2714, 3, 2, 2, 2, 2714, 2715, 3, 2, 2, 2, 2715, 2716, 8, 299, 2, 2, 2716, 598, 3, 2, 2, 2, 2717, 2718, 7, 49, 2, 2, 2718, 2719, 7, 44, 2, 2, 2719, 2720, 3, 2, 2, 2, 2720, 2725, 6, 300, 6, 2, 2721, 2724, 5, 599, 300, 2, 2722, 2724, 11, 2, 2, 2, 2723, 2721, 3, 2, 2, 2, 2723, 2722, 3, 2, 2, 2, 2724, 2727, 3, 2, 2, 2, 2725, 2726, 3, 2, 2, 2, 2725, 2723, 3, 2, 2, 2, 2726, 2728, 3, 2, 2, 2, 2727, 2725, 3, 2, 2, 2, 2728, 2729, 7, 44, 2, 2, 2729, 2730, 7, 49, 2, 2, 2730, 2731, 3, 2, 2, 2, 2731, 2732, 8, 300, 2, 2, 2732, 600, 3, 2, 2, 2, 2733, 2735, 9, 9, 2, 2, 2734, 2733, 3, 2, 2, 2, 2735, 2736, 3, 2, 2, 2, 2736, 2734, 3, 2, 2, 2, 2736, 2737, 3, 2, 2, 2, 2737, 2738, 3, 2, 2, 2, 2738, 2739, 8, 301, 2, 2, 2739, 602, 3, 2, 2, 2, 2740, 2741, 11, 2, 2, 2, 2741, 604, 3, 2, 2, 2, 45, 2, 1028, 1655, 2001, 2263, 2491, 2509, 2517, 2548, 2550, 2558, 2560, 2564, 2569, 2576, 2583, 2590, 2595, 2603, 2611, 2614, 2620, 2625, 2630, 2633, 2640, 2647, 2652, 2654, 2660, 2662, 2670, 2676, 2683, 2685, 2689, 2694, 2706, 2710, 2713, 2723, 2725, 2736, 3, 2, 3, 2] \ No newline at end of file diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.py b/pysparkling/sql/ast/generated/SqlBaseLexer.py deleted file mode 100644 index 2e59ffff0..000000000 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.py +++ /dev/null @@ -1,1878 +0,0 @@ -# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 -from antlr4 import * -from io import StringIO -from typing.io import TextIO -import sys - - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u012b") - buf.write("\u0ab6\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") - buf.write("\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") - buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") - buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") - buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") - buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") - buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") - buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") - buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") - buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") - buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") - buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") - buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") - buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") - buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") - buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") - buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") - buf.write("\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083") - buf.write("\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087") - buf.write("\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a") - buf.write("\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e") - buf.write("\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091") - buf.write("\4\u0092\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095") - buf.write("\t\u0095\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098\t\u0098") - buf.write("\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b\4\u009c") - buf.write("\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f") - buf.write("\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3") - buf.write("\t\u00a3\4\u00a4\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6") - buf.write("\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9\t\u00a9\4\u00aa") - buf.write("\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad") - buf.write("\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1") - buf.write("\t\u00b1\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4") - buf.write("\4\u00b5\t\u00b5\4\u00b6\t\u00b6\4\u00b7\t\u00b7\4\u00b8") - buf.write("\t\u00b8\4\u00b9\t\u00b9\4\u00ba\t\u00ba\4\u00bb\t\u00bb") - buf.write("\4\u00bc\t\u00bc\4\u00bd\t\u00bd\4\u00be\t\u00be\4\u00bf") - buf.write("\t\u00bf\4\u00c0\t\u00c0\4\u00c1\t\u00c1\4\u00c2\t\u00c2") - buf.write("\4\u00c3\t\u00c3\4\u00c4\t\u00c4\4\u00c5\t\u00c5\4\u00c6") - buf.write("\t\u00c6\4\u00c7\t\u00c7\4\u00c8\t\u00c8\4\u00c9\t\u00c9") - buf.write("\4\u00ca\t\u00ca\4\u00cb\t\u00cb\4\u00cc\t\u00cc\4\u00cd") - buf.write("\t\u00cd\4\u00ce\t\u00ce\4\u00cf\t\u00cf\4\u00d0\t\u00d0") - buf.write("\4\u00d1\t\u00d1\4\u00d2\t\u00d2\4\u00d3\t\u00d3\4\u00d4") - buf.write("\t\u00d4\4\u00d5\t\u00d5\4\u00d6\t\u00d6\4\u00d7\t\u00d7") - buf.write("\4\u00d8\t\u00d8\4\u00d9\t\u00d9\4\u00da\t\u00da\4\u00db") - buf.write("\t\u00db\4\u00dc\t\u00dc\4\u00dd\t\u00dd\4\u00de\t\u00de") - buf.write("\4\u00df\t\u00df\4\u00e0\t\u00e0\4\u00e1\t\u00e1\4\u00e2") - buf.write("\t\u00e2\4\u00e3\t\u00e3\4\u00e4\t\u00e4\4\u00e5\t\u00e5") - buf.write("\4\u00e6\t\u00e6\4\u00e7\t\u00e7\4\u00e8\t\u00e8\4\u00e9") - buf.write("\t\u00e9\4\u00ea\t\u00ea\4\u00eb\t\u00eb\4\u00ec\t\u00ec") - buf.write("\4\u00ed\t\u00ed\4\u00ee\t\u00ee\4\u00ef\t\u00ef\4\u00f0") - buf.write("\t\u00f0\4\u00f1\t\u00f1\4\u00f2\t\u00f2\4\u00f3\t\u00f3") - buf.write("\4\u00f4\t\u00f4\4\u00f5\t\u00f5\4\u00f6\t\u00f6\4\u00f7") - buf.write("\t\u00f7\4\u00f8\t\u00f8\4\u00f9\t\u00f9\4\u00fa\t\u00fa") - buf.write("\4\u00fb\t\u00fb\4\u00fc\t\u00fc\4\u00fd\t\u00fd\4\u00fe") - buf.write("\t\u00fe\4\u00ff\t\u00ff\4\u0100\t\u0100\4\u0101\t\u0101") - buf.write("\4\u0102\t\u0102\4\u0103\t\u0103\4\u0104\t\u0104\4\u0105") - buf.write("\t\u0105\4\u0106\t\u0106\4\u0107\t\u0107\4\u0108\t\u0108") - buf.write("\4\u0109\t\u0109\4\u010a\t\u010a\4\u010b\t\u010b\4\u010c") - buf.write("\t\u010c\4\u010d\t\u010d\4\u010e\t\u010e\4\u010f\t\u010f") - buf.write("\4\u0110\t\u0110\4\u0111\t\u0111\4\u0112\t\u0112\4\u0113") - buf.write("\t\u0113\4\u0114\t\u0114\4\u0115\t\u0115\4\u0116\t\u0116") - buf.write("\4\u0117\t\u0117\4\u0118\t\u0118\4\u0119\t\u0119\4\u011a") - buf.write("\t\u011a\4\u011b\t\u011b\4\u011c\t\u011c\4\u011d\t\u011d") - buf.write("\4\u011e\t\u011e\4\u011f\t\u011f\4\u0120\t\u0120\4\u0121") - buf.write("\t\u0121\4\u0122\t\u0122\4\u0123\t\u0123\4\u0124\t\u0124") - buf.write("\4\u0125\t\u0125\4\u0126\t\u0126\4\u0127\t\u0127\4\u0128") - buf.write("\t\u0128\4\u0129\t\u0129\4\u012a\t\u012a\4\u012b\t\u012b") - buf.write("\4\u012c\t\u012c\4\u012d\t\u012d\4\u012e\t\u012e\3\2\3") - buf.write("\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3\7\3\b") - buf.write("\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r") - buf.write("\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17") - buf.write("\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21") - buf.write("\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27") - buf.write("\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3") - buf.write(" \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"") - buf.write("\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3") - buf.write("%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3") - buf.write("(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write("*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3") - buf.write("+\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3") - buf.write(".\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3") - buf.write("\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62") - buf.write("\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63") - buf.write("\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64") - buf.write("\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\66\3\66") - buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67") - buf.write("\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3") - buf.write(":\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3;\3") - buf.write(";\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3") - buf.write("<\3<\3<\3<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3") - buf.write(">\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3") - buf.write("@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\5@\u0405\n@\3A\3A\3A\3") - buf.write("A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3") - buf.write("C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3") - buf.write("E\3E\3E\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3") - buf.write("H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3") - buf.write("J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3") - buf.write("L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3") - buf.write("N\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3") - buf.write("Q\3Q\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3") - buf.write("T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3") - buf.write("V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3") - buf.write("X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3") - buf.write("[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]") - buf.write("\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^\3_\3_\3") - buf.write("_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3") - buf.write("b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3") - buf.write("d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3") - buf.write("g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3h\3h\3") - buf.write("i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3") - buf.write("k\3l\3l\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3n\3") - buf.write("n\3n\3n\3n\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3") - buf.write("q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3") - buf.write("t\3t\3u\3u\3u\3u\3u\3u\3v\3v\3v\3v\3v\3v\3v\3w\3w\3w\3") - buf.write("w\3w\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3x\3x\3y\3y\3") - buf.write("y\3y\3y\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\3z\3z\3z\3z\3{\3") - buf.write("{\3{\3{\3{\3|\3|\3|\3}\3}\3}\3}\3}\3}\3~\3~\3~\3~\3~\3") - buf.write("\177\3\177\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3") - buf.write("\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081") - buf.write("\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082") - buf.write("\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083") - buf.write("\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084") - buf.write("\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086") - buf.write("\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087") - buf.write("\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0088") - buf.write("\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a") - buf.write("\3\u008a\3\u008a\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b") - buf.write("\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b") - buf.write("\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d") - buf.write("\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e") - buf.write("\3\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f") - buf.write("\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090") - buf.write("\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091") - buf.write("\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092") - buf.write("\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093") - buf.write("\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094") - buf.write("\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096") - buf.write("\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096") - buf.write("\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097") - buf.write("\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098") - buf.write("\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099") - buf.write("\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a") - buf.write("\u0678\n\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b") - buf.write("\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d") - buf.write("\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f") - buf.write("\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0") - buf.write("\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1") - buf.write("\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2") - buf.write("\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a3\3\u00a4") - buf.write("\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5") - buf.write("\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6") - buf.write("\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6") - buf.write("\3\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8") - buf.write("\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a8") - buf.write("\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9") - buf.write("\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa") - buf.write("\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab") - buf.write("\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab") - buf.write("\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac") - buf.write("\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad") - buf.write("\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad") - buf.write("\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae") - buf.write("\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af") - buf.write("\3\u00af\3\u00af\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0") - buf.write("\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1") - buf.write("\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b2") - buf.write("\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2\3\u00b2") - buf.write("\3\u00b2\3\u00b2\3\u00b3\3\u00b3\3\u00b3\3\u00b3\3\u00b3") - buf.write("\3\u00b3\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4") - buf.write("\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4") - buf.write("\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5") - buf.write("\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6") - buf.write("\3\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7") - buf.write("\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b8\3\u00b8\3\u00b8") - buf.write("\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9") - buf.write("\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9") - buf.write("\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba") - buf.write("\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00bb") - buf.write("\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb") - buf.write("\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc") - buf.write("\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd") - buf.write("\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00be\3\u00be\3\u00be") - buf.write("\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf") - buf.write("\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00c0\3\u00c0") - buf.write("\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c1\3\u00c1") - buf.write("\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c2") - buf.write("\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c3\3\u00c3") - buf.write("\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3") - buf.write("\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4") - buf.write("\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c6") - buf.write("\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6") - buf.write("\3\u00c6\3\u00c6\3\u00c6\5\u00c6\u07d2\n\u00c6\3\u00c7") - buf.write("\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c8\3\u00c8\3\u00c8") - buf.write("\3\u00c8\3\u00c8\3\u00c8\3\u00c9\3\u00c9\3\u00c9\3\u00c9") - buf.write("\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00ca\3\u00ca") - buf.write("\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00cb\3\u00cb") - buf.write("\3\u00cb\3\u00cb\3\u00cc\3\u00cc\3\u00cc\3\u00cc\3\u00cc") - buf.write("\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd") - buf.write("\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce") - buf.write("\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf") - buf.write("\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d1\3\u00d1") - buf.write("\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1") - buf.write("\3\u00d1\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2") - buf.write("\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3") - buf.write("\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3") - buf.write("\3\u00d3\3\u00d3\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4") - buf.write("\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4") - buf.write("\3\u00d4\3\u00d5\3\u00d5\3\u00d5\3\u00d5\3\u00d6\3\u00d6") - buf.write("\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d7\3\u00d7\3\u00d7") - buf.write("\3\u00d7\3\u00d7\3\u00d8\3\u00d8\3\u00d8\3\u00d8\3\u00d8") - buf.write("\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9\3\u00d9") - buf.write("\3\u00da\3\u00da\3\u00da\3\u00da\3\u00da\3\u00db\3\u00db") - buf.write("\3\u00db\3\u00db\3\u00db\3\u00dc\3\u00dc\3\u00dc\3\u00dc") - buf.write("\3\u00dc\3\u00dc\3\u00dc\3\u00dd\3\u00dd\3\u00dd\3\u00dd") - buf.write("\3\u00dd\3\u00dd\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de") - buf.write("\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00de\3\u00df") - buf.write("\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00df\3\u00e0") - buf.write("\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0\3\u00e0") - buf.write("\3\u00e0\3\u00e1\3\u00e1\3\u00e1\3\u00e1\3\u00e1\3\u00e1") - buf.write("\3\u00e1\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2\3\u00e2") - buf.write("\3\u00e2\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e3") - buf.write("\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e4\3\u00e4\3\u00e4") - buf.write("\3\u00e4\3\u00e4\3\u00e4\3\u00e5\3\u00e5\3\u00e5\3\u00e5") - buf.write("\3\u00e5\3\u00e5\3\u00e5\3\u00e6\3\u00e6\3\u00e6\3\u00e6") - buf.write("\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6\3\u00e6") - buf.write("\3\u00e6\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7") - buf.write("\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7\3\u00e7") - buf.write("\3\u00e7\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8") - buf.write("\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8\3\u00e8") - buf.write("\5\u00e8\u08d8\n\u00e8\3\u00e9\3\u00e9\3\u00e9\3\u00e9") - buf.write("\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9") - buf.write("\3\u00ea\3\u00ea\3\u00ea\3\u00ea\3\u00ea\3\u00eb\3\u00eb") - buf.write("\3\u00eb\3\u00ec\3\u00ec\3\u00ec\3\u00ec\3\u00ec\3\u00ec") - buf.write("\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed\3\u00ed") - buf.write("\3\u00ed\3\u00ed\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee") - buf.write("\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee\3\u00ee") - buf.write("\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef") - buf.write("\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00ef\3\u00f0") - buf.write("\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0\3\u00f0") - buf.write("\3\u00f0\3\u00f0\3\u00f1\3\u00f1\3\u00f1\3\u00f1\3\u00f1") - buf.write("\3\u00f2\3\u00f2\3\u00f2\3\u00f2\3\u00f2\3\u00f3\3\u00f3") - buf.write("\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3\3\u00f3") - buf.write("\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f4\3\u00f5\3\u00f5") - buf.write("\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5\3\u00f5") - buf.write("\3\u00f5\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f6") - buf.write("\3\u00f6\3\u00f6\3\u00f6\3\u00f6\3\u00f7\3\u00f7\3\u00f7") - buf.write("\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f7\3\u00f8\3\u00f8") - buf.write("\3\u00f8\3\u00f8\3\u00f8\3\u00f8\3\u00f9\3\u00f9\3\u00f9") - buf.write("\3\u00f9\3\u00f9\3\u00f9\3\u00f9\3\u00fa\3\u00fa\3\u00fa") - buf.write("\3\u00fa\3\u00fa\3\u00fa\3\u00fa\3\u00fa\3\u00fb\3\u00fb") - buf.write("\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fb\3\u00fc\3\u00fc") - buf.write("\3\u00fc\3\u00fc\3\u00fc\3\u00fc\3\u00fd\3\u00fd\3\u00fd") - buf.write("\3\u00fd\3\u00fd\3\u00fd\3\u00fd\3\u00fe\3\u00fe\3\u00fe") - buf.write("\3\u00fe\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u00ff\3\u0100") - buf.write("\3\u0100\3\u0100\3\u0100\3\u0100\3\u0100\3\u0101\3\u0101") - buf.write("\3\u0101\3\u0101\3\u0101\3\u0101\3\u0101\3\u0102\3\u0102") - buf.write("\3\u0102\3\u0102\3\u0102\3\u0103\3\u0103\3\u0103\3\u0103") - buf.write("\3\u0103\3\u0103\3\u0104\3\u0104\3\u0104\3\u0104\3\u0104") - buf.write("\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0105\3\u0106") - buf.write("\3\u0106\3\u0106\3\u0106\3\u0106\3\u0106\3\u0106\3\u0107") - buf.write("\3\u0107\3\u0107\3\u0107\3\u0107\3\u0108\3\u0108\3\u0108") - buf.write("\3\u0108\3\u0108\3\u0109\3\u0109\3\u0109\5\u0109\u09bc") - buf.write("\n\u0109\3\u010a\3\u010a\3\u010a\3\u010a\3\u010b\3\u010b") - buf.write("\3\u010b\3\u010c\3\u010c\3\u010c\3\u010d\3\u010d\3\u010e") - buf.write("\3\u010e\3\u010e\3\u010e\5\u010e\u09ce\n\u010e\3\u010f") - buf.write("\3\u010f\3\u0110\3\u0110\3\u0110\3\u0110\5\u0110\u09d6") - buf.write("\n\u0110\3\u0111\3\u0111\3\u0112\3\u0112\3\u0113\3\u0113") - buf.write("\3\u0114\3\u0114\3\u0115\3\u0115\3\u0116\3\u0116\3\u0116") - buf.write("\3\u0116\3\u0117\3\u0117\3\u0118\3\u0118\3\u0119\3\u0119") - buf.write("\3\u011a\3\u011a\3\u011a\3\u011b\3\u011b\3\u011c\3\u011c") - buf.write("\3\u011c\3\u011c\7\u011c\u09f5\n\u011c\f\u011c\16\u011c") - buf.write("\u09f8\13\u011c\3\u011c\3\u011c\3\u011c\3\u011c\3\u011c") - buf.write("\7\u011c\u09ff\n\u011c\f\u011c\16\u011c\u0a02\13\u011c") - buf.write("\3\u011c\5\u011c\u0a05\n\u011c\3\u011d\6\u011d\u0a08\n") - buf.write("\u011d\r\u011d\16\u011d\u0a09\3\u011d\3\u011d\3\u011e") - buf.write("\6\u011e\u0a0f\n\u011e\r\u011e\16\u011e\u0a10\3\u011e") - buf.write("\3\u011e\3\u011f\6\u011f\u0a16\n\u011f\r\u011f\16\u011f") - buf.write("\u0a17\3\u011f\3\u011f\3\u0120\6\u0120\u0a1d\n\u0120\r") - buf.write("\u0120\16\u0120\u0a1e\3\u0121\6\u0121\u0a22\n\u0121\r") - buf.write("\u0121\16\u0121\u0a23\3\u0121\3\u0121\3\u0121\3\u0121") - buf.write("\3\u0121\3\u0121\5\u0121\u0a2c\n\u0121\3\u0122\3\u0122") - buf.write("\3\u0122\3\u0123\6\u0123\u0a32\n\u0123\r\u0123\16\u0123") - buf.write("\u0a33\3\u0123\5\u0123\u0a37\n\u0123\3\u0123\3\u0123\3") - buf.write("\u0123\3\u0123\5\u0123\u0a3d\n\u0123\3\u0123\3\u0123\3") - buf.write("\u0123\5\u0123\u0a42\n\u0123\3\u0124\6\u0124\u0a45\n\u0124") - buf.write("\r\u0124\16\u0124\u0a46\3\u0124\5\u0124\u0a4a\n\u0124") - buf.write("\3\u0124\3\u0124\3\u0124\3\u0124\3\u0124\5\u0124\u0a51") - buf.write("\n\u0124\3\u0124\3\u0124\3\u0124\3\u0124\3\u0124\5\u0124") - buf.write("\u0a58\n\u0124\3\u0125\3\u0125\3\u0125\6\u0125\u0a5d\n") - buf.write("\u0125\r\u0125\16\u0125\u0a5e\3\u0126\3\u0126\3\u0126") - buf.write("\3\u0126\7\u0126\u0a65\n\u0126\f\u0126\16\u0126\u0a68") - buf.write("\13\u0126\3\u0126\3\u0126\3\u0127\6\u0127\u0a6d\n\u0127") - buf.write("\r\u0127\16\u0127\u0a6e\3\u0127\3\u0127\7\u0127\u0a73") - buf.write("\n\u0127\f\u0127\16\u0127\u0a76\13\u0127\3\u0127\3\u0127") - buf.write("\6\u0127\u0a7a\n\u0127\r\u0127\16\u0127\u0a7b\5\u0127") - buf.write("\u0a7e\n\u0127\3\u0128\3\u0128\5\u0128\u0a82\n\u0128\3") - buf.write("\u0128\6\u0128\u0a85\n\u0128\r\u0128\16\u0128\u0a86\3") - buf.write("\u0129\3\u0129\3\u012a\3\u012a\3\u012b\3\u012b\3\u012b") - buf.write("\3\u012b\7\u012b\u0a91\n\u012b\f\u012b\16\u012b\u0a94") - buf.write("\13\u012b\3\u012b\5\u012b\u0a97\n\u012b\3\u012b\5\u012b") - buf.write("\u0a9a\n\u012b\3\u012b\3\u012b\3\u012c\3\u012c\3\u012c") - buf.write("\3\u012c\3\u012c\3\u012c\7\u012c\u0aa4\n\u012c\f\u012c") - buf.write("\16\u012c\u0aa7\13\u012c\3\u012c\3\u012c\3\u012c\3\u012c") - buf.write("\3\u012c\3\u012d\6\u012d\u0aaf\n\u012d\r\u012d\16\u012d") - buf.write("\u0ab0\3\u012d\3\u012d\3\u012e\3\u012e\3\u0aa5\2\u012f") - buf.write("\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31") - buf.write("\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31") - buf.write("\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O") - buf.write(")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;") - buf.write("u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b") - buf.write("G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b") - buf.write("O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab") - buf.write("W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb") - buf.write("_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cb") - buf.write("g\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db") - buf.write("o\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00eb") - buf.write("w\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb") - buf.write("\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105") - buf.write("\u0084\u0107\u0085\u0109\u0086\u010b\u0087\u010d\u0088") - buf.write("\u010f\u0089\u0111\u008a\u0113\u008b\u0115\u008c\u0117") - buf.write("\u008d\u0119\u008e\u011b\u008f\u011d\u0090\u011f\u0091") - buf.write("\u0121\u0092\u0123\u0093\u0125\u0094\u0127\u0095\u0129") - buf.write("\u0096\u012b\u0097\u012d\u0098\u012f\u0099\u0131\u009a") - buf.write("\u0133\u009b\u0135\u009c\u0137\u009d\u0139\u009e\u013b") - buf.write("\u009f\u013d\u00a0\u013f\u00a1\u0141\u00a2\u0143\u00a3") - buf.write("\u0145\u00a4\u0147\u00a5\u0149\u00a6\u014b\u00a7\u014d") - buf.write("\u00a8\u014f\u00a9\u0151\u00aa\u0153\u00ab\u0155\u00ac") - buf.write("\u0157\u00ad\u0159\u00ae\u015b\u00af\u015d\u00b0\u015f") - buf.write("\u00b1\u0161\u00b2\u0163\u00b3\u0165\u00b4\u0167\u00b5") - buf.write("\u0169\u00b6\u016b\u00b7\u016d\u00b8\u016f\u00b9\u0171") - buf.write("\u00ba\u0173\u00bb\u0175\u00bc\u0177\u00bd\u0179\u00be") - buf.write("\u017b\u00bf\u017d\u00c0\u017f\u00c1\u0181\u00c2\u0183") - buf.write("\u00c3\u0185\u00c4\u0187\u00c5\u0189\u00c6\u018b\u00c7") - buf.write("\u018d\u00c8\u018f\u00c9\u0191\u00ca\u0193\u00cb\u0195") - buf.write("\u00cc\u0197\u00cd\u0199\u00ce\u019b\u00cf\u019d\u00d0") - buf.write("\u019f\u00d1\u01a1\u00d2\u01a3\u00d3\u01a5\u00d4\u01a7") - buf.write("\u00d5\u01a9\u00d6\u01ab\u00d7\u01ad\u00d8\u01af\u00d9") - buf.write("\u01b1\u00da\u01b3\u00db\u01b5\u00dc\u01b7\u00dd\u01b9") - buf.write("\u00de\u01bb\u00df\u01bd\u00e0\u01bf\u00e1\u01c1\u00e2") - buf.write("\u01c3\u00e3\u01c5\u00e4\u01c7\u00e5\u01c9\u00e6\u01cb") - buf.write("\u00e7\u01cd\u00e8\u01cf\u00e9\u01d1\u00ea\u01d3\u00eb") - buf.write("\u01d5\u00ec\u01d7\u00ed\u01d9\u00ee\u01db\u00ef\u01dd") - buf.write("\u00f0\u01df\u00f1\u01e1\u00f2\u01e3\u00f3\u01e5\u00f4") - buf.write("\u01e7\u00f5\u01e9\u00f6\u01eb\u00f7\u01ed\u00f8\u01ef") - buf.write("\u00f9\u01f1\u00fa\u01f3\u00fb\u01f5\u00fc\u01f7\u00fd") - buf.write("\u01f9\u00fe\u01fb\u00ff\u01fd\u0100\u01ff\u0101\u0201") - buf.write("\u0102\u0203\u0103\u0205\u0104\u0207\u0105\u0209\u0106") - buf.write("\u020b\u0107\u020d\u0108\u020f\u0109\u0211\u010a\u0213") - buf.write("\u010b\u0215\u010c\u0217\u010d\u0219\u010e\u021b\u010f") - buf.write("\u021d\u0110\u021f\u0111\u0221\u0112\u0223\u0113\u0225") - buf.write("\u0114\u0227\u0115\u0229\u0116\u022b\u0117\u022d\u0118") - buf.write("\u022f\u0119\u0231\u011a\u0233\u011b\u0235\u011c\u0237") - buf.write("\u011d\u0239\u011e\u023b\u011f\u023d\u0120\u023f\u0121") - buf.write("\u0241\u0122\u0243\u0123\u0245\u0124\u0247\u0125\u0249") - buf.write("\u0126\u024b\u0127\u024d\2\u024f\2\u0251\2\u0253\2\u0255") - buf.write("\u0128\u0257\u0129\u0259\u012a\u025b\u012b\3\2\n\4\2)") - buf.write(")^^\4\2$$^^\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f\f\17\17") - buf.write("\5\2\13\f\17\17\"\"\2\u0adc\2\3\3\2\2\2\2\5\3\2\2\2\2") - buf.write("\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") - buf.write("\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") - buf.write("\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") - buf.write("\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2") - buf.write("\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") - buf.write("\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") - buf.write("\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2") - buf.write("\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3") - buf.write("\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y") - buf.write("\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2") - buf.write("c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2") - buf.write("\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2") - buf.write("\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3") - buf.write("\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2") - buf.write("\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d") - buf.write("\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2") - buf.write("\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b") - buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") - buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") - buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") - buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") - buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") - buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") - buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") - buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") - buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") - buf.write("\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1") - buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2") - buf.write("\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef") - buf.write("\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2") - buf.write("\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd") - buf.write("\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2") - buf.write("\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b") - buf.write("\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2") - buf.write("\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119") - buf.write("\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2") - buf.write("\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u0127") - buf.write("\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2") - buf.write("\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135") - buf.write("\3\2\2\2\2\u0137\3\2\2\2\2\u0139\3\2\2\2\2\u013b\3\2\2") - buf.write("\2\2\u013d\3\2\2\2\2\u013f\3\2\2\2\2\u0141\3\2\2\2\2\u0143") - buf.write("\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2") - buf.write("\2\2\u014b\3\2\2\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0151") - buf.write("\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2") - buf.write("\2\2\u0159\3\2\2\2\2\u015b\3\2\2\2\2\u015d\3\2\2\2\2\u015f") - buf.write("\3\2\2\2\2\u0161\3\2\2\2\2\u0163\3\2\2\2\2\u0165\3\2\2") - buf.write("\2\2\u0167\3\2\2\2\2\u0169\3\2\2\2\2\u016b\3\2\2\2\2\u016d") - buf.write("\3\2\2\2\2\u016f\3\2\2\2\2\u0171\3\2\2\2\2\u0173\3\2\2") - buf.write("\2\2\u0175\3\2\2\2\2\u0177\3\2\2\2\2\u0179\3\2\2\2\2\u017b") - buf.write("\3\2\2\2\2\u017d\3\2\2\2\2\u017f\3\2\2\2\2\u0181\3\2\2") - buf.write("\2\2\u0183\3\2\2\2\2\u0185\3\2\2\2\2\u0187\3\2\2\2\2\u0189") - buf.write("\3\2\2\2\2\u018b\3\2\2\2\2\u018d\3\2\2\2\2\u018f\3\2\2") - buf.write("\2\2\u0191\3\2\2\2\2\u0193\3\2\2\2\2\u0195\3\2\2\2\2\u0197") - buf.write("\3\2\2\2\2\u0199\3\2\2\2\2\u019b\3\2\2\2\2\u019d\3\2\2") - buf.write("\2\2\u019f\3\2\2\2\2\u01a1\3\2\2\2\2\u01a3\3\2\2\2\2\u01a5") - buf.write("\3\2\2\2\2\u01a7\3\2\2\2\2\u01a9\3\2\2\2\2\u01ab\3\2\2") - buf.write("\2\2\u01ad\3\2\2\2\2\u01af\3\2\2\2\2\u01b1\3\2\2\2\2\u01b3") - buf.write("\3\2\2\2\2\u01b5\3\2\2\2\2\u01b7\3\2\2\2\2\u01b9\3\2\2") - buf.write("\2\2\u01bb\3\2\2\2\2\u01bd\3\2\2\2\2\u01bf\3\2\2\2\2\u01c1") - buf.write("\3\2\2\2\2\u01c3\3\2\2\2\2\u01c5\3\2\2\2\2\u01c7\3\2\2") - buf.write("\2\2\u01c9\3\2\2\2\2\u01cb\3\2\2\2\2\u01cd\3\2\2\2\2\u01cf") - buf.write("\3\2\2\2\2\u01d1\3\2\2\2\2\u01d3\3\2\2\2\2\u01d5\3\2\2") - buf.write("\2\2\u01d7\3\2\2\2\2\u01d9\3\2\2\2\2\u01db\3\2\2\2\2\u01dd") - buf.write("\3\2\2\2\2\u01df\3\2\2\2\2\u01e1\3\2\2\2\2\u01e3\3\2\2") - buf.write("\2\2\u01e5\3\2\2\2\2\u01e7\3\2\2\2\2\u01e9\3\2\2\2\2\u01eb") - buf.write("\3\2\2\2\2\u01ed\3\2\2\2\2\u01ef\3\2\2\2\2\u01f1\3\2\2") - buf.write("\2\2\u01f3\3\2\2\2\2\u01f5\3\2\2\2\2\u01f7\3\2\2\2\2\u01f9") - buf.write("\3\2\2\2\2\u01fb\3\2\2\2\2\u01fd\3\2\2\2\2\u01ff\3\2\2") - buf.write("\2\2\u0201\3\2\2\2\2\u0203\3\2\2\2\2\u0205\3\2\2\2\2\u0207") - buf.write("\3\2\2\2\2\u0209\3\2\2\2\2\u020b\3\2\2\2\2\u020d\3\2\2") - buf.write("\2\2\u020f\3\2\2\2\2\u0211\3\2\2\2\2\u0213\3\2\2\2\2\u0215") - buf.write("\3\2\2\2\2\u0217\3\2\2\2\2\u0219\3\2\2\2\2\u021b\3\2\2") - buf.write("\2\2\u021d\3\2\2\2\2\u021f\3\2\2\2\2\u0221\3\2\2\2\2\u0223") - buf.write("\3\2\2\2\2\u0225\3\2\2\2\2\u0227\3\2\2\2\2\u0229\3\2\2") - buf.write("\2\2\u022b\3\2\2\2\2\u022d\3\2\2\2\2\u022f\3\2\2\2\2\u0231") - buf.write("\3\2\2\2\2\u0233\3\2\2\2\2\u0235\3\2\2\2\2\u0237\3\2\2") - buf.write("\2\2\u0239\3\2\2\2\2\u023b\3\2\2\2\2\u023d\3\2\2\2\2\u023f") - buf.write("\3\2\2\2\2\u0241\3\2\2\2\2\u0243\3\2\2\2\2\u0245\3\2\2") - buf.write("\2\2\u0247\3\2\2\2\2\u0249\3\2\2\2\2\u024b\3\2\2\2\2\u0255") - buf.write("\3\2\2\2\2\u0257\3\2\2\2\2\u0259\3\2\2\2\2\u025b\3\2\2") - buf.write("\2\3\u025d\3\2\2\2\5\u025f\3\2\2\2\7\u0261\3\2\2\2\t\u0263") - buf.write("\3\2\2\2\13\u0265\3\2\2\2\r\u0267\3\2\2\2\17\u026b\3\2") - buf.write("\2\2\21\u026e\3\2\2\2\23\u0271\3\2\2\2\25\u0273\3\2\2") - buf.write("\2\27\u0275\3\2\2\2\31\u0277\3\2\2\2\33\u027b\3\2\2\2") - buf.write("\35\u0281\3\2\2\2\37\u0285\3\2\2\2!\u028b\3\2\2\2#\u0293") - buf.write("\3\2\2\2%\u0297\3\2\2\2\'\u029c\3\2\2\2)\u02a0\3\2\2\2") - buf.write("+\u02a8\3\2\2\2-\u02ae\3\2\2\2/\u02b1\3\2\2\2\61\u02b5") - buf.write("\3\2\2\2\63\u02b8\3\2\2\2\65\u02c6\3\2\2\2\67\u02ce\3") - buf.write("\2\2\29\u02d3\3\2\2\2;\u02da\3\2\2\2=\u02e2\3\2\2\2?\u02e5") - buf.write("\3\2\2\2A\u02eb\3\2\2\2C\u02f3\3\2\2\2E\u02f8\3\2\2\2") - buf.write("G\u02fd\3\2\2\2I\u0304\3\2\2\2K\u030a\3\2\2\2M\u0310\3") - buf.write("\2\2\2O\u0318\3\2\2\2Q\u0322\3\2\2\2S\u032a\3\2\2\2U\u0332") - buf.write("\3\2\2\2W\u033d\3\2\2\2Y\u0344\3\2\2\2[\u034c\3\2\2\2") - buf.write("]\u0354\3\2\2\2_\u035b\3\2\2\2a\u0363\3\2\2\2c\u036f\3") - buf.write("\2\2\2e\u0377\3\2\2\2g\u0383\3\2\2\2i\u038e\3\2\2\2k\u0393") - buf.write("\3\2\2\2m\u039a\3\2\2\2o\u03a0\3\2\2\2q\u03a5\3\2\2\2") - buf.write("s\u03ad\3\2\2\2u\u03ba\3\2\2\2w\u03c7\3\2\2\2y\u03d9\3") - buf.write("\2\2\2{\u03e6\3\2\2\2}\u03eb\3\2\2\2\177\u0404\3\2\2\2") - buf.write("\u0081\u0406\3\2\2\2\u0083\u040a\3\2\2\2\u0085\u0417\3") - buf.write("\2\2\2\u0087\u041f\3\2\2\2\u0089\u0426\3\2\2\2\u008b\u0430") - buf.write("\3\2\2\2\u008d\u0435\3\2\2\2\u008f\u043e\3\2\2\2\u0091") - buf.write("\u0442\3\2\2\2\u0093\u044e\3\2\2\2\u0095\u0458\3\2\2\2") - buf.write("\u0097\u0461\3\2\2\2\u0099\u046c\3\2\2\2\u009b\u0471\3") - buf.write("\2\2\2\u009d\u0476\3\2\2\2\u009f\u047a\3\2\2\2\u00a1\u0481") - buf.write("\3\2\2\2\u00a3\u0489\3\2\2\2\u00a5\u0490\3\2\2\2\u00a7") - buf.write("\u0499\3\2\2\2\u00a9\u04a0\3\2\2\2\u00ab\u04a8\3\2\2\2") - buf.write("\u00ad\u04af\3\2\2\2\u00af\u04b8\3\2\2\2\u00b1\u04c1\3") - buf.write("\2\2\2\u00b3\u04c9\3\2\2\2\u00b5\u04cf\3\2\2\2\u00b7\u04d5") - buf.write("\3\2\2\2\u00b9\u04dc\3\2\2\2\u00bb\u04e3\3\2\2\2\u00bd") - buf.write("\u04ee\3\2\2\2\u00bf\u04f4\3\2\2\2\u00c1\u04fe\3\2\2\2") - buf.write("\u00c3\u0502\3\2\2\2\u00c5\u050a\3\2\2\2\u00c7\u0511\3") - buf.write("\2\2\2\u00c9\u051b\3\2\2\2\u00cb\u0520\3\2\2\2\u00cd\u0525") - buf.write("\3\2\2\2\u00cf\u052e\3\2\2\2\u00d1\u0538\3\2\2\2\u00d3") - buf.write("\u053f\3\2\2\2\u00d5\u0545\3\2\2\2\u00d7\u054b\3\2\2\2") - buf.write("\u00d9\u0554\3\2\2\2\u00db\u055b\3\2\2\2\u00dd\u0560\3") - buf.write("\2\2\2\u00df\u0563\3\2\2\2\u00e1\u056a\3\2\2\2\u00e3\u0571") - buf.write("\3\2\2\2\u00e5\u0574\3\2\2\2\u00e7\u057a\3\2\2\2\u00e9") - buf.write("\u0582\3\2\2\2\u00eb\u0588\3\2\2\2\u00ed\u058f\3\2\2\2") - buf.write("\u00ef\u059b\3\2\2\2\u00f1\u05a2\3\2\2\2\u00f3\u05ac\3") - buf.write("\2\2\2\u00f5\u05b5\3\2\2\2\u00f7\u05ba\3\2\2\2\u00f9\u05bd") - buf.write("\3\2\2\2\u00fb\u05c3\3\2\2\2\u00fd\u05c8\3\2\2\2\u00ff") - buf.write("\u05cd\3\2\2\2\u0101\u05d2\3\2\2\2\u0103\u05da\3\2\2\2") - buf.write("\u0105\u05df\3\2\2\2\u0107\u05e7\3\2\2\2\u0109\u05ec\3") - buf.write("\2\2\2\u010b\u05f1\3\2\2\2\u010d\u05f7\3\2\2\2\u010f\u05fd") - buf.write("\3\2\2\2\u0111\u0602\3\2\2\2\u0113\u0607\3\2\2\2\u0115") - buf.write("\u060d\3\2\2\2\u0117\u0616\3\2\2\2\u0119\u061b\3\2\2\2") - buf.write("\u011b\u0621\3\2\2\2\u011d\u0629\3\2\2\2\u011f\u062f\3") - buf.write("\2\2\2\u0121\u0633\3\2\2\2\u0123\u063b\3\2\2\2\u0125\u0641") - buf.write("\3\2\2\2\u0127\u0648\3\2\2\2\u0129\u064e\3\2\2\2\u012b") - buf.write("\u0653\3\2\2\2\u012d\u065d\3\2\2\2\u012f\u0668\3\2\2\2") - buf.write("\u0131\u0670\3\2\2\2\u0133\u0677\3\2\2\2\u0135\u0679\3") - buf.write("\2\2\2\u0137\u067e\3\2\2\2\u0139\u0684\3\2\2\2\u013b\u0687") - buf.write("\3\2\2\2\u013d\u068a\3\2\2\2\u013f\u068f\3\2\2\2\u0141") - buf.write("\u0696\3\2\2\2\u0143\u069e\3\2\2\2\u0145\u06a1\3\2\2\2") - buf.write("\u0147\u06a7\3\2\2\2\u0149\u06ab\3\2\2\2\u014b\u06b1\3") - buf.write("\2\2\2\u014d\u06be\3\2\2\2\u014f\u06c3\3\2\2\2\u0151\u06cc") - buf.write("\3\2\2\2\u0153\u06d4\3\2\2\2\u0155\u06de\3\2\2\2\u0157") - buf.write("\u06e8\3\2\2\2\u0159\u06f4\3\2\2\2\u015b\u06ff\3\2\2\2") - buf.write("\u015d\u0707\3\2\2\2\u015f\u070d\3\2\2\2\u0161\u0715\3") - buf.write("\2\2\2\u0163\u071e\3\2\2\2\u0165\u0728\3\2\2\2\u0167\u0730") - buf.write("\3\2\2\2\u0169\u073b\3\2\2\2\u016b\u0746\3\2\2\2\u016d") - buf.write("\u074c\3\2\2\2\u016f\u0752\3\2\2\2\u0171\u0758\3\2\2\2") - buf.write("\u0173\u0765\3\2\2\2\u0175\u0772\3\2\2\2\u0177\u077a\3") - buf.write("\2\2\2\u0179\u0781\3\2\2\2\u017b\u078c\3\2\2\2\u017d\u0794") - buf.write("\3\2\2\2\u017f\u079b\3\2\2\2\u0181\u07a2\3\2\2\2\u0183") - buf.write("\u07aa\3\2\2\2\u0185\u07b0\3\2\2\2\u0187\u07b9\3\2\2\2") - buf.write("\u0189\u07c0\3\2\2\2\u018b\u07d1\3\2\2\2\u018d\u07d3\3") - buf.write("\2\2\2\u018f\u07d8\3\2\2\2\u0191\u07de\3\2\2\2\u0193\u07e7") - buf.write("\3\2\2\2\u0195\u07ee\3\2\2\2\u0197\u07f2\3\2\2\2\u0199") - buf.write("\u07f7\3\2\2\2\u019b\u07fe\3\2\2\2\u019d\u0805\3\2\2\2") - buf.write("\u019f\u080c\3\2\2\2\u01a1\u0811\3\2\2\2\u01a3\u081b\3") - buf.write("\2\2\2\u01a5\u0821\3\2\2\2\u01a7\u0831\3\2\2\2\u01a9\u083e") - buf.write("\3\2\2\2\u01ab\u0842\3\2\2\2\u01ad\u0848\3\2\2\2\u01af") - buf.write("\u084d\3\2\2\2\u01b1\u0852\3\2\2\2\u01b3\u0859\3\2\2\2") - buf.write("\u01b5\u085e\3\2\2\2\u01b7\u0863\3\2\2\2\u01b9\u086a\3") - buf.write("\2\2\2\u01bb\u0870\3\2\2\2\u01bd\u087b\3\2\2\2\u01bf\u0882") - buf.write("\3\2\2\2\u01c1\u088b\3\2\2\2\u01c3\u0892\3\2\2\2\u01c5") - buf.write("\u0899\3\2\2\2\u01c7\u08a3\3\2\2\2\u01c9\u08a9\3\2\2\2") - buf.write("\u01cb\u08b0\3\2\2\2\u01cd\u08bc\3\2\2\2\u01cf\u08d7\3") - buf.write("\2\2\2\u01d1\u08d9\3\2\2\2\u01d3\u08e4\3\2\2\2\u01d5\u08e9") - buf.write("\3\2\2\2\u01d7\u08ec\3\2\2\2\u01d9\u08f2\3\2\2\2\u01db") - buf.write("\u08fb\3\2\2\2\u01dd\u0907\3\2\2\2\u01df\u0914\3\2\2\2") - buf.write("\u01e1\u091e\3\2\2\2\u01e3\u0923\3\2\2\2\u01e5\u0928\3") - buf.write("\2\2\2\u01e7\u0931\3\2\2\2\u01e9\u0936\3\2\2\2\u01eb\u0940") - buf.write("\3\2\2\2\u01ed\u094a\3\2\2\2\u01ef\u0952\3\2\2\2\u01f1") - buf.write("\u0958\3\2\2\2\u01f3\u095f\3\2\2\2\u01f5\u0967\3\2\2\2") - buf.write("\u01f7\u096e\3\2\2\2\u01f9\u0974\3\2\2\2\u01fb\u097b\3") - buf.write("\2\2\2\u01fd\u097f\3\2\2\2\u01ff\u0984\3\2\2\2\u0201\u098a") - buf.write("\3\2\2\2\u0203\u0991\3\2\2\2\u0205\u0996\3\2\2\2\u0207") - buf.write("\u099c\3\2\2\2\u0209\u09a1\3\2\2\2\u020b\u09a7\3\2\2\2") - buf.write("\u020d\u09ae\3\2\2\2\u020f\u09b3\3\2\2\2\u0211\u09bb\3") - buf.write("\2\2\2\u0213\u09bd\3\2\2\2\u0215\u09c1\3\2\2\2\u0217\u09c4") - buf.write("\3\2\2\2\u0219\u09c7\3\2\2\2\u021b\u09cd\3\2\2\2\u021d") - buf.write("\u09cf\3\2\2\2\u021f\u09d5\3\2\2\2\u0221\u09d7\3\2\2\2") - buf.write("\u0223\u09d9\3\2\2\2\u0225\u09db\3\2\2\2\u0227\u09dd\3") - buf.write("\2\2\2\u0229\u09df\3\2\2\2\u022b\u09e1\3\2\2\2\u022d\u09e5") - buf.write("\3\2\2\2\u022f\u09e7\3\2\2\2\u0231\u09e9\3\2\2\2\u0233") - buf.write("\u09eb\3\2\2\2\u0235\u09ee\3\2\2\2\u0237\u0a04\3\2\2\2") - buf.write("\u0239\u0a07\3\2\2\2\u023b\u0a0e\3\2\2\2\u023d\u0a15\3") - buf.write("\2\2\2\u023f\u0a1c\3\2\2\2\u0241\u0a2b\3\2\2\2\u0243\u0a2d") - buf.write("\3\2\2\2\u0245\u0a41\3\2\2\2\u0247\u0a57\3\2\2\2\u0249") - buf.write("\u0a5c\3\2\2\2\u024b\u0a60\3\2\2\2\u024d\u0a7d\3\2\2\2") - buf.write("\u024f\u0a7f\3\2\2\2\u0251\u0a88\3\2\2\2\u0253\u0a8a\3") - buf.write("\2\2\2\u0255\u0a8c\3\2\2\2\u0257\u0a9d\3\2\2\2\u0259\u0aae") - buf.write("\3\2\2\2\u025b\u0ab4\3\2\2\2\u025d\u025e\7=\2\2\u025e") - buf.write("\4\3\2\2\2\u025f\u0260\7*\2\2\u0260\6\3\2\2\2\u0261\u0262") - buf.write("\7+\2\2\u0262\b\3\2\2\2\u0263\u0264\7.\2\2\u0264\n\3\2") - buf.write("\2\2\u0265\u0266\7\60\2\2\u0266\f\3\2\2\2\u0267\u0268") - buf.write("\7\61\2\2\u0268\u0269\7,\2\2\u0269\u026a\7-\2\2\u026a") - buf.write("\16\3\2\2\2\u026b\u026c\7,\2\2\u026c\u026d\7\61\2\2\u026d") - buf.write("\20\3\2\2\2\u026e\u026f\7/\2\2\u026f\u0270\7@\2\2\u0270") - buf.write("\22\3\2\2\2\u0271\u0272\7]\2\2\u0272\24\3\2\2\2\u0273") - buf.write("\u0274\7_\2\2\u0274\26\3\2\2\2\u0275\u0276\7<\2\2\u0276") - buf.write("\30\3\2\2\2\u0277\u0278\7C\2\2\u0278\u0279\7F\2\2\u0279") - buf.write("\u027a\7F\2\2\u027a\32\3\2\2\2\u027b\u027c\7C\2\2\u027c") - buf.write("\u027d\7H\2\2\u027d\u027e\7V\2\2\u027e\u027f\7G\2\2\u027f") - buf.write("\u0280\7T\2\2\u0280\34\3\2\2\2\u0281\u0282\7C\2\2\u0282") - buf.write("\u0283\7N\2\2\u0283\u0284\7N\2\2\u0284\36\3\2\2\2\u0285") - buf.write("\u0286\7C\2\2\u0286\u0287\7N\2\2\u0287\u0288\7V\2\2\u0288") - buf.write("\u0289\7G\2\2\u0289\u028a\7T\2\2\u028a \3\2\2\2\u028b") - buf.write("\u028c\7C\2\2\u028c\u028d\7P\2\2\u028d\u028e\7C\2\2\u028e") - buf.write("\u028f\7N\2\2\u028f\u0290\7[\2\2\u0290\u0291\7\\\2\2\u0291") - buf.write("\u0292\7G\2\2\u0292\"\3\2\2\2\u0293\u0294\7C\2\2\u0294") - buf.write("\u0295\7P\2\2\u0295\u0296\7F\2\2\u0296$\3\2\2\2\u0297") - buf.write("\u0298\7C\2\2\u0298\u0299\7P\2\2\u0299\u029a\7V\2\2\u029a") - buf.write("\u029b\7K\2\2\u029b&\3\2\2\2\u029c\u029d\7C\2\2\u029d") - buf.write("\u029e\7P\2\2\u029e\u029f\7[\2\2\u029f(\3\2\2\2\u02a0") - buf.write("\u02a1\7C\2\2\u02a1\u02a2\7T\2\2\u02a2\u02a3\7E\2\2\u02a3") - buf.write("\u02a4\7J\2\2\u02a4\u02a5\7K\2\2\u02a5\u02a6\7X\2\2\u02a6") - buf.write("\u02a7\7G\2\2\u02a7*\3\2\2\2\u02a8\u02a9\7C\2\2\u02a9") - buf.write("\u02aa\7T\2\2\u02aa\u02ab\7T\2\2\u02ab\u02ac\7C\2\2\u02ac") - buf.write("\u02ad\7[\2\2\u02ad,\3\2\2\2\u02ae\u02af\7C\2\2\u02af") - buf.write("\u02b0\7U\2\2\u02b0.\3\2\2\2\u02b1\u02b2\7C\2\2\u02b2") - buf.write("\u02b3\7U\2\2\u02b3\u02b4\7E\2\2\u02b4\60\3\2\2\2\u02b5") - buf.write("\u02b6\7C\2\2\u02b6\u02b7\7V\2\2\u02b7\62\3\2\2\2\u02b8") - buf.write("\u02b9\7C\2\2\u02b9\u02ba\7W\2\2\u02ba\u02bb\7V\2\2\u02bb") - buf.write("\u02bc\7J\2\2\u02bc\u02bd\7Q\2\2\u02bd\u02be\7T\2\2\u02be") - buf.write("\u02bf\7K\2\2\u02bf\u02c0\7\\\2\2\u02c0\u02c1\7C\2\2\u02c1") - buf.write("\u02c2\7V\2\2\u02c2\u02c3\7K\2\2\u02c3\u02c4\7Q\2\2\u02c4") - buf.write("\u02c5\7P\2\2\u02c5\64\3\2\2\2\u02c6\u02c7\7D\2\2\u02c7") - buf.write("\u02c8\7G\2\2\u02c8\u02c9\7V\2\2\u02c9\u02ca\7Y\2\2\u02ca") - buf.write("\u02cb\7G\2\2\u02cb\u02cc\7G\2\2\u02cc\u02cd\7P\2\2\u02cd") - buf.write("\66\3\2\2\2\u02ce\u02cf\7D\2\2\u02cf\u02d0\7Q\2\2\u02d0") - buf.write("\u02d1\7V\2\2\u02d1\u02d2\7J\2\2\u02d28\3\2\2\2\u02d3") - buf.write("\u02d4\7D\2\2\u02d4\u02d5\7W\2\2\u02d5\u02d6\7E\2\2\u02d6") - buf.write("\u02d7\7M\2\2\u02d7\u02d8\7G\2\2\u02d8\u02d9\7V\2\2\u02d9") - buf.write(":\3\2\2\2\u02da\u02db\7D\2\2\u02db\u02dc\7W\2\2\u02dc") - buf.write("\u02dd\7E\2\2\u02dd\u02de\7M\2\2\u02de\u02df\7G\2\2\u02df") - buf.write("\u02e0\7V\2\2\u02e0\u02e1\7U\2\2\u02e1<\3\2\2\2\u02e2") - buf.write("\u02e3\7D\2\2\u02e3\u02e4\7[\2\2\u02e4>\3\2\2\2\u02e5") - buf.write("\u02e6\7E\2\2\u02e6\u02e7\7C\2\2\u02e7\u02e8\7E\2\2\u02e8") - buf.write("\u02e9\7J\2\2\u02e9\u02ea\7G\2\2\u02ea@\3\2\2\2\u02eb") - buf.write("\u02ec\7E\2\2\u02ec\u02ed\7C\2\2\u02ed\u02ee\7U\2\2\u02ee") - buf.write("\u02ef\7E\2\2\u02ef\u02f0\7C\2\2\u02f0\u02f1\7F\2\2\u02f1") - buf.write("\u02f2\7G\2\2\u02f2B\3\2\2\2\u02f3\u02f4\7E\2\2\u02f4") - buf.write("\u02f5\7C\2\2\u02f5\u02f6\7U\2\2\u02f6\u02f7\7G\2\2\u02f7") - buf.write("D\3\2\2\2\u02f8\u02f9\7E\2\2\u02f9\u02fa\7C\2\2\u02fa") - buf.write("\u02fb\7U\2\2\u02fb\u02fc\7V\2\2\u02fcF\3\2\2\2\u02fd") - buf.write("\u02fe\7E\2\2\u02fe\u02ff\7J\2\2\u02ff\u0300\7C\2\2\u0300") - buf.write("\u0301\7P\2\2\u0301\u0302\7I\2\2\u0302\u0303\7G\2\2\u0303") - buf.write("H\3\2\2\2\u0304\u0305\7E\2\2\u0305\u0306\7J\2\2\u0306") - buf.write("\u0307\7G\2\2\u0307\u0308\7E\2\2\u0308\u0309\7M\2\2\u0309") - buf.write("J\3\2\2\2\u030a\u030b\7E\2\2\u030b\u030c\7N\2\2\u030c") - buf.write("\u030d\7G\2\2\u030d\u030e\7C\2\2\u030e\u030f\7T\2\2\u030f") - buf.write("L\3\2\2\2\u0310\u0311\7E\2\2\u0311\u0312\7N\2\2\u0312") - buf.write("\u0313\7W\2\2\u0313\u0314\7U\2\2\u0314\u0315\7V\2\2\u0315") - buf.write("\u0316\7G\2\2\u0316\u0317\7T\2\2\u0317N\3\2\2\2\u0318") - buf.write("\u0319\7E\2\2\u0319\u031a\7N\2\2\u031a\u031b\7W\2\2\u031b") - buf.write("\u031c\7U\2\2\u031c\u031d\7V\2\2\u031d\u031e\7G\2\2\u031e") - buf.write("\u031f\7T\2\2\u031f\u0320\7G\2\2\u0320\u0321\7F\2\2\u0321") - buf.write("P\3\2\2\2\u0322\u0323\7E\2\2\u0323\u0324\7Q\2\2\u0324") - buf.write("\u0325\7F\2\2\u0325\u0326\7G\2\2\u0326\u0327\7I\2\2\u0327") - buf.write("\u0328\7G\2\2\u0328\u0329\7P\2\2\u0329R\3\2\2\2\u032a") - buf.write("\u032b\7E\2\2\u032b\u032c\7Q\2\2\u032c\u032d\7N\2\2\u032d") - buf.write("\u032e\7N\2\2\u032e\u032f\7C\2\2\u032f\u0330\7V\2\2\u0330") - buf.write("\u0331\7G\2\2\u0331T\3\2\2\2\u0332\u0333\7E\2\2\u0333") - buf.write("\u0334\7Q\2\2\u0334\u0335\7N\2\2\u0335\u0336\7N\2\2\u0336") - buf.write("\u0337\7G\2\2\u0337\u0338\7E\2\2\u0338\u0339\7V\2\2\u0339") - buf.write("\u033a\7K\2\2\u033a\u033b\7Q\2\2\u033b\u033c\7P\2\2\u033c") - buf.write("V\3\2\2\2\u033d\u033e\7E\2\2\u033e\u033f\7Q\2\2\u033f") - buf.write("\u0340\7N\2\2\u0340\u0341\7W\2\2\u0341\u0342\7O\2\2\u0342") - buf.write("\u0343\7P\2\2\u0343X\3\2\2\2\u0344\u0345\7E\2\2\u0345") - buf.write("\u0346\7Q\2\2\u0346\u0347\7N\2\2\u0347\u0348\7W\2\2\u0348") - buf.write("\u0349\7O\2\2\u0349\u034a\7P\2\2\u034a\u034b\7U\2\2\u034b") - buf.write("Z\3\2\2\2\u034c\u034d\7E\2\2\u034d\u034e\7Q\2\2\u034e") - buf.write("\u034f\7O\2\2\u034f\u0350\7O\2\2\u0350\u0351\7G\2\2\u0351") - buf.write("\u0352\7P\2\2\u0352\u0353\7V\2\2\u0353\\\3\2\2\2\u0354") - buf.write("\u0355\7E\2\2\u0355\u0356\7Q\2\2\u0356\u0357\7O\2\2\u0357") - buf.write("\u0358\7O\2\2\u0358\u0359\7K\2\2\u0359\u035a\7V\2\2\u035a") - buf.write("^\3\2\2\2\u035b\u035c\7E\2\2\u035c\u035d\7Q\2\2\u035d") - buf.write("\u035e\7O\2\2\u035e\u035f\7R\2\2\u035f\u0360\7C\2\2\u0360") - buf.write("\u0361\7E\2\2\u0361\u0362\7V\2\2\u0362`\3\2\2\2\u0363") - buf.write("\u0364\7E\2\2\u0364\u0365\7Q\2\2\u0365\u0366\7O\2\2\u0366") - buf.write("\u0367\7R\2\2\u0367\u0368\7C\2\2\u0368\u0369\7E\2\2\u0369") - buf.write("\u036a\7V\2\2\u036a\u036b\7K\2\2\u036b\u036c\7Q\2\2\u036c") - buf.write("\u036d\7P\2\2\u036d\u036e\7U\2\2\u036eb\3\2\2\2\u036f") - buf.write("\u0370\7E\2\2\u0370\u0371\7Q\2\2\u0371\u0372\7O\2\2\u0372") - buf.write("\u0373\7R\2\2\u0373\u0374\7W\2\2\u0374\u0375\7V\2\2\u0375") - buf.write("\u0376\7G\2\2\u0376d\3\2\2\2\u0377\u0378\7E\2\2\u0378") - buf.write("\u0379\7Q\2\2\u0379\u037a\7P\2\2\u037a\u037b\7E\2\2\u037b") - buf.write("\u037c\7C\2\2\u037c\u037d\7V\2\2\u037d\u037e\7G\2\2\u037e") - buf.write("\u037f\7P\2\2\u037f\u0380\7C\2\2\u0380\u0381\7V\2\2\u0381") - buf.write("\u0382\7G\2\2\u0382f\3\2\2\2\u0383\u0384\7E\2\2\u0384") - buf.write("\u0385\7Q\2\2\u0385\u0386\7P\2\2\u0386\u0387\7U\2\2\u0387") - buf.write("\u0388\7V\2\2\u0388\u0389\7T\2\2\u0389\u038a\7C\2\2\u038a") - buf.write("\u038b\7K\2\2\u038b\u038c\7P\2\2\u038c\u038d\7V\2\2\u038d") - buf.write("h\3\2\2\2\u038e\u038f\7E\2\2\u038f\u0390\7Q\2\2\u0390") - buf.write("\u0391\7U\2\2\u0391\u0392\7V\2\2\u0392j\3\2\2\2\u0393") - buf.write("\u0394\7E\2\2\u0394\u0395\7T\2\2\u0395\u0396\7G\2\2\u0396") - buf.write("\u0397\7C\2\2\u0397\u0398\7V\2\2\u0398\u0399\7G\2\2\u0399") - buf.write("l\3\2\2\2\u039a\u039b\7E\2\2\u039b\u039c\7T\2\2\u039c") - buf.write("\u039d\7Q\2\2\u039d\u039e\7U\2\2\u039e\u039f\7U\2\2\u039f") - buf.write("n\3\2\2\2\u03a0\u03a1\7E\2\2\u03a1\u03a2\7W\2\2\u03a2") - buf.write("\u03a3\7D\2\2\u03a3\u03a4\7G\2\2\u03a4p\3\2\2\2\u03a5") - buf.write("\u03a6\7E\2\2\u03a6\u03a7\7W\2\2\u03a7\u03a8\7T\2\2\u03a8") - buf.write("\u03a9\7T\2\2\u03a9\u03aa\7G\2\2\u03aa\u03ab\7P\2\2\u03ab") - buf.write("\u03ac\7V\2\2\u03acr\3\2\2\2\u03ad\u03ae\7E\2\2\u03ae") - buf.write("\u03af\7W\2\2\u03af\u03b0\7T\2\2\u03b0\u03b1\7T\2\2\u03b1") - buf.write("\u03b2\7G\2\2\u03b2\u03b3\7P\2\2\u03b3\u03b4\7V\2\2\u03b4") - buf.write("\u03b5\7a\2\2\u03b5\u03b6\7F\2\2\u03b6\u03b7\7C\2\2\u03b7") - buf.write("\u03b8\7V\2\2\u03b8\u03b9\7G\2\2\u03b9t\3\2\2\2\u03ba") - buf.write("\u03bb\7E\2\2\u03bb\u03bc\7W\2\2\u03bc\u03bd\7T\2\2\u03bd") - buf.write("\u03be\7T\2\2\u03be\u03bf\7G\2\2\u03bf\u03c0\7P\2\2\u03c0") - buf.write("\u03c1\7V\2\2\u03c1\u03c2\7a\2\2\u03c2\u03c3\7V\2\2\u03c3") - buf.write("\u03c4\7K\2\2\u03c4\u03c5\7O\2\2\u03c5\u03c6\7G\2\2\u03c6") - buf.write("v\3\2\2\2\u03c7\u03c8\7E\2\2\u03c8\u03c9\7W\2\2\u03c9") - buf.write("\u03ca\7T\2\2\u03ca\u03cb\7T\2\2\u03cb\u03cc\7G\2\2\u03cc") - buf.write("\u03cd\7P\2\2\u03cd\u03ce\7V\2\2\u03ce\u03cf\7a\2\2\u03cf") - buf.write("\u03d0\7V\2\2\u03d0\u03d1\7K\2\2\u03d1\u03d2\7O\2\2\u03d2") - buf.write("\u03d3\7G\2\2\u03d3\u03d4\7U\2\2\u03d4\u03d5\7V\2\2\u03d5") - buf.write("\u03d6\7C\2\2\u03d6\u03d7\7O\2\2\u03d7\u03d8\7R\2\2\u03d8") - buf.write("x\3\2\2\2\u03d9\u03da\7E\2\2\u03da\u03db\7W\2\2\u03db") - buf.write("\u03dc\7T\2\2\u03dc\u03dd\7T\2\2\u03dd\u03de\7G\2\2\u03de") - buf.write("\u03df\7P\2\2\u03df\u03e0\7V\2\2\u03e0\u03e1\7a\2\2\u03e1") - buf.write("\u03e2\7W\2\2\u03e2\u03e3\7U\2\2\u03e3\u03e4\7G\2\2\u03e4") - buf.write("\u03e5\7T\2\2\u03e5z\3\2\2\2\u03e6\u03e7\7F\2\2\u03e7") - buf.write("\u03e8\7C\2\2\u03e8\u03e9\7V\2\2\u03e9\u03ea\7C\2\2\u03ea") - buf.write("|\3\2\2\2\u03eb\u03ec\7F\2\2\u03ec\u03ed\7C\2\2\u03ed") - buf.write("\u03ee\7V\2\2\u03ee\u03ef\7C\2\2\u03ef\u03f0\7D\2\2\u03f0") - buf.write("\u03f1\7C\2\2\u03f1\u03f2\7U\2\2\u03f2\u03f3\7G\2\2\u03f3") - buf.write("~\3\2\2\2\u03f4\u03f5\7F\2\2\u03f5\u03f6\7C\2\2\u03f6") - buf.write("\u03f7\7V\2\2\u03f7\u03f8\7C\2\2\u03f8\u03f9\7D\2\2\u03f9") - buf.write("\u03fa\7C\2\2\u03fa\u03fb\7U\2\2\u03fb\u03fc\7G\2\2\u03fc") - buf.write("\u0405\7U\2\2\u03fd\u03fe\7U\2\2\u03fe\u03ff\7E\2\2\u03ff") - buf.write("\u0400\7J\2\2\u0400\u0401\7G\2\2\u0401\u0402\7O\2\2\u0402") - buf.write("\u0403\7C\2\2\u0403\u0405\7U\2\2\u0404\u03f4\3\2\2\2\u0404") - buf.write("\u03fd\3\2\2\2\u0405\u0080\3\2\2\2\u0406\u0407\7F\2\2") - buf.write("\u0407\u0408\7C\2\2\u0408\u0409\7[\2\2\u0409\u0082\3\2") - buf.write("\2\2\u040a\u040b\7F\2\2\u040b\u040c\7D\2\2\u040c\u040d") - buf.write("\7R\2\2\u040d\u040e\7T\2\2\u040e\u040f\7Q\2\2\u040f\u0410") - buf.write("\7R\2\2\u0410\u0411\7G\2\2\u0411\u0412\7T\2\2\u0412\u0413") - buf.write("\7V\2\2\u0413\u0414\7K\2\2\u0414\u0415\7G\2\2\u0415\u0416") - buf.write("\7U\2\2\u0416\u0084\3\2\2\2\u0417\u0418\7F\2\2\u0418\u0419") - buf.write("\7G\2\2\u0419\u041a\7H\2\2\u041a\u041b\7K\2\2\u041b\u041c") - buf.write("\7P\2\2\u041c\u041d\7G\2\2\u041d\u041e\7F\2\2\u041e\u0086") - buf.write("\3\2\2\2\u041f\u0420\7F\2\2\u0420\u0421\7G\2\2\u0421\u0422") - buf.write("\7N\2\2\u0422\u0423\7G\2\2\u0423\u0424\7V\2\2\u0424\u0425") - buf.write("\7G\2\2\u0425\u0088\3\2\2\2\u0426\u0427\7F\2\2\u0427\u0428") - buf.write("\7G\2\2\u0428\u0429\7N\2\2\u0429\u042a\7K\2\2\u042a\u042b") - buf.write("\7O\2\2\u042b\u042c\7K\2\2\u042c\u042d\7V\2\2\u042d\u042e") - buf.write("\7G\2\2\u042e\u042f\7F\2\2\u042f\u008a\3\2\2\2\u0430\u0431") - buf.write("\7F\2\2\u0431\u0432\7G\2\2\u0432\u0433\7U\2\2\u0433\u0434") - buf.write("\7E\2\2\u0434\u008c\3\2\2\2\u0435\u0436\7F\2\2\u0436\u0437") - buf.write("\7G\2\2\u0437\u0438\7U\2\2\u0438\u0439\7E\2\2\u0439\u043a") - buf.write("\7T\2\2\u043a\u043b\7K\2\2\u043b\u043c\7D\2\2\u043c\u043d") - buf.write("\7G\2\2\u043d\u008e\3\2\2\2\u043e\u043f\7F\2\2\u043f\u0440") - buf.write("\7H\2\2\u0440\u0441\7U\2\2\u0441\u0090\3\2\2\2\u0442\u0443") - buf.write("\7F\2\2\u0443\u0444\7K\2\2\u0444\u0445\7T\2\2\u0445\u0446") - buf.write("\7G\2\2\u0446\u0447\7E\2\2\u0447\u0448\7V\2\2\u0448\u0449") - buf.write("\7Q\2\2\u0449\u044a\7T\2\2\u044a\u044b\7K\2\2\u044b\u044c") - buf.write("\7G\2\2\u044c\u044d\7U\2\2\u044d\u0092\3\2\2\2\u044e\u044f") - buf.write("\7F\2\2\u044f\u0450\7K\2\2\u0450\u0451\7T\2\2\u0451\u0452") - buf.write("\7G\2\2\u0452\u0453\7E\2\2\u0453\u0454\7V\2\2\u0454\u0455") - buf.write("\7Q\2\2\u0455\u0456\7T\2\2\u0456\u0457\7[\2\2\u0457\u0094") - buf.write("\3\2\2\2\u0458\u0459\7F\2\2\u0459\u045a\7K\2\2\u045a\u045b") - buf.write("\7U\2\2\u045b\u045c\7V\2\2\u045c\u045d\7K\2\2\u045d\u045e") - buf.write("\7P\2\2\u045e\u045f\7E\2\2\u045f\u0460\7V\2\2\u0460\u0096") - buf.write("\3\2\2\2\u0461\u0462\7F\2\2\u0462\u0463\7K\2\2\u0463\u0464") - buf.write("\7U\2\2\u0464\u0465\7V\2\2\u0465\u0466\7T\2\2\u0466\u0467") - buf.write("\7K\2\2\u0467\u0468\7D\2\2\u0468\u0469\7W\2\2\u0469\u046a") - buf.write("\7V\2\2\u046a\u046b\7G\2\2\u046b\u0098\3\2\2\2\u046c\u046d") - buf.write("\7F\2\2\u046d\u046e\7T\2\2\u046e\u046f\7Q\2\2\u046f\u0470") - buf.write("\7R\2\2\u0470\u009a\3\2\2\2\u0471\u0472\7G\2\2\u0472\u0473") - buf.write("\7N\2\2\u0473\u0474\7U\2\2\u0474\u0475\7G\2\2\u0475\u009c") - buf.write("\3\2\2\2\u0476\u0477\7G\2\2\u0477\u0478\7P\2\2\u0478\u0479") - buf.write("\7F\2\2\u0479\u009e\3\2\2\2\u047a\u047b\7G\2\2\u047b\u047c") - buf.write("\7U\2\2\u047c\u047d\7E\2\2\u047d\u047e\7C\2\2\u047e\u047f") - buf.write("\7R\2\2\u047f\u0480\7G\2\2\u0480\u00a0\3\2\2\2\u0481\u0482") - buf.write("\7G\2\2\u0482\u0483\7U\2\2\u0483\u0484\7E\2\2\u0484\u0485") - buf.write("\7C\2\2\u0485\u0486\7R\2\2\u0486\u0487\7G\2\2\u0487\u0488") - buf.write("\7F\2\2\u0488\u00a2\3\2\2\2\u0489\u048a\7G\2\2\u048a\u048b") - buf.write("\7Z\2\2\u048b\u048c\7E\2\2\u048c\u048d\7G\2\2\u048d\u048e") - buf.write("\7R\2\2\u048e\u048f\7V\2\2\u048f\u00a4\3\2\2\2\u0490\u0491") - buf.write("\7G\2\2\u0491\u0492\7Z\2\2\u0492\u0493\7E\2\2\u0493\u0494") - buf.write("\7J\2\2\u0494\u0495\7C\2\2\u0495\u0496\7P\2\2\u0496\u0497") - buf.write("\7I\2\2\u0497\u0498\7G\2\2\u0498\u00a6\3\2\2\2\u0499\u049a") - buf.write("\7G\2\2\u049a\u049b\7Z\2\2\u049b\u049c\7K\2\2\u049c\u049d") - buf.write("\7U\2\2\u049d\u049e\7V\2\2\u049e\u049f\7U\2\2\u049f\u00a8") - buf.write("\3\2\2\2\u04a0\u04a1\7G\2\2\u04a1\u04a2\7Z\2\2\u04a2\u04a3") - buf.write("\7R\2\2\u04a3\u04a4\7N\2\2\u04a4\u04a5\7C\2\2\u04a5\u04a6") - buf.write("\7K\2\2\u04a6\u04a7\7P\2\2\u04a7\u00aa\3\2\2\2\u04a8\u04a9") - buf.write("\7G\2\2\u04a9\u04aa\7Z\2\2\u04aa\u04ab\7R\2\2\u04ab\u04ac") - buf.write("\7Q\2\2\u04ac\u04ad\7T\2\2\u04ad\u04ae\7V\2\2\u04ae\u00ac") - buf.write("\3\2\2\2\u04af\u04b0\7G\2\2\u04b0\u04b1\7Z\2\2\u04b1\u04b2") - buf.write("\7V\2\2\u04b2\u04b3\7G\2\2\u04b3\u04b4\7P\2\2\u04b4\u04b5") - buf.write("\7F\2\2\u04b5\u04b6\7G\2\2\u04b6\u04b7\7F\2\2\u04b7\u00ae") - buf.write("\3\2\2\2\u04b8\u04b9\7G\2\2\u04b9\u04ba\7Z\2\2\u04ba\u04bb") - buf.write("\7V\2\2\u04bb\u04bc\7G\2\2\u04bc\u04bd\7T\2\2\u04bd\u04be") - buf.write("\7P\2\2\u04be\u04bf\7C\2\2\u04bf\u04c0\7N\2\2\u04c0\u00b0") - buf.write("\3\2\2\2\u04c1\u04c2\7G\2\2\u04c2\u04c3\7Z\2\2\u04c3\u04c4") - buf.write("\7V\2\2\u04c4\u04c5\7T\2\2\u04c5\u04c6\7C\2\2\u04c6\u04c7") - buf.write("\7E\2\2\u04c7\u04c8\7V\2\2\u04c8\u00b2\3\2\2\2\u04c9\u04ca") - buf.write("\7H\2\2\u04ca\u04cb\7C\2\2\u04cb\u04cc\7N\2\2\u04cc\u04cd") - buf.write("\7U\2\2\u04cd\u04ce\7G\2\2\u04ce\u00b4\3\2\2\2\u04cf\u04d0") - buf.write("\7H\2\2\u04d0\u04d1\7G\2\2\u04d1\u04d2\7V\2\2\u04d2\u04d3") - buf.write("\7E\2\2\u04d3\u04d4\7J\2\2\u04d4\u00b6\3\2\2\2\u04d5\u04d6") - buf.write("\7H\2\2\u04d6\u04d7\7K\2\2\u04d7\u04d8\7G\2\2\u04d8\u04d9") - buf.write("\7N\2\2\u04d9\u04da\7F\2\2\u04da\u04db\7U\2\2\u04db\u00b8") - buf.write("\3\2\2\2\u04dc\u04dd\7H\2\2\u04dd\u04de\7K\2\2\u04de\u04df") - buf.write("\7N\2\2\u04df\u04e0\7V\2\2\u04e0\u04e1\7G\2\2\u04e1\u04e2") - buf.write("\7T\2\2\u04e2\u00ba\3\2\2\2\u04e3\u04e4\7H\2\2\u04e4\u04e5") - buf.write("\7K\2\2\u04e5\u04e6\7N\2\2\u04e6\u04e7\7G\2\2\u04e7\u04e8") - buf.write("\7H\2\2\u04e8\u04e9\7Q\2\2\u04e9\u04ea\7T\2\2\u04ea\u04eb") - buf.write("\7O\2\2\u04eb\u04ec\7C\2\2\u04ec\u04ed\7V\2\2\u04ed\u00bc") - buf.write("\3\2\2\2\u04ee\u04ef\7H\2\2\u04ef\u04f0\7K\2\2\u04f0\u04f1") - buf.write("\7T\2\2\u04f1\u04f2\7U\2\2\u04f2\u04f3\7V\2\2\u04f3\u00be") - buf.write("\3\2\2\2\u04f4\u04f5\7H\2\2\u04f5\u04f6\7Q\2\2\u04f6\u04f7") - buf.write("\7N\2\2\u04f7\u04f8\7N\2\2\u04f8\u04f9\7Q\2\2\u04f9\u04fa") - buf.write("\7Y\2\2\u04fa\u04fb\7K\2\2\u04fb\u04fc\7P\2\2\u04fc\u04fd") - buf.write("\7I\2\2\u04fd\u00c0\3\2\2\2\u04fe\u04ff\7H\2\2\u04ff\u0500") - buf.write("\7Q\2\2\u0500\u0501\7T\2\2\u0501\u00c2\3\2\2\2\u0502\u0503") - buf.write("\7H\2\2\u0503\u0504\7Q\2\2\u0504\u0505\7T\2\2\u0505\u0506") - buf.write("\7G\2\2\u0506\u0507\7K\2\2\u0507\u0508\7I\2\2\u0508\u0509") - buf.write("\7P\2\2\u0509\u00c4\3\2\2\2\u050a\u050b\7H\2\2\u050b\u050c") - buf.write("\7Q\2\2\u050c\u050d\7T\2\2\u050d\u050e\7O\2\2\u050e\u050f") - buf.write("\7C\2\2\u050f\u0510\7V\2\2\u0510\u00c6\3\2\2\2\u0511\u0512") - buf.write("\7H\2\2\u0512\u0513\7Q\2\2\u0513\u0514\7T\2\2\u0514\u0515") - buf.write("\7O\2\2\u0515\u0516\7C\2\2\u0516\u0517\7V\2\2\u0517\u0518") - buf.write("\7V\2\2\u0518\u0519\7G\2\2\u0519\u051a\7F\2\2\u051a\u00c8") - buf.write("\3\2\2\2\u051b\u051c\7H\2\2\u051c\u051d\7T\2\2\u051d\u051e") - buf.write("\7Q\2\2\u051e\u051f\7O\2\2\u051f\u00ca\3\2\2\2\u0520\u0521") - buf.write("\7H\2\2\u0521\u0522\7W\2\2\u0522\u0523\7N\2\2\u0523\u0524") - buf.write("\7N\2\2\u0524\u00cc\3\2\2\2\u0525\u0526\7H\2\2\u0526\u0527") - buf.write("\7W\2\2\u0527\u0528\7P\2\2\u0528\u0529\7E\2\2\u0529\u052a") - buf.write("\7V\2\2\u052a\u052b\7K\2\2\u052b\u052c\7Q\2\2\u052c\u052d") - buf.write("\7P\2\2\u052d\u00ce\3\2\2\2\u052e\u052f\7H\2\2\u052f\u0530") - buf.write("\7W\2\2\u0530\u0531\7P\2\2\u0531\u0532\7E\2\2\u0532\u0533") - buf.write("\7V\2\2\u0533\u0534\7K\2\2\u0534\u0535\7Q\2\2\u0535\u0536") - buf.write("\7P\2\2\u0536\u0537\7U\2\2\u0537\u00d0\3\2\2\2\u0538\u0539") - buf.write("\7I\2\2\u0539\u053a\7N\2\2\u053a\u053b\7Q\2\2\u053b\u053c") - buf.write("\7D\2\2\u053c\u053d\7C\2\2\u053d\u053e\7N\2\2\u053e\u00d2") - buf.write("\3\2\2\2\u053f\u0540\7I\2\2\u0540\u0541\7T\2\2\u0541\u0542") - buf.write("\7C\2\2\u0542\u0543\7P\2\2\u0543\u0544\7V\2\2\u0544\u00d4") - buf.write("\3\2\2\2\u0545\u0546\7I\2\2\u0546\u0547\7T\2\2\u0547\u0548") - buf.write("\7Q\2\2\u0548\u0549\7W\2\2\u0549\u054a\7R\2\2\u054a\u00d6") - buf.write("\3\2\2\2\u054b\u054c\7I\2\2\u054c\u054d\7T\2\2\u054d\u054e") - buf.write("\7Q\2\2\u054e\u054f\7W\2\2\u054f\u0550\7R\2\2\u0550\u0551") - buf.write("\7K\2\2\u0551\u0552\7P\2\2\u0552\u0553\7I\2\2\u0553\u00d8") - buf.write("\3\2\2\2\u0554\u0555\7J\2\2\u0555\u0556\7C\2\2\u0556\u0557") - buf.write("\7X\2\2\u0557\u0558\7K\2\2\u0558\u0559\7P\2\2\u0559\u055a") - buf.write("\7I\2\2\u055a\u00da\3\2\2\2\u055b\u055c\7J\2\2\u055c\u055d") - buf.write("\7Q\2\2\u055d\u055e\7W\2\2\u055e\u055f\7T\2\2\u055f\u00dc") - buf.write("\3\2\2\2\u0560\u0561\7K\2\2\u0561\u0562\7H\2\2\u0562\u00de") - buf.write("\3\2\2\2\u0563\u0564\7K\2\2\u0564\u0565\7I\2\2\u0565\u0566") - buf.write("\7P\2\2\u0566\u0567\7Q\2\2\u0567\u0568\7T\2\2\u0568\u0569") - buf.write("\7G\2\2\u0569\u00e0\3\2\2\2\u056a\u056b\7K\2\2\u056b\u056c") - buf.write("\7O\2\2\u056c\u056d\7R\2\2\u056d\u056e\7Q\2\2\u056e\u056f") - buf.write("\7T\2\2\u056f\u0570\7V\2\2\u0570\u00e2\3\2\2\2\u0571\u0572") - buf.write("\7K\2\2\u0572\u0573\7P\2\2\u0573\u00e4\3\2\2\2\u0574\u0575") - buf.write("\7K\2\2\u0575\u0576\7P\2\2\u0576\u0577\7F\2\2\u0577\u0578") - buf.write("\7G\2\2\u0578\u0579\7Z\2\2\u0579\u00e6\3\2\2\2\u057a\u057b") - buf.write("\7K\2\2\u057b\u057c\7P\2\2\u057c\u057d\7F\2\2\u057d\u057e") - buf.write("\7G\2\2\u057e\u057f\7Z\2\2\u057f\u0580\7G\2\2\u0580\u0581") - buf.write("\7U\2\2\u0581\u00e8\3\2\2\2\u0582\u0583\7K\2\2\u0583\u0584") - buf.write("\7P\2\2\u0584\u0585\7P\2\2\u0585\u0586\7G\2\2\u0586\u0587") - buf.write("\7T\2\2\u0587\u00ea\3\2\2\2\u0588\u0589\7K\2\2\u0589\u058a") - buf.write("\7P\2\2\u058a\u058b\7R\2\2\u058b\u058c\7C\2\2\u058c\u058d") - buf.write("\7V\2\2\u058d\u058e\7J\2\2\u058e\u00ec\3\2\2\2\u058f\u0590") - buf.write("\7K\2\2\u0590\u0591\7P\2\2\u0591\u0592\7R\2\2\u0592\u0593") - buf.write("\7W\2\2\u0593\u0594\7V\2\2\u0594\u0595\7H\2\2\u0595\u0596") - buf.write("\7Q\2\2\u0596\u0597\7T\2\2\u0597\u0598\7O\2\2\u0598\u0599") - buf.write("\7C\2\2\u0599\u059a\7V\2\2\u059a\u00ee\3\2\2\2\u059b\u059c") - buf.write("\7K\2\2\u059c\u059d\7P\2\2\u059d\u059e\7U\2\2\u059e\u059f") - buf.write("\7G\2\2\u059f\u05a0\7T\2\2\u05a0\u05a1\7V\2\2\u05a1\u00f0") - buf.write("\3\2\2\2\u05a2\u05a3\7K\2\2\u05a3\u05a4\7P\2\2\u05a4\u05a5") - buf.write("\7V\2\2\u05a5\u05a6\7G\2\2\u05a6\u05a7\7T\2\2\u05a7\u05a8") - buf.write("\7U\2\2\u05a8\u05a9\7G\2\2\u05a9\u05aa\7E\2\2\u05aa\u05ab") - buf.write("\7V\2\2\u05ab\u00f2\3\2\2\2\u05ac\u05ad\7K\2\2\u05ad\u05ae") - buf.write("\7P\2\2\u05ae\u05af\7V\2\2\u05af\u05b0\7G\2\2\u05b0\u05b1") - buf.write("\7T\2\2\u05b1\u05b2\7X\2\2\u05b2\u05b3\7C\2\2\u05b3\u05b4") - buf.write("\7N\2\2\u05b4\u00f4\3\2\2\2\u05b5\u05b6\7K\2\2\u05b6\u05b7") - buf.write("\7P\2\2\u05b7\u05b8\7V\2\2\u05b8\u05b9\7Q\2\2\u05b9\u00f6") - buf.write("\3\2\2\2\u05ba\u05bb\7K\2\2\u05bb\u05bc\7U\2\2\u05bc\u00f8") - buf.write("\3\2\2\2\u05bd\u05be\7K\2\2\u05be\u05bf\7V\2\2\u05bf\u05c0") - buf.write("\7G\2\2\u05c0\u05c1\7O\2\2\u05c1\u05c2\7U\2\2\u05c2\u00fa") - buf.write("\3\2\2\2\u05c3\u05c4\7L\2\2\u05c4\u05c5\7Q\2\2\u05c5\u05c6") - buf.write("\7K\2\2\u05c6\u05c7\7P\2\2\u05c7\u00fc\3\2\2\2\u05c8\u05c9") - buf.write("\7M\2\2\u05c9\u05ca\7G\2\2\u05ca\u05cb\7[\2\2\u05cb\u05cc") - buf.write("\7U\2\2\u05cc\u00fe\3\2\2\2\u05cd\u05ce\7N\2\2\u05ce\u05cf") - buf.write("\7C\2\2\u05cf\u05d0\7U\2\2\u05d0\u05d1\7V\2\2\u05d1\u0100") - buf.write("\3\2\2\2\u05d2\u05d3\7N\2\2\u05d3\u05d4\7C\2\2\u05d4\u05d5") - buf.write("\7V\2\2\u05d5\u05d6\7G\2\2\u05d6\u05d7\7T\2\2\u05d7\u05d8") - buf.write("\7C\2\2\u05d8\u05d9\7N\2\2\u05d9\u0102\3\2\2\2\u05da\u05db") - buf.write("\7N\2\2\u05db\u05dc\7C\2\2\u05dc\u05dd\7\\\2\2\u05dd\u05de") - buf.write("\7[\2\2\u05de\u0104\3\2\2\2\u05df\u05e0\7N\2\2\u05e0\u05e1") - buf.write("\7G\2\2\u05e1\u05e2\7C\2\2\u05e2\u05e3\7F\2\2\u05e3\u05e4") - buf.write("\7K\2\2\u05e4\u05e5\7P\2\2\u05e5\u05e6\7I\2\2\u05e6\u0106") - buf.write("\3\2\2\2\u05e7\u05e8\7N\2\2\u05e8\u05e9\7G\2\2\u05e9\u05ea") - buf.write("\7H\2\2\u05ea\u05eb\7V\2\2\u05eb\u0108\3\2\2\2\u05ec\u05ed") - buf.write("\7N\2\2\u05ed\u05ee\7K\2\2\u05ee\u05ef\7M\2\2\u05ef\u05f0") - buf.write("\7G\2\2\u05f0\u010a\3\2\2\2\u05f1\u05f2\7N\2\2\u05f2\u05f3") - buf.write("\7K\2\2\u05f3\u05f4\7O\2\2\u05f4\u05f5\7K\2\2\u05f5\u05f6") - buf.write("\7V\2\2\u05f6\u010c\3\2\2\2\u05f7\u05f8\7N\2\2\u05f8\u05f9") - buf.write("\7K\2\2\u05f9\u05fa\7P\2\2\u05fa\u05fb\7G\2\2\u05fb\u05fc") - buf.write("\7U\2\2\u05fc\u010e\3\2\2\2\u05fd\u05fe\7N\2\2\u05fe\u05ff") - buf.write("\7K\2\2\u05ff\u0600\7U\2\2\u0600\u0601\7V\2\2\u0601\u0110") - buf.write("\3\2\2\2\u0602\u0603\7N\2\2\u0603\u0604\7Q\2\2\u0604\u0605") - buf.write("\7C\2\2\u0605\u0606\7F\2\2\u0606\u0112\3\2\2\2\u0607\u0608") - buf.write("\7N\2\2\u0608\u0609\7Q\2\2\u0609\u060a\7E\2\2\u060a\u060b") - buf.write("\7C\2\2\u060b\u060c\7N\2\2\u060c\u0114\3\2\2\2\u060d\u060e") - buf.write("\7N\2\2\u060e\u060f\7Q\2\2\u060f\u0610\7E\2\2\u0610\u0611") - buf.write("\7C\2\2\u0611\u0612\7V\2\2\u0612\u0613\7K\2\2\u0613\u0614") - buf.write("\7Q\2\2\u0614\u0615\7P\2\2\u0615\u0116\3\2\2\2\u0616\u0617") - buf.write("\7N\2\2\u0617\u0618\7Q\2\2\u0618\u0619\7E\2\2\u0619\u061a") - buf.write("\7M\2\2\u061a\u0118\3\2\2\2\u061b\u061c\7N\2\2\u061c\u061d") - buf.write("\7Q\2\2\u061d\u061e\7E\2\2\u061e\u061f\7M\2\2\u061f\u0620") - buf.write("\7U\2\2\u0620\u011a\3\2\2\2\u0621\u0622\7N\2\2\u0622\u0623") - buf.write("\7Q\2\2\u0623\u0624\7I\2\2\u0624\u0625\7K\2\2\u0625\u0626") - buf.write("\7E\2\2\u0626\u0627\7C\2\2\u0627\u0628\7N\2\2\u0628\u011c") - buf.write("\3\2\2\2\u0629\u062a\7O\2\2\u062a\u062b\7C\2\2\u062b\u062c") - buf.write("\7E\2\2\u062c\u062d\7T\2\2\u062d\u062e\7Q\2\2\u062e\u011e") - buf.write("\3\2\2\2\u062f\u0630\7O\2\2\u0630\u0631\7C\2\2\u0631\u0632") - buf.write("\7R\2\2\u0632\u0120\3\2\2\2\u0633\u0634\7O\2\2\u0634\u0635") - buf.write("\7C\2\2\u0635\u0636\7V\2\2\u0636\u0637\7E\2\2\u0637\u0638") - buf.write("\7J\2\2\u0638\u0639\7G\2\2\u0639\u063a\7F\2\2\u063a\u0122") - buf.write("\3\2\2\2\u063b\u063c\7O\2\2\u063c\u063d\7G\2\2\u063d\u063e") - buf.write("\7T\2\2\u063e\u063f\7I\2\2\u063f\u0640\7G\2\2\u0640\u0124") - buf.write("\3\2\2\2\u0641\u0642\7O\2\2\u0642\u0643\7K\2\2\u0643\u0644") - buf.write("\7P\2\2\u0644\u0645\7W\2\2\u0645\u0646\7V\2\2\u0646\u0647") - buf.write("\7G\2\2\u0647\u0126\3\2\2\2\u0648\u0649\7O\2\2\u0649\u064a") - buf.write("\7Q\2\2\u064a\u064b\7P\2\2\u064b\u064c\7V\2\2\u064c\u064d") - buf.write("\7J\2\2\u064d\u0128\3\2\2\2\u064e\u064f\7O\2\2\u064f\u0650") - buf.write("\7U\2\2\u0650\u0651\7E\2\2\u0651\u0652\7M\2\2\u0652\u012a") - buf.write("\3\2\2\2\u0653\u0654\7P\2\2\u0654\u0655\7C\2\2\u0655\u0656") - buf.write("\7O\2\2\u0656\u0657\7G\2\2\u0657\u0658\7U\2\2\u0658\u0659") - buf.write("\7R\2\2\u0659\u065a\7C\2\2\u065a\u065b\7E\2\2\u065b\u065c") - buf.write("\7G\2\2\u065c\u012c\3\2\2\2\u065d\u065e\7P\2\2\u065e\u065f") - buf.write("\7C\2\2\u065f\u0660\7O\2\2\u0660\u0661\7G\2\2\u0661\u0662") - buf.write("\7U\2\2\u0662\u0663\7R\2\2\u0663\u0664\7C\2\2\u0664\u0665") - buf.write("\7E\2\2\u0665\u0666\7G\2\2\u0666\u0667\7U\2\2\u0667\u012e") - buf.write("\3\2\2\2\u0668\u0669\7P\2\2\u0669\u066a\7C\2\2\u066a\u066b") - buf.write("\7V\2\2\u066b\u066c\7W\2\2\u066c\u066d\7T\2\2\u066d\u066e") - buf.write("\7C\2\2\u066e\u066f\7N\2\2\u066f\u0130\3\2\2\2\u0670\u0671") - buf.write("\7P\2\2\u0671\u0672\7Q\2\2\u0672\u0132\3\2\2\2\u0673\u0674") - buf.write("\7P\2\2\u0674\u0675\7Q\2\2\u0675\u0678\7V\2\2\u0676\u0678") - buf.write("\7#\2\2\u0677\u0673\3\2\2\2\u0677\u0676\3\2\2\2\u0678") - buf.write("\u0134\3\2\2\2\u0679\u067a\7P\2\2\u067a\u067b\7W\2\2\u067b") - buf.write("\u067c\7N\2\2\u067c\u067d\7N\2\2\u067d\u0136\3\2\2\2\u067e") - buf.write("\u067f\7P\2\2\u067f\u0680\7W\2\2\u0680\u0681\7N\2\2\u0681") - buf.write("\u0682\7N\2\2\u0682\u0683\7U\2\2\u0683\u0138\3\2\2\2\u0684") - buf.write("\u0685\7Q\2\2\u0685\u0686\7H\2\2\u0686\u013a\3\2\2\2\u0687") - buf.write("\u0688\7Q\2\2\u0688\u0689\7P\2\2\u0689\u013c\3\2\2\2\u068a") - buf.write("\u068b\7Q\2\2\u068b\u068c\7P\2\2\u068c\u068d\7N\2\2\u068d") - buf.write("\u068e\7[\2\2\u068e\u013e\3\2\2\2\u068f\u0690\7Q\2\2\u0690") - buf.write("\u0691\7R\2\2\u0691\u0692\7V\2\2\u0692\u0693\7K\2\2\u0693") - buf.write("\u0694\7Q\2\2\u0694\u0695\7P\2\2\u0695\u0140\3\2\2\2\u0696") - buf.write("\u0697\7Q\2\2\u0697\u0698\7R\2\2\u0698\u0699\7V\2\2\u0699") - buf.write("\u069a\7K\2\2\u069a\u069b\7Q\2\2\u069b\u069c\7P\2\2\u069c") - buf.write("\u069d\7U\2\2\u069d\u0142\3\2\2\2\u069e\u069f\7Q\2\2\u069f") - buf.write("\u06a0\7T\2\2\u06a0\u0144\3\2\2\2\u06a1\u06a2\7Q\2\2\u06a2") - buf.write("\u06a3\7T\2\2\u06a3\u06a4\7F\2\2\u06a4\u06a5\7G\2\2\u06a5") - buf.write("\u06a6\7T\2\2\u06a6\u0146\3\2\2\2\u06a7\u06a8\7Q\2\2\u06a8") - buf.write("\u06a9\7W\2\2\u06a9\u06aa\7V\2\2\u06aa\u0148\3\2\2\2\u06ab") - buf.write("\u06ac\7Q\2\2\u06ac\u06ad\7W\2\2\u06ad\u06ae\7V\2\2\u06ae") - buf.write("\u06af\7G\2\2\u06af\u06b0\7T\2\2\u06b0\u014a\3\2\2\2\u06b1") - buf.write("\u06b2\7Q\2\2\u06b2\u06b3\7W\2\2\u06b3\u06b4\7V\2\2\u06b4") - buf.write("\u06b5\7R\2\2\u06b5\u06b6\7W\2\2\u06b6\u06b7\7V\2\2\u06b7") - buf.write("\u06b8\7H\2\2\u06b8\u06b9\7Q\2\2\u06b9\u06ba\7T\2\2\u06ba") - buf.write("\u06bb\7O\2\2\u06bb\u06bc\7C\2\2\u06bc\u06bd\7V\2\2\u06bd") - buf.write("\u014c\3\2\2\2\u06be\u06bf\7Q\2\2\u06bf\u06c0\7X\2\2\u06c0") - buf.write("\u06c1\7G\2\2\u06c1\u06c2\7T\2\2\u06c2\u014e\3\2\2\2\u06c3") - buf.write("\u06c4\7Q\2\2\u06c4\u06c5\7X\2\2\u06c5\u06c6\7G\2\2\u06c6") - buf.write("\u06c7\7T\2\2\u06c7\u06c8\7N\2\2\u06c8\u06c9\7C\2\2\u06c9") - buf.write("\u06ca\7R\2\2\u06ca\u06cb\7U\2\2\u06cb\u0150\3\2\2\2\u06cc") - buf.write("\u06cd\7Q\2\2\u06cd\u06ce\7X\2\2\u06ce\u06cf\7G\2\2\u06cf") - buf.write("\u06d0\7T\2\2\u06d0\u06d1\7N\2\2\u06d1\u06d2\7C\2\2\u06d2") - buf.write("\u06d3\7[\2\2\u06d3\u0152\3\2\2\2\u06d4\u06d5\7Q\2\2\u06d5") - buf.write("\u06d6\7X\2\2\u06d6\u06d7\7G\2\2\u06d7\u06d8\7T\2\2\u06d8") - buf.write("\u06d9\7Y\2\2\u06d9\u06da\7T\2\2\u06da\u06db\7K\2\2\u06db") - buf.write("\u06dc\7V\2\2\u06dc\u06dd\7G\2\2\u06dd\u0154\3\2\2\2\u06de") - buf.write("\u06df\7R\2\2\u06df\u06e0\7C\2\2\u06e0\u06e1\7T\2\2\u06e1") - buf.write("\u06e2\7V\2\2\u06e2\u06e3\7K\2\2\u06e3\u06e4\7V\2\2\u06e4") - buf.write("\u06e5\7K\2\2\u06e5\u06e6\7Q\2\2\u06e6\u06e7\7P\2\2\u06e7") - buf.write("\u0156\3\2\2\2\u06e8\u06e9\7R\2\2\u06e9\u06ea\7C\2\2\u06ea") - buf.write("\u06eb\7T\2\2\u06eb\u06ec\7V\2\2\u06ec\u06ed\7K\2\2\u06ed") - buf.write("\u06ee\7V\2\2\u06ee\u06ef\7K\2\2\u06ef\u06f0\7Q\2\2\u06f0") - buf.write("\u06f1\7P\2\2\u06f1\u06f2\7G\2\2\u06f2\u06f3\7F\2\2\u06f3") - buf.write("\u0158\3\2\2\2\u06f4\u06f5\7R\2\2\u06f5\u06f6\7C\2\2\u06f6") - buf.write("\u06f7\7T\2\2\u06f7\u06f8\7V\2\2\u06f8\u06f9\7K\2\2\u06f9") - buf.write("\u06fa\7V\2\2\u06fa\u06fb\7K\2\2\u06fb\u06fc\7Q\2\2\u06fc") - buf.write("\u06fd\7P\2\2\u06fd\u06fe\7U\2\2\u06fe\u015a\3\2\2\2\u06ff") - buf.write("\u0700\7R\2\2\u0700\u0701\7G\2\2\u0701\u0702\7T\2\2\u0702") - buf.write("\u0703\7E\2\2\u0703\u0704\7G\2\2\u0704\u0705\7P\2\2\u0705") - buf.write("\u0706\7V\2\2\u0706\u015c\3\2\2\2\u0707\u0708\7R\2\2\u0708") - buf.write("\u0709\7K\2\2\u0709\u070a\7X\2\2\u070a\u070b\7Q\2\2\u070b") - buf.write("\u070c\7V\2\2\u070c\u015e\3\2\2\2\u070d\u070e\7R\2\2\u070e") - buf.write("\u070f\7N\2\2\u070f\u0710\7C\2\2\u0710\u0711\7E\2\2\u0711") - buf.write("\u0712\7K\2\2\u0712\u0713\7P\2\2\u0713\u0714\7I\2\2\u0714") - buf.write("\u0160\3\2\2\2\u0715\u0716\7R\2\2\u0716\u0717\7Q\2\2\u0717") - buf.write("\u0718\7U\2\2\u0718\u0719\7K\2\2\u0719\u071a\7V\2\2\u071a") - buf.write("\u071b\7K\2\2\u071b\u071c\7Q\2\2\u071c\u071d\7P\2\2\u071d") - buf.write("\u0162\3\2\2\2\u071e\u071f\7R\2\2\u071f\u0720\7T\2\2\u0720") - buf.write("\u0721\7G\2\2\u0721\u0722\7E\2\2\u0722\u0723\7G\2\2\u0723") - buf.write("\u0724\7F\2\2\u0724\u0725\7K\2\2\u0725\u0726\7P\2\2\u0726") - buf.write("\u0727\7I\2\2\u0727\u0164\3\2\2\2\u0728\u0729\7R\2\2\u0729") - buf.write("\u072a\7T\2\2\u072a\u072b\7K\2\2\u072b\u072c\7O\2\2\u072c") - buf.write("\u072d\7C\2\2\u072d\u072e\7T\2\2\u072e\u072f\7[\2\2\u072f") - buf.write("\u0166\3\2\2\2\u0730\u0731\7R\2\2\u0731\u0732\7T\2\2\u0732") - buf.write("\u0733\7K\2\2\u0733\u0734\7P\2\2\u0734\u0735\7E\2\2\u0735") - buf.write("\u0736\7K\2\2\u0736\u0737\7R\2\2\u0737\u0738\7C\2\2\u0738") - buf.write("\u0739\7N\2\2\u0739\u073a\7U\2\2\u073a\u0168\3\2\2\2\u073b") - buf.write("\u073c\7R\2\2\u073c\u073d\7T\2\2\u073d\u073e\7Q\2\2\u073e") - buf.write("\u073f\7R\2\2\u073f\u0740\7G\2\2\u0740\u0741\7T\2\2\u0741") - buf.write("\u0742\7V\2\2\u0742\u0743\7K\2\2\u0743\u0744\7G\2\2\u0744") - buf.write("\u0745\7U\2\2\u0745\u016a\3\2\2\2\u0746\u0747\7R\2\2\u0747") - buf.write("\u0748\7W\2\2\u0748\u0749\7T\2\2\u0749\u074a\7I\2\2\u074a") - buf.write("\u074b\7G\2\2\u074b\u016c\3\2\2\2\u074c\u074d\7S\2\2\u074d") - buf.write("\u074e\7W\2\2\u074e\u074f\7G\2\2\u074f\u0750\7T\2\2\u0750") - buf.write("\u0751\7[\2\2\u0751\u016e\3\2\2\2\u0752\u0753\7T\2\2\u0753") - buf.write("\u0754\7C\2\2\u0754\u0755\7P\2\2\u0755\u0756\7I\2\2\u0756") - buf.write("\u0757\7G\2\2\u0757\u0170\3\2\2\2\u0758\u0759\7T\2\2\u0759") - buf.write("\u075a\7G\2\2\u075a\u075b\7E\2\2\u075b\u075c\7Q\2\2\u075c") - buf.write("\u075d\7T\2\2\u075d\u075e\7F\2\2\u075e\u075f\7T\2\2\u075f") - buf.write("\u0760\7G\2\2\u0760\u0761\7C\2\2\u0761\u0762\7F\2\2\u0762") - buf.write("\u0763\7G\2\2\u0763\u0764\7T\2\2\u0764\u0172\3\2\2\2\u0765") - buf.write("\u0766\7T\2\2\u0766\u0767\7G\2\2\u0767\u0768\7E\2\2\u0768") - buf.write("\u0769\7Q\2\2\u0769\u076a\7T\2\2\u076a\u076b\7F\2\2\u076b") - buf.write("\u076c\7Y\2\2\u076c\u076d\7T\2\2\u076d\u076e\7K\2\2\u076e") - buf.write("\u076f\7V\2\2\u076f\u0770\7G\2\2\u0770\u0771\7T\2\2\u0771") - buf.write("\u0174\3\2\2\2\u0772\u0773\7T\2\2\u0773\u0774\7G\2\2\u0774") - buf.write("\u0775\7E\2\2\u0775\u0776\7Q\2\2\u0776\u0777\7X\2\2\u0777") - buf.write("\u0778\7G\2\2\u0778\u0779\7T\2\2\u0779\u0176\3\2\2\2\u077a") - buf.write("\u077b\7T\2\2\u077b\u077c\7G\2\2\u077c\u077d\7F\2\2\u077d") - buf.write("\u077e\7W\2\2\u077e\u077f\7E\2\2\u077f\u0780\7G\2\2\u0780") - buf.write("\u0178\3\2\2\2\u0781\u0782\7T\2\2\u0782\u0783\7G\2\2\u0783") - buf.write("\u0784\7H\2\2\u0784\u0785\7G\2\2\u0785\u0786\7T\2\2\u0786") - buf.write("\u0787\7G\2\2\u0787\u0788\7P\2\2\u0788\u0789\7E\2\2\u0789") - buf.write("\u078a\7G\2\2\u078a\u078b\7U\2\2\u078b\u017a\3\2\2\2\u078c") - buf.write("\u078d\7T\2\2\u078d\u078e\7G\2\2\u078e\u078f\7H\2\2\u078f") - buf.write("\u0790\7T\2\2\u0790\u0791\7G\2\2\u0791\u0792\7U\2\2\u0792") - buf.write("\u0793\7J\2\2\u0793\u017c\3\2\2\2\u0794\u0795\7T\2\2\u0795") - buf.write("\u0796\7G\2\2\u0796\u0797\7P\2\2\u0797\u0798\7C\2\2\u0798") - buf.write("\u0799\7O\2\2\u0799\u079a\7G\2\2\u079a\u017e\3\2\2\2\u079b") - buf.write("\u079c\7T\2\2\u079c\u079d\7G\2\2\u079d\u079e\7R\2\2\u079e") - buf.write("\u079f\7C\2\2\u079f\u07a0\7K\2\2\u07a0\u07a1\7T\2\2\u07a1") - buf.write("\u0180\3\2\2\2\u07a2\u07a3\7T\2\2\u07a3\u07a4\7G\2\2\u07a4") - buf.write("\u07a5\7R\2\2\u07a5\u07a6\7N\2\2\u07a6\u07a7\7C\2\2\u07a7") - buf.write("\u07a8\7E\2\2\u07a8\u07a9\7G\2\2\u07a9\u0182\3\2\2\2\u07aa") - buf.write("\u07ab\7T\2\2\u07ab\u07ac\7G\2\2\u07ac\u07ad\7U\2\2\u07ad") - buf.write("\u07ae\7G\2\2\u07ae\u07af\7V\2\2\u07af\u0184\3\2\2\2\u07b0") - buf.write("\u07b1\7T\2\2\u07b1\u07b2\7G\2\2\u07b2\u07b3\7U\2\2\u07b3") - buf.write("\u07b4\7V\2\2\u07b4\u07b5\7T\2\2\u07b5\u07b6\7K\2\2\u07b6") - buf.write("\u07b7\7E\2\2\u07b7\u07b8\7V\2\2\u07b8\u0186\3\2\2\2\u07b9") - buf.write("\u07ba\7T\2\2\u07ba\u07bb\7G\2\2\u07bb\u07bc\7X\2\2\u07bc") - buf.write("\u07bd\7Q\2\2\u07bd\u07be\7M\2\2\u07be\u07bf\7G\2\2\u07bf") - buf.write("\u0188\3\2\2\2\u07c0\u07c1\7T\2\2\u07c1\u07c2\7K\2\2\u07c2") - buf.write("\u07c3\7I\2\2\u07c3\u07c4\7J\2\2\u07c4\u07c5\7V\2\2\u07c5") - buf.write("\u018a\3\2\2\2\u07c6\u07c7\7T\2\2\u07c7\u07c8\7N\2\2\u07c8") - buf.write("\u07c9\7K\2\2\u07c9\u07ca\7M\2\2\u07ca\u07d2\7G\2\2\u07cb") - buf.write("\u07cc\7T\2\2\u07cc\u07cd\7G\2\2\u07cd\u07ce\7I\2\2\u07ce") - buf.write("\u07cf\7G\2\2\u07cf\u07d0\7Z\2\2\u07d0\u07d2\7R\2\2\u07d1") - buf.write("\u07c6\3\2\2\2\u07d1\u07cb\3\2\2\2\u07d2\u018c\3\2\2\2") - buf.write("\u07d3\u07d4\7T\2\2\u07d4\u07d5\7Q\2\2\u07d5\u07d6\7N") - buf.write("\2\2\u07d6\u07d7\7G\2\2\u07d7\u018e\3\2\2\2\u07d8\u07d9") - buf.write("\7T\2\2\u07d9\u07da\7Q\2\2\u07da\u07db\7N\2\2\u07db\u07dc") - buf.write("\7G\2\2\u07dc\u07dd\7U\2\2\u07dd\u0190\3\2\2\2\u07de\u07df") - buf.write("\7T\2\2\u07df\u07e0\7Q\2\2\u07e0\u07e1\7N\2\2\u07e1\u07e2") - buf.write("\7N\2\2\u07e2\u07e3\7D\2\2\u07e3\u07e4\7C\2\2\u07e4\u07e5") - buf.write("\7E\2\2\u07e5\u07e6\7M\2\2\u07e6\u0192\3\2\2\2\u07e7\u07e8") - buf.write("\7T\2\2\u07e8\u07e9\7Q\2\2\u07e9\u07ea\7N\2\2\u07ea\u07eb") - buf.write("\7N\2\2\u07eb\u07ec\7W\2\2\u07ec\u07ed\7R\2\2\u07ed\u0194") - buf.write("\3\2\2\2\u07ee\u07ef\7T\2\2\u07ef\u07f0\7Q\2\2\u07f0\u07f1") - buf.write("\7Y\2\2\u07f1\u0196\3\2\2\2\u07f2\u07f3\7T\2\2\u07f3\u07f4") - buf.write("\7Q\2\2\u07f4\u07f5\7Y\2\2\u07f5\u07f6\7U\2\2\u07f6\u0198") - buf.write("\3\2\2\2\u07f7\u07f8\7U\2\2\u07f8\u07f9\7E\2\2\u07f9\u07fa") - buf.write("\7J\2\2\u07fa\u07fb\7G\2\2\u07fb\u07fc\7O\2\2\u07fc\u07fd") - buf.write("\7C\2\2\u07fd\u019a\3\2\2\2\u07fe\u07ff\7U\2\2\u07ff\u0800") - buf.write("\7G\2\2\u0800\u0801\7E\2\2\u0801\u0802\7Q\2\2\u0802\u0803") - buf.write("\7P\2\2\u0803\u0804\7F\2\2\u0804\u019c\3\2\2\2\u0805\u0806") - buf.write("\7U\2\2\u0806\u0807\7G\2\2\u0807\u0808\7N\2\2\u0808\u0809") - buf.write("\7G\2\2\u0809\u080a\7E\2\2\u080a\u080b\7V\2\2\u080b\u019e") - buf.write("\3\2\2\2\u080c\u080d\7U\2\2\u080d\u080e\7G\2\2\u080e\u080f") - buf.write("\7O\2\2\u080f\u0810\7K\2\2\u0810\u01a0\3\2\2\2\u0811\u0812") - buf.write("\7U\2\2\u0812\u0813\7G\2\2\u0813\u0814\7R\2\2\u0814\u0815") - buf.write("\7C\2\2\u0815\u0816\7T\2\2\u0816\u0817\7C\2\2\u0817\u0818") - buf.write("\7V\2\2\u0818\u0819\7G\2\2\u0819\u081a\7F\2\2\u081a\u01a2") - buf.write("\3\2\2\2\u081b\u081c\7U\2\2\u081c\u081d\7G\2\2\u081d\u081e") - buf.write("\7T\2\2\u081e\u081f\7F\2\2\u081f\u0820\7G\2\2\u0820\u01a4") - buf.write("\3\2\2\2\u0821\u0822\7U\2\2\u0822\u0823\7G\2\2\u0823\u0824") - buf.write("\7T\2\2\u0824\u0825\7F\2\2\u0825\u0826\7G\2\2\u0826\u0827") - buf.write("\7R\2\2\u0827\u0828\7T\2\2\u0828\u0829\7Q\2\2\u0829\u082a") - buf.write("\7R\2\2\u082a\u082b\7G\2\2\u082b\u082c\7T\2\2\u082c\u082d") - buf.write("\7V\2\2\u082d\u082e\7K\2\2\u082e\u082f\7G\2\2\u082f\u0830") - buf.write("\7U\2\2\u0830\u01a6\3\2\2\2\u0831\u0832\7U\2\2\u0832\u0833") - buf.write("\7G\2\2\u0833\u0834\7U\2\2\u0834\u0835\7U\2\2\u0835\u0836") - buf.write("\7K\2\2\u0836\u0837\7Q\2\2\u0837\u0838\7P\2\2\u0838\u0839") - buf.write("\7a\2\2\u0839\u083a\7W\2\2\u083a\u083b\7U\2\2\u083b\u083c") - buf.write("\7G\2\2\u083c\u083d\7T\2\2\u083d\u01a8\3\2\2\2\u083e\u083f") - buf.write("\7U\2\2\u083f\u0840\7G\2\2\u0840\u0841\7V\2\2\u0841\u01aa") - buf.write("\3\2\2\2\u0842\u0843\7O\2\2\u0843\u0844\7K\2\2\u0844\u0845") - buf.write("\7P\2\2\u0845\u0846\7W\2\2\u0846\u0847\7U\2\2\u0847\u01ac") - buf.write("\3\2\2\2\u0848\u0849\7U\2\2\u0849\u084a\7G\2\2\u084a\u084b") - buf.write("\7V\2\2\u084b\u084c\7U\2\2\u084c\u01ae\3\2\2\2\u084d\u084e") - buf.write("\7U\2\2\u084e\u084f\7J\2\2\u084f\u0850\7Q\2\2\u0850\u0851") - buf.write("\7Y\2\2\u0851\u01b0\3\2\2\2\u0852\u0853\7U\2\2\u0853\u0854") - buf.write("\7M\2\2\u0854\u0855\7G\2\2\u0855\u0856\7Y\2\2\u0856\u0857") - buf.write("\7G\2\2\u0857\u0858\7F\2\2\u0858\u01b2\3\2\2\2\u0859\u085a") - buf.write("\7U\2\2\u085a\u085b\7Q\2\2\u085b\u085c\7O\2\2\u085c\u085d") - buf.write("\7G\2\2\u085d\u01b4\3\2\2\2\u085e\u085f\7U\2\2\u085f\u0860") - buf.write("\7Q\2\2\u0860\u0861\7T\2\2\u0861\u0862\7V\2\2\u0862\u01b6") - buf.write("\3\2\2\2\u0863\u0864\7U\2\2\u0864\u0865\7Q\2\2\u0865\u0866") - buf.write("\7T\2\2\u0866\u0867\7V\2\2\u0867\u0868\7G\2\2\u0868\u0869") - buf.write("\7F\2\2\u0869\u01b8\3\2\2\2\u086a\u086b\7U\2\2\u086b\u086c") - buf.write("\7V\2\2\u086c\u086d\7C\2\2\u086d\u086e\7T\2\2\u086e\u086f") - buf.write("\7V\2\2\u086f\u01ba\3\2\2\2\u0870\u0871\7U\2\2\u0871\u0872") - buf.write("\7V\2\2\u0872\u0873\7C\2\2\u0873\u0874\7V\2\2\u0874\u0875") - buf.write("\7K\2\2\u0875\u0876\7U\2\2\u0876\u0877\7V\2\2\u0877\u0878") - buf.write("\7K\2\2\u0878\u0879\7E\2\2\u0879\u087a\7U\2\2\u087a\u01bc") - buf.write("\3\2\2\2\u087b\u087c\7U\2\2\u087c\u087d\7V\2\2\u087d\u087e") - buf.write("\7Q\2\2\u087e\u087f\7T\2\2\u087f\u0880\7G\2\2\u0880\u0881") - buf.write("\7F\2\2\u0881\u01be\3\2\2\2\u0882\u0883\7U\2\2\u0883\u0884") - buf.write("\7V\2\2\u0884\u0885\7T\2\2\u0885\u0886\7C\2\2\u0886\u0887") - buf.write("\7V\2\2\u0887\u0888\7K\2\2\u0888\u0889\7H\2\2\u0889\u088a") - buf.write("\7[\2\2\u088a\u01c0\3\2\2\2\u088b\u088c\7U\2\2\u088c\u088d") - buf.write("\7V\2\2\u088d\u088e\7T\2\2\u088e\u088f\7W\2\2\u088f\u0890") - buf.write("\7E\2\2\u0890\u0891\7V\2\2\u0891\u01c2\3\2\2\2\u0892\u0893") - buf.write("\7U\2\2\u0893\u0894\7W\2\2\u0894\u0895\7D\2\2\u0895\u0896") - buf.write("\7U\2\2\u0896\u0897\7V\2\2\u0897\u0898\7T\2\2\u0898\u01c4") - buf.write("\3\2\2\2\u0899\u089a\7U\2\2\u089a\u089b\7W\2\2\u089b\u089c") - buf.write("\7D\2\2\u089c\u089d\7U\2\2\u089d\u089e\7V\2\2\u089e\u089f") - buf.write("\7T\2\2\u089f\u08a0\7K\2\2\u08a0\u08a1\7P\2\2\u08a1\u08a2") - buf.write("\7I\2\2\u08a2\u01c6\3\2\2\2\u08a3\u08a4\7V\2\2\u08a4\u08a5") - buf.write("\7C\2\2\u08a5\u08a6\7D\2\2\u08a6\u08a7\7N\2\2\u08a7\u08a8") - buf.write("\7G\2\2\u08a8\u01c8\3\2\2\2\u08a9\u08aa\7V\2\2\u08aa\u08ab") - buf.write("\7C\2\2\u08ab\u08ac\7D\2\2\u08ac\u08ad\7N\2\2\u08ad\u08ae") - buf.write("\7G\2\2\u08ae\u08af\7U\2\2\u08af\u01ca\3\2\2\2\u08b0\u08b1") - buf.write("\7V\2\2\u08b1\u08b2\7C\2\2\u08b2\u08b3\7D\2\2\u08b3\u08b4") - buf.write("\7N\2\2\u08b4\u08b5\7G\2\2\u08b5\u08b6\7U\2\2\u08b6\u08b7") - buf.write("\7C\2\2\u08b7\u08b8\7O\2\2\u08b8\u08b9\7R\2\2\u08b9\u08ba") - buf.write("\7N\2\2\u08ba\u08bb\7G\2\2\u08bb\u01cc\3\2\2\2\u08bc\u08bd") - buf.write("\7V\2\2\u08bd\u08be\7D\2\2\u08be\u08bf\7N\2\2\u08bf\u08c0") - buf.write("\7R\2\2\u08c0\u08c1\7T\2\2\u08c1\u08c2\7Q\2\2\u08c2\u08c3") - buf.write("\7R\2\2\u08c3\u08c4\7G\2\2\u08c4\u08c5\7T\2\2\u08c5\u08c6") - buf.write("\7V\2\2\u08c6\u08c7\7K\2\2\u08c7\u08c8\7G\2\2\u08c8\u08c9") - buf.write("\7U\2\2\u08c9\u01ce\3\2\2\2\u08ca\u08cb\7V\2\2\u08cb\u08cc") - buf.write("\7G\2\2\u08cc\u08cd\7O\2\2\u08cd\u08ce\7R\2\2\u08ce\u08cf") - buf.write("\7Q\2\2\u08cf\u08d0\7T\2\2\u08d0\u08d1\7C\2\2\u08d1\u08d2") - buf.write("\7T\2\2\u08d2\u08d8\7[\2\2\u08d3\u08d4\7V\2\2\u08d4\u08d5") - buf.write("\7G\2\2\u08d5\u08d6\7O\2\2\u08d6\u08d8\7R\2\2\u08d7\u08ca") - buf.write("\3\2\2\2\u08d7\u08d3\3\2\2\2\u08d8\u01d0\3\2\2\2\u08d9") - buf.write("\u08da\7V\2\2\u08da\u08db\7G\2\2\u08db\u08dc\7T\2\2\u08dc") - buf.write("\u08dd\7O\2\2\u08dd\u08de\7K\2\2\u08de\u08df\7P\2\2\u08df") - buf.write("\u08e0\7C\2\2\u08e0\u08e1\7V\2\2\u08e1\u08e2\7G\2\2\u08e2") - buf.write("\u08e3\7F\2\2\u08e3\u01d2\3\2\2\2\u08e4\u08e5\7V\2\2\u08e5") - buf.write("\u08e6\7J\2\2\u08e6\u08e7\7G\2\2\u08e7\u08e8\7P\2\2\u08e8") - buf.write("\u01d4\3\2\2\2\u08e9\u08ea\7V\2\2\u08ea\u08eb\7Q\2\2\u08eb") - buf.write("\u01d6\3\2\2\2\u08ec\u08ed\7V\2\2\u08ed\u08ee\7Q\2\2\u08ee") - buf.write("\u08ef\7W\2\2\u08ef\u08f0\7E\2\2\u08f0\u08f1\7J\2\2\u08f1") - buf.write("\u01d8\3\2\2\2\u08f2\u08f3\7V\2\2\u08f3\u08f4\7T\2\2\u08f4") - buf.write("\u08f5\7C\2\2\u08f5\u08f6\7K\2\2\u08f6\u08f7\7N\2\2\u08f7") - buf.write("\u08f8\7K\2\2\u08f8\u08f9\7P\2\2\u08f9\u08fa\7I\2\2\u08fa") - buf.write("\u01da\3\2\2\2\u08fb\u08fc\7V\2\2\u08fc\u08fd\7T\2\2\u08fd") - buf.write("\u08fe\7C\2\2\u08fe\u08ff\7P\2\2\u08ff\u0900\7U\2\2\u0900") - buf.write("\u0901\7C\2\2\u0901\u0902\7E\2\2\u0902\u0903\7V\2\2\u0903") - buf.write("\u0904\7K\2\2\u0904\u0905\7Q\2\2\u0905\u0906\7P\2\2\u0906") - buf.write("\u01dc\3\2\2\2\u0907\u0908\7V\2\2\u0908\u0909\7T\2\2\u0909") - buf.write("\u090a\7C\2\2\u090a\u090b\7P\2\2\u090b\u090c\7U\2\2\u090c") - buf.write("\u090d\7C\2\2\u090d\u090e\7E\2\2\u090e\u090f\7V\2\2\u090f") - buf.write("\u0910\7K\2\2\u0910\u0911\7Q\2\2\u0911\u0912\7P\2\2\u0912") - buf.write("\u0913\7U\2\2\u0913\u01de\3\2\2\2\u0914\u0915\7V\2\2\u0915") - buf.write("\u0916\7T\2\2\u0916\u0917\7C\2\2\u0917\u0918\7P\2\2\u0918") - buf.write("\u0919\7U\2\2\u0919\u091a\7H\2\2\u091a\u091b\7Q\2\2\u091b") - buf.write("\u091c\7T\2\2\u091c\u091d\7O\2\2\u091d\u01e0\3\2\2\2\u091e") - buf.write("\u091f\7V\2\2\u091f\u0920\7T\2\2\u0920\u0921\7K\2\2\u0921") - buf.write("\u0922\7O\2\2\u0922\u01e2\3\2\2\2\u0923\u0924\7V\2\2\u0924") - buf.write("\u0925\7T\2\2\u0925\u0926\7W\2\2\u0926\u0927\7G\2\2\u0927") - buf.write("\u01e4\3\2\2\2\u0928\u0929\7V\2\2\u0929\u092a\7T\2\2\u092a") - buf.write("\u092b\7W\2\2\u092b\u092c\7P\2\2\u092c\u092d\7E\2\2\u092d") - buf.write("\u092e\7C\2\2\u092e\u092f\7V\2\2\u092f\u0930\7G\2\2\u0930") - buf.write("\u01e6\3\2\2\2\u0931\u0932\7V\2\2\u0932\u0933\7[\2\2\u0933") - buf.write("\u0934\7R\2\2\u0934\u0935\7G\2\2\u0935\u01e8\3\2\2\2\u0936") - buf.write("\u0937\7W\2\2\u0937\u0938\7P\2\2\u0938\u0939\7C\2\2\u0939") - buf.write("\u093a\7T\2\2\u093a\u093b\7E\2\2\u093b\u093c\7J\2\2\u093c") - buf.write("\u093d\7K\2\2\u093d\u093e\7X\2\2\u093e\u093f\7G\2\2\u093f") - buf.write("\u01ea\3\2\2\2\u0940\u0941\7W\2\2\u0941\u0942\7P\2\2\u0942") - buf.write("\u0943\7D\2\2\u0943\u0944\7Q\2\2\u0944\u0945\7W\2\2\u0945") - buf.write("\u0946\7P\2\2\u0946\u0947\7F\2\2\u0947\u0948\7G\2\2\u0948") - buf.write("\u0949\7F\2\2\u0949\u01ec\3\2\2\2\u094a\u094b\7W\2\2\u094b") - buf.write("\u094c\7P\2\2\u094c\u094d\7E\2\2\u094d\u094e\7C\2\2\u094e") - buf.write("\u094f\7E\2\2\u094f\u0950\7J\2\2\u0950\u0951\7G\2\2\u0951") - buf.write("\u01ee\3\2\2\2\u0952\u0953\7W\2\2\u0953\u0954\7P\2\2\u0954") - buf.write("\u0955\7K\2\2\u0955\u0956\7Q\2\2\u0956\u0957\7P\2\2\u0957") - buf.write("\u01f0\3\2\2\2\u0958\u0959\7W\2\2\u0959\u095a\7P\2\2\u095a") - buf.write("\u095b\7K\2\2\u095b\u095c\7S\2\2\u095c\u095d\7W\2\2\u095d") - buf.write("\u095e\7G\2\2\u095e\u01f2\3\2\2\2\u095f\u0960\7W\2\2\u0960") - buf.write("\u0961\7P\2\2\u0961\u0962\7M\2\2\u0962\u0963\7P\2\2\u0963") - buf.write("\u0964\7Q\2\2\u0964\u0965\7Y\2\2\u0965\u0966\7P\2\2\u0966") - buf.write("\u01f4\3\2\2\2\u0967\u0968\7W\2\2\u0968\u0969\7P\2\2\u0969") - buf.write("\u096a\7N\2\2\u096a\u096b\7Q\2\2\u096b\u096c\7E\2\2\u096c") - buf.write("\u096d\7M\2\2\u096d\u01f6\3\2\2\2\u096e\u096f\7W\2\2\u096f") - buf.write("\u0970\7P\2\2\u0970\u0971\7U\2\2\u0971\u0972\7G\2\2\u0972") - buf.write("\u0973\7V\2\2\u0973\u01f8\3\2\2\2\u0974\u0975\7W\2\2\u0975") - buf.write("\u0976\7R\2\2\u0976\u0977\7F\2\2\u0977\u0978\7C\2\2\u0978") - buf.write("\u0979\7V\2\2\u0979\u097a\7G\2\2\u097a\u01fa\3\2\2\2\u097b") - buf.write("\u097c\7W\2\2\u097c\u097d\7U\2\2\u097d\u097e\7G\2\2\u097e") - buf.write("\u01fc\3\2\2\2\u097f\u0980\7W\2\2\u0980\u0981\7U\2\2\u0981") - buf.write("\u0982\7G\2\2\u0982\u0983\7T\2\2\u0983\u01fe\3\2\2\2\u0984") - buf.write("\u0985\7W\2\2\u0985\u0986\7U\2\2\u0986\u0987\7K\2\2\u0987") - buf.write("\u0988\7P\2\2\u0988\u0989\7I\2\2\u0989\u0200\3\2\2\2\u098a") - buf.write("\u098b\7X\2\2\u098b\u098c\7C\2\2\u098c\u098d\7N\2\2\u098d") - buf.write("\u098e\7W\2\2\u098e\u098f\7G\2\2\u098f\u0990\7U\2\2\u0990") - buf.write("\u0202\3\2\2\2\u0991\u0992\7X\2\2\u0992\u0993\7K\2\2\u0993") - buf.write("\u0994\7G\2\2\u0994\u0995\7Y\2\2\u0995\u0204\3\2\2\2\u0996") - buf.write("\u0997\7X\2\2\u0997\u0998\7K\2\2\u0998\u0999\7G\2\2\u0999") - buf.write("\u099a\7Y\2\2\u099a\u099b\7U\2\2\u099b\u0206\3\2\2\2\u099c") - buf.write("\u099d\7Y\2\2\u099d\u099e\7J\2\2\u099e\u099f\7G\2\2\u099f") - buf.write("\u09a0\7P\2\2\u09a0\u0208\3\2\2\2\u09a1\u09a2\7Y\2\2\u09a2") - buf.write("\u09a3\7J\2\2\u09a3\u09a4\7G\2\2\u09a4\u09a5\7T\2\2\u09a5") - buf.write("\u09a6\7G\2\2\u09a6\u020a\3\2\2\2\u09a7\u09a8\7Y\2\2\u09a8") - buf.write("\u09a9\7K\2\2\u09a9\u09aa\7P\2\2\u09aa\u09ab\7F\2\2\u09ab") - buf.write("\u09ac\7Q\2\2\u09ac\u09ad\7Y\2\2\u09ad\u020c\3\2\2\2\u09ae") - buf.write("\u09af\7Y\2\2\u09af\u09b0\7K\2\2\u09b0\u09b1\7V\2\2\u09b1") - buf.write("\u09b2\7J\2\2\u09b2\u020e\3\2\2\2\u09b3\u09b4\7[\2\2\u09b4") - buf.write("\u09b5\7G\2\2\u09b5\u09b6\7C\2\2\u09b6\u09b7\7T\2\2\u09b7") - buf.write("\u0210\3\2\2\2\u09b8\u09bc\7?\2\2\u09b9\u09ba\7?\2\2\u09ba") - buf.write("\u09bc\7?\2\2\u09bb\u09b8\3\2\2\2\u09bb\u09b9\3\2\2\2") - buf.write("\u09bc\u0212\3\2\2\2\u09bd\u09be\7>\2\2\u09be\u09bf\7") - buf.write("?\2\2\u09bf\u09c0\7@\2\2\u09c0\u0214\3\2\2\2\u09c1\u09c2") - buf.write("\7>\2\2\u09c2\u09c3\7@\2\2\u09c3\u0216\3\2\2\2\u09c4\u09c5") - buf.write("\7#\2\2\u09c5\u09c6\7?\2\2\u09c6\u0218\3\2\2\2\u09c7\u09c8") - buf.write("\7>\2\2\u09c8\u021a\3\2\2\2\u09c9\u09ca\7>\2\2\u09ca\u09ce") - buf.write("\7?\2\2\u09cb\u09cc\7#\2\2\u09cc\u09ce\7@\2\2\u09cd\u09c9") - buf.write("\3\2\2\2\u09cd\u09cb\3\2\2\2\u09ce\u021c\3\2\2\2\u09cf") - buf.write("\u09d0\7@\2\2\u09d0\u021e\3\2\2\2\u09d1\u09d2\7@\2\2\u09d2") - buf.write("\u09d6\7?\2\2\u09d3\u09d4\7#\2\2\u09d4\u09d6\7>\2\2\u09d5") - buf.write("\u09d1\3\2\2\2\u09d5\u09d3\3\2\2\2\u09d6\u0220\3\2\2\2") - buf.write("\u09d7\u09d8\7-\2\2\u09d8\u0222\3\2\2\2\u09d9\u09da\7") - buf.write("/\2\2\u09da\u0224\3\2\2\2\u09db\u09dc\7,\2\2\u09dc\u0226") - buf.write("\3\2\2\2\u09dd\u09de\7\61\2\2\u09de\u0228\3\2\2\2\u09df") - buf.write("\u09e0\7\'\2\2\u09e0\u022a\3\2\2\2\u09e1\u09e2\7F\2\2") - buf.write("\u09e2\u09e3\7K\2\2\u09e3\u09e4\7X\2\2\u09e4\u022c\3\2") - buf.write("\2\2\u09e5\u09e6\7\u0080\2\2\u09e6\u022e\3\2\2\2\u09e7") - buf.write("\u09e8\7(\2\2\u09e8\u0230\3\2\2\2\u09e9\u09ea\7~\2\2\u09ea") - buf.write("\u0232\3\2\2\2\u09eb\u09ec\7~\2\2\u09ec\u09ed\7~\2\2\u09ed") - buf.write("\u0234\3\2\2\2\u09ee\u09ef\7`\2\2\u09ef\u0236\3\2\2\2") - buf.write("\u09f0\u09f6\7)\2\2\u09f1\u09f5\n\2\2\2\u09f2\u09f3\7") - buf.write("^\2\2\u09f3\u09f5\13\2\2\2\u09f4\u09f1\3\2\2\2\u09f4\u09f2") - buf.write("\3\2\2\2\u09f5\u09f8\3\2\2\2\u09f6\u09f4\3\2\2\2\u09f6") - buf.write("\u09f7\3\2\2\2\u09f7\u09f9\3\2\2\2\u09f8\u09f6\3\2\2\2") - buf.write("\u09f9\u0a05\7)\2\2\u09fa\u0a00\7$\2\2\u09fb\u09ff\n\3") - buf.write("\2\2\u09fc\u09fd\7^\2\2\u09fd\u09ff\13\2\2\2\u09fe\u09fb") - buf.write("\3\2\2\2\u09fe\u09fc\3\2\2\2\u09ff\u0a02\3\2\2\2\u0a00") - buf.write("\u09fe\3\2\2\2\u0a00\u0a01\3\2\2\2\u0a01\u0a03\3\2\2\2") - buf.write("\u0a02\u0a00\3\2\2\2\u0a03\u0a05\7$\2\2\u0a04\u09f0\3") - buf.write("\2\2\2\u0a04\u09fa\3\2\2\2\u0a05\u0238\3\2\2\2\u0a06\u0a08") - buf.write("\5\u0251\u0129\2\u0a07\u0a06\3\2\2\2\u0a08\u0a09\3\2\2") - buf.write("\2\u0a09\u0a07\3\2\2\2\u0a09\u0a0a\3\2\2\2\u0a0a\u0a0b") - buf.write("\3\2\2\2\u0a0b\u0a0c\7N\2\2\u0a0c\u023a\3\2\2\2\u0a0d") - buf.write("\u0a0f\5\u0251\u0129\2\u0a0e\u0a0d\3\2\2\2\u0a0f\u0a10") - buf.write("\3\2\2\2\u0a10\u0a0e\3\2\2\2\u0a10\u0a11\3\2\2\2\u0a11") - buf.write("\u0a12\3\2\2\2\u0a12\u0a13\7U\2\2\u0a13\u023c\3\2\2\2") - buf.write("\u0a14\u0a16\5\u0251\u0129\2\u0a15\u0a14\3\2\2\2\u0a16") - buf.write("\u0a17\3\2\2\2\u0a17\u0a15\3\2\2\2\u0a17\u0a18\3\2\2\2") - buf.write("\u0a18\u0a19\3\2\2\2\u0a19\u0a1a\7[\2\2\u0a1a\u023e\3") - buf.write("\2\2\2\u0a1b\u0a1d\5\u0251\u0129\2\u0a1c\u0a1b\3\2\2\2") - buf.write("\u0a1d\u0a1e\3\2\2\2\u0a1e\u0a1c\3\2\2\2\u0a1e\u0a1f\3") - buf.write("\2\2\2\u0a1f\u0240\3\2\2\2\u0a20\u0a22\5\u0251\u0129\2") - buf.write("\u0a21\u0a20\3\2\2\2\u0a22\u0a23\3\2\2\2\u0a23\u0a21\3") - buf.write("\2\2\2\u0a23\u0a24\3\2\2\2\u0a24\u0a25\3\2\2\2\u0a25\u0a26") - buf.write("\5\u024f\u0128\2\u0a26\u0a2c\3\2\2\2\u0a27\u0a28\5\u024d") - buf.write("\u0127\2\u0a28\u0a29\5\u024f\u0128\2\u0a29\u0a2a\6\u0121") - buf.write("\2\2\u0a2a\u0a2c\3\2\2\2\u0a2b\u0a21\3\2\2\2\u0a2b\u0a27") - buf.write("\3\2\2\2\u0a2c\u0242\3\2\2\2\u0a2d\u0a2e\5\u024d\u0127") - buf.write("\2\u0a2e\u0a2f\6\u0122\3\2\u0a2f\u0244\3\2\2\2\u0a30\u0a32") - buf.write("\5\u0251\u0129\2\u0a31\u0a30\3\2\2\2\u0a32\u0a33\3\2\2") - buf.write("\2\u0a33\u0a31\3\2\2\2\u0a33\u0a34\3\2\2\2\u0a34\u0a36") - buf.write("\3\2\2\2\u0a35\u0a37\5\u024f\u0128\2\u0a36\u0a35\3\2\2") - buf.write("\2\u0a36\u0a37\3\2\2\2\u0a37\u0a38\3\2\2\2\u0a38\u0a39") - buf.write("\7F\2\2\u0a39\u0a42\3\2\2\2\u0a3a\u0a3c\5\u024d\u0127") - buf.write("\2\u0a3b\u0a3d\5\u024f\u0128\2\u0a3c\u0a3b\3\2\2\2\u0a3c") - buf.write("\u0a3d\3\2\2\2\u0a3d\u0a3e\3\2\2\2\u0a3e\u0a3f\7F\2\2") - buf.write("\u0a3f\u0a40\6\u0123\4\2\u0a40\u0a42\3\2\2\2\u0a41\u0a31") - buf.write("\3\2\2\2\u0a41\u0a3a\3\2\2\2\u0a42\u0246\3\2\2\2\u0a43") - buf.write("\u0a45\5\u0251\u0129\2\u0a44\u0a43\3\2\2\2\u0a45\u0a46") - buf.write("\3\2\2\2\u0a46\u0a44\3\2\2\2\u0a46\u0a47\3\2\2\2\u0a47") - buf.write("\u0a49\3\2\2\2\u0a48\u0a4a\5\u024f\u0128\2\u0a49\u0a48") - buf.write("\3\2\2\2\u0a49\u0a4a\3\2\2\2\u0a4a\u0a4b\3\2\2\2\u0a4b") - buf.write("\u0a4c\7D\2\2\u0a4c\u0a4d\7F\2\2\u0a4d\u0a58\3\2\2\2\u0a4e") - buf.write("\u0a50\5\u024d\u0127\2\u0a4f\u0a51\5\u024f\u0128\2\u0a50") - buf.write("\u0a4f\3\2\2\2\u0a50\u0a51\3\2\2\2\u0a51\u0a52\3\2\2\2") - buf.write("\u0a52\u0a53\7D\2\2\u0a53\u0a54\7F\2\2\u0a54\u0a55\3\2") - buf.write("\2\2\u0a55\u0a56\6\u0124\5\2\u0a56\u0a58\3\2\2\2\u0a57") - buf.write("\u0a44\3\2\2\2\u0a57\u0a4e\3\2\2\2\u0a58\u0248\3\2\2\2") - buf.write("\u0a59\u0a5d\5\u0253\u012a\2\u0a5a\u0a5d\5\u0251\u0129") - buf.write("\2\u0a5b\u0a5d\7a\2\2\u0a5c\u0a59\3\2\2\2\u0a5c\u0a5a") - buf.write("\3\2\2\2\u0a5c\u0a5b\3\2\2\2\u0a5d\u0a5e\3\2\2\2\u0a5e") - buf.write("\u0a5c\3\2\2\2\u0a5e\u0a5f\3\2\2\2\u0a5f\u024a\3\2\2\2") - buf.write("\u0a60\u0a66\7b\2\2\u0a61\u0a65\n\4\2\2\u0a62\u0a63\7") - buf.write("b\2\2\u0a63\u0a65\7b\2\2\u0a64\u0a61\3\2\2\2\u0a64\u0a62") - buf.write("\3\2\2\2\u0a65\u0a68\3\2\2\2\u0a66\u0a64\3\2\2\2\u0a66") - buf.write("\u0a67\3\2\2\2\u0a67\u0a69\3\2\2\2\u0a68\u0a66\3\2\2\2") - buf.write("\u0a69\u0a6a\7b\2\2\u0a6a\u024c\3\2\2\2\u0a6b\u0a6d\5") - buf.write("\u0251\u0129\2\u0a6c\u0a6b\3\2\2\2\u0a6d\u0a6e\3\2\2\2") - buf.write("\u0a6e\u0a6c\3\2\2\2\u0a6e\u0a6f\3\2\2\2\u0a6f\u0a70\3") - buf.write("\2\2\2\u0a70\u0a74\7\60\2\2\u0a71\u0a73\5\u0251\u0129") - buf.write("\2\u0a72\u0a71\3\2\2\2\u0a73\u0a76\3\2\2\2\u0a74\u0a72") - buf.write("\3\2\2\2\u0a74\u0a75\3\2\2\2\u0a75\u0a7e\3\2\2\2\u0a76") - buf.write("\u0a74\3\2\2\2\u0a77\u0a79\7\60\2\2\u0a78\u0a7a\5\u0251") - buf.write("\u0129\2\u0a79\u0a78\3\2\2\2\u0a7a\u0a7b\3\2\2\2\u0a7b") - buf.write("\u0a79\3\2\2\2\u0a7b\u0a7c\3\2\2\2\u0a7c\u0a7e\3\2\2\2") - buf.write("\u0a7d\u0a6c\3\2\2\2\u0a7d\u0a77\3\2\2\2\u0a7e\u024e\3") - buf.write("\2\2\2\u0a7f\u0a81\7G\2\2\u0a80\u0a82\t\5\2\2\u0a81\u0a80") - buf.write("\3\2\2\2\u0a81\u0a82\3\2\2\2\u0a82\u0a84\3\2\2\2\u0a83") - buf.write("\u0a85\5\u0251\u0129\2\u0a84\u0a83\3\2\2\2\u0a85\u0a86") - buf.write("\3\2\2\2\u0a86\u0a84\3\2\2\2\u0a86\u0a87\3\2\2\2\u0a87") - buf.write("\u0250\3\2\2\2\u0a88\u0a89\t\6\2\2\u0a89\u0252\3\2\2\2") - buf.write("\u0a8a\u0a8b\t\7\2\2\u0a8b\u0254\3\2\2\2\u0a8c\u0a8d\7") - buf.write("/\2\2\u0a8d\u0a8e\7/\2\2\u0a8e\u0a92\3\2\2\2\u0a8f\u0a91") - buf.write("\n\b\2\2\u0a90\u0a8f\3\2\2\2\u0a91\u0a94\3\2\2\2\u0a92") - buf.write("\u0a90\3\2\2\2\u0a92\u0a93\3\2\2\2\u0a93\u0a96\3\2\2\2") - buf.write("\u0a94\u0a92\3\2\2\2\u0a95\u0a97\7\17\2\2\u0a96\u0a95") - buf.write("\3\2\2\2\u0a96\u0a97\3\2\2\2\u0a97\u0a99\3\2\2\2\u0a98") - buf.write("\u0a9a\7\f\2\2\u0a99\u0a98\3\2\2\2\u0a99\u0a9a\3\2\2\2") - buf.write("\u0a9a\u0a9b\3\2\2\2\u0a9b\u0a9c\b\u012b\2\2\u0a9c\u0256") - buf.write("\3\2\2\2\u0a9d\u0a9e\7\61\2\2\u0a9e\u0a9f\7,\2\2\u0a9f") - buf.write("\u0aa0\3\2\2\2\u0aa0\u0aa5\6\u012c\6\2\u0aa1\u0aa4\5\u0257") - buf.write("\u012c\2\u0aa2\u0aa4\13\2\2\2\u0aa3\u0aa1\3\2\2\2\u0aa3") - buf.write("\u0aa2\3\2\2\2\u0aa4\u0aa7\3\2\2\2\u0aa5\u0aa6\3\2\2\2") - buf.write("\u0aa5\u0aa3\3\2\2\2\u0aa6\u0aa8\3\2\2\2\u0aa7\u0aa5\3") - buf.write("\2\2\2\u0aa8\u0aa9\7,\2\2\u0aa9\u0aaa\7\61\2\2\u0aaa\u0aab") - buf.write("\3\2\2\2\u0aab\u0aac\b\u012c\2\2\u0aac\u0258\3\2\2\2\u0aad") - buf.write("\u0aaf\t\t\2\2\u0aae\u0aad\3\2\2\2\u0aaf\u0ab0\3\2\2\2") - buf.write("\u0ab0\u0aae\3\2\2\2\u0ab0\u0ab1\3\2\2\2\u0ab1\u0ab2\3") - buf.write("\2\2\2\u0ab2\u0ab3\b\u012d\2\2\u0ab3\u025a\3\2\2\2\u0ab4") - buf.write("\u0ab5\13\2\2\2\u0ab5\u025c\3\2\2\2-\2\u0404\u0677\u07d1") - buf.write("\u08d7\u09bb\u09cd\u09d5\u09f4\u09f6\u09fe\u0a00\u0a04") - buf.write("\u0a09\u0a10\u0a17\u0a1e\u0a23\u0a2b\u0a33\u0a36\u0a3c") - buf.write("\u0a41\u0a46\u0a49\u0a50\u0a57\u0a5c\u0a5e\u0a64\u0a66") - buf.write("\u0a6e\u0a74\u0a7b\u0a7d\u0a81\u0a86\u0a92\u0a96\u0a99") - buf.write("\u0aa3\u0aa5\u0ab0\3\2\3\2") - return buf.getvalue() - - -class SqlBaseLexer(Lexer): - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - T__0 = 1 - T__1 = 2 - T__2 = 3 - T__3 = 4 - T__4 = 5 - T__5 = 6 - T__6 = 7 - T__7 = 8 - T__8 = 9 - T__9 = 10 - T__10 = 11 - ADD = 12 - AFTER = 13 - ALL = 14 - ALTER = 15 - ANALYZE = 16 - AND = 17 - ANTI = 18 - ANY = 19 - ARCHIVE = 20 - ARRAY = 21 - AS = 22 - ASC = 23 - AT = 24 - AUTHORIZATION = 25 - BETWEEN = 26 - BOTH = 27 - BUCKET = 28 - BUCKETS = 29 - BY = 30 - CACHE = 31 - CASCADE = 32 - CASE = 33 - CAST = 34 - CHANGE = 35 - CHECK = 36 - CLEAR = 37 - CLUSTER = 38 - CLUSTERED = 39 - CODEGEN = 40 - COLLATE = 41 - COLLECTION = 42 - COLUMN = 43 - COLUMNS = 44 - COMMENT = 45 - COMMIT = 46 - COMPACT = 47 - COMPACTIONS = 48 - COMPUTE = 49 - CONCATENATE = 50 - CONSTRAINT = 51 - COST = 52 - CREATE = 53 - CROSS = 54 - CUBE = 55 - CURRENT = 56 - CURRENT_DATE = 57 - CURRENT_TIME = 58 - CURRENT_TIMESTAMP = 59 - CURRENT_USER = 60 - DATA = 61 - DATABASE = 62 - DATABASES = 63 - DAY = 64 - DBPROPERTIES = 65 - DEFINED = 66 - DELETE = 67 - DELIMITED = 68 - DESC = 69 - DESCRIBE = 70 - DFS = 71 - DIRECTORIES = 72 - DIRECTORY = 73 - DISTINCT = 74 - DISTRIBUTE = 75 - DROP = 76 - ELSE = 77 - END = 78 - ESCAPE = 79 - ESCAPED = 80 - EXCEPT = 81 - EXCHANGE = 82 - EXISTS = 83 - EXPLAIN = 84 - EXPORT = 85 - EXTENDED = 86 - EXTERNAL = 87 - EXTRACT = 88 - FALSE = 89 - FETCH = 90 - FIELDS = 91 - FILTER = 92 - FILEFORMAT = 93 - FIRST = 94 - FOLLOWING = 95 - FOR = 96 - FOREIGN = 97 - FORMAT = 98 - FORMATTED = 99 - FROM = 100 - FULL = 101 - FUNCTION = 102 - FUNCTIONS = 103 - GLOBAL = 104 - GRANT = 105 - GROUP = 106 - GROUPING = 107 - HAVING = 108 - HOUR = 109 - IF = 110 - IGNORE = 111 - IMPORT = 112 - IN = 113 - INDEX = 114 - INDEXES = 115 - INNER = 116 - INPATH = 117 - INPUTFORMAT = 118 - INSERT = 119 - INTERSECT = 120 - INTERVAL = 121 - INTO = 122 - IS = 123 - ITEMS = 124 - JOIN = 125 - KEYS = 126 - LAST = 127 - LATERAL = 128 - LAZY = 129 - LEADING = 130 - LEFT = 131 - LIKE = 132 - LIMIT = 133 - LINES = 134 - LIST = 135 - LOAD = 136 - LOCAL = 137 - LOCATION = 138 - LOCK = 139 - LOCKS = 140 - LOGICAL = 141 - MACRO = 142 - MAP = 143 - MATCHED = 144 - MERGE = 145 - MINUTE = 146 - MONTH = 147 - MSCK = 148 - NAMESPACE = 149 - NAMESPACES = 150 - NATURAL = 151 - NO = 152 - NOT = 153 - NULL = 154 - NULLS = 155 - OF = 156 - ON = 157 - ONLY = 158 - OPTION = 159 - OPTIONS = 160 - OR = 161 - ORDER = 162 - OUT = 163 - OUTER = 164 - OUTPUTFORMAT = 165 - OVER = 166 - OVERLAPS = 167 - OVERLAY = 168 - OVERWRITE = 169 - PARTITION = 170 - PARTITIONED = 171 - PARTITIONS = 172 - PERCENTLIT = 173 - PIVOT = 174 - PLACING = 175 - POSITION = 176 - PRECEDING = 177 - PRIMARY = 178 - PRINCIPALS = 179 - PROPERTIES = 180 - PURGE = 181 - QUERY = 182 - RANGE = 183 - RECORDREADER = 184 - RECORDWRITER = 185 - RECOVER = 186 - REDUCE = 187 - REFERENCES = 188 - REFRESH = 189 - RENAME = 190 - REPAIR = 191 - REPLACE = 192 - RESET = 193 - RESTRICT = 194 - REVOKE = 195 - RIGHT = 196 - RLIKE = 197 - ROLE = 198 - ROLES = 199 - ROLLBACK = 200 - ROLLUP = 201 - ROW = 202 - ROWS = 203 - SCHEMA = 204 - SECOND = 205 - SELECT = 206 - SEMI = 207 - SEPARATED = 208 - SERDE = 209 - SERDEPROPERTIES = 210 - SESSION_USER = 211 - SET = 212 - SETMINUS = 213 - SETS = 214 - SHOW = 215 - SKEWED = 216 - SOME = 217 - SORT = 218 - SORTED = 219 - START = 220 - STATISTICS = 221 - STORED = 222 - STRATIFY = 223 - STRUCT = 224 - SUBSTR = 225 - SUBSTRING = 226 - TABLE = 227 - TABLES = 228 - TABLESAMPLE = 229 - TBLPROPERTIES = 230 - TEMPORARY = 231 - TERMINATED = 232 - THEN = 233 - TO = 234 - TOUCH = 235 - TRAILING = 236 - TRANSACTION = 237 - TRANSACTIONS = 238 - TRANSFORM = 239 - TRIM = 240 - TRUE = 241 - TRUNCATE = 242 - TYPE = 243 - UNARCHIVE = 244 - UNBOUNDED = 245 - UNCACHE = 246 - UNION = 247 - UNIQUE = 248 - UNKNOWN = 249 - UNLOCK = 250 - UNSET = 251 - UPDATE = 252 - USE = 253 - USER = 254 - USING = 255 - VALUES = 256 - VIEW = 257 - VIEWS = 258 - WHEN = 259 - WHERE = 260 - WINDOW = 261 - WITH = 262 - YEAR = 263 - EQ = 264 - NSEQ = 265 - NEQ = 266 - NEQJ = 267 - LT = 268 - LTE = 269 - GT = 270 - GTE = 271 - PLUS = 272 - MINUS = 273 - ASTERISK = 274 - SLASH = 275 - PERCENT = 276 - DIV = 277 - TILDE = 278 - AMPERSAND = 279 - PIPE = 280 - CONCAT_PIPE = 281 - HAT = 282 - STRING = 283 - BIGINT_LITERAL = 284 - SMALLINT_LITERAL = 285 - TINYINT_LITERAL = 286 - INTEGER_VALUE = 287 - EXPONENT_VALUE = 288 - DECIMAL_VALUE = 289 - DOUBLE_LITERAL = 290 - BIGDECIMAL_LITERAL = 291 - IDENTIFIER = 292 - BACKQUOTED_IDENTIFIER = 293 - SIMPLE_COMMENT = 294 - BRACKETED_COMMENT = 295 - WS = 296 - UNRECOGNIZED = 297 - - channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] - - modeNames = [ "DEFAULT_MODE" ] - - literalNames = [ "", - "';'", "'('", "')'", "','", "'.'", "'/*+'", "'*/'", "'->'", - "'['", "']'", "':'", "'ADD'", "'AFTER'", "'ALL'", "'ALTER'", - "'ANALYZE'", "'AND'", "'ANTI'", "'ANY'", "'ARCHIVE'", "'ARRAY'", - "'AS'", "'ASC'", "'AT'", "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", - "'BUCKET'", "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", - "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", "'CLUSTERED'", - "'CODEGEN'", "'COLLATE'", "'COLLECTION'", "'COLUMN'", "'COLUMNS'", - "'COMMENT'", "'COMMIT'", "'COMPACT'", "'COMPACTIONS'", "'COMPUTE'", - "'CONCATENATE'", "'CONSTRAINT'", "'COST'", "'CREATE'", "'CROSS'", - "'CUBE'", "'CURRENT'", "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", - "'CURRENT_USER'", "'DATA'", "'DATABASE'", "'DAY'", "'DBPROPERTIES'", - "'DEFINED'", "'DELETE'", "'DELIMITED'", "'DESC'", "'DESCRIBE'", - "'DFS'", "'DIRECTORIES'", "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", - "'DROP'", "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", - "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", "'EXTENDED'", - "'EXTERNAL'", "'EXTRACT'", "'FALSE'", "'FETCH'", "'FIELDS'", - "'FILTER'", "'FILEFORMAT'", "'FIRST'", "'FOLLOWING'", "'FOR'", - "'FOREIGN'", "'FORMAT'", "'FORMATTED'", "'FROM'", "'FULL'", - "'FUNCTION'", "'FUNCTIONS'", "'GLOBAL'", "'GRANT'", "'GROUP'", - "'GROUPING'", "'HAVING'", "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", - "'IN'", "'INDEX'", "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", - "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", "'IS'", "'ITEMS'", - "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", "'LAZY'", "'LEADING'", - "'LEFT'", "'LIKE'", "'LIMIT'", "'LINES'", "'LIST'", "'LOAD'", - "'LOCAL'", "'LOCATION'", "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", - "'MAP'", "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", - "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", "'NULL'", - "'NULLS'", "'OF'", "'ON'", "'ONLY'", "'OPTION'", "'OPTIONS'", - "'OR'", "'ORDER'", "'OUT'", "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", - "'OVERLAPS'", "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", - "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", "'POSITION'", - "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", "'PROPERTIES'", - "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", "'RECORDWRITER'", - "'RECOVER'", "'REDUCE'", "'REFERENCES'", "'REFRESH'", "'RENAME'", - "'REPAIR'", "'REPLACE'", "'RESET'", "'RESTRICT'", "'REVOKE'", - "'RIGHT'", "'ROLE'", "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", - "'ROWS'", "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", - "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", "'MINUS'", - "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", "'SORT'", "'SORTED'", - "'START'", "'STATISTICS'", "'STORED'", "'STRATIFY'", "'STRUCT'", - "'SUBSTR'", "'SUBSTRING'", "'TABLE'", "'TABLES'", "'TABLESAMPLE'", - "'TBLPROPERTIES'", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", - "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", - "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", "'UNBOUNDED'", - "'UNCACHE'", "'UNION'", "'UNIQUE'", "'UNKNOWN'", "'UNLOCK'", - "'UNSET'", "'UPDATE'", "'USE'", "'USER'", "'USING'", "'VALUES'", - "'VIEW'", "'VIEWS'", "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", - "'YEAR'", "'<=>'", "'<>'", "'!='", "'<'", "'>'", "'+'", "'-'", - "'*'", "'/'", "'%'", "'DIV'", "'~'", "'&'", "'|'", "'||'", "'^'" ] - - symbolicNames = [ "", - "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "ANTI", "ANY", - "ARCHIVE", "ARRAY", "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", - "BOTH", "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", - "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", - "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", - "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", - "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", - "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", - "DATA", "DATABASE", "DATABASES", "DAY", "DBPROPERTIES", "DEFINED", - "DELETE", "DELIMITED", "DESC", "DESCRIBE", "DFS", "DIRECTORIES", - "DIRECTORY", "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", - "ESCAPE", "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", - "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", "FETCH", - "FIELDS", "FILTER", "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", - "FOREIGN", "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", - "FUNCTIONS", "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", - "HOUR", "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", - "INNER", "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", - "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", "LAZY", - "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", "LOAD", - "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", "MACRO", "MAP", - "MATCHED", "MERGE", "MINUTE", "MONTH", "MSCK", "NAMESPACE", - "NAMESPACES", "NATURAL", "NO", "NOT", "NULL", "NULLS", "OF", - "ON", "ONLY", "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", - "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", - "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", "PIVOT", - "PLACING", "POSITION", "PRECEDING", "PRIMARY", "PRINCIPALS", - "PROPERTIES", "PURGE", "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", - "RECOVER", "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", - "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", - "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", - "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", "SERDEPROPERTIES", - "SESSION_USER", "SET", "SETMINUS", "SETS", "SHOW", "SKEWED", - "SOME", "SORT", "SORTED", "START", "STATISTICS", "STORED", "STRATIFY", - "STRUCT", "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", - "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", - "TRAILING", "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", - "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", - "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", "USE", - "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", - "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", - "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", - "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", "HAT", "STRING", - "BIGINT_LITERAL", "SMALLINT_LITERAL", "TINYINT_LITERAL", "INTEGER_VALUE", - "EXPONENT_VALUE", "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", - "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", - "WS", "UNRECOGNIZED" ] - - ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", - "T__7", "T__8", "T__9", "T__10", "ADD", "AFTER", "ALL", - "ALTER", "ANALYZE", "AND", "ANTI", "ANY", "ARCHIVE", "ARRAY", - "AS", "ASC", "AT", "AUTHORIZATION", "BETWEEN", "BOTH", - "BUCKET", "BUCKETS", "BY", "CACHE", "CASCADE", "CASE", - "CAST", "CHANGE", "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", - "CODEGEN", "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", - "COMMENT", "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", - "CONCATENATE", "CONSTRAINT", "COST", "CREATE", "CROSS", - "CUBE", "CURRENT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", - "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", - "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", "DESC", - "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", "DISTINCT", - "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", "ESCAPED", - "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", "EXPORT", "EXTENDED", - "EXTERNAL", "EXTRACT", "FALSE", "FETCH", "FIELDS", "FILTER", - "FILEFORMAT", "FIRST", "FOLLOWING", "FOR", "FOREIGN", - "FORMAT", "FORMATTED", "FROM", "FULL", "FUNCTION", "FUNCTIONS", - "GLOBAL", "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", - "IF", "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", - "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", - "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", - "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", "LIST", - "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", "LOGICAL", - "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", "MONTH", - "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", "NO", "NOT", - "NULL", "NULLS", "OF", "ON", "ONLY", "OPTION", "OPTIONS", - "OR", "ORDER", "OUT", "OUTER", "OUTPUTFORMAT", "OVER", - "OVERLAPS", "OVERLAY", "OVERWRITE", "PARTITION", "PARTITIONED", - "PARTITIONS", "PERCENTLIT", "PIVOT", "PLACING", "POSITION", - "PRECEDING", "PRIMARY", "PRINCIPALS", "PROPERTIES", "PURGE", - "QUERY", "RANGE", "RECORDREADER", "RECORDWRITER", "RECOVER", - "REDUCE", "REFERENCES", "REFRESH", "RENAME", "REPAIR", - "REPLACE", "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", - "ROLE", "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", - "SCHEMA", "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", - "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", - "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", "START", - "STATISTICS", "STORED", "STRATIFY", "STRUCT", "SUBSTR", - "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", "TBLPROPERTIES", - "TEMPORARY", "TERMINATED", "THEN", "TO", "TOUCH", "TRAILING", - "TRANSACTION", "TRANSACTIONS", "TRANSFORM", "TRIM", "TRUE", - "TRUNCATE", "TYPE", "UNARCHIVE", "UNBOUNDED", "UNCACHE", - "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSET", "UPDATE", - "USE", "USER", "USING", "VALUES", "VIEW", "VIEWS", "WHEN", - "WHERE", "WINDOW", "WITH", "YEAR", "EQ", "NSEQ", "NEQ", - "NEQJ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", - "CONCAT_PIPE", "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", - "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", - "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", - "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "DECIMAL_DIGITS", - "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", - "WS", "UNRECOGNIZED" ] - - grammarFileName = "SqlBase.g4" - - def __init__(self, input=None, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.7.1") - self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) - self._actions = None - self._predicates = None - - - """ - When false, INTERSECT is given the greater precedence over the other set - operations (UNION, EXCEPT and MINUS) as per the SQL standard. - """ - legacy_setops_precedence_enbled = False - - """ - When false, a literal with an exponent would be converted into - double type rather than decimal type. - """ - legacy_exponent_literal_as_decimal_enabled = False - - """ - When false, CREATE TABLE syntax without a provider will use - the value of spark.sql.sources.default as its provider. - """ - legacy_create_hive_table_by_default_enabled = False - - """ - When true, the behavior of keywords follows ANSI SQL standard. - """ - SQL_standard_keyword_behavior = False - - def isValidDecimal(self): - """ - Verify whether current token is a valid decimal token (which contains dot). - Returns true if the character that follows the token is not a digit or letter or underscore. - - For example: - For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. - For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. - For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. - For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed - by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' - which is not a digit or letter or underscore. - """ - nextChar = chr(self._input.LA(1)) - if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': - return False - else: - return True - - def isHint(self): - """ - This method will be called when we see '/*' and try to match it as a bracketed comment. - If the next character is '+', it should be parsed as hint later, and we cannot match - it as a bracketed comment. - - Returns true if the next character is '+'. - """ - nextChar = self._input.LA(1) - if nextChar == '+': - return True - else: - return False - - - def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): - if self._predicates is None: - preds = dict() - preds[287] = self.EXPONENT_VALUE_sempred - preds[288] = self.DECIMAL_VALUE_sempred - preds[289] = self.DOUBLE_LITERAL_sempred - preds[290] = self.BIGDECIMAL_LITERAL_sempred - preds[298] = self.BRACKETED_COMMENT_sempred - self._predicates = preds - pred = self._predicates.get(ruleIndex, None) - if pred is not None: - return pred(localctx, predIndex) - else: - raise Exception("No registered predicate for:" + str(ruleIndex)) - - def EXPONENT_VALUE_sempred(self, localctx:RuleContext, predIndex:int): - if predIndex == 0: - return self.isValidDecimal() - - - def DECIMAL_VALUE_sempred(self, localctx:RuleContext, predIndex:int): - if predIndex == 1: - return self.isValidDecimal() - - - def DOUBLE_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): - if predIndex == 2: - return self.isValidDecimal() - - - def BIGDECIMAL_LITERAL_sempred(self, localctx:RuleContext, predIndex:int): - if predIndex == 3: - return self.isValidDecimal() - - - def BRACKETED_COMMENT_sempred(self, localctx:RuleContext, predIndex:int): - if predIndex == 4: - return not self.isHint() - - - diff --git a/pysparkling/sql/ast/generated/SqlBaseLexer.tokens b/pysparkling/sql/ast/generated/SqlBaseLexer.tokens deleted file mode 100644 index 0d0385147..000000000 --- a/pysparkling/sql/ast/generated/SqlBaseLexer.tokens +++ /dev/null @@ -1,572 +0,0 @@ -T__0=1 -T__1=2 -T__2=3 -T__3=4 -T__4=5 -T__5=6 -T__6=7 -T__7=8 -T__8=9 -T__9=10 -T__10=11 -ADD=12 -AFTER=13 -ALL=14 -ALTER=15 -ANALYZE=16 -AND=17 -ANTI=18 -ANY=19 -ARCHIVE=20 -ARRAY=21 -AS=22 -ASC=23 -AT=24 -AUTHORIZATION=25 -BETWEEN=26 -BOTH=27 -BUCKET=28 -BUCKETS=29 -BY=30 -CACHE=31 -CASCADE=32 -CASE=33 -CAST=34 -CHANGE=35 -CHECK=36 -CLEAR=37 -CLUSTER=38 -CLUSTERED=39 -CODEGEN=40 -COLLATE=41 -COLLECTION=42 -COLUMN=43 -COLUMNS=44 -COMMENT=45 -COMMIT=46 -COMPACT=47 -COMPACTIONS=48 -COMPUTE=49 -CONCATENATE=50 -CONSTRAINT=51 -COST=52 -CREATE=53 -CROSS=54 -CUBE=55 -CURRENT=56 -CURRENT_DATE=57 -CURRENT_TIME=58 -CURRENT_TIMESTAMP=59 -CURRENT_USER=60 -DATA=61 -DATABASE=62 -DATABASES=63 -DAY=64 -DBPROPERTIES=65 -DEFINED=66 -DELETE=67 -DELIMITED=68 -DESC=69 -DESCRIBE=70 -DFS=71 -DIRECTORIES=72 -DIRECTORY=73 -DISTINCT=74 -DISTRIBUTE=75 -DROP=76 -ELSE=77 -END=78 -ESCAPE=79 -ESCAPED=80 -EXCEPT=81 -EXCHANGE=82 -EXISTS=83 -EXPLAIN=84 -EXPORT=85 -EXTENDED=86 -EXTERNAL=87 -EXTRACT=88 -FALSE=89 -FETCH=90 -FIELDS=91 -FILTER=92 -FILEFORMAT=93 -FIRST=94 -FOLLOWING=95 -FOR=96 -FOREIGN=97 -FORMAT=98 -FORMATTED=99 -FROM=100 -FULL=101 -FUNCTION=102 -FUNCTIONS=103 -GLOBAL=104 -GRANT=105 -GROUP=106 -GROUPING=107 -HAVING=108 -HOUR=109 -IF=110 -IGNORE=111 -IMPORT=112 -IN=113 -INDEX=114 -INDEXES=115 -INNER=116 -INPATH=117 -INPUTFORMAT=118 -INSERT=119 -INTERSECT=120 -INTERVAL=121 -INTO=122 -IS=123 -ITEMS=124 -JOIN=125 -KEYS=126 -LAST=127 -LATERAL=128 -LAZY=129 -LEADING=130 -LEFT=131 -LIKE=132 -LIMIT=133 -LINES=134 -LIST=135 -LOAD=136 -LOCAL=137 -LOCATION=138 -LOCK=139 -LOCKS=140 -LOGICAL=141 -MACRO=142 -MAP=143 -MATCHED=144 -MERGE=145 -MINUTE=146 -MONTH=147 -MSCK=148 -NAMESPACE=149 -NAMESPACES=150 -NATURAL=151 -NO=152 -NOT=153 -NULL=154 -NULLS=155 -OF=156 -ON=157 -ONLY=158 -OPTION=159 -OPTIONS=160 -OR=161 -ORDER=162 -OUT=163 -OUTER=164 -OUTPUTFORMAT=165 -OVER=166 -OVERLAPS=167 -OVERLAY=168 -OVERWRITE=169 -PARTITION=170 -PARTITIONED=171 -PARTITIONS=172 -PERCENTLIT=173 -PIVOT=174 -PLACING=175 -POSITION=176 -PRECEDING=177 -PRIMARY=178 -PRINCIPALS=179 -PROPERTIES=180 -PURGE=181 -QUERY=182 -RANGE=183 -RECORDREADER=184 -RECORDWRITER=185 -RECOVER=186 -REDUCE=187 -REFERENCES=188 -REFRESH=189 -RENAME=190 -REPAIR=191 -REPLACE=192 -RESET=193 -RESTRICT=194 -REVOKE=195 -RIGHT=196 -RLIKE=197 -ROLE=198 -ROLES=199 -ROLLBACK=200 -ROLLUP=201 -ROW=202 -ROWS=203 -SCHEMA=204 -SECOND=205 -SELECT=206 -SEMI=207 -SEPARATED=208 -SERDE=209 -SERDEPROPERTIES=210 -SESSION_USER=211 -SET=212 -SETMINUS=213 -SETS=214 -SHOW=215 -SKEWED=216 -SOME=217 -SORT=218 -SORTED=219 -START=220 -STATISTICS=221 -STORED=222 -STRATIFY=223 -STRUCT=224 -SUBSTR=225 -SUBSTRING=226 -TABLE=227 -TABLES=228 -TABLESAMPLE=229 -TBLPROPERTIES=230 -TEMPORARY=231 -TERMINATED=232 -THEN=233 -TO=234 -TOUCH=235 -TRAILING=236 -TRANSACTION=237 -TRANSACTIONS=238 -TRANSFORM=239 -TRIM=240 -TRUE=241 -TRUNCATE=242 -TYPE=243 -UNARCHIVE=244 -UNBOUNDED=245 -UNCACHE=246 -UNION=247 -UNIQUE=248 -UNKNOWN=249 -UNLOCK=250 -UNSET=251 -UPDATE=252 -USE=253 -USER=254 -USING=255 -VALUES=256 -VIEW=257 -VIEWS=258 -WHEN=259 -WHERE=260 -WINDOW=261 -WITH=262 -YEAR=263 -EQ=264 -NSEQ=265 -NEQ=266 -NEQJ=267 -LT=268 -LTE=269 -GT=270 -GTE=271 -PLUS=272 -MINUS=273 -ASTERISK=274 -SLASH=275 -PERCENT=276 -DIV=277 -TILDE=278 -AMPERSAND=279 -PIPE=280 -CONCAT_PIPE=281 -HAT=282 -STRING=283 -BIGINT_LITERAL=284 -SMALLINT_LITERAL=285 -TINYINT_LITERAL=286 -INTEGER_VALUE=287 -EXPONENT_VALUE=288 -DECIMAL_VALUE=289 -DOUBLE_LITERAL=290 -BIGDECIMAL_LITERAL=291 -IDENTIFIER=292 -BACKQUOTED_IDENTIFIER=293 -SIMPLE_COMMENT=294 -BRACKETED_COMMENT=295 -WS=296 -UNRECOGNIZED=297 -';'=1 -'('=2 -')'=3 -','=4 -'.'=5 -'/*+'=6 -'*/'=7 -'->'=8 -'['=9 -']'=10 -':'=11 -'ADD'=12 -'AFTER'=13 -'ALL'=14 -'ALTER'=15 -'ANALYZE'=16 -'AND'=17 -'ANTI'=18 -'ANY'=19 -'ARCHIVE'=20 -'ARRAY'=21 -'AS'=22 -'ASC'=23 -'AT'=24 -'AUTHORIZATION'=25 -'BETWEEN'=26 -'BOTH'=27 -'BUCKET'=28 -'BUCKETS'=29 -'BY'=30 -'CACHE'=31 -'CASCADE'=32 -'CASE'=33 -'CAST'=34 -'CHANGE'=35 -'CHECK'=36 -'CLEAR'=37 -'CLUSTER'=38 -'CLUSTERED'=39 -'CODEGEN'=40 -'COLLATE'=41 -'COLLECTION'=42 -'COLUMN'=43 -'COLUMNS'=44 -'COMMENT'=45 -'COMMIT'=46 -'COMPACT'=47 -'COMPACTIONS'=48 -'COMPUTE'=49 -'CONCATENATE'=50 -'CONSTRAINT'=51 -'COST'=52 -'CREATE'=53 -'CROSS'=54 -'CUBE'=55 -'CURRENT'=56 -'CURRENT_DATE'=57 -'CURRENT_TIME'=58 -'CURRENT_TIMESTAMP'=59 -'CURRENT_USER'=60 -'DATA'=61 -'DATABASE'=62 -'DAY'=64 -'DBPROPERTIES'=65 -'DEFINED'=66 -'DELETE'=67 -'DELIMITED'=68 -'DESC'=69 -'DESCRIBE'=70 -'DFS'=71 -'DIRECTORIES'=72 -'DIRECTORY'=73 -'DISTINCT'=74 -'DISTRIBUTE'=75 -'DROP'=76 -'ELSE'=77 -'END'=78 -'ESCAPE'=79 -'ESCAPED'=80 -'EXCEPT'=81 -'EXCHANGE'=82 -'EXISTS'=83 -'EXPLAIN'=84 -'EXPORT'=85 -'EXTENDED'=86 -'EXTERNAL'=87 -'EXTRACT'=88 -'FALSE'=89 -'FETCH'=90 -'FIELDS'=91 -'FILTER'=92 -'FILEFORMAT'=93 -'FIRST'=94 -'FOLLOWING'=95 -'FOR'=96 -'FOREIGN'=97 -'FORMAT'=98 -'FORMATTED'=99 -'FROM'=100 -'FULL'=101 -'FUNCTION'=102 -'FUNCTIONS'=103 -'GLOBAL'=104 -'GRANT'=105 -'GROUP'=106 -'GROUPING'=107 -'HAVING'=108 -'HOUR'=109 -'IF'=110 -'IGNORE'=111 -'IMPORT'=112 -'IN'=113 -'INDEX'=114 -'INDEXES'=115 -'INNER'=116 -'INPATH'=117 -'INPUTFORMAT'=118 -'INSERT'=119 -'INTERSECT'=120 -'INTERVAL'=121 -'INTO'=122 -'IS'=123 -'ITEMS'=124 -'JOIN'=125 -'KEYS'=126 -'LAST'=127 -'LATERAL'=128 -'LAZY'=129 -'LEADING'=130 -'LEFT'=131 -'LIKE'=132 -'LIMIT'=133 -'LINES'=134 -'LIST'=135 -'LOAD'=136 -'LOCAL'=137 -'LOCATION'=138 -'LOCK'=139 -'LOCKS'=140 -'LOGICAL'=141 -'MACRO'=142 -'MAP'=143 -'MATCHED'=144 -'MERGE'=145 -'MINUTE'=146 -'MONTH'=147 -'MSCK'=148 -'NAMESPACE'=149 -'NAMESPACES'=150 -'NATURAL'=151 -'NO'=152 -'NULL'=154 -'NULLS'=155 -'OF'=156 -'ON'=157 -'ONLY'=158 -'OPTION'=159 -'OPTIONS'=160 -'OR'=161 -'ORDER'=162 -'OUT'=163 -'OUTER'=164 -'OUTPUTFORMAT'=165 -'OVER'=166 -'OVERLAPS'=167 -'OVERLAY'=168 -'OVERWRITE'=169 -'PARTITION'=170 -'PARTITIONED'=171 -'PARTITIONS'=172 -'PERCENT'=173 -'PIVOT'=174 -'PLACING'=175 -'POSITION'=176 -'PRECEDING'=177 -'PRIMARY'=178 -'PRINCIPALS'=179 -'PROPERTIES'=180 -'PURGE'=181 -'QUERY'=182 -'RANGE'=183 -'RECORDREADER'=184 -'RECORDWRITER'=185 -'RECOVER'=186 -'REDUCE'=187 -'REFERENCES'=188 -'REFRESH'=189 -'RENAME'=190 -'REPAIR'=191 -'REPLACE'=192 -'RESET'=193 -'RESTRICT'=194 -'REVOKE'=195 -'RIGHT'=196 -'ROLE'=198 -'ROLES'=199 -'ROLLBACK'=200 -'ROLLUP'=201 -'ROW'=202 -'ROWS'=203 -'SCHEMA'=204 -'SECOND'=205 -'SELECT'=206 -'SEMI'=207 -'SEPARATED'=208 -'SERDE'=209 -'SERDEPROPERTIES'=210 -'SESSION_USER'=211 -'SET'=212 -'MINUS'=213 -'SETS'=214 -'SHOW'=215 -'SKEWED'=216 -'SOME'=217 -'SORT'=218 -'SORTED'=219 -'START'=220 -'STATISTICS'=221 -'STORED'=222 -'STRATIFY'=223 -'STRUCT'=224 -'SUBSTR'=225 -'SUBSTRING'=226 -'TABLE'=227 -'TABLES'=228 -'TABLESAMPLE'=229 -'TBLPROPERTIES'=230 -'TERMINATED'=232 -'THEN'=233 -'TO'=234 -'TOUCH'=235 -'TRAILING'=236 -'TRANSACTION'=237 -'TRANSACTIONS'=238 -'TRANSFORM'=239 -'TRIM'=240 -'TRUE'=241 -'TRUNCATE'=242 -'TYPE'=243 -'UNARCHIVE'=244 -'UNBOUNDED'=245 -'UNCACHE'=246 -'UNION'=247 -'UNIQUE'=248 -'UNKNOWN'=249 -'UNLOCK'=250 -'UNSET'=251 -'UPDATE'=252 -'USE'=253 -'USER'=254 -'USING'=255 -'VALUES'=256 -'VIEW'=257 -'VIEWS'=258 -'WHEN'=259 -'WHERE'=260 -'WINDOW'=261 -'WITH'=262 -'YEAR'=263 -'<=>'=265 -'<>'=266 -'!='=267 -'<'=268 -'>'=270 -'+'=272 -'-'=273 -'*'=274 -'/'=275 -'%'=276 -'DIV'=277 -'~'=278 -'&'=279 -'|'=280 -'||'=281 -'^'=282 diff --git a/pysparkling/sql/ast/generated/SqlBaseListener.py b/pysparkling/sql/ast/generated/SqlBaseListener.py deleted file mode 100644 index f12369053..000000000 --- a/pysparkling/sql/ast/generated/SqlBaseListener.py +++ /dev/null @@ -1,2404 +0,0 @@ -# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 -from antlr4 import * -if __name__ is not None and "." in __name__: - from .SqlBaseParser import SqlBaseParser -else: - from SqlBaseParser import SqlBaseParser - -# This class defines a complete listener for a parse tree produced by SqlBaseParser. -class SqlBaseListener(ParseTreeListener): - - # Enter a parse tree produced by SqlBaseParser#singleStatement. - def enterSingleStatement(self, ctx:SqlBaseParser.SingleStatementContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleStatement. - def exitSingleStatement(self, ctx:SqlBaseParser.SingleStatementContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleExpression. - def enterSingleExpression(self, ctx:SqlBaseParser.SingleExpressionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleExpression. - def exitSingleExpression(self, ctx:SqlBaseParser.SingleExpressionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleTableIdentifier. - def enterSingleTableIdentifier(self, ctx:SqlBaseParser.SingleTableIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleTableIdentifier. - def exitSingleTableIdentifier(self, ctx:SqlBaseParser.SingleTableIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleMultipartIdentifier. - def enterSingleMultipartIdentifier(self, ctx:SqlBaseParser.SingleMultipartIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleMultipartIdentifier. - def exitSingleMultipartIdentifier(self, ctx:SqlBaseParser.SingleMultipartIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleFunctionIdentifier. - def enterSingleFunctionIdentifier(self, ctx:SqlBaseParser.SingleFunctionIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleFunctionIdentifier. - def exitSingleFunctionIdentifier(self, ctx:SqlBaseParser.SingleFunctionIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleDataType. - def enterSingleDataType(self, ctx:SqlBaseParser.SingleDataTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleDataType. - def exitSingleDataType(self, ctx:SqlBaseParser.SingleDataTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleTableSchema. - def enterSingleTableSchema(self, ctx:SqlBaseParser.SingleTableSchemaContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleTableSchema. - def exitSingleTableSchema(self, ctx:SqlBaseParser.SingleTableSchemaContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#statementDefault. - def enterStatementDefault(self, ctx:SqlBaseParser.StatementDefaultContext): - pass - - # Exit a parse tree produced by SqlBaseParser#statementDefault. - def exitStatementDefault(self, ctx:SqlBaseParser.StatementDefaultContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dmlStatement. - def enterDmlStatement(self, ctx:SqlBaseParser.DmlStatementContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dmlStatement. - def exitDmlStatement(self, ctx:SqlBaseParser.DmlStatementContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#use. - def enterUse(self, ctx:SqlBaseParser.UseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#use. - def exitUse(self, ctx:SqlBaseParser.UseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createNamespace. - def enterCreateNamespace(self, ctx:SqlBaseParser.CreateNamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createNamespace. - def exitCreateNamespace(self, ctx:SqlBaseParser.CreateNamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setNamespaceProperties. - def enterSetNamespaceProperties(self, ctx:SqlBaseParser.SetNamespacePropertiesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setNamespaceProperties. - def exitSetNamespaceProperties(self, ctx:SqlBaseParser.SetNamespacePropertiesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setNamespaceLocation. - def enterSetNamespaceLocation(self, ctx:SqlBaseParser.SetNamespaceLocationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setNamespaceLocation. - def exitSetNamespaceLocation(self, ctx:SqlBaseParser.SetNamespaceLocationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropNamespace. - def enterDropNamespace(self, ctx:SqlBaseParser.DropNamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropNamespace. - def exitDropNamespace(self, ctx:SqlBaseParser.DropNamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showNamespaces. - def enterShowNamespaces(self, ctx:SqlBaseParser.ShowNamespacesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showNamespaces. - def exitShowNamespaces(self, ctx:SqlBaseParser.ShowNamespacesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createTable. - def enterCreateTable(self, ctx:SqlBaseParser.CreateTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createTable. - def exitCreateTable(self, ctx:SqlBaseParser.CreateTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createHiveTable. - def enterCreateHiveTable(self, ctx:SqlBaseParser.CreateHiveTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createHiveTable. - def exitCreateHiveTable(self, ctx:SqlBaseParser.CreateHiveTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createTableLike. - def enterCreateTableLike(self, ctx:SqlBaseParser.CreateTableLikeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createTableLike. - def exitCreateTableLike(self, ctx:SqlBaseParser.CreateTableLikeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#replaceTable. - def enterReplaceTable(self, ctx:SqlBaseParser.ReplaceTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#replaceTable. - def exitReplaceTable(self, ctx:SqlBaseParser.ReplaceTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#analyze. - def enterAnalyze(self, ctx:SqlBaseParser.AnalyzeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#analyze. - def exitAnalyze(self, ctx:SqlBaseParser.AnalyzeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#addTableColumns. - def enterAddTableColumns(self, ctx:SqlBaseParser.AddTableColumnsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#addTableColumns. - def exitAddTableColumns(self, ctx:SqlBaseParser.AddTableColumnsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#renameTableColumn. - def enterRenameTableColumn(self, ctx:SqlBaseParser.RenameTableColumnContext): - pass - - # Exit a parse tree produced by SqlBaseParser#renameTableColumn. - def exitRenameTableColumn(self, ctx:SqlBaseParser.RenameTableColumnContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropTableColumns. - def enterDropTableColumns(self, ctx:SqlBaseParser.DropTableColumnsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropTableColumns. - def exitDropTableColumns(self, ctx:SqlBaseParser.DropTableColumnsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#renameTable. - def enterRenameTable(self, ctx:SqlBaseParser.RenameTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#renameTable. - def exitRenameTable(self, ctx:SqlBaseParser.RenameTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setTableProperties. - def enterSetTableProperties(self, ctx:SqlBaseParser.SetTablePropertiesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setTableProperties. - def exitSetTableProperties(self, ctx:SqlBaseParser.SetTablePropertiesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#unsetTableProperties. - def enterUnsetTableProperties(self, ctx:SqlBaseParser.UnsetTablePropertiesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#unsetTableProperties. - def exitUnsetTableProperties(self, ctx:SqlBaseParser.UnsetTablePropertiesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#alterTableAlterColumn. - def enterAlterTableAlterColumn(self, ctx:SqlBaseParser.AlterTableAlterColumnContext): - pass - - # Exit a parse tree produced by SqlBaseParser#alterTableAlterColumn. - def exitAlterTableAlterColumn(self, ctx:SqlBaseParser.AlterTableAlterColumnContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#hiveChangeColumn. - def enterHiveChangeColumn(self, ctx:SqlBaseParser.HiveChangeColumnContext): - pass - - # Exit a parse tree produced by SqlBaseParser#hiveChangeColumn. - def exitHiveChangeColumn(self, ctx:SqlBaseParser.HiveChangeColumnContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#hiveReplaceColumns. - def enterHiveReplaceColumns(self, ctx:SqlBaseParser.HiveReplaceColumnsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#hiveReplaceColumns. - def exitHiveReplaceColumns(self, ctx:SqlBaseParser.HiveReplaceColumnsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setTableSerDe. - def enterSetTableSerDe(self, ctx:SqlBaseParser.SetTableSerDeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setTableSerDe. - def exitSetTableSerDe(self, ctx:SqlBaseParser.SetTableSerDeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#addTablePartition. - def enterAddTablePartition(self, ctx:SqlBaseParser.AddTablePartitionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#addTablePartition. - def exitAddTablePartition(self, ctx:SqlBaseParser.AddTablePartitionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#renameTablePartition. - def enterRenameTablePartition(self, ctx:SqlBaseParser.RenameTablePartitionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#renameTablePartition. - def exitRenameTablePartition(self, ctx:SqlBaseParser.RenameTablePartitionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropTablePartitions. - def enterDropTablePartitions(self, ctx:SqlBaseParser.DropTablePartitionsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropTablePartitions. - def exitDropTablePartitions(self, ctx:SqlBaseParser.DropTablePartitionsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setTableLocation. - def enterSetTableLocation(self, ctx:SqlBaseParser.SetTableLocationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setTableLocation. - def exitSetTableLocation(self, ctx:SqlBaseParser.SetTableLocationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#recoverPartitions. - def enterRecoverPartitions(self, ctx:SqlBaseParser.RecoverPartitionsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#recoverPartitions. - def exitRecoverPartitions(self, ctx:SqlBaseParser.RecoverPartitionsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropTable. - def enterDropTable(self, ctx:SqlBaseParser.DropTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropTable. - def exitDropTable(self, ctx:SqlBaseParser.DropTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropView. - def enterDropView(self, ctx:SqlBaseParser.DropViewContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropView. - def exitDropView(self, ctx:SqlBaseParser.DropViewContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createView. - def enterCreateView(self, ctx:SqlBaseParser.CreateViewContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createView. - def exitCreateView(self, ctx:SqlBaseParser.CreateViewContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createTempViewUsing. - def enterCreateTempViewUsing(self, ctx:SqlBaseParser.CreateTempViewUsingContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createTempViewUsing. - def exitCreateTempViewUsing(self, ctx:SqlBaseParser.CreateTempViewUsingContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#alterViewQuery. - def enterAlterViewQuery(self, ctx:SqlBaseParser.AlterViewQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#alterViewQuery. - def exitAlterViewQuery(self, ctx:SqlBaseParser.AlterViewQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createFunction. - def enterCreateFunction(self, ctx:SqlBaseParser.CreateFunctionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createFunction. - def exitCreateFunction(self, ctx:SqlBaseParser.CreateFunctionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dropFunction. - def enterDropFunction(self, ctx:SqlBaseParser.DropFunctionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dropFunction. - def exitDropFunction(self, ctx:SqlBaseParser.DropFunctionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#explain. - def enterExplain(self, ctx:SqlBaseParser.ExplainContext): - pass - - # Exit a parse tree produced by SqlBaseParser#explain. - def exitExplain(self, ctx:SqlBaseParser.ExplainContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showTables. - def enterShowTables(self, ctx:SqlBaseParser.ShowTablesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showTables. - def exitShowTables(self, ctx:SqlBaseParser.ShowTablesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showTable. - def enterShowTable(self, ctx:SqlBaseParser.ShowTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showTable. - def exitShowTable(self, ctx:SqlBaseParser.ShowTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showTblProperties. - def enterShowTblProperties(self, ctx:SqlBaseParser.ShowTblPropertiesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showTblProperties. - def exitShowTblProperties(self, ctx:SqlBaseParser.ShowTblPropertiesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showColumns. - def enterShowColumns(self, ctx:SqlBaseParser.ShowColumnsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showColumns. - def exitShowColumns(self, ctx:SqlBaseParser.ShowColumnsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showViews. - def enterShowViews(self, ctx:SqlBaseParser.ShowViewsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showViews. - def exitShowViews(self, ctx:SqlBaseParser.ShowViewsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showPartitions. - def enterShowPartitions(self, ctx:SqlBaseParser.ShowPartitionsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showPartitions. - def exitShowPartitions(self, ctx:SqlBaseParser.ShowPartitionsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showFunctions. - def enterShowFunctions(self, ctx:SqlBaseParser.ShowFunctionsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showFunctions. - def exitShowFunctions(self, ctx:SqlBaseParser.ShowFunctionsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showCreateTable. - def enterShowCreateTable(self, ctx:SqlBaseParser.ShowCreateTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showCreateTable. - def exitShowCreateTable(self, ctx:SqlBaseParser.ShowCreateTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#showCurrentNamespace. - def enterShowCurrentNamespace(self, ctx:SqlBaseParser.ShowCurrentNamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#showCurrentNamespace. - def exitShowCurrentNamespace(self, ctx:SqlBaseParser.ShowCurrentNamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeFunction. - def enterDescribeFunction(self, ctx:SqlBaseParser.DescribeFunctionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeFunction. - def exitDescribeFunction(self, ctx:SqlBaseParser.DescribeFunctionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeNamespace. - def enterDescribeNamespace(self, ctx:SqlBaseParser.DescribeNamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeNamespace. - def exitDescribeNamespace(self, ctx:SqlBaseParser.DescribeNamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeRelation. - def enterDescribeRelation(self, ctx:SqlBaseParser.DescribeRelationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeRelation. - def exitDescribeRelation(self, ctx:SqlBaseParser.DescribeRelationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeQuery. - def enterDescribeQuery(self, ctx:SqlBaseParser.DescribeQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeQuery. - def exitDescribeQuery(self, ctx:SqlBaseParser.DescribeQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#commentNamespace. - def enterCommentNamespace(self, ctx:SqlBaseParser.CommentNamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#commentNamespace. - def exitCommentNamespace(self, ctx:SqlBaseParser.CommentNamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#commentTable. - def enterCommentTable(self, ctx:SqlBaseParser.CommentTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#commentTable. - def exitCommentTable(self, ctx:SqlBaseParser.CommentTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#refreshTable. - def enterRefreshTable(self, ctx:SqlBaseParser.RefreshTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#refreshTable. - def exitRefreshTable(self, ctx:SqlBaseParser.RefreshTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#refreshResource. - def enterRefreshResource(self, ctx:SqlBaseParser.RefreshResourceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#refreshResource. - def exitRefreshResource(self, ctx:SqlBaseParser.RefreshResourceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#cacheTable. - def enterCacheTable(self, ctx:SqlBaseParser.CacheTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#cacheTable. - def exitCacheTable(self, ctx:SqlBaseParser.CacheTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#uncacheTable. - def enterUncacheTable(self, ctx:SqlBaseParser.UncacheTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#uncacheTable. - def exitUncacheTable(self, ctx:SqlBaseParser.UncacheTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#clearCache. - def enterClearCache(self, ctx:SqlBaseParser.ClearCacheContext): - pass - - # Exit a parse tree produced by SqlBaseParser#clearCache. - def exitClearCache(self, ctx:SqlBaseParser.ClearCacheContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#loadData. - def enterLoadData(self, ctx:SqlBaseParser.LoadDataContext): - pass - - # Exit a parse tree produced by SqlBaseParser#loadData. - def exitLoadData(self, ctx:SqlBaseParser.LoadDataContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#truncateTable. - def enterTruncateTable(self, ctx:SqlBaseParser.TruncateTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#truncateTable. - def exitTruncateTable(self, ctx:SqlBaseParser.TruncateTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#repairTable. - def enterRepairTable(self, ctx:SqlBaseParser.RepairTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#repairTable. - def exitRepairTable(self, ctx:SqlBaseParser.RepairTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#manageResource. - def enterManageResource(self, ctx:SqlBaseParser.ManageResourceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#manageResource. - def exitManageResource(self, ctx:SqlBaseParser.ManageResourceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#failNativeCommand. - def enterFailNativeCommand(self, ctx:SqlBaseParser.FailNativeCommandContext): - pass - - # Exit a parse tree produced by SqlBaseParser#failNativeCommand. - def exitFailNativeCommand(self, ctx:SqlBaseParser.FailNativeCommandContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setConfiguration. - def enterSetConfiguration(self, ctx:SqlBaseParser.SetConfigurationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setConfiguration. - def exitSetConfiguration(self, ctx:SqlBaseParser.SetConfigurationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#resetConfiguration. - def enterResetConfiguration(self, ctx:SqlBaseParser.ResetConfigurationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#resetConfiguration. - def exitResetConfiguration(self, ctx:SqlBaseParser.ResetConfigurationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#unsupportedHiveNativeCommands. - def enterUnsupportedHiveNativeCommands(self, ctx:SqlBaseParser.UnsupportedHiveNativeCommandsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#unsupportedHiveNativeCommands. - def exitUnsupportedHiveNativeCommands(self, ctx:SqlBaseParser.UnsupportedHiveNativeCommandsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createTableHeader. - def enterCreateTableHeader(self, ctx:SqlBaseParser.CreateTableHeaderContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createTableHeader. - def exitCreateTableHeader(self, ctx:SqlBaseParser.CreateTableHeaderContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#replaceTableHeader. - def enterReplaceTableHeader(self, ctx:SqlBaseParser.ReplaceTableHeaderContext): - pass - - # Exit a parse tree produced by SqlBaseParser#replaceTableHeader. - def exitReplaceTableHeader(self, ctx:SqlBaseParser.ReplaceTableHeaderContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#bucketSpec. - def enterBucketSpec(self, ctx:SqlBaseParser.BucketSpecContext): - pass - - # Exit a parse tree produced by SqlBaseParser#bucketSpec. - def exitBucketSpec(self, ctx:SqlBaseParser.BucketSpecContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#skewSpec. - def enterSkewSpec(self, ctx:SqlBaseParser.SkewSpecContext): - pass - - # Exit a parse tree produced by SqlBaseParser#skewSpec. - def exitSkewSpec(self, ctx:SqlBaseParser.SkewSpecContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#locationSpec. - def enterLocationSpec(self, ctx:SqlBaseParser.LocationSpecContext): - pass - - # Exit a parse tree produced by SqlBaseParser#locationSpec. - def exitLocationSpec(self, ctx:SqlBaseParser.LocationSpecContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#commentSpec. - def enterCommentSpec(self, ctx:SqlBaseParser.CommentSpecContext): - pass - - # Exit a parse tree produced by SqlBaseParser#commentSpec. - def exitCommentSpec(self, ctx:SqlBaseParser.CommentSpecContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#query. - def enterQuery(self, ctx:SqlBaseParser.QueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#query. - def exitQuery(self, ctx:SqlBaseParser.QueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#insertOverwriteTable. - def enterInsertOverwriteTable(self, ctx:SqlBaseParser.InsertOverwriteTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#insertOverwriteTable. - def exitInsertOverwriteTable(self, ctx:SqlBaseParser.InsertOverwriteTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#insertIntoTable. - def enterInsertIntoTable(self, ctx:SqlBaseParser.InsertIntoTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#insertIntoTable. - def exitInsertIntoTable(self, ctx:SqlBaseParser.InsertIntoTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#insertOverwriteHiveDir. - def enterInsertOverwriteHiveDir(self, ctx:SqlBaseParser.InsertOverwriteHiveDirContext): - pass - - # Exit a parse tree produced by SqlBaseParser#insertOverwriteHiveDir. - def exitInsertOverwriteHiveDir(self, ctx:SqlBaseParser.InsertOverwriteHiveDirContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#insertOverwriteDir. - def enterInsertOverwriteDir(self, ctx:SqlBaseParser.InsertOverwriteDirContext): - pass - - # Exit a parse tree produced by SqlBaseParser#insertOverwriteDir. - def exitInsertOverwriteDir(self, ctx:SqlBaseParser.InsertOverwriteDirContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#partitionSpecLocation. - def enterPartitionSpecLocation(self, ctx:SqlBaseParser.PartitionSpecLocationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#partitionSpecLocation. - def exitPartitionSpecLocation(self, ctx:SqlBaseParser.PartitionSpecLocationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#partitionSpec. - def enterPartitionSpec(self, ctx:SqlBaseParser.PartitionSpecContext): - pass - - # Exit a parse tree produced by SqlBaseParser#partitionSpec. - def exitPartitionSpec(self, ctx:SqlBaseParser.PartitionSpecContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#partitionVal. - def enterPartitionVal(self, ctx:SqlBaseParser.PartitionValContext): - pass - - # Exit a parse tree produced by SqlBaseParser#partitionVal. - def exitPartitionVal(self, ctx:SqlBaseParser.PartitionValContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#namespace. - def enterNamespace(self, ctx:SqlBaseParser.NamespaceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#namespace. - def exitNamespace(self, ctx:SqlBaseParser.NamespaceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeFuncName. - def enterDescribeFuncName(self, ctx:SqlBaseParser.DescribeFuncNameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeFuncName. - def exitDescribeFuncName(self, ctx:SqlBaseParser.DescribeFuncNameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#describeColName. - def enterDescribeColName(self, ctx:SqlBaseParser.DescribeColNameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#describeColName. - def exitDescribeColName(self, ctx:SqlBaseParser.DescribeColNameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#ctes. - def enterCtes(self, ctx:SqlBaseParser.CtesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#ctes. - def exitCtes(self, ctx:SqlBaseParser.CtesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#namedQuery. - def enterNamedQuery(self, ctx:SqlBaseParser.NamedQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#namedQuery. - def exitNamedQuery(self, ctx:SqlBaseParser.NamedQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableProvider. - def enterTableProvider(self, ctx:SqlBaseParser.TableProviderContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableProvider. - def exitTableProvider(self, ctx:SqlBaseParser.TableProviderContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createTableClauses. - def enterCreateTableClauses(self, ctx:SqlBaseParser.CreateTableClausesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createTableClauses. - def exitCreateTableClauses(self, ctx:SqlBaseParser.CreateTableClausesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tablePropertyList. - def enterTablePropertyList(self, ctx:SqlBaseParser.TablePropertyListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tablePropertyList. - def exitTablePropertyList(self, ctx:SqlBaseParser.TablePropertyListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableProperty. - def enterTableProperty(self, ctx:SqlBaseParser.TablePropertyContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableProperty. - def exitTableProperty(self, ctx:SqlBaseParser.TablePropertyContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tablePropertyKey. - def enterTablePropertyKey(self, ctx:SqlBaseParser.TablePropertyKeyContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tablePropertyKey. - def exitTablePropertyKey(self, ctx:SqlBaseParser.TablePropertyKeyContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tablePropertyValue. - def enterTablePropertyValue(self, ctx:SqlBaseParser.TablePropertyValueContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tablePropertyValue. - def exitTablePropertyValue(self, ctx:SqlBaseParser.TablePropertyValueContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#constantList. - def enterConstantList(self, ctx:SqlBaseParser.ConstantListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#constantList. - def exitConstantList(self, ctx:SqlBaseParser.ConstantListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#nestedConstantList. - def enterNestedConstantList(self, ctx:SqlBaseParser.NestedConstantListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#nestedConstantList. - def exitNestedConstantList(self, ctx:SqlBaseParser.NestedConstantListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#createFileFormat. - def enterCreateFileFormat(self, ctx:SqlBaseParser.CreateFileFormatContext): - pass - - # Exit a parse tree produced by SqlBaseParser#createFileFormat. - def exitCreateFileFormat(self, ctx:SqlBaseParser.CreateFileFormatContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableFileFormat. - def enterTableFileFormat(self, ctx:SqlBaseParser.TableFileFormatContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableFileFormat. - def exitTableFileFormat(self, ctx:SqlBaseParser.TableFileFormatContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#genericFileFormat. - def enterGenericFileFormat(self, ctx:SqlBaseParser.GenericFileFormatContext): - pass - - # Exit a parse tree produced by SqlBaseParser#genericFileFormat. - def exitGenericFileFormat(self, ctx:SqlBaseParser.GenericFileFormatContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#storageHandler. - def enterStorageHandler(self, ctx:SqlBaseParser.StorageHandlerContext): - pass - - # Exit a parse tree produced by SqlBaseParser#storageHandler. - def exitStorageHandler(self, ctx:SqlBaseParser.StorageHandlerContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#resource. - def enterResource(self, ctx:SqlBaseParser.ResourceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#resource. - def exitResource(self, ctx:SqlBaseParser.ResourceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#singleInsertQuery. - def enterSingleInsertQuery(self, ctx:SqlBaseParser.SingleInsertQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#singleInsertQuery. - def exitSingleInsertQuery(self, ctx:SqlBaseParser.SingleInsertQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#multiInsertQuery. - def enterMultiInsertQuery(self, ctx:SqlBaseParser.MultiInsertQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#multiInsertQuery. - def exitMultiInsertQuery(self, ctx:SqlBaseParser.MultiInsertQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#deleteFromTable. - def enterDeleteFromTable(self, ctx:SqlBaseParser.DeleteFromTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#deleteFromTable. - def exitDeleteFromTable(self, ctx:SqlBaseParser.DeleteFromTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#updateTable. - def enterUpdateTable(self, ctx:SqlBaseParser.UpdateTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#updateTable. - def exitUpdateTable(self, ctx:SqlBaseParser.UpdateTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#mergeIntoTable. - def enterMergeIntoTable(self, ctx:SqlBaseParser.MergeIntoTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#mergeIntoTable. - def exitMergeIntoTable(self, ctx:SqlBaseParser.MergeIntoTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#queryOrganization. - def enterQueryOrganization(self, ctx:SqlBaseParser.QueryOrganizationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#queryOrganization. - def exitQueryOrganization(self, ctx:SqlBaseParser.QueryOrganizationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#multiInsertQueryBody. - def enterMultiInsertQueryBody(self, ctx:SqlBaseParser.MultiInsertQueryBodyContext): - pass - - # Exit a parse tree produced by SqlBaseParser#multiInsertQueryBody. - def exitMultiInsertQueryBody(self, ctx:SqlBaseParser.MultiInsertQueryBodyContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#queryTermDefault. - def enterQueryTermDefault(self, ctx:SqlBaseParser.QueryTermDefaultContext): - pass - - # Exit a parse tree produced by SqlBaseParser#queryTermDefault. - def exitQueryTermDefault(self, ctx:SqlBaseParser.QueryTermDefaultContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setOperation. - def enterSetOperation(self, ctx:SqlBaseParser.SetOperationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setOperation. - def exitSetOperation(self, ctx:SqlBaseParser.SetOperationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#queryPrimaryDefault. - def enterQueryPrimaryDefault(self, ctx:SqlBaseParser.QueryPrimaryDefaultContext): - pass - - # Exit a parse tree produced by SqlBaseParser#queryPrimaryDefault. - def exitQueryPrimaryDefault(self, ctx:SqlBaseParser.QueryPrimaryDefaultContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#fromStmt. - def enterFromStmt(self, ctx:SqlBaseParser.FromStmtContext): - pass - - # Exit a parse tree produced by SqlBaseParser#fromStmt. - def exitFromStmt(self, ctx:SqlBaseParser.FromStmtContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#table. - def enterTable(self, ctx:SqlBaseParser.TableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#table. - def exitTable(self, ctx:SqlBaseParser.TableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#inlineTableDefault1. - def enterInlineTableDefault1(self, ctx:SqlBaseParser.InlineTableDefault1Context): - pass - - # Exit a parse tree produced by SqlBaseParser#inlineTableDefault1. - def exitInlineTableDefault1(self, ctx:SqlBaseParser.InlineTableDefault1Context): - pass - - - # Enter a parse tree produced by SqlBaseParser#subquery. - def enterSubquery(self, ctx:SqlBaseParser.SubqueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#subquery. - def exitSubquery(self, ctx:SqlBaseParser.SubqueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sortItem. - def enterSortItem(self, ctx:SqlBaseParser.SortItemContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sortItem. - def exitSortItem(self, ctx:SqlBaseParser.SortItemContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#fromStatement. - def enterFromStatement(self, ctx:SqlBaseParser.FromStatementContext): - pass - - # Exit a parse tree produced by SqlBaseParser#fromStatement. - def exitFromStatement(self, ctx:SqlBaseParser.FromStatementContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#fromStatementBody. - def enterFromStatementBody(self, ctx:SqlBaseParser.FromStatementBodyContext): - pass - - # Exit a parse tree produced by SqlBaseParser#fromStatementBody. - def exitFromStatementBody(self, ctx:SqlBaseParser.FromStatementBodyContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#transformQuerySpecification. - def enterTransformQuerySpecification(self, ctx:SqlBaseParser.TransformQuerySpecificationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#transformQuerySpecification. - def exitTransformQuerySpecification(self, ctx:SqlBaseParser.TransformQuerySpecificationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#regularQuerySpecification. - def enterRegularQuerySpecification(self, ctx:SqlBaseParser.RegularQuerySpecificationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#regularQuerySpecification. - def exitRegularQuerySpecification(self, ctx:SqlBaseParser.RegularQuerySpecificationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#transformClause. - def enterTransformClause(self, ctx:SqlBaseParser.TransformClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#transformClause. - def exitTransformClause(self, ctx:SqlBaseParser.TransformClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#selectClause. - def enterSelectClause(self, ctx:SqlBaseParser.SelectClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#selectClause. - def exitSelectClause(self, ctx:SqlBaseParser.SelectClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setClause. - def enterSetClause(self, ctx:SqlBaseParser.SetClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setClause. - def exitSetClause(self, ctx:SqlBaseParser.SetClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#matchedClause. - def enterMatchedClause(self, ctx:SqlBaseParser.MatchedClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#matchedClause. - def exitMatchedClause(self, ctx:SqlBaseParser.MatchedClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#notMatchedClause. - def enterNotMatchedClause(self, ctx:SqlBaseParser.NotMatchedClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#notMatchedClause. - def exitNotMatchedClause(self, ctx:SqlBaseParser.NotMatchedClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#matchedAction. - def enterMatchedAction(self, ctx:SqlBaseParser.MatchedActionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#matchedAction. - def exitMatchedAction(self, ctx:SqlBaseParser.MatchedActionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#notMatchedAction. - def enterNotMatchedAction(self, ctx:SqlBaseParser.NotMatchedActionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#notMatchedAction. - def exitNotMatchedAction(self, ctx:SqlBaseParser.NotMatchedActionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#assignmentList. - def enterAssignmentList(self, ctx:SqlBaseParser.AssignmentListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#assignmentList. - def exitAssignmentList(self, ctx:SqlBaseParser.AssignmentListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#assignment. - def enterAssignment(self, ctx:SqlBaseParser.AssignmentContext): - pass - - # Exit a parse tree produced by SqlBaseParser#assignment. - def exitAssignment(self, ctx:SqlBaseParser.AssignmentContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#whereClause. - def enterWhereClause(self, ctx:SqlBaseParser.WhereClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#whereClause. - def exitWhereClause(self, ctx:SqlBaseParser.WhereClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#havingClause. - def enterHavingClause(self, ctx:SqlBaseParser.HavingClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#havingClause. - def exitHavingClause(self, ctx:SqlBaseParser.HavingClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#hint. - def enterHint(self, ctx:SqlBaseParser.HintContext): - pass - - # Exit a parse tree produced by SqlBaseParser#hint. - def exitHint(self, ctx:SqlBaseParser.HintContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#hintStatement. - def enterHintStatement(self, ctx:SqlBaseParser.HintStatementContext): - pass - - # Exit a parse tree produced by SqlBaseParser#hintStatement. - def exitHintStatement(self, ctx:SqlBaseParser.HintStatementContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#fromClause. - def enterFromClause(self, ctx:SqlBaseParser.FromClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#fromClause. - def exitFromClause(self, ctx:SqlBaseParser.FromClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#aggregationClause. - def enterAggregationClause(self, ctx:SqlBaseParser.AggregationClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#aggregationClause. - def exitAggregationClause(self, ctx:SqlBaseParser.AggregationClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#groupingSet. - def enterGroupingSet(self, ctx:SqlBaseParser.GroupingSetContext): - pass - - # Exit a parse tree produced by SqlBaseParser#groupingSet. - def exitGroupingSet(self, ctx:SqlBaseParser.GroupingSetContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#pivotClause. - def enterPivotClause(self, ctx:SqlBaseParser.PivotClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#pivotClause. - def exitPivotClause(self, ctx:SqlBaseParser.PivotClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#pivotColumn. - def enterPivotColumn(self, ctx:SqlBaseParser.PivotColumnContext): - pass - - # Exit a parse tree produced by SqlBaseParser#pivotColumn. - def exitPivotColumn(self, ctx:SqlBaseParser.PivotColumnContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#pivotValue. - def enterPivotValue(self, ctx:SqlBaseParser.PivotValueContext): - pass - - # Exit a parse tree produced by SqlBaseParser#pivotValue. - def exitPivotValue(self, ctx:SqlBaseParser.PivotValueContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#lateralView. - def enterLateralView(self, ctx:SqlBaseParser.LateralViewContext): - pass - - # Exit a parse tree produced by SqlBaseParser#lateralView. - def exitLateralView(self, ctx:SqlBaseParser.LateralViewContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#setQuantifier. - def enterSetQuantifier(self, ctx:SqlBaseParser.SetQuantifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#setQuantifier. - def exitSetQuantifier(self, ctx:SqlBaseParser.SetQuantifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#relation. - def enterRelation(self, ctx:SqlBaseParser.RelationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#relation. - def exitRelation(self, ctx:SqlBaseParser.RelationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#joinRelation. - def enterJoinRelation(self, ctx:SqlBaseParser.JoinRelationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#joinRelation. - def exitJoinRelation(self, ctx:SqlBaseParser.JoinRelationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#joinType. - def enterJoinType(self, ctx:SqlBaseParser.JoinTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#joinType. - def exitJoinType(self, ctx:SqlBaseParser.JoinTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#joinCriteria. - def enterJoinCriteria(self, ctx:SqlBaseParser.JoinCriteriaContext): - pass - - # Exit a parse tree produced by SqlBaseParser#joinCriteria. - def exitJoinCriteria(self, ctx:SqlBaseParser.JoinCriteriaContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sample. - def enterSample(self, ctx:SqlBaseParser.SampleContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sample. - def exitSample(self, ctx:SqlBaseParser.SampleContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sampleByPercentile. - def enterSampleByPercentile(self, ctx:SqlBaseParser.SampleByPercentileContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sampleByPercentile. - def exitSampleByPercentile(self, ctx:SqlBaseParser.SampleByPercentileContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sampleByRows. - def enterSampleByRows(self, ctx:SqlBaseParser.SampleByRowsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sampleByRows. - def exitSampleByRows(self, ctx:SqlBaseParser.SampleByRowsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sampleByBucket. - def enterSampleByBucket(self, ctx:SqlBaseParser.SampleByBucketContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sampleByBucket. - def exitSampleByBucket(self, ctx:SqlBaseParser.SampleByBucketContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#sampleByBytes. - def enterSampleByBytes(self, ctx:SqlBaseParser.SampleByBytesContext): - pass - - # Exit a parse tree produced by SqlBaseParser#sampleByBytes. - def exitSampleByBytes(self, ctx:SqlBaseParser.SampleByBytesContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identifierList. - def enterIdentifierList(self, ctx:SqlBaseParser.IdentifierListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identifierList. - def exitIdentifierList(self, ctx:SqlBaseParser.IdentifierListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identifierSeq. - def enterIdentifierSeq(self, ctx:SqlBaseParser.IdentifierSeqContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identifierSeq. - def exitIdentifierSeq(self, ctx:SqlBaseParser.IdentifierSeqContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#orderedIdentifierList. - def enterOrderedIdentifierList(self, ctx:SqlBaseParser.OrderedIdentifierListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#orderedIdentifierList. - def exitOrderedIdentifierList(self, ctx:SqlBaseParser.OrderedIdentifierListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#orderedIdentifier. - def enterOrderedIdentifier(self, ctx:SqlBaseParser.OrderedIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#orderedIdentifier. - def exitOrderedIdentifier(self, ctx:SqlBaseParser.OrderedIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identifierCommentList. - def enterIdentifierCommentList(self, ctx:SqlBaseParser.IdentifierCommentListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identifierCommentList. - def exitIdentifierCommentList(self, ctx:SqlBaseParser.IdentifierCommentListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identifierComment. - def enterIdentifierComment(self, ctx:SqlBaseParser.IdentifierCommentContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identifierComment. - def exitIdentifierComment(self, ctx:SqlBaseParser.IdentifierCommentContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableName. - def enterTableName(self, ctx:SqlBaseParser.TableNameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableName. - def exitTableName(self, ctx:SqlBaseParser.TableNameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#aliasedQuery. - def enterAliasedQuery(self, ctx:SqlBaseParser.AliasedQueryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#aliasedQuery. - def exitAliasedQuery(self, ctx:SqlBaseParser.AliasedQueryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#aliasedRelation. - def enterAliasedRelation(self, ctx:SqlBaseParser.AliasedRelationContext): - pass - - # Exit a parse tree produced by SqlBaseParser#aliasedRelation. - def exitAliasedRelation(self, ctx:SqlBaseParser.AliasedRelationContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#inlineTableDefault2. - def enterInlineTableDefault2(self, ctx:SqlBaseParser.InlineTableDefault2Context): - pass - - # Exit a parse tree produced by SqlBaseParser#inlineTableDefault2. - def exitInlineTableDefault2(self, ctx:SqlBaseParser.InlineTableDefault2Context): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableValuedFunction. - def enterTableValuedFunction(self, ctx:SqlBaseParser.TableValuedFunctionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableValuedFunction. - def exitTableValuedFunction(self, ctx:SqlBaseParser.TableValuedFunctionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#inlineTable. - def enterInlineTable(self, ctx:SqlBaseParser.InlineTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#inlineTable. - def exitInlineTable(self, ctx:SqlBaseParser.InlineTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#functionTable. - def enterFunctionTable(self, ctx:SqlBaseParser.FunctionTableContext): - pass - - # Exit a parse tree produced by SqlBaseParser#functionTable. - def exitFunctionTable(self, ctx:SqlBaseParser.FunctionTableContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableAlias. - def enterTableAlias(self, ctx:SqlBaseParser.TableAliasContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableAlias. - def exitTableAlias(self, ctx:SqlBaseParser.TableAliasContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#rowFormatSerde. - def enterRowFormatSerde(self, ctx:SqlBaseParser.RowFormatSerdeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#rowFormatSerde. - def exitRowFormatSerde(self, ctx:SqlBaseParser.RowFormatSerdeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#rowFormatDelimited. - def enterRowFormatDelimited(self, ctx:SqlBaseParser.RowFormatDelimitedContext): - pass - - # Exit a parse tree produced by SqlBaseParser#rowFormatDelimited. - def exitRowFormatDelimited(self, ctx:SqlBaseParser.RowFormatDelimitedContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#multipartIdentifierList. - def enterMultipartIdentifierList(self, ctx:SqlBaseParser.MultipartIdentifierListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#multipartIdentifierList. - def exitMultipartIdentifierList(self, ctx:SqlBaseParser.MultipartIdentifierListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#multipartIdentifier. - def enterMultipartIdentifier(self, ctx:SqlBaseParser.MultipartIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#multipartIdentifier. - def exitMultipartIdentifier(self, ctx:SqlBaseParser.MultipartIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tableIdentifier. - def enterTableIdentifier(self, ctx:SqlBaseParser.TableIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tableIdentifier. - def exitTableIdentifier(self, ctx:SqlBaseParser.TableIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#functionIdentifier. - def enterFunctionIdentifier(self, ctx:SqlBaseParser.FunctionIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#functionIdentifier. - def exitFunctionIdentifier(self, ctx:SqlBaseParser.FunctionIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#namedExpression. - def enterNamedExpression(self, ctx:SqlBaseParser.NamedExpressionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#namedExpression. - def exitNamedExpression(self, ctx:SqlBaseParser.NamedExpressionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#namedExpressionSeq. - def enterNamedExpressionSeq(self, ctx:SqlBaseParser.NamedExpressionSeqContext): - pass - - # Exit a parse tree produced by SqlBaseParser#namedExpressionSeq. - def exitNamedExpressionSeq(self, ctx:SqlBaseParser.NamedExpressionSeqContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#transformList. - def enterTransformList(self, ctx:SqlBaseParser.TransformListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#transformList. - def exitTransformList(self, ctx:SqlBaseParser.TransformListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identityTransform. - def enterIdentityTransform(self, ctx:SqlBaseParser.IdentityTransformContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identityTransform. - def exitIdentityTransform(self, ctx:SqlBaseParser.IdentityTransformContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#applyTransform. - def enterApplyTransform(self, ctx:SqlBaseParser.ApplyTransformContext): - pass - - # Exit a parse tree produced by SqlBaseParser#applyTransform. - def exitApplyTransform(self, ctx:SqlBaseParser.ApplyTransformContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#transformArgument. - def enterTransformArgument(self, ctx:SqlBaseParser.TransformArgumentContext): - pass - - # Exit a parse tree produced by SqlBaseParser#transformArgument. - def exitTransformArgument(self, ctx:SqlBaseParser.TransformArgumentContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#expression. - def enterExpression(self, ctx:SqlBaseParser.ExpressionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#expression. - def exitExpression(self, ctx:SqlBaseParser.ExpressionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#logicalNot. - def enterLogicalNot(self, ctx:SqlBaseParser.LogicalNotContext): - pass - - # Exit a parse tree produced by SqlBaseParser#logicalNot. - def exitLogicalNot(self, ctx:SqlBaseParser.LogicalNotContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#predicated. - def enterPredicated(self, ctx:SqlBaseParser.PredicatedContext): - pass - - # Exit a parse tree produced by SqlBaseParser#predicated. - def exitPredicated(self, ctx:SqlBaseParser.PredicatedContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#exists. - def enterExists(self, ctx:SqlBaseParser.ExistsContext): - pass - - # Exit a parse tree produced by SqlBaseParser#exists. - def exitExists(self, ctx:SqlBaseParser.ExistsContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#logicalBinary. - def enterLogicalBinary(self, ctx:SqlBaseParser.LogicalBinaryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#logicalBinary. - def exitLogicalBinary(self, ctx:SqlBaseParser.LogicalBinaryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#predicate. - def enterPredicate(self, ctx:SqlBaseParser.PredicateContext): - pass - - # Exit a parse tree produced by SqlBaseParser#predicate. - def exitPredicate(self, ctx:SqlBaseParser.PredicateContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#valueExpressionDefault. - def enterValueExpressionDefault(self, ctx:SqlBaseParser.ValueExpressionDefaultContext): - pass - - # Exit a parse tree produced by SqlBaseParser#valueExpressionDefault. - def exitValueExpressionDefault(self, ctx:SqlBaseParser.ValueExpressionDefaultContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#comparison. - def enterComparison(self, ctx:SqlBaseParser.ComparisonContext): - pass - - # Exit a parse tree produced by SqlBaseParser#comparison. - def exitComparison(self, ctx:SqlBaseParser.ComparisonContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#arithmeticBinary. - def enterArithmeticBinary(self, ctx:SqlBaseParser.ArithmeticBinaryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#arithmeticBinary. - def exitArithmeticBinary(self, ctx:SqlBaseParser.ArithmeticBinaryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#arithmeticUnary. - def enterArithmeticUnary(self, ctx:SqlBaseParser.ArithmeticUnaryContext): - pass - - # Exit a parse tree produced by SqlBaseParser#arithmeticUnary. - def exitArithmeticUnary(self, ctx:SqlBaseParser.ArithmeticUnaryContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#struct. - def enterStruct(self, ctx:SqlBaseParser.StructContext): - pass - - # Exit a parse tree produced by SqlBaseParser#struct. - def exitStruct(self, ctx:SqlBaseParser.StructContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#dereference. - def enterDereference(self, ctx:SqlBaseParser.DereferenceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#dereference. - def exitDereference(self, ctx:SqlBaseParser.DereferenceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#simpleCase. - def enterSimpleCase(self, ctx:SqlBaseParser.SimpleCaseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#simpleCase. - def exitSimpleCase(self, ctx:SqlBaseParser.SimpleCaseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#columnReference. - def enterColumnReference(self, ctx:SqlBaseParser.ColumnReferenceContext): - pass - - # Exit a parse tree produced by SqlBaseParser#columnReference. - def exitColumnReference(self, ctx:SqlBaseParser.ColumnReferenceContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#rowConstructor. - def enterRowConstructor(self, ctx:SqlBaseParser.RowConstructorContext): - pass - - # Exit a parse tree produced by SqlBaseParser#rowConstructor. - def exitRowConstructor(self, ctx:SqlBaseParser.RowConstructorContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#last. - def enterLast(self, ctx:SqlBaseParser.LastContext): - pass - - # Exit a parse tree produced by SqlBaseParser#last. - def exitLast(self, ctx:SqlBaseParser.LastContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#star. - def enterStar(self, ctx:SqlBaseParser.StarContext): - pass - - # Exit a parse tree produced by SqlBaseParser#star. - def exitStar(self, ctx:SqlBaseParser.StarContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#overlay. - def enterOverlay(self, ctx:SqlBaseParser.OverlayContext): - pass - - # Exit a parse tree produced by SqlBaseParser#overlay. - def exitOverlay(self, ctx:SqlBaseParser.OverlayContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#subscript. - def enterSubscript(self, ctx:SqlBaseParser.SubscriptContext): - pass - - # Exit a parse tree produced by SqlBaseParser#subscript. - def exitSubscript(self, ctx:SqlBaseParser.SubscriptContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#subqueryExpression. - def enterSubqueryExpression(self, ctx:SqlBaseParser.SubqueryExpressionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#subqueryExpression. - def exitSubqueryExpression(self, ctx:SqlBaseParser.SubqueryExpressionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#substring. - def enterSubstring(self, ctx:SqlBaseParser.SubstringContext): - pass - - # Exit a parse tree produced by SqlBaseParser#substring. - def exitSubstring(self, ctx:SqlBaseParser.SubstringContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#currentDatetime. - def enterCurrentDatetime(self, ctx:SqlBaseParser.CurrentDatetimeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#currentDatetime. - def exitCurrentDatetime(self, ctx:SqlBaseParser.CurrentDatetimeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#cast. - def enterCast(self, ctx:SqlBaseParser.CastContext): - pass - - # Exit a parse tree produced by SqlBaseParser#cast. - def exitCast(self, ctx:SqlBaseParser.CastContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#constantDefault. - def enterConstantDefault(self, ctx:SqlBaseParser.ConstantDefaultContext): - pass - - # Exit a parse tree produced by SqlBaseParser#constantDefault. - def exitConstantDefault(self, ctx:SqlBaseParser.ConstantDefaultContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#lambda. - def enterLambda(self, ctx:SqlBaseParser.LambdaContext): - pass - - # Exit a parse tree produced by SqlBaseParser#lambda. - def exitLambda(self, ctx:SqlBaseParser.LambdaContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#parenthesizedExpression. - def enterParenthesizedExpression(self, ctx:SqlBaseParser.ParenthesizedExpressionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#parenthesizedExpression. - def exitParenthesizedExpression(self, ctx:SqlBaseParser.ParenthesizedExpressionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#extract. - def enterExtract(self, ctx:SqlBaseParser.ExtractContext): - pass - - # Exit a parse tree produced by SqlBaseParser#extract. - def exitExtract(self, ctx:SqlBaseParser.ExtractContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#trim. - def enterTrim(self, ctx:SqlBaseParser.TrimContext): - pass - - # Exit a parse tree produced by SqlBaseParser#trim. - def exitTrim(self, ctx:SqlBaseParser.TrimContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#functionCall. - def enterFunctionCall(self, ctx:SqlBaseParser.FunctionCallContext): - pass - - # Exit a parse tree produced by SqlBaseParser#functionCall. - def exitFunctionCall(self, ctx:SqlBaseParser.FunctionCallContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#searchedCase. - def enterSearchedCase(self, ctx:SqlBaseParser.SearchedCaseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#searchedCase. - def exitSearchedCase(self, ctx:SqlBaseParser.SearchedCaseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#position. - def enterPosition(self, ctx:SqlBaseParser.PositionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#position. - def exitPosition(self, ctx:SqlBaseParser.PositionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#first. - def enterFirst(self, ctx:SqlBaseParser.FirstContext): - pass - - # Exit a parse tree produced by SqlBaseParser#first. - def exitFirst(self, ctx:SqlBaseParser.FirstContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#nullLiteral. - def enterNullLiteral(self, ctx:SqlBaseParser.NullLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#nullLiteral. - def exitNullLiteral(self, ctx:SqlBaseParser.NullLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#intervalLiteral. - def enterIntervalLiteral(self, ctx:SqlBaseParser.IntervalLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#intervalLiteral. - def exitIntervalLiteral(self, ctx:SqlBaseParser.IntervalLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#typeConstructor. - def enterTypeConstructor(self, ctx:SqlBaseParser.TypeConstructorContext): - pass - - # Exit a parse tree produced by SqlBaseParser#typeConstructor. - def exitTypeConstructor(self, ctx:SqlBaseParser.TypeConstructorContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#numericLiteral. - def enterNumericLiteral(self, ctx:SqlBaseParser.NumericLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#numericLiteral. - def exitNumericLiteral(self, ctx:SqlBaseParser.NumericLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#booleanLiteral. - def enterBooleanLiteral(self, ctx:SqlBaseParser.BooleanLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#booleanLiteral. - def exitBooleanLiteral(self, ctx:SqlBaseParser.BooleanLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#stringLiteral. - def enterStringLiteral(self, ctx:SqlBaseParser.StringLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#stringLiteral. - def exitStringLiteral(self, ctx:SqlBaseParser.StringLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#comparisonOperator. - def enterComparisonOperator(self, ctx:SqlBaseParser.ComparisonOperatorContext): - pass - - # Exit a parse tree produced by SqlBaseParser#comparisonOperator. - def exitComparisonOperator(self, ctx:SqlBaseParser.ComparisonOperatorContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#arithmeticOperator. - def enterArithmeticOperator(self, ctx:SqlBaseParser.ArithmeticOperatorContext): - pass - - # Exit a parse tree produced by SqlBaseParser#arithmeticOperator. - def exitArithmeticOperator(self, ctx:SqlBaseParser.ArithmeticOperatorContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#predicateOperator. - def enterPredicateOperator(self, ctx:SqlBaseParser.PredicateOperatorContext): - pass - - # Exit a parse tree produced by SqlBaseParser#predicateOperator. - def exitPredicateOperator(self, ctx:SqlBaseParser.PredicateOperatorContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#booleanValue. - def enterBooleanValue(self, ctx:SqlBaseParser.BooleanValueContext): - pass - - # Exit a parse tree produced by SqlBaseParser#booleanValue. - def exitBooleanValue(self, ctx:SqlBaseParser.BooleanValueContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#interval. - def enterInterval(self, ctx:SqlBaseParser.IntervalContext): - pass - - # Exit a parse tree produced by SqlBaseParser#interval. - def exitInterval(self, ctx:SqlBaseParser.IntervalContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#errorCapturingMultiUnitsInterval. - def enterErrorCapturingMultiUnitsInterval(self, ctx:SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext): - pass - - # Exit a parse tree produced by SqlBaseParser#errorCapturingMultiUnitsInterval. - def exitErrorCapturingMultiUnitsInterval(self, ctx:SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#multiUnitsInterval. - def enterMultiUnitsInterval(self, ctx:SqlBaseParser.MultiUnitsIntervalContext): - pass - - # Exit a parse tree produced by SqlBaseParser#multiUnitsInterval. - def exitMultiUnitsInterval(self, ctx:SqlBaseParser.MultiUnitsIntervalContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#errorCapturingUnitToUnitInterval. - def enterErrorCapturingUnitToUnitInterval(self, ctx:SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext): - pass - - # Exit a parse tree produced by SqlBaseParser#errorCapturingUnitToUnitInterval. - def exitErrorCapturingUnitToUnitInterval(self, ctx:SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#unitToUnitInterval. - def enterUnitToUnitInterval(self, ctx:SqlBaseParser.UnitToUnitIntervalContext): - pass - - # Exit a parse tree produced by SqlBaseParser#unitToUnitInterval. - def exitUnitToUnitInterval(self, ctx:SqlBaseParser.UnitToUnitIntervalContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#intervalValue. - def enterIntervalValue(self, ctx:SqlBaseParser.IntervalValueContext): - pass - - # Exit a parse tree produced by SqlBaseParser#intervalValue. - def exitIntervalValue(self, ctx:SqlBaseParser.IntervalValueContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#intervalUnit. - def enterIntervalUnit(self, ctx:SqlBaseParser.IntervalUnitContext): - pass - - # Exit a parse tree produced by SqlBaseParser#intervalUnit. - def exitIntervalUnit(self, ctx:SqlBaseParser.IntervalUnitContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#colPosition. - def enterColPosition(self, ctx:SqlBaseParser.ColPositionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#colPosition. - def exitColPosition(self, ctx:SqlBaseParser.ColPositionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#complexDataType. - def enterComplexDataType(self, ctx:SqlBaseParser.ComplexDataTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#complexDataType. - def exitComplexDataType(self, ctx:SqlBaseParser.ComplexDataTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#primitiveDataType. - def enterPrimitiveDataType(self, ctx:SqlBaseParser.PrimitiveDataTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#primitiveDataType. - def exitPrimitiveDataType(self, ctx:SqlBaseParser.PrimitiveDataTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#qualifiedColTypeWithPositionList. - def enterQualifiedColTypeWithPositionList(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#qualifiedColTypeWithPositionList. - def exitQualifiedColTypeWithPositionList(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#qualifiedColTypeWithPosition. - def enterQualifiedColTypeWithPosition(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#qualifiedColTypeWithPosition. - def exitQualifiedColTypeWithPosition(self, ctx:SqlBaseParser.QualifiedColTypeWithPositionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#colTypeList. - def enterColTypeList(self, ctx:SqlBaseParser.ColTypeListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#colTypeList. - def exitColTypeList(self, ctx:SqlBaseParser.ColTypeListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#colType. - def enterColType(self, ctx:SqlBaseParser.ColTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#colType. - def exitColType(self, ctx:SqlBaseParser.ColTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#complexColTypeList. - def enterComplexColTypeList(self, ctx:SqlBaseParser.ComplexColTypeListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#complexColTypeList. - def exitComplexColTypeList(self, ctx:SqlBaseParser.ComplexColTypeListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#complexColType. - def enterComplexColType(self, ctx:SqlBaseParser.ComplexColTypeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#complexColType. - def exitComplexColType(self, ctx:SqlBaseParser.ComplexColTypeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#whenClause. - def enterWhenClause(self, ctx:SqlBaseParser.WhenClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#whenClause. - def exitWhenClause(self, ctx:SqlBaseParser.WhenClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#windowClause. - def enterWindowClause(self, ctx:SqlBaseParser.WindowClauseContext): - pass - - # Exit a parse tree produced by SqlBaseParser#windowClause. - def exitWindowClause(self, ctx:SqlBaseParser.WindowClauseContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#namedWindow. - def enterNamedWindow(self, ctx:SqlBaseParser.NamedWindowContext): - pass - - # Exit a parse tree produced by SqlBaseParser#namedWindow. - def exitNamedWindow(self, ctx:SqlBaseParser.NamedWindowContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#windowRef. - def enterWindowRef(self, ctx:SqlBaseParser.WindowRefContext): - pass - - # Exit a parse tree produced by SqlBaseParser#windowRef. - def exitWindowRef(self, ctx:SqlBaseParser.WindowRefContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#windowDef. - def enterWindowDef(self, ctx:SqlBaseParser.WindowDefContext): - pass - - # Exit a parse tree produced by SqlBaseParser#windowDef. - def exitWindowDef(self, ctx:SqlBaseParser.WindowDefContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#windowFrame. - def enterWindowFrame(self, ctx:SqlBaseParser.WindowFrameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#windowFrame. - def exitWindowFrame(self, ctx:SqlBaseParser.WindowFrameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#frameBound. - def enterFrameBound(self, ctx:SqlBaseParser.FrameBoundContext): - pass - - # Exit a parse tree produced by SqlBaseParser#frameBound. - def exitFrameBound(self, ctx:SqlBaseParser.FrameBoundContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#qualifiedNameList. - def enterQualifiedNameList(self, ctx:SqlBaseParser.QualifiedNameListContext): - pass - - # Exit a parse tree produced by SqlBaseParser#qualifiedNameList. - def exitQualifiedNameList(self, ctx:SqlBaseParser.QualifiedNameListContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#functionName. - def enterFunctionName(self, ctx:SqlBaseParser.FunctionNameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#functionName. - def exitFunctionName(self, ctx:SqlBaseParser.FunctionNameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#qualifiedName. - def enterQualifiedName(self, ctx:SqlBaseParser.QualifiedNameContext): - pass - - # Exit a parse tree produced by SqlBaseParser#qualifiedName. - def exitQualifiedName(self, ctx:SqlBaseParser.QualifiedNameContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#errorCapturingIdentifier. - def enterErrorCapturingIdentifier(self, ctx:SqlBaseParser.ErrorCapturingIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#errorCapturingIdentifier. - def exitErrorCapturingIdentifier(self, ctx:SqlBaseParser.ErrorCapturingIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#errorIdent. - def enterErrorIdent(self, ctx:SqlBaseParser.ErrorIdentContext): - pass - - # Exit a parse tree produced by SqlBaseParser#errorIdent. - def exitErrorIdent(self, ctx:SqlBaseParser.ErrorIdentContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#realIdent. - def enterRealIdent(self, ctx:SqlBaseParser.RealIdentContext): - pass - - # Exit a parse tree produced by SqlBaseParser#realIdent. - def exitRealIdent(self, ctx:SqlBaseParser.RealIdentContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#identifier. - def enterIdentifier(self, ctx:SqlBaseParser.IdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#identifier. - def exitIdentifier(self, ctx:SqlBaseParser.IdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#unquotedIdentifier. - def enterUnquotedIdentifier(self, ctx:SqlBaseParser.UnquotedIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#unquotedIdentifier. - def exitUnquotedIdentifier(self, ctx:SqlBaseParser.UnquotedIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#quotedIdentifierAlternative. - def enterQuotedIdentifierAlternative(self, ctx:SqlBaseParser.QuotedIdentifierAlternativeContext): - pass - - # Exit a parse tree produced by SqlBaseParser#quotedIdentifierAlternative. - def exitQuotedIdentifierAlternative(self, ctx:SqlBaseParser.QuotedIdentifierAlternativeContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#quotedIdentifier. - def enterQuotedIdentifier(self, ctx:SqlBaseParser.QuotedIdentifierContext): - pass - - # Exit a parse tree produced by SqlBaseParser#quotedIdentifier. - def exitQuotedIdentifier(self, ctx:SqlBaseParser.QuotedIdentifierContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#exponentLiteral. - def enterExponentLiteral(self, ctx:SqlBaseParser.ExponentLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#exponentLiteral. - def exitExponentLiteral(self, ctx:SqlBaseParser.ExponentLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#decimalLiteral. - def enterDecimalLiteral(self, ctx:SqlBaseParser.DecimalLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#decimalLiteral. - def exitDecimalLiteral(self, ctx:SqlBaseParser.DecimalLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#legacyDecimalLiteral. - def enterLegacyDecimalLiteral(self, ctx:SqlBaseParser.LegacyDecimalLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#legacyDecimalLiteral. - def exitLegacyDecimalLiteral(self, ctx:SqlBaseParser.LegacyDecimalLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#integerLiteral. - def enterIntegerLiteral(self, ctx:SqlBaseParser.IntegerLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#integerLiteral. - def exitIntegerLiteral(self, ctx:SqlBaseParser.IntegerLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#bigIntLiteral. - def enterBigIntLiteral(self, ctx:SqlBaseParser.BigIntLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#bigIntLiteral. - def exitBigIntLiteral(self, ctx:SqlBaseParser.BigIntLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#smallIntLiteral. - def enterSmallIntLiteral(self, ctx:SqlBaseParser.SmallIntLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#smallIntLiteral. - def exitSmallIntLiteral(self, ctx:SqlBaseParser.SmallIntLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#tinyIntLiteral. - def enterTinyIntLiteral(self, ctx:SqlBaseParser.TinyIntLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#tinyIntLiteral. - def exitTinyIntLiteral(self, ctx:SqlBaseParser.TinyIntLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#doubleLiteral. - def enterDoubleLiteral(self, ctx:SqlBaseParser.DoubleLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#doubleLiteral. - def exitDoubleLiteral(self, ctx:SqlBaseParser.DoubleLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#bigDecimalLiteral. - def enterBigDecimalLiteral(self, ctx:SqlBaseParser.BigDecimalLiteralContext): - pass - - # Exit a parse tree produced by SqlBaseParser#bigDecimalLiteral. - def exitBigDecimalLiteral(self, ctx:SqlBaseParser.BigDecimalLiteralContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#alterColumnAction. - def enterAlterColumnAction(self, ctx:SqlBaseParser.AlterColumnActionContext): - pass - - # Exit a parse tree produced by SqlBaseParser#alterColumnAction. - def exitAlterColumnAction(self, ctx:SqlBaseParser.AlterColumnActionContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#ansiNonReserved. - def enterAnsiNonReserved(self, ctx:SqlBaseParser.AnsiNonReservedContext): - pass - - # Exit a parse tree produced by SqlBaseParser#ansiNonReserved. - def exitAnsiNonReserved(self, ctx:SqlBaseParser.AnsiNonReservedContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#strictNonReserved. - def enterStrictNonReserved(self, ctx:SqlBaseParser.StrictNonReservedContext): - pass - - # Exit a parse tree produced by SqlBaseParser#strictNonReserved. - def exitStrictNonReserved(self, ctx:SqlBaseParser.StrictNonReservedContext): - pass - - - # Enter a parse tree produced by SqlBaseParser#nonReserved. - def enterNonReserved(self, ctx:SqlBaseParser.NonReservedContext): - pass - - # Exit a parse tree produced by SqlBaseParser#nonReserved. - def exitNonReserved(self, ctx:SqlBaseParser.NonReservedContext): - pass - - diff --git a/pysparkling/sql/ast/generated/SqlBaseParser.py b/pysparkling/sql/ast/generated/SqlBaseParser.py deleted file mode 100644 index a653a536f..000000000 --- a/pysparkling/sql/ast/generated/SqlBaseParser.py +++ /dev/null @@ -1,22167 +0,0 @@ -# Generated from ../grammar/SqlBase.g4 by ANTLR 4.7.1 -# encoding: utf-8 -from antlr4 import * -from io import StringIO -from typing.io import TextIO -import sys - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u012b") - buf.write("\u0bcc\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") - buf.write("\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") - buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") - buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") - buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") - buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") - buf.write("&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\4") - buf.write("/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t\64") - buf.write("\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t") - buf.write(";\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\t") - buf.write("D\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\t") - buf.write("M\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\tU\4V\t") - buf.write("V\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4") - buf.write("_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4") - buf.write("h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4") - buf.write("q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4") - buf.write("z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080") - buf.write("\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084") - buf.write("\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087") - buf.write("\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a\3\2\3") - buf.write("\2\7\2\u0117\n\2\f\2\16\2\u011a\13\2\3\2\3\2\3\3\3\3\3") - buf.write("\3\3\4\3\4\3\4\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\b") - buf.write("\3\b\3\b\3\t\3\t\5\t\u0132\n\t\3\t\3\t\3\t\5\t\u0137\n") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u013f\n\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\7\t\u0147\n\t\f\t\16\t\u014a\13\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\5\t\u015d\n\t\3\t\3\t\5\t\u0161\n\t\3\t\3\t\3\t\3") - buf.write("\t\5\t\u0167\n\t\3\t\5\t\u016a\n\t\3\t\5\t\u016d\n\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\5\t\u0175\n\t\3\t\5\t\u0178\n\t") - buf.write("\3\t\3\t\5\t\u017c\n\t\3\t\5\t\u017f\n\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\5\t\u0187\n\t\3\t\3\t\3\t\5\t\u018c\n\t\3\t") - buf.write("\5\t\u018f\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0196\n\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u01a2\n\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\7\t\u01ab\n\t\f\t\16\t\u01ae\13") - buf.write("\t\3\t\5\t\u01b1\n\t\3\t\5\t\u01b4\n\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\5\t\u01bb\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\7\t\u01c6\n\t\f\t\16\t\u01c9\13\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\5\t\u01d0\n\t\3\t\3\t\3\t\5\t\u01d5\n\t\3\t\5\t\u01d8") - buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u01de\n\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\5\t\u01e9\n\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\5\t\u0229\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t") - buf.write("\u0232\n\t\3\t\3\t\5\t\u0236\n\t\3\t\3\t\3\t\3\t\5\t\u023c") - buf.write("\n\t\3\t\3\t\5\t\u0240\n\t\3\t\3\t\3\t\5\t\u0245\n\t\3") - buf.write("\t\3\t\3\t\3\t\5\t\u024b\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\5\t\u0257\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5") - buf.write("\t\u025f\n\t\3\t\3\t\3\t\3\t\5\t\u0265\n\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0272\n\t\3\t\6\t") - buf.write("\u0275\n\t\r\t\16\t\u0276\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0287\n\t\3\t\3\t\3\t") - buf.write("\7\t\u028c\n\t\f\t\16\t\u028f\13\t\3\t\5\t\u0292\n\t\3") - buf.write("\t\3\t\3\t\3\t\5\t\u0298\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u02a7\n\t\3\t\3\t\5\t\u02ab") - buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u02b1\n\t\3\t\3\t\3\t\3\t\5\t") - buf.write("\u02b7\n\t\3\t\5\t\u02ba\n\t\3\t\5\t\u02bd\n\t\3\t\3\t") - buf.write("\3\t\3\t\5\t\u02c3\n\t\3\t\3\t\5\t\u02c7\n\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\7\t\u02cf\n\t\f\t\16\t\u02d2\13\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\5\t\u02da\n\t\3\t\5\t\u02dd\n\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u02e6\n\t\3\t\3\t\3\t\5\t") - buf.write("\u02eb\n\t\3\t\3\t\3\t\3\t\5\t\u02f1\n\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\5\t\u02f8\n\t\3\t\5\t\u02fb\n\t\3\t\3\t\3\t\3\t") - buf.write("\5\t\u0301\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u030a\n") - buf.write("\t\f\t\16\t\u030d\13\t\5\t\u030f\n\t\3\t\3\t\5\t\u0313") - buf.write("\n\t\3\t\3\t\3\t\5\t\u0318\n\t\3\t\3\t\3\t\5\t\u031d\n") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\5\t\u0324\n\t\3\t\5\t\u0327\n\t") - buf.write("\3\t\5\t\u032a\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u0331\n\t\3") - buf.write("\t\3\t\3\t\5\t\u0336\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5") - buf.write("\t\u033f\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u0347\n\t\3\t") - buf.write("\3\t\3\t\3\t\5\t\u034d\n\t\3\t\5\t\u0350\n\t\3\t\5\t\u0353") - buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u0359\n\t\3\t\3\t\5\t\u035d\n") - buf.write("\t\3\t\3\t\5\t\u0361\n\t\3\t\3\t\5\t\u0365\n\t\5\t\u0367") - buf.write("\n\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u036f\n\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\5\t\u0377\n\t\3\t\3\t\3\t\3\t\5\t\u037d\n") - buf.write("\t\3\t\3\t\3\t\3\t\5\t\u0383\n\t\3\t\5\t\u0386\n\t\3\t") - buf.write("\3\t\5\t\u038a\n\t\3\t\5\t\u038d\n\t\3\t\3\t\5\t\u0391") - buf.write("\n\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u03a8\n\t\f\t\16") - buf.write("\t\u03ab\13\t\5\t\u03ad\n\t\3\t\3\t\5\t\u03b1\n\t\3\t") - buf.write("\3\t\3\t\3\t\5\t\u03b7\n\t\3\t\5\t\u03ba\n\t\3\t\5\t\u03bd") - buf.write("\n\t\3\t\3\t\3\t\3\t\5\t\u03c3\n\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\5\t\u03cb\n\t\3\t\3\t\3\t\5\t\u03d0\n\t\3\t\3\t\3") - buf.write("\t\3\t\5\t\u03d6\n\t\3\t\3\t\3\t\3\t\5\t\u03dc\n\t\3\t") - buf.write("\3\t\3\t\3\t\3\t\3\t\3\t\3\t\7\t\u03e6\n\t\f\t\16\t\u03e9") - buf.write("\13\t\5\t\u03eb\n\t\3\t\3\t\3\t\7\t\u03f0\n\t\f\t\16\t") - buf.write("\u03f3\13\t\3\t\3\t\7\t\u03f7\n\t\f\t\16\t\u03fa\13\t") - buf.write("\3\t\3\t\3\t\7\t\u03ff\n\t\f\t\16\t\u0402\13\t\5\t\u0404") - buf.write("\n\t\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u040c\n\n\3\n\3\n\5\n") - buf.write("\u0410\n\n\3\n\3\n\3\n\3\n\3\n\5\n\u0417\n\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\3\n\5\n\u048b\n\n\3\n\3\n\3\n\3\n\3\n\3\n\5") - buf.write("\n\u0493\n\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u049b\n\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u04a4\n\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\n\3\n\5\n\u04ae\n\n\3\13\3\13\5\13\u04b2\n") - buf.write("\13\3\13\5\13\u04b5\n\13\3\13\3\13\3\13\3\13\5\13\u04bb") - buf.write("\n\13\3\13\3\13\3\f\3\f\5\f\u04c1\n\f\3\f\3\f\3\f\3\f") - buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u04cd\n\r\3\r\3\r\3\r\3\r") - buf.write("\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u04d9\n\16\3\16\3") - buf.write("\16\3\16\5\16\u04de\n\16\3\17\3\17\3\17\3\20\3\20\3\20") - buf.write("\3\21\5\21\u04e7\n\21\3\21\3\21\3\21\3\22\3\22\3\22\5") - buf.write("\22\u04ef\n\22\3\22\3\22\3\22\3\22\3\22\5\22\u04f6\n\22") - buf.write("\5\22\u04f8\n\22\3\22\3\22\3\22\5\22\u04fd\n\22\3\22\3") - buf.write("\22\5\22\u0501\n\22\3\22\3\22\3\22\5\22\u0506\n\22\3\22") - buf.write("\3\22\3\22\5\22\u050b\n\22\3\22\3\22\3\22\5\22\u0510\n") - buf.write("\22\3\22\5\22\u0513\n\22\3\22\3\22\3\22\5\22\u0518\n\22") - buf.write("\3\22\3\22\5\22\u051c\n\22\3\22\3\22\3\22\5\22\u0521\n") - buf.write("\22\5\22\u0523\n\22\3\23\3\23\5\23\u0527\n\23\3\24\3\24") - buf.write("\3\24\3\24\3\24\7\24\u052e\n\24\f\24\16\24\u0531\13\24") - buf.write("\3\24\3\24\3\25\3\25\3\25\5\25\u0538\n\25\3\26\3\26\3") - buf.write("\27\3\27\3\27\3\27\3\27\5\27\u0541\n\27\3\30\3\30\3\30") - buf.write("\7\30\u0546\n\30\f\30\16\30\u0549\13\30\3\31\3\31\3\31") - buf.write("\3\31\7\31\u054f\n\31\f\31\16\31\u0552\13\31\3\32\3\32") - buf.write("\5\32\u0556\n\32\3\32\5\32\u0559\n\32\3\32\3\32\3\32\3") - buf.write("\32\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\7\34\u056c\n\34\f\34\16\34\u056f\13\34") - buf.write("\3\35\3\35\3\35\3\35\7\35\u0575\n\35\f\35\16\35\u0578") - buf.write("\13\35\3\35\3\35\3\36\3\36\5\36\u057e\n\36\3\36\5\36\u0581") - buf.write("\n\36\3\37\3\37\3\37\7\37\u0586\n\37\f\37\16\37\u0589") - buf.write("\13\37\3\37\5\37\u058c\n\37\3 \3 \3 \3 \5 \u0592\n \3") - buf.write("!\3!\3!\3!\7!\u0598\n!\f!\16!\u059b\13!\3!\3!\3\"\3\"") - buf.write("\3\"\3\"\7\"\u05a3\n\"\f\"\16\"\u05a6\13\"\3\"\3\"\3#") - buf.write("\3#\3#\3#\3#\3#\5#\u05b0\n#\3$\3$\3$\3$\3$\5$\u05b7\n") - buf.write("$\3%\3%\3%\3%\5%\u05bd\n%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'") - buf.write("\3\'\6\'\u05c8\n\'\r\'\16\'\u05c9\3\'\3\'\3\'\3\'\3\'") - buf.write("\5\'\u05d1\n\'\3\'\3\'\3\'\3\'\3\'\5\'\u05d8\n\'\3\'\3") - buf.write("\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\5\'\u05e4\n\'\3\'\3") - buf.write("\'\3\'\3\'\7\'\u05ea\n\'\f\'\16\'\u05ed\13\'\3\'\7\'\u05f0") - buf.write("\n\'\f\'\16\'\u05f3\13\'\5\'\u05f5\n\'\3(\3(\3(\3(\3(") - buf.write("\7(\u05fc\n(\f(\16(\u05ff\13(\5(\u0601\n(\3(\3(\3(\3(") - buf.write("\3(\7(\u0608\n(\f(\16(\u060b\13(\5(\u060d\n(\3(\3(\3(") - buf.write("\3(\3(\7(\u0614\n(\f(\16(\u0617\13(\5(\u0619\n(\3(\3(") - buf.write("\3(\3(\3(\7(\u0620\n(\f(\16(\u0623\13(\5(\u0625\n(\3(") - buf.write("\5(\u0628\n(\3(\3(\3(\5(\u062d\n(\5(\u062f\n(\3)\3)\3") - buf.write(")\3*\3*\3*\3*\3*\3*\3*\5*\u063b\n*\3*\3*\3*\3*\3*\5*\u0642") - buf.write("\n*\3*\3*\3*\3*\3*\5*\u0649\n*\3*\7*\u064c\n*\f*\16*\u064f") - buf.write("\13*\3+\3+\3+\3+\3+\3+\3+\3+\3+\5+\u065a\n+\3,\3,\5,\u065e") - buf.write("\n,\3,\3,\5,\u0662\n,\3-\3-\6-\u0666\n-\r-\16-\u0667\3") - buf.write(".\3.\5.\u066c\n.\3.\3.\3.\3.\7.\u0672\n.\f.\16.\u0675") - buf.write("\13.\3.\5.\u0678\n.\3.\5.\u067b\n.\3.\5.\u067e\n.\3.\5") - buf.write(".\u0681\n.\3.\3.\5.\u0685\n.\3/\3/\5/\u0689\n/\3/\5/\u068c") - buf.write("\n/\3/\3/\5/\u0690\n/\3/\7/\u0693\n/\f/\16/\u0696\13/") - buf.write("\3/\5/\u0699\n/\3/\5/\u069c\n/\3/\5/\u069f\n/\3/\5/\u06a2") - buf.write("\n/\5/\u06a4\n/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") - buf.write("\3\60\3\60\5\60\u06b0\n\60\3\60\5\60\u06b3\n\60\3\60\3") - buf.write("\60\5\60\u06b7\n\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") - buf.write("\3\60\5\60\u06c1\n\60\3\60\3\60\5\60\u06c5\n\60\5\60\u06c7") - buf.write("\n\60\3\60\5\60\u06ca\n\60\3\60\3\60\5\60\u06ce\n\60\3") - buf.write("\61\3\61\7\61\u06d2\n\61\f\61\16\61\u06d5\13\61\3\61\5") - buf.write("\61\u06d8\n\61\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63") - buf.write("\3\63\5\63\u06e3\n\63\3\63\3\63\3\63\3\64\3\64\3\64\3") - buf.write("\64\3\64\5\64\u06ed\n\64\3\64\3\64\3\64\3\65\3\65\3\65") - buf.write("\3\65\3\65\3\65\3\65\5\65\u06f9\n\65\3\66\3\66\3\66\3") - buf.write("\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\7\66\u0706\n\66") - buf.write("\f\66\16\66\u0709\13\66\3\66\3\66\5\66\u070d\n\66\3\67") - buf.write("\3\67\3\67\7\67\u0712\n\67\f\67\16\67\u0715\13\67\38\3") - buf.write("8\38\38\39\39\39\3:\3:\3:\3;\3;\3;\5;\u0724\n;\3;\7;\u0727") - buf.write("\n;\f;\16;\u072a\13;\3;\3;\3<\3<\3<\3<\3<\3<\7<\u0734") - buf.write("\n<\f<\16<\u0737\13<\3<\3<\5<\u073b\n<\3=\3=\3=\3=\7=") - buf.write("\u0741\n=\f=\16=\u0744\13=\3=\7=\u0747\n=\f=\16=\u074a") - buf.write("\13=\3=\5=\u074d\n=\3>\3>\3>\3>\3>\7>\u0754\n>\f>\16>") - buf.write("\u0757\13>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\7>\u0763\n>\f") - buf.write(">\16>\u0766\13>\3>\3>\5>\u076a\n>\3>\3>\3>\3>\3>\3>\3") - buf.write(">\3>\7>\u0774\n>\f>\16>\u0777\13>\3>\3>\5>\u077b\n>\3") - buf.write("?\3?\3?\3?\7?\u0781\n?\f?\16?\u0784\13?\5?\u0786\n?\3") - buf.write("?\3?\5?\u078a\n?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\7@\u0796") - buf.write("\n@\f@\16@\u0799\13@\3@\3@\3@\3A\3A\3A\3A\3A\7A\u07a3") - buf.write("\nA\fA\16A\u07a6\13A\3A\3A\5A\u07aa\nA\3B\3B\5B\u07ae") - buf.write("\nB\3B\5B\u07b1\nB\3C\3C\3C\5C\u07b6\nC\3C\3C\3C\3C\3") - buf.write("C\7C\u07bd\nC\fC\16C\u07c0\13C\5C\u07c2\nC\3C\3C\3C\5") - buf.write("C\u07c7\nC\3C\3C\3C\7C\u07cc\nC\fC\16C\u07cf\13C\5C\u07d1") - buf.write("\nC\3D\3D\3E\3E\7E\u07d7\nE\fE\16E\u07da\13E\3F\3F\3F") - buf.write("\3F\5F\u07e0\nF\3F\3F\3F\3F\3F\5F\u07e7\nF\3G\5G\u07ea") - buf.write("\nG\3G\3G\3G\5G\u07ef\nG\3G\5G\u07f2\nG\3G\3G\3G\5G\u07f7") - buf.write("\nG\3G\3G\5G\u07fb\nG\3G\5G\u07fe\nG\3G\5G\u0801\nG\3") - buf.write("H\3H\3H\3H\5H\u0807\nH\3I\3I\3I\5I\u080c\nI\3I\3I\3J\5") - buf.write("J\u0811\nJ\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") - buf.write("J\3J\5J\u0823\nJ\5J\u0825\nJ\3J\5J\u0828\nJ\3K\3K\3K\3") - buf.write("K\3L\3L\3L\7L\u0831\nL\fL\16L\u0834\13L\3M\3M\3M\3M\7") - buf.write("M\u083a\nM\fM\16M\u083d\13M\3M\3M\3N\3N\5N\u0843\nN\3") - buf.write("O\3O\3O\3O\7O\u0849\nO\fO\16O\u084c\13O\3O\3O\3P\3P\5") - buf.write("P\u0852\nP\3Q\3Q\5Q\u0856\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u085e") - buf.write("\nQ\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u0866\nQ\3Q\3Q\3Q\3Q\5Q\u086c") - buf.write("\nQ\3R\3R\3R\3R\7R\u0872\nR\fR\16R\u0875\13R\3R\3R\3S") - buf.write("\3S\3S\3S\3S\7S\u087e\nS\fS\16S\u0881\13S\5S\u0883\nS") - buf.write("\3S\3S\3S\3T\5T\u0889\nT\3T\3T\5T\u088d\nT\5T\u088f\n") - buf.write("T\3U\3U\3U\3U\3U\3U\3U\5U\u0898\nU\3U\3U\3U\3U\3U\3U\3") - buf.write("U\3U\3U\3U\5U\u08a4\nU\5U\u08a6\nU\3U\3U\3U\3U\3U\5U\u08ad") - buf.write("\nU\3U\3U\3U\3U\3U\5U\u08b4\nU\3U\3U\3U\3U\5U\u08ba\n") - buf.write("U\3U\3U\3U\3U\5U\u08c0\nU\5U\u08c2\nU\3V\3V\3V\7V\u08c7") - buf.write("\nV\fV\16V\u08ca\13V\3W\3W\3W\7W\u08cf\nW\fW\16W\u08d2") - buf.write("\13W\3X\3X\3X\5X\u08d7\nX\3X\3X\3Y\3Y\3Y\5Y\u08de\nY\3") - buf.write("Y\3Y\3Z\3Z\5Z\u08e4\nZ\3Z\3Z\5Z\u08e8\nZ\5Z\u08ea\nZ\3") - buf.write("[\3[\3[\7[\u08ef\n[\f[\16[\u08f2\13[\3\\\3\\\3\\\3\\\7") - buf.write("\\\u08f8\n\\\f\\\16\\\u08fb\13\\\3\\\3\\\3]\3]\3]\3]\3") - buf.write("]\3]\7]\u0905\n]\f]\16]\u0908\13]\3]\3]\5]\u090c\n]\3") - buf.write("^\3^\5^\u0910\n^\3_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5") - buf.write("`\u091e\n`\5`\u0920\n`\3`\3`\3`\3`\3`\3`\7`\u0928\n`\f") - buf.write("`\16`\u092b\13`\3a\5a\u092e\na\3a\3a\3a\3a\3a\3a\5a\u0936") - buf.write("\na\3a\3a\3a\3a\3a\7a\u093d\na\fa\16a\u0940\13a\3a\3a") - buf.write("\3a\5a\u0945\na\3a\3a\3a\3a\3a\3a\5a\u094d\na\3a\3a\3") - buf.write("a\5a\u0952\na\3a\3a\3a\3a\3a\3a\3a\3a\7a\u095c\na\fa\16") - buf.write("a\u095f\13a\3a\3a\5a\u0963\na\3a\5a\u0966\na\3a\3a\3a") - buf.write("\3a\5a\u096c\na\3a\3a\5a\u0970\na\3a\3a\3a\5a\u0975\n") - buf.write("a\3a\3a\3a\5a\u097a\na\3a\3a\3a\5a\u097f\na\3b\3b\3b\3") - buf.write("b\5b\u0985\nb\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3") - buf.write("b\3b\3b\3b\3b\3b\7b\u099a\nb\fb\16b\u099d\13b\3c\3c\3") - buf.write("c\3c\6c\u09a3\nc\rc\16c\u09a4\3c\3c\5c\u09a9\nc\3c\3c") - buf.write("\3c\3c\3c\6c\u09b0\nc\rc\16c\u09b1\3c\3c\5c\u09b6\nc\3") - buf.write("c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\7c\u09c6\nc\f") - buf.write("c\16c\u09c9\13c\5c\u09cb\nc\3c\3c\3c\3c\3c\3c\5c\u09d3") - buf.write("\nc\3c\3c\3c\3c\3c\3c\3c\5c\u09dc\nc\3c\3c\3c\3c\3c\3") - buf.write("c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\6c\u09f1\nc\r") - buf.write("c\16c\u09f2\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u09fe\nc\3c") - buf.write("\3c\3c\7c\u0a03\nc\fc\16c\u0a06\13c\5c\u0a08\nc\3c\3c") - buf.write("\3c\3c\3c\3c\3c\5c\u0a11\nc\3c\3c\5c\u0a15\nc\3c\3c\3") - buf.write("c\3c\3c\3c\3c\3c\6c\u0a1f\nc\rc\16c\u0a20\3c\3c\3c\3c") - buf.write("\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3") - buf.write("c\3c\5c\u0a3a\nc\3c\3c\3c\3c\3c\5c\u0a41\nc\3c\5c\u0a44") - buf.write("\nc\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u0a53\n") - buf.write("c\3c\3c\5c\u0a57\nc\3c\3c\3c\3c\3c\3c\3c\3c\7c\u0a61\n") - buf.write("c\fc\16c\u0a64\13c\3d\3d\3d\3d\3d\3d\3d\3d\6d\u0a6e\n") - buf.write("d\rd\16d\u0a6f\5d\u0a72\nd\3e\3e\3f\3f\3g\3g\3h\3h\3i") - buf.write("\3i\3i\5i\u0a7f\ni\3j\3j\5j\u0a83\nj\3k\3k\3k\6k\u0a88") - buf.write("\nk\rk\16k\u0a89\3l\3l\3l\5l\u0a8f\nl\3m\3m\3m\3m\3m\3") - buf.write("n\5n\u0a97\nn\3n\3n\5n\u0a9b\nn\3o\3o\3o\3o\3o\3o\3o\5") - buf.write("o\u0aa4\no\3p\3p\3p\5p\u0aa9\np\3q\3q\3q\3q\3q\3q\3q\3") - buf.write("q\3q\3q\3q\3q\3q\3q\3q\5q\u0aba\nq\3q\3q\5q\u0abe\nq\3") - buf.write("q\3q\3q\3q\3q\7q\u0ac5\nq\fq\16q\u0ac8\13q\3q\5q\u0acb") - buf.write("\nq\5q\u0acd\nq\3r\3r\3r\7r\u0ad2\nr\fr\16r\u0ad5\13r") - buf.write("\3s\3s\3s\3s\5s\u0adb\ns\3s\5s\u0ade\ns\3s\5s\u0ae1\n") - buf.write("s\3t\3t\3t\7t\u0ae6\nt\ft\16t\u0ae9\13t\3u\3u\3u\3u\5") - buf.write("u\u0aef\nu\3u\5u\u0af2\nu\3v\3v\3v\7v\u0af7\nv\fv\16v") - buf.write("\u0afa\13v\3w\3w\3w\3w\3w\5w\u0b01\nw\3w\5w\u0b04\nw\3") - buf.write("x\3x\3x\3x\3x\3y\3y\3y\3y\7y\u0b0f\ny\fy\16y\u0b12\13") - buf.write("y\3z\3z\3z\3z\3{\3{\3{\3{\3{\3{\3{\3{\3{\3{\3{\7{\u0b23") - buf.write("\n{\f{\16{\u0b26\13{\3{\3{\3{\3{\3{\7{\u0b2d\n{\f{\16") - buf.write("{\u0b30\13{\5{\u0b32\n{\3{\3{\3{\3{\3{\7{\u0b39\n{\f{") - buf.write("\16{\u0b3c\13{\5{\u0b3e\n{\5{\u0b40\n{\3{\5{\u0b43\n{") - buf.write("\3{\5{\u0b46\n{\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3|\3") - buf.write("|\3|\3|\3|\5|\u0b58\n|\3}\3}\3}\3}\3}\3}\3}\5}\u0b61\n") - buf.write("}\3~\3~\3~\7~\u0b66\n~\f~\16~\u0b69\13~\3\177\3\177\3") - buf.write("\177\3\177\5\177\u0b6f\n\177\3\u0080\3\u0080\3\u0080\7") - buf.write("\u0080\u0b74\n\u0080\f\u0080\16\u0080\u0b77\13\u0080\3") - buf.write("\u0081\3\u0081\3\u0081\3\u0082\3\u0082\6\u0082\u0b7e\n") - buf.write("\u0082\r\u0082\16\u0082\u0b7f\3\u0082\5\u0082\u0b83\n") - buf.write("\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u0b88\n\u0083\3") - buf.write("\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\5\u0084") - buf.write("\u0b90\n\u0084\3\u0085\3\u0085\3\u0086\3\u0086\5\u0086") - buf.write("\u0b96\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u0b9b\n") - buf.write("\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u0ba0\n\u0086\3") - buf.write("\u0086\3\u0086\5\u0086\u0ba4\n\u0086\3\u0086\3\u0086\5") - buf.write("\u0086\u0ba8\n\u0086\3\u0086\3\u0086\5\u0086\u0bac\n\u0086") - buf.write("\3\u0086\3\u0086\5\u0086\u0bb0\n\u0086\3\u0086\3\u0086") - buf.write("\5\u0086\u0bb4\n\u0086\3\u0086\3\u0086\5\u0086\u0bb8\n") - buf.write("\u0086\3\u0086\5\u0086\u0bbb\n\u0086\3\u0087\3\u0087\3") - buf.write("\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087\u0bc4\n") - buf.write("\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a\3\u008a") - buf.write("\3\u008a\7\u03a9\u03e7\u03f1\u03f8\u0400\6R\u00be\u00c2") - buf.write("\u00c4\u008b\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") - buf.write("$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz") - buf.write("|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090") - buf.write("\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2") - buf.write("\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4") - buf.write("\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6") - buf.write("\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8") - buf.write("\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea") - buf.write("\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc") - buf.write("\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e") - buf.write("\u0110\u0112\2,\4\2CC\u00b6\u00b6\4\2\"\"\u00c4\u00c4") - buf.write("\4\2AA\u0098\u0098\4\2ffss\3\2-.\4\2\u00e5\u00e5\u0103") - buf.write("\u0103\4\2\21\21%%\7\2**\66\66XXee\u008f\u008f\3\2GH\4") - buf.write("\2XXee\4\2\u009c\u009c\u011d\u011d\4\2\16\16\u0089\u0089") - buf.write("\5\2@@\u0097\u0097\u00ce\u00ce\6\2SSzz\u00d7\u00d7\u00f9") - buf.write("\u00f9\5\2SS\u00d7\u00d7\u00f9\u00f9\4\2\31\31GG\4\2`") - buf.write("`\u0081\u0081\4\2\20\20LL\4\2\u0121\u0121\u0123\u0123") - buf.write("\5\2\20\20\25\25\u00db\u00db\5\2[[\u00f3\u00f3\u00fb\u00fb") - buf.write("\4\2\u0112\u0113\u0118\u0118\3\2\u0114\u0117\4\2\u0112") - buf.write("\u0113\u011b\u011b\4\2;;==\3\2\u00e3\u00e4\4\2\6\6ff\4") - buf.write("\2\6\6bb\5\2\35\35\u0084\u0084\u00ee\u00ee\3\2\u010a\u0111") - buf.write("\3\2\u0112\u011c\6\2\23\23ss\u009b\u009b\u00a3\u00a3\4") - buf.write("\2[[\u00f3\u00f3\3\2\u0112\u0113\4\2MM\u00ac\u00ac\4\2") - buf.write("\u00a4\u00a4\u00dc\u00dc\4\2aa\u00b3\u00b3\3\2\u0122\u0123") - buf.write("\4\2NN\u00d6\u00d6\65\2\16\17\21\22\26\27\31\32\34\34") - buf.write("\36\"%%\'*,,.\64\66\669:?ACKMNRRTZ]]_adehjmmprtuwy{{~") - buf.write("~\u0080\u0083\u0086\u0093\u0096\u0098\u009a\u009a\u009d") - buf.write("\u009e\u00a1\u00a2\u00a5\u00a5\u00a7\u00a8\u00aa\u00b3") - buf.write("\u00b5\u00bd\u00bf\u00c5\u00c7\u00ce\u00d2\u00d4\u00d6") - buf.write("\u00d6\u00d8\u00da\u00dc\u00e4\u00e6\u00ea\u00ed\u00ed") - buf.write("\u00ef\u00f4\u00f6\u00f8\u00fc\u00ff\u0102\u0104\u0107") - buf.write("\u0107\u0117\u0117\21\2\24\2488SSggvvzz\177\177\u0085") - buf.write("\u0085\u0099\u0099\u009f\u009f\u00c6\u00c6\u00d1\u00d1") - buf.write("\u00d7\u00d7\u00f9\u00f9\u0101\u0101\23\2\16\23\25\67") - buf.write("9RTfhuwy{~\u0080\u0084\u0086\u0098\u009a\u009e\u00a0\u00c5") - buf.write("\u00c7\u00d0\u00d2\u00d6\u00d8\u00f8\u00fa\u0100\u0102") - buf.write("\u0109\u0117\u0117\2\u0da4\2\u0114\3\2\2\2\4\u011d\3\2") - buf.write("\2\2\6\u0120\3\2\2\2\b\u0123\3\2\2\2\n\u0126\3\2\2\2\f") - buf.write("\u0129\3\2\2\2\16\u012c\3\2\2\2\20\u0403\3\2\2\2\22\u04ad") - buf.write("\3\2\2\2\24\u04af\3\2\2\2\26\u04c0\3\2\2\2\30\u04c6\3") - buf.write("\2\2\2\32\u04d2\3\2\2\2\34\u04df\3\2\2\2\36\u04e2\3\2") - buf.write("\2\2 \u04e6\3\2\2\2\"\u0522\3\2\2\2$\u0524\3\2\2\2&\u0528") - buf.write("\3\2\2\2(\u0534\3\2\2\2*\u0539\3\2\2\2,\u0540\3\2\2\2") - buf.write(".\u0542\3\2\2\2\60\u054a\3\2\2\2\62\u0553\3\2\2\2\64\u055e") - buf.write("\3\2\2\2\66\u056d\3\2\2\28\u0570\3\2\2\2:\u057b\3\2\2") - buf.write("\2<\u058b\3\2\2\2>\u0591\3\2\2\2@\u0593\3\2\2\2B\u059e") - buf.write("\3\2\2\2D\u05af\3\2\2\2F\u05b6\3\2\2\2H\u05b8\3\2\2\2") - buf.write("J\u05be\3\2\2\2L\u05f4\3\2\2\2N\u0600\3\2\2\2P\u0630\3") - buf.write("\2\2\2R\u0633\3\2\2\2T\u0659\3\2\2\2V\u065b\3\2\2\2X\u0663") - buf.write("\3\2\2\2Z\u0684\3\2\2\2\\\u06a3\3\2\2\2^\u06af\3\2\2\2") - buf.write("`\u06cf\3\2\2\2b\u06db\3\2\2\2d\u06de\3\2\2\2f\u06e7\3") - buf.write("\2\2\2h\u06f8\3\2\2\2j\u070c\3\2\2\2l\u070e\3\2\2\2n\u0716") - buf.write("\3\2\2\2p\u071a\3\2\2\2r\u071d\3\2\2\2t\u0720\3\2\2\2") - buf.write("v\u073a\3\2\2\2x\u073c\3\2\2\2z\u077a\3\2\2\2|\u0789\3") - buf.write("\2\2\2~\u078b\3\2\2\2\u0080\u07a9\3\2\2\2\u0082\u07ab") - buf.write("\3\2\2\2\u0084\u07b2\3\2\2\2\u0086\u07d2\3\2\2\2\u0088") - buf.write("\u07d4\3\2\2\2\u008a\u07e6\3\2\2\2\u008c\u0800\3\2\2\2") - buf.write("\u008e\u0806\3\2\2\2\u0090\u0808\3\2\2\2\u0092\u0827\3") - buf.write("\2\2\2\u0094\u0829\3\2\2\2\u0096\u082d\3\2\2\2\u0098\u0835") - buf.write("\3\2\2\2\u009a\u0840\3\2\2\2\u009c\u0844\3\2\2\2\u009e") - buf.write("\u084f\3\2\2\2\u00a0\u086b\3\2\2\2\u00a2\u086d\3\2\2\2") - buf.write("\u00a4\u0878\3\2\2\2\u00a6\u088e\3\2\2\2\u00a8\u08c1\3") - buf.write("\2\2\2\u00aa\u08c3\3\2\2\2\u00ac\u08cb\3\2\2\2\u00ae\u08d6") - buf.write("\3\2\2\2\u00b0\u08dd\3\2\2\2\u00b2\u08e1\3\2\2\2\u00b4") - buf.write("\u08eb\3\2\2\2\u00b6\u08f3\3\2\2\2\u00b8\u090b\3\2\2\2") - buf.write("\u00ba\u090f\3\2\2\2\u00bc\u0911\3\2\2\2\u00be\u091f\3") - buf.write("\2\2\2\u00c0\u097e\3\2\2\2\u00c2\u0984\3\2\2\2\u00c4\u0a56") - buf.write("\3\2\2\2\u00c6\u0a71\3\2\2\2\u00c8\u0a73\3\2\2\2\u00ca") - buf.write("\u0a75\3\2\2\2\u00cc\u0a77\3\2\2\2\u00ce\u0a79\3\2\2\2") - buf.write("\u00d0\u0a7b\3\2\2\2\u00d2\u0a80\3\2\2\2\u00d4\u0a87\3") - buf.write("\2\2\2\u00d6\u0a8b\3\2\2\2\u00d8\u0a90\3\2\2\2\u00da\u0a9a") - buf.write("\3\2\2\2\u00dc\u0aa3\3\2\2\2\u00de\u0aa8\3\2\2\2\u00e0") - buf.write("\u0acc\3\2\2\2\u00e2\u0ace\3\2\2\2\u00e4\u0ad6\3\2\2\2") - buf.write("\u00e6\u0ae2\3\2\2\2\u00e8\u0aea\3\2\2\2\u00ea\u0af3\3") - buf.write("\2\2\2\u00ec\u0afb\3\2\2\2\u00ee\u0b05\3\2\2\2\u00f0\u0b0a") - buf.write("\3\2\2\2\u00f2\u0b13\3\2\2\2\u00f4\u0b45\3\2\2\2\u00f6") - buf.write("\u0b57\3\2\2\2\u00f8\u0b60\3\2\2\2\u00fa\u0b62\3\2\2\2") - buf.write("\u00fc\u0b6e\3\2\2\2\u00fe\u0b70\3\2\2\2\u0100\u0b78\3") - buf.write("\2\2\2\u0102\u0b82\3\2\2\2\u0104\u0b87\3\2\2\2\u0106\u0b8f") - buf.write("\3\2\2\2\u0108\u0b91\3\2\2\2\u010a\u0bba\3\2\2\2\u010c") - buf.write("\u0bc3\3\2\2\2\u010e\u0bc5\3\2\2\2\u0110\u0bc7\3\2\2\2") - buf.write("\u0112\u0bc9\3\2\2\2\u0114\u0118\5\20\t\2\u0115\u0117") - buf.write("\7\3\2\2\u0116\u0115\3\2\2\2\u0117\u011a\3\2\2\2\u0118") - buf.write("\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b\3\2\2\2") - buf.write("\u011a\u0118\3\2\2\2\u011b\u011c\7\2\2\3\u011c\3\3\2\2") - buf.write("\2\u011d\u011e\5\u00b2Z\2\u011e\u011f\7\2\2\3\u011f\5") - buf.write("\3\2\2\2\u0120\u0121\5\u00aeX\2\u0121\u0122\7\2\2\3\u0122") - buf.write("\7\3\2\2\2\u0123\u0124\5\u00acW\2\u0124\u0125\7\2\2\3") - buf.write("\u0125\t\3\2\2\2\u0126\u0127\5\u00b0Y\2\u0127\u0128\7") - buf.write("\2\2\3\u0128\13\3\2\2\2\u0129\u012a\5\u00e0q\2\u012a\u012b") - buf.write("\7\2\2\3\u012b\r\3\2\2\2\u012c\u012d\5\u00e6t\2\u012d") - buf.write("\u012e\7\2\2\3\u012e\17\3\2\2\2\u012f\u0404\5 \21\2\u0130") - buf.write("\u0132\5\60\31\2\u0131\u0130\3\2\2\2\u0131\u0132\3\2\2") - buf.write("\2\u0132\u0133\3\2\2\2\u0133\u0404\5L\'\2\u0134\u0136") - buf.write("\7\u00ff\2\2\u0135\u0137\7\u0097\2\2\u0136\u0135\3\2\2") - buf.write("\2\u0136\u0137\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u0404") - buf.write("\5\u00acW\2\u0139\u013a\7\67\2\2\u013a\u013e\5*\26\2\u013b") - buf.write("\u013c\7p\2\2\u013c\u013d\7\u009b\2\2\u013d\u013f\7U\2") - buf.write("\2\u013e\u013b\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140") - buf.write("\3\2\2\2\u0140\u0148\5\u00acW\2\u0141\u0147\5\36\20\2") - buf.write("\u0142\u0147\5\34\17\2\u0143\u0144\7\u0108\2\2\u0144\u0145") - buf.write("\t\2\2\2\u0145\u0147\58\35\2\u0146\u0141\3\2\2\2\u0146") - buf.write("\u0142\3\2\2\2\u0146\u0143\3\2\2\2\u0147\u014a\3\2\2\2") - buf.write("\u0148\u0146\3\2\2\2\u0148\u0149\3\2\2\2\u0149\u0404\3") - buf.write("\2\2\2\u014a\u0148\3\2\2\2\u014b\u014c\7\21\2\2\u014c") - buf.write("\u014d\5*\26\2\u014d\u014e\5\u00acW\2\u014e\u014f\7\u00d6") - buf.write("\2\2\u014f\u0150\t\2\2\2\u0150\u0151\58\35\2\u0151\u0404") - buf.write("\3\2\2\2\u0152\u0153\7\21\2\2\u0153\u0154\5*\26\2\u0154") - buf.write("\u0155\5\u00acW\2\u0155\u0156\7\u00d6\2\2\u0156\u0157") - buf.write("\5\34\17\2\u0157\u0404\3\2\2\2\u0158\u0159\7N\2\2\u0159") - buf.write("\u015c\5*\26\2\u015a\u015b\7p\2\2\u015b\u015d\7U\2\2\u015c") - buf.write("\u015a\3\2\2\2\u015c\u015d\3\2\2\2\u015d\u015e\3\2\2\2") - buf.write("\u015e\u0160\5\u00acW\2\u015f\u0161\t\3\2\2\u0160\u015f") - buf.write("\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0404\3\2\2\2\u0162") - buf.write("\u0163\7\u00d9\2\2\u0163\u0166\t\4\2\2\u0164\u0165\t\5") - buf.write("\2\2\u0165\u0167\5\u00acW\2\u0166\u0164\3\2\2\2\u0166") - buf.write("\u0167\3\2\2\2\u0167\u016c\3\2\2\2\u0168\u016a\7\u0086") - buf.write("\2\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016b") - buf.write("\3\2\2\2\u016b\u016d\7\u011d\2\2\u016c\u0169\3\2\2\2\u016c") - buf.write("\u016d\3\2\2\2\u016d\u0404\3\2\2\2\u016e\u016f\6\t\2\2") - buf.write("\u016f\u0174\5\24\13\2\u0170\u0171\7\4\2\2\u0171\u0172") - buf.write("\5\u00e6t\2\u0172\u0173\7\5\2\2\u0173\u0175\3\2\2\2\u0174") - buf.write("\u0170\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0177\3\2\2\2") - buf.write("\u0176\u0178\5\64\33\2\u0177\u0176\3\2\2\2\u0177\u0178") - buf.write("\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017e\5\66\34\2\u017a") - buf.write("\u017c\7\30\2\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2") - buf.write("\2\u017c\u017d\3\2\2\2\u017d\u017f\5 \21\2\u017e\u017b") - buf.write("\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0404\3\2\2\2\u0180") - buf.write("\u0181\6\t\3\2\u0181\u0186\5\24\13\2\u0182\u0183\7\4\2") - buf.write("\2\u0183\u0184\5\u00e6t\2\u0184\u0185\7\5\2\2\u0185\u0187") - buf.write("\3\2\2\2\u0186\u0182\3\2\2\2\u0186\u0187\3\2\2\2\u0187") - buf.write("\u0188\3\2\2\2\u0188\u0189\5\64\33\2\u0189\u018e\5\66") - buf.write("\34\2\u018a\u018c\7\30\2\2\u018b\u018a\3\2\2\2\u018b\u018c") - buf.write("\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f\5 \21\2\u018e") - buf.write("\u018b\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0404\3\2\2\2") - buf.write("\u0190\u0195\5\24\13\2\u0191\u0192\7\4\2\2\u0192\u0193") - buf.write("\5\u00e6t\2\u0193\u0194\7\5\2\2\u0194\u0196\3\2\2\2\u0195") - buf.write("\u0191\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u01ac\3\2\2\2") - buf.write("\u0197\u01ab\5\36\20\2\u0198\u0199\7\u00ad\2\2\u0199\u019a") - buf.write("\7 \2\2\u019a\u019b\7\4\2\2\u019b\u019c\5\u00e6t\2\u019c") - buf.write("\u019d\7\5\2\2\u019d\u01a2\3\2\2\2\u019e\u019f\7\u00ad") - buf.write("\2\2\u019f\u01a0\7 \2\2\u01a0\u01a2\5\u0094K\2\u01a1\u0198") - buf.write("\3\2\2\2\u01a1\u019e\3\2\2\2\u01a2\u01ab\3\2\2\2\u01a3") - buf.write("\u01ab\5\30\r\2\u01a4\u01ab\5\32\16\2\u01a5\u01ab\5\u00a8") - buf.write("U\2\u01a6\u01ab\5D#\2\u01a7\u01ab\5\34\17\2\u01a8\u01a9") - buf.write("\7\u00e8\2\2\u01a9\u01ab\58\35\2\u01aa\u0197\3\2\2\2\u01aa") - buf.write("\u01a1\3\2\2\2\u01aa\u01a3\3\2\2\2\u01aa\u01a4\3\2\2\2") - buf.write("\u01aa\u01a5\3\2\2\2\u01aa\u01a6\3\2\2\2\u01aa\u01a7\3") - buf.write("\2\2\2\u01aa\u01a8\3\2\2\2\u01ab\u01ae\3\2\2\2\u01ac\u01aa") - buf.write("\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01b3\3\2\2\2\u01ae") - buf.write("\u01ac\3\2\2\2\u01af\u01b1\7\30\2\2\u01b0\u01af\3\2\2") - buf.write("\2\u01b0\u01b1\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01b4") - buf.write("\5 \21\2\u01b3\u01b0\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4") - buf.write("\u0404\3\2\2\2\u01b5\u01b6\7\67\2\2\u01b6\u01ba\7\u00e5") - buf.write("\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7\u009b\2\2\u01b9") - buf.write("\u01bb\7U\2\2\u01ba\u01b7\3\2\2\2\u01ba\u01bb\3\2\2\2") - buf.write("\u01bb\u01bc\3\2\2\2\u01bc\u01bd\5\u00aeX\2\u01bd\u01be") - buf.write("\7\u0086\2\2\u01be\u01c7\5\u00aeX\2\u01bf\u01c6\5\64\33") - buf.write("\2\u01c0\u01c6\5\u00a8U\2\u01c1\u01c6\5D#\2\u01c2\u01c6") - buf.write("\5\34\17\2\u01c3\u01c4\7\u00e8\2\2\u01c4\u01c6\58\35\2") - buf.write("\u01c5\u01bf\3\2\2\2\u01c5\u01c0\3\2\2\2\u01c5\u01c1\3") - buf.write("\2\2\2\u01c5\u01c2\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c6\u01c9") - buf.write("\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8") - buf.write("\u0404\3\2\2\2\u01c9\u01c7\3\2\2\2\u01ca\u01cf\5\26\f") - buf.write("\2\u01cb\u01cc\7\4\2\2\u01cc\u01cd\5\u00e6t\2\u01cd\u01ce") - buf.write("\7\5\2\2\u01ce\u01d0\3\2\2\2\u01cf\u01cb\3\2\2\2\u01cf") - buf.write("\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\5\64\33") - buf.write("\2\u01d2\u01d7\5\66\34\2\u01d3\u01d5\7\30\2\2\u01d4\u01d3") - buf.write("\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6") - buf.write("\u01d8\5 \21\2\u01d7\u01d4\3\2\2\2\u01d7\u01d8\3\2\2\2") - buf.write("\u01d8\u0404\3\2\2\2\u01d9\u01da\7\22\2\2\u01da\u01db") - buf.write("\7\u00e5\2\2\u01db\u01dd\5\u00acW\2\u01dc\u01de\5&\24") - buf.write("\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df") - buf.write("\3\2\2\2\u01df\u01e0\7\63\2\2\u01e0\u01e8\7\u00df\2\2") - buf.write("\u01e1\u01e9\5\u0104\u0083\2\u01e2\u01e3\7b\2\2\u01e3") - buf.write("\u01e4\7.\2\2\u01e4\u01e9\5\u0096L\2\u01e5\u01e6\7b\2") - buf.write("\2\u01e6\u01e7\7\20\2\2\u01e7\u01e9\7.\2\2\u01e8\u01e1") - buf.write("\3\2\2\2\u01e8\u01e2\3\2\2\2\u01e8\u01e5\3\2\2\2\u01e8") - buf.write("\u01e9\3\2\2\2\u01e9\u0404\3\2\2\2\u01ea\u01eb\7\21\2") - buf.write("\2\u01eb\u01ec\7\u00e5\2\2\u01ec\u01ed\5\u00acW\2\u01ed") - buf.write("\u01ee\7\16\2\2\u01ee\u01ef\t\6\2\2\u01ef\u01f0\5\u00e2") - buf.write("r\2\u01f0\u0404\3\2\2\2\u01f1\u01f2\7\21\2\2\u01f2\u01f3") - buf.write("\7\u00e5\2\2\u01f3\u01f4\5\u00acW\2\u01f4\u01f5\7\16\2") - buf.write("\2\u01f5\u01f6\t\6\2\2\u01f6\u01f7\7\4\2\2\u01f7\u01f8") - buf.write("\5\u00e2r\2\u01f8\u01f9\7\5\2\2\u01f9\u0404\3\2\2\2\u01fa") - buf.write("\u01fb\7\21\2\2\u01fb\u01fc\7\u00e5\2\2\u01fc\u01fd\5") - buf.write("\u00acW\2\u01fd\u01fe\7\u00c0\2\2\u01fe\u01ff\7-\2\2\u01ff") - buf.write("\u0200\5\u00acW\2\u0200\u0201\7\u00ec\2\2\u0201\u0202") - buf.write("\5\u0100\u0081\2\u0202\u0404\3\2\2\2\u0203\u0204\7\21") - buf.write("\2\2\u0204\u0205\7\u00e5\2\2\u0205\u0206\5\u00acW\2\u0206") - buf.write("\u0207\7N\2\2\u0207\u0208\t\6\2\2\u0208\u0209\7\4\2\2") - buf.write("\u0209\u020a\5\u00aaV\2\u020a\u020b\7\5\2\2\u020b\u0404") - buf.write("\3\2\2\2\u020c\u020d\7\21\2\2\u020d\u020e\7\u00e5\2\2") - buf.write("\u020e\u020f\5\u00acW\2\u020f\u0210\7N\2\2\u0210\u0211") - buf.write("\t\6\2\2\u0211\u0212\5\u00aaV\2\u0212\u0404\3\2\2\2\u0213") - buf.write("\u0214\7\21\2\2\u0214\u0215\t\7\2\2\u0215\u0216\5\u00ac") - buf.write("W\2\u0216\u0217\7\u00c0\2\2\u0217\u0218\7\u00ec\2\2\u0218") - buf.write("\u0219\5\u00acW\2\u0219\u0404\3\2\2\2\u021a\u021b\7\21") - buf.write("\2\2\u021b\u021c\t\7\2\2\u021c\u021d\5\u00acW\2\u021d") - buf.write("\u021e\7\u00d6\2\2\u021e\u021f\7\u00e8\2\2\u021f\u0220") - buf.write("\58\35\2\u0220\u0404\3\2\2\2\u0221\u0222\7\21\2\2\u0222") - buf.write("\u0223\t\7\2\2\u0223\u0224\5\u00acW\2\u0224\u0225\7\u00fd") - buf.write("\2\2\u0225\u0228\7\u00e8\2\2\u0226\u0227\7p\2\2\u0227") - buf.write("\u0229\7U\2\2\u0228\u0226\3\2\2\2\u0228\u0229\3\2\2\2") - buf.write("\u0229\u022a\3\2\2\2\u022a\u022b\58\35\2\u022b\u0404\3") - buf.write("\2\2\2\u022c\u022d\7\21\2\2\u022d\u022e\7\u00e5\2\2\u022e") - buf.write("\u022f\5\u00acW\2\u022f\u0231\t\b\2\2\u0230\u0232\7-\2") - buf.write("\2\u0231\u0230\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0233") - buf.write("\3\2\2\2\u0233\u0235\5\u00acW\2\u0234\u0236\5\u010c\u0087") - buf.write("\2\u0235\u0234\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0404") - buf.write("\3\2\2\2\u0237\u0238\7\21\2\2\u0238\u0239\7\u00e5\2\2") - buf.write("\u0239\u023b\5\u00acW\2\u023a\u023c\5&\24\2\u023b\u023a") - buf.write("\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023d\3\2\2\2\u023d") - buf.write("\u023f\7%\2\2\u023e\u0240\7-\2\2\u023f\u023e\3\2\2\2\u023f") - buf.write("\u0240\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u0242\5\u00ac") - buf.write("W\2\u0242\u0244\5\u00e8u\2\u0243\u0245\5\u00dep\2\u0244") - buf.write("\u0243\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0404\3\2\2\2") - buf.write("\u0246\u0247\7\21\2\2\u0247\u0248\7\u00e5\2\2\u0248\u024a") - buf.write("\5\u00acW\2\u0249\u024b\5&\24\2\u024a\u0249\3\2\2\2\u024a") - buf.write("\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7\u00c2") - buf.write("\2\2\u024d\u024e\7.\2\2\u024e\u024f\7\4\2\2\u024f\u0250") - buf.write("\5\u00e2r\2\u0250\u0251\7\5\2\2\u0251\u0404\3\2\2\2\u0252") - buf.write("\u0253\7\21\2\2\u0253\u0254\7\u00e5\2\2\u0254\u0256\5") - buf.write("\u00acW\2\u0255\u0257\5&\24\2\u0256\u0255\3\2\2\2\u0256") - buf.write("\u0257\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259\7\u00d6") - buf.write("\2\2\u0259\u025a\7\u00d3\2\2\u025a\u025e\7\u011d\2\2\u025b") - buf.write("\u025c\7\u0108\2\2\u025c\u025d\7\u00d4\2\2\u025d\u025f") - buf.write("\58\35\2\u025e\u025b\3\2\2\2\u025e\u025f\3\2\2\2\u025f") - buf.write("\u0404\3\2\2\2\u0260\u0261\7\21\2\2\u0261\u0262\7\u00e5") - buf.write("\2\2\u0262\u0264\5\u00acW\2\u0263\u0265\5&\24\2\u0264") - buf.write("\u0263\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\3\2\2\2") - buf.write("\u0266\u0267\7\u00d6\2\2\u0267\u0268\7\u00d4\2\2\u0268") - buf.write("\u0269\58\35\2\u0269\u0404\3\2\2\2\u026a\u026b\7\21\2") - buf.write("\2\u026b\u026c\t\7\2\2\u026c\u026d\5\u00acW\2\u026d\u0271") - buf.write("\7\16\2\2\u026e\u026f\7p\2\2\u026f\u0270\7\u009b\2\2\u0270") - buf.write("\u0272\7U\2\2\u0271\u026e\3\2\2\2\u0271\u0272\3\2\2\2") - buf.write("\u0272\u0274\3\2\2\2\u0273\u0275\5$\23\2\u0274\u0273\3") - buf.write("\2\2\2\u0275\u0276\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277") - buf.write("\3\2\2\2\u0277\u0404\3\2\2\2\u0278\u0279\7\21\2\2\u0279") - buf.write("\u027a\7\u00e5\2\2\u027a\u027b\5\u00acW\2\u027b\u027c") - buf.write("\5&\24\2\u027c\u027d\7\u00c0\2\2\u027d\u027e\7\u00ec\2") - buf.write("\2\u027e\u027f\5&\24\2\u027f\u0404\3\2\2\2\u0280\u0281") - buf.write("\7\21\2\2\u0281\u0282\t\7\2\2\u0282\u0283\5\u00acW\2\u0283") - buf.write("\u0286\7N\2\2\u0284\u0285\7p\2\2\u0285\u0287\7U\2\2\u0286") - buf.write("\u0284\3\2\2\2\u0286\u0287\3\2\2\2\u0287\u0288\3\2\2\2") - buf.write("\u0288\u028d\5&\24\2\u0289\u028a\7\6\2\2\u028a\u028c\5") - buf.write("&\24\2\u028b\u0289\3\2\2\2\u028c\u028f\3\2\2\2\u028d\u028b") - buf.write("\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u0291\3\2\2\2\u028f") - buf.write("\u028d\3\2\2\2\u0290\u0292\7\u00b7\2\2\u0291\u0290\3\2") - buf.write("\2\2\u0291\u0292\3\2\2\2\u0292\u0404\3\2\2\2\u0293\u0294") - buf.write("\7\21\2\2\u0294\u0295\7\u00e5\2\2\u0295\u0297\5\u00ac") - buf.write("W\2\u0296\u0298\5&\24\2\u0297\u0296\3\2\2\2\u0297\u0298") - buf.write("\3\2\2\2\u0298\u0299\3\2\2\2\u0299\u029a\7\u00d6\2\2\u029a") - buf.write("\u029b\5\34\17\2\u029b\u0404\3\2\2\2\u029c\u029d\7\21") - buf.write("\2\2\u029d\u029e\7\u00e5\2\2\u029e\u029f\5\u00acW\2\u029f") - buf.write("\u02a0\7\u00bc\2\2\u02a0\u02a1\7\u00ae\2\2\u02a1\u0404") - buf.write("\3\2\2\2\u02a2\u02a3\7N\2\2\u02a3\u02a6\7\u00e5\2\2\u02a4") - buf.write("\u02a5\7p\2\2\u02a5\u02a7\7U\2\2\u02a6\u02a4\3\2\2\2\u02a6") - buf.write("\u02a7\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02aa\5\u00ac") - buf.write("W\2\u02a9\u02ab\7\u00b7\2\2\u02aa\u02a9\3\2\2\2\u02aa") - buf.write("\u02ab\3\2\2\2\u02ab\u0404\3\2\2\2\u02ac\u02ad\7N\2\2") - buf.write("\u02ad\u02b0\7\u0103\2\2\u02ae\u02af\7p\2\2\u02af\u02b1") - buf.write("\7U\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1") - buf.write("\u02b2\3\2\2\2\u02b2\u0404\5\u00acW\2\u02b3\u02b6\7\67") - buf.write("\2\2\u02b4\u02b5\7\u00a3\2\2\u02b5\u02b7\7\u00c2\2\2\u02b6") - buf.write("\u02b4\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02bc\3\2\2\2") - buf.write("\u02b8\u02ba\7j\2\2\u02b9\u02b8\3\2\2\2\u02b9\u02ba\3") - buf.write("\2\2\2\u02ba\u02bb\3\2\2\2\u02bb\u02bd\7\u00e9\2\2\u02bc") - buf.write("\u02b9\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\3\2\2\2") - buf.write("\u02be\u02c2\7\u0103\2\2\u02bf\u02c0\7p\2\2\u02c0\u02c1") - buf.write("\7\u009b\2\2\u02c1\u02c3\7U\2\2\u02c2\u02bf\3\2\2\2\u02c2") - buf.write("\u02c3\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c6\5\u00ac") - buf.write("W\2\u02c5\u02c7\5\u009cO\2\u02c6\u02c5\3\2\2\2\u02c6\u02c7") - buf.write("\3\2\2\2\u02c7\u02d0\3\2\2\2\u02c8\u02cf\5\36\20\2\u02c9") - buf.write("\u02ca\7\u00ad\2\2\u02ca\u02cb\7\u009f\2\2\u02cb\u02cf") - buf.write("\5\u0094K\2\u02cc\u02cd\7\u00e8\2\2\u02cd\u02cf\58\35") - buf.write("\2\u02ce\u02c8\3\2\2\2\u02ce\u02c9\3\2\2\2\u02ce\u02cc") - buf.write("\3\2\2\2\u02cf\u02d2\3\2\2\2\u02d0\u02ce\3\2\2\2\u02d0") - buf.write("\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02d0\3\2\2\2") - buf.write("\u02d3\u02d4\7\30\2\2\u02d4\u02d5\5 \21\2\u02d5\u0404") - buf.write("\3\2\2\2\u02d6\u02d9\7\67\2\2\u02d7\u02d8\7\u00a3\2\2") - buf.write("\u02d8\u02da\7\u00c2\2\2\u02d9\u02d7\3\2\2\2\u02d9\u02da") - buf.write("\3\2\2\2\u02da\u02dc\3\2\2\2\u02db\u02dd\7j\2\2\u02dc") - buf.write("\u02db\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02de\3\2\2\2") - buf.write("\u02de\u02df\7\u00e9\2\2\u02df\u02e0\7\u0103\2\2\u02e0") - buf.write("\u02e5\5\u00aeX\2\u02e1\u02e2\7\4\2\2\u02e2\u02e3\5\u00e6") - buf.write("t\2\u02e3\u02e4\7\5\2\2\u02e4\u02e6\3\2\2\2\u02e5\u02e1") - buf.write("\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7") - buf.write("\u02ea\5\64\33\2\u02e8\u02e9\7\u00a2\2\2\u02e9\u02eb\5") - buf.write("8\35\2\u02ea\u02e8\3\2\2\2\u02ea\u02eb\3\2\2\2\u02eb\u0404") - buf.write("\3\2\2\2\u02ec\u02ed\7\21\2\2\u02ed\u02ee\7\u0103\2\2") - buf.write("\u02ee\u02f0\5\u00acW\2\u02ef\u02f1\7\30\2\2\u02f0\u02ef") - buf.write("\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2") - buf.write("\u02f3\5 \21\2\u02f3\u0404\3\2\2\2\u02f4\u02f7\7\67\2") - buf.write("\2\u02f5\u02f6\7\u00a3\2\2\u02f6\u02f8\7\u00c2\2\2\u02f7") - buf.write("\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u02fa\3\2\2\2") - buf.write("\u02f9\u02fb\7\u00e9\2\2\u02fa\u02f9\3\2\2\2\u02fa\u02fb") - buf.write("\3\2\2\2\u02fb\u02fc\3\2\2\2\u02fc\u0300\7h\2\2\u02fd") - buf.write("\u02fe\7p\2\2\u02fe\u02ff\7\u009b\2\2\u02ff\u0301\7U\2") - buf.write("\2\u0300\u02fd\3\2\2\2\u0300\u0301\3\2\2\2\u0301\u0302") - buf.write("\3\2\2\2\u0302\u0303\5\u00acW\2\u0303\u0304\7\30\2\2\u0304") - buf.write("\u030e\7\u011d\2\2\u0305\u0306\7\u0101\2\2\u0306\u030b") - buf.write("\5J&\2\u0307\u0308\7\6\2\2\u0308\u030a\5J&\2\u0309\u0307") - buf.write("\3\2\2\2\u030a\u030d\3\2\2\2\u030b\u0309\3\2\2\2\u030b") - buf.write("\u030c\3\2\2\2\u030c\u030f\3\2\2\2\u030d\u030b\3\2\2\2") - buf.write("\u030e\u0305\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0404\3") - buf.write("\2\2\2\u0310\u0312\7N\2\2\u0311\u0313\7\u00e9\2\2\u0312") - buf.write("\u0311\3\2\2\2\u0312\u0313\3\2\2\2\u0313\u0314\3\2\2\2") - buf.write("\u0314\u0317\7h\2\2\u0315\u0316\7p\2\2\u0316\u0318\7U") - buf.write("\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0319") - buf.write("\3\2\2\2\u0319\u0404\5\u00acW\2\u031a\u031c\7V\2\2\u031b") - buf.write("\u031d\t\t\2\2\u031c\u031b\3\2\2\2\u031c\u031d\3\2\2\2") - buf.write("\u031d\u031e\3\2\2\2\u031e\u0404\5\20\t\2\u031f\u0320") - buf.write("\7\u00d9\2\2\u0320\u0323\7\u00e6\2\2\u0321\u0322\t\5\2") - buf.write("\2\u0322\u0324\5\u00acW\2\u0323\u0321\3\2\2\2\u0323\u0324") - buf.write("\3\2\2\2\u0324\u0329\3\2\2\2\u0325\u0327\7\u0086\2\2\u0326") - buf.write("\u0325\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2") - buf.write("\u0328\u032a\7\u011d\2\2\u0329\u0326\3\2\2\2\u0329\u032a") - buf.write("\3\2\2\2\u032a\u0404\3\2\2\2\u032b\u032c\7\u00d9\2\2\u032c") - buf.write("\u032d\7\u00e5\2\2\u032d\u0330\7X\2\2\u032e\u032f\t\5") - buf.write("\2\2\u032f\u0331\5\u00acW\2\u0330\u032e\3\2\2\2\u0330") - buf.write("\u0331\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0333\7\u0086") - buf.write("\2\2\u0333\u0335\7\u011d\2\2\u0334\u0336\5&\24\2\u0335") - buf.write("\u0334\3\2\2\2\u0335\u0336\3\2\2\2\u0336\u0404\3\2\2\2") - buf.write("\u0337\u0338\7\u00d9\2\2\u0338\u0339\7\u00e8\2\2\u0339") - buf.write("\u033e\5\u00acW\2\u033a\u033b\7\4\2\2\u033b\u033c\5<\37") - buf.write("\2\u033c\u033d\7\5\2\2\u033d\u033f\3\2\2\2\u033e\u033a") - buf.write("\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u0404\3\2\2\2\u0340") - buf.write("\u0341\7\u00d9\2\2\u0341\u0342\7.\2\2\u0342\u0343\t\5") - buf.write("\2\2\u0343\u0346\5\u00acW\2\u0344\u0345\t\5\2\2\u0345") - buf.write("\u0347\5\u00acW\2\u0346\u0344\3\2\2\2\u0346\u0347\3\2") - buf.write("\2\2\u0347\u0404\3\2\2\2\u0348\u0349\7\u00d9\2\2\u0349") - buf.write("\u034c\7\u0104\2\2\u034a\u034b\t\5\2\2\u034b\u034d\5\u00ac") - buf.write("W\2\u034c\u034a\3\2\2\2\u034c\u034d\3\2\2\2\u034d\u0352") - buf.write("\3\2\2\2\u034e\u0350\7\u0086\2\2\u034f\u034e\3\2\2\2\u034f") - buf.write("\u0350\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u0353\7\u011d") - buf.write("\2\2\u0352\u034f\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0404") - buf.write("\3\2\2\2\u0354\u0355\7\u00d9\2\2\u0355\u0356\7\u00ae\2") - buf.write("\2\u0356\u0358\5\u00acW\2\u0357\u0359\5&\24\2\u0358\u0357") - buf.write("\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0404\3\2\2\2\u035a") - buf.write("\u035c\7\u00d9\2\2\u035b\u035d\5\u0104\u0083\2\u035c\u035b") - buf.write("\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035e\3\2\2\2\u035e") - buf.write("\u0366\7i\2\2\u035f\u0361\7\u0086\2\2\u0360\u035f\3\2") - buf.write("\2\2\u0360\u0361\3\2\2\2\u0361\u0364\3\2\2\2\u0362\u0365") - buf.write("\5\u00acW\2\u0363\u0365\7\u011d\2\2\u0364\u0362\3\2\2") - buf.write("\2\u0364\u0363\3\2\2\2\u0365\u0367\3\2\2\2\u0366\u0360") - buf.write("\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0404\3\2\2\2\u0368") - buf.write("\u0369\7\u00d9\2\2\u0369\u036a\7\67\2\2\u036a\u036b\7") - buf.write("\u00e5\2\2\u036b\u036e\5\u00acW\2\u036c\u036d\7\30\2\2") - buf.write("\u036d\u036f\7\u00d3\2\2\u036e\u036c\3\2\2\2\u036e\u036f") - buf.write("\3\2\2\2\u036f\u0404\3\2\2\2\u0370\u0371\7\u00d9\2\2\u0371") - buf.write("\u0372\7:\2\2\u0372\u0404\7\u0097\2\2\u0373\u0374\t\n") - buf.write("\2\2\u0374\u0376\7h\2\2\u0375\u0377\7X\2\2\u0376\u0375") - buf.write("\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\3\2\2\2\u0378") - buf.write("\u0404\5,\27\2\u0379\u037a\t\n\2\2\u037a\u037c\5*\26\2") - buf.write("\u037b\u037d\7X\2\2\u037c\u037b\3\2\2\2\u037c\u037d\3") - buf.write("\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\5\u00acW\2\u037f") - buf.write("\u0404\3\2\2\2\u0380\u0382\t\n\2\2\u0381\u0383\7\u00e5") - buf.write("\2\2\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0385") - buf.write("\3\2\2\2\u0384\u0386\t\13\2\2\u0385\u0384\3\2\2\2\u0385") - buf.write("\u0386\3\2\2\2\u0386\u0387\3\2\2\2\u0387\u0389\5\u00ac") - buf.write("W\2\u0388\u038a\5&\24\2\u0389\u0388\3\2\2\2\u0389\u038a") - buf.write("\3\2\2\2\u038a\u038c\3\2\2\2\u038b\u038d\5.\30\2\u038c") - buf.write("\u038b\3\2\2\2\u038c\u038d\3\2\2\2\u038d\u0404\3\2\2\2") - buf.write("\u038e\u0390\t\n\2\2\u038f\u0391\7\u00b8\2\2\u0390\u038f") - buf.write("\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\3\2\2\2\u0392") - buf.write("\u0404\5 \21\2\u0393\u0394\7/\2\2\u0394\u0395\7\u009f") - buf.write("\2\2\u0395\u0396\5*\26\2\u0396\u0397\5\u00acW\2\u0397") - buf.write("\u0398\7}\2\2\u0398\u0399\t\f\2\2\u0399\u0404\3\2\2\2") - buf.write("\u039a\u039b\7/\2\2\u039b\u039c\7\u009f\2\2\u039c\u039d") - buf.write("\7\u00e5\2\2\u039d\u039e\5\u00acW\2\u039e\u039f\7}\2\2") - buf.write("\u039f\u03a0\t\f\2\2\u03a0\u0404\3\2\2\2\u03a1\u03a2\7") - buf.write("\u00bf\2\2\u03a2\u03a3\7\u00e5\2\2\u03a3\u0404\5\u00ac") - buf.write("W\2\u03a4\u03ac\7\u00bf\2\2\u03a5\u03ad\7\u011d\2\2\u03a6") - buf.write("\u03a8\13\2\2\2\u03a7\u03a6\3\2\2\2\u03a8\u03ab\3\2\2") - buf.write("\2\u03a9\u03aa\3\2\2\2\u03a9\u03a7\3\2\2\2\u03aa\u03ad") - buf.write("\3\2\2\2\u03ab\u03a9\3\2\2\2\u03ac\u03a5\3\2\2\2\u03ac") - buf.write("\u03a9\3\2\2\2\u03ad\u0404\3\2\2\2\u03ae\u03b0\7!\2\2") - buf.write("\u03af\u03b1\7\u0083\2\2\u03b0\u03af\3\2\2\2\u03b0\u03b1") - buf.write("\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b3\7\u00e5\2\2\u03b3") - buf.write("\u03b6\5\u00acW\2\u03b4\u03b5\7\u00a2\2\2\u03b5\u03b7") - buf.write("\58\35\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7") - buf.write("\u03bc\3\2\2\2\u03b8\u03ba\7\30\2\2\u03b9\u03b8\3\2\2") - buf.write("\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u03bd") - buf.write("\5 \21\2\u03bc\u03b9\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd") - buf.write("\u0404\3\2\2\2\u03be\u03bf\7\u00f8\2\2\u03bf\u03c2\7\u00e5") - buf.write("\2\2\u03c0\u03c1\7p\2\2\u03c1\u03c3\7U\2\2\u03c2\u03c0") - buf.write("\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4") - buf.write("\u0404\5\u00acW\2\u03c5\u03c6\7\'\2\2\u03c6\u0404\7!\2") - buf.write("\2\u03c7\u03c8\7\u008a\2\2\u03c8\u03ca\7?\2\2\u03c9\u03cb") - buf.write("\7\u008b\2\2\u03ca\u03c9\3\2\2\2\u03ca\u03cb\3\2\2\2\u03cb") - buf.write("\u03cc\3\2\2\2\u03cc\u03cd\7w\2\2\u03cd\u03cf\7\u011d") - buf.write("\2\2\u03ce\u03d0\7\u00ab\2\2\u03cf\u03ce\3\2\2\2\u03cf") - buf.write("\u03d0\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\7|\2\2") - buf.write("\u03d2\u03d3\7\u00e5\2\2\u03d3\u03d5\5\u00acW\2\u03d4") - buf.write("\u03d6\5&\24\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2") - buf.write("\u03d6\u0404\3\2\2\2\u03d7\u03d8\7\u00f4\2\2\u03d8\u03d9") - buf.write("\7\u00e5\2\2\u03d9\u03db\5\u00acW\2\u03da\u03dc\5&\24") - buf.write("\2\u03db\u03da\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u0404") - buf.write("\3\2\2\2\u03dd\u03de\7\u0096\2\2\u03de\u03df\7\u00c1\2") - buf.write("\2\u03df\u03e0\7\u00e5\2\2\u03e0\u0404\5\u00acW\2\u03e1") - buf.write("\u03e2\t\r\2\2\u03e2\u03ea\5\u0104\u0083\2\u03e3\u03eb") - buf.write("\7\u011d\2\2\u03e4\u03e6\13\2\2\2\u03e5\u03e4\3\2\2\2") - buf.write("\u03e6\u03e9\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e7\u03e5\3") - buf.write("\2\2\2\u03e8\u03eb\3\2\2\2\u03e9\u03e7\3\2\2\2\u03ea\u03e3") - buf.write("\3\2\2\2\u03ea\u03e7\3\2\2\2\u03eb\u0404\3\2\2\2\u03ec") - buf.write("\u03ed\7\u00d6\2\2\u03ed\u03f1\7\u00c8\2\2\u03ee\u03f0") - buf.write("\13\2\2\2\u03ef\u03ee\3\2\2\2\u03f0\u03f3\3\2\2\2\u03f1") - buf.write("\u03f2\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f2\u0404\3\2\2\2") - buf.write("\u03f3\u03f1\3\2\2\2\u03f4\u03f8\7\u00d6\2\2\u03f5\u03f7") - buf.write("\13\2\2\2\u03f6\u03f5\3\2\2\2\u03f7\u03fa\3\2\2\2\u03f8") - buf.write("\u03f9\3\2\2\2\u03f8\u03f6\3\2\2\2\u03f9\u0404\3\2\2\2") - buf.write("\u03fa\u03f8\3\2\2\2\u03fb\u0404\7\u00c3\2\2\u03fc\u0400") - buf.write("\5\22\n\2\u03fd\u03ff\13\2\2\2\u03fe\u03fd\3\2\2\2\u03ff") - buf.write("\u0402\3\2\2\2\u0400\u0401\3\2\2\2\u0400\u03fe\3\2\2\2") - buf.write("\u0401\u0404\3\2\2\2\u0402\u0400\3\2\2\2\u0403\u012f\3") - buf.write("\2\2\2\u0403\u0131\3\2\2\2\u0403\u0134\3\2\2\2\u0403\u0139") - buf.write("\3\2\2\2\u0403\u014b\3\2\2\2\u0403\u0152\3\2\2\2\u0403") - buf.write("\u0158\3\2\2\2\u0403\u0162\3\2\2\2\u0403\u016e\3\2\2\2") - buf.write("\u0403\u0180\3\2\2\2\u0403\u0190\3\2\2\2\u0403\u01b5\3") - buf.write("\2\2\2\u0403\u01ca\3\2\2\2\u0403\u01d9\3\2\2\2\u0403\u01ea") - buf.write("\3\2\2\2\u0403\u01f1\3\2\2\2\u0403\u01fa\3\2\2\2\u0403") - buf.write("\u0203\3\2\2\2\u0403\u020c\3\2\2\2\u0403\u0213\3\2\2\2") - buf.write("\u0403\u021a\3\2\2\2\u0403\u0221\3\2\2\2\u0403\u022c\3") - buf.write("\2\2\2\u0403\u0237\3\2\2\2\u0403\u0246\3\2\2\2\u0403\u0252") - buf.write("\3\2\2\2\u0403\u0260\3\2\2\2\u0403\u026a\3\2\2\2\u0403") - buf.write("\u0278\3\2\2\2\u0403\u0280\3\2\2\2\u0403\u0293\3\2\2\2") - buf.write("\u0403\u029c\3\2\2\2\u0403\u02a2\3\2\2\2\u0403\u02ac\3") - buf.write("\2\2\2\u0403\u02b3\3\2\2\2\u0403\u02d6\3\2\2\2\u0403\u02ec") - buf.write("\3\2\2\2\u0403\u02f4\3\2\2\2\u0403\u0310\3\2\2\2\u0403") - buf.write("\u031a\3\2\2\2\u0403\u031f\3\2\2\2\u0403\u032b\3\2\2\2") - buf.write("\u0403\u0337\3\2\2\2\u0403\u0340\3\2\2\2\u0403\u0348\3") - buf.write("\2\2\2\u0403\u0354\3\2\2\2\u0403\u035a\3\2\2\2\u0403\u0368") - buf.write("\3\2\2\2\u0403\u0370\3\2\2\2\u0403\u0373\3\2\2\2\u0403") - buf.write("\u0379\3\2\2\2\u0403\u0380\3\2\2\2\u0403\u038e\3\2\2\2") - buf.write("\u0403\u0393\3\2\2\2\u0403\u039a\3\2\2\2\u0403\u03a1\3") - buf.write("\2\2\2\u0403\u03a4\3\2\2\2\u0403\u03ae\3\2\2\2\u0403\u03be") - buf.write("\3\2\2\2\u0403\u03c5\3\2\2\2\u0403\u03c7\3\2\2\2\u0403") - buf.write("\u03d7\3\2\2\2\u0403\u03dd\3\2\2\2\u0403\u03e1\3\2\2\2") - buf.write("\u0403\u03ec\3\2\2\2\u0403\u03f4\3\2\2\2\u0403\u03fb\3") - buf.write("\2\2\2\u0403\u03fc\3\2\2\2\u0404\21\3\2\2\2\u0405\u0406") - buf.write("\7\67\2\2\u0406\u04ae\7\u00c8\2\2\u0407\u0408\7N\2\2\u0408") - buf.write("\u04ae\7\u00c8\2\2\u0409\u040b\7k\2\2\u040a\u040c\7\u00c8") - buf.write("\2\2\u040b\u040a\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u04ae") - buf.write("\3\2\2\2\u040d\u040f\7\u00c5\2\2\u040e\u0410\7\u00c8\2") - buf.write("\2\u040f\u040e\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u04ae") - buf.write("\3\2\2\2\u0411\u0412\7\u00d9\2\2\u0412\u04ae\7k\2\2\u0413") - buf.write("\u0414\7\u00d9\2\2\u0414\u0416\7\u00c8\2\2\u0415\u0417") - buf.write("\7k\2\2\u0416\u0415\3\2\2\2\u0416\u0417\3\2\2\2\u0417") - buf.write("\u04ae\3\2\2\2\u0418\u0419\7\u00d9\2\2\u0419\u04ae\7\u00b5") - buf.write("\2\2\u041a\u041b\7\u00d9\2\2\u041b\u04ae\7\u00c9\2\2\u041c") - buf.write("\u041d\7\u00d9\2\2\u041d\u041e\7:\2\2\u041e\u04ae\7\u00c9") - buf.write("\2\2\u041f\u0420\7W\2\2\u0420\u04ae\7\u00e5\2\2\u0421") - buf.write("\u0422\7r\2\2\u0422\u04ae\7\u00e5\2\2\u0423\u0424\7\u00d9") - buf.write("\2\2\u0424\u04ae\7\62\2\2\u0425\u0426\7\u00d9\2\2\u0426") - buf.write("\u0427\7\67\2\2\u0427\u04ae\7\u00e5\2\2\u0428\u0429\7") - buf.write("\u00d9\2\2\u0429\u04ae\7\u00f0\2\2\u042a\u042b\7\u00d9") - buf.write("\2\2\u042b\u04ae\7u\2\2\u042c\u042d\7\u00d9\2\2\u042d") - buf.write("\u04ae\7\u008e\2\2\u042e\u042f\7\67\2\2\u042f\u04ae\7") - buf.write("t\2\2\u0430\u0431\7N\2\2\u0431\u04ae\7t\2\2\u0432\u0433") - buf.write("\7\21\2\2\u0433\u04ae\7t\2\2\u0434\u0435\7\u008d\2\2\u0435") - buf.write("\u04ae\7\u00e5\2\2\u0436\u0437\7\u008d\2\2\u0437\u04ae") - buf.write("\7@\2\2\u0438\u0439\7\u00fc\2\2\u0439\u04ae\7\u00e5\2") - buf.write("\2\u043a\u043b\7\u00fc\2\2\u043b\u04ae\7@\2\2\u043c\u043d") - buf.write("\7\67\2\2\u043d\u043e\7\u00e9\2\2\u043e\u04ae\7\u0090") - buf.write("\2\2\u043f\u0440\7N\2\2\u0440\u0441\7\u00e9\2\2\u0441") - buf.write("\u04ae\7\u0090\2\2\u0442\u0443\7\21\2\2\u0443\u0444\7") - buf.write("\u00e5\2\2\u0444\u0445\5\u00aeX\2\u0445\u0446\7\u009b") - buf.write("\2\2\u0446\u0447\7)\2\2\u0447\u04ae\3\2\2\2\u0448\u0449") - buf.write("\7\21\2\2\u0449\u044a\7\u00e5\2\2\u044a\u044b\5\u00ae") - buf.write("X\2\u044b\u044c\7)\2\2\u044c\u044d\7 \2\2\u044d\u04ae") - buf.write("\3\2\2\2\u044e\u044f\7\21\2\2\u044f\u0450\7\u00e5\2\2") - buf.write("\u0450\u0451\5\u00aeX\2\u0451\u0452\7\u009b\2\2\u0452") - buf.write("\u0453\7\u00dd\2\2\u0453\u04ae\3\2\2\2\u0454\u0455\7\21") - buf.write("\2\2\u0455\u0456\7\u00e5\2\2\u0456\u0457\5\u00aeX\2\u0457") - buf.write("\u0458\7\u00da\2\2\u0458\u0459\7 \2\2\u0459\u04ae\3\2") - buf.write("\2\2\u045a\u045b\7\21\2\2\u045b\u045c\7\u00e5\2\2\u045c") - buf.write("\u045d\5\u00aeX\2\u045d\u045e\7\u009b\2\2\u045e\u045f") - buf.write("\7\u00da\2\2\u045f\u04ae\3\2\2\2\u0460\u0461\7\21\2\2") - buf.write("\u0461\u0462\7\u00e5\2\2\u0462\u0463\5\u00aeX\2\u0463") - buf.write("\u0464\7\u009b\2\2\u0464\u0465\7\u00e0\2\2\u0465\u0466") - buf.write("\7\30\2\2\u0466\u0467\7J\2\2\u0467\u04ae\3\2\2\2\u0468") - buf.write("\u0469\7\21\2\2\u0469\u046a\7\u00e5\2\2\u046a\u046b\5") - buf.write("\u00aeX\2\u046b\u046c\7\u00d6\2\2\u046c\u046d\7\u00da") - buf.write("\2\2\u046d\u046e\7\u008c\2\2\u046e\u04ae\3\2\2\2\u046f") - buf.write("\u0470\7\21\2\2\u0470\u0471\7\u00e5\2\2\u0471\u0472\5") - buf.write("\u00aeX\2\u0472\u0473\7T\2\2\u0473\u0474\7\u00ac\2\2\u0474") - buf.write("\u04ae\3\2\2\2\u0475\u0476\7\21\2\2\u0476\u0477\7\u00e5") - buf.write("\2\2\u0477\u0478\5\u00aeX\2\u0478\u0479\7\26\2\2\u0479") - buf.write("\u047a\7\u00ac\2\2\u047a\u04ae\3\2\2\2\u047b\u047c\7\21") - buf.write("\2\2\u047c\u047d\7\u00e5\2\2\u047d\u047e\5\u00aeX\2\u047e") - buf.write("\u047f\7\u00f6\2\2\u047f\u0480\7\u00ac\2\2\u0480\u04ae") - buf.write("\3\2\2\2\u0481\u0482\7\21\2\2\u0482\u0483\7\u00e5\2\2") - buf.write("\u0483\u0484\5\u00aeX\2\u0484\u0485\7\u00ed\2\2\u0485") - buf.write("\u04ae\3\2\2\2\u0486\u0487\7\21\2\2\u0487\u0488\7\u00e5") - buf.write("\2\2\u0488\u048a\5\u00aeX\2\u0489\u048b\5&\24\2\u048a") - buf.write("\u0489\3\2\2\2\u048a\u048b\3\2\2\2\u048b\u048c\3\2\2\2") - buf.write("\u048c\u048d\7\61\2\2\u048d\u04ae\3\2\2\2\u048e\u048f") - buf.write("\7\21\2\2\u048f\u0490\7\u00e5\2\2\u0490\u0492\5\u00ae") - buf.write("X\2\u0491\u0493\5&\24\2\u0492\u0491\3\2\2\2\u0492\u0493") - buf.write("\3\2\2\2\u0493\u0494\3\2\2\2\u0494\u0495\7\64\2\2\u0495") - buf.write("\u04ae\3\2\2\2\u0496\u0497\7\21\2\2\u0497\u0498\7\u00e5") - buf.write("\2\2\u0498\u049a\5\u00aeX\2\u0499\u049b\5&\24\2\u049a") - buf.write("\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2") - buf.write("\u049c\u049d\7\u00d6\2\2\u049d\u049e\7_\2\2\u049e\u04ae") - buf.write("\3\2\2\2\u049f\u04a0\7\21\2\2\u04a0\u04a1\7\u00e5\2\2") - buf.write("\u04a1\u04a3\5\u00aeX\2\u04a2\u04a4\5&\24\2\u04a3\u04a2") - buf.write("\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5") - buf.write("\u04a6\7\u00c2\2\2\u04a6\u04a7\7.\2\2\u04a7\u04ae\3\2") - buf.write("\2\2\u04a8\u04a9\7\u00de\2\2\u04a9\u04ae\7\u00ef\2\2\u04aa") - buf.write("\u04ae\7\60\2\2\u04ab\u04ae\7\u00ca\2\2\u04ac\u04ae\7") - buf.write("I\2\2\u04ad\u0405\3\2\2\2\u04ad\u0407\3\2\2\2\u04ad\u0409") - buf.write("\3\2\2\2\u04ad\u040d\3\2\2\2\u04ad\u0411\3\2\2\2\u04ad") - buf.write("\u0413\3\2\2\2\u04ad\u0418\3\2\2\2\u04ad\u041a\3\2\2\2") - buf.write("\u04ad\u041c\3\2\2\2\u04ad\u041f\3\2\2\2\u04ad\u0421\3") - buf.write("\2\2\2\u04ad\u0423\3\2\2\2\u04ad\u0425\3\2\2\2\u04ad\u0428") - buf.write("\3\2\2\2\u04ad\u042a\3\2\2\2\u04ad\u042c\3\2\2\2\u04ad") - buf.write("\u042e\3\2\2\2\u04ad\u0430\3\2\2\2\u04ad\u0432\3\2\2\2") - buf.write("\u04ad\u0434\3\2\2\2\u04ad\u0436\3\2\2\2\u04ad\u0438\3") - buf.write("\2\2\2\u04ad\u043a\3\2\2\2\u04ad\u043c\3\2\2\2\u04ad\u043f") - buf.write("\3\2\2\2\u04ad\u0442\3\2\2\2\u04ad\u0448\3\2\2\2\u04ad") - buf.write("\u044e\3\2\2\2\u04ad\u0454\3\2\2\2\u04ad\u045a\3\2\2\2") - buf.write("\u04ad\u0460\3\2\2\2\u04ad\u0468\3\2\2\2\u04ad\u046f\3") - buf.write("\2\2\2\u04ad\u0475\3\2\2\2\u04ad\u047b\3\2\2\2\u04ad\u0481") - buf.write("\3\2\2\2\u04ad\u0486\3\2\2\2\u04ad\u048e\3\2\2\2\u04ad") - buf.write("\u0496\3\2\2\2\u04ad\u049f\3\2\2\2\u04ad\u04a8\3\2\2\2") - buf.write("\u04ad\u04aa\3\2\2\2\u04ad\u04ab\3\2\2\2\u04ad\u04ac\3") - buf.write("\2\2\2\u04ae\23\3\2\2\2\u04af\u04b1\7\67\2\2\u04b0\u04b2") - buf.write("\7\u00e9\2\2\u04b1\u04b0\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2") - buf.write("\u04b4\3\2\2\2\u04b3\u04b5\7Y\2\2\u04b4\u04b3\3\2\2\2") - buf.write("\u04b4\u04b5\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04ba\7") - buf.write("\u00e5\2\2\u04b7\u04b8\7p\2\2\u04b8\u04b9\7\u009b\2\2") - buf.write("\u04b9\u04bb\7U\2\2\u04ba\u04b7\3\2\2\2\u04ba\u04bb\3") - buf.write("\2\2\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\5\u00acW\2\u04bd") - buf.write("\25\3\2\2\2\u04be\u04bf\7\67\2\2\u04bf\u04c1\7\u00a3\2") - buf.write("\2\u04c0\u04be\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c2") - buf.write("\3\2\2\2\u04c2\u04c3\7\u00c2\2\2\u04c3\u04c4\7\u00e5\2") - buf.write("\2\u04c4\u04c5\5\u00acW\2\u04c5\27\3\2\2\2\u04c6\u04c7") - buf.write("\7)\2\2\u04c7\u04c8\7 \2\2\u04c8\u04cc\5\u0094K\2\u04c9") - buf.write("\u04ca\7\u00dd\2\2\u04ca\u04cb\7 \2\2\u04cb\u04cd\5\u0098") - buf.write("M\2\u04cc\u04c9\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04ce") - buf.write("\3\2\2\2\u04ce\u04cf\7|\2\2\u04cf\u04d0\7\u0121\2\2\u04d0") - buf.write("\u04d1\7\37\2\2\u04d1\31\3\2\2\2\u04d2\u04d3\7\u00da\2") - buf.write("\2\u04d3\u04d4\7 \2\2\u04d4\u04d5\5\u0094K\2\u04d5\u04d8") - buf.write("\7\u009f\2\2\u04d6\u04d9\5@!\2\u04d7\u04d9\5B\"\2\u04d8") - buf.write("\u04d6\3\2\2\2\u04d8\u04d7\3\2\2\2\u04d9\u04dd\3\2\2\2") - buf.write("\u04da\u04db\7\u00e0\2\2\u04db\u04dc\7\30\2\2\u04dc\u04de") - buf.write("\7J\2\2\u04dd\u04da\3\2\2\2\u04dd\u04de\3\2\2\2\u04de") - buf.write("\33\3\2\2\2\u04df\u04e0\7\u008c\2\2\u04e0\u04e1\7\u011d") - buf.write("\2\2\u04e1\35\3\2\2\2\u04e2\u04e3\7/\2\2\u04e3\u04e4\7") - buf.write("\u011d\2\2\u04e4\37\3\2\2\2\u04e5\u04e7\5\60\31\2\u04e6") - buf.write("\u04e5\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04e8\3\2\2\2") - buf.write("\u04e8\u04e9\5R*\2\u04e9\u04ea\5N(\2\u04ea!\3\2\2\2\u04eb") - buf.write("\u04ec\7y\2\2\u04ec\u04ee\7\u00ab\2\2\u04ed\u04ef\7\u00e5") - buf.write("\2\2\u04ee\u04ed\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f0") - buf.write("\3\2\2\2\u04f0\u04f7\5\u00acW\2\u04f1\u04f5\5&\24\2\u04f2") - buf.write("\u04f3\7p\2\2\u04f3\u04f4\7\u009b\2\2\u04f4\u04f6\7U\2") - buf.write("\2\u04f5\u04f2\3\2\2\2\u04f5\u04f6\3\2\2\2\u04f6\u04f8") - buf.write("\3\2\2\2\u04f7\u04f1\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8") - buf.write("\u0523\3\2\2\2\u04f9\u04fa\7y\2\2\u04fa\u04fc\7|\2\2\u04fb") - buf.write("\u04fd\7\u00e5\2\2\u04fc\u04fb\3\2\2\2\u04fc\u04fd\3\2") - buf.write("\2\2\u04fd\u04fe\3\2\2\2\u04fe\u0500\5\u00acW\2\u04ff") - buf.write("\u0501\5&\24\2\u0500\u04ff\3\2\2\2\u0500\u0501\3\2\2\2") - buf.write("\u0501\u0505\3\2\2\2\u0502\u0503\7p\2\2\u0503\u0504\7") - buf.write("\u009b\2\2\u0504\u0506\7U\2\2\u0505\u0502\3\2\2\2\u0505") - buf.write("\u0506\3\2\2\2\u0506\u0523\3\2\2\2\u0507\u0508\7y\2\2") - buf.write("\u0508\u050a\7\u00ab\2\2\u0509\u050b\7\u008b\2\2\u050a") - buf.write("\u0509\3\2\2\2\u050a\u050b\3\2\2\2\u050b\u050c\3\2\2\2") - buf.write("\u050c\u050d\7K\2\2\u050d\u050f\7\u011d\2\2\u050e\u0510") - buf.write("\5\u00a8U\2\u050f\u050e\3\2\2\2\u050f\u0510\3\2\2\2\u0510") - buf.write("\u0512\3\2\2\2\u0511\u0513\5D#\2\u0512\u0511\3\2\2\2\u0512") - buf.write("\u0513\3\2\2\2\u0513\u0523\3\2\2\2\u0514\u0515\7y\2\2") - buf.write("\u0515\u0517\7\u00ab\2\2\u0516\u0518\7\u008b\2\2\u0517") - buf.write("\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518\u0519\3\2\2\2") - buf.write("\u0519\u051b\7K\2\2\u051a\u051c\7\u011d\2\2\u051b\u051a") - buf.write("\3\2\2\2\u051b\u051c\3\2\2\2\u051c\u051d\3\2\2\2\u051d") - buf.write("\u0520\5\64\33\2\u051e\u051f\7\u00a2\2\2\u051f\u0521\5") - buf.write("8\35\2\u0520\u051e\3\2\2\2\u0520\u0521\3\2\2\2\u0521\u0523") - buf.write("\3\2\2\2\u0522\u04eb\3\2\2\2\u0522\u04f9\3\2\2\2\u0522") - buf.write("\u0507\3\2\2\2\u0522\u0514\3\2\2\2\u0523#\3\2\2\2\u0524") - buf.write("\u0526\5&\24\2\u0525\u0527\5\34\17\2\u0526\u0525\3\2\2") - buf.write("\2\u0526\u0527\3\2\2\2\u0527%\3\2\2\2\u0528\u0529\7\u00ac") - buf.write("\2\2\u0529\u052a\7\4\2\2\u052a\u052f\5(\25\2\u052b\u052c") - buf.write("\7\6\2\2\u052c\u052e\5(\25\2\u052d\u052b\3\2\2\2\u052e") - buf.write("\u0531\3\2\2\2\u052f\u052d\3\2\2\2\u052f\u0530\3\2\2\2") - buf.write("\u0530\u0532\3\2\2\2\u0531\u052f\3\2\2\2\u0532\u0533\7") - buf.write("\5\2\2\u0533\'\3\2\2\2\u0534\u0537\5\u0104\u0083\2\u0535") - buf.write("\u0536\7\u010a\2\2\u0536\u0538\5\u00c6d\2\u0537\u0535") - buf.write("\3\2\2\2\u0537\u0538\3\2\2\2\u0538)\3\2\2\2\u0539\u053a") - buf.write("\t\16\2\2\u053a+\3\2\2\2\u053b\u0541\5\u00fe\u0080\2\u053c") - buf.write("\u0541\7\u011d\2\2\u053d\u0541\5\u00c8e\2\u053e\u0541") - buf.write("\5\u00caf\2\u053f\u0541\5\u00ccg\2\u0540\u053b\3\2\2\2") - buf.write("\u0540\u053c\3\2\2\2\u0540\u053d\3\2\2\2\u0540\u053e\3") - buf.write("\2\2\2\u0540\u053f\3\2\2\2\u0541-\3\2\2\2\u0542\u0547") - buf.write("\5\u0104\u0083\2\u0543\u0544\7\7\2\2\u0544\u0546\5\u0104") - buf.write("\u0083\2\u0545\u0543\3\2\2\2\u0546\u0549\3\2\2\2\u0547") - buf.write("\u0545\3\2\2\2\u0547\u0548\3\2\2\2\u0548/\3\2\2\2\u0549") - buf.write("\u0547\3\2\2\2\u054a\u054b\7\u0108\2\2\u054b\u0550\5\62") - buf.write("\32\2\u054c\u054d\7\6\2\2\u054d\u054f\5\62\32\2\u054e") - buf.write("\u054c\3\2\2\2\u054f\u0552\3\2\2\2\u0550\u054e\3\2\2\2") - buf.write("\u0550\u0551\3\2\2\2\u0551\61\3\2\2\2\u0552\u0550\3\2") - buf.write("\2\2\u0553\u0555\5\u0100\u0081\2\u0554\u0556\5\u0094K") - buf.write("\2\u0555\u0554\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0558") - buf.write("\3\2\2\2\u0557\u0559\7\30\2\2\u0558\u0557\3\2\2\2\u0558") - buf.write("\u0559\3\2\2\2\u0559\u055a\3\2\2\2\u055a\u055b\7\4\2\2") - buf.write("\u055b\u055c\5 \21\2\u055c\u055d\7\5\2\2\u055d\63\3\2") - buf.write("\2\2\u055e\u055f\7\u0101\2\2\u055f\u0560\5\u00acW\2\u0560") - buf.write("\65\3\2\2\2\u0561\u0562\7\u00a2\2\2\u0562\u056c\58\35") - buf.write("\2\u0563\u0564\7\u00ad\2\2\u0564\u0565\7 \2\2\u0565\u056c") - buf.write("\5\u00b6\\\2\u0566\u056c\5\30\r\2\u0567\u056c\5\34\17") - buf.write("\2\u0568\u056c\5\36\20\2\u0569\u056a\7\u00e8\2\2\u056a") - buf.write("\u056c\58\35\2\u056b\u0561\3\2\2\2\u056b\u0563\3\2\2\2") - buf.write("\u056b\u0566\3\2\2\2\u056b\u0567\3\2\2\2\u056b\u0568\3") - buf.write("\2\2\2\u056b\u0569\3\2\2\2\u056c\u056f\3\2\2\2\u056d\u056b") - buf.write("\3\2\2\2\u056d\u056e\3\2\2\2\u056e\67\3\2\2\2\u056f\u056d") - buf.write("\3\2\2\2\u0570\u0571\7\4\2\2\u0571\u0576\5:\36\2\u0572") - buf.write("\u0573\7\6\2\2\u0573\u0575\5:\36\2\u0574\u0572\3\2\2\2") - buf.write("\u0575\u0578\3\2\2\2\u0576\u0574\3\2\2\2\u0576\u0577\3") - buf.write("\2\2\2\u0577\u0579\3\2\2\2\u0578\u0576\3\2\2\2\u0579\u057a") - buf.write("\7\5\2\2\u057a9\3\2\2\2\u057b\u0580\5<\37\2\u057c\u057e") - buf.write("\7\u010a\2\2\u057d\u057c\3\2\2\2\u057d\u057e\3\2\2\2\u057e") - buf.write("\u057f\3\2\2\2\u057f\u0581\5> \2\u0580\u057d\3\2\2\2\u0580") - buf.write("\u0581\3\2\2\2\u0581;\3\2\2\2\u0582\u0587\5\u0104\u0083") - buf.write("\2\u0583\u0584\7\7\2\2\u0584\u0586\5\u0104\u0083\2\u0585") - buf.write("\u0583\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2") - buf.write("\u0587\u0588\3\2\2\2\u0588\u058c\3\2\2\2\u0589\u0587\3") - buf.write("\2\2\2\u058a\u058c\7\u011d\2\2\u058b\u0582\3\2\2\2\u058b") - buf.write("\u058a\3\2\2\2\u058c=\3\2\2\2\u058d\u0592\7\u0121\2\2") - buf.write("\u058e\u0592\7\u0123\2\2\u058f\u0592\5\u00ceh\2\u0590") - buf.write("\u0592\7\u011d\2\2\u0591\u058d\3\2\2\2\u0591\u058e\3\2") - buf.write("\2\2\u0591\u058f\3\2\2\2\u0591\u0590\3\2\2\2\u0592?\3") - buf.write("\2\2\2\u0593\u0594\7\4\2\2\u0594\u0599\5\u00c6d\2\u0595") - buf.write("\u0596\7\6\2\2\u0596\u0598\5\u00c6d\2\u0597\u0595\3\2") - buf.write("\2\2\u0598\u059b\3\2\2\2\u0599\u0597\3\2\2\2\u0599\u059a") - buf.write("\3\2\2\2\u059a\u059c\3\2\2\2\u059b\u0599\3\2\2\2\u059c") - buf.write("\u059d\7\5\2\2\u059dA\3\2\2\2\u059e\u059f\7\4\2\2\u059f") - buf.write("\u05a4\5@!\2\u05a0\u05a1\7\6\2\2\u05a1\u05a3\5@!\2\u05a2") - buf.write("\u05a0\3\2\2\2\u05a3\u05a6\3\2\2\2\u05a4\u05a2\3\2\2\2") - buf.write("\u05a4\u05a5\3\2\2\2\u05a5\u05a7\3\2\2\2\u05a6\u05a4\3") - buf.write("\2\2\2\u05a7\u05a8\7\5\2\2\u05a8C\3\2\2\2\u05a9\u05aa") - buf.write("\7\u00e0\2\2\u05aa\u05ab\7\30\2\2\u05ab\u05b0\5F$\2\u05ac") - buf.write("\u05ad\7\u00e0\2\2\u05ad\u05ae\7 \2\2\u05ae\u05b0\5H%") - buf.write("\2\u05af\u05a9\3\2\2\2\u05af\u05ac\3\2\2\2\u05b0E\3\2") - buf.write("\2\2\u05b1\u05b2\7x\2\2\u05b2\u05b3\7\u011d\2\2\u05b3") - buf.write("\u05b4\7\u00a7\2\2\u05b4\u05b7\7\u011d\2\2\u05b5\u05b7") - buf.write("\5\u0104\u0083\2\u05b6\u05b1\3\2\2\2\u05b6\u05b5\3\2\2") - buf.write("\2\u05b7G\3\2\2\2\u05b8\u05bc\7\u011d\2\2\u05b9\u05ba") - buf.write("\7\u0108\2\2\u05ba\u05bb\7\u00d4\2\2\u05bb\u05bd\58\35") - buf.write("\2\u05bc\u05b9\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bdI\3\2") - buf.write("\2\2\u05be\u05bf\5\u0104\u0083\2\u05bf\u05c0\7\u011d\2") - buf.write("\2\u05c0K\3\2\2\2\u05c1\u05c2\5\"\22\2\u05c2\u05c3\5R") - buf.write("*\2\u05c3\u05c4\5N(\2\u05c4\u05f5\3\2\2\2\u05c5\u05c7") - buf.write("\5x=\2\u05c6\u05c8\5P)\2\u05c7\u05c6\3\2\2\2\u05c8\u05c9") - buf.write("\3\2\2\2\u05c9\u05c7\3\2\2\2\u05c9\u05ca\3\2\2\2\u05ca") - buf.write("\u05f5\3\2\2\2\u05cb\u05cc\7E\2\2\u05cc\u05cd\7f\2\2\u05cd") - buf.write("\u05ce\5\u00acW\2\u05ce\u05d0\5\u00a6T\2\u05cf\u05d1\5") - buf.write("p9\2\u05d0\u05cf\3\2\2\2\u05d0\u05d1\3\2\2\2\u05d1\u05f5") - buf.write("\3\2\2\2\u05d2\u05d3\7\u00fe\2\2\u05d3\u05d4\5\u00acW") - buf.write("\2\u05d4\u05d5\5\u00a6T\2\u05d5\u05d7\5b\62\2\u05d6\u05d8") - buf.write("\5p9\2\u05d7\u05d6\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05f5") - buf.write("\3\2\2\2\u05d9\u05da\7\u0093\2\2\u05da\u05db\7|\2\2\u05db") - buf.write("\u05dc\5\u00acW\2\u05dc\u05dd\5\u00a6T\2\u05dd\u05e3\7") - buf.write("\u0101\2\2\u05de\u05e4\5\u00acW\2\u05df\u05e0\7\4\2\2") - buf.write("\u05e0\u05e1\5 \21\2\u05e1\u05e2\7\5\2\2\u05e2\u05e4\3") - buf.write("\2\2\2\u05e3\u05de\3\2\2\2\u05e3\u05df\3\2\2\2\u05e4\u05e5") - buf.write("\3\2\2\2\u05e5\u05e6\5\u00a6T\2\u05e6\u05e7\7\u009f\2") - buf.write("\2\u05e7\u05eb\5\u00be`\2\u05e8\u05ea\5d\63\2\u05e9\u05e8") - buf.write("\3\2\2\2\u05ea\u05ed\3\2\2\2\u05eb\u05e9\3\2\2\2\u05eb") - buf.write("\u05ec\3\2\2\2\u05ec\u05f1\3\2\2\2\u05ed\u05eb\3\2\2\2") - buf.write("\u05ee\u05f0\5f\64\2\u05ef\u05ee\3\2\2\2\u05f0\u05f3\3") - buf.write("\2\2\2\u05f1\u05ef\3\2\2\2\u05f1\u05f2\3\2\2\2\u05f2\u05f5") - buf.write("\3\2\2\2\u05f3\u05f1\3\2\2\2\u05f4\u05c1\3\2\2\2\u05f4") - buf.write("\u05c5\3\2\2\2\u05f4\u05cb\3\2\2\2\u05f4\u05d2\3\2\2\2") - buf.write("\u05f4\u05d9\3\2\2\2\u05f5M\3\2\2\2\u05f6\u05f7\7\u00a4") - buf.write("\2\2\u05f7\u05f8\7 \2\2\u05f8\u05fd\5V,\2\u05f9\u05fa") - buf.write("\7\6\2\2\u05fa\u05fc\5V,\2\u05fb\u05f9\3\2\2\2\u05fc\u05ff") - buf.write("\3\2\2\2\u05fd\u05fb\3\2\2\2\u05fd\u05fe\3\2\2\2\u05fe") - buf.write("\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u0600\u05f6\3\2\2\2") - buf.write("\u0600\u0601\3\2\2\2\u0601\u060c\3\2\2\2\u0602\u0603\7") - buf.write("(\2\2\u0603\u0604\7 \2\2\u0604\u0609\5\u00bc_\2\u0605") - buf.write("\u0606\7\6\2\2\u0606\u0608\5\u00bc_\2\u0607\u0605\3\2") - buf.write("\2\2\u0608\u060b\3\2\2\2\u0609\u0607\3\2\2\2\u0609\u060a") - buf.write("\3\2\2\2\u060a\u060d\3\2\2\2\u060b\u0609\3\2\2\2\u060c") - buf.write("\u0602\3\2\2\2\u060c\u060d\3\2\2\2\u060d\u0618\3\2\2\2") - buf.write("\u060e\u060f\7M\2\2\u060f\u0610\7 \2\2\u0610\u0615\5\u00bc") - buf.write("_\2\u0611\u0612\7\6\2\2\u0612\u0614\5\u00bc_\2\u0613\u0611") - buf.write("\3\2\2\2\u0614\u0617\3\2\2\2\u0615\u0613\3\2\2\2\u0615") - buf.write("\u0616\3\2\2\2\u0616\u0619\3\2\2\2\u0617\u0615\3\2\2\2") - buf.write("\u0618\u060e\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0624\3") - buf.write("\2\2\2\u061a\u061b\7\u00dc\2\2\u061b\u061c\7 \2\2\u061c") - buf.write("\u0621\5V,\2\u061d\u061e\7\6\2\2\u061e\u0620\5V,\2\u061f") - buf.write("\u061d\3\2\2\2\u0620\u0623\3\2\2\2\u0621\u061f\3\2\2\2") - buf.write("\u0621\u0622\3\2\2\2\u0622\u0625\3\2\2\2\u0623\u0621\3") - buf.write("\2\2\2\u0624\u061a\3\2\2\2\u0624\u0625\3\2\2\2\u0625\u0627") - buf.write("\3\2\2\2\u0626\u0628\5\u00f0y\2\u0627\u0626\3\2\2\2\u0627") - buf.write("\u0628\3\2\2\2\u0628\u062e\3\2\2\2\u0629\u062c\7\u0087") - buf.write("\2\2\u062a\u062d\7\20\2\2\u062b\u062d\5\u00bc_\2\u062c") - buf.write("\u062a\3\2\2\2\u062c\u062b\3\2\2\2\u062d\u062f\3\2\2\2") - buf.write("\u062e\u0629\3\2\2\2\u062e\u062f\3\2\2\2\u062fO\3\2\2") - buf.write("\2\u0630\u0631\5\"\22\2\u0631\u0632\5Z.\2\u0632Q\3\2\2") - buf.write("\2\u0633\u0634\b*\1\2\u0634\u0635\5T+\2\u0635\u064d\3") - buf.write("\2\2\2\u0636\u0637\f\5\2\2\u0637\u0638\6*\5\2\u0638\u063a") - buf.write("\t\17\2\2\u0639\u063b\5\u0086D\2\u063a\u0639\3\2\2\2\u063a") - buf.write("\u063b\3\2\2\2\u063b\u063c\3\2\2\2\u063c\u064c\5R*\6\u063d") - buf.write("\u063e\f\4\2\2\u063e\u063f\6*\7\2\u063f\u0641\7z\2\2\u0640") - buf.write("\u0642\5\u0086D\2\u0641\u0640\3\2\2\2\u0641\u0642\3\2") - buf.write("\2\2\u0642\u0643\3\2\2\2\u0643\u064c\5R*\5\u0644\u0645") - buf.write("\f\3\2\2\u0645\u0646\6*\t\2\u0646\u0648\t\20\2\2\u0647") - buf.write("\u0649\5\u0086D\2\u0648\u0647\3\2\2\2\u0648\u0649\3\2") - buf.write("\2\2\u0649\u064a\3\2\2\2\u064a\u064c\5R*\4\u064b\u0636") - buf.write("\3\2\2\2\u064b\u063d\3\2\2\2\u064b\u0644\3\2\2\2\u064c") - buf.write("\u064f\3\2\2\2\u064d\u064b\3\2\2\2\u064d\u064e\3\2\2\2") - buf.write("\u064eS\3\2\2\2\u064f\u064d\3\2\2\2\u0650\u065a\5\\/\2") - buf.write("\u0651\u065a\5X-\2\u0652\u0653\7\u00e5\2\2\u0653\u065a") - buf.write("\5\u00acW\2\u0654\u065a\5\u00a2R\2\u0655\u0656\7\4\2\2") - buf.write("\u0656\u0657\5 \21\2\u0657\u0658\7\5\2\2\u0658\u065a\3") - buf.write("\2\2\2\u0659\u0650\3\2\2\2\u0659\u0651\3\2\2\2\u0659\u0652") - buf.write("\3\2\2\2\u0659\u0654\3\2\2\2\u0659\u0655\3\2\2\2\u065a") - buf.write("U\3\2\2\2\u065b\u065d\5\u00bc_\2\u065c\u065e\t\21\2\2") - buf.write("\u065d\u065c\3\2\2\2\u065d\u065e\3\2\2\2\u065e\u0661\3") - buf.write("\2\2\2\u065f\u0660\7\u009d\2\2\u0660\u0662\t\22\2\2\u0661") - buf.write("\u065f\3\2\2\2\u0661\u0662\3\2\2\2\u0662W\3\2\2\2\u0663") - buf.write("\u0665\5x=\2\u0664\u0666\5Z.\2\u0665\u0664\3\2\2\2\u0666") - buf.write("\u0667\3\2\2\2\u0667\u0665\3\2\2\2\u0667\u0668\3\2\2\2") - buf.write("\u0668Y\3\2\2\2\u0669\u066b\5^\60\2\u066a\u066c\5p9\2") - buf.write("\u066b\u066a\3\2\2\2\u066b\u066c\3\2\2\2\u066c\u066d\3") - buf.write("\2\2\2\u066d\u066e\5N(\2\u066e\u0685\3\2\2\2\u066f\u0673") - buf.write("\5`\61\2\u0670\u0672\5\u0084C\2\u0671\u0670\3\2\2\2\u0672") - buf.write("\u0675\3\2\2\2\u0673\u0671\3\2\2\2\u0673\u0674\3\2\2\2") - buf.write("\u0674\u0677\3\2\2\2\u0675\u0673\3\2\2\2\u0676\u0678\5") - buf.write("p9\2\u0677\u0676\3\2\2\2\u0677\u0678\3\2\2\2\u0678\u067a") - buf.write("\3\2\2\2\u0679\u067b\5z>\2\u067a\u0679\3\2\2\2\u067a\u067b") - buf.write("\3\2\2\2\u067b\u067d\3\2\2\2\u067c\u067e\5r:\2\u067d\u067c") - buf.write("\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u0680\3\2\2\2\u067f") - buf.write("\u0681\5\u00f0y\2\u0680\u067f\3\2\2\2\u0680\u0681\3\2") - buf.write("\2\2\u0681\u0682\3\2\2\2\u0682\u0683\5N(\2\u0683\u0685") - buf.write("\3\2\2\2\u0684\u0669\3\2\2\2\u0684\u066f\3\2\2\2\u0685") - buf.write("[\3\2\2\2\u0686\u0688\5^\60\2\u0687\u0689\5x=\2\u0688") - buf.write("\u0687\3\2\2\2\u0688\u0689\3\2\2\2\u0689\u068b\3\2\2\2") - buf.write("\u068a\u068c\5p9\2\u068b\u068a\3\2\2\2\u068b\u068c\3\2") - buf.write("\2\2\u068c\u06a4\3\2\2\2\u068d\u068f\5`\61\2\u068e\u0690") - buf.write("\5x=\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0694") - buf.write("\3\2\2\2\u0691\u0693\5\u0084C\2\u0692\u0691\3\2\2\2\u0693") - buf.write("\u0696\3\2\2\2\u0694\u0692\3\2\2\2\u0694\u0695\3\2\2\2") - buf.write("\u0695\u0698\3\2\2\2\u0696\u0694\3\2\2\2\u0697\u0699\5") - buf.write("p9\2\u0698\u0697\3\2\2\2\u0698\u0699\3\2\2\2\u0699\u069b") - buf.write("\3\2\2\2\u069a\u069c\5z>\2\u069b\u069a\3\2\2\2\u069b\u069c") - buf.write("\3\2\2\2\u069c\u069e\3\2\2\2\u069d\u069f\5r:\2\u069e\u069d") - buf.write("\3\2\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0") - buf.write("\u06a2\5\u00f0y\2\u06a1\u06a0\3\2\2\2\u06a1\u06a2\3\2") - buf.write("\2\2\u06a2\u06a4\3\2\2\2\u06a3\u0686\3\2\2\2\u06a3\u068d") - buf.write("\3\2\2\2\u06a4]\3\2\2\2\u06a5\u06a6\7\u00d0\2\2\u06a6") - buf.write("\u06a7\7\u00f1\2\2\u06a7\u06a8\7\4\2\2\u06a8\u06a9\5\u00b4") - buf.write("[\2\u06a9\u06aa\7\5\2\2\u06aa\u06b0\3\2\2\2\u06ab\u06ac") - buf.write("\7\u0091\2\2\u06ac\u06b0\5\u00b4[\2\u06ad\u06ae\7\u00bd") - buf.write("\2\2\u06ae\u06b0\5\u00b4[\2\u06af\u06a5\3\2\2\2\u06af") - buf.write("\u06ab\3\2\2\2\u06af\u06ad\3\2\2\2\u06b0\u06b2\3\2\2\2") - buf.write("\u06b1\u06b3\5\u00a8U\2\u06b2\u06b1\3\2\2\2\u06b2\u06b3") - buf.write("\3\2\2\2\u06b3\u06b6\3\2\2\2\u06b4\u06b5\7\u00bb\2\2\u06b5") - buf.write("\u06b7\7\u011d\2\2\u06b6\u06b4\3\2\2\2\u06b6\u06b7\3\2") - buf.write("\2\2\u06b7\u06b8\3\2\2\2\u06b8\u06b9\7\u0101\2\2\u06b9") - buf.write("\u06c6\7\u011d\2\2\u06ba\u06c4\7\30\2\2\u06bb\u06c5\5") - buf.write("\u0096L\2\u06bc\u06c5\5\u00e6t\2\u06bd\u06c0\7\4\2\2\u06be") - buf.write("\u06c1\5\u0096L\2\u06bf\u06c1\5\u00e6t\2\u06c0\u06be\3") - buf.write("\2\2\2\u06c0\u06bf\3\2\2\2\u06c1\u06c2\3\2\2\2\u06c2\u06c3") - buf.write("\7\5\2\2\u06c3\u06c5\3\2\2\2\u06c4\u06bb\3\2\2\2\u06c4") - buf.write("\u06bc\3\2\2\2\u06c4\u06bd\3\2\2\2\u06c5\u06c7\3\2\2\2") - buf.write("\u06c6\u06ba\3\2\2\2\u06c6\u06c7\3\2\2\2\u06c7\u06c9\3") - buf.write("\2\2\2\u06c8\u06ca\5\u00a8U\2\u06c9\u06c8\3\2\2\2\u06c9") - buf.write("\u06ca\3\2\2\2\u06ca\u06cd\3\2\2\2\u06cb\u06cc\7\u00ba") - buf.write("\2\2\u06cc\u06ce\7\u011d\2\2\u06cd\u06cb\3\2\2\2\u06cd") - buf.write("\u06ce\3\2\2\2\u06ce_\3\2\2\2\u06cf\u06d3\7\u00d0\2\2") - buf.write("\u06d0\u06d2\5t;\2\u06d1\u06d0\3\2\2\2\u06d2\u06d5\3\2") - buf.write("\2\2\u06d3\u06d1\3\2\2\2\u06d3\u06d4\3\2\2\2\u06d4\u06d7") - buf.write("\3\2\2\2\u06d5\u06d3\3\2\2\2\u06d6\u06d8\5\u0086D\2\u06d7") - buf.write("\u06d6\3\2\2\2\u06d7\u06d8\3\2\2\2\u06d8\u06d9\3\2\2\2") - buf.write("\u06d9\u06da\5\u00b4[\2\u06daa\3\2\2\2\u06db\u06dc\7\u00d6") - buf.write("\2\2\u06dc\u06dd\5l\67\2\u06ddc\3\2\2\2\u06de\u06df\7") - buf.write("\u0105\2\2\u06df\u06e2\7\u0092\2\2\u06e0\u06e1\7\23\2") - buf.write("\2\u06e1\u06e3\5\u00be`\2\u06e2\u06e0\3\2\2\2\u06e2\u06e3") - buf.write("\3\2\2\2\u06e3\u06e4\3\2\2\2\u06e4\u06e5\7\u00eb\2\2\u06e5") - buf.write("\u06e6\5h\65\2\u06e6e\3\2\2\2\u06e7\u06e8\7\u0105\2\2") - buf.write("\u06e8\u06e9\7\u009b\2\2\u06e9\u06ec\7\u0092\2\2\u06ea") - buf.write("\u06eb\7\23\2\2\u06eb\u06ed\5\u00be`\2\u06ec\u06ea\3\2") - buf.write("\2\2\u06ec\u06ed\3\2\2\2\u06ed\u06ee\3\2\2\2\u06ee\u06ef") - buf.write("\7\u00eb\2\2\u06ef\u06f0\5j\66\2\u06f0g\3\2\2\2\u06f1") - buf.write("\u06f9\7E\2\2\u06f2\u06f3\7\u00fe\2\2\u06f3\u06f4\7\u00d6") - buf.write("\2\2\u06f4\u06f9\7\u0114\2\2\u06f5\u06f6\7\u00fe\2\2\u06f6") - buf.write("\u06f7\7\u00d6\2\2\u06f7\u06f9\5l\67\2\u06f8\u06f1\3\2") - buf.write("\2\2\u06f8\u06f2\3\2\2\2\u06f8\u06f5\3\2\2\2\u06f9i\3") - buf.write("\2\2\2\u06fa\u06fb\7y\2\2\u06fb\u070d\7\u0114\2\2\u06fc") - buf.write("\u06fd\7y\2\2\u06fd\u06fe\7\4\2\2\u06fe\u06ff\5\u00aa") - buf.write("V\2\u06ff\u0700\7\5\2\2\u0700\u0701\7\u0102\2\2\u0701") - buf.write("\u0702\7\4\2\2\u0702\u0707\5\u00bc_\2\u0703\u0704\7\6") - buf.write("\2\2\u0704\u0706\5\u00bc_\2\u0705\u0703\3\2\2\2\u0706") - buf.write("\u0709\3\2\2\2\u0707\u0705\3\2\2\2\u0707\u0708\3\2\2\2") - buf.write("\u0708\u070a\3\2\2\2\u0709\u0707\3\2\2\2\u070a\u070b\7") - buf.write("\5\2\2\u070b\u070d\3\2\2\2\u070c\u06fa\3\2\2\2\u070c\u06fc") - buf.write("\3\2\2\2\u070dk\3\2\2\2\u070e\u0713\5n8\2\u070f\u0710") - buf.write("\7\6\2\2\u0710\u0712\5n8\2\u0711\u070f\3\2\2\2\u0712\u0715") - buf.write("\3\2\2\2\u0713\u0711\3\2\2\2\u0713\u0714\3\2\2\2\u0714") - buf.write("m\3\2\2\2\u0715\u0713\3\2\2\2\u0716\u0717\5\u00acW\2\u0717") - buf.write("\u0718\7\u010a\2\2\u0718\u0719\5\u00bc_\2\u0719o\3\2\2") - buf.write("\2\u071a\u071b\7\u0106\2\2\u071b\u071c\5\u00be`\2\u071c") - buf.write("q\3\2\2\2\u071d\u071e\7n\2\2\u071e\u071f\5\u00be`\2\u071f") - buf.write("s\3\2\2\2\u0720\u0721\7\b\2\2\u0721\u0728\5v<\2\u0722") - buf.write("\u0724\7\6\2\2\u0723\u0722\3\2\2\2\u0723\u0724\3\2\2\2") - buf.write("\u0724\u0725\3\2\2\2\u0725\u0727\5v<\2\u0726\u0723\3\2") - buf.write("\2\2\u0727\u072a\3\2\2\2\u0728\u0726\3\2\2\2\u0728\u0729") - buf.write("\3\2\2\2\u0729\u072b\3\2\2\2\u072a\u0728\3\2\2\2\u072b") - buf.write("\u072c\7\t\2\2\u072cu\3\2\2\2\u072d\u073b\5\u0104\u0083") - buf.write("\2\u072e\u072f\5\u0104\u0083\2\u072f\u0730\7\4\2\2\u0730") - buf.write("\u0735\5\u00c4c\2\u0731\u0732\7\6\2\2\u0732\u0734\5\u00c4") - buf.write("c\2\u0733\u0731\3\2\2\2\u0734\u0737\3\2\2\2\u0735\u0733") - buf.write("\3\2\2\2\u0735\u0736\3\2\2\2\u0736\u0738\3\2\2\2\u0737") - buf.write("\u0735\3\2\2\2\u0738\u0739\7\5\2\2\u0739\u073b\3\2\2\2") - buf.write("\u073a\u072d\3\2\2\2\u073a\u072e\3\2\2\2\u073bw\3\2\2") - buf.write("\2\u073c\u073d\7f\2\2\u073d\u0742\5\u0088E\2\u073e\u073f") - buf.write("\7\6\2\2\u073f\u0741\5\u0088E\2\u0740\u073e\3\2\2\2\u0741") - buf.write("\u0744\3\2\2\2\u0742\u0740\3\2\2\2\u0742\u0743\3\2\2\2") - buf.write("\u0743\u0748\3\2\2\2\u0744\u0742\3\2\2\2\u0745\u0747\5") - buf.write("\u0084C\2\u0746\u0745\3\2\2\2\u0747\u074a\3\2\2\2\u0748") - buf.write("\u0746\3\2\2\2\u0748\u0749\3\2\2\2\u0749\u074c\3\2\2\2") - buf.write("\u074a\u0748\3\2\2\2\u074b\u074d\5~@\2\u074c\u074b\3\2") - buf.write("\2\2\u074c\u074d\3\2\2\2\u074dy\3\2\2\2\u074e\u074f\7") - buf.write("l\2\2\u074f\u0750\7 \2\2\u0750\u0755\5\u00bc_\2\u0751") - buf.write("\u0752\7\6\2\2\u0752\u0754\5\u00bc_\2\u0753\u0751\3\2") - buf.write("\2\2\u0754\u0757\3\2\2\2\u0755\u0753\3\2\2\2\u0755\u0756") - buf.write("\3\2\2\2\u0756\u0769\3\2\2\2\u0757\u0755\3\2\2\2\u0758") - buf.write("\u0759\7\u0108\2\2\u0759\u076a\7\u00cb\2\2\u075a\u075b") - buf.write("\7\u0108\2\2\u075b\u076a\79\2\2\u075c\u075d\7m\2\2\u075d") - buf.write("\u075e\7\u00d8\2\2\u075e\u075f\7\4\2\2\u075f\u0764\5|") - buf.write("?\2\u0760\u0761\7\6\2\2\u0761\u0763\5|?\2\u0762\u0760") - buf.write("\3\2\2\2\u0763\u0766\3\2\2\2\u0764\u0762\3\2\2\2\u0764") - buf.write("\u0765\3\2\2\2\u0765\u0767\3\2\2\2\u0766\u0764\3\2\2\2") - buf.write("\u0767\u0768\7\5\2\2\u0768\u076a\3\2\2\2\u0769\u0758\3") - buf.write("\2\2\2\u0769\u075a\3\2\2\2\u0769\u075c\3\2\2\2\u0769\u076a") - buf.write("\3\2\2\2\u076a\u077b\3\2\2\2\u076b\u076c\7l\2\2\u076c") - buf.write("\u076d\7 \2\2\u076d\u076e\7m\2\2\u076e\u076f\7\u00d8\2") - buf.write("\2\u076f\u0770\7\4\2\2\u0770\u0775\5|?\2\u0771\u0772\7") - buf.write("\6\2\2\u0772\u0774\5|?\2\u0773\u0771\3\2\2\2\u0774\u0777") - buf.write("\3\2\2\2\u0775\u0773\3\2\2\2\u0775\u0776\3\2\2\2\u0776") - buf.write("\u0778\3\2\2\2\u0777\u0775\3\2\2\2\u0778\u0779\7\5\2\2") - buf.write("\u0779\u077b\3\2\2\2\u077a\u074e\3\2\2\2\u077a\u076b\3") - buf.write("\2\2\2\u077b{\3\2\2\2\u077c\u0785\7\4\2\2\u077d\u0782") - buf.write("\5\u00bc_\2\u077e\u077f\7\6\2\2\u077f\u0781\5\u00bc_\2") - buf.write("\u0780\u077e\3\2\2\2\u0781\u0784\3\2\2\2\u0782\u0780\3") - buf.write("\2\2\2\u0782\u0783\3\2\2\2\u0783\u0786\3\2\2\2\u0784\u0782") - buf.write("\3\2\2\2\u0785\u077d\3\2\2\2\u0785\u0786\3\2\2\2\u0786") - buf.write("\u0787\3\2\2\2\u0787\u078a\7\5\2\2\u0788\u078a\5\u00bc") - buf.write("_\2\u0789\u077c\3\2\2\2\u0789\u0788\3\2\2\2\u078a}\3\2") - buf.write("\2\2\u078b\u078c\7\u00b0\2\2\u078c\u078d\7\4\2\2\u078d") - buf.write("\u078e\5\u00b4[\2\u078e\u078f\7b\2\2\u078f\u0790\5\u0080") - buf.write("A\2\u0790\u0791\7s\2\2\u0791\u0792\7\4\2\2\u0792\u0797") - buf.write("\5\u0082B\2\u0793\u0794\7\6\2\2\u0794\u0796\5\u0082B\2") - buf.write("\u0795\u0793\3\2\2\2\u0796\u0799\3\2\2\2\u0797\u0795\3") - buf.write("\2\2\2\u0797\u0798\3\2\2\2\u0798\u079a\3\2\2\2\u0799\u0797") - buf.write("\3\2\2\2\u079a\u079b\7\5\2\2\u079b\u079c\7\5\2\2\u079c") - buf.write("\177\3\2\2\2\u079d\u07aa\5\u0104\u0083\2\u079e\u079f\7") - buf.write("\4\2\2\u079f\u07a4\5\u0104\u0083\2\u07a0\u07a1\7\6\2\2") - buf.write("\u07a1\u07a3\5\u0104\u0083\2\u07a2\u07a0\3\2\2\2\u07a3") - buf.write("\u07a6\3\2\2\2\u07a4\u07a2\3\2\2\2\u07a4\u07a5\3\2\2\2") - buf.write("\u07a5\u07a7\3\2\2\2\u07a6\u07a4\3\2\2\2\u07a7\u07a8\7") - buf.write("\5\2\2\u07a8\u07aa\3\2\2\2\u07a9\u079d\3\2\2\2\u07a9\u079e") - buf.write("\3\2\2\2\u07aa\u0081\3\2\2\2\u07ab\u07b0\5\u00bc_\2\u07ac") - buf.write("\u07ae\7\30\2\2\u07ad\u07ac\3\2\2\2\u07ad\u07ae\3\2\2") - buf.write("\2\u07ae\u07af\3\2\2\2\u07af\u07b1\5\u0104\u0083\2\u07b0") - buf.write("\u07ad\3\2\2\2\u07b0\u07b1\3\2\2\2\u07b1\u0083\3\2\2\2") - buf.write("\u07b2\u07b3\7\u0082\2\2\u07b3\u07b5\7\u0103\2\2\u07b4") - buf.write("\u07b6\7\u00a6\2\2\u07b5\u07b4\3\2\2\2\u07b5\u07b6\3\2") - buf.write("\2\2\u07b6\u07b7\3\2\2\2\u07b7\u07b8\5\u00fe\u0080\2\u07b8") - buf.write("\u07c1\7\4\2\2\u07b9\u07be\5\u00bc_\2\u07ba\u07bb\7\6") - buf.write("\2\2\u07bb\u07bd\5\u00bc_\2\u07bc\u07ba\3\2\2\2\u07bd") - buf.write("\u07c0\3\2\2\2\u07be\u07bc\3\2\2\2\u07be\u07bf\3\2\2\2") - buf.write("\u07bf\u07c2\3\2\2\2\u07c0\u07be\3\2\2\2\u07c1\u07b9\3") - buf.write("\2\2\2\u07c1\u07c2\3\2\2\2\u07c2\u07c3\3\2\2\2\u07c3\u07c4") - buf.write("\7\5\2\2\u07c4\u07d0\5\u0104\u0083\2\u07c5\u07c7\7\30") - buf.write("\2\2\u07c6\u07c5\3\2\2\2\u07c6\u07c7\3\2\2\2\u07c7\u07c8") - buf.write("\3\2\2\2\u07c8\u07cd\5\u0104\u0083\2\u07c9\u07ca\7\6\2") - buf.write("\2\u07ca\u07cc\5\u0104\u0083\2\u07cb\u07c9\3\2\2\2\u07cc") - buf.write("\u07cf\3\2\2\2\u07cd\u07cb\3\2\2\2\u07cd\u07ce\3\2\2\2") - buf.write("\u07ce\u07d1\3\2\2\2\u07cf\u07cd\3\2\2\2\u07d0\u07c6\3") - buf.write("\2\2\2\u07d0\u07d1\3\2\2\2\u07d1\u0085\3\2\2\2\u07d2\u07d3") - buf.write("\t\23\2\2\u07d3\u0087\3\2\2\2\u07d4\u07d8\5\u00a0Q\2\u07d5") - buf.write("\u07d7\5\u008aF\2\u07d6\u07d5\3\2\2\2\u07d7\u07da\3\2") - buf.write("\2\2\u07d8\u07d6\3\2\2\2\u07d8\u07d9\3\2\2\2\u07d9\u0089") - buf.write("\3\2\2\2\u07da\u07d8\3\2\2\2\u07db\u07dc\5\u008cG\2\u07dc") - buf.write("\u07dd\7\177\2\2\u07dd\u07df\5\u00a0Q\2\u07de\u07e0\5") - buf.write("\u008eH\2\u07df\u07de\3\2\2\2\u07df\u07e0\3\2\2\2\u07e0") - buf.write("\u07e7\3\2\2\2\u07e1\u07e2\7\u0099\2\2\u07e2\u07e3\5\u008c") - buf.write("G\2\u07e3\u07e4\7\177\2\2\u07e4\u07e5\5\u00a0Q\2\u07e5") - buf.write("\u07e7\3\2\2\2\u07e6\u07db\3\2\2\2\u07e6\u07e1\3\2\2\2") - buf.write("\u07e7\u008b\3\2\2\2\u07e8\u07ea\7v\2\2\u07e9\u07e8\3") - buf.write("\2\2\2\u07e9\u07ea\3\2\2\2\u07ea\u0801\3\2\2\2\u07eb\u0801") - buf.write("\78\2\2\u07ec\u07ee\7\u0085\2\2\u07ed\u07ef\7\u00a6\2") - buf.write("\2\u07ee\u07ed\3\2\2\2\u07ee\u07ef\3\2\2\2\u07ef\u0801") - buf.write("\3\2\2\2\u07f0\u07f2\7\u0085\2\2\u07f1\u07f0\3\2\2\2\u07f1") - buf.write("\u07f2\3\2\2\2\u07f2\u07f3\3\2\2\2\u07f3\u0801\7\u00d1") - buf.write("\2\2\u07f4\u07f6\7\u00c6\2\2\u07f5\u07f7\7\u00a6\2\2\u07f6") - buf.write("\u07f5\3\2\2\2\u07f6\u07f7\3\2\2\2\u07f7\u0801\3\2\2\2") - buf.write("\u07f8\u07fa\7g\2\2\u07f9\u07fb\7\u00a6\2\2\u07fa\u07f9") - buf.write("\3\2\2\2\u07fa\u07fb\3\2\2\2\u07fb\u0801\3\2\2\2\u07fc") - buf.write("\u07fe\7\u0085\2\2\u07fd\u07fc\3\2\2\2\u07fd\u07fe\3\2") - buf.write("\2\2\u07fe\u07ff\3\2\2\2\u07ff\u0801\7\24\2\2\u0800\u07e9") - buf.write("\3\2\2\2\u0800\u07eb\3\2\2\2\u0800\u07ec\3\2\2\2\u0800") - buf.write("\u07f1\3\2\2\2\u0800\u07f4\3\2\2\2\u0800\u07f8\3\2\2\2") - buf.write("\u0800\u07fd\3\2\2\2\u0801\u008d\3\2\2\2\u0802\u0803\7") - buf.write("\u009f\2\2\u0803\u0807\5\u00be`\2\u0804\u0805\7\u0101") - buf.write("\2\2\u0805\u0807\5\u0094K\2\u0806\u0802\3\2\2\2\u0806") - buf.write("\u0804\3\2\2\2\u0807\u008f\3\2\2\2\u0808\u0809\7\u00e7") - buf.write("\2\2\u0809\u080b\7\4\2\2\u080a\u080c\5\u0092J\2\u080b") - buf.write("\u080a\3\2\2\2\u080b\u080c\3\2\2\2\u080c\u080d\3\2\2\2") - buf.write("\u080d\u080e\7\5\2\2\u080e\u0091\3\2\2\2\u080f\u0811\7") - buf.write("\u0113\2\2\u0810\u080f\3\2\2\2\u0810\u0811\3\2\2\2\u0811") - buf.write("\u0812\3\2\2\2\u0812\u0813\t\24\2\2\u0813\u0828\7\u00af") - buf.write("\2\2\u0814\u0815\5\u00bc_\2\u0815\u0816\7\u00cd\2\2\u0816") - buf.write("\u0828\3\2\2\2\u0817\u0818\7\36\2\2\u0818\u0819\7\u0121") - buf.write("\2\2\u0819\u081a\7\u00a5\2\2\u081a\u081b\7\u009e\2\2\u081b") - buf.write("\u0824\7\u0121\2\2\u081c\u0822\7\u009f\2\2\u081d\u0823") - buf.write("\5\u0104\u0083\2\u081e\u081f\5\u00fe\u0080\2\u081f\u0820") - buf.write("\7\4\2\2\u0820\u0821\7\5\2\2\u0821\u0823\3\2\2\2\u0822") - buf.write("\u081d\3\2\2\2\u0822\u081e\3\2\2\2\u0823\u0825\3\2\2\2") - buf.write("\u0824\u081c\3\2\2\2\u0824\u0825\3\2\2\2\u0825\u0828\3") - buf.write("\2\2\2\u0826\u0828\5\u00bc_\2\u0827\u0810\3\2\2\2\u0827") - buf.write("\u0814\3\2\2\2\u0827\u0817\3\2\2\2\u0827\u0826\3\2\2\2") - buf.write("\u0828\u0093\3\2\2\2\u0829\u082a\7\4\2\2\u082a\u082b\5") - buf.write("\u0096L\2\u082b\u082c\7\5\2\2\u082c\u0095\3\2\2\2\u082d") - buf.write("\u0832\5\u0100\u0081\2\u082e\u082f\7\6\2\2\u082f\u0831") - buf.write("\5\u0100\u0081\2\u0830\u082e\3\2\2\2\u0831\u0834\3\2\2") - buf.write("\2\u0832\u0830\3\2\2\2\u0832\u0833\3\2\2\2\u0833\u0097") - buf.write("\3\2\2\2\u0834\u0832\3\2\2\2\u0835\u0836\7\4\2\2\u0836") - buf.write("\u083b\5\u009aN\2\u0837\u0838\7\6\2\2\u0838\u083a\5\u009a") - buf.write("N\2\u0839\u0837\3\2\2\2\u083a\u083d\3\2\2\2\u083b\u0839") - buf.write("\3\2\2\2\u083b\u083c\3\2\2\2\u083c\u083e\3\2\2\2\u083d") - buf.write("\u083b\3\2\2\2\u083e\u083f\7\5\2\2\u083f\u0099\3\2\2\2") - buf.write("\u0840\u0842\5\u0100\u0081\2\u0841\u0843\t\21\2\2\u0842") - buf.write("\u0841\3\2\2\2\u0842\u0843\3\2\2\2\u0843\u009b\3\2\2\2") - buf.write("\u0844\u0845\7\4\2\2\u0845\u084a\5\u009eP\2\u0846\u0847") - buf.write("\7\6\2\2\u0847\u0849\5\u009eP\2\u0848\u0846\3\2\2\2\u0849") - buf.write("\u084c\3\2\2\2\u084a\u0848\3\2\2\2\u084a\u084b\3\2\2\2") - buf.write("\u084b\u084d\3\2\2\2\u084c\u084a\3\2\2\2\u084d\u084e\7") - buf.write("\5\2\2\u084e\u009d\3\2\2\2\u084f\u0851\5\u0104\u0083\2") - buf.write("\u0850\u0852\5\36\20\2\u0851\u0850\3\2\2\2\u0851\u0852") - buf.write("\3\2\2\2\u0852\u009f\3\2\2\2\u0853\u0855\5\u00acW\2\u0854") - buf.write("\u0856\5\u0090I\2\u0855\u0854\3\2\2\2\u0855\u0856\3\2") - buf.write("\2\2\u0856\u0857\3\2\2\2\u0857\u0858\5\u00a6T\2\u0858") - buf.write("\u086c\3\2\2\2\u0859\u085a\7\4\2\2\u085a\u085b\5 \21\2") - buf.write("\u085b\u085d\7\5\2\2\u085c\u085e\5\u0090I\2\u085d\u085c") - buf.write("\3\2\2\2\u085d\u085e\3\2\2\2\u085e\u085f\3\2\2\2\u085f") - buf.write("\u0860\5\u00a6T\2\u0860\u086c\3\2\2\2\u0861\u0862\7\4") - buf.write("\2\2\u0862\u0863\5\u0088E\2\u0863\u0865\7\5\2\2\u0864") - buf.write("\u0866\5\u0090I\2\u0865\u0864\3\2\2\2\u0865\u0866\3\2") - buf.write("\2\2\u0866\u0867\3\2\2\2\u0867\u0868\5\u00a6T\2\u0868") - buf.write("\u086c\3\2\2\2\u0869\u086c\5\u00a2R\2\u086a\u086c\5\u00a4") - buf.write("S\2\u086b\u0853\3\2\2\2\u086b\u0859\3\2\2\2\u086b\u0861") - buf.write("\3\2\2\2\u086b\u0869\3\2\2\2\u086b\u086a\3\2\2\2\u086c") - buf.write("\u00a1\3\2\2\2\u086d\u086e\7\u0102\2\2\u086e\u0873\5\u00bc") - buf.write("_\2\u086f\u0870\7\6\2\2\u0870\u0872\5\u00bc_\2\u0871\u086f") - buf.write("\3\2\2\2\u0872\u0875\3\2\2\2\u0873\u0871\3\2\2\2\u0873") - buf.write("\u0874\3\2\2\2\u0874\u0876\3\2\2\2\u0875\u0873\3\2\2\2") - buf.write("\u0876\u0877\5\u00a6T\2\u0877\u00a3\3\2\2\2\u0878\u0879") - buf.write("\5\u0100\u0081\2\u0879\u0882\7\4\2\2\u087a\u087f\5\u00bc") - buf.write("_\2\u087b\u087c\7\6\2\2\u087c\u087e\5\u00bc_\2\u087d\u087b") - buf.write("\3\2\2\2\u087e\u0881\3\2\2\2\u087f\u087d\3\2\2\2\u087f") - buf.write("\u0880\3\2\2\2\u0880\u0883\3\2\2\2\u0881\u087f\3\2\2\2") - buf.write("\u0882\u087a\3\2\2\2\u0882\u0883\3\2\2\2\u0883\u0884\3") - buf.write("\2\2\2\u0884\u0885\7\5\2\2\u0885\u0886\5\u00a6T\2\u0886") - buf.write("\u00a5\3\2\2\2\u0887\u0889\7\30\2\2\u0888\u0887\3\2\2") - buf.write("\2\u0888\u0889\3\2\2\2\u0889\u088a\3\2\2\2\u088a\u088c") - buf.write("\5\u0106\u0084\2\u088b\u088d\5\u0094K\2\u088c\u088b\3") - buf.write("\2\2\2\u088c\u088d\3\2\2\2\u088d\u088f\3\2\2\2\u088e\u0888") - buf.write("\3\2\2\2\u088e\u088f\3\2\2\2\u088f\u00a7\3\2\2\2\u0890") - buf.write("\u0891\7\u00cc\2\2\u0891\u0892\7d\2\2\u0892\u0893\7\u00d3") - buf.write("\2\2\u0893\u0897\7\u011d\2\2\u0894\u0895\7\u0108\2\2\u0895") - buf.write("\u0896\7\u00d4\2\2\u0896\u0898\58\35\2\u0897\u0894\3\2") - buf.write("\2\2\u0897\u0898\3\2\2\2\u0898\u08c2\3\2\2\2\u0899\u089a") - buf.write("\7\u00cc\2\2\u089a\u089b\7d\2\2\u089b\u08a5\7F\2\2\u089c") - buf.write("\u089d\7]\2\2\u089d\u089e\7\u00ea\2\2\u089e\u089f\7 \2") - buf.write("\2\u089f\u08a3\7\u011d\2\2\u08a0\u08a1\7R\2\2\u08a1\u08a2") - buf.write("\7 \2\2\u08a2\u08a4\7\u011d\2\2\u08a3\u08a0\3\2\2\2\u08a3") - buf.write("\u08a4\3\2\2\2\u08a4\u08a6\3\2\2\2\u08a5\u089c\3\2\2\2") - buf.write("\u08a5\u08a6\3\2\2\2\u08a6\u08ac\3\2\2\2\u08a7\u08a8\7") - buf.write(",\2\2\u08a8\u08a9\7~\2\2\u08a9\u08aa\7\u00ea\2\2\u08aa") - buf.write("\u08ab\7 \2\2\u08ab\u08ad\7\u011d\2\2\u08ac\u08a7\3\2") - buf.write("\2\2\u08ac\u08ad\3\2\2\2\u08ad\u08b3\3\2\2\2\u08ae\u08af") - buf.write("\7\u0091\2\2\u08af\u08b0\7\u0080\2\2\u08b0\u08b1\7\u00ea") - buf.write("\2\2\u08b1\u08b2\7 \2\2\u08b2\u08b4\7\u011d\2\2\u08b3") - buf.write("\u08ae\3\2\2\2\u08b3\u08b4\3\2\2\2\u08b4\u08b9\3\2\2\2") - buf.write("\u08b5\u08b6\7\u0088\2\2\u08b6\u08b7\7\u00ea\2\2\u08b7") - buf.write("\u08b8\7 \2\2\u08b8\u08ba\7\u011d\2\2\u08b9\u08b5\3\2") - buf.write("\2\2\u08b9\u08ba\3\2\2\2\u08ba\u08bf\3\2\2\2\u08bb\u08bc") - buf.write("\7\u009c\2\2\u08bc\u08bd\7D\2\2\u08bd\u08be\7\30\2\2\u08be") - buf.write("\u08c0\7\u011d\2\2\u08bf\u08bb\3\2\2\2\u08bf\u08c0\3\2") - buf.write("\2\2\u08c0\u08c2\3\2\2\2\u08c1\u0890\3\2\2\2\u08c1\u0899") - buf.write("\3\2\2\2\u08c2\u00a9\3\2\2\2\u08c3\u08c8\5\u00acW\2\u08c4") - buf.write("\u08c5\7\6\2\2\u08c5\u08c7\5\u00acW\2\u08c6\u08c4\3\2") - buf.write("\2\2\u08c7\u08ca\3\2\2\2\u08c8\u08c6\3\2\2\2\u08c8\u08c9") - buf.write("\3\2\2\2\u08c9\u00ab\3\2\2\2\u08ca\u08c8\3\2\2\2\u08cb") - buf.write("\u08d0\5\u0100\u0081\2\u08cc\u08cd\7\7\2\2\u08cd\u08cf") - buf.write("\5\u0100\u0081\2\u08ce\u08cc\3\2\2\2\u08cf\u08d2\3\2\2") - buf.write("\2\u08d0\u08ce\3\2\2\2\u08d0\u08d1\3\2\2\2\u08d1\u00ad") - buf.write("\3\2\2\2\u08d2\u08d0\3\2\2\2\u08d3\u08d4\5\u0100\u0081") - buf.write("\2\u08d4\u08d5\7\7\2\2\u08d5\u08d7\3\2\2\2\u08d6\u08d3") - buf.write("\3\2\2\2\u08d6\u08d7\3\2\2\2\u08d7\u08d8\3\2\2\2\u08d8") - buf.write("\u08d9\5\u0100\u0081\2\u08d9\u00af\3\2\2\2\u08da\u08db") - buf.write("\5\u0100\u0081\2\u08db\u08dc\7\7\2\2\u08dc\u08de\3\2\2") - buf.write("\2\u08dd\u08da\3\2\2\2\u08dd\u08de\3\2\2\2\u08de\u08df") - buf.write("\3\2\2\2\u08df\u08e0\5\u0100\u0081\2\u08e0\u00b1\3\2\2") - buf.write("\2\u08e1\u08e9\5\u00bc_\2\u08e2\u08e4\7\30\2\2\u08e3\u08e2") - buf.write("\3\2\2\2\u08e3\u08e4\3\2\2\2\u08e4\u08e7\3\2\2\2\u08e5") - buf.write("\u08e8\5\u0100\u0081\2\u08e6\u08e8\5\u0094K\2\u08e7\u08e5") - buf.write("\3\2\2\2\u08e7\u08e6\3\2\2\2\u08e8\u08ea\3\2\2\2\u08e9") - buf.write("\u08e3\3\2\2\2\u08e9\u08ea\3\2\2\2\u08ea\u00b3\3\2\2\2") - buf.write("\u08eb\u08f0\5\u00b2Z\2\u08ec\u08ed\7\6\2\2\u08ed\u08ef") - buf.write("\5\u00b2Z\2\u08ee\u08ec\3\2\2\2\u08ef\u08f2\3\2\2\2\u08f0") - buf.write("\u08ee\3\2\2\2\u08f0\u08f1\3\2\2\2\u08f1\u00b5\3\2\2\2") - buf.write("\u08f2\u08f0\3\2\2\2\u08f3\u08f4\7\4\2\2\u08f4\u08f9\5") - buf.write("\u00b8]\2\u08f5\u08f6\7\6\2\2\u08f6\u08f8\5\u00b8]\2\u08f7") - buf.write("\u08f5\3\2\2\2\u08f8\u08fb\3\2\2\2\u08f9\u08f7\3\2\2\2") - buf.write("\u08f9\u08fa\3\2\2\2\u08fa\u08fc\3\2\2\2\u08fb\u08f9\3") - buf.write("\2\2\2\u08fc\u08fd\7\5\2\2\u08fd\u00b7\3\2\2\2\u08fe\u090c") - buf.write("\5\u00fe\u0080\2\u08ff\u0900\5\u0104\u0083\2\u0900\u0901") - buf.write("\7\4\2\2\u0901\u0906\5\u00ba^\2\u0902\u0903\7\6\2\2\u0903") - buf.write("\u0905\5\u00ba^\2\u0904\u0902\3\2\2\2\u0905\u0908\3\2") - buf.write("\2\2\u0906\u0904\3\2\2\2\u0906\u0907\3\2\2\2\u0907\u0909") - buf.write("\3\2\2\2\u0908\u0906\3\2\2\2\u0909\u090a\7\5\2\2\u090a") - buf.write("\u090c\3\2\2\2\u090b\u08fe\3\2\2\2\u090b\u08ff\3\2\2\2") - buf.write("\u090c\u00b9\3\2\2\2\u090d\u0910\5\u00fe\u0080\2\u090e") - buf.write("\u0910\5\u00c6d\2\u090f\u090d\3\2\2\2\u090f\u090e\3\2") - buf.write("\2\2\u0910\u00bb\3\2\2\2\u0911\u0912\5\u00be`\2\u0912") - buf.write("\u00bd\3\2\2\2\u0913\u0914\b`\1\2\u0914\u0915\7\u009b") - buf.write("\2\2\u0915\u0920\5\u00be`\7\u0916\u0917\7U\2\2\u0917\u0918") - buf.write("\7\4\2\2\u0918\u0919\5 \21\2\u0919\u091a\7\5\2\2\u091a") - buf.write("\u0920\3\2\2\2\u091b\u091d\5\u00c2b\2\u091c\u091e\5\u00c0") - buf.write("a\2\u091d\u091c\3\2\2\2\u091d\u091e\3\2\2\2\u091e\u0920") - buf.write("\3\2\2\2\u091f\u0913\3\2\2\2\u091f\u0916\3\2\2\2\u091f") - buf.write("\u091b\3\2\2\2\u0920\u0929\3\2\2\2\u0921\u0922\f\4\2\2") - buf.write("\u0922\u0923\7\23\2\2\u0923\u0928\5\u00be`\5\u0924\u0925") - buf.write("\f\3\2\2\u0925\u0926\7\u00a3\2\2\u0926\u0928\5\u00be`") - buf.write("\4\u0927\u0921\3\2\2\2\u0927\u0924\3\2\2\2\u0928\u092b") - buf.write("\3\2\2\2\u0929\u0927\3\2\2\2\u0929\u092a\3\2\2\2\u092a") - buf.write("\u00bf\3\2\2\2\u092b\u0929\3\2\2\2\u092c\u092e\7\u009b") - buf.write("\2\2\u092d\u092c\3\2\2\2\u092d\u092e\3\2\2\2\u092e\u092f") - buf.write("\3\2\2\2\u092f\u0930\7\34\2\2\u0930\u0931\5\u00c2b\2\u0931") - buf.write("\u0932\7\23\2\2\u0932\u0933\5\u00c2b\2\u0933\u097f\3\2") - buf.write("\2\2\u0934\u0936\7\u009b\2\2\u0935\u0934\3\2\2\2\u0935") - buf.write("\u0936\3\2\2\2\u0936\u0937\3\2\2\2\u0937\u0938\7s\2\2") - buf.write("\u0938\u0939\7\4\2\2\u0939\u093e\5\u00bc_\2\u093a\u093b") - buf.write("\7\6\2\2\u093b\u093d\5\u00bc_\2\u093c\u093a\3\2\2\2\u093d") - buf.write("\u0940\3\2\2\2\u093e\u093c\3\2\2\2\u093e\u093f\3\2\2\2") - buf.write("\u093f\u0941\3\2\2\2\u0940\u093e\3\2\2\2\u0941\u0942\7") - buf.write("\5\2\2\u0942\u097f\3\2\2\2\u0943\u0945\7\u009b\2\2\u0944") - buf.write("\u0943\3\2\2\2\u0944\u0945\3\2\2\2\u0945\u0946\3\2\2\2") - buf.write("\u0946\u0947\7s\2\2\u0947\u0948\7\4\2\2\u0948\u0949\5") - buf.write(" \21\2\u0949\u094a\7\5\2\2\u094a\u097f\3\2\2\2\u094b\u094d") - buf.write("\7\u009b\2\2\u094c\u094b\3\2\2\2\u094c\u094d\3\2\2\2\u094d") - buf.write("\u094e\3\2\2\2\u094e\u094f\7\u00c7\2\2\u094f\u097f\5\u00c2") - buf.write("b\2\u0950\u0952\7\u009b\2\2\u0951\u0950\3\2\2\2\u0951") - buf.write("\u0952\3\2\2\2\u0952\u0953\3\2\2\2\u0953\u0954\7\u0086") - buf.write("\2\2\u0954\u0962\t\25\2\2\u0955\u0956\7\4\2\2\u0956\u0963") - buf.write("\7\5\2\2\u0957\u0958\7\4\2\2\u0958\u095d\5\u00bc_\2\u0959") - buf.write("\u095a\7\6\2\2\u095a\u095c\5\u00bc_\2\u095b\u0959\3\2") - buf.write("\2\2\u095c\u095f\3\2\2\2\u095d\u095b\3\2\2\2\u095d\u095e") - buf.write("\3\2\2\2\u095e\u0960\3\2\2\2\u095f\u095d\3\2\2\2\u0960") - buf.write("\u0961\7\5\2\2\u0961\u0963\3\2\2\2\u0962\u0955\3\2\2\2") - buf.write("\u0962\u0957\3\2\2\2\u0963\u097f\3\2\2\2\u0964\u0966\7") - buf.write("\u009b\2\2\u0965\u0964\3\2\2\2\u0965\u0966\3\2\2\2\u0966") - buf.write("\u0967\3\2\2\2\u0967\u0968\7\u0086\2\2\u0968\u096b\5\u00c2") - buf.write("b\2\u0969\u096a\7Q\2\2\u096a\u096c\7\u011d\2\2\u096b\u0969") - buf.write("\3\2\2\2\u096b\u096c\3\2\2\2\u096c\u097f\3\2\2\2\u096d") - buf.write("\u096f\7}\2\2\u096e\u0970\7\u009b\2\2\u096f\u096e\3\2") - buf.write("\2\2\u096f\u0970\3\2\2\2\u0970\u0971\3\2\2\2\u0971\u097f") - buf.write("\7\u009c\2\2\u0972\u0974\7}\2\2\u0973\u0975\7\u009b\2") - buf.write("\2\u0974\u0973\3\2\2\2\u0974\u0975\3\2\2\2\u0975\u0976") - buf.write("\3\2\2\2\u0976\u097f\t\26\2\2\u0977\u0979\7}\2\2\u0978") - buf.write("\u097a\7\u009b\2\2\u0979\u0978\3\2\2\2\u0979\u097a\3\2") - buf.write("\2\2\u097a\u097b\3\2\2\2\u097b\u097c\7L\2\2\u097c\u097d") - buf.write("\7f\2\2\u097d\u097f\5\u00c2b\2\u097e\u092d\3\2\2\2\u097e") - buf.write("\u0935\3\2\2\2\u097e\u0944\3\2\2\2\u097e\u094c\3\2\2\2") - buf.write("\u097e\u0951\3\2\2\2\u097e\u0965\3\2\2\2\u097e\u096d\3") - buf.write("\2\2\2\u097e\u0972\3\2\2\2\u097e\u0977\3\2\2\2\u097f\u00c1") - buf.write("\3\2\2\2\u0980\u0981\bb\1\2\u0981\u0985\5\u00c4c\2\u0982") - buf.write("\u0983\t\27\2\2\u0983\u0985\5\u00c2b\t\u0984\u0980\3\2") - buf.write("\2\2\u0984\u0982\3\2\2\2\u0985\u099b\3\2\2\2\u0986\u0987") - buf.write("\f\b\2\2\u0987\u0988\t\30\2\2\u0988\u099a\5\u00c2b\t\u0989") - buf.write("\u098a\f\7\2\2\u098a\u098b\t\31\2\2\u098b\u099a\5\u00c2") - buf.write("b\b\u098c\u098d\f\6\2\2\u098d\u098e\7\u0119\2\2\u098e") - buf.write("\u099a\5\u00c2b\7\u098f\u0990\f\5\2\2\u0990\u0991\7\u011c") - buf.write("\2\2\u0991\u099a\5\u00c2b\6\u0992\u0993\f\4\2\2\u0993") - buf.write("\u0994\7\u011a\2\2\u0994\u099a\5\u00c2b\5\u0995\u0996") - buf.write("\f\3\2\2\u0996\u0997\5\u00c8e\2\u0997\u0998\5\u00c2b\4") - buf.write("\u0998\u099a\3\2\2\2\u0999\u0986\3\2\2\2\u0999\u0989\3") - buf.write("\2\2\2\u0999\u098c\3\2\2\2\u0999\u098f\3\2\2\2\u0999\u0992") - buf.write("\3\2\2\2\u0999\u0995\3\2\2\2\u099a\u099d\3\2\2\2\u099b") - buf.write("\u0999\3\2\2\2\u099b\u099c\3\2\2\2\u099c\u00c3\3\2\2\2") - buf.write("\u099d\u099b\3\2\2\2\u099e\u099f\bc\1\2\u099f\u0a57\t") - buf.write("\32\2\2\u09a0\u09a2\7#\2\2\u09a1\u09a3\5\u00eex\2\u09a2") - buf.write("\u09a1\3\2\2\2\u09a3\u09a4\3\2\2\2\u09a4\u09a2\3\2\2\2") - buf.write("\u09a4\u09a5\3\2\2\2\u09a5\u09a8\3\2\2\2\u09a6\u09a7\7") - buf.write("O\2\2\u09a7\u09a9\5\u00bc_\2\u09a8\u09a6\3\2\2\2\u09a8") - buf.write("\u09a9\3\2\2\2\u09a9\u09aa\3\2\2\2\u09aa\u09ab\7P\2\2") - buf.write("\u09ab\u0a57\3\2\2\2\u09ac\u09ad\7#\2\2\u09ad\u09af\5") - buf.write("\u00bc_\2\u09ae\u09b0\5\u00eex\2\u09af\u09ae\3\2\2\2\u09b0") - buf.write("\u09b1\3\2\2\2\u09b1\u09af\3\2\2\2\u09b1\u09b2\3\2\2\2") - buf.write("\u09b2\u09b5\3\2\2\2\u09b3\u09b4\7O\2\2\u09b4\u09b6\5") - buf.write("\u00bc_\2\u09b5\u09b3\3\2\2\2\u09b5\u09b6\3\2\2\2\u09b6") - buf.write("\u09b7\3\2\2\2\u09b7\u09b8\7P\2\2\u09b8\u0a57\3\2\2\2") - buf.write("\u09b9\u09ba\7$\2\2\u09ba\u09bb\7\4\2\2\u09bb\u09bc\5") - buf.write("\u00bc_\2\u09bc\u09bd\7\30\2\2\u09bd\u09be\5\u00e0q\2") - buf.write("\u09be\u09bf\7\5\2\2\u09bf\u0a57\3\2\2\2\u09c0\u09c1\7") - buf.write("\u00e2\2\2\u09c1\u09ca\7\4\2\2\u09c2\u09c7\5\u00b2Z\2") - buf.write("\u09c3\u09c4\7\6\2\2\u09c4\u09c6\5\u00b2Z\2\u09c5\u09c3") - buf.write("\3\2\2\2\u09c6\u09c9\3\2\2\2\u09c7\u09c5\3\2\2\2\u09c7") - buf.write("\u09c8\3\2\2\2\u09c8\u09cb\3\2\2\2\u09c9\u09c7\3\2\2\2") - buf.write("\u09ca\u09c2\3\2\2\2\u09ca\u09cb\3\2\2\2\u09cb\u09cc\3") - buf.write("\2\2\2\u09cc\u0a57\7\5\2\2\u09cd\u09ce\7`\2\2\u09ce\u09cf") - buf.write("\7\4\2\2\u09cf\u09d2\5\u00bc_\2\u09d0\u09d1\7q\2\2\u09d1") - buf.write("\u09d3\7\u009d\2\2\u09d2\u09d0\3\2\2\2\u09d2\u09d3\3\2") - buf.write("\2\2\u09d3\u09d4\3\2\2\2\u09d4\u09d5\7\5\2\2\u09d5\u0a57") - buf.write("\3\2\2\2\u09d6\u09d7\7\u0081\2\2\u09d7\u09d8\7\4\2\2\u09d8") - buf.write("\u09db\5\u00bc_\2\u09d9\u09da\7q\2\2\u09da\u09dc\7\u009d") - buf.write("\2\2\u09db\u09d9\3\2\2\2\u09db\u09dc\3\2\2\2\u09dc\u09dd") - buf.write("\3\2\2\2\u09dd\u09de\7\5\2\2\u09de\u0a57\3\2\2\2\u09df") - buf.write("\u09e0\7\u00b2\2\2\u09e0\u09e1\7\4\2\2\u09e1\u09e2\5\u00c2") - buf.write("b\2\u09e2\u09e3\7s\2\2\u09e3\u09e4\5\u00c2b\2\u09e4\u09e5") - buf.write("\7\5\2\2\u09e5\u0a57\3\2\2\2\u09e6\u0a57\5\u00c6d\2\u09e7") - buf.write("\u0a57\7\u0114\2\2\u09e8\u09e9\5\u00fe\u0080\2\u09e9\u09ea") - buf.write("\7\7\2\2\u09ea\u09eb\7\u0114\2\2\u09eb\u0a57\3\2\2\2\u09ec") - buf.write("\u09ed\7\4\2\2\u09ed\u09f0\5\u00b2Z\2\u09ee\u09ef\7\6") - buf.write("\2\2\u09ef\u09f1\5\u00b2Z\2\u09f0\u09ee\3\2\2\2\u09f1") - buf.write("\u09f2\3\2\2\2\u09f2\u09f0\3\2\2\2\u09f2\u09f3\3\2\2\2") - buf.write("\u09f3\u09f4\3\2\2\2\u09f4\u09f5\7\5\2\2\u09f5\u0a57\3") - buf.write("\2\2\2\u09f6\u09f7\7\4\2\2\u09f7\u09f8\5 \21\2\u09f8\u09f9") - buf.write("\7\5\2\2\u09f9\u0a57\3\2\2\2\u09fa\u09fb\5\u00fc\177\2") - buf.write("\u09fb\u0a07\7\4\2\2\u09fc\u09fe\5\u0086D\2\u09fd\u09fc") - buf.write("\3\2\2\2\u09fd\u09fe\3\2\2\2\u09fe\u09ff\3\2\2\2\u09ff") - buf.write("\u0a04\5\u00bc_\2\u0a00\u0a01\7\6\2\2\u0a01\u0a03\5\u00bc") - buf.write("_\2\u0a02\u0a00\3\2\2\2\u0a03\u0a06\3\2\2\2\u0a04\u0a02") - buf.write("\3\2\2\2\u0a04\u0a05\3\2\2\2\u0a05\u0a08\3\2\2\2\u0a06") - buf.write("\u0a04\3\2\2\2\u0a07\u09fd\3\2\2\2\u0a07\u0a08\3\2\2\2") - buf.write("\u0a08\u0a09\3\2\2\2\u0a09\u0a10\7\5\2\2\u0a0a\u0a0b\7") - buf.write("^\2\2\u0a0b\u0a0c\7\4\2\2\u0a0c\u0a0d\7\u0106\2\2\u0a0d") - buf.write("\u0a0e\5\u00be`\2\u0a0e\u0a0f\7\5\2\2\u0a0f\u0a11\3\2") - buf.write("\2\2\u0a10\u0a0a\3\2\2\2\u0a10\u0a11\3\2\2\2\u0a11\u0a14") - buf.write("\3\2\2\2\u0a12\u0a13\7\u00a8\2\2\u0a13\u0a15\5\u00f4{") - buf.write("\2\u0a14\u0a12\3\2\2\2\u0a14\u0a15\3\2\2\2\u0a15\u0a57") - buf.write("\3\2\2\2\u0a16\u0a17\5\u0104\u0083\2\u0a17\u0a18\7\n\2") - buf.write("\2\u0a18\u0a19\5\u00bc_\2\u0a19\u0a57\3\2\2\2\u0a1a\u0a1b") - buf.write("\7\4\2\2\u0a1b\u0a1e\5\u0104\u0083\2\u0a1c\u0a1d\7\6\2") - buf.write("\2\u0a1d\u0a1f\5\u0104\u0083\2\u0a1e\u0a1c\3\2\2\2\u0a1f") - buf.write("\u0a20\3\2\2\2\u0a20\u0a1e\3\2\2\2\u0a20\u0a21\3\2\2\2") - buf.write("\u0a21\u0a22\3\2\2\2\u0a22\u0a23\7\5\2\2\u0a23\u0a24\7") - buf.write("\n\2\2\u0a24\u0a25\5\u00bc_\2\u0a25\u0a57\3\2\2\2\u0a26") - buf.write("\u0a57\5\u0104\u0083\2\u0a27\u0a28\7\4\2\2\u0a28\u0a29") - buf.write("\5\u00bc_\2\u0a29\u0a2a\7\5\2\2\u0a2a\u0a57\3\2\2\2\u0a2b") - buf.write("\u0a2c\7Z\2\2\u0a2c\u0a2d\7\4\2\2\u0a2d\u0a2e\5\u0104") - buf.write("\u0083\2\u0a2e\u0a2f\7f\2\2\u0a2f\u0a30\5\u00c2b\2\u0a30") - buf.write("\u0a31\7\5\2\2\u0a31\u0a57\3\2\2\2\u0a32\u0a33\t\33\2") - buf.write("\2\u0a33\u0a34\7\4\2\2\u0a34\u0a35\5\u00c2b\2\u0a35\u0a36") - buf.write("\t\34\2\2\u0a36\u0a39\5\u00c2b\2\u0a37\u0a38\t\35\2\2") - buf.write("\u0a38\u0a3a\5\u00c2b\2\u0a39\u0a37\3\2\2\2\u0a39\u0a3a") - buf.write("\3\2\2\2\u0a3a\u0a3b\3\2\2\2\u0a3b\u0a3c\7\5\2\2\u0a3c") - buf.write("\u0a57\3\2\2\2\u0a3d\u0a3e\7\u00f2\2\2\u0a3e\u0a40\7\4") - buf.write("\2\2\u0a3f\u0a41\t\36\2\2\u0a40\u0a3f\3\2\2\2\u0a40\u0a41") - buf.write("\3\2\2\2\u0a41\u0a43\3\2\2\2\u0a42\u0a44\5\u00c2b\2\u0a43") - buf.write("\u0a42\3\2\2\2\u0a43\u0a44\3\2\2\2\u0a44\u0a45\3\2\2\2") - buf.write("\u0a45\u0a46\7f\2\2\u0a46\u0a47\5\u00c2b\2\u0a47\u0a48") - buf.write("\7\5\2\2\u0a48\u0a57\3\2\2\2\u0a49\u0a4a\7\u00aa\2\2\u0a4a") - buf.write("\u0a4b\7\4\2\2\u0a4b\u0a4c\5\u00c2b\2\u0a4c\u0a4d\7\u00b1") - buf.write("\2\2\u0a4d\u0a4e\5\u00c2b\2\u0a4e\u0a4f\7f\2\2\u0a4f\u0a52") - buf.write("\5\u00c2b\2\u0a50\u0a51\7b\2\2\u0a51\u0a53\5\u00c2b\2") - buf.write("\u0a52\u0a50\3\2\2\2\u0a52\u0a53\3\2\2\2\u0a53\u0a54\3") - buf.write("\2\2\2\u0a54\u0a55\7\5\2\2\u0a55\u0a57\3\2\2\2\u0a56\u099e") - buf.write("\3\2\2\2\u0a56\u09a0\3\2\2\2\u0a56\u09ac\3\2\2\2\u0a56") - buf.write("\u09b9\3\2\2\2\u0a56\u09c0\3\2\2\2\u0a56\u09cd\3\2\2\2") - buf.write("\u0a56\u09d6\3\2\2\2\u0a56\u09df\3\2\2\2\u0a56\u09e6\3") - buf.write("\2\2\2\u0a56\u09e7\3\2\2\2\u0a56\u09e8\3\2\2\2\u0a56\u09ec") - buf.write("\3\2\2\2\u0a56\u09f6\3\2\2\2\u0a56\u09fa\3\2\2\2\u0a56") - buf.write("\u0a16\3\2\2\2\u0a56\u0a1a\3\2\2\2\u0a56\u0a26\3\2\2\2") - buf.write("\u0a56\u0a27\3\2\2\2\u0a56\u0a2b\3\2\2\2\u0a56\u0a32\3") - buf.write("\2\2\2\u0a56\u0a3d\3\2\2\2\u0a56\u0a49\3\2\2\2\u0a57\u0a62") - buf.write("\3\2\2\2\u0a58\u0a59\f\n\2\2\u0a59\u0a5a\7\13\2\2\u0a5a") - buf.write("\u0a5b\5\u00c2b\2\u0a5b\u0a5c\7\f\2\2\u0a5c\u0a61\3\2") - buf.write("\2\2\u0a5d\u0a5e\f\b\2\2\u0a5e\u0a5f\7\7\2\2\u0a5f\u0a61") - buf.write("\5\u0104\u0083\2\u0a60\u0a58\3\2\2\2\u0a60\u0a5d\3\2\2") - buf.write("\2\u0a61\u0a64\3\2\2\2\u0a62\u0a60\3\2\2\2\u0a62\u0a63") - buf.write("\3\2\2\2\u0a63\u00c5\3\2\2\2\u0a64\u0a62\3\2\2\2\u0a65") - buf.write("\u0a72\7\u009c\2\2\u0a66\u0a72\5\u00d0i\2\u0a67\u0a68") - buf.write("\5\u0104\u0083\2\u0a68\u0a69\7\u011d\2\2\u0a69\u0a72\3") - buf.write("\2\2\2\u0a6a\u0a72\5\u010a\u0086\2\u0a6b\u0a72\5\u00ce") - buf.write("h\2\u0a6c\u0a6e\7\u011d\2\2\u0a6d\u0a6c\3\2\2\2\u0a6e") - buf.write("\u0a6f\3\2\2\2\u0a6f\u0a6d\3\2\2\2\u0a6f\u0a70\3\2\2\2") - buf.write("\u0a70\u0a72\3\2\2\2\u0a71\u0a65\3\2\2\2\u0a71\u0a66\3") - buf.write("\2\2\2\u0a71\u0a67\3\2\2\2\u0a71\u0a6a\3\2\2\2\u0a71\u0a6b") - buf.write("\3\2\2\2\u0a71\u0a6d\3\2\2\2\u0a72\u00c7\3\2\2\2\u0a73") - buf.write("\u0a74\t\37\2\2\u0a74\u00c9\3\2\2\2\u0a75\u0a76\t \2\2") - buf.write("\u0a76\u00cb\3\2\2\2\u0a77\u0a78\t!\2\2\u0a78\u00cd\3") - buf.write("\2\2\2\u0a79\u0a7a\t\"\2\2\u0a7a\u00cf\3\2\2\2\u0a7b\u0a7e") - buf.write("\7{\2\2\u0a7c\u0a7f\5\u00d2j\2\u0a7d\u0a7f\5\u00d6l\2") - buf.write("\u0a7e\u0a7c\3\2\2\2\u0a7e\u0a7d\3\2\2\2\u0a7e\u0a7f\3") - buf.write("\2\2\2\u0a7f\u00d1\3\2\2\2\u0a80\u0a82\5\u00d4k\2\u0a81") - buf.write("\u0a83\5\u00d8m\2\u0a82\u0a81\3\2\2\2\u0a82\u0a83\3\2") - buf.write("\2\2\u0a83\u00d3\3\2\2\2\u0a84\u0a85\5\u00dan\2\u0a85") - buf.write("\u0a86\5\u00dco\2\u0a86\u0a88\3\2\2\2\u0a87\u0a84\3\2") - buf.write("\2\2\u0a88\u0a89\3\2\2\2\u0a89\u0a87\3\2\2\2\u0a89\u0a8a") - buf.write("\3\2\2\2\u0a8a\u00d5\3\2\2\2\u0a8b\u0a8e\5\u00d8m\2\u0a8c") - buf.write("\u0a8f\5\u00d4k\2\u0a8d\u0a8f\5\u00d8m\2\u0a8e\u0a8c\3") - buf.write("\2\2\2\u0a8e\u0a8d\3\2\2\2\u0a8e\u0a8f\3\2\2\2\u0a8f\u00d7") - buf.write("\3\2\2\2\u0a90\u0a91\5\u00dan\2\u0a91\u0a92\5\u00dco\2") - buf.write("\u0a92\u0a93\7\u00ec\2\2\u0a93\u0a94\5\u00dco\2\u0a94") - buf.write("\u00d9\3\2\2\2\u0a95\u0a97\t#\2\2\u0a96\u0a95\3\2\2\2") - buf.write("\u0a96\u0a97\3\2\2\2\u0a97\u0a98\3\2\2\2\u0a98\u0a9b\t") - buf.write("\24\2\2\u0a99\u0a9b\7\u011d\2\2\u0a9a\u0a96\3\2\2\2\u0a9a") - buf.write("\u0a99\3\2\2\2\u0a9b\u00db\3\2\2\2\u0a9c\u0aa4\7B\2\2") - buf.write("\u0a9d\u0aa4\7o\2\2\u0a9e\u0aa4\7\u0094\2\2\u0a9f\u0aa4") - buf.write("\7\u0095\2\2\u0aa0\u0aa4\7\u00cf\2\2\u0aa1\u0aa4\7\u0109") - buf.write("\2\2\u0aa2\u0aa4\5\u0104\u0083\2\u0aa3\u0a9c\3\2\2\2\u0aa3") - buf.write("\u0a9d\3\2\2\2\u0aa3\u0a9e\3\2\2\2\u0aa3\u0a9f\3\2\2\2") - buf.write("\u0aa3\u0aa0\3\2\2\2\u0aa3\u0aa1\3\2\2\2\u0aa3\u0aa2\3") - buf.write("\2\2\2\u0aa4\u00dd\3\2\2\2\u0aa5\u0aa9\7`\2\2\u0aa6\u0aa7") - buf.write("\7\17\2\2\u0aa7\u0aa9\5\u0100\u0081\2\u0aa8\u0aa5\3\2") - buf.write("\2\2\u0aa8\u0aa6\3\2\2\2\u0aa9\u00df\3\2\2\2\u0aaa\u0aab") - buf.write("\7\27\2\2\u0aab\u0aac\7\u010e\2\2\u0aac\u0aad\5\u00e0") - buf.write("q\2\u0aad\u0aae\7\u0110\2\2\u0aae\u0acd\3\2\2\2\u0aaf") - buf.write("\u0ab0\7\u0091\2\2\u0ab0\u0ab1\7\u010e\2\2\u0ab1\u0ab2") - buf.write("\5\u00e0q\2\u0ab2\u0ab3\7\6\2\2\u0ab3\u0ab4\5\u00e0q\2") - buf.write("\u0ab4\u0ab5\7\u0110\2\2\u0ab5\u0acd\3\2\2\2\u0ab6\u0abd") - buf.write("\7\u00e2\2\2\u0ab7\u0ab9\7\u010e\2\2\u0ab8\u0aba\5\u00ea") - buf.write("v\2\u0ab9\u0ab8\3\2\2\2\u0ab9\u0aba\3\2\2\2\u0aba\u0abb") - buf.write("\3\2\2\2\u0abb\u0abe\7\u0110\2\2\u0abc\u0abe\7\u010c\2") - buf.write("\2\u0abd\u0ab7\3\2\2\2\u0abd\u0abc\3\2\2\2\u0abe\u0acd") - buf.write("\3\2\2\2\u0abf\u0aca\5\u0104\u0083\2\u0ac0\u0ac1\7\4\2") - buf.write("\2\u0ac1\u0ac6\7\u0121\2\2\u0ac2\u0ac3\7\6\2\2\u0ac3\u0ac5") - buf.write("\7\u0121\2\2\u0ac4\u0ac2\3\2\2\2\u0ac5\u0ac8\3\2\2\2\u0ac6") - buf.write("\u0ac4\3\2\2\2\u0ac6\u0ac7\3\2\2\2\u0ac7\u0ac9\3\2\2\2") - buf.write("\u0ac8\u0ac6\3\2\2\2\u0ac9\u0acb\7\5\2\2\u0aca\u0ac0\3") - buf.write("\2\2\2\u0aca\u0acb\3\2\2\2\u0acb\u0acd\3\2\2\2\u0acc\u0aaa") - buf.write("\3\2\2\2\u0acc\u0aaf\3\2\2\2\u0acc\u0ab6\3\2\2\2\u0acc") - buf.write("\u0abf\3\2\2\2\u0acd\u00e1\3\2\2\2\u0ace\u0ad3\5\u00e4") - buf.write("s\2\u0acf\u0ad0\7\6\2\2\u0ad0\u0ad2\5\u00e4s\2\u0ad1\u0acf") - buf.write("\3\2\2\2\u0ad2\u0ad5\3\2\2\2\u0ad3\u0ad1\3\2\2\2\u0ad3") - buf.write("\u0ad4\3\2\2\2\u0ad4\u00e3\3\2\2\2\u0ad5\u0ad3\3\2\2\2") - buf.write("\u0ad6\u0ad7\5\u00acW\2\u0ad7\u0ada\5\u00e0q\2\u0ad8\u0ad9") - buf.write("\7\u009b\2\2\u0ad9\u0adb\7\u009c\2\2\u0ada\u0ad8\3\2\2") - buf.write("\2\u0ada\u0adb\3\2\2\2\u0adb\u0add\3\2\2\2\u0adc\u0ade") - buf.write("\5\36\20\2\u0add\u0adc\3\2\2\2\u0add\u0ade\3\2\2\2\u0ade") - buf.write("\u0ae0\3\2\2\2\u0adf\u0ae1\5\u00dep\2\u0ae0\u0adf\3\2") - buf.write("\2\2\u0ae0\u0ae1\3\2\2\2\u0ae1\u00e5\3\2\2\2\u0ae2\u0ae7") - buf.write("\5\u00e8u\2\u0ae3\u0ae4\7\6\2\2\u0ae4\u0ae6\5\u00e8u\2") - buf.write("\u0ae5\u0ae3\3\2\2\2\u0ae6\u0ae9\3\2\2\2\u0ae7\u0ae5\3") - buf.write("\2\2\2\u0ae7\u0ae8\3\2\2\2\u0ae8\u00e7\3\2\2\2\u0ae9\u0ae7") - buf.write("\3\2\2\2\u0aea\u0aeb\5\u0100\u0081\2\u0aeb\u0aee\5\u00e0") - buf.write("q\2\u0aec\u0aed\7\u009b\2\2\u0aed\u0aef\7\u009c\2\2\u0aee") - buf.write("\u0aec\3\2\2\2\u0aee\u0aef\3\2\2\2\u0aef\u0af1\3\2\2\2") - buf.write("\u0af0\u0af2\5\36\20\2\u0af1\u0af0\3\2\2\2\u0af1\u0af2") - buf.write("\3\2\2\2\u0af2\u00e9\3\2\2\2\u0af3\u0af8\5\u00ecw\2\u0af4") - buf.write("\u0af5\7\6\2\2\u0af5\u0af7\5\u00ecw\2\u0af6\u0af4\3\2") - buf.write("\2\2\u0af7\u0afa\3\2\2\2\u0af8\u0af6\3\2\2\2\u0af8\u0af9") - buf.write("\3\2\2\2\u0af9\u00eb\3\2\2\2\u0afa\u0af8\3\2\2\2\u0afb") - buf.write("\u0afc\5\u0104\u0083\2\u0afc\u0afd\7\r\2\2\u0afd\u0b00") - buf.write("\5\u00e0q\2\u0afe\u0aff\7\u009b\2\2\u0aff\u0b01\7\u009c") - buf.write("\2\2\u0b00\u0afe\3\2\2\2\u0b00\u0b01\3\2\2\2\u0b01\u0b03") - buf.write("\3\2\2\2\u0b02\u0b04\5\36\20\2\u0b03\u0b02\3\2\2\2\u0b03") - buf.write("\u0b04\3\2\2\2\u0b04\u00ed\3\2\2\2\u0b05\u0b06\7\u0105") - buf.write("\2\2\u0b06\u0b07\5\u00bc_\2\u0b07\u0b08\7\u00eb\2\2\u0b08") - buf.write("\u0b09\5\u00bc_\2\u0b09\u00ef\3\2\2\2\u0b0a\u0b0b\7\u0107") - buf.write("\2\2\u0b0b\u0b10\5\u00f2z\2\u0b0c\u0b0d\7\6\2\2\u0b0d") - buf.write("\u0b0f\5\u00f2z\2\u0b0e\u0b0c\3\2\2\2\u0b0f\u0b12\3\2") - buf.write("\2\2\u0b10\u0b0e\3\2\2\2\u0b10\u0b11\3\2\2\2\u0b11\u00f1") - buf.write("\3\2\2\2\u0b12\u0b10\3\2\2\2\u0b13\u0b14\5\u0100\u0081") - buf.write("\2\u0b14\u0b15\7\30\2\2\u0b15\u0b16\5\u00f4{\2\u0b16\u00f3") - buf.write("\3\2\2\2\u0b17\u0b46\5\u0100\u0081\2\u0b18\u0b19\7\4\2") - buf.write("\2\u0b19\u0b1a\5\u0100\u0081\2\u0b1a\u0b1b\7\5\2\2\u0b1b") - buf.write("\u0b46\3\2\2\2\u0b1c\u0b3f\7\4\2\2\u0b1d\u0b1e\7(\2\2") - buf.write("\u0b1e\u0b1f\7 \2\2\u0b1f\u0b24\5\u00bc_\2\u0b20\u0b21") - buf.write("\7\6\2\2\u0b21\u0b23\5\u00bc_\2\u0b22\u0b20\3\2\2\2\u0b23") - buf.write("\u0b26\3\2\2\2\u0b24\u0b22\3\2\2\2\u0b24\u0b25\3\2\2\2") - buf.write("\u0b25\u0b40\3\2\2\2\u0b26\u0b24\3\2\2\2\u0b27\u0b28\t") - buf.write("$\2\2\u0b28\u0b29\7 \2\2\u0b29\u0b2e\5\u00bc_\2\u0b2a") - buf.write("\u0b2b\7\6\2\2\u0b2b\u0b2d\5\u00bc_\2\u0b2c\u0b2a\3\2") - buf.write("\2\2\u0b2d\u0b30\3\2\2\2\u0b2e\u0b2c\3\2\2\2\u0b2e\u0b2f") - buf.write("\3\2\2\2\u0b2f\u0b32\3\2\2\2\u0b30\u0b2e\3\2\2\2\u0b31") - buf.write("\u0b27\3\2\2\2\u0b31\u0b32\3\2\2\2\u0b32\u0b3d\3\2\2\2") - buf.write("\u0b33\u0b34\t%\2\2\u0b34\u0b35\7 \2\2\u0b35\u0b3a\5V") - buf.write(",\2\u0b36\u0b37\7\6\2\2\u0b37\u0b39\5V,\2\u0b38\u0b36") - buf.write("\3\2\2\2\u0b39\u0b3c\3\2\2\2\u0b3a\u0b38\3\2\2\2\u0b3a") - buf.write("\u0b3b\3\2\2\2\u0b3b\u0b3e\3\2\2\2\u0b3c\u0b3a\3\2\2\2") - buf.write("\u0b3d\u0b33\3\2\2\2\u0b3d\u0b3e\3\2\2\2\u0b3e\u0b40\3") - buf.write("\2\2\2\u0b3f\u0b1d\3\2\2\2\u0b3f\u0b31\3\2\2\2\u0b40\u0b42") - buf.write("\3\2\2\2\u0b41\u0b43\5\u00f6|\2\u0b42\u0b41\3\2\2\2\u0b42") - buf.write("\u0b43\3\2\2\2\u0b43\u0b44\3\2\2\2\u0b44\u0b46\7\5\2\2") - buf.write("\u0b45\u0b17\3\2\2\2\u0b45\u0b18\3\2\2\2\u0b45\u0b1c\3") - buf.write("\2\2\2\u0b46\u00f5\3\2\2\2\u0b47\u0b48\7\u00b9\2\2\u0b48") - buf.write("\u0b58\5\u00f8}\2\u0b49\u0b4a\7\u00cd\2\2\u0b4a\u0b58") - buf.write("\5\u00f8}\2\u0b4b\u0b4c\7\u00b9\2\2\u0b4c\u0b4d\7\34\2") - buf.write("\2\u0b4d\u0b4e\5\u00f8}\2\u0b4e\u0b4f\7\23\2\2\u0b4f\u0b50") - buf.write("\5\u00f8}\2\u0b50\u0b58\3\2\2\2\u0b51\u0b52\7\u00cd\2") - buf.write("\2\u0b52\u0b53\7\34\2\2\u0b53\u0b54\5\u00f8}\2\u0b54\u0b55") - buf.write("\7\23\2\2\u0b55\u0b56\5\u00f8}\2\u0b56\u0b58\3\2\2\2\u0b57") - buf.write("\u0b47\3\2\2\2\u0b57\u0b49\3\2\2\2\u0b57\u0b4b\3\2\2\2") - buf.write("\u0b57\u0b51\3\2\2\2\u0b58\u00f7\3\2\2\2\u0b59\u0b5a\7") - buf.write("\u00f7\2\2\u0b5a\u0b61\t&\2\2\u0b5b\u0b5c\7:\2\2\u0b5c") - buf.write("\u0b61\7\u00cc\2\2\u0b5d\u0b5e\5\u00bc_\2\u0b5e\u0b5f") - buf.write("\t&\2\2\u0b5f\u0b61\3\2\2\2\u0b60\u0b59\3\2\2\2\u0b60") - buf.write("\u0b5b\3\2\2\2\u0b60\u0b5d\3\2\2\2\u0b61\u00f9\3\2\2\2") - buf.write("\u0b62\u0b67\5\u00fe\u0080\2\u0b63\u0b64\7\6\2\2\u0b64") - buf.write("\u0b66\5\u00fe\u0080\2\u0b65\u0b63\3\2\2\2\u0b66\u0b69") - buf.write("\3\2\2\2\u0b67\u0b65\3\2\2\2\u0b67\u0b68\3\2\2\2\u0b68") - buf.write("\u00fb\3\2\2\2\u0b69\u0b67\3\2\2\2\u0b6a\u0b6f\5\u00fe") - buf.write("\u0080\2\u0b6b\u0b6f\7^\2\2\u0b6c\u0b6f\7\u0085\2\2\u0b6d") - buf.write("\u0b6f\7\u00c6\2\2\u0b6e\u0b6a\3\2\2\2\u0b6e\u0b6b\3\2") - buf.write("\2\2\u0b6e\u0b6c\3\2\2\2\u0b6e\u0b6d\3\2\2\2\u0b6f\u00fd") - buf.write("\3\2\2\2\u0b70\u0b75\5\u0104\u0083\2\u0b71\u0b72\7\7\2") - buf.write("\2\u0b72\u0b74\5\u0104\u0083\2\u0b73\u0b71\3\2\2\2\u0b74") - buf.write("\u0b77\3\2\2\2\u0b75\u0b73\3\2\2\2\u0b75\u0b76\3\2\2\2") - buf.write("\u0b76\u00ff\3\2\2\2\u0b77\u0b75\3\2\2\2\u0b78\u0b79\5") - buf.write("\u0104\u0083\2\u0b79\u0b7a\5\u0102\u0082\2\u0b7a\u0101") - buf.write("\3\2\2\2\u0b7b\u0b7c\7\u0113\2\2\u0b7c\u0b7e\5\u0104\u0083") - buf.write("\2\u0b7d\u0b7b\3\2\2\2\u0b7e\u0b7f\3\2\2\2\u0b7f\u0b7d") - buf.write("\3\2\2\2\u0b7f\u0b80\3\2\2\2\u0b80\u0b83\3\2\2\2\u0b81") - buf.write("\u0b83\3\2\2\2\u0b82\u0b7d\3\2\2\2\u0b82\u0b81\3\2\2\2") - buf.write("\u0b83\u0103\3\2\2\2\u0b84\u0b88\5\u0106\u0084\2\u0b85") - buf.write("\u0b86\6\u0083\24\2\u0b86\u0b88\5\u0110\u0089\2\u0b87") - buf.write("\u0b84\3\2\2\2\u0b87\u0b85\3\2\2\2\u0b88\u0105\3\2\2\2") - buf.write("\u0b89\u0b90\7\u0126\2\2\u0b8a\u0b90\5\u0108\u0085\2\u0b8b") - buf.write("\u0b8c\6\u0084\25\2\u0b8c\u0b90\5\u010e\u0088\2\u0b8d") - buf.write("\u0b8e\6\u0084\26\2\u0b8e\u0b90\5\u0112\u008a\2\u0b8f") - buf.write("\u0b89\3\2\2\2\u0b8f\u0b8a\3\2\2\2\u0b8f\u0b8b\3\2\2\2") - buf.write("\u0b8f\u0b8d\3\2\2\2\u0b90\u0107\3\2\2\2\u0b91\u0b92\7") - buf.write("\u0127\2\2\u0b92\u0109\3\2\2\2\u0b93\u0b95\6\u0086\27") - buf.write("\2\u0b94\u0b96\7\u0113\2\2\u0b95\u0b94\3\2\2\2\u0b95\u0b96") - buf.write("\3\2\2\2\u0b96\u0b97\3\2\2\2\u0b97\u0bbb\7\u0122\2\2\u0b98") - buf.write("\u0b9a\6\u0086\30\2\u0b99\u0b9b\7\u0113\2\2\u0b9a\u0b99") - buf.write("\3\2\2\2\u0b9a\u0b9b\3\2\2\2\u0b9b\u0b9c\3\2\2\2\u0b9c") - buf.write("\u0bbb\7\u0123\2\2\u0b9d\u0b9f\6\u0086\31\2\u0b9e\u0ba0") - buf.write("\7\u0113\2\2\u0b9f\u0b9e\3\2\2\2\u0b9f\u0ba0\3\2\2\2\u0ba0") - buf.write("\u0ba1\3\2\2\2\u0ba1\u0bbb\t\'\2\2\u0ba2\u0ba4\7\u0113") - buf.write("\2\2\u0ba3\u0ba2\3\2\2\2\u0ba3\u0ba4\3\2\2\2\u0ba4\u0ba5") - buf.write("\3\2\2\2\u0ba5\u0bbb\7\u0121\2\2\u0ba6\u0ba8\7\u0113\2") - buf.write("\2\u0ba7\u0ba6\3\2\2\2\u0ba7\u0ba8\3\2\2\2\u0ba8\u0ba9") - buf.write("\3\2\2\2\u0ba9\u0bbb\7\u011e\2\2\u0baa\u0bac\7\u0113\2") - buf.write("\2\u0bab\u0baa\3\2\2\2\u0bab\u0bac\3\2\2\2\u0bac\u0bad") - buf.write("\3\2\2\2\u0bad\u0bbb\7\u011f\2\2\u0bae\u0bb0\7\u0113\2") - buf.write("\2\u0baf\u0bae\3\2\2\2\u0baf\u0bb0\3\2\2\2\u0bb0\u0bb1") - buf.write("\3\2\2\2\u0bb1\u0bbb\7\u0120\2\2\u0bb2\u0bb4\7\u0113\2") - buf.write("\2\u0bb3\u0bb2\3\2\2\2\u0bb3\u0bb4\3\2\2\2\u0bb4\u0bb5") - buf.write("\3\2\2\2\u0bb5\u0bbb\7\u0124\2\2\u0bb6\u0bb8\7\u0113\2") - buf.write("\2\u0bb7\u0bb6\3\2\2\2\u0bb7\u0bb8\3\2\2\2\u0bb8\u0bb9") - buf.write("\3\2\2\2\u0bb9\u0bbb\7\u0125\2\2\u0bba\u0b93\3\2\2\2\u0bba") - buf.write("\u0b98\3\2\2\2\u0bba\u0b9d\3\2\2\2\u0bba\u0ba3\3\2\2\2") - buf.write("\u0bba\u0ba7\3\2\2\2\u0bba\u0bab\3\2\2\2\u0bba\u0baf\3") - buf.write("\2\2\2\u0bba\u0bb3\3\2\2\2\u0bba\u0bb7\3\2\2\2\u0bbb\u010b") - buf.write("\3\2\2\2\u0bbc\u0bbd\7\u00f5\2\2\u0bbd\u0bc4\5\u00e0q") - buf.write("\2\u0bbe\u0bc4\5\36\20\2\u0bbf\u0bc4\5\u00dep\2\u0bc0") - buf.write("\u0bc1\t(\2\2\u0bc1\u0bc2\7\u009b\2\2\u0bc2\u0bc4\7\u009c") - buf.write("\2\2\u0bc3\u0bbc\3\2\2\2\u0bc3\u0bbe\3\2\2\2\u0bc3\u0bbf") - buf.write("\3\2\2\2\u0bc3\u0bc0\3\2\2\2\u0bc4\u010d\3\2\2\2\u0bc5") - buf.write("\u0bc6\t)\2\2\u0bc6\u010f\3\2\2\2\u0bc7\u0bc8\t*\2\2\u0bc8") - buf.write("\u0111\3\2\2\2\u0bc9\u0bca\t+\2\2\u0bca\u0113\3\2\2\2") - buf.write("\u018c\u0118\u0131\u0136\u013e\u0146\u0148\u015c\u0160") - buf.write("\u0166\u0169\u016c\u0174\u0177\u017b\u017e\u0186\u018b") - buf.write("\u018e\u0195\u01a1\u01aa\u01ac\u01b0\u01b3\u01ba\u01c5") - buf.write("\u01c7\u01cf\u01d4\u01d7\u01dd\u01e8\u0228\u0231\u0235") - buf.write("\u023b\u023f\u0244\u024a\u0256\u025e\u0264\u0271\u0276") - buf.write("\u0286\u028d\u0291\u0297\u02a6\u02aa\u02b0\u02b6\u02b9") - buf.write("\u02bc\u02c2\u02c6\u02ce\u02d0\u02d9\u02dc\u02e5\u02ea") - buf.write("\u02f0\u02f7\u02fa\u0300\u030b\u030e\u0312\u0317\u031c") - buf.write("\u0323\u0326\u0329\u0330\u0335\u033e\u0346\u034c\u034f") - buf.write("\u0352\u0358\u035c\u0360\u0364\u0366\u036e\u0376\u037c") - buf.write("\u0382\u0385\u0389\u038c\u0390\u03a9\u03ac\u03b0\u03b6") - buf.write("\u03b9\u03bc\u03c2\u03ca\u03cf\u03d5\u03db\u03e7\u03ea") - buf.write("\u03f1\u03f8\u0400\u0403\u040b\u040f\u0416\u048a\u0492") - buf.write("\u049a\u04a3\u04ad\u04b1\u04b4\u04ba\u04c0\u04cc\u04d8") - buf.write("\u04dd\u04e6\u04ee\u04f5\u04f7\u04fc\u0500\u0505\u050a") - buf.write("\u050f\u0512\u0517\u051b\u0520\u0522\u0526\u052f\u0537") - buf.write("\u0540\u0547\u0550\u0555\u0558\u056b\u056d\u0576\u057d") - buf.write("\u0580\u0587\u058b\u0591\u0599\u05a4\u05af\u05b6\u05bc") - buf.write("\u05c9\u05d0\u05d7\u05e3\u05eb\u05f1\u05f4\u05fd\u0600") - buf.write("\u0609\u060c\u0615\u0618\u0621\u0624\u0627\u062c\u062e") - buf.write("\u063a\u0641\u0648\u064b\u064d\u0659\u065d\u0661\u0667") - buf.write("\u066b\u0673\u0677\u067a\u067d\u0680\u0684\u0688\u068b") - buf.write("\u068f\u0694\u0698\u069b\u069e\u06a1\u06a3\u06af\u06b2") - buf.write("\u06b6\u06c0\u06c4\u06c6\u06c9\u06cd\u06d3\u06d7\u06e2") - buf.write("\u06ec\u06f8\u0707\u070c\u0713\u0723\u0728\u0735\u073a") - buf.write("\u0742\u0748\u074c\u0755\u0764\u0769\u0775\u077a\u0782") - buf.write("\u0785\u0789\u0797\u07a4\u07a9\u07ad\u07b0\u07b5\u07be") - buf.write("\u07c1\u07c6\u07cd\u07d0\u07d8\u07df\u07e6\u07e9\u07ee") - buf.write("\u07f1\u07f6\u07fa\u07fd\u0800\u0806\u080b\u0810\u0822") - buf.write("\u0824\u0827\u0832\u083b\u0842\u084a\u0851\u0855\u085d") - buf.write("\u0865\u086b\u0873\u087f\u0882\u0888\u088c\u088e\u0897") - buf.write("\u08a3\u08a5\u08ac\u08b3\u08b9\u08bf\u08c1\u08c8\u08d0") - buf.write("\u08d6\u08dd\u08e3\u08e7\u08e9\u08f0\u08f9\u0906\u090b") - buf.write("\u090f\u091d\u091f\u0927\u0929\u092d\u0935\u093e\u0944") - buf.write("\u094c\u0951\u095d\u0962\u0965\u096b\u096f\u0974\u0979") - buf.write("\u097e\u0984\u0999\u099b\u09a4\u09a8\u09b1\u09b5\u09c7") - buf.write("\u09ca\u09d2\u09db\u09f2\u09fd\u0a04\u0a07\u0a10\u0a14") - buf.write("\u0a20\u0a39\u0a40\u0a43\u0a52\u0a56\u0a60\u0a62\u0a6f") - buf.write("\u0a71\u0a7e\u0a82\u0a89\u0a8e\u0a96\u0a9a\u0aa3\u0aa8") - buf.write("\u0ab9\u0abd\u0ac6\u0aca\u0acc\u0ad3\u0ada\u0add\u0ae0") - buf.write("\u0ae7\u0aee\u0af1\u0af8\u0b00\u0b03\u0b10\u0b24\u0b2e") - buf.write("\u0b31\u0b3a\u0b3d\u0b3f\u0b42\u0b45\u0b57\u0b60\u0b67") - buf.write("\u0b6e\u0b75\u0b7f\u0b82\u0b87\u0b8f\u0b95\u0b9a\u0b9f") - buf.write("\u0ba3\u0ba7\u0bab\u0baf\u0bb3\u0bb7\u0bba\u0bc3") - return buf.getvalue() - - -class SqlBaseParser ( Parser ): - - grammarFileName = "SqlBase.g4" - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - sharedContextCache = PredictionContextCache() - - literalNames = [ "", "';'", "'('", "')'", "','", "'.'", "'/*+'", - "'*/'", "'->'", "'['", "']'", "':'", "'ADD'", "'AFTER'", - "'ALL'", "'ALTER'", "'ANALYZE'", "'AND'", "'ANTI'", - "'ANY'", "'ARCHIVE'", "'ARRAY'", "'AS'", "'ASC'", "'AT'", - "'AUTHORIZATION'", "'BETWEEN'", "'BOTH'", "'BUCKET'", - "'BUCKETS'", "'BY'", "'CACHE'", "'CASCADE'", "'CASE'", - "'CAST'", "'CHANGE'", "'CHECK'", "'CLEAR'", "'CLUSTER'", - "'CLUSTERED'", "'CODEGEN'", "'COLLATE'", "'COLLECTION'", - "'COLUMN'", "'COLUMNS'", "'COMMENT'", "'COMMIT'", "'COMPACT'", - "'COMPACTIONS'", "'COMPUTE'", "'CONCATENATE'", "'CONSTRAINT'", - "'COST'", "'CREATE'", "'CROSS'", "'CUBE'", "'CURRENT'", - "'CURRENT_DATE'", "'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", - "'CURRENT_USER'", "'DATA'", "'DATABASE'", "", - "'DAY'", "'DBPROPERTIES'", "'DEFINED'", "'DELETE'", - "'DELIMITED'", "'DESC'", "'DESCRIBE'", "'DFS'", "'DIRECTORIES'", - "'DIRECTORY'", "'DISTINCT'", "'DISTRIBUTE'", "'DROP'", - "'ELSE'", "'END'", "'ESCAPE'", "'ESCAPED'", "'EXCEPT'", - "'EXCHANGE'", "'EXISTS'", "'EXPLAIN'", "'EXPORT'", - "'EXTENDED'", "'EXTERNAL'", "'EXTRACT'", "'FALSE'", - "'FETCH'", "'FIELDS'", "'FILTER'", "'FILEFORMAT'", - "'FIRST'", "'FOLLOWING'", "'FOR'", "'FOREIGN'", "'FORMAT'", - "'FORMATTED'", "'FROM'", "'FULL'", "'FUNCTION'", "'FUNCTIONS'", - "'GLOBAL'", "'GRANT'", "'GROUP'", "'GROUPING'", "'HAVING'", - "'HOUR'", "'IF'", "'IGNORE'", "'IMPORT'", "'IN'", "'INDEX'", - "'INDEXES'", "'INNER'", "'INPATH'", "'INPUTFORMAT'", - "'INSERT'", "'INTERSECT'", "'INTERVAL'", "'INTO'", - "'IS'", "'ITEMS'", "'JOIN'", "'KEYS'", "'LAST'", "'LATERAL'", - "'LAZY'", "'LEADING'", "'LEFT'", "'LIKE'", "'LIMIT'", - "'LINES'", "'LIST'", "'LOAD'", "'LOCAL'", "'LOCATION'", - "'LOCK'", "'LOCKS'", "'LOGICAL'", "'MACRO'", "'MAP'", - "'MATCHED'", "'MERGE'", "'MINUTE'", "'MONTH'", "'MSCK'", - "'NAMESPACE'", "'NAMESPACES'", "'NATURAL'", "'NO'", - "", "'NULL'", "'NULLS'", "'OF'", "'ON'", "'ONLY'", - "'OPTION'", "'OPTIONS'", "'OR'", "'ORDER'", "'OUT'", - "'OUTER'", "'OUTPUTFORMAT'", "'OVER'", "'OVERLAPS'", - "'OVERLAY'", "'OVERWRITE'", "'PARTITION'", "'PARTITIONED'", - "'PARTITIONS'", "'PERCENT'", "'PIVOT'", "'PLACING'", - "'POSITION'", "'PRECEDING'", "'PRIMARY'", "'PRINCIPALS'", - "'PROPERTIES'", "'PURGE'", "'QUERY'", "'RANGE'", "'RECORDREADER'", - "'RECORDWRITER'", "'RECOVER'", "'REDUCE'", "'REFERENCES'", - "'REFRESH'", "'RENAME'", "'REPAIR'", "'REPLACE'", "'RESET'", - "'RESTRICT'", "'REVOKE'", "'RIGHT'", "", "'ROLE'", - "'ROLES'", "'ROLLBACK'", "'ROLLUP'", "'ROW'", "'ROWS'", - "'SCHEMA'", "'SECOND'", "'SELECT'", "'SEMI'", "'SEPARATED'", - "'SERDE'", "'SERDEPROPERTIES'", "'SESSION_USER'", "'SET'", - "'MINUS'", "'SETS'", "'SHOW'", "'SKEWED'", "'SOME'", - "'SORT'", "'SORTED'", "'START'", "'STATISTICS'", "'STORED'", - "'STRATIFY'", "'STRUCT'", "'SUBSTR'", "'SUBSTRING'", - "'TABLE'", "'TABLES'", "'TABLESAMPLE'", "'TBLPROPERTIES'", - "", "'TERMINATED'", "'THEN'", "'TO'", "'TOUCH'", - "'TRAILING'", "'TRANSACTION'", "'TRANSACTIONS'", "'TRANSFORM'", - "'TRIM'", "'TRUE'", "'TRUNCATE'", "'TYPE'", "'UNARCHIVE'", - "'UNBOUNDED'", "'UNCACHE'", "'UNION'", "'UNIQUE'", - "'UNKNOWN'", "'UNLOCK'", "'UNSET'", "'UPDATE'", "'USE'", - "'USER'", "'USING'", "'VALUES'", "'VIEW'", "'VIEWS'", - "'WHEN'", "'WHERE'", "'WINDOW'", "'WITH'", "'YEAR'", - "", "'<=>'", "'<>'", "'!='", "'<'", "", - "'>'", "", "'+'", "'-'", "'*'", "'/'", "'%'", - "'DIV'", "'~'", "'&'", "'|'", "'||'", "'^'" ] - - symbolicNames = [ "", "", "", "", - "", "", "", "", - "", "", "", "", - "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", - "ANTI", "ANY", "ARCHIVE", "ARRAY", "AS", "ASC", "AT", - "AUTHORIZATION", "BETWEEN", "BOTH", "BUCKET", "BUCKETS", - "BY", "CACHE", "CASCADE", "CASE", "CAST", "CHANGE", - "CHECK", "CLEAR", "CLUSTER", "CLUSTERED", "CODEGEN", - "COLLATE", "COLLECTION", "COLUMN", "COLUMNS", "COMMENT", - "COMMIT", "COMPACT", "COMPACTIONS", "COMPUTE", "CONCATENATE", - "CONSTRAINT", "COST", "CREATE", "CROSS", "CUBE", "CURRENT", - "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", - "CURRENT_USER", "DATA", "DATABASE", "DATABASES", "DAY", - "DBPROPERTIES", "DEFINED", "DELETE", "DELIMITED", - "DESC", "DESCRIBE", "DFS", "DIRECTORIES", "DIRECTORY", - "DISTINCT", "DISTRIBUTE", "DROP", "ELSE", "END", "ESCAPE", - "ESCAPED", "EXCEPT", "EXCHANGE", "EXISTS", "EXPLAIN", - "EXPORT", "EXTENDED", "EXTERNAL", "EXTRACT", "FALSE", - "FETCH", "FIELDS", "FILTER", "FILEFORMAT", "FIRST", - "FOLLOWING", "FOR", "FOREIGN", "FORMAT", "FORMATTED", - "FROM", "FULL", "FUNCTION", "FUNCTIONS", "GLOBAL", - "GRANT", "GROUP", "GROUPING", "HAVING", "HOUR", "IF", - "IGNORE", "IMPORT", "IN", "INDEX", "INDEXES", "INNER", - "INPATH", "INPUTFORMAT", "INSERT", "INTERSECT", "INTERVAL", - "INTO", "IS", "ITEMS", "JOIN", "KEYS", "LAST", "LATERAL", - "LAZY", "LEADING", "LEFT", "LIKE", "LIMIT", "LINES", - "LIST", "LOAD", "LOCAL", "LOCATION", "LOCK", "LOCKS", - "LOGICAL", "MACRO", "MAP", "MATCHED", "MERGE", "MINUTE", - "MONTH", "MSCK", "NAMESPACE", "NAMESPACES", "NATURAL", - "NO", "NOT", "NULL", "NULLS", "OF", "ON", "ONLY", - "OPTION", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", - "OUTPUTFORMAT", "OVER", "OVERLAPS", "OVERLAY", "OVERWRITE", - "PARTITION", "PARTITIONED", "PARTITIONS", "PERCENTLIT", - "PIVOT", "PLACING", "POSITION", "PRECEDING", "PRIMARY", - "PRINCIPALS", "PROPERTIES", "PURGE", "QUERY", "RANGE", - "RECORDREADER", "RECORDWRITER", "RECOVER", "REDUCE", - "REFERENCES", "REFRESH", "RENAME", "REPAIR", "REPLACE", - "RESET", "RESTRICT", "REVOKE", "RIGHT", "RLIKE", "ROLE", - "ROLES", "ROLLBACK", "ROLLUP", "ROW", "ROWS", "SCHEMA", - "SECOND", "SELECT", "SEMI", "SEPARATED", "SERDE", - "SERDEPROPERTIES", "SESSION_USER", "SET", "SETMINUS", - "SETS", "SHOW", "SKEWED", "SOME", "SORT", "SORTED", - "START", "STATISTICS", "STORED", "STRATIFY", "STRUCT", - "SUBSTR", "SUBSTRING", "TABLE", "TABLES", "TABLESAMPLE", - "TBLPROPERTIES", "TEMPORARY", "TERMINATED", "THEN", - "TO", "TOUCH", "TRAILING", "TRANSACTION", "TRANSACTIONS", - "TRANSFORM", "TRIM", "TRUE", "TRUNCATE", "TYPE", "UNARCHIVE", - "UNBOUNDED", "UNCACHE", "UNION", "UNIQUE", "UNKNOWN", - "UNLOCK", "UNSET", "UPDATE", "USE", "USER", "USING", - "VALUES", "VIEW", "VIEWS", "WHEN", "WHERE", "WINDOW", - "WITH", "YEAR", "EQ", "NSEQ", "NEQ", "NEQJ", "LT", - "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "DIV", "TILDE", "AMPERSAND", "PIPE", "CONCAT_PIPE", - "HAT", "STRING", "BIGINT_LITERAL", "SMALLINT_LITERAL", - "TINYINT_LITERAL", "INTEGER_VALUE", "EXPONENT_VALUE", - "DECIMAL_VALUE", "DOUBLE_LITERAL", "BIGDECIMAL_LITERAL", - "IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", - "BRACKETED_COMMENT", "WS", "UNRECOGNIZED" ] - - RULE_singleStatement = 0 - RULE_singleExpression = 1 - RULE_singleTableIdentifier = 2 - RULE_singleMultipartIdentifier = 3 - RULE_singleFunctionIdentifier = 4 - RULE_singleDataType = 5 - RULE_singleTableSchema = 6 - RULE_statement = 7 - RULE_unsupportedHiveNativeCommands = 8 - RULE_createTableHeader = 9 - RULE_replaceTableHeader = 10 - RULE_bucketSpec = 11 - RULE_skewSpec = 12 - RULE_locationSpec = 13 - RULE_commentSpec = 14 - RULE_query = 15 - RULE_insertInto = 16 - RULE_partitionSpecLocation = 17 - RULE_partitionSpec = 18 - RULE_partitionVal = 19 - RULE_namespace = 20 - RULE_describeFuncName = 21 - RULE_describeColName = 22 - RULE_ctes = 23 - RULE_namedQuery = 24 - RULE_tableProvider = 25 - RULE_createTableClauses = 26 - RULE_tablePropertyList = 27 - RULE_tableProperty = 28 - RULE_tablePropertyKey = 29 - RULE_tablePropertyValue = 30 - RULE_constantList = 31 - RULE_nestedConstantList = 32 - RULE_createFileFormat = 33 - RULE_fileFormat = 34 - RULE_storageHandler = 35 - RULE_resource = 36 - RULE_dmlStatementNoWith = 37 - RULE_queryOrganization = 38 - RULE_multiInsertQueryBody = 39 - RULE_queryTerm = 40 - RULE_queryPrimary = 41 - RULE_sortItem = 42 - RULE_fromStatement = 43 - RULE_fromStatementBody = 44 - RULE_querySpecification = 45 - RULE_transformClause = 46 - RULE_selectClause = 47 - RULE_setClause = 48 - RULE_matchedClause = 49 - RULE_notMatchedClause = 50 - RULE_matchedAction = 51 - RULE_notMatchedAction = 52 - RULE_assignmentList = 53 - RULE_assignment = 54 - RULE_whereClause = 55 - RULE_havingClause = 56 - RULE_hint = 57 - RULE_hintStatement = 58 - RULE_fromClause = 59 - RULE_aggregationClause = 60 - RULE_groupingSet = 61 - RULE_pivotClause = 62 - RULE_pivotColumn = 63 - RULE_pivotValue = 64 - RULE_lateralView = 65 - RULE_setQuantifier = 66 - RULE_relation = 67 - RULE_joinRelation = 68 - RULE_joinType = 69 - RULE_joinCriteria = 70 - RULE_sample = 71 - RULE_sampleMethod = 72 - RULE_identifierList = 73 - RULE_identifierSeq = 74 - RULE_orderedIdentifierList = 75 - RULE_orderedIdentifier = 76 - RULE_identifierCommentList = 77 - RULE_identifierComment = 78 - RULE_relationPrimary = 79 - RULE_inlineTable = 80 - RULE_functionTable = 81 - RULE_tableAlias = 82 - RULE_rowFormat = 83 - RULE_multipartIdentifierList = 84 - RULE_multipartIdentifier = 85 - RULE_tableIdentifier = 86 - RULE_functionIdentifier = 87 - RULE_namedExpression = 88 - RULE_namedExpressionSeq = 89 - RULE_transformList = 90 - RULE_transform = 91 - RULE_transformArgument = 92 - RULE_expression = 93 - RULE_booleanExpression = 94 - RULE_predicate = 95 - RULE_valueExpression = 96 - RULE_primaryExpression = 97 - RULE_constant = 98 - RULE_comparisonOperator = 99 - RULE_arithmeticOperator = 100 - RULE_predicateOperator = 101 - RULE_booleanValue = 102 - RULE_interval = 103 - RULE_errorCapturingMultiUnitsInterval = 104 - RULE_multiUnitsInterval = 105 - RULE_errorCapturingUnitToUnitInterval = 106 - RULE_unitToUnitInterval = 107 - RULE_intervalValue = 108 - RULE_intervalUnit = 109 - RULE_colPosition = 110 - RULE_dataType = 111 - RULE_qualifiedColTypeWithPositionList = 112 - RULE_qualifiedColTypeWithPosition = 113 - RULE_colTypeList = 114 - RULE_colType = 115 - RULE_complexColTypeList = 116 - RULE_complexColType = 117 - RULE_whenClause = 118 - RULE_windowClause = 119 - RULE_namedWindow = 120 - RULE_windowSpec = 121 - RULE_windowFrame = 122 - RULE_frameBound = 123 - RULE_qualifiedNameList = 124 - RULE_functionName = 125 - RULE_qualifiedName = 126 - RULE_errorCapturingIdentifier = 127 - RULE_errorCapturingIdentifierExtra = 128 - RULE_identifier = 129 - RULE_strictIdentifier = 130 - RULE_quotedIdentifier = 131 - RULE_number = 132 - RULE_alterColumnAction = 133 - RULE_ansiNonReserved = 134 - RULE_strictNonReserved = 135 - RULE_nonReserved = 136 - - ruleNames = [ "singleStatement", "singleExpression", "singleTableIdentifier", - "singleMultipartIdentifier", "singleFunctionIdentifier", - "singleDataType", "singleTableSchema", "statement", "unsupportedHiveNativeCommands", - "createTableHeader", "replaceTableHeader", "bucketSpec", - "skewSpec", "locationSpec", "commentSpec", "query", "insertInto", - "partitionSpecLocation", "partitionSpec", "partitionVal", - "namespace", "describeFuncName", "describeColName", "ctes", - "namedQuery", "tableProvider", "createTableClauses", - "tablePropertyList", "tableProperty", "tablePropertyKey", - "tablePropertyValue", "constantList", "nestedConstantList", - "createFileFormat", "fileFormat", "storageHandler", "resource", - "dmlStatementNoWith", "queryOrganization", "multiInsertQueryBody", - "queryTerm", "queryPrimary", "sortItem", "fromStatement", - "fromStatementBody", "querySpecification", "transformClause", - "selectClause", "setClause", "matchedClause", "notMatchedClause", - "matchedAction", "notMatchedAction", "assignmentList", - "assignment", "whereClause", "havingClause", "hint", - "hintStatement", "fromClause", "aggregationClause", "groupingSet", - "pivotClause", "pivotColumn", "pivotValue", "lateralView", - "setQuantifier", "relation", "joinRelation", "joinType", - "joinCriteria", "sample", "sampleMethod", "identifierList", - "identifierSeq", "orderedIdentifierList", "orderedIdentifier", - "identifierCommentList", "identifierComment", "relationPrimary", - "inlineTable", "functionTable", "tableAlias", "rowFormat", - "multipartIdentifierList", "multipartIdentifier", "tableIdentifier", - "functionIdentifier", "namedExpression", "namedExpressionSeq", - "transformList", "transform", "transformArgument", "expression", - "booleanExpression", "predicate", "valueExpression", - "primaryExpression", "constant", "comparisonOperator", - "arithmeticOperator", "predicateOperator", "booleanValue", - "interval", "errorCapturingMultiUnitsInterval", "multiUnitsInterval", - "errorCapturingUnitToUnitInterval", "unitToUnitInterval", - "intervalValue", "intervalUnit", "colPosition", "dataType", - "qualifiedColTypeWithPositionList", "qualifiedColTypeWithPosition", - "colTypeList", "colType", "complexColTypeList", "complexColType", - "whenClause", "windowClause", "namedWindow", "windowSpec", - "windowFrame", "frameBound", "qualifiedNameList", "functionName", - "qualifiedName", "errorCapturingIdentifier", "errorCapturingIdentifierExtra", - "identifier", "strictIdentifier", "quotedIdentifier", - "number", "alterColumnAction", "ansiNonReserved", "strictNonReserved", - "nonReserved" ] - - EOF = Token.EOF - T__0=1 - T__1=2 - T__2=3 - T__3=4 - T__4=5 - T__5=6 - T__6=7 - T__7=8 - T__8=9 - T__9=10 - T__10=11 - ADD=12 - AFTER=13 - ALL=14 - ALTER=15 - ANALYZE=16 - AND=17 - ANTI=18 - ANY=19 - ARCHIVE=20 - ARRAY=21 - AS=22 - ASC=23 - AT=24 - AUTHORIZATION=25 - BETWEEN=26 - BOTH=27 - BUCKET=28 - BUCKETS=29 - BY=30 - CACHE=31 - CASCADE=32 - CASE=33 - CAST=34 - CHANGE=35 - CHECK=36 - CLEAR=37 - CLUSTER=38 - CLUSTERED=39 - CODEGEN=40 - COLLATE=41 - COLLECTION=42 - COLUMN=43 - COLUMNS=44 - COMMENT=45 - COMMIT=46 - COMPACT=47 - COMPACTIONS=48 - COMPUTE=49 - CONCATENATE=50 - CONSTRAINT=51 - COST=52 - CREATE=53 - CROSS=54 - CUBE=55 - CURRENT=56 - CURRENT_DATE=57 - CURRENT_TIME=58 - CURRENT_TIMESTAMP=59 - CURRENT_USER=60 - DATA=61 - DATABASE=62 - DATABASES=63 - DAY=64 - DBPROPERTIES=65 - DEFINED=66 - DELETE=67 - DELIMITED=68 - DESC=69 - DESCRIBE=70 - DFS=71 - DIRECTORIES=72 - DIRECTORY=73 - DISTINCT=74 - DISTRIBUTE=75 - DROP=76 - ELSE=77 - END=78 - ESCAPE=79 - ESCAPED=80 - EXCEPT=81 - EXCHANGE=82 - EXISTS=83 - EXPLAIN=84 - EXPORT=85 - EXTENDED=86 - EXTERNAL=87 - EXTRACT=88 - FALSE=89 - FETCH=90 - FIELDS=91 - FILTER=92 - FILEFORMAT=93 - FIRST=94 - FOLLOWING=95 - FOR=96 - FOREIGN=97 - FORMAT=98 - FORMATTED=99 - FROM=100 - FULL=101 - FUNCTION=102 - FUNCTIONS=103 - GLOBAL=104 - GRANT=105 - GROUP=106 - GROUPING=107 - HAVING=108 - HOUR=109 - IF=110 - IGNORE=111 - IMPORT=112 - IN=113 - INDEX=114 - INDEXES=115 - INNER=116 - INPATH=117 - INPUTFORMAT=118 - INSERT=119 - INTERSECT=120 - INTERVAL=121 - INTO=122 - IS=123 - ITEMS=124 - JOIN=125 - KEYS=126 - LAST=127 - LATERAL=128 - LAZY=129 - LEADING=130 - LEFT=131 - LIKE=132 - LIMIT=133 - LINES=134 - LIST=135 - LOAD=136 - LOCAL=137 - LOCATION=138 - LOCK=139 - LOCKS=140 - LOGICAL=141 - MACRO=142 - MAP=143 - MATCHED=144 - MERGE=145 - MINUTE=146 - MONTH=147 - MSCK=148 - NAMESPACE=149 - NAMESPACES=150 - NATURAL=151 - NO=152 - NOT=153 - NULL=154 - NULLS=155 - OF=156 - ON=157 - ONLY=158 - OPTION=159 - OPTIONS=160 - OR=161 - ORDER=162 - OUT=163 - OUTER=164 - OUTPUTFORMAT=165 - OVER=166 - OVERLAPS=167 - OVERLAY=168 - OVERWRITE=169 - PARTITION=170 - PARTITIONED=171 - PARTITIONS=172 - PERCENTLIT=173 - PIVOT=174 - PLACING=175 - POSITION=176 - PRECEDING=177 - PRIMARY=178 - PRINCIPALS=179 - PROPERTIES=180 - PURGE=181 - QUERY=182 - RANGE=183 - RECORDREADER=184 - RECORDWRITER=185 - RECOVER=186 - REDUCE=187 - REFERENCES=188 - REFRESH=189 - RENAME=190 - REPAIR=191 - REPLACE=192 - RESET=193 - RESTRICT=194 - REVOKE=195 - RIGHT=196 - RLIKE=197 - ROLE=198 - ROLES=199 - ROLLBACK=200 - ROLLUP=201 - ROW=202 - ROWS=203 - SCHEMA=204 - SECOND=205 - SELECT=206 - SEMI=207 - SEPARATED=208 - SERDE=209 - SERDEPROPERTIES=210 - SESSION_USER=211 - SET=212 - SETMINUS=213 - SETS=214 - SHOW=215 - SKEWED=216 - SOME=217 - SORT=218 - SORTED=219 - START=220 - STATISTICS=221 - STORED=222 - STRATIFY=223 - STRUCT=224 - SUBSTR=225 - SUBSTRING=226 - TABLE=227 - TABLES=228 - TABLESAMPLE=229 - TBLPROPERTIES=230 - TEMPORARY=231 - TERMINATED=232 - THEN=233 - TO=234 - TOUCH=235 - TRAILING=236 - TRANSACTION=237 - TRANSACTIONS=238 - TRANSFORM=239 - TRIM=240 - TRUE=241 - TRUNCATE=242 - TYPE=243 - UNARCHIVE=244 - UNBOUNDED=245 - UNCACHE=246 - UNION=247 - UNIQUE=248 - UNKNOWN=249 - UNLOCK=250 - UNSET=251 - UPDATE=252 - USE=253 - USER=254 - USING=255 - VALUES=256 - VIEW=257 - VIEWS=258 - WHEN=259 - WHERE=260 - WINDOW=261 - WITH=262 - YEAR=263 - EQ=264 - NSEQ=265 - NEQ=266 - NEQJ=267 - LT=268 - LTE=269 - GT=270 - GTE=271 - PLUS=272 - MINUS=273 - ASTERISK=274 - SLASH=275 - PERCENT=276 - DIV=277 - TILDE=278 - AMPERSAND=279 - PIPE=280 - CONCAT_PIPE=281 - HAT=282 - STRING=283 - BIGINT_LITERAL=284 - SMALLINT_LITERAL=285 - TINYINT_LITERAL=286 - INTEGER_VALUE=287 - EXPONENT_VALUE=288 - DECIMAL_VALUE=289 - DOUBLE_LITERAL=290 - BIGDECIMAL_LITERAL=291 - IDENTIFIER=292 - BACKQUOTED_IDENTIFIER=293 - SIMPLE_COMMENT=294 - BRACKETED_COMMENT=295 - WS=296 - UNRECOGNIZED=297 - - def __init__(self, input:TokenStream, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.7.1") - self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) - self._predicates = None - - - - """ - When false, INTERSECT is given the greater precedence over the other set - operations (UNION, EXCEPT and MINUS) as per the SQL standard. - """ - legacy_setops_precedence_enbled = False - - """ - When false, a literal with an exponent would be converted into - double type rather than decimal type. - """ - legacy_exponent_literal_as_decimal_enabled = False - - """ - When false, CREATE TABLE syntax without a provider will use - the value of spark.sql.sources.default as its provider. - """ - legacy_create_hive_table_by_default_enabled = False - - """ - When true, the behavior of keywords follows ANSI SQL standard. - """ - SQL_standard_keyword_behavior = False - - def isValidDecimal(self): - """ - Verify whether current token is a valid decimal token (which contains dot). - Returns true if the character that follows the token is not a digit or letter or underscore. - - For example: - For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. - For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. - For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. - For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed - by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' - which is not a digit or letter or underscore. - """ - nextChar = self._input.LA(1) - if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': - return False - else: - return True - - def isHint(self): - """ - This method will be called when we see '/*' and try to match it as a bracketed comment. - If the next character is '+', it should be parsed as hint later, and we cannot match - it as a bracketed comment. - - Returns true if the next character is '+'. - """ - nextChar = self._input.LA(1) - if nextChar == '+': - return True - else: - return False - - - class SingleStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def statement(self): - return self.getTypedRuleContext(SqlBaseParser.StatementContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleStatement" ): - listener.enterSingleStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleStatement" ): - listener.exitSingleStatement(self) - - - - - def singleStatement(self): - - localctx = SqlBaseParser.SingleStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 0, self.RULE_singleStatement) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 274 - self.statement() - self.state = 278 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__0: - self.state = 275 - self.match(SqlBaseParser.T__0) - self.state = 280 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 281 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def namedExpression(self): - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleExpression - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleExpression" ): - listener.enterSingleExpression(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleExpression" ): - listener.exitSingleExpression(self) - - - - - def singleExpression(self): - - localctx = SqlBaseParser.SingleExpressionContext(self, self._ctx, self.state) - self.enterRule(localctx, 2, self.RULE_singleExpression) - try: - self.enterOuterAlt(localctx, 1) - self.state = 283 - self.namedExpression() - self.state = 284 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleTableIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def tableIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleTableIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleTableIdentifier" ): - listener.enterSingleTableIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleTableIdentifier" ): - listener.exitSingleTableIdentifier(self) - - - - - def singleTableIdentifier(self): - - localctx = SqlBaseParser.SingleTableIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 4, self.RULE_singleTableIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 286 - self.tableIdentifier() - self.state = 287 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleMultipartIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleMultipartIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleMultipartIdentifier" ): - listener.enterSingleMultipartIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleMultipartIdentifier" ): - listener.exitSingleMultipartIdentifier(self) - - - - - def singleMultipartIdentifier(self): - - localctx = SqlBaseParser.SingleMultipartIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 6, self.RULE_singleMultipartIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 289 - self.multipartIdentifier() - self.state = 290 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleFunctionIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def functionIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.FunctionIdentifierContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleFunctionIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleFunctionIdentifier" ): - listener.enterSingleFunctionIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleFunctionIdentifier" ): - listener.exitSingleFunctionIdentifier(self) - - - - - def singleFunctionIdentifier(self): - - localctx = SqlBaseParser.SingleFunctionIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 8, self.RULE_singleFunctionIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 292 - self.functionIdentifier() - self.state = 293 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleDataTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleDataType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleDataType" ): - listener.enterSingleDataType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleDataType" ): - listener.exitSingleDataType(self) - - - - - def singleDataType(self): - - localctx = SqlBaseParser.SingleDataTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 10, self.RULE_singleDataType) - try: - self.enterOuterAlt(localctx, 1) - self.state = 295 - self.dataType() - self.state = 296 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SingleTableSchemaContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def colTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) - - - def EOF(self): - return self.getToken(SqlBaseParser.EOF, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_singleTableSchema - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleTableSchema" ): - listener.enterSingleTableSchema(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleTableSchema" ): - listener.exitSingleTableSchema(self) - - - - - def singleTableSchema(self): - - localctx = SqlBaseParser.SingleTableSchemaContext(self, self._ctx, self.state) - self.enterRule(localctx, 12, self.RULE_singleTableSchema) - try: - self.enterOuterAlt(localctx, 1) - self.state = 298 - self.colTypeList() - self.state = 299 - self.match(SqlBaseParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class StatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_statement - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class ExplainContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def EXPLAIN(self): - return self.getToken(SqlBaseParser.EXPLAIN, 0) - def statement(self): - return self.getTypedRuleContext(SqlBaseParser.StatementContext,0) - - def LOGICAL(self): - return self.getToken(SqlBaseParser.LOGICAL, 0) - def FORMATTED(self): - return self.getToken(SqlBaseParser.FORMATTED, 0) - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - def CODEGEN(self): - return self.getToken(SqlBaseParser.CODEGEN, 0) - def COST(self): - return self.getToken(SqlBaseParser.COST, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExplain" ): - listener.enterExplain(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExplain" ): - listener.exitExplain(self) - - - class ResetConfigurationContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def RESET(self): - return self.getToken(SqlBaseParser.RESET, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterResetConfiguration" ): - listener.enterResetConfiguration(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitResetConfiguration" ): - listener.exitResetConfiguration(self) - - - class AlterViewQueryContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAlterViewQuery" ): - listener.enterAlterViewQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAlterViewQuery" ): - listener.exitAlterViewQuery(self) - - - class UseContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def USE(self): - return self.getToken(SqlBaseParser.USE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def NAMESPACE(self): - return self.getToken(SqlBaseParser.NAMESPACE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUse" ): - listener.enterUse(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUse" ): - listener.exitUse(self) - - - class DropNamespaceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def RESTRICT(self): - return self.getToken(SqlBaseParser.RESTRICT, 0) - def CASCADE(self): - return self.getToken(SqlBaseParser.CASCADE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropNamespace" ): - listener.enterDropNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropNamespace" ): - listener.exitDropNamespace(self) - - - class CreateTempViewUsingContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def tableIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) - - def tableProvider(self): - return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) - - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - def GLOBAL(self): - return self.getToken(SqlBaseParser.GLOBAL, 0) - def colTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) - - def OPTIONS(self): - return self.getToken(SqlBaseParser.OPTIONS, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateTempViewUsing" ): - listener.enterCreateTempViewUsing(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateTempViewUsing" ): - listener.exitCreateTempViewUsing(self) - - - class RenameTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.from_ = None # MultipartIdentifierContext - self.to = None # MultipartIdentifierContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def RENAME(self): - return self.getToken(SqlBaseParser.RENAME, 0) - def TO(self): - return self.getToken(SqlBaseParser.TO, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRenameTable" ): - listener.enterRenameTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRenameTable" ): - listener.exitRenameTable(self) - - - class FailNativeCommandContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def ROLE(self): - return self.getToken(SqlBaseParser.ROLE, 0) - def unsupportedHiveNativeCommands(self): - return self.getTypedRuleContext(SqlBaseParser.UnsupportedHiveNativeCommandsContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFailNativeCommand" ): - listener.enterFailNativeCommand(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFailNativeCommand" ): - listener.exitFailNativeCommand(self) - - - class ClearCacheContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def CLEAR(self): - return self.getToken(SqlBaseParser.CLEAR, 0) - def CACHE(self): - return self.getToken(SqlBaseParser.CACHE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterClearCache" ): - listener.enterClearCache(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitClearCache" ): - listener.exitClearCache(self) - - - class DropViewContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropView" ): - listener.enterDropView(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropView" ): - listener.exitDropView(self) - - - class ShowTablesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.pattern = None # Token - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def TABLES(self): - return self.getToken(SqlBaseParser.TABLES, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowTables" ): - listener.enterShowTables(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowTables" ): - listener.exitShowTables(self) - - - class RecoverPartitionsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def RECOVER(self): - return self.getToken(SqlBaseParser.RECOVER, 0) - def PARTITIONS(self): - return self.getToken(SqlBaseParser.PARTITIONS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRecoverPartitions" ): - listener.enterRecoverPartitions(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRecoverPartitions" ): - listener.exitRecoverPartitions(self) - - - class ShowCurrentNamespaceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def CURRENT(self): - return self.getToken(SqlBaseParser.CURRENT, 0) - def NAMESPACE(self): - return self.getToken(SqlBaseParser.NAMESPACE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowCurrentNamespace" ): - listener.enterShowCurrentNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowCurrentNamespace" ): - listener.exitShowCurrentNamespace(self) - - - class RenameTablePartitionContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.from_ = None # PartitionSpecContext - self.to = None # PartitionSpecContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def RENAME(self): - return self.getToken(SqlBaseParser.RENAME, 0) - def TO(self): - return self.getToken(SqlBaseParser.TO, 0) - def partitionSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRenameTablePartition" ): - listener.enterRenameTablePartition(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRenameTablePartition" ): - listener.exitRenameTablePartition(self) - - - class RepairTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def MSCK(self): - return self.getToken(SqlBaseParser.MSCK, 0) - def REPAIR(self): - return self.getToken(SqlBaseParser.REPAIR, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRepairTable" ): - listener.enterRepairTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRepairTable" ): - listener.exitRepairTable(self) - - - class RefreshResourceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def REFRESH(self): - return self.getToken(SqlBaseParser.REFRESH, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRefreshResource" ): - listener.enterRefreshResource(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRefreshResource" ): - listener.exitRefreshResource(self) - - - class ShowCreateTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - def SERDE(self): - return self.getToken(SqlBaseParser.SERDE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowCreateTable" ): - listener.enterShowCreateTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowCreateTable" ): - listener.exitShowCreateTable(self) - - - class ShowNamespacesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.pattern = None # Token - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def DATABASES(self): - return self.getToken(SqlBaseParser.DATABASES, 0) - def NAMESPACES(self): - return self.getToken(SqlBaseParser.NAMESPACES, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowNamespaces" ): - listener.enterShowNamespaces(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowNamespaces" ): - listener.exitShowNamespaces(self) - - - class ShowColumnsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.ns = None # MultipartIdentifierContext - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - def FROM(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.FROM) - else: - return self.getToken(SqlBaseParser.FROM, i) - def IN(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.IN) - else: - return self.getToken(SqlBaseParser.IN, i) - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowColumns" ): - listener.enterShowColumns(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowColumns" ): - listener.exitShowColumns(self) - - - class ReplaceTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def replaceTableHeader(self): - return self.getTypedRuleContext(SqlBaseParser.ReplaceTableHeaderContext,0) - - def tableProvider(self): - return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) - - def createTableClauses(self): - return self.getTypedRuleContext(SqlBaseParser.CreateTableClausesContext,0) - - def colTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterReplaceTable" ): - listener.enterReplaceTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitReplaceTable" ): - listener.exitReplaceTable(self) - - - class AddTablePartitionContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def ADD(self): - return self.getToken(SqlBaseParser.ADD, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def partitionSpecLocation(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecLocationContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecLocationContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAddTablePartition" ): - listener.enterAddTablePartition(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAddTablePartition" ): - listener.exitAddTablePartition(self) - - - class SetNamespaceLocationContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def locationSpec(self): - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetNamespaceLocation" ): - listener.enterSetNamespaceLocation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetNamespaceLocation" ): - listener.exitSetNamespaceLocation(self) - - - class RefreshTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def REFRESH(self): - return self.getToken(SqlBaseParser.REFRESH, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRefreshTable" ): - listener.enterRefreshTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRefreshTable" ): - listener.exitRefreshTable(self) - - - class SetNamespacePropertiesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - def DBPROPERTIES(self): - return self.getToken(SqlBaseParser.DBPROPERTIES, 0) - def PROPERTIES(self): - return self.getToken(SqlBaseParser.PROPERTIES, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetNamespaceProperties" ): - listener.enterSetNamespaceProperties(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetNamespaceProperties" ): - listener.exitSetNamespaceProperties(self) - - - class ManageResourceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.op = None # Token - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def ADD(self): - return self.getToken(SqlBaseParser.ADD, 0) - def LIST(self): - return self.getToken(SqlBaseParser.LIST, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterManageResource" ): - listener.enterManageResource(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitManageResource" ): - listener.exitManageResource(self) - - - class AnalyzeContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ANALYZE(self): - return self.getToken(SqlBaseParser.ANALYZE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def COMPUTE(self): - return self.getToken(SqlBaseParser.COMPUTE, 0) - def STATISTICS(self): - return self.getToken(SqlBaseParser.STATISTICS, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def FOR(self): - return self.getToken(SqlBaseParser.FOR, 0) - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - def identifierSeq(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) - - def ALL(self): - return self.getToken(SqlBaseParser.ALL, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAnalyze" ): - listener.enterAnalyze(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAnalyze" ): - listener.exitAnalyze(self) - - - class CreateHiveTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.columns = None # ColTypeListContext - self.partitionColumns = None # ColTypeListContext - self.partitionColumnNames = None # IdentifierListContext - self.tableProps = None # TablePropertyListContext - self.copyFrom(ctx) - - def createTableHeader(self): - return self.getTypedRuleContext(SqlBaseParser.CreateTableHeaderContext,0) - - def commentSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) - - def bucketSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.BucketSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.BucketSpecContext,i) - - def skewSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.SkewSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.SkewSpecContext,i) - - def rowFormat(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) - else: - return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) - - def createFileFormat(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CreateFileFormatContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,i) - - def locationSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def colTypeList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ColTypeListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,i) - - def PARTITIONED(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.PARTITIONED) - else: - return self.getToken(SqlBaseParser.PARTITIONED, i) - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - def TBLPROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.TBLPROPERTIES) - else: - return self.getToken(SqlBaseParser.TBLPROPERTIES, i) - def identifierList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,i) - - def tablePropertyList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateHiveTable" ): - listener.enterCreateHiveTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateHiveTable" ): - listener.exitCreateHiveTable(self) - - - class CreateFunctionContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.className = None # Token - self.copyFrom(ctx) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def FUNCTION(self): - return self.getToken(SqlBaseParser.FUNCTION, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - def resource(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ResourceContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ResourceContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateFunction" ): - listener.enterCreateFunction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateFunction" ): - listener.exitCreateFunction(self) - - - class ShowTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.ns = None # MultipartIdentifierContext - self.pattern = None # Token - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowTable" ): - listener.enterShowTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowTable" ): - listener.exitShowTable(self) - - - class HiveReplaceColumnsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.columns = None # QualifiedColTypeWithPositionListContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def qualifiedColTypeWithPositionList(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionListContext,0) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterHiveReplaceColumns" ): - listener.enterHiveReplaceColumns(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitHiveReplaceColumns" ): - listener.exitHiveReplaceColumns(self) - - - class CommentNamespaceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.comment = None # Token - self.copyFrom(ctx) - - def COMMENT(self): - return self.getToken(SqlBaseParser.COMMENT, 0) - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IS(self): - return self.getToken(SqlBaseParser.IS, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCommentNamespace" ): - listener.enterCommentNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCommentNamespace" ): - listener.exitCommentNamespace(self) - - - class CreateTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def createTableHeader(self): - return self.getTypedRuleContext(SqlBaseParser.CreateTableHeaderContext,0) - - def createTableClauses(self): - return self.getTypedRuleContext(SqlBaseParser.CreateTableClausesContext,0) - - def colTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) - - def tableProvider(self): - return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateTable" ): - listener.enterCreateTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateTable" ): - listener.exitCreateTable(self) - - - class DmlStatementContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def dmlStatementNoWith(self): - return self.getTypedRuleContext(SqlBaseParser.DmlStatementNoWithContext,0) - - def ctes(self): - return self.getTypedRuleContext(SqlBaseParser.CtesContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDmlStatement" ): - listener.enterDmlStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDmlStatement" ): - listener.exitDmlStatement(self) - - - class CreateTableLikeContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.target = None # TableIdentifierContext - self.source = None # TableIdentifierContext - self.tableProps = None # TablePropertyListContext - self.copyFrom(ctx) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - def tableIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TableIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,i) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def tableProvider(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TableProviderContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,i) - - def rowFormat(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) - else: - return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) - - def createFileFormat(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CreateFileFormatContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,i) - - def locationSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) - - def TBLPROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.TBLPROPERTIES) - else: - return self.getToken(SqlBaseParser.TBLPROPERTIES, i) - def tablePropertyList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateTableLike" ): - listener.enterCreateTableLike(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateTableLike" ): - listener.exitCreateTableLike(self) - - - class UncacheTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def UNCACHE(self): - return self.getToken(SqlBaseParser.UNCACHE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUncacheTable" ): - listener.enterUncacheTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUncacheTable" ): - listener.exitUncacheTable(self) - - - class DropFunctionContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def FUNCTION(self): - return self.getToken(SqlBaseParser.FUNCTION, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropFunction" ): - listener.enterDropFunction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropFunction" ): - listener.exitDropFunction(self) - - - class DescribeRelationContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.option = None # Token - self.copyFrom(ctx) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def describeColName(self): - return self.getTypedRuleContext(SqlBaseParser.DescribeColNameContext,0) - - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - def FORMATTED(self): - return self.getToken(SqlBaseParser.FORMATTED, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeRelation" ): - listener.enterDescribeRelation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeRelation" ): - listener.exitDescribeRelation(self) - - - class LoadDataContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.path = None # Token - self.copyFrom(ctx) - - def LOAD(self): - return self.getToken(SqlBaseParser.LOAD, 0) - def DATA(self): - return self.getToken(SqlBaseParser.DATA, 0) - def INPATH(self): - return self.getToken(SqlBaseParser.INPATH, 0) - def INTO(self): - return self.getToken(SqlBaseParser.INTO, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def LOCAL(self): - return self.getToken(SqlBaseParser.LOCAL, 0) - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLoadData" ): - listener.enterLoadData(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLoadData" ): - listener.exitLoadData(self) - - - class ShowPartitionsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def PARTITIONS(self): - return self.getToken(SqlBaseParser.PARTITIONS, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowPartitions" ): - listener.enterShowPartitions(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowPartitions" ): - listener.exitShowPartitions(self) - - - class DescribeFunctionContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def FUNCTION(self): - return self.getToken(SqlBaseParser.FUNCTION, 0) - def describeFuncName(self): - return self.getTypedRuleContext(SqlBaseParser.DescribeFuncNameContext,0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeFunction" ): - listener.enterDescribeFunction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeFunction" ): - listener.exitDescribeFunction(self) - - - class RenameTableColumnContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.from_ = None # MultipartIdentifierContext - self.to = None # ErrorCapturingIdentifierContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def RENAME(self): - return self.getToken(SqlBaseParser.RENAME, 0) - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - def TO(self): - return self.getToken(SqlBaseParser.TO, 0) - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRenameTableColumn" ): - listener.enterRenameTableColumn(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRenameTableColumn" ): - listener.exitRenameTableColumn(self) - - - class StatementDefaultContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStatementDefault" ): - listener.enterStatementDefault(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStatementDefault" ): - listener.exitStatementDefault(self) - - - class HiveChangeColumnContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.colName = None # MultipartIdentifierContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def CHANGE(self): - return self.getToken(SqlBaseParser.CHANGE, 0) - def colType(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeContext,0) - - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - def colPosition(self): - return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterHiveChangeColumn" ): - listener.enterHiveChangeColumn(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitHiveChangeColumn" ): - listener.exitHiveChangeColumn(self) - - - class DescribeQueryContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - def QUERY(self): - return self.getToken(SqlBaseParser.QUERY, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeQuery" ): - listener.enterDescribeQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeQuery" ): - listener.exitDescribeQuery(self) - - - class TruncateTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def TRUNCATE(self): - return self.getToken(SqlBaseParser.TRUNCATE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTruncateTable" ): - listener.enterTruncateTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTruncateTable" ): - listener.exitTruncateTable(self) - - - class SetTableSerDeContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def SERDE(self): - return self.getToken(SqlBaseParser.SERDE, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - def SERDEPROPERTIES(self): - return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetTableSerDe" ): - listener.enterSetTableSerDe(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetTableSerDe" ): - listener.exitSetTableSerDe(self) - - - class CreateViewContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def identifierCommentList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierCommentListContext,0) - - def commentSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) - - def PARTITIONED(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.PARTITIONED) - else: - return self.getToken(SqlBaseParser.PARTITIONED, i) - def ON(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.ON) - else: - return self.getToken(SqlBaseParser.ON, i) - def identifierList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,i) - - def TBLPROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.TBLPROPERTIES) - else: - return self.getToken(SqlBaseParser.TBLPROPERTIES, i) - def tablePropertyList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) - - def GLOBAL(self): - return self.getToken(SqlBaseParser.GLOBAL, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateView" ): - listener.enterCreateView(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateView" ): - listener.exitCreateView(self) - - - class DropTablePartitionsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def partitionSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PartitionSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,i) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def PURGE(self): - return self.getToken(SqlBaseParser.PURGE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropTablePartitions" ): - listener.enterDropTablePartitions(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropTablePartitions" ): - listener.exitDropTablePartitions(self) - - - class SetConfigurationContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetConfiguration" ): - listener.enterSetConfiguration(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetConfiguration" ): - listener.exitSetConfiguration(self) - - - class DropTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def PURGE(self): - return self.getToken(SqlBaseParser.PURGE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropTable" ): - listener.enterDropTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropTable" ): - listener.exitDropTable(self) - - - class DescribeNamespaceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeNamespace" ): - listener.enterDescribeNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeNamespace" ): - listener.exitDescribeNamespace(self) - - - class AlterTableAlterColumnContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.column = None # MultipartIdentifierContext - self.copyFrom(ctx) - - def ALTER(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.ALTER) - else: - return self.getToken(SqlBaseParser.ALTER, i) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - def CHANGE(self): - return self.getToken(SqlBaseParser.CHANGE, 0) - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - def alterColumnAction(self): - return self.getTypedRuleContext(SqlBaseParser.AlterColumnActionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAlterTableAlterColumn" ): - listener.enterAlterTableAlterColumn(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAlterTableAlterColumn" ): - listener.exitAlterTableAlterColumn(self) - - - class CommentTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.comment = None # Token - self.copyFrom(ctx) - - def COMMENT(self): - return self.getToken(SqlBaseParser.COMMENT, 0) - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IS(self): - return self.getToken(SqlBaseParser.IS, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCommentTable" ): - listener.enterCommentTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCommentTable" ): - listener.exitCommentTable(self) - - - class CreateNamespaceContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - def namespace(self): - return self.getTypedRuleContext(SqlBaseParser.NamespaceContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def commentSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) - - def locationSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) - - def WITH(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.WITH) - else: - return self.getToken(SqlBaseParser.WITH, i) - def tablePropertyList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) - - def DBPROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.DBPROPERTIES) - else: - return self.getToken(SqlBaseParser.DBPROPERTIES, i) - def PROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.PROPERTIES) - else: - return self.getToken(SqlBaseParser.PROPERTIES, i) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateNamespace" ): - listener.enterCreateNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateNamespace" ): - listener.exitCreateNamespace(self) - - - class ShowTblPropertiesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.table = None # MultipartIdentifierContext - self.key = None # TablePropertyKeyContext - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def TBLPROPERTIES(self): - return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def tablePropertyKey(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyKeyContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowTblProperties" ): - listener.enterShowTblProperties(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowTblProperties" ): - listener.exitShowTblProperties(self) - - - class UnsetTablePropertiesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def UNSET(self): - return self.getToken(SqlBaseParser.UNSET, 0) - def TBLPROPERTIES(self): - return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnsetTableProperties" ): - listener.enterUnsetTableProperties(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnsetTableProperties" ): - listener.exitUnsetTableProperties(self) - - - class SetTableLocationContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def locationSpec(self): - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetTableLocation" ): - listener.enterSetTableLocation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetTableLocation" ): - listener.exitSetTableLocation(self) - - - class DropTableColumnsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.columns = None # MultipartIdentifierListContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - def multipartIdentifierList(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDropTableColumns" ): - listener.enterDropTableColumns(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDropTableColumns" ): - listener.exitDropTableColumns(self) - - - class ShowViewsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.pattern = None # Token - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def VIEWS(self): - return self.getToken(SqlBaseParser.VIEWS, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowViews" ): - listener.enterShowViews(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowViews" ): - listener.exitShowViews(self) - - - class ShowFunctionsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.pattern = None # Token - self.copyFrom(ctx) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - def FUNCTIONS(self): - return self.getToken(SqlBaseParser.FUNCTIONS, 0) - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterShowFunctions" ): - listener.enterShowFunctions(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitShowFunctions" ): - listener.exitShowFunctions(self) - - - class CacheTableContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.options = None # TablePropertyListContext - self.copyFrom(ctx) - - def CACHE(self): - return self.getToken(SqlBaseParser.CACHE, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def LAZY(self): - return self.getToken(SqlBaseParser.LAZY, 0) - def OPTIONS(self): - return self.getToken(SqlBaseParser.OPTIONS, 0) - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCacheTable" ): - listener.enterCacheTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCacheTable" ): - listener.exitCacheTable(self) - - - class AddTableColumnsContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.columns = None # QualifiedColTypeWithPositionListContext - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def ADD(self): - return self.getToken(SqlBaseParser.ADD, 0) - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - def qualifiedColTypeWithPositionList(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAddTableColumns" ): - listener.enterAddTableColumns(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAddTableColumns" ): - listener.exitAddTableColumns(self) - - - class SetTablePropertiesContext(StatementContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StatementContext - super().__init__(parser) - self.copyFrom(ctx) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - def TBLPROPERTIES(self): - return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetTableProperties" ): - listener.enterSetTableProperties(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetTableProperties" ): - listener.exitSetTableProperties(self) - - - - def statement(self): - - localctx = SqlBaseParser.StatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 14, self.RULE_statement) - self._la = 0 # Token type - try: - self.state = 1025 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,110,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.StatementDefaultContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 301 - self.query() - pass - - elif la_ == 2: - localctx = SqlBaseParser.DmlStatementContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 303 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.WITH: - self.state = 302 - self.ctes() - - - self.state = 305 - self.dmlStatementNoWith() - pass - - elif la_ == 3: - localctx = SqlBaseParser.UseContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 306 - self.match(SqlBaseParser.USE) - self.state = 308 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,2,self._ctx) - if la_ == 1: - self.state = 307 - self.match(SqlBaseParser.NAMESPACE) - - - self.state = 310 - self.multipartIdentifier() - pass - - elif la_ == 4: - localctx = SqlBaseParser.CreateNamespaceContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 311 - self.match(SqlBaseParser.CREATE) - self.state = 312 - self.namespace() - self.state = 316 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,3,self._ctx) - if la_ == 1: - self.state = 313 - self.match(SqlBaseParser.IF) - self.state = 314 - self.match(SqlBaseParser.NOT) - self.state = 315 - self.match(SqlBaseParser.EXISTS) - - - self.state = 318 - self.multipartIdentifier() - self.state = 326 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.LOCATION or _la==SqlBaseParser.WITH: - self.state = 324 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.COMMENT]: - self.state = 319 - self.commentSpec() - pass - elif token in [SqlBaseParser.LOCATION]: - self.state = 320 - self.locationSpec() - pass - elif token in [SqlBaseParser.WITH]: - self.state = 321 - self.match(SqlBaseParser.WITH) - self.state = 322 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DBPROPERTIES or _la==SqlBaseParser.PROPERTIES): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 323 - self.tablePropertyList() - pass - else: - raise NoViableAltException(self) - - self.state = 328 - self._errHandler.sync(self) - _la = self._input.LA(1) - - pass - - elif la_ == 5: - localctx = SqlBaseParser.SetNamespacePropertiesContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 329 - self.match(SqlBaseParser.ALTER) - self.state = 330 - self.namespace() - self.state = 331 - self.multipartIdentifier() - self.state = 332 - self.match(SqlBaseParser.SET) - self.state = 333 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DBPROPERTIES or _la==SqlBaseParser.PROPERTIES): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 334 - self.tablePropertyList() - pass - - elif la_ == 6: - localctx = SqlBaseParser.SetNamespaceLocationContext(self, localctx) - self.enterOuterAlt(localctx, 6) - self.state = 336 - self.match(SqlBaseParser.ALTER) - self.state = 337 - self.namespace() - self.state = 338 - self.multipartIdentifier() - self.state = 339 - self.match(SqlBaseParser.SET) - self.state = 340 - self.locationSpec() - pass - - elif la_ == 7: - localctx = SqlBaseParser.DropNamespaceContext(self, localctx) - self.enterOuterAlt(localctx, 7) - self.state = 342 - self.match(SqlBaseParser.DROP) - self.state = 343 - self.namespace() - self.state = 346 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,6,self._ctx) - if la_ == 1: - self.state = 344 - self.match(SqlBaseParser.IF) - self.state = 345 - self.match(SqlBaseParser.EXISTS) - - - self.state = 348 - self.multipartIdentifier() - self.state = 350 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.CASCADE or _la==SqlBaseParser.RESTRICT: - self.state = 349 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.CASCADE or _la==SqlBaseParser.RESTRICT): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - pass - - elif la_ == 8: - localctx = SqlBaseParser.ShowNamespacesContext(self, localctx) - self.enterOuterAlt(localctx, 8) - self.state = 352 - self.match(SqlBaseParser.SHOW) - self.state = 353 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DATABASES or _la==SqlBaseParser.NAMESPACES): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 356 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: - self.state = 354 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 355 - self.multipartIdentifier() - - - self.state = 362 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: - self.state = 359 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE: - self.state = 358 - self.match(SqlBaseParser.LIKE) - - - self.state = 361 - localctx.pattern = self.match(SqlBaseParser.STRING) - - - pass - - elif la_ == 9: - localctx = SqlBaseParser.CreateTableContext(self, localctx) - self.enterOuterAlt(localctx, 9) - self.state = 364 - if not not self.legacy_create_hive_table_by_default_enabled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.legacy_create_hive_table_by_default_enabled") - self.state = 365 - self.createTableHeader() - self.state = 370 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,11,self._ctx) - if la_ == 1: - self.state = 366 - self.match(SqlBaseParser.T__1) - self.state = 367 - self.colTypeList() - self.state = 368 - self.match(SqlBaseParser.T__2) - - - self.state = 373 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.USING: - self.state = 372 - self.tableProvider() - - - self.state = 375 - self.createTableClauses() - self.state = 380 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: - self.state = 377 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 376 - self.match(SqlBaseParser.AS) - - - self.state = 379 - self.query() - - - pass - - elif la_ == 10: - localctx = SqlBaseParser.CreateTableContext(self, localctx) - self.enterOuterAlt(localctx, 10) - self.state = 382 - if not self.legacy_create_hive_table_by_default_enabled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.legacy_create_hive_table_by_default_enabled") - self.state = 383 - self.createTableHeader() - self.state = 388 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1: - self.state = 384 - self.match(SqlBaseParser.T__1) - self.state = 385 - self.colTypeList() - self.state = 386 - self.match(SqlBaseParser.T__2) - - - self.state = 390 - self.tableProvider() - self.state = 391 - self.createTableClauses() - self.state = 396 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: - self.state = 393 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 392 - self.match(SqlBaseParser.AS) - - - self.state = 395 - self.query() - - - pass - - elif la_ == 11: - localctx = SqlBaseParser.CreateHiveTableContext(self, localctx) - self.enterOuterAlt(localctx, 11) - self.state = 398 - self.createTableHeader() - self.state = 403 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,18,self._ctx) - if la_ == 1: - self.state = 399 - self.match(SqlBaseParser.T__1) - self.state = 400 - localctx.columns = self.colTypeList() - self.state = 401 - self.match(SqlBaseParser.T__2) - - - self.state = 426 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.CLUSTERED or _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.LOCATION or _la==SqlBaseParser.PARTITIONED or ((((_la - 202)) & ~0x3f) == 0 and ((1 << (_la - 202)) & ((1 << (SqlBaseParser.ROW - 202)) | (1 << (SqlBaseParser.SKEWED - 202)) | (1 << (SqlBaseParser.STORED - 202)) | (1 << (SqlBaseParser.TBLPROPERTIES - 202)))) != 0): - self.state = 424 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.COMMENT]: - self.state = 405 - self.commentSpec() - pass - elif token in [SqlBaseParser.PARTITIONED]: - self.state = 415 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,19,self._ctx) - if la_ == 1: - self.state = 406 - self.match(SqlBaseParser.PARTITIONED) - self.state = 407 - self.match(SqlBaseParser.BY) - self.state = 408 - self.match(SqlBaseParser.T__1) - self.state = 409 - localctx.partitionColumns = self.colTypeList() - self.state = 410 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 2: - self.state = 412 - self.match(SqlBaseParser.PARTITIONED) - self.state = 413 - self.match(SqlBaseParser.BY) - self.state = 414 - localctx.partitionColumnNames = self.identifierList() - pass - - - pass - elif token in [SqlBaseParser.CLUSTERED]: - self.state = 417 - self.bucketSpec() - pass - elif token in [SqlBaseParser.SKEWED]: - self.state = 418 - self.skewSpec() - pass - elif token in [SqlBaseParser.ROW]: - self.state = 419 - self.rowFormat() - pass - elif token in [SqlBaseParser.STORED]: - self.state = 420 - self.createFileFormat() - pass - elif token in [SqlBaseParser.LOCATION]: - self.state = 421 - self.locationSpec() - pass - elif token in [SqlBaseParser.TBLPROPERTIES]: - self.state = 422 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 423 - localctx.tableProps = self.tablePropertyList() - pass - else: - raise NoViableAltException(self) - - self.state = 428 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 433 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: - self.state = 430 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 429 - self.match(SqlBaseParser.AS) - - - self.state = 432 - self.query() - - - pass - - elif la_ == 12: - localctx = SqlBaseParser.CreateTableLikeContext(self, localctx) - self.enterOuterAlt(localctx, 12) - self.state = 435 - self.match(SqlBaseParser.CREATE) - self.state = 436 - self.match(SqlBaseParser.TABLE) - self.state = 440 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,24,self._ctx) - if la_ == 1: - self.state = 437 - self.match(SqlBaseParser.IF) - self.state = 438 - self.match(SqlBaseParser.NOT) - self.state = 439 - self.match(SqlBaseParser.EXISTS) - - - self.state = 442 - localctx.target = self.tableIdentifier() - self.state = 443 - self.match(SqlBaseParser.LIKE) - self.state = 444 - localctx.source = self.tableIdentifier() - self.state = 453 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.LOCATION or ((((_la - 202)) & ~0x3f) == 0 and ((1 << (_la - 202)) & ((1 << (SqlBaseParser.ROW - 202)) | (1 << (SqlBaseParser.STORED - 202)) | (1 << (SqlBaseParser.TBLPROPERTIES - 202)) | (1 << (SqlBaseParser.USING - 202)))) != 0): - self.state = 451 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.USING]: - self.state = 445 - self.tableProvider() - pass - elif token in [SqlBaseParser.ROW]: - self.state = 446 - self.rowFormat() - pass - elif token in [SqlBaseParser.STORED]: - self.state = 447 - self.createFileFormat() - pass - elif token in [SqlBaseParser.LOCATION]: - self.state = 448 - self.locationSpec() - pass - elif token in [SqlBaseParser.TBLPROPERTIES]: - self.state = 449 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 450 - localctx.tableProps = self.tablePropertyList() - pass - else: - raise NoViableAltException(self) - - self.state = 455 - self._errHandler.sync(self) - _la = self._input.LA(1) - - pass - - elif la_ == 13: - localctx = SqlBaseParser.ReplaceTableContext(self, localctx) - self.enterOuterAlt(localctx, 13) - self.state = 456 - self.replaceTableHeader() - self.state = 461 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1: - self.state = 457 - self.match(SqlBaseParser.T__1) - self.state = 458 - self.colTypeList() - self.state = 459 - self.match(SqlBaseParser.T__2) - - - self.state = 463 - self.tableProvider() - self.state = 464 - self.createTableClauses() - self.state = 469 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: - self.state = 466 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 465 - self.match(SqlBaseParser.AS) - - - self.state = 468 - self.query() - - - pass - - elif la_ == 14: - localctx = SqlBaseParser.AnalyzeContext(self, localctx) - self.enterOuterAlt(localctx, 14) - self.state = 471 - self.match(SqlBaseParser.ANALYZE) - self.state = 472 - self.match(SqlBaseParser.TABLE) - self.state = 473 - self.multipartIdentifier() - self.state = 475 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 474 - self.partitionSpec() - - - self.state = 477 - self.match(SqlBaseParser.COMPUTE) - self.state = 478 - self.match(SqlBaseParser.STATISTICS) - self.state = 486 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,31,self._ctx) - if la_ == 1: - self.state = 479 - self.identifier() - - elif la_ == 2: - self.state = 480 - self.match(SqlBaseParser.FOR) - self.state = 481 - self.match(SqlBaseParser.COLUMNS) - self.state = 482 - self.identifierSeq() - - elif la_ == 3: - self.state = 483 - self.match(SqlBaseParser.FOR) - self.state = 484 - self.match(SqlBaseParser.ALL) - self.state = 485 - self.match(SqlBaseParser.COLUMNS) - - - pass - - elif la_ == 15: - localctx = SqlBaseParser.AddTableColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 15) - self.state = 488 - self.match(SqlBaseParser.ALTER) - self.state = 489 - self.match(SqlBaseParser.TABLE) - self.state = 490 - self.multipartIdentifier() - self.state = 491 - self.match(SqlBaseParser.ADD) - self.state = 492 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 493 - localctx.columns = self.qualifiedColTypeWithPositionList() - pass - - elif la_ == 16: - localctx = SqlBaseParser.AddTableColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 16) - self.state = 495 - self.match(SqlBaseParser.ALTER) - self.state = 496 - self.match(SqlBaseParser.TABLE) - self.state = 497 - self.multipartIdentifier() - self.state = 498 - self.match(SqlBaseParser.ADD) - self.state = 499 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 500 - self.match(SqlBaseParser.T__1) - self.state = 501 - localctx.columns = self.qualifiedColTypeWithPositionList() - self.state = 502 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 17: - localctx = SqlBaseParser.RenameTableColumnContext(self, localctx) - self.enterOuterAlt(localctx, 17) - self.state = 504 - self.match(SqlBaseParser.ALTER) - self.state = 505 - self.match(SqlBaseParser.TABLE) - self.state = 506 - localctx.table = self.multipartIdentifier() - self.state = 507 - self.match(SqlBaseParser.RENAME) - self.state = 508 - self.match(SqlBaseParser.COLUMN) - self.state = 509 - localctx.from_ = self.multipartIdentifier() - self.state = 510 - self.match(SqlBaseParser.TO) - self.state = 511 - localctx.to = self.errorCapturingIdentifier() - pass - - elif la_ == 18: - localctx = SqlBaseParser.DropTableColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 18) - self.state = 513 - self.match(SqlBaseParser.ALTER) - self.state = 514 - self.match(SqlBaseParser.TABLE) - self.state = 515 - self.multipartIdentifier() - self.state = 516 - self.match(SqlBaseParser.DROP) - self.state = 517 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 518 - self.match(SqlBaseParser.T__1) - self.state = 519 - localctx.columns = self.multipartIdentifierList() - self.state = 520 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 19: - localctx = SqlBaseParser.DropTableColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 19) - self.state = 522 - self.match(SqlBaseParser.ALTER) - self.state = 523 - self.match(SqlBaseParser.TABLE) - self.state = 524 - self.multipartIdentifier() - self.state = 525 - self.match(SqlBaseParser.DROP) - self.state = 526 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.COLUMN or _la==SqlBaseParser.COLUMNS): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 527 - localctx.columns = self.multipartIdentifierList() - pass - - elif la_ == 20: - localctx = SqlBaseParser.RenameTableContext(self, localctx) - self.enterOuterAlt(localctx, 20) - self.state = 529 - self.match(SqlBaseParser.ALTER) - self.state = 530 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 531 - localctx.from_ = self.multipartIdentifier() - self.state = 532 - self.match(SqlBaseParser.RENAME) - self.state = 533 - self.match(SqlBaseParser.TO) - self.state = 534 - localctx.to = self.multipartIdentifier() - pass - - elif la_ == 21: - localctx = SqlBaseParser.SetTablePropertiesContext(self, localctx) - self.enterOuterAlt(localctx, 21) - self.state = 536 - self.match(SqlBaseParser.ALTER) - self.state = 537 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 538 - self.multipartIdentifier() - self.state = 539 - self.match(SqlBaseParser.SET) - self.state = 540 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 541 - self.tablePropertyList() - pass - - elif la_ == 22: - localctx = SqlBaseParser.UnsetTablePropertiesContext(self, localctx) - self.enterOuterAlt(localctx, 22) - self.state = 543 - self.match(SqlBaseParser.ALTER) - self.state = 544 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 545 - self.multipartIdentifier() - self.state = 546 - self.match(SqlBaseParser.UNSET) - self.state = 547 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 550 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IF: - self.state = 548 - self.match(SqlBaseParser.IF) - self.state = 549 - self.match(SqlBaseParser.EXISTS) - - - self.state = 552 - self.tablePropertyList() - pass - - elif la_ == 23: - localctx = SqlBaseParser.AlterTableAlterColumnContext(self, localctx) - self.enterOuterAlt(localctx, 23) - self.state = 554 - self.match(SqlBaseParser.ALTER) - self.state = 555 - self.match(SqlBaseParser.TABLE) - self.state = 556 - localctx.table = self.multipartIdentifier() - self.state = 557 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ALTER or _la==SqlBaseParser.CHANGE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 559 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,33,self._ctx) - if la_ == 1: - self.state = 558 - self.match(SqlBaseParser.COLUMN) - - - self.state = 561 - localctx.column = self.multipartIdentifier() - self.state = 563 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.DROP or _la==SqlBaseParser.FIRST or _la==SqlBaseParser.SET or _la==SqlBaseParser.TYPE: - self.state = 562 - self.alterColumnAction() - - - pass - - elif la_ == 24: - localctx = SqlBaseParser.HiveChangeColumnContext(self, localctx) - self.enterOuterAlt(localctx, 24) - self.state = 565 - self.match(SqlBaseParser.ALTER) - self.state = 566 - self.match(SqlBaseParser.TABLE) - self.state = 567 - localctx.table = self.multipartIdentifier() - self.state = 569 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 568 - self.partitionSpec() - - - self.state = 571 - self.match(SqlBaseParser.CHANGE) - self.state = 573 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,36,self._ctx) - if la_ == 1: - self.state = 572 - self.match(SqlBaseParser.COLUMN) - - - self.state = 575 - localctx.colName = self.multipartIdentifier() - self.state = 576 - self.colType() - self.state = 578 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.FIRST: - self.state = 577 - self.colPosition() - - - pass - - elif la_ == 25: - localctx = SqlBaseParser.HiveReplaceColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 25) - self.state = 580 - self.match(SqlBaseParser.ALTER) - self.state = 581 - self.match(SqlBaseParser.TABLE) - self.state = 582 - localctx.table = self.multipartIdentifier() - self.state = 584 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 583 - self.partitionSpec() - - - self.state = 586 - self.match(SqlBaseParser.REPLACE) - self.state = 587 - self.match(SqlBaseParser.COLUMNS) - self.state = 588 - self.match(SqlBaseParser.T__1) - self.state = 589 - localctx.columns = self.qualifiedColTypeWithPositionList() - self.state = 590 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 26: - localctx = SqlBaseParser.SetTableSerDeContext(self, localctx) - self.enterOuterAlt(localctx, 26) - self.state = 592 - self.match(SqlBaseParser.ALTER) - self.state = 593 - self.match(SqlBaseParser.TABLE) - self.state = 594 - self.multipartIdentifier() - self.state = 596 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 595 - self.partitionSpec() - - - self.state = 598 - self.match(SqlBaseParser.SET) - self.state = 599 - self.match(SqlBaseParser.SERDE) - self.state = 600 - self.match(SqlBaseParser.STRING) - self.state = 604 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.WITH: - self.state = 601 - self.match(SqlBaseParser.WITH) - self.state = 602 - self.match(SqlBaseParser.SERDEPROPERTIES) - self.state = 603 - self.tablePropertyList() - - - pass - - elif la_ == 27: - localctx = SqlBaseParser.SetTableSerDeContext(self, localctx) - self.enterOuterAlt(localctx, 27) - self.state = 606 - self.match(SqlBaseParser.ALTER) - self.state = 607 - self.match(SqlBaseParser.TABLE) - self.state = 608 - self.multipartIdentifier() - self.state = 610 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 609 - self.partitionSpec() - - - self.state = 612 - self.match(SqlBaseParser.SET) - self.state = 613 - self.match(SqlBaseParser.SERDEPROPERTIES) - self.state = 614 - self.tablePropertyList() - pass - - elif la_ == 28: - localctx = SqlBaseParser.AddTablePartitionContext(self, localctx) - self.enterOuterAlt(localctx, 28) - self.state = 616 - self.match(SqlBaseParser.ALTER) - self.state = 617 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 618 - self.multipartIdentifier() - self.state = 619 - self.match(SqlBaseParser.ADD) - self.state = 623 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IF: - self.state = 620 - self.match(SqlBaseParser.IF) - self.state = 621 - self.match(SqlBaseParser.NOT) - self.state = 622 - self.match(SqlBaseParser.EXISTS) - - - self.state = 626 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 625 - self.partitionSpecLocation() - self.state = 628 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.PARTITION): - break - - pass - - elif la_ == 29: - localctx = SqlBaseParser.RenameTablePartitionContext(self, localctx) - self.enterOuterAlt(localctx, 29) - self.state = 630 - self.match(SqlBaseParser.ALTER) - self.state = 631 - self.match(SqlBaseParser.TABLE) - self.state = 632 - self.multipartIdentifier() - self.state = 633 - localctx.from_ = self.partitionSpec() - self.state = 634 - self.match(SqlBaseParser.RENAME) - self.state = 635 - self.match(SqlBaseParser.TO) - self.state = 636 - localctx.to = self.partitionSpec() - pass - - elif la_ == 30: - localctx = SqlBaseParser.DropTablePartitionsContext(self, localctx) - self.enterOuterAlt(localctx, 30) - self.state = 638 - self.match(SqlBaseParser.ALTER) - self.state = 639 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.TABLE or _la==SqlBaseParser.VIEW): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 640 - self.multipartIdentifier() - self.state = 641 - self.match(SqlBaseParser.DROP) - self.state = 644 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IF: - self.state = 642 - self.match(SqlBaseParser.IF) - self.state = 643 - self.match(SqlBaseParser.EXISTS) - - - self.state = 646 - self.partitionSpec() - self.state = 651 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 647 - self.match(SqlBaseParser.T__3) - self.state = 648 - self.partitionSpec() - self.state = 653 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 655 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PURGE: - self.state = 654 - self.match(SqlBaseParser.PURGE) - - - pass - - elif la_ == 31: - localctx = SqlBaseParser.SetTableLocationContext(self, localctx) - self.enterOuterAlt(localctx, 31) - self.state = 657 - self.match(SqlBaseParser.ALTER) - self.state = 658 - self.match(SqlBaseParser.TABLE) - self.state = 659 - self.multipartIdentifier() - self.state = 661 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 660 - self.partitionSpec() - - - self.state = 663 - self.match(SqlBaseParser.SET) - self.state = 664 - self.locationSpec() - pass - - elif la_ == 32: - localctx = SqlBaseParser.RecoverPartitionsContext(self, localctx) - self.enterOuterAlt(localctx, 32) - self.state = 666 - self.match(SqlBaseParser.ALTER) - self.state = 667 - self.match(SqlBaseParser.TABLE) - self.state = 668 - self.multipartIdentifier() - self.state = 669 - self.match(SqlBaseParser.RECOVER) - self.state = 670 - self.match(SqlBaseParser.PARTITIONS) - pass - - elif la_ == 33: - localctx = SqlBaseParser.DropTableContext(self, localctx) - self.enterOuterAlt(localctx, 33) - self.state = 672 - self.match(SqlBaseParser.DROP) - self.state = 673 - self.match(SqlBaseParser.TABLE) - self.state = 676 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,48,self._ctx) - if la_ == 1: - self.state = 674 - self.match(SqlBaseParser.IF) - self.state = 675 - self.match(SqlBaseParser.EXISTS) - - - self.state = 678 - self.multipartIdentifier() - self.state = 680 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PURGE: - self.state = 679 - self.match(SqlBaseParser.PURGE) - - - pass - - elif la_ == 34: - localctx = SqlBaseParser.DropViewContext(self, localctx) - self.enterOuterAlt(localctx, 34) - self.state = 682 - self.match(SqlBaseParser.DROP) - self.state = 683 - self.match(SqlBaseParser.VIEW) - self.state = 686 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,50,self._ctx) - if la_ == 1: - self.state = 684 - self.match(SqlBaseParser.IF) - self.state = 685 - self.match(SqlBaseParser.EXISTS) - - - self.state = 688 - self.multipartIdentifier() - pass - - elif la_ == 35: - localctx = SqlBaseParser.CreateViewContext(self, localctx) - self.enterOuterAlt(localctx, 35) - self.state = 689 - self.match(SqlBaseParser.CREATE) - self.state = 692 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OR: - self.state = 690 - self.match(SqlBaseParser.OR) - self.state = 691 - self.match(SqlBaseParser.REPLACE) - - - self.state = 698 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.GLOBAL or _la==SqlBaseParser.TEMPORARY: - self.state = 695 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.GLOBAL: - self.state = 694 - self.match(SqlBaseParser.GLOBAL) - - - self.state = 697 - self.match(SqlBaseParser.TEMPORARY) - - - self.state = 700 - self.match(SqlBaseParser.VIEW) - self.state = 704 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,54,self._ctx) - if la_ == 1: - self.state = 701 - self.match(SqlBaseParser.IF) - self.state = 702 - self.match(SqlBaseParser.NOT) - self.state = 703 - self.match(SqlBaseParser.EXISTS) - - - self.state = 706 - self.multipartIdentifier() - self.state = 708 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1: - self.state = 707 - self.identifierCommentList() - - - self.state = 718 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.COMMENT or _la==SqlBaseParser.PARTITIONED or _la==SqlBaseParser.TBLPROPERTIES: - self.state = 716 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.COMMENT]: - self.state = 710 - self.commentSpec() - pass - elif token in [SqlBaseParser.PARTITIONED]: - self.state = 711 - self.match(SqlBaseParser.PARTITIONED) - self.state = 712 - self.match(SqlBaseParser.ON) - self.state = 713 - self.identifierList() - pass - elif token in [SqlBaseParser.TBLPROPERTIES]: - self.state = 714 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 715 - self.tablePropertyList() - pass - else: - raise NoViableAltException(self) - - self.state = 720 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 721 - self.match(SqlBaseParser.AS) - self.state = 722 - self.query() - pass - - elif la_ == 36: - localctx = SqlBaseParser.CreateTempViewUsingContext(self, localctx) - self.enterOuterAlt(localctx, 36) - self.state = 724 - self.match(SqlBaseParser.CREATE) - self.state = 727 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OR: - self.state = 725 - self.match(SqlBaseParser.OR) - self.state = 726 - self.match(SqlBaseParser.REPLACE) - - - self.state = 730 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.GLOBAL: - self.state = 729 - self.match(SqlBaseParser.GLOBAL) - - - self.state = 732 - self.match(SqlBaseParser.TEMPORARY) - self.state = 733 - self.match(SqlBaseParser.VIEW) - self.state = 734 - self.tableIdentifier() - self.state = 739 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1: - self.state = 735 - self.match(SqlBaseParser.T__1) - self.state = 736 - self.colTypeList() - self.state = 737 - self.match(SqlBaseParser.T__2) - - - self.state = 741 - self.tableProvider() - self.state = 744 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OPTIONS: - self.state = 742 - self.match(SqlBaseParser.OPTIONS) - self.state = 743 - self.tablePropertyList() - - - pass - - elif la_ == 37: - localctx = SqlBaseParser.AlterViewQueryContext(self, localctx) - self.enterOuterAlt(localctx, 37) - self.state = 746 - self.match(SqlBaseParser.ALTER) - self.state = 747 - self.match(SqlBaseParser.VIEW) - self.state = 748 - self.multipartIdentifier() - self.state = 750 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 749 - self.match(SqlBaseParser.AS) - - - self.state = 752 - self.query() - pass - - elif la_ == 38: - localctx = SqlBaseParser.CreateFunctionContext(self, localctx) - self.enterOuterAlt(localctx, 38) - self.state = 754 - self.match(SqlBaseParser.CREATE) - self.state = 757 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OR: - self.state = 755 - self.match(SqlBaseParser.OR) - self.state = 756 - self.match(SqlBaseParser.REPLACE) - - - self.state = 760 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.TEMPORARY: - self.state = 759 - self.match(SqlBaseParser.TEMPORARY) - - - self.state = 762 - self.match(SqlBaseParser.FUNCTION) - self.state = 766 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,65,self._ctx) - if la_ == 1: - self.state = 763 - self.match(SqlBaseParser.IF) - self.state = 764 - self.match(SqlBaseParser.NOT) - self.state = 765 - self.match(SqlBaseParser.EXISTS) - - - self.state = 768 - self.multipartIdentifier() - self.state = 769 - self.match(SqlBaseParser.AS) - self.state = 770 - localctx.className = self.match(SqlBaseParser.STRING) - self.state = 780 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.USING: - self.state = 771 - self.match(SqlBaseParser.USING) - self.state = 772 - self.resource() - self.state = 777 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 773 - self.match(SqlBaseParser.T__3) - self.state = 774 - self.resource() - self.state = 779 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - pass - - elif la_ == 39: - localctx = SqlBaseParser.DropFunctionContext(self, localctx) - self.enterOuterAlt(localctx, 39) - self.state = 782 - self.match(SqlBaseParser.DROP) - self.state = 784 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.TEMPORARY: - self.state = 783 - self.match(SqlBaseParser.TEMPORARY) - - - self.state = 786 - self.match(SqlBaseParser.FUNCTION) - self.state = 789 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,69,self._ctx) - if la_ == 1: - self.state = 787 - self.match(SqlBaseParser.IF) - self.state = 788 - self.match(SqlBaseParser.EXISTS) - - - self.state = 791 - self.multipartIdentifier() - pass - - elif la_ == 40: - localctx = SqlBaseParser.ExplainContext(self, localctx) - self.enterOuterAlt(localctx, 40) - self.state = 792 - self.match(SqlBaseParser.EXPLAIN) - self.state = 794 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,70,self._ctx) - if la_ == 1: - self.state = 793 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.CODEGEN or _la==SqlBaseParser.COST or ((((_la - 86)) & ~0x3f) == 0 and ((1 << (_la - 86)) & ((1 << (SqlBaseParser.EXTENDED - 86)) | (1 << (SqlBaseParser.FORMATTED - 86)) | (1 << (SqlBaseParser.LOGICAL - 86)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 796 - self.statement() - pass - - elif la_ == 41: - localctx = SqlBaseParser.ShowTablesContext(self, localctx) - self.enterOuterAlt(localctx, 41) - self.state = 797 - self.match(SqlBaseParser.SHOW) - self.state = 798 - self.match(SqlBaseParser.TABLES) - self.state = 801 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: - self.state = 799 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 800 - self.multipartIdentifier() - - - self.state = 807 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: - self.state = 804 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE: - self.state = 803 - self.match(SqlBaseParser.LIKE) - - - self.state = 806 - localctx.pattern = self.match(SqlBaseParser.STRING) - - - pass - - elif la_ == 42: - localctx = SqlBaseParser.ShowTableContext(self, localctx) - self.enterOuterAlt(localctx, 42) - self.state = 809 - self.match(SqlBaseParser.SHOW) - self.state = 810 - self.match(SqlBaseParser.TABLE) - self.state = 811 - self.match(SqlBaseParser.EXTENDED) - self.state = 814 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: - self.state = 812 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 813 - localctx.ns = self.multipartIdentifier() - - - self.state = 816 - self.match(SqlBaseParser.LIKE) - self.state = 817 - localctx.pattern = self.match(SqlBaseParser.STRING) - self.state = 819 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 818 - self.partitionSpec() - - - pass - - elif la_ == 43: - localctx = SqlBaseParser.ShowTblPropertiesContext(self, localctx) - self.enterOuterAlt(localctx, 43) - self.state = 821 - self.match(SqlBaseParser.SHOW) - self.state = 822 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 823 - localctx.table = self.multipartIdentifier() - self.state = 828 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1: - self.state = 824 - self.match(SqlBaseParser.T__1) - self.state = 825 - localctx.key = self.tablePropertyKey() - self.state = 826 - self.match(SqlBaseParser.T__2) - - - pass - - elif la_ == 44: - localctx = SqlBaseParser.ShowColumnsContext(self, localctx) - self.enterOuterAlt(localctx, 44) - self.state = 830 - self.match(SqlBaseParser.SHOW) - self.state = 831 - self.match(SqlBaseParser.COLUMNS) - self.state = 832 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 833 - localctx.table = self.multipartIdentifier() - self.state = 836 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: - self.state = 834 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 835 - localctx.ns = self.multipartIdentifier() - - - pass - - elif la_ == 45: - localctx = SqlBaseParser.ShowViewsContext(self, localctx) - self.enterOuterAlt(localctx, 45) - self.state = 838 - self.match(SqlBaseParser.SHOW) - self.state = 839 - self.match(SqlBaseParser.VIEWS) - self.state = 842 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FROM or _la==SqlBaseParser.IN: - self.state = 840 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FROM or _la==SqlBaseParser.IN): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 841 - self.multipartIdentifier() - - - self.state = 848 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE or _la==SqlBaseParser.STRING: - self.state = 845 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LIKE: - self.state = 844 - self.match(SqlBaseParser.LIKE) - - - self.state = 847 - localctx.pattern = self.match(SqlBaseParser.STRING) - - - pass - - elif la_ == 46: - localctx = SqlBaseParser.ShowPartitionsContext(self, localctx) - self.enterOuterAlt(localctx, 46) - self.state = 850 - self.match(SqlBaseParser.SHOW) - self.state = 851 - self.match(SqlBaseParser.PARTITIONS) - self.state = 852 - self.multipartIdentifier() - self.state = 854 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 853 - self.partitionSpec() - - - pass - - elif la_ == 47: - localctx = SqlBaseParser.ShowFunctionsContext(self, localctx) - self.enterOuterAlt(localctx, 47) - self.state = 856 - self.match(SqlBaseParser.SHOW) - self.state = 858 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,82,self._ctx) - if la_ == 1: - self.state = 857 - self.identifier() - - - self.state = 860 - self.match(SqlBaseParser.FUNCTIONS) - self.state = 868 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,85,self._ctx) - if la_ == 1: - self.state = 862 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,83,self._ctx) - if la_ == 1: - self.state = 861 - self.match(SqlBaseParser.LIKE) - - - self.state = 866 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,84,self._ctx) - if la_ == 1: - self.state = 864 - self.multipartIdentifier() - pass - - elif la_ == 2: - self.state = 865 - localctx.pattern = self.match(SqlBaseParser.STRING) - pass - - - - - pass - - elif la_ == 48: - localctx = SqlBaseParser.ShowCreateTableContext(self, localctx) - self.enterOuterAlt(localctx, 48) - self.state = 870 - self.match(SqlBaseParser.SHOW) - self.state = 871 - self.match(SqlBaseParser.CREATE) - self.state = 872 - self.match(SqlBaseParser.TABLE) - self.state = 873 - self.multipartIdentifier() - self.state = 876 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 874 - self.match(SqlBaseParser.AS) - self.state = 875 - self.match(SqlBaseParser.SERDE) - - - pass - - elif la_ == 49: - localctx = SqlBaseParser.ShowCurrentNamespaceContext(self, localctx) - self.enterOuterAlt(localctx, 49) - self.state = 878 - self.match(SqlBaseParser.SHOW) - self.state = 879 - self.match(SqlBaseParser.CURRENT) - self.state = 880 - self.match(SqlBaseParser.NAMESPACE) - pass - - elif la_ == 50: - localctx = SqlBaseParser.DescribeFunctionContext(self, localctx) - self.enterOuterAlt(localctx, 50) - self.state = 881 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 882 - self.match(SqlBaseParser.FUNCTION) - self.state = 884 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,87,self._ctx) - if la_ == 1: - self.state = 883 - self.match(SqlBaseParser.EXTENDED) - - - self.state = 886 - self.describeFuncName() - pass - - elif la_ == 51: - localctx = SqlBaseParser.DescribeNamespaceContext(self, localctx) - self.enterOuterAlt(localctx, 51) - self.state = 887 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 888 - self.namespace() - self.state = 890 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,88,self._ctx) - if la_ == 1: - self.state = 889 - self.match(SqlBaseParser.EXTENDED) - - - self.state = 892 - self.multipartIdentifier() - pass - - elif la_ == 52: - localctx = SqlBaseParser.DescribeRelationContext(self, localctx) - self.enterOuterAlt(localctx, 52) - self.state = 894 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 896 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,89,self._ctx) - if la_ == 1: - self.state = 895 - self.match(SqlBaseParser.TABLE) - - - self.state = 899 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,90,self._ctx) - if la_ == 1: - self.state = 898 - localctx.option = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.EXTENDED or _la==SqlBaseParser.FORMATTED): - localctx.option = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 901 - self.multipartIdentifier() - self.state = 903 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,91,self._ctx) - if la_ == 1: - self.state = 902 - self.partitionSpec() - - - self.state = 906 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,92,self._ctx) - if la_ == 1: - self.state = 905 - self.describeColName() - - - pass - - elif la_ == 53: - localctx = SqlBaseParser.DescribeQueryContext(self, localctx) - self.enterOuterAlt(localctx, 53) - self.state = 908 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DESC or _la==SqlBaseParser.DESCRIBE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 910 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.QUERY: - self.state = 909 - self.match(SqlBaseParser.QUERY) - - - self.state = 912 - self.query() - pass - - elif la_ == 54: - localctx = SqlBaseParser.CommentNamespaceContext(self, localctx) - self.enterOuterAlt(localctx, 54) - self.state = 913 - self.match(SqlBaseParser.COMMENT) - self.state = 914 - self.match(SqlBaseParser.ON) - self.state = 915 - self.namespace() - self.state = 916 - self.multipartIdentifier() - self.state = 917 - self.match(SqlBaseParser.IS) - self.state = 918 - localctx.comment = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.NULL or _la==SqlBaseParser.STRING): - localctx.comment = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 55: - localctx = SqlBaseParser.CommentTableContext(self, localctx) - self.enterOuterAlt(localctx, 55) - self.state = 920 - self.match(SqlBaseParser.COMMENT) - self.state = 921 - self.match(SqlBaseParser.ON) - self.state = 922 - self.match(SqlBaseParser.TABLE) - self.state = 923 - self.multipartIdentifier() - self.state = 924 - self.match(SqlBaseParser.IS) - self.state = 925 - localctx.comment = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.NULL or _la==SqlBaseParser.STRING): - localctx.comment = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 56: - localctx = SqlBaseParser.RefreshTableContext(self, localctx) - self.enterOuterAlt(localctx, 56) - self.state = 927 - self.match(SqlBaseParser.REFRESH) - self.state = 928 - self.match(SqlBaseParser.TABLE) - self.state = 929 - self.multipartIdentifier() - pass - - elif la_ == 57: - localctx = SqlBaseParser.RefreshResourceContext(self, localctx) - self.enterOuterAlt(localctx, 57) - self.state = 930 - self.match(SqlBaseParser.REFRESH) - self.state = 938 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,95,self._ctx) - if la_ == 1: - self.state = 931 - self.match(SqlBaseParser.STRING) - pass - - elif la_ == 2: - self.state = 935 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1+1: - self.state = 932 - self.matchWildcard() - self.state = 937 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - - pass - - - pass - - elif la_ == 58: - localctx = SqlBaseParser.CacheTableContext(self, localctx) - self.enterOuterAlt(localctx, 58) - self.state = 940 - self.match(SqlBaseParser.CACHE) - self.state = 942 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LAZY: - self.state = 941 - self.match(SqlBaseParser.LAZY) - - - self.state = 944 - self.match(SqlBaseParser.TABLE) - self.state = 945 - self.multipartIdentifier() - self.state = 948 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OPTIONS: - self.state = 946 - self.match(SqlBaseParser.OPTIONS) - self.state = 947 - localctx.options = self.tablePropertyList() - - - self.state = 954 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__1 or _la==SqlBaseParser.AS or _la==SqlBaseParser.FROM or _la==SqlBaseParser.MAP or ((((_la - 187)) & ~0x3f) == 0 and ((1 << (_la - 187)) & ((1 << (SqlBaseParser.REDUCE - 187)) | (1 << (SqlBaseParser.SELECT - 187)) | (1 << (SqlBaseParser.TABLE - 187)))) != 0) or _la==SqlBaseParser.VALUES or _la==SqlBaseParser.WITH: - self.state = 951 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 950 - self.match(SqlBaseParser.AS) - - - self.state = 953 - self.query() - - - pass - - elif la_ == 59: - localctx = SqlBaseParser.UncacheTableContext(self, localctx) - self.enterOuterAlt(localctx, 59) - self.state = 956 - self.match(SqlBaseParser.UNCACHE) - self.state = 957 - self.match(SqlBaseParser.TABLE) - self.state = 960 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,100,self._ctx) - if la_ == 1: - self.state = 958 - self.match(SqlBaseParser.IF) - self.state = 959 - self.match(SqlBaseParser.EXISTS) - - - self.state = 962 - self.multipartIdentifier() - pass - - elif la_ == 60: - localctx = SqlBaseParser.ClearCacheContext(self, localctx) - self.enterOuterAlt(localctx, 60) - self.state = 963 - self.match(SqlBaseParser.CLEAR) - self.state = 964 - self.match(SqlBaseParser.CACHE) - pass - - elif la_ == 61: - localctx = SqlBaseParser.LoadDataContext(self, localctx) - self.enterOuterAlt(localctx, 61) - self.state = 965 - self.match(SqlBaseParser.LOAD) - self.state = 966 - self.match(SqlBaseParser.DATA) - self.state = 968 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LOCAL: - self.state = 967 - self.match(SqlBaseParser.LOCAL) - - - self.state = 970 - self.match(SqlBaseParser.INPATH) - self.state = 971 - localctx.path = self.match(SqlBaseParser.STRING) - self.state = 973 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OVERWRITE: - self.state = 972 - self.match(SqlBaseParser.OVERWRITE) - - - self.state = 975 - self.match(SqlBaseParser.INTO) - self.state = 976 - self.match(SqlBaseParser.TABLE) - self.state = 977 - self.multipartIdentifier() - self.state = 979 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 978 - self.partitionSpec() - - - pass - - elif la_ == 62: - localctx = SqlBaseParser.TruncateTableContext(self, localctx) - self.enterOuterAlt(localctx, 62) - self.state = 981 - self.match(SqlBaseParser.TRUNCATE) - self.state = 982 - self.match(SqlBaseParser.TABLE) - self.state = 983 - self.multipartIdentifier() - self.state = 985 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 984 - self.partitionSpec() - - - pass - - elif la_ == 63: - localctx = SqlBaseParser.RepairTableContext(self, localctx) - self.enterOuterAlt(localctx, 63) - self.state = 987 - self.match(SqlBaseParser.MSCK) - self.state = 988 - self.match(SqlBaseParser.REPAIR) - self.state = 989 - self.match(SqlBaseParser.TABLE) - self.state = 990 - self.multipartIdentifier() - pass - - elif la_ == 64: - localctx = SqlBaseParser.ManageResourceContext(self, localctx) - self.enterOuterAlt(localctx, 64) - self.state = 991 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ADD or _la==SqlBaseParser.LIST): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 992 - self.identifier() - self.state = 1000 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,106,self._ctx) - if la_ == 1: - self.state = 993 - self.match(SqlBaseParser.STRING) - pass - - elif la_ == 2: - self.state = 997 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,105,self._ctx) - while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1+1: - self.state = 994 - self.matchWildcard() - self.state = 999 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,105,self._ctx) - - pass - - - pass - - elif la_ == 65: - localctx = SqlBaseParser.FailNativeCommandContext(self, localctx) - self.enterOuterAlt(localctx, 65) - self.state = 1002 - self.match(SqlBaseParser.SET) - self.state = 1003 - self.match(SqlBaseParser.ROLE) - self.state = 1007 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,107,self._ctx) - while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1+1: - self.state = 1004 - self.matchWildcard() - self.state = 1009 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,107,self._ctx) - - pass - - elif la_ == 66: - localctx = SqlBaseParser.SetConfigurationContext(self, localctx) - self.enterOuterAlt(localctx, 66) - self.state = 1010 - self.match(SqlBaseParser.SET) - self.state = 1014 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,108,self._ctx) - while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1+1: - self.state = 1011 - self.matchWildcard() - self.state = 1016 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,108,self._ctx) - - pass - - elif la_ == 67: - localctx = SqlBaseParser.ResetConfigurationContext(self, localctx) - self.enterOuterAlt(localctx, 67) - self.state = 1017 - self.match(SqlBaseParser.RESET) - pass - - elif la_ == 68: - localctx = SqlBaseParser.FailNativeCommandContext(self, localctx) - self.enterOuterAlt(localctx, 68) - self.state = 1018 - self.unsupportedHiveNativeCommands() - self.state = 1022 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,109,self._ctx) - while _alt!=1 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1+1: - self.state = 1019 - self.matchWildcard() - self.state = 1024 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,109,self._ctx) - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class UnsupportedHiveNativeCommandsContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.kw1 = None # Token - self.kw2 = None # Token - self.kw3 = None # Token - self.kw4 = None # Token - self.kw5 = None # Token - self.kw6 = None # Token - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - - def ROLE(self): - return self.getToken(SqlBaseParser.ROLE, 0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - - def GRANT(self): - return self.getToken(SqlBaseParser.GRANT, 0) - - def REVOKE(self): - return self.getToken(SqlBaseParser.REVOKE, 0) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - - def PRINCIPALS(self): - return self.getToken(SqlBaseParser.PRINCIPALS, 0) - - def ROLES(self): - return self.getToken(SqlBaseParser.ROLES, 0) - - def CURRENT(self): - return self.getToken(SqlBaseParser.CURRENT, 0) - - def EXPORT(self): - return self.getToken(SqlBaseParser.EXPORT, 0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - - def IMPORT(self): - return self.getToken(SqlBaseParser.IMPORT, 0) - - def COMPACTIONS(self): - return self.getToken(SqlBaseParser.COMPACTIONS, 0) - - def TRANSACTIONS(self): - return self.getToken(SqlBaseParser.TRANSACTIONS, 0) - - def INDEXES(self): - return self.getToken(SqlBaseParser.INDEXES, 0) - - def LOCKS(self): - return self.getToken(SqlBaseParser.LOCKS, 0) - - def INDEX(self): - return self.getToken(SqlBaseParser.INDEX, 0) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - - def LOCK(self): - return self.getToken(SqlBaseParser.LOCK, 0) - - def DATABASE(self): - return self.getToken(SqlBaseParser.DATABASE, 0) - - def UNLOCK(self): - return self.getToken(SqlBaseParser.UNLOCK, 0) - - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - - def MACRO(self): - return self.getToken(SqlBaseParser.MACRO, 0) - - def tableIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.TableIdentifierContext,0) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def CLUSTERED(self): - return self.getToken(SqlBaseParser.CLUSTERED, 0) - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def SORTED(self): - return self.getToken(SqlBaseParser.SORTED, 0) - - def SKEWED(self): - return self.getToken(SqlBaseParser.SKEWED, 0) - - def STORED(self): - return self.getToken(SqlBaseParser.STORED, 0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def DIRECTORIES(self): - return self.getToken(SqlBaseParser.DIRECTORIES, 0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def LOCATION(self): - return self.getToken(SqlBaseParser.LOCATION, 0) - - def EXCHANGE(self): - return self.getToken(SqlBaseParser.EXCHANGE, 0) - - def PARTITION(self): - return self.getToken(SqlBaseParser.PARTITION, 0) - - def ARCHIVE(self): - return self.getToken(SqlBaseParser.ARCHIVE, 0) - - def UNARCHIVE(self): - return self.getToken(SqlBaseParser.UNARCHIVE, 0) - - def TOUCH(self): - return self.getToken(SqlBaseParser.TOUCH, 0) - - def COMPACT(self): - return self.getToken(SqlBaseParser.COMPACT, 0) - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def CONCATENATE(self): - return self.getToken(SqlBaseParser.CONCATENATE, 0) - - def FILEFORMAT(self): - return self.getToken(SqlBaseParser.FILEFORMAT, 0) - - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - - def START(self): - return self.getToken(SqlBaseParser.START, 0) - - def TRANSACTION(self): - return self.getToken(SqlBaseParser.TRANSACTION, 0) - - def COMMIT(self): - return self.getToken(SqlBaseParser.COMMIT, 0) - - def ROLLBACK(self): - return self.getToken(SqlBaseParser.ROLLBACK, 0) - - def DFS(self): - return self.getToken(SqlBaseParser.DFS, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_unsupportedHiveNativeCommands - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnsupportedHiveNativeCommands" ): - listener.enterUnsupportedHiveNativeCommands(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnsupportedHiveNativeCommands" ): - listener.exitUnsupportedHiveNativeCommands(self) - - - - - def unsupportedHiveNativeCommands(self): - - localctx = SqlBaseParser.UnsupportedHiveNativeCommandsContext(self, self._ctx, self.state) - self.enterRule(localctx, 16, self.RULE_unsupportedHiveNativeCommands) - self._la = 0 # Token type - try: - self.state = 1195 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,118,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1027 - localctx.kw1 = self.match(SqlBaseParser.CREATE) - self.state = 1028 - localctx.kw2 = self.match(SqlBaseParser.ROLE) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1029 - localctx.kw1 = self.match(SqlBaseParser.DROP) - self.state = 1030 - localctx.kw2 = self.match(SqlBaseParser.ROLE) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 1031 - localctx.kw1 = self.match(SqlBaseParser.GRANT) - self.state = 1033 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,111,self._ctx) - if la_ == 1: - self.state = 1032 - localctx.kw2 = self.match(SqlBaseParser.ROLE) - - - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 1035 - localctx.kw1 = self.match(SqlBaseParser.REVOKE) - self.state = 1037 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,112,self._ctx) - if la_ == 1: - self.state = 1036 - localctx.kw2 = self.match(SqlBaseParser.ROLE) - - - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 1039 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1040 - localctx.kw2 = self.match(SqlBaseParser.GRANT) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 1041 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1042 - localctx.kw2 = self.match(SqlBaseParser.ROLE) - self.state = 1044 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,113,self._ctx) - if la_ == 1: - self.state = 1043 - localctx.kw3 = self.match(SqlBaseParser.GRANT) - - - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 1046 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1047 - localctx.kw2 = self.match(SqlBaseParser.PRINCIPALS) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 1048 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1049 - localctx.kw2 = self.match(SqlBaseParser.ROLES) - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 1050 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1051 - localctx.kw2 = self.match(SqlBaseParser.CURRENT) - self.state = 1052 - localctx.kw3 = self.match(SqlBaseParser.ROLES) - pass - - elif la_ == 10: - self.enterOuterAlt(localctx, 10) - self.state = 1053 - localctx.kw1 = self.match(SqlBaseParser.EXPORT) - self.state = 1054 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - pass - - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 1055 - localctx.kw1 = self.match(SqlBaseParser.IMPORT) - self.state = 1056 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - pass - - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 1057 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1058 - localctx.kw2 = self.match(SqlBaseParser.COMPACTIONS) - pass - - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 1059 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1060 - localctx.kw2 = self.match(SqlBaseParser.CREATE) - self.state = 1061 - localctx.kw3 = self.match(SqlBaseParser.TABLE) - pass - - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 1062 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1063 - localctx.kw2 = self.match(SqlBaseParser.TRANSACTIONS) - pass - - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 1064 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1065 - localctx.kw2 = self.match(SqlBaseParser.INDEXES) - pass - - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 1066 - localctx.kw1 = self.match(SqlBaseParser.SHOW) - self.state = 1067 - localctx.kw2 = self.match(SqlBaseParser.LOCKS) - pass - - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 1068 - localctx.kw1 = self.match(SqlBaseParser.CREATE) - self.state = 1069 - localctx.kw2 = self.match(SqlBaseParser.INDEX) - pass - - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 1070 - localctx.kw1 = self.match(SqlBaseParser.DROP) - self.state = 1071 - localctx.kw2 = self.match(SqlBaseParser.INDEX) - pass - - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 1072 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1073 - localctx.kw2 = self.match(SqlBaseParser.INDEX) - pass - - elif la_ == 20: - self.enterOuterAlt(localctx, 20) - self.state = 1074 - localctx.kw1 = self.match(SqlBaseParser.LOCK) - self.state = 1075 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - pass - - elif la_ == 21: - self.enterOuterAlt(localctx, 21) - self.state = 1076 - localctx.kw1 = self.match(SqlBaseParser.LOCK) - self.state = 1077 - localctx.kw2 = self.match(SqlBaseParser.DATABASE) - pass - - elif la_ == 22: - self.enterOuterAlt(localctx, 22) - self.state = 1078 - localctx.kw1 = self.match(SqlBaseParser.UNLOCK) - self.state = 1079 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - pass - - elif la_ == 23: - self.enterOuterAlt(localctx, 23) - self.state = 1080 - localctx.kw1 = self.match(SqlBaseParser.UNLOCK) - self.state = 1081 - localctx.kw2 = self.match(SqlBaseParser.DATABASE) - pass - - elif la_ == 24: - self.enterOuterAlt(localctx, 24) - self.state = 1082 - localctx.kw1 = self.match(SqlBaseParser.CREATE) - self.state = 1083 - localctx.kw2 = self.match(SqlBaseParser.TEMPORARY) - self.state = 1084 - localctx.kw3 = self.match(SqlBaseParser.MACRO) - pass - - elif la_ == 25: - self.enterOuterAlt(localctx, 25) - self.state = 1085 - localctx.kw1 = self.match(SqlBaseParser.DROP) - self.state = 1086 - localctx.kw2 = self.match(SqlBaseParser.TEMPORARY) - self.state = 1087 - localctx.kw3 = self.match(SqlBaseParser.MACRO) - pass - - elif la_ == 26: - self.enterOuterAlt(localctx, 26) - self.state = 1088 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1089 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1090 - self.tableIdentifier() - self.state = 1091 - localctx.kw3 = self.match(SqlBaseParser.NOT) - self.state = 1092 - localctx.kw4 = self.match(SqlBaseParser.CLUSTERED) - pass - - elif la_ == 27: - self.enterOuterAlt(localctx, 27) - self.state = 1094 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1095 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1096 - self.tableIdentifier() - self.state = 1097 - localctx.kw3 = self.match(SqlBaseParser.CLUSTERED) - self.state = 1098 - localctx.kw4 = self.match(SqlBaseParser.BY) - pass - - elif la_ == 28: - self.enterOuterAlt(localctx, 28) - self.state = 1100 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1101 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1102 - self.tableIdentifier() - self.state = 1103 - localctx.kw3 = self.match(SqlBaseParser.NOT) - self.state = 1104 - localctx.kw4 = self.match(SqlBaseParser.SORTED) - pass - - elif la_ == 29: - self.enterOuterAlt(localctx, 29) - self.state = 1106 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1107 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1108 - self.tableIdentifier() - self.state = 1109 - localctx.kw3 = self.match(SqlBaseParser.SKEWED) - self.state = 1110 - localctx.kw4 = self.match(SqlBaseParser.BY) - pass - - elif la_ == 30: - self.enterOuterAlt(localctx, 30) - self.state = 1112 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1113 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1114 - self.tableIdentifier() - self.state = 1115 - localctx.kw3 = self.match(SqlBaseParser.NOT) - self.state = 1116 - localctx.kw4 = self.match(SqlBaseParser.SKEWED) - pass - - elif la_ == 31: - self.enterOuterAlt(localctx, 31) - self.state = 1118 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1119 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1120 - self.tableIdentifier() - self.state = 1121 - localctx.kw3 = self.match(SqlBaseParser.NOT) - self.state = 1122 - localctx.kw4 = self.match(SqlBaseParser.STORED) - self.state = 1123 - localctx.kw5 = self.match(SqlBaseParser.AS) - self.state = 1124 - localctx.kw6 = self.match(SqlBaseParser.DIRECTORIES) - pass - - elif la_ == 32: - self.enterOuterAlt(localctx, 32) - self.state = 1126 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1127 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1128 - self.tableIdentifier() - self.state = 1129 - localctx.kw3 = self.match(SqlBaseParser.SET) - self.state = 1130 - localctx.kw4 = self.match(SqlBaseParser.SKEWED) - self.state = 1131 - localctx.kw5 = self.match(SqlBaseParser.LOCATION) - pass - - elif la_ == 33: - self.enterOuterAlt(localctx, 33) - self.state = 1133 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1134 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1135 - self.tableIdentifier() - self.state = 1136 - localctx.kw3 = self.match(SqlBaseParser.EXCHANGE) - self.state = 1137 - localctx.kw4 = self.match(SqlBaseParser.PARTITION) - pass - - elif la_ == 34: - self.enterOuterAlt(localctx, 34) - self.state = 1139 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1140 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1141 - self.tableIdentifier() - self.state = 1142 - localctx.kw3 = self.match(SqlBaseParser.ARCHIVE) - self.state = 1143 - localctx.kw4 = self.match(SqlBaseParser.PARTITION) - pass - - elif la_ == 35: - self.enterOuterAlt(localctx, 35) - self.state = 1145 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1146 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1147 - self.tableIdentifier() - self.state = 1148 - localctx.kw3 = self.match(SqlBaseParser.UNARCHIVE) - self.state = 1149 - localctx.kw4 = self.match(SqlBaseParser.PARTITION) - pass - - elif la_ == 36: - self.enterOuterAlt(localctx, 36) - self.state = 1151 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1152 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1153 - self.tableIdentifier() - self.state = 1154 - localctx.kw3 = self.match(SqlBaseParser.TOUCH) - pass - - elif la_ == 37: - self.enterOuterAlt(localctx, 37) - self.state = 1156 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1157 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1158 - self.tableIdentifier() - self.state = 1160 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1159 - self.partitionSpec() - - - self.state = 1162 - localctx.kw3 = self.match(SqlBaseParser.COMPACT) - pass - - elif la_ == 38: - self.enterOuterAlt(localctx, 38) - self.state = 1164 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1165 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1166 - self.tableIdentifier() - self.state = 1168 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1167 - self.partitionSpec() - - - self.state = 1170 - localctx.kw3 = self.match(SqlBaseParser.CONCATENATE) - pass - - elif la_ == 39: - self.enterOuterAlt(localctx, 39) - self.state = 1172 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1173 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1174 - self.tableIdentifier() - self.state = 1176 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1175 - self.partitionSpec() - - - self.state = 1178 - localctx.kw3 = self.match(SqlBaseParser.SET) - self.state = 1179 - localctx.kw4 = self.match(SqlBaseParser.FILEFORMAT) - pass - - elif la_ == 40: - self.enterOuterAlt(localctx, 40) - self.state = 1181 - localctx.kw1 = self.match(SqlBaseParser.ALTER) - self.state = 1182 - localctx.kw2 = self.match(SqlBaseParser.TABLE) - self.state = 1183 - self.tableIdentifier() - self.state = 1185 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1184 - self.partitionSpec() - - - self.state = 1187 - localctx.kw3 = self.match(SqlBaseParser.REPLACE) - self.state = 1188 - localctx.kw4 = self.match(SqlBaseParser.COLUMNS) - pass - - elif la_ == 41: - self.enterOuterAlt(localctx, 41) - self.state = 1190 - localctx.kw1 = self.match(SqlBaseParser.START) - self.state = 1191 - localctx.kw2 = self.match(SqlBaseParser.TRANSACTION) - pass - - elif la_ == 42: - self.enterOuterAlt(localctx, 42) - self.state = 1192 - localctx.kw1 = self.match(SqlBaseParser.COMMIT) - pass - - elif la_ == 43: - self.enterOuterAlt(localctx, 43) - self.state = 1193 - localctx.kw1 = self.match(SqlBaseParser.ROLLBACK) - pass - - elif la_ == 44: - self.enterOuterAlt(localctx, 44) - self.state = 1194 - localctx.kw1 = self.match(SqlBaseParser.DFS) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class CreateTableHeaderContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - - def EXTERNAL(self): - return self.getToken(SqlBaseParser.EXTERNAL, 0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_createTableHeader - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateTableHeader" ): - listener.enterCreateTableHeader(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateTableHeader" ): - listener.exitCreateTableHeader(self) - - - - - def createTableHeader(self): - - localctx = SqlBaseParser.CreateTableHeaderContext(self, self._ctx, self.state) - self.enterRule(localctx, 18, self.RULE_createTableHeader) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1197 - self.match(SqlBaseParser.CREATE) - self.state = 1199 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.TEMPORARY: - self.state = 1198 - self.match(SqlBaseParser.TEMPORARY) - - - self.state = 1202 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.EXTERNAL: - self.state = 1201 - self.match(SqlBaseParser.EXTERNAL) - - - self.state = 1204 - self.match(SqlBaseParser.TABLE) - self.state = 1208 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,121,self._ctx) - if la_ == 1: - self.state = 1205 - self.match(SqlBaseParser.IF) - self.state = 1206 - self.match(SqlBaseParser.NOT) - self.state = 1207 - self.match(SqlBaseParser.EXISTS) - - - self.state = 1210 - self.multipartIdentifier() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ReplaceTableHeaderContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_replaceTableHeader - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterReplaceTableHeader" ): - listener.enterReplaceTableHeader(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitReplaceTableHeader" ): - listener.exitReplaceTableHeader(self) - - - - - def replaceTableHeader(self): - - localctx = SqlBaseParser.ReplaceTableHeaderContext(self, self._ctx, self.state) - self.enterRule(localctx, 20, self.RULE_replaceTableHeader) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1214 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.CREATE: - self.state = 1212 - self.match(SqlBaseParser.CREATE) - self.state = 1213 - self.match(SqlBaseParser.OR) - - - self.state = 1216 - self.match(SqlBaseParser.REPLACE) - self.state = 1217 - self.match(SqlBaseParser.TABLE) - self.state = 1218 - self.multipartIdentifier() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class BucketSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def CLUSTERED(self): - return self.getToken(SqlBaseParser.CLUSTERED, 0) - - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def INTO(self): - return self.getToken(SqlBaseParser.INTO, 0) - - def INTEGER_VALUE(self): - return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) - - def BUCKETS(self): - return self.getToken(SqlBaseParser.BUCKETS, 0) - - def SORTED(self): - return self.getToken(SqlBaseParser.SORTED, 0) - - def orderedIdentifierList(self): - return self.getTypedRuleContext(SqlBaseParser.OrderedIdentifierListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_bucketSpec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterBucketSpec" ): - listener.enterBucketSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitBucketSpec" ): - listener.exitBucketSpec(self) - - - - - def bucketSpec(self): - - localctx = SqlBaseParser.BucketSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 22, self.RULE_bucketSpec) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1220 - self.match(SqlBaseParser.CLUSTERED) - self.state = 1221 - self.match(SqlBaseParser.BY) - self.state = 1222 - self.identifierList() - self.state = 1226 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.SORTED: - self.state = 1223 - self.match(SqlBaseParser.SORTED) - self.state = 1224 - self.match(SqlBaseParser.BY) - self.state = 1225 - self.orderedIdentifierList() - - - self.state = 1228 - self.match(SqlBaseParser.INTO) - self.state = 1229 - self.match(SqlBaseParser.INTEGER_VALUE) - self.state = 1230 - self.match(SqlBaseParser.BUCKETS) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SkewSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def SKEWED(self): - return self.getToken(SqlBaseParser.SKEWED, 0) - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - - def constantList(self): - return self.getTypedRuleContext(SqlBaseParser.ConstantListContext,0) - - - def nestedConstantList(self): - return self.getTypedRuleContext(SqlBaseParser.NestedConstantListContext,0) - - - def STORED(self): - return self.getToken(SqlBaseParser.STORED, 0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def DIRECTORIES(self): - return self.getToken(SqlBaseParser.DIRECTORIES, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_skewSpec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSkewSpec" ): - listener.enterSkewSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSkewSpec" ): - listener.exitSkewSpec(self) - - - - - def skewSpec(self): - - localctx = SqlBaseParser.SkewSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 24, self.RULE_skewSpec) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1232 - self.match(SqlBaseParser.SKEWED) - self.state = 1233 - self.match(SqlBaseParser.BY) - self.state = 1234 - self.identifierList() - self.state = 1235 - self.match(SqlBaseParser.ON) - self.state = 1238 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,124,self._ctx) - if la_ == 1: - self.state = 1236 - self.constantList() - pass - - elif la_ == 2: - self.state = 1237 - self.nestedConstantList() - pass - - - self.state = 1243 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,125,self._ctx) - if la_ == 1: - self.state = 1240 - self.match(SqlBaseParser.STORED) - self.state = 1241 - self.match(SqlBaseParser.AS) - self.state = 1242 - self.match(SqlBaseParser.DIRECTORIES) - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class LocationSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LOCATION(self): - return self.getToken(SqlBaseParser.LOCATION, 0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_locationSpec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLocationSpec" ): - listener.enterLocationSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLocationSpec" ): - listener.exitLocationSpec(self) - - - - - def locationSpec(self): - - localctx = SqlBaseParser.LocationSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 26, self.RULE_locationSpec) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1245 - self.match(SqlBaseParser.LOCATION) - self.state = 1246 - self.match(SqlBaseParser.STRING) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class CommentSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def COMMENT(self): - return self.getToken(SqlBaseParser.COMMENT, 0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_commentSpec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCommentSpec" ): - listener.enterCommentSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCommentSpec" ): - listener.exitCommentSpec(self) - - - - - def commentSpec(self): - - localctx = SqlBaseParser.CommentSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 28, self.RULE_commentSpec) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1248 - self.match(SqlBaseParser.COMMENT) - self.state = 1249 - self.match(SqlBaseParser.STRING) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QueryContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def queryTerm(self): - return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,0) - - - def queryOrganization(self): - return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) - - - def ctes(self): - return self.getTypedRuleContext(SqlBaseParser.CtesContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_query - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQuery" ): - listener.enterQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQuery" ): - listener.exitQuery(self) - - - - - def query(self): - - localctx = SqlBaseParser.QueryContext(self, self._ctx, self.state) - self.enterRule(localctx, 30, self.RULE_query) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1252 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.WITH: - self.state = 1251 - self.ctes() - - - self.state = 1254 - self.queryTerm(0) - self.state = 1255 - self.queryOrganization() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class InsertIntoContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_insertInto - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class InsertOverwriteHiveDirContext(InsertIntoContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext - super().__init__(parser) - self.path = None # Token - self.copyFrom(ctx) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - def DIRECTORY(self): - return self.getToken(SqlBaseParser.DIRECTORY, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def LOCAL(self): - return self.getToken(SqlBaseParser.LOCAL, 0) - def rowFormat(self): - return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,0) - - def createFileFormat(self): - return self.getTypedRuleContext(SqlBaseParser.CreateFileFormatContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInsertOverwriteHiveDir" ): - listener.enterInsertOverwriteHiveDir(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInsertOverwriteHiveDir" ): - listener.exitInsertOverwriteHiveDir(self) - - - class InsertOverwriteDirContext(InsertIntoContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext - super().__init__(parser) - self.path = None # Token - self.options = None # TablePropertyListContext - self.copyFrom(ctx) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - def DIRECTORY(self): - return self.getToken(SqlBaseParser.DIRECTORY, 0) - def tableProvider(self): - return self.getTypedRuleContext(SqlBaseParser.TableProviderContext,0) - - def LOCAL(self): - return self.getToken(SqlBaseParser.LOCAL, 0) - def OPTIONS(self): - return self.getToken(SqlBaseParser.OPTIONS, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInsertOverwriteDir" ): - listener.enterInsertOverwriteDir(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInsertOverwriteDir" ): - listener.exitInsertOverwriteDir(self) - - - class InsertOverwriteTableContext(InsertIntoContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext - super().__init__(parser) - self.copyFrom(ctx) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInsertOverwriteTable" ): - listener.enterInsertOverwriteTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInsertOverwriteTable" ): - listener.exitInsertOverwriteTable(self) - - - class InsertIntoTableContext(InsertIntoContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.InsertIntoContext - super().__init__(parser) - self.copyFrom(ctx) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - def INTO(self): - return self.getToken(SqlBaseParser.INTO, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInsertIntoTable" ): - listener.enterInsertIntoTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInsertIntoTable" ): - listener.exitInsertIntoTable(self) - - - - def insertInto(self): - - localctx = SqlBaseParser.InsertIntoContext(self, self._ctx, self.state) - self.enterRule(localctx, 32, self.RULE_insertInto) - self._la = 0 # Token type - try: - self.state = 1312 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,139,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.InsertOverwriteTableContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 1257 - self.match(SqlBaseParser.INSERT) - self.state = 1258 - self.match(SqlBaseParser.OVERWRITE) - self.state = 1260 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,127,self._ctx) - if la_ == 1: - self.state = 1259 - self.match(SqlBaseParser.TABLE) - - - self.state = 1262 - self.multipartIdentifier() - self.state = 1269 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1263 - self.partitionSpec() - self.state = 1267 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IF: - self.state = 1264 - self.match(SqlBaseParser.IF) - self.state = 1265 - self.match(SqlBaseParser.NOT) - self.state = 1266 - self.match(SqlBaseParser.EXISTS) - - - - - pass - - elif la_ == 2: - localctx = SqlBaseParser.InsertIntoTableContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 1271 - self.match(SqlBaseParser.INSERT) - self.state = 1272 - self.match(SqlBaseParser.INTO) - self.state = 1274 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,130,self._ctx) - if la_ == 1: - self.state = 1273 - self.match(SqlBaseParser.TABLE) - - - self.state = 1276 - self.multipartIdentifier() - self.state = 1278 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PARTITION: - self.state = 1277 - self.partitionSpec() - - - self.state = 1283 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IF: - self.state = 1280 - self.match(SqlBaseParser.IF) - self.state = 1281 - self.match(SqlBaseParser.NOT) - self.state = 1282 - self.match(SqlBaseParser.EXISTS) - - - pass - - elif la_ == 3: - localctx = SqlBaseParser.InsertOverwriteHiveDirContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 1285 - self.match(SqlBaseParser.INSERT) - self.state = 1286 - self.match(SqlBaseParser.OVERWRITE) - self.state = 1288 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LOCAL: - self.state = 1287 - self.match(SqlBaseParser.LOCAL) - - - self.state = 1290 - self.match(SqlBaseParser.DIRECTORY) - self.state = 1291 - localctx.path = self.match(SqlBaseParser.STRING) - self.state = 1293 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ROW: - self.state = 1292 - self.rowFormat() - - - self.state = 1296 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.STORED: - self.state = 1295 - self.createFileFormat() - - - pass - - elif la_ == 4: - localctx = SqlBaseParser.InsertOverwriteDirContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 1298 - self.match(SqlBaseParser.INSERT) - self.state = 1299 - self.match(SqlBaseParser.OVERWRITE) - self.state = 1301 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LOCAL: - self.state = 1300 - self.match(SqlBaseParser.LOCAL) - - - self.state = 1303 - self.match(SqlBaseParser.DIRECTORY) - self.state = 1305 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.STRING: - self.state = 1304 - localctx.path = self.match(SqlBaseParser.STRING) - - - self.state = 1307 - self.tableProvider() - self.state = 1310 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OPTIONS: - self.state = 1308 - self.match(SqlBaseParser.OPTIONS) - self.state = 1309 - localctx.options = self.tablePropertyList() - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PartitionSpecLocationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def partitionSpec(self): - return self.getTypedRuleContext(SqlBaseParser.PartitionSpecContext,0) - - - def locationSpec(self): - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_partitionSpecLocation - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPartitionSpecLocation" ): - listener.enterPartitionSpecLocation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPartitionSpecLocation" ): - listener.exitPartitionSpecLocation(self) - - - - - def partitionSpecLocation(self): - - localctx = SqlBaseParser.PartitionSpecLocationContext(self, self._ctx, self.state) - self.enterRule(localctx, 34, self.RULE_partitionSpecLocation) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1314 - self.partitionSpec() - self.state = 1316 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LOCATION: - self.state = 1315 - self.locationSpec() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PartitionSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def PARTITION(self): - return self.getToken(SqlBaseParser.PARTITION, 0) - - def partitionVal(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PartitionValContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PartitionValContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_partitionSpec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPartitionSpec" ): - listener.enterPartitionSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPartitionSpec" ): - listener.exitPartitionSpec(self) - - - - - def partitionSpec(self): - - localctx = SqlBaseParser.PartitionSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 36, self.RULE_partitionSpec) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1318 - self.match(SqlBaseParser.PARTITION) - self.state = 1319 - self.match(SqlBaseParser.T__1) - self.state = 1320 - self.partitionVal() - self.state = 1325 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1321 - self.match(SqlBaseParser.T__3) - self.state = 1322 - self.partitionVal() - self.state = 1327 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1328 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PartitionValContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def EQ(self): - return self.getToken(SqlBaseParser.EQ, 0) - - def constant(self): - return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_partitionVal - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPartitionVal" ): - listener.enterPartitionVal(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPartitionVal" ): - listener.exitPartitionVal(self) - - - - - def partitionVal(self): - - localctx = SqlBaseParser.PartitionValContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_partitionVal) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1330 - self.identifier() - self.state = 1333 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.EQ: - self.state = 1331 - self.match(SqlBaseParser.EQ) - self.state = 1332 - self.constant() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NamespaceContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def NAMESPACE(self): - return self.getToken(SqlBaseParser.NAMESPACE, 0) - - def DATABASE(self): - return self.getToken(SqlBaseParser.DATABASE, 0) - - def SCHEMA(self): - return self.getToken(SqlBaseParser.SCHEMA, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_namespace - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamespace" ): - listener.enterNamespace(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamespace" ): - listener.exitNamespace(self) - - - - - def namespace(self): - - localctx = SqlBaseParser.NamespaceContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_namespace) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1335 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DATABASE or _la==SqlBaseParser.NAMESPACE or _la==SqlBaseParser.SCHEMA): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class DescribeFuncNameContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def comparisonOperator(self): - return self.getTypedRuleContext(SqlBaseParser.ComparisonOperatorContext,0) - - - def arithmeticOperator(self): - return self.getTypedRuleContext(SqlBaseParser.ArithmeticOperatorContext,0) - - - def predicateOperator(self): - return self.getTypedRuleContext(SqlBaseParser.PredicateOperatorContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_describeFuncName - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeFuncName" ): - listener.enterDescribeFuncName(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeFuncName" ): - listener.exitDescribeFuncName(self) - - - - - def describeFuncName(self): - - localctx = SqlBaseParser.DescribeFuncNameContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_describeFuncName) - try: - self.state = 1342 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,143,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1337 - self.qualifiedName() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1338 - self.match(SqlBaseParser.STRING) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 1339 - self.comparisonOperator() - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 1340 - self.arithmeticOperator() - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 1341 - self.predicateOperator() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class DescribeColNameContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._identifier = None # IdentifierContext - self.nameParts = list() # of IdentifierContexts - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_describeColName - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDescribeColName" ): - listener.enterDescribeColName(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDescribeColName" ): - listener.exitDescribeColName(self) - - - - - def describeColName(self): - - localctx = SqlBaseParser.DescribeColNameContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_describeColName) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1344 - localctx._identifier = self.identifier() - localctx.nameParts.append(localctx._identifier) - self.state = 1349 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__4: - self.state = 1345 - self.match(SqlBaseParser.T__4) - self.state = 1346 - localctx._identifier = self.identifier() - localctx.nameParts.append(localctx._identifier) - self.state = 1351 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class CtesContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - - def namedQuery(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NamedQueryContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NamedQueryContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_ctes - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCtes" ): - listener.enterCtes(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCtes" ): - listener.exitCtes(self) - - - - - def ctes(self): - - localctx = SqlBaseParser.CtesContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_ctes) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1352 - self.match(SqlBaseParser.WITH) - self.state = 1353 - self.namedQuery() - self.state = 1358 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1354 - self.match(SqlBaseParser.T__3) - self.state = 1355 - self.namedQuery() - self.state = 1360 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NamedQueryContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # ErrorCapturingIdentifierContext - self.columnAliases = None # IdentifierListContext - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_namedQuery - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedQuery" ): - listener.enterNamedQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedQuery" ): - listener.exitNamedQuery(self) - - - - - def namedQuery(self): - - localctx = SqlBaseParser.NamedQueryContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_namedQuery) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1361 - localctx.name = self.errorCapturingIdentifier() - self.state = 1363 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,146,self._ctx) - if la_ == 1: - self.state = 1362 - localctx.columnAliases = self.identifierList() - - - self.state = 1366 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AS: - self.state = 1365 - self.match(SqlBaseParser.AS) - - - self.state = 1368 - self.match(SqlBaseParser.T__1) - self.state = 1369 - self.query() - self.state = 1370 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TableProviderContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_tableProvider - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableProvider" ): - listener.enterTableProvider(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableProvider" ): - listener.exitTableProvider(self) - - - - - def tableProvider(self): - - localctx = SqlBaseParser.TableProviderContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_tableProvider) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1372 - self.match(SqlBaseParser.USING) - self.state = 1373 - self.multipartIdentifier() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class CreateTableClausesContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.options = None # TablePropertyListContext - self.partitioning = None # TransformListContext - self.tableProps = None # TablePropertyListContext - - def bucketSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.BucketSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.BucketSpecContext,i) - - - def locationSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LocationSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LocationSpecContext,i) - - - def commentSpec(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.CommentSpecContext) - else: - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,i) - - - def OPTIONS(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.OPTIONS) - else: - return self.getToken(SqlBaseParser.OPTIONS, i) - - def PARTITIONED(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.PARTITIONED) - else: - return self.getToken(SqlBaseParser.PARTITIONED, i) - - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - - def TBLPROPERTIES(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.TBLPROPERTIES) - else: - return self.getToken(SqlBaseParser.TBLPROPERTIES, i) - - def tablePropertyList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,i) - - - def transformList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TransformListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TransformListContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_createTableClauses - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateTableClauses" ): - listener.enterCreateTableClauses(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateTableClauses" ): - listener.exitCreateTableClauses(self) - - - - - def createTableClauses(self): - - localctx = SqlBaseParser.CreateTableClausesContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_createTableClauses) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1387 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.CLUSTERED or _la==SqlBaseParser.COMMENT or ((((_la - 138)) & ~0x3f) == 0 and ((1 << (_la - 138)) & ((1 << (SqlBaseParser.LOCATION - 138)) | (1 << (SqlBaseParser.OPTIONS - 138)) | (1 << (SqlBaseParser.PARTITIONED - 138)))) != 0) or _la==SqlBaseParser.TBLPROPERTIES: - self.state = 1385 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.OPTIONS]: - self.state = 1375 - self.match(SqlBaseParser.OPTIONS) - self.state = 1376 - localctx.options = self.tablePropertyList() - pass - elif token in [SqlBaseParser.PARTITIONED]: - self.state = 1377 - self.match(SqlBaseParser.PARTITIONED) - self.state = 1378 - self.match(SqlBaseParser.BY) - self.state = 1379 - localctx.partitioning = self.transformList() - pass - elif token in [SqlBaseParser.CLUSTERED]: - self.state = 1380 - self.bucketSpec() - pass - elif token in [SqlBaseParser.LOCATION]: - self.state = 1381 - self.locationSpec() - pass - elif token in [SqlBaseParser.COMMENT]: - self.state = 1382 - self.commentSpec() - pass - elif token in [SqlBaseParser.TBLPROPERTIES]: - self.state = 1383 - self.match(SqlBaseParser.TBLPROPERTIES) - self.state = 1384 - localctx.tableProps = self.tablePropertyList() - pass - else: - raise NoViableAltException(self) - - self.state = 1389 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TablePropertyListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def tableProperty(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TablePropertyContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TablePropertyContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_tablePropertyList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTablePropertyList" ): - listener.enterTablePropertyList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTablePropertyList" ): - listener.exitTablePropertyList(self) - - - - - def tablePropertyList(self): - - localctx = SqlBaseParser.TablePropertyListContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_tablePropertyList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1390 - self.match(SqlBaseParser.T__1) - self.state = 1391 - self.tableProperty() - self.state = 1396 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1392 - self.match(SqlBaseParser.T__3) - self.state = 1393 - self.tableProperty() - self.state = 1398 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1399 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TablePropertyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.key = None # TablePropertyKeyContext - self.value = None # TablePropertyValueContext - - def tablePropertyKey(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyKeyContext,0) - - - def tablePropertyValue(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyValueContext,0) - - - def EQ(self): - return self.getToken(SqlBaseParser.EQ, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_tableProperty - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableProperty" ): - listener.enterTableProperty(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableProperty" ): - listener.exitTableProperty(self) - - - - - def tableProperty(self): - - localctx = SqlBaseParser.TablePropertyContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_tableProperty) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1401 - localctx.key = self.tablePropertyKey() - self.state = 1406 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FALSE or ((((_la - 241)) & ~0x3f) == 0 and ((1 << (_la - 241)) & ((1 << (SqlBaseParser.TRUE - 241)) | (1 << (SqlBaseParser.EQ - 241)) | (1 << (SqlBaseParser.STRING - 241)) | (1 << (SqlBaseParser.INTEGER_VALUE - 241)) | (1 << (SqlBaseParser.DECIMAL_VALUE - 241)))) != 0): - self.state = 1403 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.EQ: - self.state = 1402 - self.match(SqlBaseParser.EQ) - - - self.state = 1405 - localctx.value = self.tablePropertyValue() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TablePropertyKeyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_tablePropertyKey - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTablePropertyKey" ): - listener.enterTablePropertyKey(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTablePropertyKey" ): - listener.exitTablePropertyKey(self) - - - - - def tablePropertyKey(self): - - localctx = SqlBaseParser.TablePropertyKeyContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_tablePropertyKey) - self._la = 0 # Token type - try: - self.state = 1417 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,154,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1408 - self.identifier() - self.state = 1413 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__4: - self.state = 1409 - self.match(SqlBaseParser.T__4) - self.state = 1410 - self.identifier() - self.state = 1415 - self._errHandler.sync(self) - _la = self._input.LA(1) - - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1416 - self.match(SqlBaseParser.STRING) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TablePropertyValueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def INTEGER_VALUE(self): - return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) - - def DECIMAL_VALUE(self): - return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) - - def booleanValue(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanValueContext,0) - - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_tablePropertyValue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTablePropertyValue" ): - listener.enterTablePropertyValue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTablePropertyValue" ): - listener.exitTablePropertyValue(self) - - - - - def tablePropertyValue(self): - - localctx = SqlBaseParser.TablePropertyValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_tablePropertyValue) - try: - self.state = 1423 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.INTEGER_VALUE]: - self.enterOuterAlt(localctx, 1) - self.state = 1419 - self.match(SqlBaseParser.INTEGER_VALUE) - pass - elif token in [SqlBaseParser.DECIMAL_VALUE]: - self.enterOuterAlt(localctx, 2) - self.state = 1420 - self.match(SqlBaseParser.DECIMAL_VALUE) - pass - elif token in [SqlBaseParser.FALSE, SqlBaseParser.TRUE]: - self.enterOuterAlt(localctx, 3) - self.state = 1421 - self.booleanValue() - pass - elif token in [SqlBaseParser.STRING]: - self.enterOuterAlt(localctx, 4) - self.state = 1422 - self.match(SqlBaseParser.STRING) - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ConstantListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def constant(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ConstantContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ConstantContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_constantList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterConstantList" ): - listener.enterConstantList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitConstantList" ): - listener.exitConstantList(self) - - - - - def constantList(self): - - localctx = SqlBaseParser.ConstantListContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_constantList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1425 - self.match(SqlBaseParser.T__1) - self.state = 1426 - self.constant() - self.state = 1431 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1427 - self.match(SqlBaseParser.T__3) - self.state = 1428 - self.constant() - self.state = 1433 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1434 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NestedConstantListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def constantList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ConstantListContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ConstantListContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_nestedConstantList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNestedConstantList" ): - listener.enterNestedConstantList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNestedConstantList" ): - listener.exitNestedConstantList(self) - - - - - def nestedConstantList(self): - - localctx = SqlBaseParser.NestedConstantListContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_nestedConstantList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1436 - self.match(SqlBaseParser.T__1) - self.state = 1437 - self.constantList() - self.state = 1442 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1438 - self.match(SqlBaseParser.T__3) - self.state = 1439 - self.constantList() - self.state = 1444 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1445 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class CreateFileFormatContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def STORED(self): - return self.getToken(SqlBaseParser.STORED, 0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def fileFormat(self): - return self.getTypedRuleContext(SqlBaseParser.FileFormatContext,0) - - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def storageHandler(self): - return self.getTypedRuleContext(SqlBaseParser.StorageHandlerContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_createFileFormat - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCreateFileFormat" ): - listener.enterCreateFileFormat(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCreateFileFormat" ): - listener.exitCreateFileFormat(self) - - - - - def createFileFormat(self): - - localctx = SqlBaseParser.CreateFileFormatContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_createFileFormat) - try: - self.state = 1453 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,158,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1447 - self.match(SqlBaseParser.STORED) - self.state = 1448 - self.match(SqlBaseParser.AS) - self.state = 1449 - self.fileFormat() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1450 - self.match(SqlBaseParser.STORED) - self.state = 1451 - self.match(SqlBaseParser.BY) - self.state = 1452 - self.storageHandler() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FileFormatContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_fileFormat - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class TableFileFormatContext(FileFormatContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.FileFormatContext - super().__init__(parser) - self.inFmt = None # Token - self.outFmt = None # Token - self.copyFrom(ctx) - - def INPUTFORMAT(self): - return self.getToken(SqlBaseParser.INPUTFORMAT, 0) - def OUTPUTFORMAT(self): - return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) - def STRING(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.STRING) - else: - return self.getToken(SqlBaseParser.STRING, i) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableFileFormat" ): - listener.enterTableFileFormat(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableFileFormat" ): - listener.exitTableFileFormat(self) - - - class GenericFileFormatContext(FileFormatContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.FileFormatContext - super().__init__(parser) - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterGenericFileFormat" ): - listener.enterGenericFileFormat(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitGenericFileFormat" ): - listener.exitGenericFileFormat(self) - - - - def fileFormat(self): - - localctx = SqlBaseParser.FileFormatContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_fileFormat) - try: - self.state = 1460 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,159,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.TableFileFormatContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 1455 - self.match(SqlBaseParser.INPUTFORMAT) - self.state = 1456 - localctx.inFmt = self.match(SqlBaseParser.STRING) - self.state = 1457 - self.match(SqlBaseParser.OUTPUTFORMAT) - self.state = 1458 - localctx.outFmt = self.match(SqlBaseParser.STRING) - pass - - elif la_ == 2: - localctx = SqlBaseParser.GenericFileFormatContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 1459 - self.identifier() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class StorageHandlerContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - - def SERDEPROPERTIES(self): - return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) - - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_storageHandler - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStorageHandler" ): - listener.enterStorageHandler(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStorageHandler" ): - listener.exitStorageHandler(self) - - - - - def storageHandler(self): - - localctx = SqlBaseParser.StorageHandlerContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_storageHandler) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1462 - self.match(SqlBaseParser.STRING) - self.state = 1466 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,160,self._ctx) - if la_ == 1: - self.state = 1463 - self.match(SqlBaseParser.WITH) - self.state = 1464 - self.match(SqlBaseParser.SERDEPROPERTIES) - self.state = 1465 - self.tablePropertyList() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ResourceContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_resource - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterResource" ): - listener.enterResource(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitResource" ): - listener.exitResource(self) - - - - - def resource(self): - - localctx = SqlBaseParser.ResourceContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_resource) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1468 - self.identifier() - self.state = 1469 - self.match(SqlBaseParser.STRING) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class DmlStatementNoWithContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_dmlStatementNoWith - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class DeleteFromTableContext(DmlStatementNoWithContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext - super().__init__(parser) - self.copyFrom(ctx) - - def DELETE(self): - return self.getToken(SqlBaseParser.DELETE, 0) - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - def whereClause(self): - return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDeleteFromTable" ): - listener.enterDeleteFromTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDeleteFromTable" ): - listener.exitDeleteFromTable(self) - - - class SingleInsertQueryContext(DmlStatementNoWithContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext - super().__init__(parser) - self.copyFrom(ctx) - - def insertInto(self): - return self.getTypedRuleContext(SqlBaseParser.InsertIntoContext,0) - - def queryTerm(self): - return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,0) - - def queryOrganization(self): - return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSingleInsertQuery" ): - listener.enterSingleInsertQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSingleInsertQuery" ): - listener.exitSingleInsertQuery(self) - - - class MultiInsertQueryContext(DmlStatementNoWithContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext - super().__init__(parser) - self.copyFrom(ctx) - - def fromClause(self): - return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) - - def multiInsertQueryBody(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultiInsertQueryBodyContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultiInsertQueryBodyContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMultiInsertQuery" ): - listener.enterMultiInsertQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMultiInsertQuery" ): - listener.exitMultiInsertQuery(self) - - - class UpdateTableContext(DmlStatementNoWithContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext - super().__init__(parser) - self.copyFrom(ctx) - - def UPDATE(self): - return self.getToken(SqlBaseParser.UPDATE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - def setClause(self): - return self.getTypedRuleContext(SqlBaseParser.SetClauseContext,0) - - def whereClause(self): - return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUpdateTable" ): - listener.enterUpdateTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUpdateTable" ): - listener.exitUpdateTable(self) - - - class MergeIntoTableContext(DmlStatementNoWithContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DmlStatementNoWithContext - super().__init__(parser) - self.target = None # MultipartIdentifierContext - self.targetAlias = None # TableAliasContext - self.source = None # MultipartIdentifierContext - self.sourceQuery = None # QueryContext - self.sourceAlias = None # TableAliasContext - self.mergeCondition = None # BooleanExpressionContext - self.copyFrom(ctx) - - def MERGE(self): - return self.getToken(SqlBaseParser.MERGE, 0) - def INTO(self): - return self.getToken(SqlBaseParser.INTO, 0) - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - def tableAlias(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TableAliasContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,i) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def matchedClause(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MatchedClauseContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MatchedClauseContext,i) - - def notMatchedClause(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NotMatchedClauseContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NotMatchedClauseContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMergeIntoTable" ): - listener.enterMergeIntoTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMergeIntoTable" ): - listener.exitMergeIntoTable(self) - - - - def dmlStatementNoWith(self): - - localctx = SqlBaseParser.DmlStatementNoWithContext(self, self._ctx, self.state) - self.enterRule(localctx, 74, self.RULE_dmlStatementNoWith) - self._la = 0 # Token type - try: - self.state = 1522 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.INSERT]: - localctx = SqlBaseParser.SingleInsertQueryContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 1471 - self.insertInto() - self.state = 1472 - self.queryTerm(0) - self.state = 1473 - self.queryOrganization() - pass - elif token in [SqlBaseParser.FROM]: - localctx = SqlBaseParser.MultiInsertQueryContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 1475 - self.fromClause() - self.state = 1477 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 1476 - self.multiInsertQueryBody() - self.state = 1479 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.INSERT): - break - - pass - elif token in [SqlBaseParser.DELETE]: - localctx = SqlBaseParser.DeleteFromTableContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 1481 - self.match(SqlBaseParser.DELETE) - self.state = 1482 - self.match(SqlBaseParser.FROM) - self.state = 1483 - self.multipartIdentifier() - self.state = 1484 - self.tableAlias() - self.state = 1486 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.WHERE: - self.state = 1485 - self.whereClause() - - - pass - elif token in [SqlBaseParser.UPDATE]: - localctx = SqlBaseParser.UpdateTableContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 1488 - self.match(SqlBaseParser.UPDATE) - self.state = 1489 - self.multipartIdentifier() - self.state = 1490 - self.tableAlias() - self.state = 1491 - self.setClause() - self.state = 1493 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.WHERE: - self.state = 1492 - self.whereClause() - - - pass - elif token in [SqlBaseParser.MERGE]: - localctx = SqlBaseParser.MergeIntoTableContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 1495 - self.match(SqlBaseParser.MERGE) - self.state = 1496 - self.match(SqlBaseParser.INTO) - self.state = 1497 - localctx.target = self.multipartIdentifier() - self.state = 1498 - localctx.targetAlias = self.tableAlias() - self.state = 1499 - self.match(SqlBaseParser.USING) - self.state = 1505 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,164,self._ctx) - if la_ == 1: - self.state = 1500 - localctx.source = self.multipartIdentifier() - pass - - elif la_ == 2: - self.state = 1501 - self.match(SqlBaseParser.T__1) - self.state = 1502 - localctx.sourceQuery = self.query() - self.state = 1503 - self.match(SqlBaseParser.T__2) - pass - - - self.state = 1507 - localctx.sourceAlias = self.tableAlias() - self.state = 1508 - self.match(SqlBaseParser.ON) - self.state = 1509 - localctx.mergeCondition = self.booleanExpression(0) - self.state = 1513 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,165,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1510 - self.matchedClause() - self.state = 1515 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,165,self._ctx) - - self.state = 1519 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.WHEN: - self.state = 1516 - self.notMatchedClause() - self.state = 1521 - self._errHandler.sync(self) - _la = self._input.LA(1) - - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QueryOrganizationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._sortItem = None # SortItemContext - self.order = list() # of SortItemContexts - self._expression = None # ExpressionContext - self.clusterBy = list() # of ExpressionContexts - self.distributeBy = list() # of ExpressionContexts - self.sort = list() # of SortItemContexts - self.limit = None # ExpressionContext - - def ORDER(self): - return self.getToken(SqlBaseParser.ORDER, 0) - - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - - def CLUSTER(self): - return self.getToken(SqlBaseParser.CLUSTER, 0) - - def DISTRIBUTE(self): - return self.getToken(SqlBaseParser.DISTRIBUTE, 0) - - def SORT(self): - return self.getToken(SqlBaseParser.SORT, 0) - - def windowClause(self): - return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) - - - def LIMIT(self): - return self.getToken(SqlBaseParser.LIMIT, 0) - - def sortItem(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.SortItemContext) - else: - return self.getTypedRuleContext(SqlBaseParser.SortItemContext,i) - - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def ALL(self): - return self.getToken(SqlBaseParser.ALL, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_queryOrganization - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQueryOrganization" ): - listener.enterQueryOrganization(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQueryOrganization" ): - listener.exitQueryOrganization(self) - - - - - def queryOrganization(self): - - localctx = SqlBaseParser.QueryOrganizationContext(self, self._ctx, self.state) - self.enterRule(localctx, 76, self.RULE_queryOrganization) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1534 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,169,self._ctx) - if la_ == 1: - self.state = 1524 - self.match(SqlBaseParser.ORDER) - self.state = 1525 - self.match(SqlBaseParser.BY) - self.state = 1526 - localctx._sortItem = self.sortItem() - localctx.order.append(localctx._sortItem) - self.state = 1531 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,168,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1527 - self.match(SqlBaseParser.T__3) - self.state = 1528 - localctx._sortItem = self.sortItem() - localctx.order.append(localctx._sortItem) - self.state = 1533 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,168,self._ctx) - - - - self.state = 1546 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,171,self._ctx) - if la_ == 1: - self.state = 1536 - self.match(SqlBaseParser.CLUSTER) - self.state = 1537 - self.match(SqlBaseParser.BY) - self.state = 1538 - localctx._expression = self.expression() - localctx.clusterBy.append(localctx._expression) - self.state = 1543 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,170,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1539 - self.match(SqlBaseParser.T__3) - self.state = 1540 - localctx._expression = self.expression() - localctx.clusterBy.append(localctx._expression) - self.state = 1545 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,170,self._ctx) - - - - self.state = 1558 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,173,self._ctx) - if la_ == 1: - self.state = 1548 - self.match(SqlBaseParser.DISTRIBUTE) - self.state = 1549 - self.match(SqlBaseParser.BY) - self.state = 1550 - localctx._expression = self.expression() - localctx.distributeBy.append(localctx._expression) - self.state = 1555 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,172,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1551 - self.match(SqlBaseParser.T__3) - self.state = 1552 - localctx._expression = self.expression() - localctx.distributeBy.append(localctx._expression) - self.state = 1557 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,172,self._ctx) - - - - self.state = 1570 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,175,self._ctx) - if la_ == 1: - self.state = 1560 - self.match(SqlBaseParser.SORT) - self.state = 1561 - self.match(SqlBaseParser.BY) - self.state = 1562 - localctx._sortItem = self.sortItem() - localctx.sort.append(localctx._sortItem) - self.state = 1567 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,174,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1563 - self.match(SqlBaseParser.T__3) - self.state = 1564 - localctx._sortItem = self.sortItem() - localctx.sort.append(localctx._sortItem) - self.state = 1569 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,174,self._ctx) - - - - self.state = 1573 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,176,self._ctx) - if la_ == 1: - self.state = 1572 - self.windowClause() - - - self.state = 1580 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,178,self._ctx) - if la_ == 1: - self.state = 1575 - self.match(SqlBaseParser.LIMIT) - self.state = 1578 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,177,self._ctx) - if la_ == 1: - self.state = 1576 - self.match(SqlBaseParser.ALL) - pass - - elif la_ == 2: - self.state = 1577 - localctx.limit = self.expression() - pass - - - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MultiInsertQueryBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def insertInto(self): - return self.getTypedRuleContext(SqlBaseParser.InsertIntoContext,0) - - - def fromStatementBody(self): - return self.getTypedRuleContext(SqlBaseParser.FromStatementBodyContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_multiInsertQueryBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMultiInsertQueryBody" ): - listener.enterMultiInsertQueryBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMultiInsertQueryBody" ): - listener.exitMultiInsertQueryBody(self) - - - - - def multiInsertQueryBody(self): - - localctx = SqlBaseParser.MultiInsertQueryBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 78, self.RULE_multiInsertQueryBody) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1582 - self.insertInto() - self.state = 1583 - self.fromStatementBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QueryTermContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_queryTerm - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - class QueryTermDefaultContext(QueryTermContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryTermContext - super().__init__(parser) - self.copyFrom(ctx) - - def queryPrimary(self): - return self.getTypedRuleContext(SqlBaseParser.QueryPrimaryContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQueryTermDefault" ): - listener.enterQueryTermDefault(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQueryTermDefault" ): - listener.exitQueryTermDefault(self) - - - class SetOperationContext(QueryTermContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryTermContext - super().__init__(parser) - self.left = None # QueryTermContext - self.operator = None # Token - self.right = None # QueryTermContext - self.copyFrom(ctx) - - def queryTerm(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.QueryTermContext) - else: - return self.getTypedRuleContext(SqlBaseParser.QueryTermContext,i) - - def INTERSECT(self): - return self.getToken(SqlBaseParser.INTERSECT, 0) - def UNION(self): - return self.getToken(SqlBaseParser.UNION, 0) - def EXCEPT(self): - return self.getToken(SqlBaseParser.EXCEPT, 0) - def SETMINUS(self): - return self.getToken(SqlBaseParser.SETMINUS, 0) - def setQuantifier(self): - return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetOperation" ): - listener.enterSetOperation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetOperation" ): - listener.exitSetOperation(self) - - - - def queryTerm(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = SqlBaseParser.QueryTermContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 80 - self.enterRecursionRule(localctx, 80, self.RULE_queryTerm, _p) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - localctx = SqlBaseParser.QueryTermDefaultContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - - self.state = 1586 - self.queryPrimary() - self._ctx.stop = self._input.LT(-1) - self.state = 1611 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,183,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 1609 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,182,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) - self.state = 1588 - if not self.precpred(self._ctx, 3): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 1589 - if not self.legacy_setops_precedence_enbled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.legacy_setops_precedence_enbled") - self.state = 1590 - localctx.operator = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.EXCEPT or _la==SqlBaseParser.INTERSECT or _la==SqlBaseParser.SETMINUS or _la==SqlBaseParser.UNION): - localctx.operator = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 1592 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: - self.state = 1591 - self.setQuantifier() - - - self.state = 1594 - localctx.right = self.queryTerm(4) - pass - - elif la_ == 2: - localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) - self.state = 1595 - if not self.precpred(self._ctx, 2): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 1596 - if not not self.legacy_setops_precedence_enbled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.legacy_setops_precedence_enbled") - self.state = 1597 - localctx.operator = self.match(SqlBaseParser.INTERSECT) - self.state = 1599 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: - self.state = 1598 - self.setQuantifier() - - - self.state = 1601 - localctx.right = self.queryTerm(3) - pass - - elif la_ == 3: - localctx = SqlBaseParser.SetOperationContext(self, SqlBaseParser.QueryTermContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_queryTerm) - self.state = 1602 - if not self.precpred(self._ctx, 1): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 1603 - if not not self.legacy_setops_precedence_enbled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.legacy_setops_precedence_enbled") - self.state = 1604 - localctx.operator = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.EXCEPT or _la==SqlBaseParser.SETMINUS or _la==SqlBaseParser.UNION): - localctx.operator = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 1606 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT: - self.state = 1605 - self.setQuantifier() - - - self.state = 1608 - localctx.right = self.queryTerm(2) - pass - - - self.state = 1613 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,183,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - class QueryPrimaryContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_queryPrimary - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class SubqueryContext(QueryPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSubquery" ): - listener.enterSubquery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSubquery" ): - listener.exitSubquery(self) - - - class QueryPrimaryDefaultContext(QueryPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def querySpecification(self): - return self.getTypedRuleContext(SqlBaseParser.QuerySpecificationContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQueryPrimaryDefault" ): - listener.enterQueryPrimaryDefault(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQueryPrimaryDefault" ): - listener.exitQueryPrimaryDefault(self) - - - class InlineTableDefault1Context(QueryPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def inlineTable(self): - return self.getTypedRuleContext(SqlBaseParser.InlineTableContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInlineTableDefault1" ): - listener.enterInlineTableDefault1(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInlineTableDefault1" ): - listener.exitInlineTableDefault1(self) - - - class FromStmtContext(QueryPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def fromStatement(self): - return self.getTypedRuleContext(SqlBaseParser.FromStatementContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFromStmt" ): - listener.enterFromStmt(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFromStmt" ): - listener.exitFromStmt(self) - - - class TableContext(QueryPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QueryPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTable" ): - listener.enterTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTable" ): - listener.exitTable(self) - - - - def queryPrimary(self): - - localctx = SqlBaseParser.QueryPrimaryContext(self, self._ctx, self.state) - self.enterRule(localctx, 82, self.RULE_queryPrimary) - try: - self.state = 1623 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.MAP, SqlBaseParser.REDUCE, SqlBaseParser.SELECT]: - localctx = SqlBaseParser.QueryPrimaryDefaultContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 1614 - self.querySpecification() - pass - elif token in [SqlBaseParser.FROM]: - localctx = SqlBaseParser.FromStmtContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 1615 - self.fromStatement() - pass - elif token in [SqlBaseParser.TABLE]: - localctx = SqlBaseParser.TableContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 1616 - self.match(SqlBaseParser.TABLE) - self.state = 1617 - self.multipartIdentifier() - pass - elif token in [SqlBaseParser.VALUES]: - localctx = SqlBaseParser.InlineTableDefault1Context(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 1618 - self.inlineTable() - pass - elif token in [SqlBaseParser.T__1]: - localctx = SqlBaseParser.SubqueryContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 1619 - self.match(SqlBaseParser.T__1) - self.state = 1620 - self.query() - self.state = 1621 - self.match(SqlBaseParser.T__2) - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SortItemContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.ordering = None # Token - self.nullOrder = None # Token - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def NULLS(self): - return self.getToken(SqlBaseParser.NULLS, 0) - - def ASC(self): - return self.getToken(SqlBaseParser.ASC, 0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - - def LAST(self): - return self.getToken(SqlBaseParser.LAST, 0) - - def FIRST(self): - return self.getToken(SqlBaseParser.FIRST, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_sortItem - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSortItem" ): - listener.enterSortItem(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSortItem" ): - listener.exitSortItem(self) - - - - - def sortItem(self): - - localctx = SqlBaseParser.SortItemContext(self, self._ctx, self.state) - self.enterRule(localctx, 84, self.RULE_sortItem) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1625 - self.expression() - self.state = 1627 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,185,self._ctx) - if la_ == 1: - self.state = 1626 - localctx.ordering = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC): - localctx.ordering = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 1631 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,186,self._ctx) - if la_ == 1: - self.state = 1629 - self.match(SqlBaseParser.NULLS) - self.state = 1630 - localctx.nullOrder = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FIRST or _la==SqlBaseParser.LAST): - localctx.nullOrder = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FromStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def fromClause(self): - return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) - - - def fromStatementBody(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.FromStatementBodyContext) - else: - return self.getTypedRuleContext(SqlBaseParser.FromStatementBodyContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_fromStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFromStatement" ): - listener.enterFromStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFromStatement" ): - listener.exitFromStatement(self) - - - - - def fromStatement(self): - - localctx = SqlBaseParser.FromStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 86, self.RULE_fromStatement) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1633 - self.fromClause() - self.state = 1635 - self._errHandler.sync(self) - _alt = 1 - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt == 1: - self.state = 1634 - self.fromStatementBody() - - else: - raise NoViableAltException(self) - self.state = 1637 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,187,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FromStatementBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def transformClause(self): - return self.getTypedRuleContext(SqlBaseParser.TransformClauseContext,0) - - - def queryOrganization(self): - return self.getTypedRuleContext(SqlBaseParser.QueryOrganizationContext,0) - - - def whereClause(self): - return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) - - - def selectClause(self): - return self.getTypedRuleContext(SqlBaseParser.SelectClauseContext,0) - - - def lateralView(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) - - - def aggregationClause(self): - return self.getTypedRuleContext(SqlBaseParser.AggregationClauseContext,0) - - - def havingClause(self): - return self.getTypedRuleContext(SqlBaseParser.HavingClauseContext,0) - - - def windowClause(self): - return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_fromStatementBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFromStatementBody" ): - listener.enterFromStatementBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFromStatementBody" ): - listener.exitFromStatementBody(self) - - - - - def fromStatementBody(self): - - localctx = SqlBaseParser.FromStatementBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 88, self.RULE_fromStatementBody) - try: - self.state = 1666 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,194,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1639 - self.transformClause() - self.state = 1641 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,188,self._ctx) - if la_ == 1: - self.state = 1640 - self.whereClause() - - - self.state = 1643 - self.queryOrganization() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1645 - self.selectClause() - self.state = 1649 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,189,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1646 - self.lateralView() - self.state = 1651 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,189,self._ctx) - - self.state = 1653 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,190,self._ctx) - if la_ == 1: - self.state = 1652 - self.whereClause() - - - self.state = 1656 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,191,self._ctx) - if la_ == 1: - self.state = 1655 - self.aggregationClause() - - - self.state = 1659 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,192,self._ctx) - if la_ == 1: - self.state = 1658 - self.havingClause() - - - self.state = 1662 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,193,self._ctx) - if la_ == 1: - self.state = 1661 - self.windowClause() - - - self.state = 1664 - self.queryOrganization() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QuerySpecificationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_querySpecification - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class RegularQuerySpecificationContext(QuerySpecificationContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QuerySpecificationContext - super().__init__(parser) - self.copyFrom(ctx) - - def selectClause(self): - return self.getTypedRuleContext(SqlBaseParser.SelectClauseContext,0) - - def fromClause(self): - return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) - - def lateralView(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) - - def whereClause(self): - return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) - - def aggregationClause(self): - return self.getTypedRuleContext(SqlBaseParser.AggregationClauseContext,0) - - def havingClause(self): - return self.getTypedRuleContext(SqlBaseParser.HavingClauseContext,0) - - def windowClause(self): - return self.getTypedRuleContext(SqlBaseParser.WindowClauseContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRegularQuerySpecification" ): - listener.enterRegularQuerySpecification(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRegularQuerySpecification" ): - listener.exitRegularQuerySpecification(self) - - - class TransformQuerySpecificationContext(QuerySpecificationContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.QuerySpecificationContext - super().__init__(parser) - self.copyFrom(ctx) - - def transformClause(self): - return self.getTypedRuleContext(SqlBaseParser.TransformClauseContext,0) - - def fromClause(self): - return self.getTypedRuleContext(SqlBaseParser.FromClauseContext,0) - - def whereClause(self): - return self.getTypedRuleContext(SqlBaseParser.WhereClauseContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTransformQuerySpecification" ): - listener.enterTransformQuerySpecification(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTransformQuerySpecification" ): - listener.exitTransformQuerySpecification(self) - - - - def querySpecification(self): - - localctx = SqlBaseParser.QuerySpecificationContext(self, self._ctx, self.state) - self.enterRule(localctx, 90, self.RULE_querySpecification) - try: - self.state = 1697 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,203,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.TransformQuerySpecificationContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 1668 - self.transformClause() - self.state = 1670 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,195,self._ctx) - if la_ == 1: - self.state = 1669 - self.fromClause() - - - self.state = 1673 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,196,self._ctx) - if la_ == 1: - self.state = 1672 - self.whereClause() - - - pass - - elif la_ == 2: - localctx = SqlBaseParser.RegularQuerySpecificationContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 1675 - self.selectClause() - self.state = 1677 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,197,self._ctx) - if la_ == 1: - self.state = 1676 - self.fromClause() - - - self.state = 1682 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,198,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1679 - self.lateralView() - self.state = 1684 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,198,self._ctx) - - self.state = 1686 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,199,self._ctx) - if la_ == 1: - self.state = 1685 - self.whereClause() - - - self.state = 1689 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,200,self._ctx) - if la_ == 1: - self.state = 1688 - self.aggregationClause() - - - self.state = 1692 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,201,self._ctx) - if la_ == 1: - self.state = 1691 - self.havingClause() - - - self.state = 1695 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,202,self._ctx) - if la_ == 1: - self.state = 1694 - self.windowClause() - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TransformClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.kind = None # Token - self.inRowFormat = None # RowFormatContext - self.recordWriter = None # Token - self.script = None # Token - self.outRowFormat = None # RowFormatContext - self.recordReader = None # Token - - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - - def STRING(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.STRING) - else: - return self.getToken(SqlBaseParser.STRING, i) - - def SELECT(self): - return self.getToken(SqlBaseParser.SELECT, 0) - - def namedExpressionSeq(self): - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) - - - def TRANSFORM(self): - return self.getToken(SqlBaseParser.TRANSFORM, 0) - - def MAP(self): - return self.getToken(SqlBaseParser.MAP, 0) - - def REDUCE(self): - return self.getToken(SqlBaseParser.REDUCE, 0) - - def RECORDWRITER(self): - return self.getToken(SqlBaseParser.RECORDWRITER, 0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def RECORDREADER(self): - return self.getToken(SqlBaseParser.RECORDREADER, 0) - - def rowFormat(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.RowFormatContext) - else: - return self.getTypedRuleContext(SqlBaseParser.RowFormatContext,i) - - - def identifierSeq(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) - - - def colTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ColTypeListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_transformClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTransformClause" ): - listener.enterTransformClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTransformClause" ): - listener.exitTransformClause(self) - - - - - def transformClause(self): - - localctx = SqlBaseParser.TransformClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 92, self.RULE_transformClause) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1709 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.SELECT]: - self.state = 1699 - self.match(SqlBaseParser.SELECT) - self.state = 1700 - localctx.kind = self.match(SqlBaseParser.TRANSFORM) - self.state = 1701 - self.match(SqlBaseParser.T__1) - self.state = 1702 - self.namedExpressionSeq() - self.state = 1703 - self.match(SqlBaseParser.T__2) - pass - elif token in [SqlBaseParser.MAP]: - self.state = 1705 - localctx.kind = self.match(SqlBaseParser.MAP) - self.state = 1706 - self.namedExpressionSeq() - pass - elif token in [SqlBaseParser.REDUCE]: - self.state = 1707 - localctx.kind = self.match(SqlBaseParser.REDUCE) - self.state = 1708 - self.namedExpressionSeq() - pass - else: - raise NoViableAltException(self) - - self.state = 1712 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ROW: - self.state = 1711 - localctx.inRowFormat = self.rowFormat() - - - self.state = 1716 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.RECORDWRITER: - self.state = 1714 - self.match(SqlBaseParser.RECORDWRITER) - self.state = 1715 - localctx.recordWriter = self.match(SqlBaseParser.STRING) - - - self.state = 1718 - self.match(SqlBaseParser.USING) - self.state = 1719 - localctx.script = self.match(SqlBaseParser.STRING) - self.state = 1732 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,209,self._ctx) - if la_ == 1: - self.state = 1720 - self.match(SqlBaseParser.AS) - self.state = 1730 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,208,self._ctx) - if la_ == 1: - self.state = 1721 - self.identifierSeq() - pass - - elif la_ == 2: - self.state = 1722 - self.colTypeList() - pass - - elif la_ == 3: - self.state = 1723 - self.match(SqlBaseParser.T__1) - self.state = 1726 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,207,self._ctx) - if la_ == 1: - self.state = 1724 - self.identifierSeq() - pass - - elif la_ == 2: - self.state = 1725 - self.colTypeList() - pass - - - self.state = 1728 - self.match(SqlBaseParser.T__2) - pass - - - - - self.state = 1735 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,210,self._ctx) - if la_ == 1: - self.state = 1734 - localctx.outRowFormat = self.rowFormat() - - - self.state = 1739 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,211,self._ctx) - if la_ == 1: - self.state = 1737 - self.match(SqlBaseParser.RECORDREADER) - self.state = 1738 - localctx.recordReader = self.match(SqlBaseParser.STRING) - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SelectClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._hint = None # HintContext - self.hints = list() # of HintContexts - - def SELECT(self): - return self.getToken(SqlBaseParser.SELECT, 0) - - def namedExpressionSeq(self): - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) - - - def setQuantifier(self): - return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) - - - def hint(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.HintContext) - else: - return self.getTypedRuleContext(SqlBaseParser.HintContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_selectClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSelectClause" ): - listener.enterSelectClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSelectClause" ): - listener.exitSelectClause(self) - - - - - def selectClause(self): - - localctx = SqlBaseParser.SelectClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 94, self.RULE_selectClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1741 - self.match(SqlBaseParser.SELECT) - self.state = 1745 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,212,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1742 - localctx._hint = self.hint() - localctx.hints.append(localctx._hint) - self.state = 1747 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,212,self._ctx) - - self.state = 1749 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,213,self._ctx) - if la_ == 1: - self.state = 1748 - self.setQuantifier() - - - self.state = 1751 - self.namedExpressionSeq() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SetClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def assignmentList(self): - return self.getTypedRuleContext(SqlBaseParser.AssignmentListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_setClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetClause" ): - listener.enterSetClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetClause" ): - listener.exitSetClause(self) - - - - - def setClause(self): - - localctx = SqlBaseParser.SetClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 96, self.RULE_setClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1753 - self.match(SqlBaseParser.SET) - self.state = 1754 - self.assignmentList() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MatchedClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.matchedCond = None # BooleanExpressionContext - - def WHEN(self): - return self.getToken(SqlBaseParser.WHEN, 0) - - def MATCHED(self): - return self.getToken(SqlBaseParser.MATCHED, 0) - - def THEN(self): - return self.getToken(SqlBaseParser.THEN, 0) - - def matchedAction(self): - return self.getTypedRuleContext(SqlBaseParser.MatchedActionContext,0) - - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_matchedClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMatchedClause" ): - listener.enterMatchedClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMatchedClause" ): - listener.exitMatchedClause(self) - - - - - def matchedClause(self): - - localctx = SqlBaseParser.MatchedClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 98, self.RULE_matchedClause) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1756 - self.match(SqlBaseParser.WHEN) - self.state = 1757 - self.match(SqlBaseParser.MATCHED) - self.state = 1760 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AND: - self.state = 1758 - self.match(SqlBaseParser.AND) - self.state = 1759 - localctx.matchedCond = self.booleanExpression(0) - - - self.state = 1762 - self.match(SqlBaseParser.THEN) - self.state = 1763 - self.matchedAction() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NotMatchedClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.notMatchedCond = None # BooleanExpressionContext - - def WHEN(self): - return self.getToken(SqlBaseParser.WHEN, 0) - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def MATCHED(self): - return self.getToken(SqlBaseParser.MATCHED, 0) - - def THEN(self): - return self.getToken(SqlBaseParser.THEN, 0) - - def notMatchedAction(self): - return self.getTypedRuleContext(SqlBaseParser.NotMatchedActionContext,0) - - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_notMatchedClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNotMatchedClause" ): - listener.enterNotMatchedClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNotMatchedClause" ): - listener.exitNotMatchedClause(self) - - - - - def notMatchedClause(self): - - localctx = SqlBaseParser.NotMatchedClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 100, self.RULE_notMatchedClause) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1765 - self.match(SqlBaseParser.WHEN) - self.state = 1766 - self.match(SqlBaseParser.NOT) - self.state = 1767 - self.match(SqlBaseParser.MATCHED) - self.state = 1770 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AND: - self.state = 1768 - self.match(SqlBaseParser.AND) - self.state = 1769 - localctx.notMatchedCond = self.booleanExpression(0) - - - self.state = 1772 - self.match(SqlBaseParser.THEN) - self.state = 1773 - self.notMatchedAction() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MatchedActionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def DELETE(self): - return self.getToken(SqlBaseParser.DELETE, 0) - - def UPDATE(self): - return self.getToken(SqlBaseParser.UPDATE, 0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def ASTERISK(self): - return self.getToken(SqlBaseParser.ASTERISK, 0) - - def assignmentList(self): - return self.getTypedRuleContext(SqlBaseParser.AssignmentListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_matchedAction - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMatchedAction" ): - listener.enterMatchedAction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMatchedAction" ): - listener.exitMatchedAction(self) - - - - - def matchedAction(self): - - localctx = SqlBaseParser.MatchedActionContext(self, self._ctx, self.state) - self.enterRule(localctx, 102, self.RULE_matchedAction) - try: - self.state = 1782 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,216,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1775 - self.match(SqlBaseParser.DELETE) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1776 - self.match(SqlBaseParser.UPDATE) - self.state = 1777 - self.match(SqlBaseParser.SET) - self.state = 1778 - self.match(SqlBaseParser.ASTERISK) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 1779 - self.match(SqlBaseParser.UPDATE) - self.state = 1780 - self.match(SqlBaseParser.SET) - self.state = 1781 - self.assignmentList() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NotMatchedActionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.columns = None # MultipartIdentifierListContext - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - - def ASTERISK(self): - return self.getToken(SqlBaseParser.ASTERISK, 0) - - def VALUES(self): - return self.getToken(SqlBaseParser.VALUES, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def multipartIdentifierList(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_notMatchedAction - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNotMatchedAction" ): - listener.enterNotMatchedAction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNotMatchedAction" ): - listener.exitNotMatchedAction(self) - - - - - def notMatchedAction(self): - - localctx = SqlBaseParser.NotMatchedActionContext(self, self._ctx, self.state) - self.enterRule(localctx, 104, self.RULE_notMatchedAction) - self._la = 0 # Token type - try: - self.state = 1802 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,218,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1784 - self.match(SqlBaseParser.INSERT) - self.state = 1785 - self.match(SqlBaseParser.ASTERISK) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1786 - self.match(SqlBaseParser.INSERT) - self.state = 1787 - self.match(SqlBaseParser.T__1) - self.state = 1788 - localctx.columns = self.multipartIdentifierList() - self.state = 1789 - self.match(SqlBaseParser.T__2) - self.state = 1790 - self.match(SqlBaseParser.VALUES) - self.state = 1791 - self.match(SqlBaseParser.T__1) - self.state = 1792 - self.expression() - self.state = 1797 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1793 - self.match(SqlBaseParser.T__3) - self.state = 1794 - self.expression() - self.state = 1799 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1800 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class AssignmentListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def assignment(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.AssignmentContext) - else: - return self.getTypedRuleContext(SqlBaseParser.AssignmentContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_assignmentList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAssignmentList" ): - listener.enterAssignmentList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAssignmentList" ): - listener.exitAssignmentList(self) - - - - - def assignmentList(self): - - localctx = SqlBaseParser.AssignmentListContext(self, self._ctx, self.state) - self.enterRule(localctx, 106, self.RULE_assignmentList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1804 - self.assignment() - self.state = 1809 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1805 - self.match(SqlBaseParser.T__3) - self.state = 1806 - self.assignment() - self.state = 1811 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class AssignmentContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.key = None # MultipartIdentifierContext - self.value = None # ExpressionContext - - def EQ(self): - return self.getToken(SqlBaseParser.EQ, 0) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_assignment - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAssignment" ): - listener.enterAssignment(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAssignment" ): - listener.exitAssignment(self) - - - - - def assignment(self): - - localctx = SqlBaseParser.AssignmentContext(self, self._ctx, self.state) - self.enterRule(localctx, 108, self.RULE_assignment) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1812 - localctx.key = self.multipartIdentifier() - self.state = 1813 - self.match(SqlBaseParser.EQ) - self.state = 1814 - localctx.value = self.expression() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class WhereClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def WHERE(self): - return self.getToken(SqlBaseParser.WHERE, 0) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_whereClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWhereClause" ): - listener.enterWhereClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWhereClause" ): - listener.exitWhereClause(self) - - - - - def whereClause(self): - - localctx = SqlBaseParser.WhereClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 110, self.RULE_whereClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1816 - self.match(SqlBaseParser.WHERE) - self.state = 1817 - self.booleanExpression(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class HavingClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def HAVING(self): - return self.getToken(SqlBaseParser.HAVING, 0) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_havingClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterHavingClause" ): - listener.enterHavingClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitHavingClause" ): - listener.exitHavingClause(self) - - - - - def havingClause(self): - - localctx = SqlBaseParser.HavingClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 112, self.RULE_havingClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1819 - self.match(SqlBaseParser.HAVING) - self.state = 1820 - self.booleanExpression(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class HintContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._hintStatement = None # HintStatementContext - self.hintStatements = list() # of HintStatementContexts - - def hintStatement(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.HintStatementContext) - else: - return self.getTypedRuleContext(SqlBaseParser.HintStatementContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_hint - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterHint" ): - listener.enterHint(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitHint" ): - listener.exitHint(self) - - - - - def hint(self): - - localctx = SqlBaseParser.HintContext(self, self._ctx, self.state) - self.enterRule(localctx, 114, self.RULE_hint) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1822 - self.match(SqlBaseParser.T__5) - self.state = 1823 - localctx._hintStatement = self.hintStatement() - localctx.hintStatements.append(localctx._hintStatement) - self.state = 1830 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,221,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1825 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,220,self._ctx) - if la_ == 1: - self.state = 1824 - self.match(SqlBaseParser.T__3) - - - self.state = 1827 - localctx._hintStatement = self.hintStatement() - localctx.hintStatements.append(localctx._hintStatement) - self.state = 1832 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,221,self._ctx) - - self.state = 1833 - self.match(SqlBaseParser.T__6) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class HintStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.hintName = None # IdentifierContext - self._primaryExpression = None # PrimaryExpressionContext - self.parameters = list() # of PrimaryExpressionContexts - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def primaryExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PrimaryExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_hintStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterHintStatement" ): - listener.enterHintStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitHintStatement" ): - listener.exitHintStatement(self) - - - - - def hintStatement(self): - - localctx = SqlBaseParser.HintStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 116, self.RULE_hintStatement) - self._la = 0 # Token type - try: - self.state = 1848 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,223,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1835 - localctx.hintName = self.identifier() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1836 - localctx.hintName = self.identifier() - self.state = 1837 - self.match(SqlBaseParser.T__1) - self.state = 1838 - localctx._primaryExpression = self.primaryExpression(0) - localctx.parameters.append(localctx._primaryExpression) - self.state = 1843 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1839 - self.match(SqlBaseParser.T__3) - self.state = 1840 - localctx._primaryExpression = self.primaryExpression(0) - localctx.parameters.append(localctx._primaryExpression) - self.state = 1845 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1846 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FromClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - - def relation(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.RelationContext) - else: - return self.getTypedRuleContext(SqlBaseParser.RelationContext,i) - - - def lateralView(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.LateralViewContext) - else: - return self.getTypedRuleContext(SqlBaseParser.LateralViewContext,i) - - - def pivotClause(self): - return self.getTypedRuleContext(SqlBaseParser.PivotClauseContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_fromClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFromClause" ): - listener.enterFromClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFromClause" ): - listener.exitFromClause(self) - - - - - def fromClause(self): - - localctx = SqlBaseParser.FromClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 118, self.RULE_fromClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1850 - self.match(SqlBaseParser.FROM) - self.state = 1851 - self.relation() - self.state = 1856 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,224,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1852 - self.match(SqlBaseParser.T__3) - self.state = 1853 - self.relation() - self.state = 1858 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,224,self._ctx) - - self.state = 1862 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,225,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1859 - self.lateralView() - self.state = 1864 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,225,self._ctx) - - self.state = 1866 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,226,self._ctx) - if la_ == 1: - self.state = 1865 - self.pivotClause() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class AggregationClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._expression = None # ExpressionContext - self.groupingExpressions = list() # of ExpressionContexts - self.kind = None # Token - - def GROUP(self): - return self.getToken(SqlBaseParser.GROUP, 0) - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - - def SETS(self): - return self.getToken(SqlBaseParser.SETS, 0) - - def groupingSet(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.GroupingSetContext) - else: - return self.getTypedRuleContext(SqlBaseParser.GroupingSetContext,i) - - - def ROLLUP(self): - return self.getToken(SqlBaseParser.ROLLUP, 0) - - def CUBE(self): - return self.getToken(SqlBaseParser.CUBE, 0) - - def GROUPING(self): - return self.getToken(SqlBaseParser.GROUPING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_aggregationClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAggregationClause" ): - listener.enterAggregationClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAggregationClause" ): - listener.exitAggregationClause(self) - - - - - def aggregationClause(self): - - localctx = SqlBaseParser.AggregationClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 120, self.RULE_aggregationClause) - self._la = 0 # Token type - try: - self.state = 1912 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,231,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1868 - self.match(SqlBaseParser.GROUP) - self.state = 1869 - self.match(SqlBaseParser.BY) - self.state = 1870 - localctx._expression = self.expression() - localctx.groupingExpressions.append(localctx._expression) - self.state = 1875 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,227,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1871 - self.match(SqlBaseParser.T__3) - self.state = 1872 - localctx._expression = self.expression() - localctx.groupingExpressions.append(localctx._expression) - self.state = 1877 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,227,self._ctx) - - self.state = 1895 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,229,self._ctx) - if la_ == 1: - self.state = 1878 - self.match(SqlBaseParser.WITH) - self.state = 1879 - localctx.kind = self.match(SqlBaseParser.ROLLUP) - - elif la_ == 2: - self.state = 1880 - self.match(SqlBaseParser.WITH) - self.state = 1881 - localctx.kind = self.match(SqlBaseParser.CUBE) - - elif la_ == 3: - self.state = 1882 - localctx.kind = self.match(SqlBaseParser.GROUPING) - self.state = 1883 - self.match(SqlBaseParser.SETS) - self.state = 1884 - self.match(SqlBaseParser.T__1) - self.state = 1885 - self.groupingSet() - self.state = 1890 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1886 - self.match(SqlBaseParser.T__3) - self.state = 1887 - self.groupingSet() - self.state = 1892 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1893 - self.match(SqlBaseParser.T__2) - - - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1897 - self.match(SqlBaseParser.GROUP) - self.state = 1898 - self.match(SqlBaseParser.BY) - self.state = 1899 - localctx.kind = self.match(SqlBaseParser.GROUPING) - self.state = 1900 - self.match(SqlBaseParser.SETS) - self.state = 1901 - self.match(SqlBaseParser.T__1) - self.state = 1902 - self.groupingSet() - self.state = 1907 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1903 - self.match(SqlBaseParser.T__3) - self.state = 1904 - self.groupingSet() - self.state = 1909 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1910 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class GroupingSetContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_groupingSet - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterGroupingSet" ): - listener.enterGroupingSet(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitGroupingSet" ): - listener.exitGroupingSet(self) - - - - - def groupingSet(self): - - localctx = SqlBaseParser.GroupingSetContext(self, self._ctx, self.state) - self.enterRule(localctx, 122, self.RULE_groupingSet) - self._la = 0 # Token type - try: - self.state = 1927 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,234,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1914 - self.match(SqlBaseParser.T__1) - self.state = 1923 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,233,self._ctx) - if la_ == 1: - self.state = 1915 - self.expression() - self.state = 1920 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1916 - self.match(SqlBaseParser.T__3) - self.state = 1917 - self.expression() - self.state = 1922 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 1925 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1926 - self.expression() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PivotClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.aggregates = None # NamedExpressionSeqContext - self._pivotValue = None # PivotValueContext - self.pivotValues = list() # of PivotValueContexts - - def PIVOT(self): - return self.getToken(SqlBaseParser.PIVOT, 0) - - def FOR(self): - return self.getToken(SqlBaseParser.FOR, 0) - - def pivotColumn(self): - return self.getTypedRuleContext(SqlBaseParser.PivotColumnContext,0) - - - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - - def namedExpressionSeq(self): - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionSeqContext,0) - - - def pivotValue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.PivotValueContext) - else: - return self.getTypedRuleContext(SqlBaseParser.PivotValueContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_pivotClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPivotClause" ): - listener.enterPivotClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPivotClause" ): - listener.exitPivotClause(self) - - - - - def pivotClause(self): - - localctx = SqlBaseParser.PivotClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 124, self.RULE_pivotClause) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1929 - self.match(SqlBaseParser.PIVOT) - self.state = 1930 - self.match(SqlBaseParser.T__1) - self.state = 1931 - localctx.aggregates = self.namedExpressionSeq() - self.state = 1932 - self.match(SqlBaseParser.FOR) - self.state = 1933 - self.pivotColumn() - self.state = 1934 - self.match(SqlBaseParser.IN) - self.state = 1935 - self.match(SqlBaseParser.T__1) - self.state = 1936 - localctx._pivotValue = self.pivotValue() - localctx.pivotValues.append(localctx._pivotValue) - self.state = 1941 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1937 - self.match(SqlBaseParser.T__3) - self.state = 1938 - localctx._pivotValue = self.pivotValue() - localctx.pivotValues.append(localctx._pivotValue) - self.state = 1943 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1944 - self.match(SqlBaseParser.T__2) - self.state = 1945 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PivotColumnContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._identifier = None # IdentifierContext - self.identifiers = list() # of IdentifierContexts - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_pivotColumn - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPivotColumn" ): - listener.enterPivotColumn(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPivotColumn" ): - listener.exitPivotColumn(self) - - - - - def pivotColumn(self): - - localctx = SqlBaseParser.PivotColumnContext(self, self._ctx, self.state) - self.enterRule(localctx, 126, self.RULE_pivotColumn) - self._la = 0 # Token type - try: - self.state = 1959 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,237,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1947 - localctx._identifier = self.identifier() - localctx.identifiers.append(localctx._identifier) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1948 - self.match(SqlBaseParser.T__1) - self.state = 1949 - localctx._identifier = self.identifier() - localctx.identifiers.append(localctx._identifier) - self.state = 1954 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1950 - self.match(SqlBaseParser.T__3) - self.state = 1951 - localctx._identifier = self.identifier() - localctx.identifiers.append(localctx._identifier) - self.state = 1956 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 1957 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PivotValueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_pivotValue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPivotValue" ): - listener.enterPivotValue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPivotValue" ): - listener.exitPivotValue(self) - - - - - def pivotValue(self): - - localctx = SqlBaseParser.PivotValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 128, self.RULE_pivotValue) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1961 - self.expression() - self.state = 1966 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,239,self._ctx) - if la_ == 1: - self.state = 1963 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,238,self._ctx) - if la_ == 1: - self.state = 1962 - self.match(SqlBaseParser.AS) - - - self.state = 1965 - self.identifier() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class LateralViewContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.tblName = None # IdentifierContext - self._identifier = None # IdentifierContext - self.colName = list() # of IdentifierContexts - - def LATERAL(self): - return self.getToken(SqlBaseParser.LATERAL, 0) - - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def OUTER(self): - return self.getToken(SqlBaseParser.OUTER, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_lateralView - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLateralView" ): - listener.enterLateralView(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLateralView" ): - listener.exitLateralView(self) - - - - - def lateralView(self): - - localctx = SqlBaseParser.LateralViewContext(self, self._ctx, self.state) - self.enterRule(localctx, 130, self.RULE_lateralView) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1968 - self.match(SqlBaseParser.LATERAL) - self.state = 1969 - self.match(SqlBaseParser.VIEW) - self.state = 1971 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,240,self._ctx) - if la_ == 1: - self.state = 1970 - self.match(SqlBaseParser.OUTER) - - - self.state = 1973 - self.qualifiedName() - self.state = 1974 - self.match(SqlBaseParser.T__1) - self.state = 1983 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,242,self._ctx) - if la_ == 1: - self.state = 1975 - self.expression() - self.state = 1980 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 1976 - self.match(SqlBaseParser.T__3) - self.state = 1977 - self.expression() - self.state = 1982 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 1985 - self.match(SqlBaseParser.T__2) - self.state = 1986 - localctx.tblName = self.identifier() - self.state = 1998 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,245,self._ctx) - if la_ == 1: - self.state = 1988 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,243,self._ctx) - if la_ == 1: - self.state = 1987 - self.match(SqlBaseParser.AS) - - - self.state = 1990 - localctx._identifier = self.identifier() - localctx.colName.append(localctx._identifier) - self.state = 1995 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,244,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 1991 - self.match(SqlBaseParser.T__3) - self.state = 1992 - localctx._identifier = self.identifier() - localctx.colName.append(localctx._identifier) - self.state = 1997 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,244,self._ctx) - - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SetQuantifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def DISTINCT(self): - return self.getToken(SqlBaseParser.DISTINCT, 0) - - def ALL(self): - return self.getToken(SqlBaseParser.ALL, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_setQuantifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSetQuantifier" ): - listener.enterSetQuantifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSetQuantifier" ): - listener.exitSetQuantifier(self) - - - - - def setQuantifier(self): - - localctx = SqlBaseParser.SetQuantifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 132, self.RULE_setQuantifier) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2000 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ALL or _la==SqlBaseParser.DISTINCT): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class RelationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def relationPrimary(self): - return self.getTypedRuleContext(SqlBaseParser.RelationPrimaryContext,0) - - - def joinRelation(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.JoinRelationContext) - else: - return self.getTypedRuleContext(SqlBaseParser.JoinRelationContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_relation - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRelation" ): - listener.enterRelation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRelation" ): - listener.exitRelation(self) - - - - - def relation(self): - - localctx = SqlBaseParser.RelationContext(self, self._ctx, self.state) - self.enterRule(localctx, 134, self.RULE_relation) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2002 - self.relationPrimary() - self.state = 2006 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,246,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2003 - self.joinRelation() - self.state = 2008 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,246,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class JoinRelationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.right = None # RelationPrimaryContext - - def JOIN(self): - return self.getToken(SqlBaseParser.JOIN, 0) - - def relationPrimary(self): - return self.getTypedRuleContext(SqlBaseParser.RelationPrimaryContext,0) - - - def joinType(self): - return self.getTypedRuleContext(SqlBaseParser.JoinTypeContext,0) - - - def joinCriteria(self): - return self.getTypedRuleContext(SqlBaseParser.JoinCriteriaContext,0) - - - def NATURAL(self): - return self.getToken(SqlBaseParser.NATURAL, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_joinRelation - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterJoinRelation" ): - listener.enterJoinRelation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitJoinRelation" ): - listener.exitJoinRelation(self) - - - - - def joinRelation(self): - - localctx = SqlBaseParser.JoinRelationContext(self, self._ctx, self.state) - self.enterRule(localctx, 136, self.RULE_joinRelation) - try: - self.state = 2020 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.ANTI, SqlBaseParser.CROSS, SqlBaseParser.FULL, SqlBaseParser.INNER, SqlBaseParser.JOIN, SqlBaseParser.LEFT, SqlBaseParser.RIGHT, SqlBaseParser.SEMI]: - self.enterOuterAlt(localctx, 1) - self.state = 2009 - self.joinType() - self.state = 2010 - self.match(SqlBaseParser.JOIN) - self.state = 2011 - localctx.right = self.relationPrimary() - self.state = 2013 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,247,self._ctx) - if la_ == 1: - self.state = 2012 - self.joinCriteria() - - - pass - elif token in [SqlBaseParser.NATURAL]: - self.enterOuterAlt(localctx, 2) - self.state = 2015 - self.match(SqlBaseParser.NATURAL) - self.state = 2016 - self.joinType() - self.state = 2017 - self.match(SqlBaseParser.JOIN) - self.state = 2018 - localctx.right = self.relationPrimary() - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class JoinTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def INNER(self): - return self.getToken(SqlBaseParser.INNER, 0) - - def CROSS(self): - return self.getToken(SqlBaseParser.CROSS, 0) - - def LEFT(self): - return self.getToken(SqlBaseParser.LEFT, 0) - - def OUTER(self): - return self.getToken(SqlBaseParser.OUTER, 0) - - def SEMI(self): - return self.getToken(SqlBaseParser.SEMI, 0) - - def RIGHT(self): - return self.getToken(SqlBaseParser.RIGHT, 0) - - def FULL(self): - return self.getToken(SqlBaseParser.FULL, 0) - - def ANTI(self): - return self.getToken(SqlBaseParser.ANTI, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_joinType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterJoinType" ): - listener.enterJoinType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitJoinType" ): - listener.exitJoinType(self) - - - - - def joinType(self): - - localctx = SqlBaseParser.JoinTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 138, self.RULE_joinType) - self._la = 0 # Token type - try: - self.state = 2046 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,255,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2023 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.INNER: - self.state = 2022 - self.match(SqlBaseParser.INNER) - - - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2025 - self.match(SqlBaseParser.CROSS) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2026 - self.match(SqlBaseParser.LEFT) - self.state = 2028 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OUTER: - self.state = 2027 - self.match(SqlBaseParser.OUTER) - - - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 2031 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LEFT: - self.state = 2030 - self.match(SqlBaseParser.LEFT) - - - self.state = 2033 - self.match(SqlBaseParser.SEMI) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 2034 - self.match(SqlBaseParser.RIGHT) - self.state = 2036 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OUTER: - self.state = 2035 - self.match(SqlBaseParser.OUTER) - - - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 2038 - self.match(SqlBaseParser.FULL) - self.state = 2040 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.OUTER: - self.state = 2039 - self.match(SqlBaseParser.OUTER) - - - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 2043 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.LEFT: - self.state = 2042 - self.match(SqlBaseParser.LEFT) - - - self.state = 2045 - self.match(SqlBaseParser.ANTI) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class JoinCriteriaContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_joinCriteria - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterJoinCriteria" ): - listener.enterJoinCriteria(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitJoinCriteria" ): - listener.exitJoinCriteria(self) - - - - - def joinCriteria(self): - - localctx = SqlBaseParser.JoinCriteriaContext(self, self._ctx, self.state) - self.enterRule(localctx, 140, self.RULE_joinCriteria) - try: - self.state = 2052 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.ON]: - self.enterOuterAlt(localctx, 1) - self.state = 2048 - self.match(SqlBaseParser.ON) - self.state = 2049 - self.booleanExpression(0) - pass - elif token in [SqlBaseParser.USING]: - self.enterOuterAlt(localctx, 2) - self.state = 2050 - self.match(SqlBaseParser.USING) - self.state = 2051 - self.identifierList() - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SampleContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def TABLESAMPLE(self): - return self.getToken(SqlBaseParser.TABLESAMPLE, 0) - - def sampleMethod(self): - return self.getTypedRuleContext(SqlBaseParser.SampleMethodContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_sample - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSample" ): - listener.enterSample(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSample" ): - listener.exitSample(self) - - - - - def sample(self): - - localctx = SqlBaseParser.SampleContext(self, self._ctx, self.state) - self.enterRule(localctx, 142, self.RULE_sample) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2054 - self.match(SqlBaseParser.TABLESAMPLE) - self.state = 2055 - self.match(SqlBaseParser.T__1) - self.state = 2057 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,257,self._ctx) - if la_ == 1: - self.state = 2056 - self.sampleMethod() - - - self.state = 2059 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class SampleMethodContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_sampleMethod - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class SampleByRowsContext(SampleMethodContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext - super().__init__(parser) - self.copyFrom(ctx) - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - def ROWS(self): - return self.getToken(SqlBaseParser.ROWS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSampleByRows" ): - listener.enterSampleByRows(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSampleByRows" ): - listener.exitSampleByRows(self) - - - class SampleByPercentileContext(SampleMethodContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext - super().__init__(parser) - self.negativeSign = None # Token - self.percentage = None # Token - self.copyFrom(ctx) - - def PERCENTLIT(self): - return self.getToken(SqlBaseParser.PERCENTLIT, 0) - def INTEGER_VALUE(self): - return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) - def DECIMAL_VALUE(self): - return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSampleByPercentile" ): - listener.enterSampleByPercentile(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSampleByPercentile" ): - listener.exitSampleByPercentile(self) - - - class SampleByBucketContext(SampleMethodContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext - super().__init__(parser) - self.sampleType = None # Token - self.numerator = None # Token - self.denominator = None # Token - self.copyFrom(ctx) - - def OUT(self): - return self.getToken(SqlBaseParser.OUT, 0) - def OF(self): - return self.getToken(SqlBaseParser.OF, 0) - def BUCKET(self): - return self.getToken(SqlBaseParser.BUCKET, 0) - def INTEGER_VALUE(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.INTEGER_VALUE) - else: - return self.getToken(SqlBaseParser.INTEGER_VALUE, i) - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSampleByBucket" ): - listener.enterSampleByBucket(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSampleByBucket" ): - listener.exitSampleByBucket(self) - - - class SampleByBytesContext(SampleMethodContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.SampleMethodContext - super().__init__(parser) - self.bytes = None # ExpressionContext - self.copyFrom(ctx) - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSampleByBytes" ): - listener.enterSampleByBytes(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSampleByBytes" ): - listener.exitSampleByBytes(self) - - - - def sampleMethod(self): - - localctx = SqlBaseParser.SampleMethodContext(self, self._ctx, self.state) - self.enterRule(localctx, 144, self.RULE_sampleMethod) - self._la = 0 # Token type - try: - self.state = 2085 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,261,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.SampleByPercentileContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2062 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2061 - localctx.negativeSign = self.match(SqlBaseParser.MINUS) - - - self.state = 2064 - localctx.percentage = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.INTEGER_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): - localctx.percentage = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2065 - self.match(SqlBaseParser.PERCENTLIT) - pass - - elif la_ == 2: - localctx = SqlBaseParser.SampleByRowsContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2066 - self.expression() - self.state = 2067 - self.match(SqlBaseParser.ROWS) - pass - - elif la_ == 3: - localctx = SqlBaseParser.SampleByBucketContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2069 - localctx.sampleType = self.match(SqlBaseParser.BUCKET) - self.state = 2070 - localctx.numerator = self.match(SqlBaseParser.INTEGER_VALUE) - self.state = 2071 - self.match(SqlBaseParser.OUT) - self.state = 2072 - self.match(SqlBaseParser.OF) - self.state = 2073 - localctx.denominator = self.match(SqlBaseParser.INTEGER_VALUE) - self.state = 2082 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ON: - self.state = 2074 - self.match(SqlBaseParser.ON) - self.state = 2080 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,259,self._ctx) - if la_ == 1: - self.state = 2075 - self.identifier() - pass - - elif la_ == 2: - self.state = 2076 - self.qualifiedName() - self.state = 2077 - self.match(SqlBaseParser.T__1) - self.state = 2078 - self.match(SqlBaseParser.T__2) - pass - - - - - pass - - elif la_ == 4: - localctx = SqlBaseParser.SampleByBytesContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2084 - localctx.bytes = self.expression() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IdentifierListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifierSeq(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierSeqContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_identifierList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentifierList" ): - listener.enterIdentifierList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentifierList" ): - listener.exitIdentifierList(self) - - - - - def identifierList(self): - - localctx = SqlBaseParser.IdentifierListContext(self, self._ctx, self.state) - self.enterRule(localctx, 146, self.RULE_identifierList) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2087 - self.match(SqlBaseParser.T__1) - self.state = 2088 - self.identifierSeq() - self.state = 2089 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IdentifierSeqContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._errorCapturingIdentifier = None # ErrorCapturingIdentifierContext - self.ident = list() # of ErrorCapturingIdentifierContexts - - def errorCapturingIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_identifierSeq - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentifierSeq" ): - listener.enterIdentifierSeq(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentifierSeq" ): - listener.exitIdentifierSeq(self) - - - - - def identifierSeq(self): - - localctx = SqlBaseParser.IdentifierSeqContext(self, self._ctx, self.state) - self.enterRule(localctx, 148, self.RULE_identifierSeq) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2091 - localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() - localctx.ident.append(localctx._errorCapturingIdentifier) - self.state = 2096 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,262,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2092 - self.match(SqlBaseParser.T__3) - self.state = 2093 - localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() - localctx.ident.append(localctx._errorCapturingIdentifier) - self.state = 2098 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,262,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class OrderedIdentifierListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def orderedIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.OrderedIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.OrderedIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_orderedIdentifierList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterOrderedIdentifierList" ): - listener.enterOrderedIdentifierList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitOrderedIdentifierList" ): - listener.exitOrderedIdentifierList(self) - - - - - def orderedIdentifierList(self): - - localctx = SqlBaseParser.OrderedIdentifierListContext(self, self._ctx, self.state) - self.enterRule(localctx, 150, self.RULE_orderedIdentifierList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2099 - self.match(SqlBaseParser.T__1) - self.state = 2100 - self.orderedIdentifier() - self.state = 2105 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2101 - self.match(SqlBaseParser.T__3) - self.state = 2102 - self.orderedIdentifier() - self.state = 2107 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2108 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class OrderedIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.ident = None # ErrorCapturingIdentifierContext - self.ordering = None # Token - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def ASC(self): - return self.getToken(SqlBaseParser.ASC, 0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_orderedIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterOrderedIdentifier" ): - listener.enterOrderedIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitOrderedIdentifier" ): - listener.exitOrderedIdentifier(self) - - - - - def orderedIdentifier(self): - - localctx = SqlBaseParser.OrderedIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 152, self.RULE_orderedIdentifier) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2110 - localctx.ident = self.errorCapturingIdentifier() - self.state = 2112 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC: - self.state = 2111 - localctx.ordering = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ASC or _la==SqlBaseParser.DESC): - localctx.ordering = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IdentifierCommentListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifierComment(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierCommentContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierCommentContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_identifierCommentList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentifierCommentList" ): - listener.enterIdentifierCommentList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentifierCommentList" ): - listener.exitIdentifierCommentList(self) - - - - - def identifierCommentList(self): - - localctx = SqlBaseParser.IdentifierCommentListContext(self, self._ctx, self.state) - self.enterRule(localctx, 154, self.RULE_identifierCommentList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2114 - self.match(SqlBaseParser.T__1) - self.state = 2115 - self.identifierComment() - self.state = 2120 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2116 - self.match(SqlBaseParser.T__3) - self.state = 2117 - self.identifierComment() - self.state = 2122 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2123 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IdentifierCommentContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def commentSpec(self): - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_identifierComment - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentifierComment" ): - listener.enterIdentifierComment(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentifierComment" ): - listener.exitIdentifierComment(self) - - - - - def identifierComment(self): - - localctx = SqlBaseParser.IdentifierCommentContext(self, self._ctx, self.state) - self.enterRule(localctx, 156, self.RULE_identifierComment) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2125 - self.identifier() - self.state = 2127 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.COMMENT: - self.state = 2126 - self.commentSpec() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class RelationPrimaryContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_relationPrimary - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class TableValuedFunctionContext(RelationPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def functionTable(self): - return self.getTypedRuleContext(SqlBaseParser.FunctionTableContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableValuedFunction" ): - listener.enterTableValuedFunction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableValuedFunction" ): - listener.exitTableValuedFunction(self) - - - class InlineTableDefault2Context(RelationPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def inlineTable(self): - return self.getTypedRuleContext(SqlBaseParser.InlineTableContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInlineTableDefault2" ): - listener.enterInlineTableDefault2(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInlineTableDefault2" ): - listener.exitInlineTableDefault2(self) - - - class AliasedRelationContext(RelationPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def relation(self): - return self.getTypedRuleContext(SqlBaseParser.RelationContext,0) - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - def sample(self): - return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAliasedRelation" ): - listener.enterAliasedRelation(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAliasedRelation" ): - listener.exitAliasedRelation(self) - - - class AliasedQueryContext(RelationPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - def sample(self): - return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAliasedQuery" ): - listener.enterAliasedQuery(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAliasedQuery" ): - listener.exitAliasedQuery(self) - - - class TableNameContext(RelationPrimaryContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RelationPrimaryContext - super().__init__(parser) - self.copyFrom(ctx) - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - def sample(self): - return self.getTypedRuleContext(SqlBaseParser.SampleContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableName" ): - listener.enterTableName(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableName" ): - listener.exitTableName(self) - - - - def relationPrimary(self): - - localctx = SqlBaseParser.RelationPrimaryContext(self, self._ctx, self.state) - self.enterRule(localctx, 158, self.RULE_relationPrimary) - try: - self.state = 2153 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,270,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.TableNameContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2129 - self.multipartIdentifier() - self.state = 2131 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,267,self._ctx) - if la_ == 1: - self.state = 2130 - self.sample() - - - self.state = 2133 - self.tableAlias() - pass - - elif la_ == 2: - localctx = SqlBaseParser.AliasedQueryContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2135 - self.match(SqlBaseParser.T__1) - self.state = 2136 - self.query() - self.state = 2137 - self.match(SqlBaseParser.T__2) - self.state = 2139 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,268,self._ctx) - if la_ == 1: - self.state = 2138 - self.sample() - - - self.state = 2141 - self.tableAlias() - pass - - elif la_ == 3: - localctx = SqlBaseParser.AliasedRelationContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2143 - self.match(SqlBaseParser.T__1) - self.state = 2144 - self.relation() - self.state = 2145 - self.match(SqlBaseParser.T__2) - self.state = 2147 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,269,self._ctx) - if la_ == 1: - self.state = 2146 - self.sample() - - - self.state = 2149 - self.tableAlias() - pass - - elif la_ == 4: - localctx = SqlBaseParser.InlineTableDefault2Context(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2151 - self.inlineTable() - pass - - elif la_ == 5: - localctx = SqlBaseParser.TableValuedFunctionContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 2152 - self.functionTable() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class InlineTableContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def VALUES(self): - return self.getToken(SqlBaseParser.VALUES, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_inlineTable - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInlineTable" ): - listener.enterInlineTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInlineTable" ): - listener.exitInlineTable(self) - - - - - def inlineTable(self): - - localctx = SqlBaseParser.InlineTableContext(self, self._ctx, self.state) - self.enterRule(localctx, 160, self.RULE_inlineTable) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2155 - self.match(SqlBaseParser.VALUES) - self.state = 2156 - self.expression() - self.state = 2161 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,271,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2157 - self.match(SqlBaseParser.T__3) - self.state = 2158 - self.expression() - self.state = 2163 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,271,self._ctx) - - self.state = 2164 - self.tableAlias() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FunctionTableContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.funcName = None # ErrorCapturingIdentifierContext - - def tableAlias(self): - return self.getTypedRuleContext(SqlBaseParser.TableAliasContext,0) - - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_functionTable - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionTable" ): - listener.enterFunctionTable(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionTable" ): - listener.exitFunctionTable(self) - - - - - def functionTable(self): - - localctx = SqlBaseParser.FunctionTableContext(self, self._ctx, self.state) - self.enterRule(localctx, 162, self.RULE_functionTable) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2166 - localctx.funcName = self.errorCapturingIdentifier() - self.state = 2167 - self.match(SqlBaseParser.T__1) - self.state = 2176 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,273,self._ctx) - if la_ == 1: - self.state = 2168 - self.expression() - self.state = 2173 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2169 - self.match(SqlBaseParser.T__3) - self.state = 2170 - self.expression() - self.state = 2175 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 2178 - self.match(SqlBaseParser.T__2) - self.state = 2179 - self.tableAlias() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TableAliasContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def strictIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.StrictIdentifierContext,0) - - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_tableAlias - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableAlias" ): - listener.enterTableAlias(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableAlias" ): - listener.exitTableAlias(self) - - - - - def tableAlias(self): - - localctx = SqlBaseParser.TableAliasContext(self, self._ctx, self.state) - self.enterRule(localctx, 164, self.RULE_tableAlias) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2188 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,276,self._ctx) - if la_ == 1: - self.state = 2182 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,274,self._ctx) - if la_ == 1: - self.state = 2181 - self.match(SqlBaseParser.AS) - - - self.state = 2184 - self.strictIdentifier() - self.state = 2186 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,275,self._ctx) - if la_ == 1: - self.state = 2185 - self.identifierList() - - - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class RowFormatContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_rowFormat - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class RowFormatSerdeContext(RowFormatContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RowFormatContext - super().__init__(parser) - self.name = None # Token - self.props = None # TablePropertyListContext - self.copyFrom(ctx) - - def ROW(self): - return self.getToken(SqlBaseParser.ROW, 0) - def FORMAT(self): - return self.getToken(SqlBaseParser.FORMAT, 0) - def SERDE(self): - return self.getToken(SqlBaseParser.SERDE, 0) - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - def SERDEPROPERTIES(self): - return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) - def tablePropertyList(self): - return self.getTypedRuleContext(SqlBaseParser.TablePropertyListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRowFormatSerde" ): - listener.enterRowFormatSerde(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRowFormatSerde" ): - listener.exitRowFormatSerde(self) - - - class RowFormatDelimitedContext(RowFormatContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.RowFormatContext - super().__init__(parser) - self.fieldsTerminatedBy = None # Token - self.escapedBy = None # Token - self.collectionItemsTerminatedBy = None # Token - self.keysTerminatedBy = None # Token - self.linesSeparatedBy = None # Token - self.nullDefinedAs = None # Token - self.copyFrom(ctx) - - def ROW(self): - return self.getToken(SqlBaseParser.ROW, 0) - def FORMAT(self): - return self.getToken(SqlBaseParser.FORMAT, 0) - def DELIMITED(self): - return self.getToken(SqlBaseParser.DELIMITED, 0) - def FIELDS(self): - return self.getToken(SqlBaseParser.FIELDS, 0) - def TERMINATED(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.TERMINATED) - else: - return self.getToken(SqlBaseParser.TERMINATED, i) - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - def COLLECTION(self): - return self.getToken(SqlBaseParser.COLLECTION, 0) - def ITEMS(self): - return self.getToken(SqlBaseParser.ITEMS, 0) - def MAP(self): - return self.getToken(SqlBaseParser.MAP, 0) - def KEYS(self): - return self.getToken(SqlBaseParser.KEYS, 0) - def LINES(self): - return self.getToken(SqlBaseParser.LINES, 0) - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - def DEFINED(self): - return self.getToken(SqlBaseParser.DEFINED, 0) - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - def STRING(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.STRING) - else: - return self.getToken(SqlBaseParser.STRING, i) - def ESCAPED(self): - return self.getToken(SqlBaseParser.ESCAPED, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRowFormatDelimited" ): - listener.enterRowFormatDelimited(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRowFormatDelimited" ): - listener.exitRowFormatDelimited(self) - - - - def rowFormat(self): - - localctx = SqlBaseParser.RowFormatContext(self, self._ctx, self.state) - self.enterRule(localctx, 166, self.RULE_rowFormat) - try: - self.state = 2239 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,284,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.RowFormatSerdeContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2190 - self.match(SqlBaseParser.ROW) - self.state = 2191 - self.match(SqlBaseParser.FORMAT) - self.state = 2192 - self.match(SqlBaseParser.SERDE) - self.state = 2193 - localctx.name = self.match(SqlBaseParser.STRING) - self.state = 2197 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,277,self._ctx) - if la_ == 1: - self.state = 2194 - self.match(SqlBaseParser.WITH) - self.state = 2195 - self.match(SqlBaseParser.SERDEPROPERTIES) - self.state = 2196 - localctx.props = self.tablePropertyList() - - - pass - - elif la_ == 2: - localctx = SqlBaseParser.RowFormatDelimitedContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2199 - self.match(SqlBaseParser.ROW) - self.state = 2200 - self.match(SqlBaseParser.FORMAT) - self.state = 2201 - self.match(SqlBaseParser.DELIMITED) - self.state = 2211 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,279,self._ctx) - if la_ == 1: - self.state = 2202 - self.match(SqlBaseParser.FIELDS) - self.state = 2203 - self.match(SqlBaseParser.TERMINATED) - self.state = 2204 - self.match(SqlBaseParser.BY) - self.state = 2205 - localctx.fieldsTerminatedBy = self.match(SqlBaseParser.STRING) - self.state = 2209 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,278,self._ctx) - if la_ == 1: - self.state = 2206 - self.match(SqlBaseParser.ESCAPED) - self.state = 2207 - self.match(SqlBaseParser.BY) - self.state = 2208 - localctx.escapedBy = self.match(SqlBaseParser.STRING) - - - - - self.state = 2218 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,280,self._ctx) - if la_ == 1: - self.state = 2213 - self.match(SqlBaseParser.COLLECTION) - self.state = 2214 - self.match(SqlBaseParser.ITEMS) - self.state = 2215 - self.match(SqlBaseParser.TERMINATED) - self.state = 2216 - self.match(SqlBaseParser.BY) - self.state = 2217 - localctx.collectionItemsTerminatedBy = self.match(SqlBaseParser.STRING) - - - self.state = 2225 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,281,self._ctx) - if la_ == 1: - self.state = 2220 - self.match(SqlBaseParser.MAP) - self.state = 2221 - self.match(SqlBaseParser.KEYS) - self.state = 2222 - self.match(SqlBaseParser.TERMINATED) - self.state = 2223 - self.match(SqlBaseParser.BY) - self.state = 2224 - localctx.keysTerminatedBy = self.match(SqlBaseParser.STRING) - - - self.state = 2231 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,282,self._ctx) - if la_ == 1: - self.state = 2227 - self.match(SqlBaseParser.LINES) - self.state = 2228 - self.match(SqlBaseParser.TERMINATED) - self.state = 2229 - self.match(SqlBaseParser.BY) - self.state = 2230 - localctx.linesSeparatedBy = self.match(SqlBaseParser.STRING) - - - self.state = 2237 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,283,self._ctx) - if la_ == 1: - self.state = 2233 - self.match(SqlBaseParser.NULL) - self.state = 2234 - self.match(SqlBaseParser.DEFINED) - self.state = 2235 - self.match(SqlBaseParser.AS) - self.state = 2236 - localctx.nullDefinedAs = self.match(SqlBaseParser.STRING) - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MultipartIdentifierListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def multipartIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.MultipartIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_multipartIdentifierList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMultipartIdentifierList" ): - listener.enterMultipartIdentifierList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMultipartIdentifierList" ): - listener.exitMultipartIdentifierList(self) - - - - - def multipartIdentifierList(self): - - localctx = SqlBaseParser.MultipartIdentifierListContext(self, self._ctx, self.state) - self.enterRule(localctx, 168, self.RULE_multipartIdentifierList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2241 - self.multipartIdentifier() - self.state = 2246 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2242 - self.match(SqlBaseParser.T__3) - self.state = 2243 - self.multipartIdentifier() - self.state = 2248 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MultipartIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._errorCapturingIdentifier = None # ErrorCapturingIdentifierContext - self.parts = list() # of ErrorCapturingIdentifierContexts - - def errorCapturingIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_multipartIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMultipartIdentifier" ): - listener.enterMultipartIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMultipartIdentifier" ): - listener.exitMultipartIdentifier(self) - - - - - def multipartIdentifier(self): - - localctx = SqlBaseParser.MultipartIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 170, self.RULE_multipartIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2249 - localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() - localctx.parts.append(localctx._errorCapturingIdentifier) - self.state = 2254 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,286,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2250 - self.match(SqlBaseParser.T__4) - self.state = 2251 - localctx._errorCapturingIdentifier = self.errorCapturingIdentifier() - localctx.parts.append(localctx._errorCapturingIdentifier) - self.state = 2256 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,286,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TableIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.db = None # ErrorCapturingIdentifierContext - self.table = None # ErrorCapturingIdentifierContext - - def errorCapturingIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_tableIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTableIdentifier" ): - listener.enterTableIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTableIdentifier" ): - listener.exitTableIdentifier(self) - - - - - def tableIdentifier(self): - - localctx = SqlBaseParser.TableIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 172, self.RULE_tableIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2260 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,287,self._ctx) - if la_ == 1: - self.state = 2257 - localctx.db = self.errorCapturingIdentifier() - self.state = 2258 - self.match(SqlBaseParser.T__4) - - - self.state = 2262 - localctx.table = self.errorCapturingIdentifier() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FunctionIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.db = None # ErrorCapturingIdentifierContext - self.function = None # ErrorCapturingIdentifierContext - - def errorCapturingIdentifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ErrorCapturingIdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_functionIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionIdentifier" ): - listener.enterFunctionIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionIdentifier" ): - listener.exitFunctionIdentifier(self) - - - - - def functionIdentifier(self): - - localctx = SqlBaseParser.FunctionIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 174, self.RULE_functionIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2267 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,288,self._ctx) - if la_ == 1: - self.state = 2264 - localctx.db = self.errorCapturingIdentifier() - self.state = 2265 - self.match(SqlBaseParser.T__4) - - - self.state = 2269 - localctx.function = self.errorCapturingIdentifier() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NamedExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # ErrorCapturingIdentifierContext - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def identifierList(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierListContext,0) - - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_namedExpression - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedExpression" ): - listener.enterNamedExpression(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedExpression" ): - listener.exitNamedExpression(self) - - - - - def namedExpression(self): - - localctx = SqlBaseParser.NamedExpressionContext(self, self._ctx, self.state) - self.enterRule(localctx, 176, self.RULE_namedExpression) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2271 - self.expression() - self.state = 2279 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,291,self._ctx) - if la_ == 1: - self.state = 2273 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,289,self._ctx) - if la_ == 1: - self.state = 2272 - self.match(SqlBaseParser.AS) - - - self.state = 2277 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,290,self._ctx) - if la_ == 1: - self.state = 2275 - localctx.name = self.errorCapturingIdentifier() - pass - - elif la_ == 2: - self.state = 2276 - self.identifierList() - pass - - - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NamedExpressionSeqContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def namedExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_namedExpressionSeq - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedExpressionSeq" ): - listener.enterNamedExpressionSeq(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedExpressionSeq" ): - listener.exitNamedExpressionSeq(self) - - - - - def namedExpressionSeq(self): - - localctx = SqlBaseParser.NamedExpressionSeqContext(self, self._ctx, self.state) - self.enterRule(localctx, 178, self.RULE_namedExpressionSeq) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2281 - self.namedExpression() - self.state = 2286 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,292,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2282 - self.match(SqlBaseParser.T__3) - self.state = 2283 - self.namedExpression() - self.state = 2288 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,292,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TransformListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._transform = None # TransformContext - self.transforms = list() # of TransformContexts - - def transform(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TransformContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TransformContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_transformList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTransformList" ): - listener.enterTransformList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTransformList" ): - listener.exitTransformList(self) - - - - - def transformList(self): - - localctx = SqlBaseParser.TransformListContext(self, self._ctx, self.state) - self.enterRule(localctx, 180, self.RULE_transformList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2289 - self.match(SqlBaseParser.T__1) - self.state = 2290 - localctx._transform = self.transform() - localctx.transforms.append(localctx._transform) - self.state = 2295 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2291 - self.match(SqlBaseParser.T__3) - self.state = 2292 - localctx._transform = self.transform() - localctx.transforms.append(localctx._transform) - self.state = 2297 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2298 - self.match(SqlBaseParser.T__2) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TransformContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_transform - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class IdentityTransformContext(TransformContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.TransformContext - super().__init__(parser) - self.copyFrom(ctx) - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentityTransform" ): - listener.enterIdentityTransform(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentityTransform" ): - listener.exitIdentityTransform(self) - - - class ApplyTransformContext(TransformContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.TransformContext - super().__init__(parser) - self.transformName = None # IdentifierContext - self._transformArgument = None # TransformArgumentContext - self.argument = list() # of TransformArgumentContexts - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def transformArgument(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.TransformArgumentContext) - else: - return self.getTypedRuleContext(SqlBaseParser.TransformArgumentContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterApplyTransform" ): - listener.enterApplyTransform(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitApplyTransform" ): - listener.exitApplyTransform(self) - - - - def transform(self): - - localctx = SqlBaseParser.TransformContext(self, self._ctx, self.state) - self.enterRule(localctx, 182, self.RULE_transform) - self._la = 0 # Token type - try: - self.state = 2313 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,295,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.IdentityTransformContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2300 - self.qualifiedName() - pass - - elif la_ == 2: - localctx = SqlBaseParser.ApplyTransformContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2301 - localctx.transformName = self.identifier() - self.state = 2302 - self.match(SqlBaseParser.T__1) - self.state = 2303 - localctx._transformArgument = self.transformArgument() - localctx.argument.append(localctx._transformArgument) - self.state = 2308 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2304 - self.match(SqlBaseParser.T__3) - self.state = 2305 - localctx._transformArgument = self.transformArgument() - localctx.argument.append(localctx._transformArgument) - self.state = 2310 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2311 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class TransformArgumentContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def constant(self): - return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_transformArgument - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTransformArgument" ): - listener.enterTransformArgument(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTransformArgument" ): - listener.exitTransformArgument(self) - - - - - def transformArgument(self): - - localctx = SqlBaseParser.TransformArgumentContext(self, self._ctx, self.state) - self.enterRule(localctx, 184, self.RULE_transformArgument) - try: - self.state = 2317 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,296,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2315 - self.qualifiedName() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2316 - self.constant() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_expression - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExpression" ): - listener.enterExpression(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExpression" ): - listener.exitExpression(self) - - - - - def expression(self): - - localctx = SqlBaseParser.ExpressionContext(self, self._ctx, self.state) - self.enterRule(localctx, 186, self.RULE_expression) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2319 - self.booleanExpression(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class BooleanExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_booleanExpression - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - class LogicalNotContext(BooleanExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLogicalNot" ): - listener.enterLogicalNot(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLogicalNot" ): - listener.exitLogicalNot(self) - - - class PredicatedContext(BooleanExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def valueExpression(self): - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) - - def predicate(self): - return self.getTypedRuleContext(SqlBaseParser.PredicateContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPredicated" ): - listener.enterPredicated(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPredicated" ): - listener.exitPredicated(self) - - - class ExistsContext(BooleanExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExists" ): - listener.enterExists(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExists" ): - listener.exitExists(self) - - - class LogicalBinaryContext(BooleanExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.BooleanExpressionContext - super().__init__(parser) - self.left = None # BooleanExpressionContext - self.operator = None # Token - self.right = None # BooleanExpressionContext - self.copyFrom(ctx) - - def booleanExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.BooleanExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,i) - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLogicalBinary" ): - listener.enterLogicalBinary(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLogicalBinary" ): - listener.exitLogicalBinary(self) - - - - def booleanExpression(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = SqlBaseParser.BooleanExpressionContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 188 - self.enterRecursionRule(localctx, 188, self.RULE_booleanExpression, _p) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2333 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,298,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.LogicalNotContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - - self.state = 2322 - self.match(SqlBaseParser.NOT) - self.state = 2323 - self.booleanExpression(5) - pass - - elif la_ == 2: - localctx = SqlBaseParser.ExistsContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2324 - self.match(SqlBaseParser.EXISTS) - self.state = 2325 - self.match(SqlBaseParser.T__1) - self.state = 2326 - self.query() - self.state = 2327 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 3: - localctx = SqlBaseParser.PredicatedContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2329 - self.valueExpression(0) - self.state = 2331 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,297,self._ctx) - if la_ == 1: - self.state = 2330 - self.predicate() - - - pass - - - self._ctx.stop = self._input.LT(-1) - self.state = 2343 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,300,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 2341 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,299,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.LogicalBinaryContext(self, SqlBaseParser.BooleanExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_booleanExpression) - self.state = 2335 - if not self.precpred(self._ctx, 2): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 2336 - localctx.operator = self.match(SqlBaseParser.AND) - self.state = 2337 - localctx.right = self.booleanExpression(3) - pass - - elif la_ == 2: - localctx = SqlBaseParser.LogicalBinaryContext(self, SqlBaseParser.BooleanExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_booleanExpression) - self.state = 2338 - if not self.precpred(self._ctx, 1): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 2339 - localctx.operator = self.match(SqlBaseParser.OR) - self.state = 2340 - localctx.right = self.booleanExpression(2) - pass - - - self.state = 2345 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,300,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - class PredicateContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.kind = None # Token - self.lower = None # ValueExpressionContext - self.upper = None # ValueExpressionContext - self.pattern = None # ValueExpressionContext - self.quantifier = None # Token - self.escapeChar = None # Token - self.right = None # ValueExpressionContext - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def BETWEEN(self): - return self.getToken(SqlBaseParser.BETWEEN, 0) - - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def RLIKE(self): - return self.getToken(SqlBaseParser.RLIKE, 0) - - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def ANY(self): - return self.getToken(SqlBaseParser.ANY, 0) - - def SOME(self): - return self.getToken(SqlBaseParser.SOME, 0) - - def ALL(self): - return self.getToken(SqlBaseParser.ALL, 0) - - def ESCAPE(self): - return self.getToken(SqlBaseParser.ESCAPE, 0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def IS(self): - return self.getToken(SqlBaseParser.IS, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def TRUE(self): - return self.getToken(SqlBaseParser.TRUE, 0) - - def FALSE(self): - return self.getToken(SqlBaseParser.FALSE, 0) - - def UNKNOWN(self): - return self.getToken(SqlBaseParser.UNKNOWN, 0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - - def DISTINCT(self): - return self.getToken(SqlBaseParser.DISTINCT, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_predicate - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPredicate" ): - listener.enterPredicate(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPredicate" ): - listener.exitPredicate(self) - - - - - def predicate(self): - - localctx = SqlBaseParser.PredicateContext(self, self._ctx, self.state) - self.enterRule(localctx, 190, self.RULE_predicate) - self._la = 0 # Token type - try: - self.state = 2428 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,314,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2347 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2346 - self.match(SqlBaseParser.NOT) - - - self.state = 2349 - localctx.kind = self.match(SqlBaseParser.BETWEEN) - self.state = 2350 - localctx.lower = self.valueExpression(0) - self.state = 2351 - self.match(SqlBaseParser.AND) - self.state = 2352 - localctx.upper = self.valueExpression(0) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2355 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2354 - self.match(SqlBaseParser.NOT) - - - self.state = 2357 - localctx.kind = self.match(SqlBaseParser.IN) - self.state = 2358 - self.match(SqlBaseParser.T__1) - self.state = 2359 - self.expression() - self.state = 2364 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2360 - self.match(SqlBaseParser.T__3) - self.state = 2361 - self.expression() - self.state = 2366 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2367 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2370 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2369 - self.match(SqlBaseParser.NOT) - - - self.state = 2372 - localctx.kind = self.match(SqlBaseParser.IN) - self.state = 2373 - self.match(SqlBaseParser.T__1) - self.state = 2374 - self.query() - self.state = 2375 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 2378 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2377 - self.match(SqlBaseParser.NOT) - - - self.state = 2380 - localctx.kind = self.match(SqlBaseParser.RLIKE) - self.state = 2381 - localctx.pattern = self.valueExpression(0) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 2383 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2382 - self.match(SqlBaseParser.NOT) - - - self.state = 2385 - localctx.kind = self.match(SqlBaseParser.LIKE) - self.state = 2386 - localctx.quantifier = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ALL or _la==SqlBaseParser.ANY or _la==SqlBaseParser.SOME): - localctx.quantifier = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2400 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,308,self._ctx) - if la_ == 1: - self.state = 2387 - self.match(SqlBaseParser.T__1) - self.state = 2388 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 2: - self.state = 2389 - self.match(SqlBaseParser.T__1) - self.state = 2390 - self.expression() - self.state = 2395 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2391 - self.match(SqlBaseParser.T__3) - self.state = 2392 - self.expression() - self.state = 2397 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2398 - self.match(SqlBaseParser.T__2) - pass - - - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 2403 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2402 - self.match(SqlBaseParser.NOT) - - - self.state = 2405 - localctx.kind = self.match(SqlBaseParser.LIKE) - self.state = 2406 - localctx.pattern = self.valueExpression(0) - self.state = 2409 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,310,self._ctx) - if la_ == 1: - self.state = 2407 - self.match(SqlBaseParser.ESCAPE) - self.state = 2408 - localctx.escapeChar = self.match(SqlBaseParser.STRING) - - - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 2411 - self.match(SqlBaseParser.IS) - self.state = 2413 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2412 - self.match(SqlBaseParser.NOT) - - - self.state = 2415 - localctx.kind = self.match(SqlBaseParser.NULL) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 2416 - self.match(SqlBaseParser.IS) - self.state = 2418 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2417 - self.match(SqlBaseParser.NOT) - - - self.state = 2420 - localctx.kind = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FALSE or _la==SqlBaseParser.TRUE or _la==SqlBaseParser.UNKNOWN): - localctx.kind = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 2421 - self.match(SqlBaseParser.IS) - self.state = 2423 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2422 - self.match(SqlBaseParser.NOT) - - - self.state = 2425 - localctx.kind = self.match(SqlBaseParser.DISTINCT) - self.state = 2426 - self.match(SqlBaseParser.FROM) - self.state = 2427 - localctx.right = self.valueExpression(0) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ValueExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_valueExpression - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - class ValueExpressionDefaultContext(ValueExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def primaryExpression(self): - return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterValueExpressionDefault" ): - listener.enterValueExpressionDefault(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitValueExpressionDefault" ): - listener.exitValueExpressionDefault(self) - - - class ComparisonContext(ValueExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext - super().__init__(parser) - self.left = None # ValueExpressionContext - self.right = None # ValueExpressionContext - self.copyFrom(ctx) - - def comparisonOperator(self): - return self.getTypedRuleContext(SqlBaseParser.ComparisonOperatorContext,0) - - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterComparison" ): - listener.enterComparison(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitComparison" ): - listener.exitComparison(self) - - - class ArithmeticBinaryContext(ValueExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext - super().__init__(parser) - self.left = None # ValueExpressionContext - self.operator = None # Token - self.right = None # ValueExpressionContext - self.copyFrom(ctx) - - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - def ASTERISK(self): - return self.getToken(SqlBaseParser.ASTERISK, 0) - def SLASH(self): - return self.getToken(SqlBaseParser.SLASH, 0) - def PERCENT(self): - return self.getToken(SqlBaseParser.PERCENT, 0) - def DIV(self): - return self.getToken(SqlBaseParser.DIV, 0) - def PLUS(self): - return self.getToken(SqlBaseParser.PLUS, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - def CONCAT_PIPE(self): - return self.getToken(SqlBaseParser.CONCAT_PIPE, 0) - def AMPERSAND(self): - return self.getToken(SqlBaseParser.AMPERSAND, 0) - def HAT(self): - return self.getToken(SqlBaseParser.HAT, 0) - def PIPE(self): - return self.getToken(SqlBaseParser.PIPE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterArithmeticBinary" ): - listener.enterArithmeticBinary(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitArithmeticBinary" ): - listener.exitArithmeticBinary(self) - - - class ArithmeticUnaryContext(ValueExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ValueExpressionContext - super().__init__(parser) - self.operator = None # Token - self.copyFrom(ctx) - - def valueExpression(self): - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) - - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - def PLUS(self): - return self.getToken(SqlBaseParser.PLUS, 0) - def TILDE(self): - return self.getToken(SqlBaseParser.TILDE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterArithmeticUnary" ): - listener.enterArithmeticUnary(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitArithmeticUnary" ): - listener.exitArithmeticUnary(self) - - - - def valueExpression(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = SqlBaseParser.ValueExpressionContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 192 - self.enterRecursionRule(localctx, 192, self.RULE_valueExpression, _p) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2434 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,315,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.ValueExpressionDefaultContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - - self.state = 2431 - self.primaryExpression(0) - pass - - elif la_ == 2: - localctx = SqlBaseParser.ArithmeticUnaryContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2432 - localctx.operator = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.TILDE - 272)))) != 0)): - localctx.operator = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2433 - self.valueExpression(7) - pass - - - self._ctx.stop = self._input.LT(-1) - self.state = 2457 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,317,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 2455 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,316,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2436 - if not self.precpred(self._ctx, 6): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") - self.state = 2437 - localctx.operator = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 274)) & ~0x3f) == 0 and ((1 << (_la - 274)) & ((1 << (SqlBaseParser.ASTERISK - 274)) | (1 << (SqlBaseParser.SLASH - 274)) | (1 << (SqlBaseParser.PERCENT - 274)) | (1 << (SqlBaseParser.DIV - 274)))) != 0)): - localctx.operator = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2438 - localctx.right = self.valueExpression(7) - pass - - elif la_ == 2: - localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2439 - if not self.precpred(self._ctx, 5): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 5)") - self.state = 2440 - localctx.operator = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.CONCAT_PIPE - 272)))) != 0)): - localctx.operator = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2441 - localctx.right = self.valueExpression(6) - pass - - elif la_ == 3: - localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2442 - if not self.precpred(self._ctx, 4): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 4)") - self.state = 2443 - localctx.operator = self.match(SqlBaseParser.AMPERSAND) - self.state = 2444 - localctx.right = self.valueExpression(5) - pass - - elif la_ == 4: - localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2445 - if not self.precpred(self._ctx, 3): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 2446 - localctx.operator = self.match(SqlBaseParser.HAT) - self.state = 2447 - localctx.right = self.valueExpression(4) - pass - - elif la_ == 5: - localctx = SqlBaseParser.ArithmeticBinaryContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2448 - if not self.precpred(self._ctx, 2): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 2449 - localctx.operator = self.match(SqlBaseParser.PIPE) - self.state = 2450 - localctx.right = self.valueExpression(3) - pass - - elif la_ == 6: - localctx = SqlBaseParser.ComparisonContext(self, SqlBaseParser.ValueExpressionContext(self, _parentctx, _parentState)) - localctx.left = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_valueExpression) - self.state = 2451 - if not self.precpred(self._ctx, 1): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 2452 - self.comparisonOperator() - self.state = 2453 - localctx.right = self.valueExpression(2) - pass - - - self.state = 2459 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,317,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - class PrimaryExpressionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_primaryExpression - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - class StructContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self._namedExpression = None # NamedExpressionContext - self.argument = list() # of NamedExpressionContexts - self.copyFrom(ctx) - - def STRUCT(self): - return self.getToken(SqlBaseParser.STRUCT, 0) - def namedExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStruct" ): - listener.enterStruct(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStruct" ): - listener.exitStruct(self) - - - class DereferenceContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.base = None # PrimaryExpressionContext - self.fieldName = None # IdentifierContext - self.copyFrom(ctx) - - def primaryExpression(self): - return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDereference" ): - listener.enterDereference(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDereference" ): - listener.exitDereference(self) - - - class SimpleCaseContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.value = None # ExpressionContext - self.elseExpression = None # ExpressionContext - self.copyFrom(ctx) - - def CASE(self): - return self.getToken(SqlBaseParser.CASE, 0) - def END(self): - return self.getToken(SqlBaseParser.END, 0) - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - def whenClause(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.WhenClauseContext) - else: - return self.getTypedRuleContext(SqlBaseParser.WhenClauseContext,i) - - def ELSE(self): - return self.getToken(SqlBaseParser.ELSE, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSimpleCase" ): - listener.enterSimpleCase(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSimpleCase" ): - listener.exitSimpleCase(self) - - - class ColumnReferenceContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterColumnReference" ): - listener.enterColumnReference(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitColumnReference" ): - listener.exitColumnReference(self) - - - class RowConstructorContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def namedExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NamedExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NamedExpressionContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRowConstructor" ): - listener.enterRowConstructor(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRowConstructor" ): - listener.exitRowConstructor(self) - - - class LastContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def LAST(self): - return self.getToken(SqlBaseParser.LAST, 0) - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - def IGNORE(self): - return self.getToken(SqlBaseParser.IGNORE, 0) - def NULLS(self): - return self.getToken(SqlBaseParser.NULLS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLast" ): - listener.enterLast(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLast" ): - listener.exitLast(self) - - - class StarContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def ASTERISK(self): - return self.getToken(SqlBaseParser.ASTERISK, 0) - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStar" ): - listener.enterStar(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStar" ): - listener.exitStar(self) - - - class OverlayContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.input = None # ValueExpressionContext - self.replace = None # ValueExpressionContext - self.position = None # ValueExpressionContext - self.length = None # ValueExpressionContext - self.copyFrom(ctx) - - def OVERLAY(self): - return self.getToken(SqlBaseParser.OVERLAY, 0) - def PLACING(self): - return self.getToken(SqlBaseParser.PLACING, 0) - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - def FOR(self): - return self.getToken(SqlBaseParser.FOR, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterOverlay" ): - listener.enterOverlay(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitOverlay" ): - listener.exitOverlay(self) - - - class SubscriptContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.value = None # PrimaryExpressionContext - self.index = None # ValueExpressionContext - self.copyFrom(ctx) - - def primaryExpression(self): - return self.getTypedRuleContext(SqlBaseParser.PrimaryExpressionContext,0) - - def valueExpression(self): - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSubscript" ): - listener.enterSubscript(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSubscript" ): - listener.exitSubscript(self) - - - class SubqueryExpressionContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def query(self): - return self.getTypedRuleContext(SqlBaseParser.QueryContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSubqueryExpression" ): - listener.enterSubqueryExpression(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSubqueryExpression" ): - listener.exitSubqueryExpression(self) - - - class SubstringContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.str = None # ValueExpressionContext - self.pos = None # ValueExpressionContext - self.len = None # ValueExpressionContext - self.copyFrom(ctx) - - def SUBSTR(self): - return self.getToken(SqlBaseParser.SUBSTR, 0) - def SUBSTRING(self): - return self.getToken(SqlBaseParser.SUBSTRING, 0) - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def FOR(self): - return self.getToken(SqlBaseParser.FOR, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSubstring" ): - listener.enterSubstring(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSubstring" ): - listener.exitSubstring(self) - - - class CurrentDatetimeContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.name = None # Token - self.copyFrom(ctx) - - def CURRENT_DATE(self): - return self.getToken(SqlBaseParser.CURRENT_DATE, 0) - def CURRENT_TIMESTAMP(self): - return self.getToken(SqlBaseParser.CURRENT_TIMESTAMP, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCurrentDatetime" ): - listener.enterCurrentDatetime(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCurrentDatetime" ): - listener.exitCurrentDatetime(self) - - - class CastContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def CAST(self): - return self.getToken(SqlBaseParser.CAST, 0) - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterCast" ): - listener.enterCast(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitCast" ): - listener.exitCast(self) - - - class ConstantDefaultContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def constant(self): - return self.getTypedRuleContext(SqlBaseParser.ConstantContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterConstantDefault" ): - listener.enterConstantDefault(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitConstantDefault" ): - listener.exitConstantDefault(self) - - - class LambdaContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLambda" ): - listener.enterLambda(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLambda" ): - listener.exitLambda(self) - - - class ParenthesizedExpressionContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterParenthesizedExpression" ): - listener.enterParenthesizedExpression(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitParenthesizedExpression" ): - listener.exitParenthesizedExpression(self) - - - class ExtractContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.field = None # IdentifierContext - self.source = None # ValueExpressionContext - self.copyFrom(ctx) - - def EXTRACT(self): - return self.getToken(SqlBaseParser.EXTRACT, 0) - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def valueExpression(self): - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExtract" ): - listener.enterExtract(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExtract" ): - listener.exitExtract(self) - - - class TrimContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.trimOption = None # Token - self.trimStr = None # ValueExpressionContext - self.srcStr = None # ValueExpressionContext - self.copyFrom(ctx) - - def TRIM(self): - return self.getToken(SqlBaseParser.TRIM, 0) - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - def BOTH(self): - return self.getToken(SqlBaseParser.BOTH, 0) - def LEADING(self): - return self.getToken(SqlBaseParser.LEADING, 0) - def TRAILING(self): - return self.getToken(SqlBaseParser.TRAILING, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTrim" ): - listener.enterTrim(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTrim" ): - listener.exitTrim(self) - - - class FunctionCallContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self._expression = None # ExpressionContext - self.argument = list() # of ExpressionContexts - self.where = None # BooleanExpressionContext - self.copyFrom(ctx) - - def functionName(self): - return self.getTypedRuleContext(SqlBaseParser.FunctionNameContext,0) - - def FILTER(self): - return self.getToken(SqlBaseParser.FILTER, 0) - def WHERE(self): - return self.getToken(SqlBaseParser.WHERE, 0) - def OVER(self): - return self.getToken(SqlBaseParser.OVER, 0) - def windowSpec(self): - return self.getTypedRuleContext(SqlBaseParser.WindowSpecContext,0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - def booleanExpression(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanExpressionContext,0) - - def setQuantifier(self): - return self.getTypedRuleContext(SqlBaseParser.SetQuantifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionCall" ): - listener.enterFunctionCall(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionCall" ): - listener.exitFunctionCall(self) - - - class SearchedCaseContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.elseExpression = None # ExpressionContext - self.copyFrom(ctx) - - def CASE(self): - return self.getToken(SqlBaseParser.CASE, 0) - def END(self): - return self.getToken(SqlBaseParser.END, 0) - def whenClause(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.WhenClauseContext) - else: - return self.getTypedRuleContext(SqlBaseParser.WhenClauseContext,i) - - def ELSE(self): - return self.getToken(SqlBaseParser.ELSE, 0) - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSearchedCase" ): - listener.enterSearchedCase(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSearchedCase" ): - listener.exitSearchedCase(self) - - - class PositionContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.substr = None # ValueExpressionContext - self.str = None # ValueExpressionContext - self.copyFrom(ctx) - - def POSITION(self): - return self.getToken(SqlBaseParser.POSITION, 0) - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - def valueExpression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ValueExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ValueExpressionContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPosition" ): - listener.enterPosition(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPosition" ): - listener.exitPosition(self) - - - class FirstContext(PrimaryExpressionContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.PrimaryExpressionContext - super().__init__(parser) - self.copyFrom(ctx) - - def FIRST(self): - return self.getToken(SqlBaseParser.FIRST, 0) - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - def IGNORE(self): - return self.getToken(SqlBaseParser.IGNORE, 0) - def NULLS(self): - return self.getToken(SqlBaseParser.NULLS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFirst" ): - listener.enterFirst(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFirst" ): - listener.exitFirst(self) - - - - def primaryExpression(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = SqlBaseParser.PrimaryExpressionContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 194 - self.enterRecursionRule(localctx, 194, self.RULE_primaryExpression, _p) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2644 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,337,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.CurrentDatetimeContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - - self.state = 2461 - localctx.name = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.CURRENT_DATE or _la==SqlBaseParser.CURRENT_TIMESTAMP): - localctx.name = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 2: - localctx = SqlBaseParser.SearchedCaseContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2462 - self.match(SqlBaseParser.CASE) - self.state = 2464 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 2463 - self.whenClause() - self.state = 2466 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.WHEN): - break - - self.state = 2470 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ELSE: - self.state = 2468 - self.match(SqlBaseParser.ELSE) - self.state = 2469 - localctx.elseExpression = self.expression() - - - self.state = 2472 - self.match(SqlBaseParser.END) - pass - - elif la_ == 3: - localctx = SqlBaseParser.SimpleCaseContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2474 - self.match(SqlBaseParser.CASE) - self.state = 2475 - localctx.value = self.expression() - self.state = 2477 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 2476 - self.whenClause() - self.state = 2479 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.WHEN): - break - - self.state = 2483 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ELSE: - self.state = 2481 - self.match(SqlBaseParser.ELSE) - self.state = 2482 - localctx.elseExpression = self.expression() - - - self.state = 2485 - self.match(SqlBaseParser.END) - pass - - elif la_ == 4: - localctx = SqlBaseParser.CastContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2487 - self.match(SqlBaseParser.CAST) - self.state = 2488 - self.match(SqlBaseParser.T__1) - self.state = 2489 - self.expression() - self.state = 2490 - self.match(SqlBaseParser.AS) - self.state = 2491 - self.dataType() - self.state = 2492 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 5: - localctx = SqlBaseParser.StructContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2494 - self.match(SqlBaseParser.STRUCT) - self.state = 2495 - self.match(SqlBaseParser.T__1) - self.state = 2504 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,323,self._ctx) - if la_ == 1: - self.state = 2496 - localctx._namedExpression = self.namedExpression() - localctx.argument.append(localctx._namedExpression) - self.state = 2501 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2497 - self.match(SqlBaseParser.T__3) - self.state = 2498 - localctx._namedExpression = self.namedExpression() - localctx.argument.append(localctx._namedExpression) - self.state = 2503 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 2506 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 6: - localctx = SqlBaseParser.FirstContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2507 - self.match(SqlBaseParser.FIRST) - self.state = 2508 - self.match(SqlBaseParser.T__1) - self.state = 2509 - self.expression() - self.state = 2512 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IGNORE: - self.state = 2510 - self.match(SqlBaseParser.IGNORE) - self.state = 2511 - self.match(SqlBaseParser.NULLS) - - - self.state = 2514 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 7: - localctx = SqlBaseParser.LastContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2516 - self.match(SqlBaseParser.LAST) - self.state = 2517 - self.match(SqlBaseParser.T__1) - self.state = 2518 - self.expression() - self.state = 2521 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.IGNORE: - self.state = 2519 - self.match(SqlBaseParser.IGNORE) - self.state = 2520 - self.match(SqlBaseParser.NULLS) - - - self.state = 2523 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 8: - localctx = SqlBaseParser.PositionContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2525 - self.match(SqlBaseParser.POSITION) - self.state = 2526 - self.match(SqlBaseParser.T__1) - self.state = 2527 - localctx.substr = self.valueExpression(0) - self.state = 2528 - self.match(SqlBaseParser.IN) - self.state = 2529 - localctx.str = self.valueExpression(0) - self.state = 2530 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 9: - localctx = SqlBaseParser.ConstantDefaultContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2532 - self.constant() - pass - - elif la_ == 10: - localctx = SqlBaseParser.StarContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2533 - self.match(SqlBaseParser.ASTERISK) - pass - - elif la_ == 11: - localctx = SqlBaseParser.StarContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2534 - self.qualifiedName() - self.state = 2535 - self.match(SqlBaseParser.T__4) - self.state = 2536 - self.match(SqlBaseParser.ASTERISK) - pass - - elif la_ == 12: - localctx = SqlBaseParser.RowConstructorContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2538 - self.match(SqlBaseParser.T__1) - self.state = 2539 - self.namedExpression() - self.state = 2542 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 2540 - self.match(SqlBaseParser.T__3) - self.state = 2541 - self.namedExpression() - self.state = 2544 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.T__3): - break - - self.state = 2546 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 13: - localctx = SqlBaseParser.SubqueryExpressionContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2548 - self.match(SqlBaseParser.T__1) - self.state = 2549 - self.query() - self.state = 2550 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 14: - localctx = SqlBaseParser.FunctionCallContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2552 - self.functionName() - self.state = 2553 - self.match(SqlBaseParser.T__1) - self.state = 2565 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,329,self._ctx) - if la_ == 1: - self.state = 2555 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,327,self._ctx) - if la_ == 1: - self.state = 2554 - self.setQuantifier() - - - self.state = 2557 - localctx._expression = self.expression() - localctx.argument.append(localctx._expression) - self.state = 2562 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2558 - self.match(SqlBaseParser.T__3) - self.state = 2559 - localctx._expression = self.expression() - localctx.argument.append(localctx._expression) - self.state = 2564 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 2567 - self.match(SqlBaseParser.T__2) - self.state = 2574 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,330,self._ctx) - if la_ == 1: - self.state = 2568 - self.match(SqlBaseParser.FILTER) - self.state = 2569 - self.match(SqlBaseParser.T__1) - self.state = 2570 - self.match(SqlBaseParser.WHERE) - self.state = 2571 - localctx.where = self.booleanExpression(0) - self.state = 2572 - self.match(SqlBaseParser.T__2) - - - self.state = 2578 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,331,self._ctx) - if la_ == 1: - self.state = 2576 - self.match(SqlBaseParser.OVER) - self.state = 2577 - self.windowSpec() - - - pass - - elif la_ == 15: - localctx = SqlBaseParser.LambdaContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2580 - self.identifier() - self.state = 2581 - self.match(SqlBaseParser.T__7) - self.state = 2582 - self.expression() - pass - - elif la_ == 16: - localctx = SqlBaseParser.LambdaContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2584 - self.match(SqlBaseParser.T__1) - self.state = 2585 - self.identifier() - self.state = 2588 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 2586 - self.match(SqlBaseParser.T__3) - self.state = 2587 - self.identifier() - self.state = 2590 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==SqlBaseParser.T__3): - break - - self.state = 2592 - self.match(SqlBaseParser.T__2) - self.state = 2593 - self.match(SqlBaseParser.T__7) - self.state = 2594 - self.expression() - pass - - elif la_ == 17: - localctx = SqlBaseParser.ColumnReferenceContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2596 - self.identifier() - pass - - elif la_ == 18: - localctx = SqlBaseParser.ParenthesizedExpressionContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2597 - self.match(SqlBaseParser.T__1) - self.state = 2598 - self.expression() - self.state = 2599 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 19: - localctx = SqlBaseParser.ExtractContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2601 - self.match(SqlBaseParser.EXTRACT) - self.state = 2602 - self.match(SqlBaseParser.T__1) - self.state = 2603 - localctx.field = self.identifier() - self.state = 2604 - self.match(SqlBaseParser.FROM) - self.state = 2605 - localctx.source = self.valueExpression(0) - self.state = 2606 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 20: - localctx = SqlBaseParser.SubstringContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2608 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.SUBSTR or _la==SqlBaseParser.SUBSTRING): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2609 - self.match(SqlBaseParser.T__1) - self.state = 2610 - localctx.str = self.valueExpression(0) - self.state = 2611 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.T__3 or _la==SqlBaseParser.FROM): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2612 - localctx.pos = self.valueExpression(0) - self.state = 2615 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.T__3 or _la==SqlBaseParser.FOR: - self.state = 2613 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.T__3 or _la==SqlBaseParser.FOR): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2614 - localctx.len = self.valueExpression(0) - - - self.state = 2617 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 21: - localctx = SqlBaseParser.TrimContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2619 - self.match(SqlBaseParser.TRIM) - self.state = 2620 - self.match(SqlBaseParser.T__1) - self.state = 2622 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,334,self._ctx) - if la_ == 1: - self.state = 2621 - localctx.trimOption = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.BOTH or _la==SqlBaseParser.LEADING or _la==SqlBaseParser.TRAILING): - localctx.trimOption = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 2625 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,335,self._ctx) - if la_ == 1: - self.state = 2624 - localctx.trimStr = self.valueExpression(0) - - - self.state = 2627 - self.match(SqlBaseParser.FROM) - self.state = 2628 - localctx.srcStr = self.valueExpression(0) - self.state = 2629 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 22: - localctx = SqlBaseParser.OverlayContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 2631 - self.match(SqlBaseParser.OVERLAY) - self.state = 2632 - self.match(SqlBaseParser.T__1) - self.state = 2633 - localctx.input = self.valueExpression(0) - self.state = 2634 - self.match(SqlBaseParser.PLACING) - self.state = 2635 - localctx.replace = self.valueExpression(0) - self.state = 2636 - self.match(SqlBaseParser.FROM) - self.state = 2637 - localctx.position = self.valueExpression(0) - self.state = 2640 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.FOR: - self.state = 2638 - self.match(SqlBaseParser.FOR) - self.state = 2639 - localctx.length = self.valueExpression(0) - - - self.state = 2642 - self.match(SqlBaseParser.T__2) - pass - - - self._ctx.stop = self._input.LT(-1) - self.state = 2656 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,339,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 2654 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,338,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.SubscriptContext(self, SqlBaseParser.PrimaryExpressionContext(self, _parentctx, _parentState)) - localctx.value = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_primaryExpression) - self.state = 2646 - if not self.precpred(self._ctx, 8): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 2647 - self.match(SqlBaseParser.T__8) - self.state = 2648 - localctx.index = self.valueExpression(0) - self.state = 2649 - self.match(SqlBaseParser.T__9) - pass - - elif la_ == 2: - localctx = SqlBaseParser.DereferenceContext(self, SqlBaseParser.PrimaryExpressionContext(self, _parentctx, _parentState)) - localctx.base = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_primaryExpression) - self.state = 2651 - if not self.precpred(self._ctx, 6): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") - self.state = 2652 - self.match(SqlBaseParser.T__4) - self.state = 2653 - localctx.fieldName = self.identifier() - pass - - - self.state = 2658 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,339,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - class ConstantContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_constant - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class NullLiteralContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNullLiteral" ): - listener.enterNullLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNullLiteral" ): - listener.exitNullLiteral(self) - - - class StringLiteralContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def STRING(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.STRING) - else: - return self.getToken(SqlBaseParser.STRING, i) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStringLiteral" ): - listener.enterStringLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStringLiteral" ): - listener.exitStringLiteral(self) - - - class TypeConstructorContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTypeConstructor" ): - listener.enterTypeConstructor(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTypeConstructor" ): - listener.exitTypeConstructor(self) - - - class IntervalLiteralContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def interval(self): - return self.getTypedRuleContext(SqlBaseParser.IntervalContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIntervalLiteral" ): - listener.enterIntervalLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIntervalLiteral" ): - listener.exitIntervalLiteral(self) - - - class NumericLiteralContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def number(self): - return self.getTypedRuleContext(SqlBaseParser.NumberContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNumericLiteral" ): - listener.enterNumericLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNumericLiteral" ): - listener.exitNumericLiteral(self) - - - class BooleanLiteralContext(ConstantContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ConstantContext - super().__init__(parser) - self.copyFrom(ctx) - - def booleanValue(self): - return self.getTypedRuleContext(SqlBaseParser.BooleanValueContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterBooleanLiteral" ): - listener.enterBooleanLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitBooleanLiteral" ): - listener.exitBooleanLiteral(self) - - - - def constant(self): - - localctx = SqlBaseParser.ConstantContext(self, self._ctx, self.state) - self.enterRule(localctx, 196, self.RULE_constant) - try: - self.state = 2671 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,341,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.NullLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2659 - self.match(SqlBaseParser.NULL) - pass - - elif la_ == 2: - localctx = SqlBaseParser.IntervalLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2660 - self.interval() - pass - - elif la_ == 3: - localctx = SqlBaseParser.TypeConstructorContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2661 - self.identifier() - self.state = 2662 - self.match(SqlBaseParser.STRING) - pass - - elif la_ == 4: - localctx = SqlBaseParser.NumericLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2664 - self.number() - pass - - elif la_ == 5: - localctx = SqlBaseParser.BooleanLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 2665 - self.booleanValue() - pass - - elif la_ == 6: - localctx = SqlBaseParser.StringLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 6) - self.state = 2667 - self._errHandler.sync(self) - _alt = 1 - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt == 1: - self.state = 2666 - self.match(SqlBaseParser.STRING) - - else: - raise NoViableAltException(self) - self.state = 2669 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,340,self._ctx) - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ComparisonOperatorContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def EQ(self): - return self.getToken(SqlBaseParser.EQ, 0) - - def NEQ(self): - return self.getToken(SqlBaseParser.NEQ, 0) - - def NEQJ(self): - return self.getToken(SqlBaseParser.NEQJ, 0) - - def LT(self): - return self.getToken(SqlBaseParser.LT, 0) - - def LTE(self): - return self.getToken(SqlBaseParser.LTE, 0) - - def GT(self): - return self.getToken(SqlBaseParser.GT, 0) - - def GTE(self): - return self.getToken(SqlBaseParser.GTE, 0) - - def NSEQ(self): - return self.getToken(SqlBaseParser.NSEQ, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_comparisonOperator - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterComparisonOperator" ): - listener.enterComparisonOperator(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitComparisonOperator" ): - listener.exitComparisonOperator(self) - - - - - def comparisonOperator(self): - - localctx = SqlBaseParser.ComparisonOperatorContext(self, self._ctx, self.state) - self.enterRule(localctx, 198, self.RULE_comparisonOperator) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2673 - _la = self._input.LA(1) - if not(((((_la - 264)) & ~0x3f) == 0 and ((1 << (_la - 264)) & ((1 << (SqlBaseParser.EQ - 264)) | (1 << (SqlBaseParser.NSEQ - 264)) | (1 << (SqlBaseParser.NEQ - 264)) | (1 << (SqlBaseParser.NEQJ - 264)) | (1 << (SqlBaseParser.LT - 264)) | (1 << (SqlBaseParser.LTE - 264)) | (1 << (SqlBaseParser.GT - 264)) | (1 << (SqlBaseParser.GTE - 264)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ArithmeticOperatorContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def PLUS(self): - return self.getToken(SqlBaseParser.PLUS, 0) - - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def ASTERISK(self): - return self.getToken(SqlBaseParser.ASTERISK, 0) - - def SLASH(self): - return self.getToken(SqlBaseParser.SLASH, 0) - - def PERCENT(self): - return self.getToken(SqlBaseParser.PERCENT, 0) - - def DIV(self): - return self.getToken(SqlBaseParser.DIV, 0) - - def TILDE(self): - return self.getToken(SqlBaseParser.TILDE, 0) - - def AMPERSAND(self): - return self.getToken(SqlBaseParser.AMPERSAND, 0) - - def PIPE(self): - return self.getToken(SqlBaseParser.PIPE, 0) - - def CONCAT_PIPE(self): - return self.getToken(SqlBaseParser.CONCAT_PIPE, 0) - - def HAT(self): - return self.getToken(SqlBaseParser.HAT, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_arithmeticOperator - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterArithmeticOperator" ): - listener.enterArithmeticOperator(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitArithmeticOperator" ): - listener.exitArithmeticOperator(self) - - - - - def arithmeticOperator(self): - - localctx = SqlBaseParser.ArithmeticOperatorContext(self, self._ctx, self.state) - self.enterRule(localctx, 200, self.RULE_arithmeticOperator) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2675 - _la = self._input.LA(1) - if not(((((_la - 272)) & ~0x3f) == 0 and ((1 << (_la - 272)) & ((1 << (SqlBaseParser.PLUS - 272)) | (1 << (SqlBaseParser.MINUS - 272)) | (1 << (SqlBaseParser.ASTERISK - 272)) | (1 << (SqlBaseParser.SLASH - 272)) | (1 << (SqlBaseParser.PERCENT - 272)) | (1 << (SqlBaseParser.DIV - 272)) | (1 << (SqlBaseParser.TILDE - 272)) | (1 << (SqlBaseParser.AMPERSAND - 272)) | (1 << (SqlBaseParser.PIPE - 272)) | (1 << (SqlBaseParser.CONCAT_PIPE - 272)) | (1 << (SqlBaseParser.HAT - 272)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class PredicateOperatorContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_predicateOperator - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPredicateOperator" ): - listener.enterPredicateOperator(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPredicateOperator" ): - listener.exitPredicateOperator(self) - - - - - def predicateOperator(self): - - localctx = SqlBaseParser.PredicateOperatorContext(self, self._ctx, self.state) - self.enterRule(localctx, 202, self.RULE_predicateOperator) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2677 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.AND or ((((_la - 113)) & ~0x3f) == 0 and ((1 << (_la - 113)) & ((1 << (SqlBaseParser.IN - 113)) | (1 << (SqlBaseParser.NOT - 113)) | (1 << (SqlBaseParser.OR - 113)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class BooleanValueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def TRUE(self): - return self.getToken(SqlBaseParser.TRUE, 0) - - def FALSE(self): - return self.getToken(SqlBaseParser.FALSE, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_booleanValue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterBooleanValue" ): - listener.enterBooleanValue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitBooleanValue" ): - listener.exitBooleanValue(self) - - - - - def booleanValue(self): - - localctx = SqlBaseParser.BooleanValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 204, self.RULE_booleanValue) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2679 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FALSE or _la==SqlBaseParser.TRUE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IntervalContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def INTERVAL(self): - return self.getToken(SqlBaseParser.INTERVAL, 0) - - def errorCapturingMultiUnitsInterval(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext,0) - - - def errorCapturingUnitToUnitInterval(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_interval - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInterval" ): - listener.enterInterval(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInterval" ): - listener.exitInterval(self) - - - - - def interval(self): - - localctx = SqlBaseParser.IntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 206, self.RULE_interval) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2681 - self.match(SqlBaseParser.INTERVAL) - self.state = 2684 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,342,self._ctx) - if la_ == 1: - self.state = 2682 - self.errorCapturingMultiUnitsInterval() - - elif la_ == 2: - self.state = 2683 - self.errorCapturingUnitToUnitInterval() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ErrorCapturingMultiUnitsIntervalContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def multiUnitsInterval(self): - return self.getTypedRuleContext(SqlBaseParser.MultiUnitsIntervalContext,0) - - - def unitToUnitInterval(self): - return self.getTypedRuleContext(SqlBaseParser.UnitToUnitIntervalContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_errorCapturingMultiUnitsInterval - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterErrorCapturingMultiUnitsInterval" ): - listener.enterErrorCapturingMultiUnitsInterval(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitErrorCapturingMultiUnitsInterval" ): - listener.exitErrorCapturingMultiUnitsInterval(self) - - - - - def errorCapturingMultiUnitsInterval(self): - - localctx = SqlBaseParser.ErrorCapturingMultiUnitsIntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 208, self.RULE_errorCapturingMultiUnitsInterval) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2686 - self.multiUnitsInterval() - self.state = 2688 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,343,self._ctx) - if la_ == 1: - self.state = 2687 - self.unitToUnitInterval() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class MultiUnitsIntervalContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def intervalValue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IntervalValueContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IntervalValueContext,i) - - - def intervalUnit(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IntervalUnitContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IntervalUnitContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_multiUnitsInterval - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMultiUnitsInterval" ): - listener.enterMultiUnitsInterval(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMultiUnitsInterval" ): - listener.exitMultiUnitsInterval(self) - - - - - def multiUnitsInterval(self): - - localctx = SqlBaseParser.MultiUnitsIntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 210, self.RULE_multiUnitsInterval) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2693 - self._errHandler.sync(self) - _alt = 1 - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt == 1: - self.state = 2690 - self.intervalValue() - self.state = 2691 - self.intervalUnit() - - else: - raise NoViableAltException(self) - self.state = 2695 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,344,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ErrorCapturingUnitToUnitIntervalContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.body = None # UnitToUnitIntervalContext - self.error1 = None # MultiUnitsIntervalContext - self.error2 = None # UnitToUnitIntervalContext - - def unitToUnitInterval(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.UnitToUnitIntervalContext) - else: - return self.getTypedRuleContext(SqlBaseParser.UnitToUnitIntervalContext,i) - - - def multiUnitsInterval(self): - return self.getTypedRuleContext(SqlBaseParser.MultiUnitsIntervalContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_errorCapturingUnitToUnitInterval - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterErrorCapturingUnitToUnitInterval" ): - listener.enterErrorCapturingUnitToUnitInterval(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitErrorCapturingUnitToUnitInterval" ): - listener.exitErrorCapturingUnitToUnitInterval(self) - - - - - def errorCapturingUnitToUnitInterval(self): - - localctx = SqlBaseParser.ErrorCapturingUnitToUnitIntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 212, self.RULE_errorCapturingUnitToUnitInterval) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2697 - localctx.body = self.unitToUnitInterval() - self.state = 2700 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,345,self._ctx) - if la_ == 1: - self.state = 2698 - localctx.error1 = self.multiUnitsInterval() - - elif la_ == 2: - self.state = 2699 - localctx.error2 = self.unitToUnitInterval() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class UnitToUnitIntervalContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.value = None # IntervalValueContext - self.from_ = None # IntervalUnitContext - self.to = None # IntervalUnitContext - - def TO(self): - return self.getToken(SqlBaseParser.TO, 0) - - def intervalValue(self): - return self.getTypedRuleContext(SqlBaseParser.IntervalValueContext,0) - - - def intervalUnit(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IntervalUnitContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IntervalUnitContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_unitToUnitInterval - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnitToUnitInterval" ): - listener.enterUnitToUnitInterval(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnitToUnitInterval" ): - listener.exitUnitToUnitInterval(self) - - - - - def unitToUnitInterval(self): - - localctx = SqlBaseParser.UnitToUnitIntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 214, self.RULE_unitToUnitInterval) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2702 - localctx.value = self.intervalValue() - self.state = 2703 - localctx.from_ = self.intervalUnit() - self.state = 2704 - self.match(SqlBaseParser.TO) - self.state = 2705 - localctx.to = self.intervalUnit() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IntervalValueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def INTEGER_VALUE(self): - return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) - - def DECIMAL_VALUE(self): - return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) - - def PLUS(self): - return self.getToken(SqlBaseParser.PLUS, 0) - - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def STRING(self): - return self.getToken(SqlBaseParser.STRING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_intervalValue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIntervalValue" ): - listener.enterIntervalValue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIntervalValue" ): - listener.exitIntervalValue(self) - - - - - def intervalValue(self): - - localctx = SqlBaseParser.IntervalValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 216, self.RULE_intervalValue) - self._la = 0 # Token type - try: - self.state = 2712 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.PLUS, SqlBaseParser.MINUS, SqlBaseParser.INTEGER_VALUE, SqlBaseParser.DECIMAL_VALUE]: - self.enterOuterAlt(localctx, 1) - self.state = 2708 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.PLUS or _la==SqlBaseParser.MINUS: - self.state = 2707 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.PLUS or _la==SqlBaseParser.MINUS): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 2710 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.INTEGER_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - elif token in [SqlBaseParser.STRING]: - self.enterOuterAlt(localctx, 2) - self.state = 2711 - self.match(SqlBaseParser.STRING) - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IntervalUnitContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def DAY(self): - return self.getToken(SqlBaseParser.DAY, 0) - - def HOUR(self): - return self.getToken(SqlBaseParser.HOUR, 0) - - def MINUTE(self): - return self.getToken(SqlBaseParser.MINUTE, 0) - - def MONTH(self): - return self.getToken(SqlBaseParser.MONTH, 0) - - def SECOND(self): - return self.getToken(SqlBaseParser.SECOND, 0) - - def YEAR(self): - return self.getToken(SqlBaseParser.YEAR, 0) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_intervalUnit - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIntervalUnit" ): - listener.enterIntervalUnit(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIntervalUnit" ): - listener.exitIntervalUnit(self) - - - - - def intervalUnit(self): - - localctx = SqlBaseParser.IntervalUnitContext(self, self._ctx, self.state) - self.enterRule(localctx, 218, self.RULE_intervalUnit) - try: - self.state = 2721 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,348,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2714 - self.match(SqlBaseParser.DAY) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2715 - self.match(SqlBaseParser.HOUR) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2716 - self.match(SqlBaseParser.MINUTE) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 2717 - self.match(SqlBaseParser.MONTH) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 2718 - self.match(SqlBaseParser.SECOND) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 2719 - self.match(SqlBaseParser.YEAR) - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 2720 - self.identifier() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ColPositionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.position = None # Token - self.afterCol = None # ErrorCapturingIdentifierContext - - def FIRST(self): - return self.getToken(SqlBaseParser.FIRST, 0) - - def AFTER(self): - return self.getToken(SqlBaseParser.AFTER, 0) - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_colPosition - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterColPosition" ): - listener.enterColPosition(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitColPosition" ): - listener.exitColPosition(self) - - - - - def colPosition(self): - - localctx = SqlBaseParser.ColPositionContext(self, self._ctx, self.state) - self.enterRule(localctx, 220, self.RULE_colPosition) - try: - self.state = 2726 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.FIRST]: - self.enterOuterAlt(localctx, 1) - self.state = 2723 - localctx.position = self.match(SqlBaseParser.FIRST) - pass - elif token in [SqlBaseParser.AFTER]: - self.enterOuterAlt(localctx, 2) - self.state = 2724 - localctx.position = self.match(SqlBaseParser.AFTER) - self.state = 2725 - localctx.afterCol = self.errorCapturingIdentifier() - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class DataTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_dataType - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class ComplexDataTypeContext(DataTypeContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DataTypeContext - super().__init__(parser) - self.complex = None # Token - self.copyFrom(ctx) - - def dataType(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.DataTypeContext) - else: - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,i) - - def ARRAY(self): - return self.getToken(SqlBaseParser.ARRAY, 0) - def MAP(self): - return self.getToken(SqlBaseParser.MAP, 0) - def STRUCT(self): - return self.getToken(SqlBaseParser.STRUCT, 0) - def NEQ(self): - return self.getToken(SqlBaseParser.NEQ, 0) - def complexColTypeList(self): - return self.getTypedRuleContext(SqlBaseParser.ComplexColTypeListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterComplexDataType" ): - listener.enterComplexDataType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitComplexDataType" ): - listener.exitComplexDataType(self) - - - class PrimitiveDataTypeContext(DataTypeContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.DataTypeContext - super().__init__(parser) - self.copyFrom(ctx) - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - def INTEGER_VALUE(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.INTEGER_VALUE) - else: - return self.getToken(SqlBaseParser.INTEGER_VALUE, i) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPrimitiveDataType" ): - listener.enterPrimitiveDataType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPrimitiveDataType" ): - listener.exitPrimitiveDataType(self) - - - - def dataType(self): - - localctx = SqlBaseParser.DataTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 222, self.RULE_dataType) - self._la = 0 # Token type - try: - self.state = 2762 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,354,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2728 - localctx.complex = self.match(SqlBaseParser.ARRAY) - self.state = 2729 - self.match(SqlBaseParser.LT) - self.state = 2730 - self.dataType() - self.state = 2731 - self.match(SqlBaseParser.GT) - pass - - elif la_ == 2: - localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2733 - localctx.complex = self.match(SqlBaseParser.MAP) - self.state = 2734 - self.match(SqlBaseParser.LT) - self.state = 2735 - self.dataType() - self.state = 2736 - self.match(SqlBaseParser.T__3) - self.state = 2737 - self.dataType() - self.state = 2738 - self.match(SqlBaseParser.GT) - pass - - elif la_ == 3: - localctx = SqlBaseParser.ComplexDataTypeContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2740 - localctx.complex = self.match(SqlBaseParser.STRUCT) - self.state = 2747 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.LT]: - self.state = 2741 - self.match(SqlBaseParser.LT) - self.state = 2743 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,350,self._ctx) - if la_ == 1: - self.state = 2742 - self.complexColTypeList() - - - self.state = 2745 - self.match(SqlBaseParser.GT) - pass - elif token in [SqlBaseParser.NEQ]: - self.state = 2746 - self.match(SqlBaseParser.NEQ) - pass - else: - raise NoViableAltException(self) - - pass - - elif la_ == 4: - localctx = SqlBaseParser.PrimitiveDataTypeContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2749 - self.identifier() - self.state = 2760 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,353,self._ctx) - if la_ == 1: - self.state = 2750 - self.match(SqlBaseParser.T__1) - self.state = 2751 - self.match(SqlBaseParser.INTEGER_VALUE) - self.state = 2756 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2752 - self.match(SqlBaseParser.T__3) - self.state = 2753 - self.match(SqlBaseParser.INTEGER_VALUE) - self.state = 2758 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 2759 - self.match(SqlBaseParser.T__2) - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QualifiedColTypeWithPositionListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def qualifiedColTypeWithPosition(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.QualifiedColTypeWithPositionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.QualifiedColTypeWithPositionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_qualifiedColTypeWithPositionList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQualifiedColTypeWithPositionList" ): - listener.enterQualifiedColTypeWithPositionList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQualifiedColTypeWithPositionList" ): - listener.exitQualifiedColTypeWithPositionList(self) - - - - - def qualifiedColTypeWithPositionList(self): - - localctx = SqlBaseParser.QualifiedColTypeWithPositionListContext(self, self._ctx, self.state) - self.enterRule(localctx, 224, self.RULE_qualifiedColTypeWithPositionList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2764 - self.qualifiedColTypeWithPosition() - self.state = 2769 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2765 - self.match(SqlBaseParser.T__3) - self.state = 2766 - self.qualifiedColTypeWithPosition() - self.state = 2771 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QualifiedColTypeWithPositionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # MultipartIdentifierContext - - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def multipartIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.MultipartIdentifierContext,0) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def commentSpec(self): - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) - - - def colPosition(self): - return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_qualifiedColTypeWithPosition - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQualifiedColTypeWithPosition" ): - listener.enterQualifiedColTypeWithPosition(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQualifiedColTypeWithPosition" ): - listener.exitQualifiedColTypeWithPosition(self) - - - - - def qualifiedColTypeWithPosition(self): - - localctx = SqlBaseParser.QualifiedColTypeWithPositionContext(self, self._ctx, self.state) - self.enterRule(localctx, 226, self.RULE_qualifiedColTypeWithPosition) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2772 - localctx.name = self.multipartIdentifier() - self.state = 2773 - self.dataType() - self.state = 2776 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2774 - self.match(SqlBaseParser.NOT) - self.state = 2775 - self.match(SqlBaseParser.NULL) - - - self.state = 2779 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.COMMENT: - self.state = 2778 - self.commentSpec() - - - self.state = 2782 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.AFTER or _la==SqlBaseParser.FIRST: - self.state = 2781 - self.colPosition() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ColTypeListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def colType(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ColTypeContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ColTypeContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_colTypeList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterColTypeList" ): - listener.enterColTypeList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitColTypeList" ): - listener.exitColTypeList(self) - - - - - def colTypeList(self): - - localctx = SqlBaseParser.ColTypeListContext(self, self._ctx, self.state) - self.enterRule(localctx, 228, self.RULE_colTypeList) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2784 - self.colType() - self.state = 2789 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,359,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2785 - self.match(SqlBaseParser.T__3) - self.state = 2786 - self.colType() - self.state = 2791 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,359,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ColTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.colName = None # ErrorCapturingIdentifierContext - - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def commentSpec(self): - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_colType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterColType" ): - listener.enterColType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitColType" ): - listener.exitColType(self) - - - - - def colType(self): - - localctx = SqlBaseParser.ColTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 230, self.RULE_colType) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2792 - localctx.colName = self.errorCapturingIdentifier() - self.state = 2793 - self.dataType() - self.state = 2796 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,360,self._ctx) - if la_ == 1: - self.state = 2794 - self.match(SqlBaseParser.NOT) - self.state = 2795 - self.match(SqlBaseParser.NULL) - - - self.state = 2799 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,361,self._ctx) - if la_ == 1: - self.state = 2798 - self.commentSpec() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ComplexColTypeListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def complexColType(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ComplexColTypeContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ComplexColTypeContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_complexColTypeList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterComplexColTypeList" ): - listener.enterComplexColTypeList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitComplexColTypeList" ): - listener.exitComplexColTypeList(self) - - - - - def complexColTypeList(self): - - localctx = SqlBaseParser.ComplexColTypeListContext(self, self._ctx, self.state) - self.enterRule(localctx, 232, self.RULE_complexColTypeList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2801 - self.complexColType() - self.state = 2806 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2802 - self.match(SqlBaseParser.T__3) - self.state = 2803 - self.complexColType() - self.state = 2808 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ComplexColTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def commentSpec(self): - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_complexColType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterComplexColType" ): - listener.enterComplexColType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitComplexColType" ): - listener.exitComplexColType(self) - - - - - def complexColType(self): - - localctx = SqlBaseParser.ComplexColTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 234, self.RULE_complexColType) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2809 - self.identifier() - self.state = 2810 - self.match(SqlBaseParser.T__10) - self.state = 2811 - self.dataType() - self.state = 2814 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.NOT: - self.state = 2812 - self.match(SqlBaseParser.NOT) - self.state = 2813 - self.match(SqlBaseParser.NULL) - - - self.state = 2817 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.COMMENT: - self.state = 2816 - self.commentSpec() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class WhenClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.condition = None # ExpressionContext - self.result = None # ExpressionContext - - def WHEN(self): - return self.getToken(SqlBaseParser.WHEN, 0) - - def THEN(self): - return self.getToken(SqlBaseParser.THEN, 0) - - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_whenClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWhenClause" ): - listener.enterWhenClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWhenClause" ): - listener.exitWhenClause(self) - - - - - def whenClause(self): - - localctx = SqlBaseParser.WhenClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 236, self.RULE_whenClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2819 - self.match(SqlBaseParser.WHEN) - self.state = 2820 - localctx.condition = self.expression() - self.state = 2821 - self.match(SqlBaseParser.THEN) - self.state = 2822 - localctx.result = self.expression() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class WindowClauseContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def WINDOW(self): - return self.getToken(SqlBaseParser.WINDOW, 0) - - def namedWindow(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.NamedWindowContext) - else: - return self.getTypedRuleContext(SqlBaseParser.NamedWindowContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_windowClause - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWindowClause" ): - listener.enterWindowClause(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWindowClause" ): - listener.exitWindowClause(self) - - - - - def windowClause(self): - - localctx = SqlBaseParser.WindowClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 238, self.RULE_windowClause) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2824 - self.match(SqlBaseParser.WINDOW) - self.state = 2825 - self.namedWindow() - self.state = 2830 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,365,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2826 - self.match(SqlBaseParser.T__3) - self.state = 2827 - self.namedWindow() - self.state = 2832 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,365,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NamedWindowContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # ErrorCapturingIdentifierContext - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def windowSpec(self): - return self.getTypedRuleContext(SqlBaseParser.WindowSpecContext,0) - - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_namedWindow - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedWindow" ): - listener.enterNamedWindow(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedWindow" ): - listener.exitNamedWindow(self) - - - - - def namedWindow(self): - - localctx = SqlBaseParser.NamedWindowContext(self, self._ctx, self.state) - self.enterRule(localctx, 240, self.RULE_namedWindow) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2833 - localctx.name = self.errorCapturingIdentifier() - self.state = 2834 - self.match(SqlBaseParser.AS) - self.state = 2835 - self.windowSpec() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class WindowSpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_windowSpec - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class WindowRefContext(WindowSpecContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.WindowSpecContext - super().__init__(parser) - self.name = None # ErrorCapturingIdentifierContext - self.copyFrom(ctx) - - def errorCapturingIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWindowRef" ): - listener.enterWindowRef(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWindowRef" ): - listener.exitWindowRef(self) - - - class WindowDefContext(WindowSpecContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.WindowSpecContext - super().__init__(parser) - self._expression = None # ExpressionContext - self.partition = list() # of ExpressionContexts - self.copyFrom(ctx) - - def CLUSTER(self): - return self.getToken(SqlBaseParser.CLUSTER, 0) - def BY(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.BY) - else: - return self.getToken(SqlBaseParser.BY, i) - def expression(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.ExpressionContext) - else: - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,i) - - def windowFrame(self): - return self.getTypedRuleContext(SqlBaseParser.WindowFrameContext,0) - - def sortItem(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.SortItemContext) - else: - return self.getTypedRuleContext(SqlBaseParser.SortItemContext,i) - - def PARTITION(self): - return self.getToken(SqlBaseParser.PARTITION, 0) - def DISTRIBUTE(self): - return self.getToken(SqlBaseParser.DISTRIBUTE, 0) - def ORDER(self): - return self.getToken(SqlBaseParser.ORDER, 0) - def SORT(self): - return self.getToken(SqlBaseParser.SORT, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWindowDef" ): - listener.enterWindowDef(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWindowDef" ): - listener.exitWindowDef(self) - - - - def windowSpec(self): - - localctx = SqlBaseParser.WindowSpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 242, self.RULE_windowSpec) - self._la = 0 # Token type - try: - self.state = 2883 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,373,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.WindowRefContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2837 - localctx.name = self.errorCapturingIdentifier() - pass - - elif la_ == 2: - localctx = SqlBaseParser.WindowRefContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2838 - self.match(SqlBaseParser.T__1) - self.state = 2839 - localctx.name = self.errorCapturingIdentifier() - self.state = 2840 - self.match(SqlBaseParser.T__2) - pass - - elif la_ == 3: - localctx = SqlBaseParser.WindowDefContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2842 - self.match(SqlBaseParser.T__1) - self.state = 2877 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.CLUSTER]: - self.state = 2843 - self.match(SqlBaseParser.CLUSTER) - self.state = 2844 - self.match(SqlBaseParser.BY) - self.state = 2845 - localctx._expression = self.expression() - localctx.partition.append(localctx._expression) - self.state = 2850 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2846 - self.match(SqlBaseParser.T__3) - self.state = 2847 - localctx._expression = self.expression() - localctx.partition.append(localctx._expression) - self.state = 2852 - self._errHandler.sync(self) - _la = self._input.LA(1) - - pass - elif token in [SqlBaseParser.T__2, SqlBaseParser.DISTRIBUTE, SqlBaseParser.ORDER, SqlBaseParser.PARTITION, SqlBaseParser.RANGE, SqlBaseParser.ROWS, SqlBaseParser.SORT]: - self.state = 2863 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.DISTRIBUTE or _la==SqlBaseParser.PARTITION: - self.state = 2853 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DISTRIBUTE or _la==SqlBaseParser.PARTITION): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2854 - self.match(SqlBaseParser.BY) - self.state = 2855 - localctx._expression = self.expression() - localctx.partition.append(localctx._expression) - self.state = 2860 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2856 - self.match(SqlBaseParser.T__3) - self.state = 2857 - localctx._expression = self.expression() - localctx.partition.append(localctx._expression) - self.state = 2862 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 2875 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.ORDER or _la==SqlBaseParser.SORT: - self.state = 2865 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.ORDER or _la==SqlBaseParser.SORT): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 2866 - self.match(SqlBaseParser.BY) - self.state = 2867 - self.sortItem() - self.state = 2872 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2868 - self.match(SqlBaseParser.T__3) - self.state = 2869 - self.sortItem() - self.state = 2874 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - pass - else: - raise NoViableAltException(self) - - self.state = 2880 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.RANGE or _la==SqlBaseParser.ROWS: - self.state = 2879 - self.windowFrame() - - - self.state = 2882 - self.match(SqlBaseParser.T__2) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class WindowFrameContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.frameType = None # Token - self.start = None # FrameBoundContext - self.end = None # FrameBoundContext - - def RANGE(self): - return self.getToken(SqlBaseParser.RANGE, 0) - - def frameBound(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.FrameBoundContext) - else: - return self.getTypedRuleContext(SqlBaseParser.FrameBoundContext,i) - - - def ROWS(self): - return self.getToken(SqlBaseParser.ROWS, 0) - - def BETWEEN(self): - return self.getToken(SqlBaseParser.BETWEEN, 0) - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_windowFrame - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterWindowFrame" ): - listener.enterWindowFrame(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitWindowFrame" ): - listener.exitWindowFrame(self) - - - - - def windowFrame(self): - - localctx = SqlBaseParser.WindowFrameContext(self, self._ctx, self.state) - self.enterRule(localctx, 244, self.RULE_windowFrame) - try: - self.state = 2901 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,374,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2885 - localctx.frameType = self.match(SqlBaseParser.RANGE) - self.state = 2886 - localctx.start = self.frameBound() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2887 - localctx.frameType = self.match(SqlBaseParser.ROWS) - self.state = 2888 - localctx.start = self.frameBound() - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2889 - localctx.frameType = self.match(SqlBaseParser.RANGE) - self.state = 2890 - self.match(SqlBaseParser.BETWEEN) - self.state = 2891 - localctx.start = self.frameBound() - self.state = 2892 - self.match(SqlBaseParser.AND) - self.state = 2893 - localctx.end = self.frameBound() - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 2895 - localctx.frameType = self.match(SqlBaseParser.ROWS) - self.state = 2896 - self.match(SqlBaseParser.BETWEEN) - self.state = 2897 - localctx.start = self.frameBound() - self.state = 2898 - self.match(SqlBaseParser.AND) - self.state = 2899 - localctx.end = self.frameBound() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FrameBoundContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.boundType = None # Token - - def UNBOUNDED(self): - return self.getToken(SqlBaseParser.UNBOUNDED, 0) - - def PRECEDING(self): - return self.getToken(SqlBaseParser.PRECEDING, 0) - - def FOLLOWING(self): - return self.getToken(SqlBaseParser.FOLLOWING, 0) - - def ROW(self): - return self.getToken(SqlBaseParser.ROW, 0) - - def CURRENT(self): - return self.getToken(SqlBaseParser.CURRENT, 0) - - def expression(self): - return self.getTypedRuleContext(SqlBaseParser.ExpressionContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_frameBound - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFrameBound" ): - listener.enterFrameBound(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFrameBound" ): - listener.exitFrameBound(self) - - - - - def frameBound(self): - - localctx = SqlBaseParser.FrameBoundContext(self, self._ctx, self.state) - self.enterRule(localctx, 246, self.RULE_frameBound) - self._la = 0 # Token type - try: - self.state = 2910 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,375,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2903 - self.match(SqlBaseParser.UNBOUNDED) - self.state = 2904 - localctx.boundType = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FOLLOWING or _la==SqlBaseParser.PRECEDING): - localctx.boundType = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2905 - localctx.boundType = self.match(SqlBaseParser.CURRENT) - self.state = 2906 - self.match(SqlBaseParser.ROW) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2907 - self.expression() - self.state = 2908 - localctx.boundType = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.FOLLOWING or _la==SqlBaseParser.PRECEDING): - localctx.boundType = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QualifiedNameListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def qualifiedName(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.QualifiedNameContext) - else: - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_qualifiedNameList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQualifiedNameList" ): - listener.enterQualifiedNameList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQualifiedNameList" ): - listener.exitQualifiedNameList(self) - - - - - def qualifiedNameList(self): - - localctx = SqlBaseParser.QualifiedNameListContext(self, self._ctx, self.state) - self.enterRule(localctx, 248, self.RULE_qualifiedNameList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 2912 - self.qualifiedName() - self.state = 2917 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==SqlBaseParser.T__3: - self.state = 2913 - self.match(SqlBaseParser.T__3) - self.state = 2914 - self.qualifiedName() - self.state = 2919 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class FunctionNameContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def qualifiedName(self): - return self.getTypedRuleContext(SqlBaseParser.QualifiedNameContext,0) - - - def FILTER(self): - return self.getToken(SqlBaseParser.FILTER, 0) - - def LEFT(self): - return self.getToken(SqlBaseParser.LEFT, 0) - - def RIGHT(self): - return self.getToken(SqlBaseParser.RIGHT, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_functionName - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionName" ): - listener.enterFunctionName(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionName" ): - listener.exitFunctionName(self) - - - - - def functionName(self): - - localctx = SqlBaseParser.FunctionNameContext(self, self._ctx, self.state) - self.enterRule(localctx, 250, self.RULE_functionName) - try: - self.state = 2924 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,377,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2920 - self.qualifiedName() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2921 - self.match(SqlBaseParser.FILTER) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 2922 - self.match(SqlBaseParser.LEFT) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 2923 - self.match(SqlBaseParser.RIGHT) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QualifiedNameContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_qualifiedName - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQualifiedName" ): - listener.enterQualifiedName(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQualifiedName" ): - listener.exitQualifiedName(self) - - - - - def qualifiedName(self): - - localctx = SqlBaseParser.QualifiedNameContext(self, self._ctx, self.state) - self.enterRule(localctx, 252, self.RULE_qualifiedName) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2926 - self.identifier() - self.state = 2931 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,378,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 2927 - self.match(SqlBaseParser.T__4) - self.state = 2928 - self.identifier() - self.state = 2933 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,378,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ErrorCapturingIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def identifier(self): - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,0) - - - def errorCapturingIdentifierExtra(self): - return self.getTypedRuleContext(SqlBaseParser.ErrorCapturingIdentifierExtraContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_errorCapturingIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterErrorCapturingIdentifier" ): - listener.enterErrorCapturingIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitErrorCapturingIdentifier" ): - listener.exitErrorCapturingIdentifier(self) - - - - - def errorCapturingIdentifier(self): - - localctx = SqlBaseParser.ErrorCapturingIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 254, self.RULE_errorCapturingIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2934 - self.identifier() - self.state = 2935 - self.errorCapturingIdentifierExtra() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class ErrorCapturingIdentifierExtraContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_errorCapturingIdentifierExtra - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class ErrorIdentContext(ErrorCapturingIdentifierExtraContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ErrorCapturingIdentifierExtraContext - super().__init__(parser) - self.copyFrom(ctx) - - def MINUS(self, i:int=None): - if i is None: - return self.getTokens(SqlBaseParser.MINUS) - else: - return self.getToken(SqlBaseParser.MINUS, i) - def identifier(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(SqlBaseParser.IdentifierContext) - else: - return self.getTypedRuleContext(SqlBaseParser.IdentifierContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterErrorIdent" ): - listener.enterErrorIdent(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitErrorIdent" ): - listener.exitErrorIdent(self) - - - class RealIdentContext(ErrorCapturingIdentifierExtraContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.ErrorCapturingIdentifierExtraContext - super().__init__(parser) - self.copyFrom(ctx) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRealIdent" ): - listener.enterRealIdent(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRealIdent" ): - listener.exitRealIdent(self) - - - - def errorCapturingIdentifierExtra(self): - - localctx = SqlBaseParser.ErrorCapturingIdentifierExtraContext(self, self._ctx, self.state) - self.enterRule(localctx, 256, self.RULE_errorCapturingIdentifierExtra) - try: - self.state = 2944 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,380,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.ErrorIdentContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2939 - self._errHandler.sync(self) - _alt = 1 - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt == 1: - self.state = 2937 - self.match(SqlBaseParser.MINUS) - self.state = 2938 - self.identifier() - - else: - raise NoViableAltException(self) - self.state = 2941 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,379,self._ctx) - - pass - - elif la_ == 2: - localctx = SqlBaseParser.RealIdentContext(self, localctx) - self.enterOuterAlt(localctx, 2) - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class IdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def strictIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.StrictIdentifierContext,0) - - - def strictNonReserved(self): - return self.getTypedRuleContext(SqlBaseParser.StrictNonReservedContext,0) - - - def getRuleIndex(self): - return SqlBaseParser.RULE_identifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdentifier" ): - listener.enterIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdentifier" ): - listener.exitIdentifier(self) - - - - - def identifier(self): - - localctx = SqlBaseParser.IdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 258, self.RULE_identifier) - try: - self.state = 2949 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,381,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 2946 - self.strictIdentifier() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 2947 - if not not self.SQL_standard_keyword_behavior: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.SQL_standard_keyword_behavior") - self.state = 2948 - self.strictNonReserved() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class StrictIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_strictIdentifier - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class QuotedIdentifierAlternativeContext(StrictIdentifierContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StrictIdentifierContext - super().__init__(parser) - self.copyFrom(ctx) - - def quotedIdentifier(self): - return self.getTypedRuleContext(SqlBaseParser.QuotedIdentifierContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQuotedIdentifierAlternative" ): - listener.enterQuotedIdentifierAlternative(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQuotedIdentifierAlternative" ): - listener.exitQuotedIdentifierAlternative(self) - - - class UnquotedIdentifierContext(StrictIdentifierContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.StrictIdentifierContext - super().__init__(parser) - self.copyFrom(ctx) - - def IDENTIFIER(self): - return self.getToken(SqlBaseParser.IDENTIFIER, 0) - def ansiNonReserved(self): - return self.getTypedRuleContext(SqlBaseParser.AnsiNonReservedContext,0) - - def nonReserved(self): - return self.getTypedRuleContext(SqlBaseParser.NonReservedContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnquotedIdentifier" ): - listener.enterUnquotedIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnquotedIdentifier" ): - listener.exitUnquotedIdentifier(self) - - - - def strictIdentifier(self): - - localctx = SqlBaseParser.StrictIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 260, self.RULE_strictIdentifier) - try: - self.state = 2957 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,382,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2951 - self.match(SqlBaseParser.IDENTIFIER) - pass - - elif la_ == 2: - localctx = SqlBaseParser.QuotedIdentifierAlternativeContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2952 - self.quotedIdentifier() - pass - - elif la_ == 3: - localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2953 - if not self.SQL_standard_keyword_behavior: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.SQL_standard_keyword_behavior") - self.state = 2954 - self.ansiNonReserved() - pass - - elif la_ == 4: - localctx = SqlBaseParser.UnquotedIdentifierContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2955 - if not not self.SQL_standard_keyword_behavior: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.SQL_standard_keyword_behavior") - self.state = 2956 - self.nonReserved() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class QuotedIdentifierContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def BACKQUOTED_IDENTIFIER(self): - return self.getToken(SqlBaseParser.BACKQUOTED_IDENTIFIER, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_quotedIdentifier - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterQuotedIdentifier" ): - listener.enterQuotedIdentifier(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitQuotedIdentifier" ): - listener.exitQuotedIdentifier(self) - - - - - def quotedIdentifier(self): - - localctx = SqlBaseParser.QuotedIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 262, self.RULE_quotedIdentifier) - try: - self.enterOuterAlt(localctx, 1) - self.state = 2959 - self.match(SqlBaseParser.BACKQUOTED_IDENTIFIER) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NumberContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return SqlBaseParser.RULE_number - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class DecimalLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def DECIMAL_VALUE(self): - return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDecimalLiteral" ): - listener.enterDecimalLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDecimalLiteral" ): - listener.exitDecimalLiteral(self) - - - class BigIntLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def BIGINT_LITERAL(self): - return self.getToken(SqlBaseParser.BIGINT_LITERAL, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterBigIntLiteral" ): - listener.enterBigIntLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitBigIntLiteral" ): - listener.exitBigIntLiteral(self) - - - class TinyIntLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def TINYINT_LITERAL(self): - return self.getToken(SqlBaseParser.TINYINT_LITERAL, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterTinyIntLiteral" ): - listener.enterTinyIntLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitTinyIntLiteral" ): - listener.exitTinyIntLiteral(self) - - - class LegacyDecimalLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def EXPONENT_VALUE(self): - return self.getToken(SqlBaseParser.EXPONENT_VALUE, 0) - def DECIMAL_VALUE(self): - return self.getToken(SqlBaseParser.DECIMAL_VALUE, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLegacyDecimalLiteral" ): - listener.enterLegacyDecimalLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLegacyDecimalLiteral" ): - listener.exitLegacyDecimalLiteral(self) - - - class BigDecimalLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def BIGDECIMAL_LITERAL(self): - return self.getToken(SqlBaseParser.BIGDECIMAL_LITERAL, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterBigDecimalLiteral" ): - listener.enterBigDecimalLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitBigDecimalLiteral" ): - listener.exitBigDecimalLiteral(self) - - - class ExponentLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def EXPONENT_VALUE(self): - return self.getToken(SqlBaseParser.EXPONENT_VALUE, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExponentLiteral" ): - listener.enterExponentLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExponentLiteral" ): - listener.exitExponentLiteral(self) - - - class DoubleLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def DOUBLE_LITERAL(self): - return self.getToken(SqlBaseParser.DOUBLE_LITERAL, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDoubleLiteral" ): - listener.enterDoubleLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDoubleLiteral" ): - listener.exitDoubleLiteral(self) - - - class IntegerLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def INTEGER_VALUE(self): - return self.getToken(SqlBaseParser.INTEGER_VALUE, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIntegerLiteral" ): - listener.enterIntegerLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIntegerLiteral" ): - listener.exitIntegerLiteral(self) - - - class SmallIntLiteralContext(NumberContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a SqlBaseParser.NumberContext - super().__init__(parser) - self.copyFrom(ctx) - - def SMALLINT_LITERAL(self): - return self.getToken(SqlBaseParser.SMALLINT_LITERAL, 0) - def MINUS(self): - return self.getToken(SqlBaseParser.MINUS, 0) - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSmallIntLiteral" ): - listener.enterSmallIntLiteral(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSmallIntLiteral" ): - listener.exitSmallIntLiteral(self) - - - - def number(self): - - localctx = SqlBaseParser.NumberContext(self, self._ctx, self.state) - self.enterRule(localctx, 264, self.RULE_number) - self._la = 0 # Token type - try: - self.state = 3000 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,392,self._ctx) - if la_ == 1: - localctx = SqlBaseParser.ExponentLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 2961 - if not not self.legacy_exponent_literal_as_decimal_enabled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.legacy_exponent_literal_as_decimal_enabled") - self.state = 2963 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2962 - self.match(SqlBaseParser.MINUS) - - - self.state = 2965 - self.match(SqlBaseParser.EXPONENT_VALUE) - pass - - elif la_ == 2: - localctx = SqlBaseParser.DecimalLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 2) - self.state = 2966 - if not not self.legacy_exponent_literal_as_decimal_enabled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "not self.legacy_exponent_literal_as_decimal_enabled") - self.state = 2968 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2967 - self.match(SqlBaseParser.MINUS) - - - self.state = 2970 - self.match(SqlBaseParser.DECIMAL_VALUE) - pass - - elif la_ == 3: - localctx = SqlBaseParser.LegacyDecimalLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 2971 - if not self.legacy_exponent_literal_as_decimal_enabled: - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.legacy_exponent_literal_as_decimal_enabled") - self.state = 2973 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2972 - self.match(SqlBaseParser.MINUS) - - - self.state = 2975 - _la = self._input.LA(1) - if not(_la==SqlBaseParser.EXPONENT_VALUE or _la==SqlBaseParser.DECIMAL_VALUE): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - pass - - elif la_ == 4: - localctx = SqlBaseParser.IntegerLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 2977 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2976 - self.match(SqlBaseParser.MINUS) - - - self.state = 2979 - self.match(SqlBaseParser.INTEGER_VALUE) - pass - - elif la_ == 5: - localctx = SqlBaseParser.BigIntLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 2981 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2980 - self.match(SqlBaseParser.MINUS) - - - self.state = 2983 - self.match(SqlBaseParser.BIGINT_LITERAL) - pass - - elif la_ == 6: - localctx = SqlBaseParser.SmallIntLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 6) - self.state = 2985 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2984 - self.match(SqlBaseParser.MINUS) - - - self.state = 2987 - self.match(SqlBaseParser.SMALLINT_LITERAL) - pass - - elif la_ == 7: - localctx = SqlBaseParser.TinyIntLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 7) - self.state = 2989 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2988 - self.match(SqlBaseParser.MINUS) - - - self.state = 2991 - self.match(SqlBaseParser.TINYINT_LITERAL) - pass - - elif la_ == 8: - localctx = SqlBaseParser.DoubleLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 8) - self.state = 2993 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2992 - self.match(SqlBaseParser.MINUS) - - - self.state = 2995 - self.match(SqlBaseParser.DOUBLE_LITERAL) - pass - - elif la_ == 9: - localctx = SqlBaseParser.BigDecimalLiteralContext(self, localctx) - self.enterOuterAlt(localctx, 9) - self.state = 2997 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==SqlBaseParser.MINUS: - self.state = 2996 - self.match(SqlBaseParser.MINUS) - - - self.state = 2999 - self.match(SqlBaseParser.BIGDECIMAL_LITERAL) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class AlterColumnActionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.setOrDrop = None # Token - - def TYPE(self): - return self.getToken(SqlBaseParser.TYPE, 0) - - def dataType(self): - return self.getTypedRuleContext(SqlBaseParser.DataTypeContext,0) - - - def commentSpec(self): - return self.getTypedRuleContext(SqlBaseParser.CommentSpecContext,0) - - - def colPosition(self): - return self.getTypedRuleContext(SqlBaseParser.ColPositionContext,0) - - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_alterColumnAction - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAlterColumnAction" ): - listener.enterAlterColumnAction(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAlterColumnAction" ): - listener.exitAlterColumnAction(self) - - - - - def alterColumnAction(self): - - localctx = SqlBaseParser.AlterColumnActionContext(self, self._ctx, self.state) - self.enterRule(localctx, 266, self.RULE_alterColumnAction) - self._la = 0 # Token type - try: - self.state = 3009 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [SqlBaseParser.TYPE]: - self.enterOuterAlt(localctx, 1) - self.state = 3002 - self.match(SqlBaseParser.TYPE) - self.state = 3003 - self.dataType() - pass - elif token in [SqlBaseParser.COMMENT]: - self.enterOuterAlt(localctx, 2) - self.state = 3004 - self.commentSpec() - pass - elif token in [SqlBaseParser.AFTER, SqlBaseParser.FIRST]: - self.enterOuterAlt(localctx, 3) - self.state = 3005 - self.colPosition() - pass - elif token in [SqlBaseParser.DROP, SqlBaseParser.SET]: - self.enterOuterAlt(localctx, 4) - self.state = 3006 - localctx.setOrDrop = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==SqlBaseParser.DROP or _la==SqlBaseParser.SET): - localctx.setOrDrop = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 3007 - self.match(SqlBaseParser.NOT) - self.state = 3008 - self.match(SqlBaseParser.NULL) - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class AnsiNonReservedContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ADD(self): - return self.getToken(SqlBaseParser.ADD, 0) - - def AFTER(self): - return self.getToken(SqlBaseParser.AFTER, 0) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - - def ANALYZE(self): - return self.getToken(SqlBaseParser.ANALYZE, 0) - - def ARCHIVE(self): - return self.getToken(SqlBaseParser.ARCHIVE, 0) - - def ARRAY(self): - return self.getToken(SqlBaseParser.ARRAY, 0) - - def ASC(self): - return self.getToken(SqlBaseParser.ASC, 0) - - def AT(self): - return self.getToken(SqlBaseParser.AT, 0) - - def BETWEEN(self): - return self.getToken(SqlBaseParser.BETWEEN, 0) - - def BUCKET(self): - return self.getToken(SqlBaseParser.BUCKET, 0) - - def BUCKETS(self): - return self.getToken(SqlBaseParser.BUCKETS, 0) - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def CACHE(self): - return self.getToken(SqlBaseParser.CACHE, 0) - - def CASCADE(self): - return self.getToken(SqlBaseParser.CASCADE, 0) - - def CHANGE(self): - return self.getToken(SqlBaseParser.CHANGE, 0) - - def CLEAR(self): - return self.getToken(SqlBaseParser.CLEAR, 0) - - def CLUSTER(self): - return self.getToken(SqlBaseParser.CLUSTER, 0) - - def CLUSTERED(self): - return self.getToken(SqlBaseParser.CLUSTERED, 0) - - def CODEGEN(self): - return self.getToken(SqlBaseParser.CODEGEN, 0) - - def COLLECTION(self): - return self.getToken(SqlBaseParser.COLLECTION, 0) - - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - - def COMMENT(self): - return self.getToken(SqlBaseParser.COMMENT, 0) - - def COMMIT(self): - return self.getToken(SqlBaseParser.COMMIT, 0) - - def COMPACT(self): - return self.getToken(SqlBaseParser.COMPACT, 0) - - def COMPACTIONS(self): - return self.getToken(SqlBaseParser.COMPACTIONS, 0) - - def COMPUTE(self): - return self.getToken(SqlBaseParser.COMPUTE, 0) - - def CONCATENATE(self): - return self.getToken(SqlBaseParser.CONCATENATE, 0) - - def COST(self): - return self.getToken(SqlBaseParser.COST, 0) - - def CUBE(self): - return self.getToken(SqlBaseParser.CUBE, 0) - - def CURRENT(self): - return self.getToken(SqlBaseParser.CURRENT, 0) - - def DATA(self): - return self.getToken(SqlBaseParser.DATA, 0) - - def DATABASE(self): - return self.getToken(SqlBaseParser.DATABASE, 0) - - def DATABASES(self): - return self.getToken(SqlBaseParser.DATABASES, 0) - - def DBPROPERTIES(self): - return self.getToken(SqlBaseParser.DBPROPERTIES, 0) - - def DEFINED(self): - return self.getToken(SqlBaseParser.DEFINED, 0) - - def DELETE(self): - return self.getToken(SqlBaseParser.DELETE, 0) - - def DELIMITED(self): - return self.getToken(SqlBaseParser.DELIMITED, 0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - - def DFS(self): - return self.getToken(SqlBaseParser.DFS, 0) - - def DIRECTORIES(self): - return self.getToken(SqlBaseParser.DIRECTORIES, 0) - - def DIRECTORY(self): - return self.getToken(SqlBaseParser.DIRECTORY, 0) - - def DISTRIBUTE(self): - return self.getToken(SqlBaseParser.DISTRIBUTE, 0) - - def DIV(self): - return self.getToken(SqlBaseParser.DIV, 0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - - def ESCAPED(self): - return self.getToken(SqlBaseParser.ESCAPED, 0) - - def EXCHANGE(self): - return self.getToken(SqlBaseParser.EXCHANGE, 0) - - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def EXPLAIN(self): - return self.getToken(SqlBaseParser.EXPLAIN, 0) - - def EXPORT(self): - return self.getToken(SqlBaseParser.EXPORT, 0) - - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - - def EXTERNAL(self): - return self.getToken(SqlBaseParser.EXTERNAL, 0) - - def EXTRACT(self): - return self.getToken(SqlBaseParser.EXTRACT, 0) - - def FIELDS(self): - return self.getToken(SqlBaseParser.FIELDS, 0) - - def FILEFORMAT(self): - return self.getToken(SqlBaseParser.FILEFORMAT, 0) - - def FIRST(self): - return self.getToken(SqlBaseParser.FIRST, 0) - - def FOLLOWING(self): - return self.getToken(SqlBaseParser.FOLLOWING, 0) - - def FORMAT(self): - return self.getToken(SqlBaseParser.FORMAT, 0) - - def FORMATTED(self): - return self.getToken(SqlBaseParser.FORMATTED, 0) - - def FUNCTION(self): - return self.getToken(SqlBaseParser.FUNCTION, 0) - - def FUNCTIONS(self): - return self.getToken(SqlBaseParser.FUNCTIONS, 0) - - def GLOBAL(self): - return self.getToken(SqlBaseParser.GLOBAL, 0) - - def GROUPING(self): - return self.getToken(SqlBaseParser.GROUPING, 0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - - def IGNORE(self): - return self.getToken(SqlBaseParser.IGNORE, 0) - - def IMPORT(self): - return self.getToken(SqlBaseParser.IMPORT, 0) - - def INDEX(self): - return self.getToken(SqlBaseParser.INDEX, 0) - - def INDEXES(self): - return self.getToken(SqlBaseParser.INDEXES, 0) - - def INPATH(self): - return self.getToken(SqlBaseParser.INPATH, 0) - - def INPUTFORMAT(self): - return self.getToken(SqlBaseParser.INPUTFORMAT, 0) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - - def INTERVAL(self): - return self.getToken(SqlBaseParser.INTERVAL, 0) - - def ITEMS(self): - return self.getToken(SqlBaseParser.ITEMS, 0) - - def KEYS(self): - return self.getToken(SqlBaseParser.KEYS, 0) - - def LAST(self): - return self.getToken(SqlBaseParser.LAST, 0) - - def LATERAL(self): - return self.getToken(SqlBaseParser.LATERAL, 0) - - def LAZY(self): - return self.getToken(SqlBaseParser.LAZY, 0) - - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def LIMIT(self): - return self.getToken(SqlBaseParser.LIMIT, 0) - - def LINES(self): - return self.getToken(SqlBaseParser.LINES, 0) - - def LIST(self): - return self.getToken(SqlBaseParser.LIST, 0) - - def LOAD(self): - return self.getToken(SqlBaseParser.LOAD, 0) - - def LOCAL(self): - return self.getToken(SqlBaseParser.LOCAL, 0) - - def LOCATION(self): - return self.getToken(SqlBaseParser.LOCATION, 0) - - def LOCK(self): - return self.getToken(SqlBaseParser.LOCK, 0) - - def LOCKS(self): - return self.getToken(SqlBaseParser.LOCKS, 0) - - def LOGICAL(self): - return self.getToken(SqlBaseParser.LOGICAL, 0) - - def MACRO(self): - return self.getToken(SqlBaseParser.MACRO, 0) - - def MAP(self): - return self.getToken(SqlBaseParser.MAP, 0) - - def MATCHED(self): - return self.getToken(SqlBaseParser.MATCHED, 0) - - def MERGE(self): - return self.getToken(SqlBaseParser.MERGE, 0) - - def MSCK(self): - return self.getToken(SqlBaseParser.MSCK, 0) - - def NAMESPACE(self): - return self.getToken(SqlBaseParser.NAMESPACE, 0) - - def NAMESPACES(self): - return self.getToken(SqlBaseParser.NAMESPACES, 0) - - def NO(self): - return self.getToken(SqlBaseParser.NO, 0) - - def NULLS(self): - return self.getToken(SqlBaseParser.NULLS, 0) - - def OF(self): - return self.getToken(SqlBaseParser.OF, 0) - - def OPTION(self): - return self.getToken(SqlBaseParser.OPTION, 0) - - def OPTIONS(self): - return self.getToken(SqlBaseParser.OPTIONS, 0) - - def OUT(self): - return self.getToken(SqlBaseParser.OUT, 0) - - def OUTPUTFORMAT(self): - return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) - - def OVER(self): - return self.getToken(SqlBaseParser.OVER, 0) - - def OVERLAY(self): - return self.getToken(SqlBaseParser.OVERLAY, 0) - - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - - def PARTITION(self): - return self.getToken(SqlBaseParser.PARTITION, 0) - - def PARTITIONED(self): - return self.getToken(SqlBaseParser.PARTITIONED, 0) - - def PARTITIONS(self): - return self.getToken(SqlBaseParser.PARTITIONS, 0) - - def PERCENTLIT(self): - return self.getToken(SqlBaseParser.PERCENTLIT, 0) - - def PIVOT(self): - return self.getToken(SqlBaseParser.PIVOT, 0) - - def PLACING(self): - return self.getToken(SqlBaseParser.PLACING, 0) - - def POSITION(self): - return self.getToken(SqlBaseParser.POSITION, 0) - - def PRECEDING(self): - return self.getToken(SqlBaseParser.PRECEDING, 0) - - def PRINCIPALS(self): - return self.getToken(SqlBaseParser.PRINCIPALS, 0) - - def PROPERTIES(self): - return self.getToken(SqlBaseParser.PROPERTIES, 0) - - def PURGE(self): - return self.getToken(SqlBaseParser.PURGE, 0) - - def QUERY(self): - return self.getToken(SqlBaseParser.QUERY, 0) - - def RANGE(self): - return self.getToken(SqlBaseParser.RANGE, 0) - - def RECORDREADER(self): - return self.getToken(SqlBaseParser.RECORDREADER, 0) - - def RECORDWRITER(self): - return self.getToken(SqlBaseParser.RECORDWRITER, 0) - - def RECOVER(self): - return self.getToken(SqlBaseParser.RECOVER, 0) - - def REDUCE(self): - return self.getToken(SqlBaseParser.REDUCE, 0) - - def REFRESH(self): - return self.getToken(SqlBaseParser.REFRESH, 0) - - def RENAME(self): - return self.getToken(SqlBaseParser.RENAME, 0) - - def REPAIR(self): - return self.getToken(SqlBaseParser.REPAIR, 0) - - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - - def RESET(self): - return self.getToken(SqlBaseParser.RESET, 0) - - def RESTRICT(self): - return self.getToken(SqlBaseParser.RESTRICT, 0) - - def REVOKE(self): - return self.getToken(SqlBaseParser.REVOKE, 0) - - def RLIKE(self): - return self.getToken(SqlBaseParser.RLIKE, 0) - - def ROLE(self): - return self.getToken(SqlBaseParser.ROLE, 0) - - def ROLES(self): - return self.getToken(SqlBaseParser.ROLES, 0) - - def ROLLBACK(self): - return self.getToken(SqlBaseParser.ROLLBACK, 0) - - def ROLLUP(self): - return self.getToken(SqlBaseParser.ROLLUP, 0) - - def ROW(self): - return self.getToken(SqlBaseParser.ROW, 0) - - def ROWS(self): - return self.getToken(SqlBaseParser.ROWS, 0) - - def SCHEMA(self): - return self.getToken(SqlBaseParser.SCHEMA, 0) - - def SEPARATED(self): - return self.getToken(SqlBaseParser.SEPARATED, 0) - - def SERDE(self): - return self.getToken(SqlBaseParser.SERDE, 0) - - def SERDEPROPERTIES(self): - return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def SETS(self): - return self.getToken(SqlBaseParser.SETS, 0) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - - def SKEWED(self): - return self.getToken(SqlBaseParser.SKEWED, 0) - - def SORT(self): - return self.getToken(SqlBaseParser.SORT, 0) - - def SORTED(self): - return self.getToken(SqlBaseParser.SORTED, 0) - - def START(self): - return self.getToken(SqlBaseParser.START, 0) - - def STATISTICS(self): - return self.getToken(SqlBaseParser.STATISTICS, 0) - - def STORED(self): - return self.getToken(SqlBaseParser.STORED, 0) - - def STRATIFY(self): - return self.getToken(SqlBaseParser.STRATIFY, 0) - - def STRUCT(self): - return self.getToken(SqlBaseParser.STRUCT, 0) - - def SUBSTR(self): - return self.getToken(SqlBaseParser.SUBSTR, 0) - - def SUBSTRING(self): - return self.getToken(SqlBaseParser.SUBSTRING, 0) - - def TABLES(self): - return self.getToken(SqlBaseParser.TABLES, 0) - - def TABLESAMPLE(self): - return self.getToken(SqlBaseParser.TABLESAMPLE, 0) - - def TBLPROPERTIES(self): - return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) - - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - - def TERMINATED(self): - return self.getToken(SqlBaseParser.TERMINATED, 0) - - def TOUCH(self): - return self.getToken(SqlBaseParser.TOUCH, 0) - - def TRANSACTION(self): - return self.getToken(SqlBaseParser.TRANSACTION, 0) - - def TRANSACTIONS(self): - return self.getToken(SqlBaseParser.TRANSACTIONS, 0) - - def TRANSFORM(self): - return self.getToken(SqlBaseParser.TRANSFORM, 0) - - def TRIM(self): - return self.getToken(SqlBaseParser.TRIM, 0) - - def TRUE(self): - return self.getToken(SqlBaseParser.TRUE, 0) - - def TRUNCATE(self): - return self.getToken(SqlBaseParser.TRUNCATE, 0) - - def UNARCHIVE(self): - return self.getToken(SqlBaseParser.UNARCHIVE, 0) - - def UNBOUNDED(self): - return self.getToken(SqlBaseParser.UNBOUNDED, 0) - - def UNCACHE(self): - return self.getToken(SqlBaseParser.UNCACHE, 0) - - def UNLOCK(self): - return self.getToken(SqlBaseParser.UNLOCK, 0) - - def UNSET(self): - return self.getToken(SqlBaseParser.UNSET, 0) - - def UPDATE(self): - return self.getToken(SqlBaseParser.UPDATE, 0) - - def USE(self): - return self.getToken(SqlBaseParser.USE, 0) - - def VALUES(self): - return self.getToken(SqlBaseParser.VALUES, 0) - - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - - def VIEWS(self): - return self.getToken(SqlBaseParser.VIEWS, 0) - - def WINDOW(self): - return self.getToken(SqlBaseParser.WINDOW, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_ansiNonReserved - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterAnsiNonReserved" ): - listener.enterAnsiNonReserved(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitAnsiNonReserved" ): - listener.exitAnsiNonReserved(self) - - - - - def ansiNonReserved(self): - - localctx = SqlBaseParser.AnsiNonReservedContext(self, self._ctx, self.state) - self.enterRule(localctx, 268, self.RULE_ansiNonReserved) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 3011 - _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << SqlBaseParser.ADD) | (1 << SqlBaseParser.AFTER) | (1 << SqlBaseParser.ALTER) | (1 << SqlBaseParser.ANALYZE) | (1 << SqlBaseParser.ARCHIVE) | (1 << SqlBaseParser.ARRAY) | (1 << SqlBaseParser.ASC) | (1 << SqlBaseParser.AT) | (1 << SqlBaseParser.BETWEEN) | (1 << SqlBaseParser.BUCKET) | (1 << SqlBaseParser.BUCKETS) | (1 << SqlBaseParser.BY) | (1 << SqlBaseParser.CACHE) | (1 << SqlBaseParser.CASCADE) | (1 << SqlBaseParser.CHANGE) | (1 << SqlBaseParser.CLEAR) | (1 << SqlBaseParser.CLUSTER) | (1 << SqlBaseParser.CLUSTERED) | (1 << SqlBaseParser.CODEGEN) | (1 << SqlBaseParser.COLLECTION) | (1 << SqlBaseParser.COLUMNS) | (1 << SqlBaseParser.COMMENT) | (1 << SqlBaseParser.COMMIT) | (1 << SqlBaseParser.COMPACT) | (1 << SqlBaseParser.COMPACTIONS) | (1 << SqlBaseParser.COMPUTE) | (1 << SqlBaseParser.CONCATENATE) | (1 << SqlBaseParser.COST) | (1 << SqlBaseParser.CUBE) | (1 << SqlBaseParser.CURRENT) | (1 << SqlBaseParser.DATA) | (1 << SqlBaseParser.DATABASE) | (1 << SqlBaseParser.DATABASES))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (SqlBaseParser.DBPROPERTIES - 65)) | (1 << (SqlBaseParser.DEFINED - 65)) | (1 << (SqlBaseParser.DELETE - 65)) | (1 << (SqlBaseParser.DELIMITED - 65)) | (1 << (SqlBaseParser.DESC - 65)) | (1 << (SqlBaseParser.DESCRIBE - 65)) | (1 << (SqlBaseParser.DFS - 65)) | (1 << (SqlBaseParser.DIRECTORIES - 65)) | (1 << (SqlBaseParser.DIRECTORY - 65)) | (1 << (SqlBaseParser.DISTRIBUTE - 65)) | (1 << (SqlBaseParser.DROP - 65)) | (1 << (SqlBaseParser.ESCAPED - 65)) | (1 << (SqlBaseParser.EXCHANGE - 65)) | (1 << (SqlBaseParser.EXISTS - 65)) | (1 << (SqlBaseParser.EXPLAIN - 65)) | (1 << (SqlBaseParser.EXPORT - 65)) | (1 << (SqlBaseParser.EXTENDED - 65)) | (1 << (SqlBaseParser.EXTERNAL - 65)) | (1 << (SqlBaseParser.EXTRACT - 65)) | (1 << (SqlBaseParser.FIELDS - 65)) | (1 << (SqlBaseParser.FILEFORMAT - 65)) | (1 << (SqlBaseParser.FIRST - 65)) | (1 << (SqlBaseParser.FOLLOWING - 65)) | (1 << (SqlBaseParser.FORMAT - 65)) | (1 << (SqlBaseParser.FORMATTED - 65)) | (1 << (SqlBaseParser.FUNCTION - 65)) | (1 << (SqlBaseParser.FUNCTIONS - 65)) | (1 << (SqlBaseParser.GLOBAL - 65)) | (1 << (SqlBaseParser.GROUPING - 65)) | (1 << (SqlBaseParser.IF - 65)) | (1 << (SqlBaseParser.IGNORE - 65)) | (1 << (SqlBaseParser.IMPORT - 65)) | (1 << (SqlBaseParser.INDEX - 65)) | (1 << (SqlBaseParser.INDEXES - 65)) | (1 << (SqlBaseParser.INPATH - 65)) | (1 << (SqlBaseParser.INPUTFORMAT - 65)) | (1 << (SqlBaseParser.INSERT - 65)) | (1 << (SqlBaseParser.INTERVAL - 65)) | (1 << (SqlBaseParser.ITEMS - 65)) | (1 << (SqlBaseParser.KEYS - 65)) | (1 << (SqlBaseParser.LAST - 65)) | (1 << (SqlBaseParser.LATERAL - 65)))) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & ((1 << (SqlBaseParser.LAZY - 129)) | (1 << (SqlBaseParser.LIKE - 129)) | (1 << (SqlBaseParser.LIMIT - 129)) | (1 << (SqlBaseParser.LINES - 129)) | (1 << (SqlBaseParser.LIST - 129)) | (1 << (SqlBaseParser.LOAD - 129)) | (1 << (SqlBaseParser.LOCAL - 129)) | (1 << (SqlBaseParser.LOCATION - 129)) | (1 << (SqlBaseParser.LOCK - 129)) | (1 << (SqlBaseParser.LOCKS - 129)) | (1 << (SqlBaseParser.LOGICAL - 129)) | (1 << (SqlBaseParser.MACRO - 129)) | (1 << (SqlBaseParser.MAP - 129)) | (1 << (SqlBaseParser.MATCHED - 129)) | (1 << (SqlBaseParser.MERGE - 129)) | (1 << (SqlBaseParser.MSCK - 129)) | (1 << (SqlBaseParser.NAMESPACE - 129)) | (1 << (SqlBaseParser.NAMESPACES - 129)) | (1 << (SqlBaseParser.NO - 129)) | (1 << (SqlBaseParser.NULLS - 129)) | (1 << (SqlBaseParser.OF - 129)) | (1 << (SqlBaseParser.OPTION - 129)) | (1 << (SqlBaseParser.OPTIONS - 129)) | (1 << (SqlBaseParser.OUT - 129)) | (1 << (SqlBaseParser.OUTPUTFORMAT - 129)) | (1 << (SqlBaseParser.OVER - 129)) | (1 << (SqlBaseParser.OVERLAY - 129)) | (1 << (SqlBaseParser.OVERWRITE - 129)) | (1 << (SqlBaseParser.PARTITION - 129)) | (1 << (SqlBaseParser.PARTITIONED - 129)) | (1 << (SqlBaseParser.PARTITIONS - 129)) | (1 << (SqlBaseParser.PERCENTLIT - 129)) | (1 << (SqlBaseParser.PIVOT - 129)) | (1 << (SqlBaseParser.PLACING - 129)) | (1 << (SqlBaseParser.POSITION - 129)) | (1 << (SqlBaseParser.PRECEDING - 129)) | (1 << (SqlBaseParser.PRINCIPALS - 129)) | (1 << (SqlBaseParser.PROPERTIES - 129)) | (1 << (SqlBaseParser.PURGE - 129)) | (1 << (SqlBaseParser.QUERY - 129)) | (1 << (SqlBaseParser.RANGE - 129)) | (1 << (SqlBaseParser.RECORDREADER - 129)) | (1 << (SqlBaseParser.RECORDWRITER - 129)) | (1 << (SqlBaseParser.RECOVER - 129)) | (1 << (SqlBaseParser.REDUCE - 129)) | (1 << (SqlBaseParser.REFRESH - 129)) | (1 << (SqlBaseParser.RENAME - 129)) | (1 << (SqlBaseParser.REPAIR - 129)) | (1 << (SqlBaseParser.REPLACE - 129)))) != 0) or ((((_la - 193)) & ~0x3f) == 0 and ((1 << (_la - 193)) & ((1 << (SqlBaseParser.RESET - 193)) | (1 << (SqlBaseParser.RESTRICT - 193)) | (1 << (SqlBaseParser.REVOKE - 193)) | (1 << (SqlBaseParser.RLIKE - 193)) | (1 << (SqlBaseParser.ROLE - 193)) | (1 << (SqlBaseParser.ROLES - 193)) | (1 << (SqlBaseParser.ROLLBACK - 193)) | (1 << (SqlBaseParser.ROLLUP - 193)) | (1 << (SqlBaseParser.ROW - 193)) | (1 << (SqlBaseParser.ROWS - 193)) | (1 << (SqlBaseParser.SCHEMA - 193)) | (1 << (SqlBaseParser.SEPARATED - 193)) | (1 << (SqlBaseParser.SERDE - 193)) | (1 << (SqlBaseParser.SERDEPROPERTIES - 193)) | (1 << (SqlBaseParser.SET - 193)) | (1 << (SqlBaseParser.SETS - 193)) | (1 << (SqlBaseParser.SHOW - 193)) | (1 << (SqlBaseParser.SKEWED - 193)) | (1 << (SqlBaseParser.SORT - 193)) | (1 << (SqlBaseParser.SORTED - 193)) | (1 << (SqlBaseParser.START - 193)) | (1 << (SqlBaseParser.STATISTICS - 193)) | (1 << (SqlBaseParser.STORED - 193)) | (1 << (SqlBaseParser.STRATIFY - 193)) | (1 << (SqlBaseParser.STRUCT - 193)) | (1 << (SqlBaseParser.SUBSTR - 193)) | (1 << (SqlBaseParser.SUBSTRING - 193)) | (1 << (SqlBaseParser.TABLES - 193)) | (1 << (SqlBaseParser.TABLESAMPLE - 193)) | (1 << (SqlBaseParser.TBLPROPERTIES - 193)) | (1 << (SqlBaseParser.TEMPORARY - 193)) | (1 << (SqlBaseParser.TERMINATED - 193)) | (1 << (SqlBaseParser.TOUCH - 193)) | (1 << (SqlBaseParser.TRANSACTION - 193)) | (1 << (SqlBaseParser.TRANSACTIONS - 193)) | (1 << (SqlBaseParser.TRANSFORM - 193)) | (1 << (SqlBaseParser.TRIM - 193)) | (1 << (SqlBaseParser.TRUE - 193)) | (1 << (SqlBaseParser.TRUNCATE - 193)) | (1 << (SqlBaseParser.UNARCHIVE - 193)) | (1 << (SqlBaseParser.UNBOUNDED - 193)) | (1 << (SqlBaseParser.UNCACHE - 193)) | (1 << (SqlBaseParser.UNLOCK - 193)) | (1 << (SqlBaseParser.UNSET - 193)) | (1 << (SqlBaseParser.UPDATE - 193)) | (1 << (SqlBaseParser.USE - 193)) | (1 << (SqlBaseParser.VALUES - 193)))) != 0) or ((((_la - 257)) & ~0x3f) == 0 and ((1 << (_la - 257)) & ((1 << (SqlBaseParser.VIEW - 257)) | (1 << (SqlBaseParser.VIEWS - 257)) | (1 << (SqlBaseParser.WINDOW - 257)) | (1 << (SqlBaseParser.DIV - 257)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class StrictNonReservedContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ANTI(self): - return self.getToken(SqlBaseParser.ANTI, 0) - - def CROSS(self): - return self.getToken(SqlBaseParser.CROSS, 0) - - def EXCEPT(self): - return self.getToken(SqlBaseParser.EXCEPT, 0) - - def FULL(self): - return self.getToken(SqlBaseParser.FULL, 0) - - def INNER(self): - return self.getToken(SqlBaseParser.INNER, 0) - - def INTERSECT(self): - return self.getToken(SqlBaseParser.INTERSECT, 0) - - def JOIN(self): - return self.getToken(SqlBaseParser.JOIN, 0) - - def LEFT(self): - return self.getToken(SqlBaseParser.LEFT, 0) - - def NATURAL(self): - return self.getToken(SqlBaseParser.NATURAL, 0) - - def ON(self): - return self.getToken(SqlBaseParser.ON, 0) - - def RIGHT(self): - return self.getToken(SqlBaseParser.RIGHT, 0) - - def SEMI(self): - return self.getToken(SqlBaseParser.SEMI, 0) - - def SETMINUS(self): - return self.getToken(SqlBaseParser.SETMINUS, 0) - - def UNION(self): - return self.getToken(SqlBaseParser.UNION, 0) - - def USING(self): - return self.getToken(SqlBaseParser.USING, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_strictNonReserved - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStrictNonReserved" ): - listener.enterStrictNonReserved(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStrictNonReserved" ): - listener.exitStrictNonReserved(self) - - - - - def strictNonReserved(self): - - localctx = SqlBaseParser.StrictNonReservedContext(self, self._ctx, self.state) - self.enterRule(localctx, 270, self.RULE_strictNonReserved) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 3013 - _la = self._input.LA(1) - if not(((((_la - 18)) & ~0x3f) == 0 and ((1 << (_la - 18)) & ((1 << (SqlBaseParser.ANTI - 18)) | (1 << (SqlBaseParser.CROSS - 18)) | (1 << (SqlBaseParser.EXCEPT - 18)))) != 0) or ((((_la - 101)) & ~0x3f) == 0 and ((1 << (_la - 101)) & ((1 << (SqlBaseParser.FULL - 101)) | (1 << (SqlBaseParser.INNER - 101)) | (1 << (SqlBaseParser.INTERSECT - 101)) | (1 << (SqlBaseParser.JOIN - 101)) | (1 << (SqlBaseParser.LEFT - 101)) | (1 << (SqlBaseParser.NATURAL - 101)) | (1 << (SqlBaseParser.ON - 101)))) != 0) or ((((_la - 196)) & ~0x3f) == 0 and ((1 << (_la - 196)) & ((1 << (SqlBaseParser.RIGHT - 196)) | (1 << (SqlBaseParser.SEMI - 196)) | (1 << (SqlBaseParser.SETMINUS - 196)) | (1 << (SqlBaseParser.UNION - 196)) | (1 << (SqlBaseParser.USING - 196)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - class NonReservedContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ADD(self): - return self.getToken(SqlBaseParser.ADD, 0) - - def AFTER(self): - return self.getToken(SqlBaseParser.AFTER, 0) - - def ALL(self): - return self.getToken(SqlBaseParser.ALL, 0) - - def ALTER(self): - return self.getToken(SqlBaseParser.ALTER, 0) - - def ANALYZE(self): - return self.getToken(SqlBaseParser.ANALYZE, 0) - - def AND(self): - return self.getToken(SqlBaseParser.AND, 0) - - def ANY(self): - return self.getToken(SqlBaseParser.ANY, 0) - - def ARCHIVE(self): - return self.getToken(SqlBaseParser.ARCHIVE, 0) - - def ARRAY(self): - return self.getToken(SqlBaseParser.ARRAY, 0) - - def AS(self): - return self.getToken(SqlBaseParser.AS, 0) - - def ASC(self): - return self.getToken(SqlBaseParser.ASC, 0) - - def AT(self): - return self.getToken(SqlBaseParser.AT, 0) - - def AUTHORIZATION(self): - return self.getToken(SqlBaseParser.AUTHORIZATION, 0) - - def BETWEEN(self): - return self.getToken(SqlBaseParser.BETWEEN, 0) - - def BOTH(self): - return self.getToken(SqlBaseParser.BOTH, 0) - - def BUCKET(self): - return self.getToken(SqlBaseParser.BUCKET, 0) - - def BUCKETS(self): - return self.getToken(SqlBaseParser.BUCKETS, 0) - - def BY(self): - return self.getToken(SqlBaseParser.BY, 0) - - def CACHE(self): - return self.getToken(SqlBaseParser.CACHE, 0) - - def CASCADE(self): - return self.getToken(SqlBaseParser.CASCADE, 0) - - def CASE(self): - return self.getToken(SqlBaseParser.CASE, 0) - - def CAST(self): - return self.getToken(SqlBaseParser.CAST, 0) - - def CHANGE(self): - return self.getToken(SqlBaseParser.CHANGE, 0) - - def CHECK(self): - return self.getToken(SqlBaseParser.CHECK, 0) - - def CLEAR(self): - return self.getToken(SqlBaseParser.CLEAR, 0) - - def CLUSTER(self): - return self.getToken(SqlBaseParser.CLUSTER, 0) - - def CLUSTERED(self): - return self.getToken(SqlBaseParser.CLUSTERED, 0) - - def CODEGEN(self): - return self.getToken(SqlBaseParser.CODEGEN, 0) - - def COLLATE(self): - return self.getToken(SqlBaseParser.COLLATE, 0) - - def COLLECTION(self): - return self.getToken(SqlBaseParser.COLLECTION, 0) - - def COLUMN(self): - return self.getToken(SqlBaseParser.COLUMN, 0) - - def COLUMNS(self): - return self.getToken(SqlBaseParser.COLUMNS, 0) - - def COMMENT(self): - return self.getToken(SqlBaseParser.COMMENT, 0) - - def COMMIT(self): - return self.getToken(SqlBaseParser.COMMIT, 0) - - def COMPACT(self): - return self.getToken(SqlBaseParser.COMPACT, 0) - - def COMPACTIONS(self): - return self.getToken(SqlBaseParser.COMPACTIONS, 0) - - def COMPUTE(self): - return self.getToken(SqlBaseParser.COMPUTE, 0) - - def CONCATENATE(self): - return self.getToken(SqlBaseParser.CONCATENATE, 0) - - def CONSTRAINT(self): - return self.getToken(SqlBaseParser.CONSTRAINT, 0) - - def COST(self): - return self.getToken(SqlBaseParser.COST, 0) - - def CREATE(self): - return self.getToken(SqlBaseParser.CREATE, 0) - - def CUBE(self): - return self.getToken(SqlBaseParser.CUBE, 0) - - def CURRENT(self): - return self.getToken(SqlBaseParser.CURRENT, 0) - - def CURRENT_DATE(self): - return self.getToken(SqlBaseParser.CURRENT_DATE, 0) - - def CURRENT_TIME(self): - return self.getToken(SqlBaseParser.CURRENT_TIME, 0) - - def CURRENT_TIMESTAMP(self): - return self.getToken(SqlBaseParser.CURRENT_TIMESTAMP, 0) - - def CURRENT_USER(self): - return self.getToken(SqlBaseParser.CURRENT_USER, 0) - - def DATA(self): - return self.getToken(SqlBaseParser.DATA, 0) - - def DATABASE(self): - return self.getToken(SqlBaseParser.DATABASE, 0) - - def DATABASES(self): - return self.getToken(SqlBaseParser.DATABASES, 0) - - def DAY(self): - return self.getToken(SqlBaseParser.DAY, 0) - - def DBPROPERTIES(self): - return self.getToken(SqlBaseParser.DBPROPERTIES, 0) - - def DEFINED(self): - return self.getToken(SqlBaseParser.DEFINED, 0) - - def DELETE(self): - return self.getToken(SqlBaseParser.DELETE, 0) - - def DELIMITED(self): - return self.getToken(SqlBaseParser.DELIMITED, 0) - - def DESC(self): - return self.getToken(SqlBaseParser.DESC, 0) - - def DESCRIBE(self): - return self.getToken(SqlBaseParser.DESCRIBE, 0) - - def DFS(self): - return self.getToken(SqlBaseParser.DFS, 0) - - def DIRECTORIES(self): - return self.getToken(SqlBaseParser.DIRECTORIES, 0) - - def DIRECTORY(self): - return self.getToken(SqlBaseParser.DIRECTORY, 0) - - def DISTINCT(self): - return self.getToken(SqlBaseParser.DISTINCT, 0) - - def DISTRIBUTE(self): - return self.getToken(SqlBaseParser.DISTRIBUTE, 0) - - def DIV(self): - return self.getToken(SqlBaseParser.DIV, 0) - - def DROP(self): - return self.getToken(SqlBaseParser.DROP, 0) - - def ELSE(self): - return self.getToken(SqlBaseParser.ELSE, 0) - - def END(self): - return self.getToken(SqlBaseParser.END, 0) - - def ESCAPE(self): - return self.getToken(SqlBaseParser.ESCAPE, 0) - - def ESCAPED(self): - return self.getToken(SqlBaseParser.ESCAPED, 0) - - def EXCHANGE(self): - return self.getToken(SqlBaseParser.EXCHANGE, 0) - - def EXISTS(self): - return self.getToken(SqlBaseParser.EXISTS, 0) - - def EXPLAIN(self): - return self.getToken(SqlBaseParser.EXPLAIN, 0) - - def EXPORT(self): - return self.getToken(SqlBaseParser.EXPORT, 0) - - def EXTENDED(self): - return self.getToken(SqlBaseParser.EXTENDED, 0) - - def EXTERNAL(self): - return self.getToken(SqlBaseParser.EXTERNAL, 0) - - def EXTRACT(self): - return self.getToken(SqlBaseParser.EXTRACT, 0) - - def FALSE(self): - return self.getToken(SqlBaseParser.FALSE, 0) - - def FETCH(self): - return self.getToken(SqlBaseParser.FETCH, 0) - - def FILTER(self): - return self.getToken(SqlBaseParser.FILTER, 0) - - def FIELDS(self): - return self.getToken(SqlBaseParser.FIELDS, 0) - - def FILEFORMAT(self): - return self.getToken(SqlBaseParser.FILEFORMAT, 0) - - def FIRST(self): - return self.getToken(SqlBaseParser.FIRST, 0) - - def FOLLOWING(self): - return self.getToken(SqlBaseParser.FOLLOWING, 0) - - def FOR(self): - return self.getToken(SqlBaseParser.FOR, 0) - - def FOREIGN(self): - return self.getToken(SqlBaseParser.FOREIGN, 0) - - def FORMAT(self): - return self.getToken(SqlBaseParser.FORMAT, 0) - - def FORMATTED(self): - return self.getToken(SqlBaseParser.FORMATTED, 0) - - def FROM(self): - return self.getToken(SqlBaseParser.FROM, 0) - - def FUNCTION(self): - return self.getToken(SqlBaseParser.FUNCTION, 0) - - def FUNCTIONS(self): - return self.getToken(SqlBaseParser.FUNCTIONS, 0) - - def GLOBAL(self): - return self.getToken(SqlBaseParser.GLOBAL, 0) - - def GRANT(self): - return self.getToken(SqlBaseParser.GRANT, 0) - - def GROUP(self): - return self.getToken(SqlBaseParser.GROUP, 0) - - def GROUPING(self): - return self.getToken(SqlBaseParser.GROUPING, 0) - - def HAVING(self): - return self.getToken(SqlBaseParser.HAVING, 0) - - def HOUR(self): - return self.getToken(SqlBaseParser.HOUR, 0) - - def IF(self): - return self.getToken(SqlBaseParser.IF, 0) - - def IGNORE(self): - return self.getToken(SqlBaseParser.IGNORE, 0) - - def IMPORT(self): - return self.getToken(SqlBaseParser.IMPORT, 0) - - def IN(self): - return self.getToken(SqlBaseParser.IN, 0) - - def INDEX(self): - return self.getToken(SqlBaseParser.INDEX, 0) - - def INDEXES(self): - return self.getToken(SqlBaseParser.INDEXES, 0) - - def INPATH(self): - return self.getToken(SqlBaseParser.INPATH, 0) - - def INPUTFORMAT(self): - return self.getToken(SqlBaseParser.INPUTFORMAT, 0) - - def INSERT(self): - return self.getToken(SqlBaseParser.INSERT, 0) - - def INTERVAL(self): - return self.getToken(SqlBaseParser.INTERVAL, 0) - - def INTO(self): - return self.getToken(SqlBaseParser.INTO, 0) - - def IS(self): - return self.getToken(SqlBaseParser.IS, 0) - - def ITEMS(self): - return self.getToken(SqlBaseParser.ITEMS, 0) - - def KEYS(self): - return self.getToken(SqlBaseParser.KEYS, 0) - - def LAST(self): - return self.getToken(SqlBaseParser.LAST, 0) - - def LATERAL(self): - return self.getToken(SqlBaseParser.LATERAL, 0) - - def LAZY(self): - return self.getToken(SqlBaseParser.LAZY, 0) - - def LEADING(self): - return self.getToken(SqlBaseParser.LEADING, 0) - - def LIKE(self): - return self.getToken(SqlBaseParser.LIKE, 0) - - def LIMIT(self): - return self.getToken(SqlBaseParser.LIMIT, 0) - - def LINES(self): - return self.getToken(SqlBaseParser.LINES, 0) - - def LIST(self): - return self.getToken(SqlBaseParser.LIST, 0) - - def LOAD(self): - return self.getToken(SqlBaseParser.LOAD, 0) - - def LOCAL(self): - return self.getToken(SqlBaseParser.LOCAL, 0) - - def LOCATION(self): - return self.getToken(SqlBaseParser.LOCATION, 0) - - def LOCK(self): - return self.getToken(SqlBaseParser.LOCK, 0) - - def LOCKS(self): - return self.getToken(SqlBaseParser.LOCKS, 0) - - def LOGICAL(self): - return self.getToken(SqlBaseParser.LOGICAL, 0) - - def MACRO(self): - return self.getToken(SqlBaseParser.MACRO, 0) - - def MAP(self): - return self.getToken(SqlBaseParser.MAP, 0) - - def MATCHED(self): - return self.getToken(SqlBaseParser.MATCHED, 0) - - def MERGE(self): - return self.getToken(SqlBaseParser.MERGE, 0) - - def MINUTE(self): - return self.getToken(SqlBaseParser.MINUTE, 0) - - def MONTH(self): - return self.getToken(SqlBaseParser.MONTH, 0) - - def MSCK(self): - return self.getToken(SqlBaseParser.MSCK, 0) - - def NAMESPACE(self): - return self.getToken(SqlBaseParser.NAMESPACE, 0) - - def NAMESPACES(self): - return self.getToken(SqlBaseParser.NAMESPACES, 0) - - def NO(self): - return self.getToken(SqlBaseParser.NO, 0) - - def NOT(self): - return self.getToken(SqlBaseParser.NOT, 0) - - def NULL(self): - return self.getToken(SqlBaseParser.NULL, 0) - - def NULLS(self): - return self.getToken(SqlBaseParser.NULLS, 0) - - def OF(self): - return self.getToken(SqlBaseParser.OF, 0) - - def ONLY(self): - return self.getToken(SqlBaseParser.ONLY, 0) - - def OPTION(self): - return self.getToken(SqlBaseParser.OPTION, 0) - - def OPTIONS(self): - return self.getToken(SqlBaseParser.OPTIONS, 0) - - def OR(self): - return self.getToken(SqlBaseParser.OR, 0) - - def ORDER(self): - return self.getToken(SqlBaseParser.ORDER, 0) - - def OUT(self): - return self.getToken(SqlBaseParser.OUT, 0) - - def OUTER(self): - return self.getToken(SqlBaseParser.OUTER, 0) - - def OUTPUTFORMAT(self): - return self.getToken(SqlBaseParser.OUTPUTFORMAT, 0) - - def OVER(self): - return self.getToken(SqlBaseParser.OVER, 0) - - def OVERLAPS(self): - return self.getToken(SqlBaseParser.OVERLAPS, 0) - - def OVERLAY(self): - return self.getToken(SqlBaseParser.OVERLAY, 0) - - def OVERWRITE(self): - return self.getToken(SqlBaseParser.OVERWRITE, 0) - - def PARTITION(self): - return self.getToken(SqlBaseParser.PARTITION, 0) - - def PARTITIONED(self): - return self.getToken(SqlBaseParser.PARTITIONED, 0) - - def PARTITIONS(self): - return self.getToken(SqlBaseParser.PARTITIONS, 0) - - def PERCENTLIT(self): - return self.getToken(SqlBaseParser.PERCENTLIT, 0) - - def PIVOT(self): - return self.getToken(SqlBaseParser.PIVOT, 0) - - def PLACING(self): - return self.getToken(SqlBaseParser.PLACING, 0) - - def POSITION(self): - return self.getToken(SqlBaseParser.POSITION, 0) - - def PRECEDING(self): - return self.getToken(SqlBaseParser.PRECEDING, 0) - - def PRIMARY(self): - return self.getToken(SqlBaseParser.PRIMARY, 0) - - def PRINCIPALS(self): - return self.getToken(SqlBaseParser.PRINCIPALS, 0) - - def PROPERTIES(self): - return self.getToken(SqlBaseParser.PROPERTIES, 0) - - def PURGE(self): - return self.getToken(SqlBaseParser.PURGE, 0) - - def QUERY(self): - return self.getToken(SqlBaseParser.QUERY, 0) - - def RANGE(self): - return self.getToken(SqlBaseParser.RANGE, 0) - - def RECORDREADER(self): - return self.getToken(SqlBaseParser.RECORDREADER, 0) - - def RECORDWRITER(self): - return self.getToken(SqlBaseParser.RECORDWRITER, 0) - - def RECOVER(self): - return self.getToken(SqlBaseParser.RECOVER, 0) - - def REDUCE(self): - return self.getToken(SqlBaseParser.REDUCE, 0) - - def REFERENCES(self): - return self.getToken(SqlBaseParser.REFERENCES, 0) - - def REFRESH(self): - return self.getToken(SqlBaseParser.REFRESH, 0) - - def RENAME(self): - return self.getToken(SqlBaseParser.RENAME, 0) - - def REPAIR(self): - return self.getToken(SqlBaseParser.REPAIR, 0) - - def REPLACE(self): - return self.getToken(SqlBaseParser.REPLACE, 0) - - def RESET(self): - return self.getToken(SqlBaseParser.RESET, 0) - - def RESTRICT(self): - return self.getToken(SqlBaseParser.RESTRICT, 0) - - def REVOKE(self): - return self.getToken(SqlBaseParser.REVOKE, 0) - - def RLIKE(self): - return self.getToken(SqlBaseParser.RLIKE, 0) - - def ROLE(self): - return self.getToken(SqlBaseParser.ROLE, 0) - - def ROLES(self): - return self.getToken(SqlBaseParser.ROLES, 0) - - def ROLLBACK(self): - return self.getToken(SqlBaseParser.ROLLBACK, 0) - - def ROLLUP(self): - return self.getToken(SqlBaseParser.ROLLUP, 0) - - def ROW(self): - return self.getToken(SqlBaseParser.ROW, 0) - - def ROWS(self): - return self.getToken(SqlBaseParser.ROWS, 0) - - def SCHEMA(self): - return self.getToken(SqlBaseParser.SCHEMA, 0) - - def SECOND(self): - return self.getToken(SqlBaseParser.SECOND, 0) - - def SELECT(self): - return self.getToken(SqlBaseParser.SELECT, 0) - - def SEPARATED(self): - return self.getToken(SqlBaseParser.SEPARATED, 0) - - def SERDE(self): - return self.getToken(SqlBaseParser.SERDE, 0) - - def SERDEPROPERTIES(self): - return self.getToken(SqlBaseParser.SERDEPROPERTIES, 0) - - def SESSION_USER(self): - return self.getToken(SqlBaseParser.SESSION_USER, 0) - - def SET(self): - return self.getToken(SqlBaseParser.SET, 0) - - def SETS(self): - return self.getToken(SqlBaseParser.SETS, 0) - - def SHOW(self): - return self.getToken(SqlBaseParser.SHOW, 0) - - def SKEWED(self): - return self.getToken(SqlBaseParser.SKEWED, 0) - - def SOME(self): - return self.getToken(SqlBaseParser.SOME, 0) - - def SORT(self): - return self.getToken(SqlBaseParser.SORT, 0) - - def SORTED(self): - return self.getToken(SqlBaseParser.SORTED, 0) - - def START(self): - return self.getToken(SqlBaseParser.START, 0) - - def STATISTICS(self): - return self.getToken(SqlBaseParser.STATISTICS, 0) - - def STORED(self): - return self.getToken(SqlBaseParser.STORED, 0) - - def STRATIFY(self): - return self.getToken(SqlBaseParser.STRATIFY, 0) - - def STRUCT(self): - return self.getToken(SqlBaseParser.STRUCT, 0) - - def SUBSTR(self): - return self.getToken(SqlBaseParser.SUBSTR, 0) - - def SUBSTRING(self): - return self.getToken(SqlBaseParser.SUBSTRING, 0) - - def TABLE(self): - return self.getToken(SqlBaseParser.TABLE, 0) - - def TABLES(self): - return self.getToken(SqlBaseParser.TABLES, 0) - - def TABLESAMPLE(self): - return self.getToken(SqlBaseParser.TABLESAMPLE, 0) - - def TBLPROPERTIES(self): - return self.getToken(SqlBaseParser.TBLPROPERTIES, 0) - - def TEMPORARY(self): - return self.getToken(SqlBaseParser.TEMPORARY, 0) - - def TERMINATED(self): - return self.getToken(SqlBaseParser.TERMINATED, 0) - - def THEN(self): - return self.getToken(SqlBaseParser.THEN, 0) - - def TO(self): - return self.getToken(SqlBaseParser.TO, 0) - - def TOUCH(self): - return self.getToken(SqlBaseParser.TOUCH, 0) - - def TRAILING(self): - return self.getToken(SqlBaseParser.TRAILING, 0) - - def TRANSACTION(self): - return self.getToken(SqlBaseParser.TRANSACTION, 0) - - def TRANSACTIONS(self): - return self.getToken(SqlBaseParser.TRANSACTIONS, 0) - - def TRANSFORM(self): - return self.getToken(SqlBaseParser.TRANSFORM, 0) - - def TRIM(self): - return self.getToken(SqlBaseParser.TRIM, 0) - - def TRUE(self): - return self.getToken(SqlBaseParser.TRUE, 0) - - def TRUNCATE(self): - return self.getToken(SqlBaseParser.TRUNCATE, 0) - - def TYPE(self): - return self.getToken(SqlBaseParser.TYPE, 0) - - def UNARCHIVE(self): - return self.getToken(SqlBaseParser.UNARCHIVE, 0) - - def UNBOUNDED(self): - return self.getToken(SqlBaseParser.UNBOUNDED, 0) - - def UNCACHE(self): - return self.getToken(SqlBaseParser.UNCACHE, 0) - - def UNIQUE(self): - return self.getToken(SqlBaseParser.UNIQUE, 0) - - def UNKNOWN(self): - return self.getToken(SqlBaseParser.UNKNOWN, 0) - - def UNLOCK(self): - return self.getToken(SqlBaseParser.UNLOCK, 0) - - def UNSET(self): - return self.getToken(SqlBaseParser.UNSET, 0) - - def UPDATE(self): - return self.getToken(SqlBaseParser.UPDATE, 0) - - def USE(self): - return self.getToken(SqlBaseParser.USE, 0) - - def USER(self): - return self.getToken(SqlBaseParser.USER, 0) - - def VALUES(self): - return self.getToken(SqlBaseParser.VALUES, 0) - - def VIEW(self): - return self.getToken(SqlBaseParser.VIEW, 0) - - def VIEWS(self): - return self.getToken(SqlBaseParser.VIEWS, 0) - - def WHEN(self): - return self.getToken(SqlBaseParser.WHEN, 0) - - def WHERE(self): - return self.getToken(SqlBaseParser.WHERE, 0) - - def WINDOW(self): - return self.getToken(SqlBaseParser.WINDOW, 0) - - def WITH(self): - return self.getToken(SqlBaseParser.WITH, 0) - - def YEAR(self): - return self.getToken(SqlBaseParser.YEAR, 0) - - def getRuleIndex(self): - return SqlBaseParser.RULE_nonReserved - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNonReserved" ): - listener.enterNonReserved(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNonReserved" ): - listener.exitNonReserved(self) - - - - - def nonReserved(self): - - localctx = SqlBaseParser.NonReservedContext(self, self._ctx, self.state) - self.enterRule(localctx, 272, self.RULE_nonReserved) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 3015 - _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << SqlBaseParser.ADD) | (1 << SqlBaseParser.AFTER) | (1 << SqlBaseParser.ALL) | (1 << SqlBaseParser.ALTER) | (1 << SqlBaseParser.ANALYZE) | (1 << SqlBaseParser.AND) | (1 << SqlBaseParser.ANY) | (1 << SqlBaseParser.ARCHIVE) | (1 << SqlBaseParser.ARRAY) | (1 << SqlBaseParser.AS) | (1 << SqlBaseParser.ASC) | (1 << SqlBaseParser.AT) | (1 << SqlBaseParser.AUTHORIZATION) | (1 << SqlBaseParser.BETWEEN) | (1 << SqlBaseParser.BOTH) | (1 << SqlBaseParser.BUCKET) | (1 << SqlBaseParser.BUCKETS) | (1 << SqlBaseParser.BY) | (1 << SqlBaseParser.CACHE) | (1 << SqlBaseParser.CASCADE) | (1 << SqlBaseParser.CASE) | (1 << SqlBaseParser.CAST) | (1 << SqlBaseParser.CHANGE) | (1 << SqlBaseParser.CHECK) | (1 << SqlBaseParser.CLEAR) | (1 << SqlBaseParser.CLUSTER) | (1 << SqlBaseParser.CLUSTERED) | (1 << SqlBaseParser.CODEGEN) | (1 << SqlBaseParser.COLLATE) | (1 << SqlBaseParser.COLLECTION) | (1 << SqlBaseParser.COLUMN) | (1 << SqlBaseParser.COLUMNS) | (1 << SqlBaseParser.COMMENT) | (1 << SqlBaseParser.COMMIT) | (1 << SqlBaseParser.COMPACT) | (1 << SqlBaseParser.COMPACTIONS) | (1 << SqlBaseParser.COMPUTE) | (1 << SqlBaseParser.CONCATENATE) | (1 << SqlBaseParser.CONSTRAINT) | (1 << SqlBaseParser.COST) | (1 << SqlBaseParser.CREATE) | (1 << SqlBaseParser.CUBE) | (1 << SqlBaseParser.CURRENT) | (1 << SqlBaseParser.CURRENT_DATE) | (1 << SqlBaseParser.CURRENT_TIME) | (1 << SqlBaseParser.CURRENT_TIMESTAMP) | (1 << SqlBaseParser.CURRENT_USER) | (1 << SqlBaseParser.DATA) | (1 << SqlBaseParser.DATABASE) | (1 << SqlBaseParser.DATABASES))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (SqlBaseParser.DAY - 64)) | (1 << (SqlBaseParser.DBPROPERTIES - 64)) | (1 << (SqlBaseParser.DEFINED - 64)) | (1 << (SqlBaseParser.DELETE - 64)) | (1 << (SqlBaseParser.DELIMITED - 64)) | (1 << (SqlBaseParser.DESC - 64)) | (1 << (SqlBaseParser.DESCRIBE - 64)) | (1 << (SqlBaseParser.DFS - 64)) | (1 << (SqlBaseParser.DIRECTORIES - 64)) | (1 << (SqlBaseParser.DIRECTORY - 64)) | (1 << (SqlBaseParser.DISTINCT - 64)) | (1 << (SqlBaseParser.DISTRIBUTE - 64)) | (1 << (SqlBaseParser.DROP - 64)) | (1 << (SqlBaseParser.ELSE - 64)) | (1 << (SqlBaseParser.END - 64)) | (1 << (SqlBaseParser.ESCAPE - 64)) | (1 << (SqlBaseParser.ESCAPED - 64)) | (1 << (SqlBaseParser.EXCHANGE - 64)) | (1 << (SqlBaseParser.EXISTS - 64)) | (1 << (SqlBaseParser.EXPLAIN - 64)) | (1 << (SqlBaseParser.EXPORT - 64)) | (1 << (SqlBaseParser.EXTENDED - 64)) | (1 << (SqlBaseParser.EXTERNAL - 64)) | (1 << (SqlBaseParser.EXTRACT - 64)) | (1 << (SqlBaseParser.FALSE - 64)) | (1 << (SqlBaseParser.FETCH - 64)) | (1 << (SqlBaseParser.FIELDS - 64)) | (1 << (SqlBaseParser.FILTER - 64)) | (1 << (SqlBaseParser.FILEFORMAT - 64)) | (1 << (SqlBaseParser.FIRST - 64)) | (1 << (SqlBaseParser.FOLLOWING - 64)) | (1 << (SqlBaseParser.FOR - 64)) | (1 << (SqlBaseParser.FOREIGN - 64)) | (1 << (SqlBaseParser.FORMAT - 64)) | (1 << (SqlBaseParser.FORMATTED - 64)) | (1 << (SqlBaseParser.FROM - 64)) | (1 << (SqlBaseParser.FUNCTION - 64)) | (1 << (SqlBaseParser.FUNCTIONS - 64)) | (1 << (SqlBaseParser.GLOBAL - 64)) | (1 << (SqlBaseParser.GRANT - 64)) | (1 << (SqlBaseParser.GROUP - 64)) | (1 << (SqlBaseParser.GROUPING - 64)) | (1 << (SqlBaseParser.HAVING - 64)) | (1 << (SqlBaseParser.HOUR - 64)) | (1 << (SqlBaseParser.IF - 64)) | (1 << (SqlBaseParser.IGNORE - 64)) | (1 << (SqlBaseParser.IMPORT - 64)) | (1 << (SqlBaseParser.IN - 64)) | (1 << (SqlBaseParser.INDEX - 64)) | (1 << (SqlBaseParser.INDEXES - 64)) | (1 << (SqlBaseParser.INPATH - 64)) | (1 << (SqlBaseParser.INPUTFORMAT - 64)) | (1 << (SqlBaseParser.INSERT - 64)) | (1 << (SqlBaseParser.INTERVAL - 64)) | (1 << (SqlBaseParser.INTO - 64)) | (1 << (SqlBaseParser.IS - 64)) | (1 << (SqlBaseParser.ITEMS - 64)) | (1 << (SqlBaseParser.KEYS - 64)) | (1 << (SqlBaseParser.LAST - 64)))) != 0) or ((((_la - 128)) & ~0x3f) == 0 and ((1 << (_la - 128)) & ((1 << (SqlBaseParser.LATERAL - 128)) | (1 << (SqlBaseParser.LAZY - 128)) | (1 << (SqlBaseParser.LEADING - 128)) | (1 << (SqlBaseParser.LIKE - 128)) | (1 << (SqlBaseParser.LIMIT - 128)) | (1 << (SqlBaseParser.LINES - 128)) | (1 << (SqlBaseParser.LIST - 128)) | (1 << (SqlBaseParser.LOAD - 128)) | (1 << (SqlBaseParser.LOCAL - 128)) | (1 << (SqlBaseParser.LOCATION - 128)) | (1 << (SqlBaseParser.LOCK - 128)) | (1 << (SqlBaseParser.LOCKS - 128)) | (1 << (SqlBaseParser.LOGICAL - 128)) | (1 << (SqlBaseParser.MACRO - 128)) | (1 << (SqlBaseParser.MAP - 128)) | (1 << (SqlBaseParser.MATCHED - 128)) | (1 << (SqlBaseParser.MERGE - 128)) | (1 << (SqlBaseParser.MINUTE - 128)) | (1 << (SqlBaseParser.MONTH - 128)) | (1 << (SqlBaseParser.MSCK - 128)) | (1 << (SqlBaseParser.NAMESPACE - 128)) | (1 << (SqlBaseParser.NAMESPACES - 128)) | (1 << (SqlBaseParser.NO - 128)) | (1 << (SqlBaseParser.NOT - 128)) | (1 << (SqlBaseParser.NULL - 128)) | (1 << (SqlBaseParser.NULLS - 128)) | (1 << (SqlBaseParser.OF - 128)) | (1 << (SqlBaseParser.ONLY - 128)) | (1 << (SqlBaseParser.OPTION - 128)) | (1 << (SqlBaseParser.OPTIONS - 128)) | (1 << (SqlBaseParser.OR - 128)) | (1 << (SqlBaseParser.ORDER - 128)) | (1 << (SqlBaseParser.OUT - 128)) | (1 << (SqlBaseParser.OUTER - 128)) | (1 << (SqlBaseParser.OUTPUTFORMAT - 128)) | (1 << (SqlBaseParser.OVER - 128)) | (1 << (SqlBaseParser.OVERLAPS - 128)) | (1 << (SqlBaseParser.OVERLAY - 128)) | (1 << (SqlBaseParser.OVERWRITE - 128)) | (1 << (SqlBaseParser.PARTITION - 128)) | (1 << (SqlBaseParser.PARTITIONED - 128)) | (1 << (SqlBaseParser.PARTITIONS - 128)) | (1 << (SqlBaseParser.PERCENTLIT - 128)) | (1 << (SqlBaseParser.PIVOT - 128)) | (1 << (SqlBaseParser.PLACING - 128)) | (1 << (SqlBaseParser.POSITION - 128)) | (1 << (SqlBaseParser.PRECEDING - 128)) | (1 << (SqlBaseParser.PRIMARY - 128)) | (1 << (SqlBaseParser.PRINCIPALS - 128)) | (1 << (SqlBaseParser.PROPERTIES - 128)) | (1 << (SqlBaseParser.PURGE - 128)) | (1 << (SqlBaseParser.QUERY - 128)) | (1 << (SqlBaseParser.RANGE - 128)) | (1 << (SqlBaseParser.RECORDREADER - 128)) | (1 << (SqlBaseParser.RECORDWRITER - 128)) | (1 << (SqlBaseParser.RECOVER - 128)) | (1 << (SqlBaseParser.REDUCE - 128)) | (1 << (SqlBaseParser.REFERENCES - 128)) | (1 << (SqlBaseParser.REFRESH - 128)) | (1 << (SqlBaseParser.RENAME - 128)) | (1 << (SqlBaseParser.REPAIR - 128)))) != 0) or ((((_la - 192)) & ~0x3f) == 0 and ((1 << (_la - 192)) & ((1 << (SqlBaseParser.REPLACE - 192)) | (1 << (SqlBaseParser.RESET - 192)) | (1 << (SqlBaseParser.RESTRICT - 192)) | (1 << (SqlBaseParser.REVOKE - 192)) | (1 << (SqlBaseParser.RLIKE - 192)) | (1 << (SqlBaseParser.ROLE - 192)) | (1 << (SqlBaseParser.ROLES - 192)) | (1 << (SqlBaseParser.ROLLBACK - 192)) | (1 << (SqlBaseParser.ROLLUP - 192)) | (1 << (SqlBaseParser.ROW - 192)) | (1 << (SqlBaseParser.ROWS - 192)) | (1 << (SqlBaseParser.SCHEMA - 192)) | (1 << (SqlBaseParser.SECOND - 192)) | (1 << (SqlBaseParser.SELECT - 192)) | (1 << (SqlBaseParser.SEPARATED - 192)) | (1 << (SqlBaseParser.SERDE - 192)) | (1 << (SqlBaseParser.SERDEPROPERTIES - 192)) | (1 << (SqlBaseParser.SESSION_USER - 192)) | (1 << (SqlBaseParser.SET - 192)) | (1 << (SqlBaseParser.SETS - 192)) | (1 << (SqlBaseParser.SHOW - 192)) | (1 << (SqlBaseParser.SKEWED - 192)) | (1 << (SqlBaseParser.SOME - 192)) | (1 << (SqlBaseParser.SORT - 192)) | (1 << (SqlBaseParser.SORTED - 192)) | (1 << (SqlBaseParser.START - 192)) | (1 << (SqlBaseParser.STATISTICS - 192)) | (1 << (SqlBaseParser.STORED - 192)) | (1 << (SqlBaseParser.STRATIFY - 192)) | (1 << (SqlBaseParser.STRUCT - 192)) | (1 << (SqlBaseParser.SUBSTR - 192)) | (1 << (SqlBaseParser.SUBSTRING - 192)) | (1 << (SqlBaseParser.TABLE - 192)) | (1 << (SqlBaseParser.TABLES - 192)) | (1 << (SqlBaseParser.TABLESAMPLE - 192)) | (1 << (SqlBaseParser.TBLPROPERTIES - 192)) | (1 << (SqlBaseParser.TEMPORARY - 192)) | (1 << (SqlBaseParser.TERMINATED - 192)) | (1 << (SqlBaseParser.THEN - 192)) | (1 << (SqlBaseParser.TO - 192)) | (1 << (SqlBaseParser.TOUCH - 192)) | (1 << (SqlBaseParser.TRAILING - 192)) | (1 << (SqlBaseParser.TRANSACTION - 192)) | (1 << (SqlBaseParser.TRANSACTIONS - 192)) | (1 << (SqlBaseParser.TRANSFORM - 192)) | (1 << (SqlBaseParser.TRIM - 192)) | (1 << (SqlBaseParser.TRUE - 192)) | (1 << (SqlBaseParser.TRUNCATE - 192)) | (1 << (SqlBaseParser.TYPE - 192)) | (1 << (SqlBaseParser.UNARCHIVE - 192)) | (1 << (SqlBaseParser.UNBOUNDED - 192)) | (1 << (SqlBaseParser.UNCACHE - 192)) | (1 << (SqlBaseParser.UNIQUE - 192)) | (1 << (SqlBaseParser.UNKNOWN - 192)) | (1 << (SqlBaseParser.UNLOCK - 192)) | (1 << (SqlBaseParser.UNSET - 192)) | (1 << (SqlBaseParser.UPDATE - 192)) | (1 << (SqlBaseParser.USE - 192)) | (1 << (SqlBaseParser.USER - 192)))) != 0) or ((((_la - 256)) & ~0x3f) == 0 and ((1 << (_la - 256)) & ((1 << (SqlBaseParser.VALUES - 256)) | (1 << (SqlBaseParser.VIEW - 256)) | (1 << (SqlBaseParser.VIEWS - 256)) | (1 << (SqlBaseParser.WHEN - 256)) | (1 << (SqlBaseParser.WHERE - 256)) | (1 << (SqlBaseParser.WINDOW - 256)) | (1 << (SqlBaseParser.WITH - 256)) | (1 << (SqlBaseParser.YEAR - 256)) | (1 << (SqlBaseParser.DIV - 256)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - - def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): - if self._predicates == None: - self._predicates = dict() - self._predicates[7] = self.statement_sempred - self._predicates[40] = self.queryTerm_sempred - self._predicates[94] = self.booleanExpression_sempred - self._predicates[96] = self.valueExpression_sempred - self._predicates[97] = self.primaryExpression_sempred - self._predicates[129] = self.identifier_sempred - self._predicates[130] = self.strictIdentifier_sempred - self._predicates[132] = self.number_sempred - pred = self._predicates.get(ruleIndex, None) - if pred is None: - raise Exception("No predicate with index:" + str(ruleIndex)) - else: - return pred(localctx, predIndex) - - def statement_sempred(self, localctx:StatementContext, predIndex:int): - if predIndex == 0: - return not self.legacy_create_hive_table_by_default_enabled - - - if predIndex == 1: - return self.legacy_create_hive_table_by_default_enabled - - - def queryTerm_sempred(self, localctx:QueryTermContext, predIndex:int): - if predIndex == 2: - return self.precpred(self._ctx, 3) - - - if predIndex == 3: - return self.legacy_setops_precedence_enbled - - - if predIndex == 4: - return self.precpred(self._ctx, 2) - - - if predIndex == 5: - return not self.legacy_setops_precedence_enbled - - - if predIndex == 6: - return self.precpred(self._ctx, 1) - - - if predIndex == 7: - return not self.legacy_setops_precedence_enbled - - - def booleanExpression_sempred(self, localctx:BooleanExpressionContext, predIndex:int): - if predIndex == 8: - return self.precpred(self._ctx, 2) - - - if predIndex == 9: - return self.precpred(self._ctx, 1) - - - def valueExpression_sempred(self, localctx:ValueExpressionContext, predIndex:int): - if predIndex == 10: - return self.precpred(self._ctx, 6) - - - if predIndex == 11: - return self.precpred(self._ctx, 5) - - - if predIndex == 12: - return self.precpred(self._ctx, 4) - - - if predIndex == 13: - return self.precpred(self._ctx, 3) - - - if predIndex == 14: - return self.precpred(self._ctx, 2) - - - if predIndex == 15: - return self.precpred(self._ctx, 1) - - - def primaryExpression_sempred(self, localctx:PrimaryExpressionContext, predIndex:int): - if predIndex == 16: - return self.precpred(self._ctx, 8) - - - if predIndex == 17: - return self.precpred(self._ctx, 6) - - - def identifier_sempred(self, localctx:IdentifierContext, predIndex:int): - if predIndex == 18: - return not self.SQL_standard_keyword_behavior - - - def strictIdentifier_sempred(self, localctx:StrictIdentifierContext, predIndex:int): - if predIndex == 19: - return self.SQL_standard_keyword_behavior - - - if predIndex == 20: - return not self.SQL_standard_keyword_behavior - - - def number_sempred(self, localctx:NumberContext, predIndex:int): - if predIndex == 21: - return not self.legacy_exponent_literal_as_decimal_enabled - - - if predIndex == 22: - return not self.legacy_exponent_literal_as_decimal_enabled - - - if predIndex == 23: - return self.legacy_exponent_literal_as_decimal_enabled - - - - - diff --git a/pysparkling/sql/ast/grammar/SqlBase.g4 b/pysparkling/sql/ast/grammar/SqlBase.g4 deleted file mode 100644 index 4ed997959..000000000 --- a/pysparkling/sql/ast/grammar/SqlBase.g4 +++ /dev/null @@ -1,1829 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is an adaptation of Presto's presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 grammar. - */ - -grammar SqlBase; - -@members { -""" -When false, INTERSECT is given the greater precedence over the other set -operations (UNION, EXCEPT and MINUS) as per the SQL standard. -""" -legacy_setops_precedence_enbled = False - -""" -When false, a literal with an exponent would be converted into -double type rather than decimal type. -""" -legacy_exponent_literal_as_decimal_enabled = False - -""" -When false, CREATE TABLE syntax without a provider will use -the value of spark.sql.sources.default as its provider. -""" -legacy_create_hive_table_by_default_enabled = False - -""" -When true, the behavior of keywords follows ANSI SQL standard. -""" -SQL_standard_keyword_behavior = False - -def isValidDecimal(self): - """ - Verify whether current token is a valid decimal token (which contains dot). - Returns true if the character that follows the token is not a digit or letter or underscore. - - For example: - For char stream "2.3", "2." is not a valid decimal token, because it is followed by digit '3'. - For char stream "2.3_", "2.3" is not a valid decimal token, because it is followed by '_'. - For char stream "2.3W", "2.3" is not a valid decimal token, because it is followed by 'W'. - For char stream "12.0D 34.E2+0.12 " 12.0D is a valid decimal token because it is followed - by a space. 34.E2 is a valid decimal token because it is followed by symbol '+' - which is not a digit or letter or underscore. - """ - nextChar = self._input.LA(1) - if 'A' <= nextChar <= 'Z' or '0' <= nextChar <= '9' or nextChar == '_': - return False - else: - return True - -def isHint(self): - """ - This method will be called when we see '/*' and try to match it as a bracketed comment. - If the next character is '+', it should be parsed as hint later, and we cannot match - it as a bracketed comment. - - Returns true if the next character is '+'. - """ - nextChar = self._input.LA(1) - if nextChar == '+': - return True - else: - return False -} - -singleStatement - : statement ';'* EOF - ; - -singleExpression - : namedExpression EOF - ; - -singleTableIdentifier - : tableIdentifier EOF - ; - -singleMultipartIdentifier - : multipartIdentifier EOF - ; - -singleFunctionIdentifier - : functionIdentifier EOF - ; - -singleDataType - : dataType EOF - ; - -singleTableSchema - : colTypeList EOF - ; - -statement - : query #statementDefault - | ctes? dmlStatementNoWith #dmlStatement - | USE NAMESPACE? multipartIdentifier #use - | CREATE namespace (IF NOT EXISTS)? multipartIdentifier - (commentSpec | - locationSpec | - (WITH (DBPROPERTIES | PROPERTIES) tablePropertyList))* #createNamespace - | ALTER namespace multipartIdentifier - SET (DBPROPERTIES | PROPERTIES) tablePropertyList #setNamespaceProperties - | ALTER namespace multipartIdentifier - SET locationSpec #setNamespaceLocation - | DROP namespace (IF EXISTS)? multipartIdentifier - (RESTRICT | CASCADE)? #dropNamespace - | SHOW (DATABASES | NAMESPACES) ((FROM | IN) multipartIdentifier)? - (LIKE? pattern=STRING)? #showNamespaces - | {not self.legacy_create_hive_table_by_default_enabled}? - createTableHeader ('(' colTypeList ')')? tableProvider? - createTableClauses - (AS? query)? #createTable - | {self.legacy_create_hive_table_by_default_enabled}? - createTableHeader ('(' colTypeList ')')? tableProvider - createTableClauses - (AS? query)? #createTable - | createTableHeader ('(' columns=colTypeList ')')? - (commentSpec | - (PARTITIONED BY '(' partitionColumns=colTypeList ')' | - PARTITIONED BY partitionColumnNames=identifierList) | - bucketSpec | - skewSpec | - rowFormat | - createFileFormat | - locationSpec | - (TBLPROPERTIES tableProps=tablePropertyList))* - (AS? query)? #createHiveTable - | CREATE TABLE (IF NOT EXISTS)? target=tableIdentifier - LIKE source=tableIdentifier - (tableProvider | - rowFormat | - createFileFormat | - locationSpec | - (TBLPROPERTIES tableProps=tablePropertyList))* #createTableLike - | replaceTableHeader ('(' colTypeList ')')? tableProvider - createTableClauses - (AS? query)? #replaceTable - | ANALYZE TABLE multipartIdentifier partitionSpec? COMPUTE STATISTICS - (identifier | FOR COLUMNS identifierSeq | FOR ALL COLUMNS)? #analyze - | ALTER TABLE multipartIdentifier - ADD (COLUMN | COLUMNS) - columns=qualifiedColTypeWithPositionList #addTableColumns - | ALTER TABLE multipartIdentifier - ADD (COLUMN | COLUMNS) - '(' columns=qualifiedColTypeWithPositionList ')' #addTableColumns - | ALTER TABLE table=multipartIdentifier - RENAME COLUMN - from_=multipartIdentifier TO to=errorCapturingIdentifier #renameTableColumn - | ALTER TABLE multipartIdentifier - DROP (COLUMN | COLUMNS) - '(' columns=multipartIdentifierList ')' #dropTableColumns - | ALTER TABLE multipartIdentifier - DROP (COLUMN | COLUMNS) columns=multipartIdentifierList #dropTableColumns - | ALTER (TABLE | VIEW) from_=multipartIdentifier - RENAME TO to=multipartIdentifier #renameTable - | ALTER (TABLE | VIEW) multipartIdentifier - SET TBLPROPERTIES tablePropertyList #setTableProperties - | ALTER (TABLE | VIEW) multipartIdentifier - UNSET TBLPROPERTIES (IF EXISTS)? tablePropertyList #unsetTableProperties - | ALTER TABLE table=multipartIdentifier - (ALTER | CHANGE) COLUMN? column=multipartIdentifier - alterColumnAction? #alterTableAlterColumn - | ALTER TABLE table=multipartIdentifier partitionSpec? - CHANGE COLUMN? - colName=multipartIdentifier colType colPosition? #hiveChangeColumn - | ALTER TABLE table=multipartIdentifier partitionSpec? - REPLACE COLUMNS - '(' columns=qualifiedColTypeWithPositionList ')' #hiveReplaceColumns - | ALTER TABLE multipartIdentifier (partitionSpec)? - SET SERDE STRING (WITH SERDEPROPERTIES tablePropertyList)? #setTableSerDe - | ALTER TABLE multipartIdentifier (partitionSpec)? - SET SERDEPROPERTIES tablePropertyList #setTableSerDe - | ALTER (TABLE | VIEW) multipartIdentifier ADD (IF NOT EXISTS)? - partitionSpecLocation+ #addTablePartition - | ALTER TABLE multipartIdentifier - from_=partitionSpec RENAME TO to=partitionSpec #renameTablePartition - | ALTER (TABLE | VIEW) multipartIdentifier - DROP (IF EXISTS)? partitionSpec (',' partitionSpec)* PURGE? #dropTablePartitions - | ALTER TABLE multipartIdentifier - (partitionSpec)? SET locationSpec #setTableLocation - | ALTER TABLE multipartIdentifier RECOVER PARTITIONS #recoverPartitions - | DROP TABLE (IF EXISTS)? multipartIdentifier PURGE? #dropTable - | DROP VIEW (IF EXISTS)? multipartIdentifier #dropView - | CREATE (OR REPLACE)? (GLOBAL? TEMPORARY)? - VIEW (IF NOT EXISTS)? multipartIdentifier - identifierCommentList? - (commentSpec | - (PARTITIONED ON identifierList) | - (TBLPROPERTIES tablePropertyList))* - AS query #createView - | CREATE (OR REPLACE)? GLOBAL? TEMPORARY VIEW - tableIdentifier ('(' colTypeList ')')? tableProvider - (OPTIONS tablePropertyList)? #createTempViewUsing - | ALTER VIEW multipartIdentifier AS? query #alterViewQuery - | CREATE (OR REPLACE)? TEMPORARY? FUNCTION (IF NOT EXISTS)? - multipartIdentifier AS className=STRING - (USING resource (',' resource)*)? #createFunction - | DROP TEMPORARY? FUNCTION (IF EXISTS)? multipartIdentifier #dropFunction - | EXPLAIN (LOGICAL | FORMATTED | EXTENDED | CODEGEN | COST)? - statement #explain - | SHOW TABLES ((FROM | IN) multipartIdentifier)? - (LIKE? pattern=STRING)? #showTables - | SHOW TABLE EXTENDED ((FROM | IN) ns=multipartIdentifier)? - LIKE pattern=STRING partitionSpec? #showTable - | SHOW TBLPROPERTIES table=multipartIdentifier - ('(' key=tablePropertyKey ')')? #showTblProperties - | SHOW COLUMNS (FROM | IN) table=multipartIdentifier - ((FROM | IN) ns=multipartIdentifier)? #showColumns - | SHOW VIEWS ((FROM | IN) multipartIdentifier)? - (LIKE? pattern=STRING)? #showViews - | SHOW PARTITIONS multipartIdentifier partitionSpec? #showPartitions - | SHOW identifier? FUNCTIONS - (LIKE? (multipartIdentifier | pattern=STRING))? #showFunctions - | SHOW CREATE TABLE multipartIdentifier (AS SERDE)? #showCreateTable - | SHOW CURRENT NAMESPACE #showCurrentNamespace - | (DESC | DESCRIBE) FUNCTION EXTENDED? describeFuncName #describeFunction - | (DESC | DESCRIBE) namespace EXTENDED? - multipartIdentifier #describeNamespace - | (DESC | DESCRIBE) TABLE? option=(EXTENDED | FORMATTED)? - multipartIdentifier partitionSpec? describeColName? #describeRelation - | (DESC | DESCRIBE) QUERY? query #describeQuery - | COMMENT ON namespace multipartIdentifier IS - comment=(STRING | NULL) #commentNamespace - | COMMENT ON TABLE multipartIdentifier IS comment=(STRING | NULL) #commentTable - | REFRESH TABLE multipartIdentifier #refreshTable - | REFRESH (STRING | .*?) #refreshResource - | CACHE LAZY? TABLE multipartIdentifier - (OPTIONS options=tablePropertyList)? (AS? query)? #cacheTable - | UNCACHE TABLE (IF EXISTS)? multipartIdentifier #uncacheTable - | CLEAR CACHE #clearCache - | LOAD DATA LOCAL? INPATH path=STRING OVERWRITE? INTO TABLE - multipartIdentifier partitionSpec? #loadData - | TRUNCATE TABLE multipartIdentifier partitionSpec? #truncateTable - | MSCK REPAIR TABLE multipartIdentifier #repairTable - | op=(ADD | LIST) identifier (STRING | .*?) #manageResource - | SET ROLE .*? #failNativeCommand - | SET .*? #setConfiguration - | RESET #resetConfiguration - | unsupportedHiveNativeCommands .*? #failNativeCommand - ; - -unsupportedHiveNativeCommands - : kw1=CREATE kw2=ROLE - | kw1=DROP kw2=ROLE - | kw1=GRANT kw2=ROLE? - | kw1=REVOKE kw2=ROLE? - | kw1=SHOW kw2=GRANT - | kw1=SHOW kw2=ROLE kw3=GRANT? - | kw1=SHOW kw2=PRINCIPALS - | kw1=SHOW kw2=ROLES - | kw1=SHOW kw2=CURRENT kw3=ROLES - | kw1=EXPORT kw2=TABLE - | kw1=IMPORT kw2=TABLE - | kw1=SHOW kw2=COMPACTIONS - | kw1=SHOW kw2=CREATE kw3=TABLE - | kw1=SHOW kw2=TRANSACTIONS - | kw1=SHOW kw2=INDEXES - | kw1=SHOW kw2=LOCKS - | kw1=CREATE kw2=INDEX - | kw1=DROP kw2=INDEX - | kw1=ALTER kw2=INDEX - | kw1=LOCK kw2=TABLE - | kw1=LOCK kw2=DATABASE - | kw1=UNLOCK kw2=TABLE - | kw1=UNLOCK kw2=DATABASE - | kw1=CREATE kw2=TEMPORARY kw3=MACRO - | kw1=DROP kw2=TEMPORARY kw3=MACRO - | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=CLUSTERED - | kw1=ALTER kw2=TABLE tableIdentifier kw3=CLUSTERED kw4=BY - | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SORTED - | kw1=ALTER kw2=TABLE tableIdentifier kw3=SKEWED kw4=BY - | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=SKEWED - | kw1=ALTER kw2=TABLE tableIdentifier kw3=NOT kw4=STORED kw5=AS kw6=DIRECTORIES - | kw1=ALTER kw2=TABLE tableIdentifier kw3=SET kw4=SKEWED kw5=LOCATION - | kw1=ALTER kw2=TABLE tableIdentifier kw3=EXCHANGE kw4=PARTITION - | kw1=ALTER kw2=TABLE tableIdentifier kw3=ARCHIVE kw4=PARTITION - | kw1=ALTER kw2=TABLE tableIdentifier kw3=UNARCHIVE kw4=PARTITION - | kw1=ALTER kw2=TABLE tableIdentifier kw3=TOUCH - | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=COMPACT - | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=CONCATENATE - | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=SET kw4=FILEFORMAT - | kw1=ALTER kw2=TABLE tableIdentifier partitionSpec? kw3=REPLACE kw4=COLUMNS - | kw1=START kw2=TRANSACTION - | kw1=COMMIT - | kw1=ROLLBACK - | kw1=DFS - ; - -createTableHeader - : CREATE TEMPORARY? EXTERNAL? TABLE (IF NOT EXISTS)? multipartIdentifier - ; - -replaceTableHeader - : (CREATE OR)? REPLACE TABLE multipartIdentifier - ; - -bucketSpec - : CLUSTERED BY identifierList - (SORTED BY orderedIdentifierList)? - INTO INTEGER_VALUE BUCKETS - ; - -skewSpec - : SKEWED BY identifierList - ON (constantList | nestedConstantList) - (STORED AS DIRECTORIES)? - ; - -locationSpec - : LOCATION STRING - ; - -commentSpec - : COMMENT STRING - ; - -query - : ctes? queryTerm queryOrganization - ; - -insertInto - : INSERT OVERWRITE TABLE? multipartIdentifier (partitionSpec (IF NOT EXISTS)?)? #insertOverwriteTable - | INSERT INTO TABLE? multipartIdentifier partitionSpec? (IF NOT EXISTS)? #insertIntoTable - | INSERT OVERWRITE LOCAL? DIRECTORY path=STRING rowFormat? createFileFormat? #insertOverwriteHiveDir - | INSERT OVERWRITE LOCAL? DIRECTORY (path=STRING)? tableProvider (OPTIONS options=tablePropertyList)? #insertOverwriteDir - ; - -partitionSpecLocation - : partitionSpec locationSpec? - ; - -partitionSpec - : PARTITION '(' partitionVal (',' partitionVal)* ')' - ; - -partitionVal - : identifier (EQ constant)? - ; - -namespace - : NAMESPACE - | DATABASE - | SCHEMA - ; - -describeFuncName - : qualifiedName - | STRING - | comparisonOperator - | arithmeticOperator - | predicateOperator - ; - -describeColName - : nameParts+=identifier ('.' nameParts+=identifier)* - ; - -ctes - : WITH namedQuery (',' namedQuery)* - ; - -namedQuery - : name=errorCapturingIdentifier (columnAliases=identifierList)? AS? '(' query ')' - ; - -tableProvider - : USING multipartIdentifier - ; - -createTableClauses - :((OPTIONS options=tablePropertyList) | - (PARTITIONED BY partitioning=transformList) | - bucketSpec | - locationSpec | - commentSpec | - (TBLPROPERTIES tableProps=tablePropertyList))* - ; - -tablePropertyList - : '(' tableProperty (',' tableProperty)* ')' - ; - -tableProperty - : key=tablePropertyKey (EQ? value=tablePropertyValue)? - ; - -tablePropertyKey - : identifier ('.' identifier)* - | STRING - ; - -tablePropertyValue - : INTEGER_VALUE - | DECIMAL_VALUE - | booleanValue - | STRING - ; - -constantList - : '(' constant (',' constant)* ')' - ; - -nestedConstantList - : '(' constantList (',' constantList)* ')' - ; - -createFileFormat - : STORED AS fileFormat - | STORED BY storageHandler - ; - -fileFormat - : INPUTFORMAT inFmt=STRING OUTPUTFORMAT outFmt=STRING #tableFileFormat - | identifier #genericFileFormat - ; - -storageHandler - : STRING (WITH SERDEPROPERTIES tablePropertyList)? - ; - -resource - : identifier STRING - ; - -dmlStatementNoWith - : insertInto queryTerm queryOrganization #singleInsertQuery - | fromClause multiInsertQueryBody+ #multiInsertQuery - | DELETE FROM multipartIdentifier tableAlias whereClause? #deleteFromTable - | UPDATE multipartIdentifier tableAlias setClause whereClause? #updateTable - | MERGE INTO target=multipartIdentifier targetAlias=tableAlias - USING (source=multipartIdentifier | - '(' sourceQuery=query')') sourceAlias=tableAlias - ON mergeCondition=booleanExpression - matchedClause* - notMatchedClause* #mergeIntoTable - ; - -queryOrganization - : (ORDER BY order+=sortItem (',' order+=sortItem)*)? - (CLUSTER BY clusterBy+=expression (',' clusterBy+=expression)*)? - (DISTRIBUTE BY distributeBy+=expression (',' distributeBy+=expression)*)? - (SORT BY sort+=sortItem (',' sort+=sortItem)*)? - windowClause? - (LIMIT (ALL | limit=expression))? - ; - -multiInsertQueryBody - : insertInto fromStatementBody - ; - -queryTerm - : queryPrimary #queryTermDefault - | left=queryTerm {self.legacy_setops_precedence_enbled}? - operator=(INTERSECT | UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation - | left=queryTerm {not self.legacy_setops_precedence_enbled}? - operator=INTERSECT setQuantifier? right=queryTerm #setOperation - | left=queryTerm {not self.legacy_setops_precedence_enbled}? - operator=(UNION | EXCEPT | SETMINUS) setQuantifier? right=queryTerm #setOperation - ; - -queryPrimary - : querySpecification #queryPrimaryDefault - | fromStatement #fromStmt - | TABLE multipartIdentifier #table - | inlineTable #inlineTableDefault1 - | '(' query ')' #subquery - ; - -sortItem - : expression ordering=(ASC | DESC)? (NULLS nullOrder=(LAST | FIRST))? - ; - -fromStatement - : fromClause fromStatementBody+ - ; - -fromStatementBody - : transformClause - whereClause? - queryOrganization - | selectClause - lateralView* - whereClause? - aggregationClause? - havingClause? - windowClause? - queryOrganization - ; - -querySpecification - : transformClause - fromClause? - whereClause? #transformQuerySpecification - | selectClause - fromClause? - lateralView* - whereClause? - aggregationClause? - havingClause? - windowClause? #regularQuerySpecification - ; - -transformClause - : (SELECT kind=TRANSFORM '(' namedExpressionSeq ')' - | kind=MAP namedExpressionSeq - | kind=REDUCE namedExpressionSeq) - inRowFormat=rowFormat? - (RECORDWRITER recordWriter=STRING)? - USING script=STRING - (AS (identifierSeq | colTypeList | ('(' (identifierSeq | colTypeList) ')')))? - outRowFormat=rowFormat? - (RECORDREADER recordReader=STRING)? - ; - -selectClause - : SELECT (hints+=hint)* setQuantifier? namedExpressionSeq - ; - -setClause - : SET assignmentList - ; - -matchedClause - : WHEN MATCHED (AND matchedCond=booleanExpression)? THEN matchedAction - ; -notMatchedClause - : WHEN NOT MATCHED (AND notMatchedCond=booleanExpression)? THEN notMatchedAction - ; - -matchedAction - : DELETE - | UPDATE SET ASTERISK - | UPDATE SET assignmentList - ; - -notMatchedAction - : INSERT ASTERISK - | INSERT '(' columns=multipartIdentifierList ')' - VALUES '(' expression (',' expression)* ')' - ; - -assignmentList - : assignment (',' assignment)* - ; - -assignment - : key=multipartIdentifier EQ value=expression - ; - -whereClause - : WHERE booleanExpression - ; - -havingClause - : HAVING booleanExpression - ; - -hint - : '/*+' hintStatements+=hintStatement (','? hintStatements+=hintStatement)* '*/' - ; - -hintStatement - : hintName=identifier - | hintName=identifier '(' parameters+=primaryExpression (',' parameters+=primaryExpression)* ')' - ; - -fromClause - : FROM relation (',' relation)* lateralView* pivotClause? - ; - -aggregationClause - : GROUP BY groupingExpressions+=expression (',' groupingExpressions+=expression)* ( - WITH kind=ROLLUP - | WITH kind=CUBE - | kind=GROUPING SETS '(' groupingSet (',' groupingSet)* ')')? - | GROUP BY kind=GROUPING SETS '(' groupingSet (',' groupingSet)* ')' - ; - -groupingSet - : '(' (expression (',' expression)*)? ')' - | expression - ; - -pivotClause - : PIVOT '(' aggregates=namedExpressionSeq FOR pivotColumn IN '(' pivotValues+=pivotValue (',' pivotValues+=pivotValue)* ')' ')' - ; - -pivotColumn - : identifiers+=identifier - | '(' identifiers+=identifier (',' identifiers+=identifier)* ')' - ; - -pivotValue - : expression (AS? identifier)? - ; - -lateralView - : LATERAL VIEW (OUTER)? qualifiedName '(' (expression (',' expression)*)? ')' tblName=identifier (AS? colName+=identifier (',' colName+=identifier)*)? - ; - -setQuantifier - : DISTINCT - | ALL - ; - -relation - : relationPrimary joinRelation* - ; - -joinRelation - : (joinType) JOIN right=relationPrimary joinCriteria? - | NATURAL joinType JOIN right=relationPrimary - ; - -joinType - : INNER? - | CROSS - | LEFT OUTER? - | LEFT? SEMI - | RIGHT OUTER? - | FULL OUTER? - | LEFT? ANTI - ; - -joinCriteria - : ON booleanExpression - | USING identifierList - ; - -sample - : TABLESAMPLE '(' sampleMethod? ')' - ; - -sampleMethod - : negativeSign=MINUS? percentage=(INTEGER_VALUE | DECIMAL_VALUE) PERCENTLIT #sampleByPercentile - | expression ROWS #sampleByRows - | sampleType=BUCKET numerator=INTEGER_VALUE OUT OF denominator=INTEGER_VALUE - (ON (identifier | qualifiedName '(' ')'))? #sampleByBucket - | bytes=expression #sampleByBytes - ; - -identifierList - : '(' identifierSeq ')' - ; - -identifierSeq - : ident+=errorCapturingIdentifier (',' ident+=errorCapturingIdentifier)* - ; - -orderedIdentifierList - : '(' orderedIdentifier (',' orderedIdentifier)* ')' - ; - -orderedIdentifier - : ident=errorCapturingIdentifier ordering=(ASC | DESC)? - ; - -identifierCommentList - : '(' identifierComment (',' identifierComment)* ')' - ; - -identifierComment - : identifier commentSpec? - ; - -relationPrimary - : multipartIdentifier sample? tableAlias #tableName - | '(' query ')' sample? tableAlias #aliasedQuery - | '(' relation ')' sample? tableAlias #aliasedRelation - | inlineTable #inlineTableDefault2 - | functionTable #tableValuedFunction - ; - -inlineTable - : VALUES expression (',' expression)* tableAlias - ; - -functionTable - : funcName=errorCapturingIdentifier '(' (expression (',' expression)*)? ')' tableAlias - ; - -tableAlias - : (AS? strictIdentifier identifierList?)? - ; - -rowFormat - : ROW FORMAT SERDE name=STRING (WITH SERDEPROPERTIES props=tablePropertyList)? #rowFormatSerde - | ROW FORMAT DELIMITED - (FIELDS TERMINATED BY fieldsTerminatedBy=STRING (ESCAPED BY escapedBy=STRING)?)? - (COLLECTION ITEMS TERMINATED BY collectionItemsTerminatedBy=STRING)? - (MAP KEYS TERMINATED BY keysTerminatedBy=STRING)? - (LINES TERMINATED BY linesSeparatedBy=STRING)? - (NULL DEFINED AS nullDefinedAs=STRING)? #rowFormatDelimited - ; - -multipartIdentifierList - : multipartIdentifier (',' multipartIdentifier)* - ; - -multipartIdentifier - : parts+=errorCapturingIdentifier ('.' parts+=errorCapturingIdentifier)* - ; - -tableIdentifier - : (db=errorCapturingIdentifier '.')? table=errorCapturingIdentifier - ; - -functionIdentifier - : (db=errorCapturingIdentifier '.')? function=errorCapturingIdentifier - ; - -namedExpression - : expression (AS? (name=errorCapturingIdentifier | identifierList))? - ; - -namedExpressionSeq - : namedExpression (',' namedExpression)* - ; - -transformList - : '(' transforms+=transform (',' transforms+=transform)* ')' - ; - -transform - : qualifiedName #identityTransform - | transformName=identifier - '(' argument+=transformArgument (',' argument+=transformArgument)* ')' #applyTransform - ; - -transformArgument - : qualifiedName - | constant - ; - -expression - : booleanExpression - ; - -booleanExpression - : NOT booleanExpression #logicalNot - | EXISTS '(' query ')' #exists - | valueExpression predicate? #predicated - | left=booleanExpression operator=AND right=booleanExpression #logicalBinary - | left=booleanExpression operator=OR right=booleanExpression #logicalBinary - ; - -predicate - : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression - | NOT? kind=IN '(' expression (',' expression)* ')' - | NOT? kind=IN '(' query ')' - | NOT? kind=RLIKE pattern=valueExpression - | NOT? kind=LIKE quantifier=(ANY | SOME | ALL) ('('')' | '(' expression (',' expression)* ')') - | NOT? kind=LIKE pattern=valueExpression (ESCAPE escapeChar=STRING)? - | IS NOT? kind=NULL - | IS NOT? kind=(TRUE | FALSE | UNKNOWN) - | IS NOT? kind=DISTINCT FROM right=valueExpression - ; - -valueExpression - : primaryExpression #valueExpressionDefault - | operator=(MINUS | PLUS | TILDE) valueExpression #arithmeticUnary - | left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary - | left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression #arithmeticBinary - | left=valueExpression operator=AMPERSAND right=valueExpression #arithmeticBinary - | left=valueExpression operator=HAT right=valueExpression #arithmeticBinary - | left=valueExpression operator=PIPE right=valueExpression #arithmeticBinary - | left=valueExpression comparisonOperator right=valueExpression #comparison - ; - -primaryExpression - : name=(CURRENT_DATE | CURRENT_TIMESTAMP) #currentDatetime - | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase - | CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase - | CAST '(' expression AS dataType ')' #cast - | STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct - | FIRST '(' expression (IGNORE NULLS)? ')' #first - | LAST '(' expression (IGNORE NULLS)? ')' #last - | POSITION '(' substr=valueExpression IN str=valueExpression ')' #position - | constant #constantDefault - | ASTERISK #star - | qualifiedName '.' ASTERISK #star - | '(' namedExpression (',' namedExpression)+ ')' #rowConstructor - | '(' query ')' #subqueryExpression - | functionName '(' (setQuantifier? argument+=expression (',' argument+=expression)*)? ')' - (FILTER '(' WHERE where=booleanExpression ')')? (OVER windowSpec)? #functionCall - | identifier '->' expression #lambda - | '(' identifier (',' identifier)+ ')' '->' expression #lambda - | value=primaryExpression '[' index=valueExpression ']' #subscript - | identifier #columnReference - | base=primaryExpression '.' fieldName=identifier #dereference - | '(' expression ')' #parenthesizedExpression - | EXTRACT '(' field=identifier FROM source=valueExpression ')' #extract - | (SUBSTR | SUBSTRING) '(' str=valueExpression (FROM | ',') pos=valueExpression - ((FOR | ',') len=valueExpression)? ')' #substring - | TRIM '(' trimOption=(BOTH | LEADING | TRAILING)? (trimStr=valueExpression)? - FROM srcStr=valueExpression ')' #trim - | OVERLAY '(' input=valueExpression PLACING replace=valueExpression - FROM position=valueExpression (FOR length=valueExpression)? ')' #overlay - ; - -constant - : NULL #nullLiteral - | interval #intervalLiteral - | identifier STRING #typeConstructor - | number #numericLiteral - | booleanValue #booleanLiteral - | STRING+ #stringLiteral - ; - -comparisonOperator - : EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ - ; - -arithmeticOperator - : PLUS | MINUS | ASTERISK | SLASH | PERCENT | DIV | TILDE | AMPERSAND | PIPE | CONCAT_PIPE | HAT - ; - -predicateOperator - : OR | AND | IN | NOT - ; - -booleanValue - : TRUE | FALSE - ; - -interval - : INTERVAL (errorCapturingMultiUnitsInterval | errorCapturingUnitToUnitInterval)? - ; - -errorCapturingMultiUnitsInterval - : multiUnitsInterval unitToUnitInterval? - ; - -multiUnitsInterval - : (intervalValue intervalUnit)+ - ; - -errorCapturingUnitToUnitInterval - : body=unitToUnitInterval (error1=multiUnitsInterval | error2=unitToUnitInterval)? - ; - -unitToUnitInterval - : value=intervalValue from_=intervalUnit TO to=intervalUnit - ; - -intervalValue - : (PLUS | MINUS)? (INTEGER_VALUE | DECIMAL_VALUE) - | STRING - ; - -intervalUnit - : DAY - | HOUR - | MINUTE - | MONTH - | SECOND - | YEAR - | identifier - ; - -colPosition - : position=FIRST | position=AFTER afterCol=errorCapturingIdentifier - ; - -dataType - : complex=ARRAY '<' dataType '>' #complexDataType - | complex=MAP '<' dataType ',' dataType '>' #complexDataType - | complex=STRUCT ('<' complexColTypeList? '>' | NEQ) #complexDataType - | identifier ('(' INTEGER_VALUE (',' INTEGER_VALUE)* ')')? #primitiveDataType - ; - -qualifiedColTypeWithPositionList - : qualifiedColTypeWithPosition (',' qualifiedColTypeWithPosition)* - ; - -qualifiedColTypeWithPosition - : name=multipartIdentifier dataType (NOT NULL)? commentSpec? colPosition? - ; - -colTypeList - : colType (',' colType)* - ; - -colType - : colName=errorCapturingIdentifier dataType (NOT NULL)? commentSpec? - ; - -complexColTypeList - : complexColType (',' complexColType)* - ; - -complexColType - : identifier ':' dataType (NOT NULL)? commentSpec? - ; - -whenClause - : WHEN condition=expression THEN result=expression - ; - -windowClause - : WINDOW namedWindow (',' namedWindow)* - ; - -namedWindow - : name=errorCapturingIdentifier AS windowSpec - ; - -windowSpec - : name=errorCapturingIdentifier #windowRef - | '('name=errorCapturingIdentifier')' #windowRef - | '(' - ( CLUSTER BY partition+=expression (',' partition+=expression)* - | ((PARTITION | DISTRIBUTE) BY partition+=expression (',' partition+=expression)*)? - ((ORDER | SORT) BY sortItem (',' sortItem)*)?) - windowFrame? - ')' #windowDef - ; - -windowFrame - : frameType=RANGE start=frameBound - | frameType=ROWS start=frameBound - | frameType=RANGE BETWEEN start=frameBound AND end=frameBound - | frameType=ROWS BETWEEN start=frameBound AND end=frameBound - ; - -frameBound - : UNBOUNDED boundType=(PRECEDING | FOLLOWING) - | boundType=CURRENT ROW - | expression boundType=(PRECEDING | FOLLOWING) - ; - -qualifiedNameList - : qualifiedName (',' qualifiedName)* - ; - -functionName - : qualifiedName - | FILTER - | LEFT - | RIGHT - ; - -qualifiedName - : identifier ('.' identifier)* - ; - -// this rule is used for explicitly capturing wrong identifiers such as test-table, which should actually be `test-table` -// replace identifier with errorCapturingIdentifier where the immediate follow symbol is not an expression, otherwise -// valid expressions such as "a-b" can be recognized as an identifier -errorCapturingIdentifier - : identifier errorCapturingIdentifierExtra - ; - -// extra left-factoring grammar -errorCapturingIdentifierExtra - : (MINUS identifier)+ #errorIdent - | #realIdent - ; - -identifier - : strictIdentifier - | {not self.SQL_standard_keyword_behavior}? strictNonReserved - ; - -strictIdentifier - : IDENTIFIER #unquotedIdentifier - | quotedIdentifier #quotedIdentifierAlternative - | {self.SQL_standard_keyword_behavior}? ansiNonReserved #unquotedIdentifier - | {not self.SQL_standard_keyword_behavior}? nonReserved #unquotedIdentifier - ; - -quotedIdentifier - : BACKQUOTED_IDENTIFIER - ; - -number - : {not self.legacy_exponent_literal_as_decimal_enabled}? MINUS? EXPONENT_VALUE #exponentLiteral - | {not self.legacy_exponent_literal_as_decimal_enabled}? MINUS? DECIMAL_VALUE #decimalLiteral - | {self.legacy_exponent_literal_as_decimal_enabled}? MINUS? (EXPONENT_VALUE | DECIMAL_VALUE) #legacyDecimalLiteral - | MINUS? INTEGER_VALUE #integerLiteral - | MINUS? BIGINT_LITERAL #bigIntLiteral - | MINUS? SMALLINT_LITERAL #smallIntLiteral - | MINUS? TINYINT_LITERAL #tinyIntLiteral - | MINUS? DOUBLE_LITERAL #doubleLiteral - | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral - ; - -alterColumnAction - : TYPE dataType - | commentSpec - | colPosition - | setOrDrop=(SET | DROP) NOT NULL - ; - -// When `SQL_standard_keyword_behavior=true`, there are 2 kinds of keywords in Spark SQL. -// - Reserved keywords: -// Keywords that are reserved and can't be used as identifiers for table, view, column, -// function, alias, etc. -// - Non-reserved keywords: -// Keywords that have a special meaning only in particular contexts and can be used as -// identifiers in other contexts. For example, `EXPLAIN SELECT ...` is a command, but EXPLAIN -// can be used as identifiers in other places. -// You can find the full keywords list by searching "Start of the keywords list" in this file. -// The non-reserved keywords are listed below. Keywords not in this list are reserved keywords. -ansiNonReserved - : ADD - | AFTER - | ALTER - | ANALYZE - | ARCHIVE - | ARRAY - | ASC - | AT - | BETWEEN - | BUCKET - | BUCKETS - | BY - | CACHE - | CASCADE - | CHANGE - | CLEAR - | CLUSTER - | CLUSTERED - | CODEGEN - | COLLECTION - | COLUMNS - | COMMENT - | COMMIT - | COMPACT - | COMPACTIONS - | COMPUTE - | CONCATENATE - | COST - | CUBE - | CURRENT - | DATA - | DATABASE - | DATABASES - | DBPROPERTIES - | DEFINED - | DELETE - | DELIMITED - | DESC - | DESCRIBE - | DFS - | DIRECTORIES - | DIRECTORY - | DISTRIBUTE - | DIV - | DROP - | ESCAPED - | EXCHANGE - | EXISTS - | EXPLAIN - | EXPORT - | EXTENDED - | EXTERNAL - | EXTRACT - | FIELDS - | FILEFORMAT - | FIRST - | FOLLOWING - | FORMAT - | FORMATTED - | FUNCTION - | FUNCTIONS - | GLOBAL - | GROUPING - | IF - | IGNORE - | IMPORT - | INDEX - | INDEXES - | INPATH - | INPUTFORMAT - | INSERT - | INTERVAL - | ITEMS - | KEYS - | LAST - | LATERAL - | LAZY - | LIKE - | LIMIT - | LINES - | LIST - | LOAD - | LOCAL - | LOCATION - | LOCK - | LOCKS - | LOGICAL - | MACRO - | MAP - | MATCHED - | MERGE - | MSCK - | NAMESPACE - | NAMESPACES - | NO - | NULLS - | OF - | OPTION - | OPTIONS - | OUT - | OUTPUTFORMAT - | OVER - | OVERLAY - | OVERWRITE - | PARTITION - | PARTITIONED - | PARTITIONS - | PERCENTLIT - | PIVOT - | PLACING - | POSITION - | PRECEDING - | PRINCIPALS - | PROPERTIES - | PURGE - | QUERY - | RANGE - | RECORDREADER - | RECORDWRITER - | RECOVER - | REDUCE - | REFRESH - | RENAME - | REPAIR - | REPLACE - | RESET - | RESTRICT - | REVOKE - | RLIKE - | ROLE - | ROLES - | ROLLBACK - | ROLLUP - | ROW - | ROWS - | SCHEMA - | SEPARATED - | SERDE - | SERDEPROPERTIES - | SET - | SETS - | SHOW - | SKEWED - | SORT - | SORTED - | START - | STATISTICS - | STORED - | STRATIFY - | STRUCT - | SUBSTR - | SUBSTRING - | TABLES - | TABLESAMPLE - | TBLPROPERTIES - | TEMPORARY - | TERMINATED - | TOUCH - | TRANSACTION - | TRANSACTIONS - | TRANSFORM - | TRIM - | TRUE - | TRUNCATE - | UNARCHIVE - | UNBOUNDED - | UNCACHE - | UNLOCK - | UNSET - | UPDATE - | USE - | VALUES - | VIEW - | VIEWS - | WINDOW - ; - -// When `SQL_standard_keyword_behavior=false`, there are 2 kinds of keywords in Spark SQL. -// - Non-reserved keywords: -// Same definition as the one when `SQL_standard_keyword_behavior=true`. -// - Strict-non-reserved keywords: -// A strict version of non-reserved keywords, which can not be used as table alias. -// You can find the full keywords list by searching "Start of the keywords list" in this file. -// The strict-non-reserved keywords are listed in `strictNonReserved`. -// The non-reserved keywords are listed in `nonReserved`. -// These 2 together contain all the keywords. -strictNonReserved - : ANTI - | CROSS - | EXCEPT - | FULL - | INNER - | INTERSECT - | JOIN - | LEFT - | NATURAL - | ON - | RIGHT - | SEMI - | SETMINUS - | UNION - | USING - ; - -nonReserved - : ADD - | AFTER - | ALL - | ALTER - | ANALYZE - | AND - | ANY - | ARCHIVE - | ARRAY - | AS - | ASC - | AT - | AUTHORIZATION - | BETWEEN - | BOTH - | BUCKET - | BUCKETS - | BY - | CACHE - | CASCADE - | CASE - | CAST - | CHANGE - | CHECK - | CLEAR - | CLUSTER - | CLUSTERED - | CODEGEN - | COLLATE - | COLLECTION - | COLUMN - | COLUMNS - | COMMENT - | COMMIT - | COMPACT - | COMPACTIONS - | COMPUTE - | CONCATENATE - | CONSTRAINT - | COST - | CREATE - | CUBE - | CURRENT - | CURRENT_DATE - | CURRENT_TIME - | CURRENT_TIMESTAMP - | CURRENT_USER - | DATA - | DATABASE - | DATABASES - | DAY - | DBPROPERTIES - | DEFINED - | DELETE - | DELIMITED - | DESC - | DESCRIBE - | DFS - | DIRECTORIES - | DIRECTORY - | DISTINCT - | DISTRIBUTE - | DIV - | DROP - | ELSE - | END - | ESCAPE - | ESCAPED - | EXCHANGE - | EXISTS - | EXPLAIN - | EXPORT - | EXTENDED - | EXTERNAL - | EXTRACT - | FALSE - | FETCH - | FILTER - | FIELDS - | FILEFORMAT - | FIRST - | FOLLOWING - | FOR - | FOREIGN - | FORMAT - | FORMATTED - | FROM - | FUNCTION - | FUNCTIONS - | GLOBAL - | GRANT - | GROUP - | GROUPING - | HAVING - | HOUR - | IF - | IGNORE - | IMPORT - | IN - | INDEX - | INDEXES - | INPATH - | INPUTFORMAT - | INSERT - | INTERVAL - | INTO - | IS - | ITEMS - | KEYS - | LAST - | LATERAL - | LAZY - | LEADING - | LIKE - | LIMIT - | LINES - | LIST - | LOAD - | LOCAL - | LOCATION - | LOCK - | LOCKS - | LOGICAL - | MACRO - | MAP - | MATCHED - | MERGE - | MINUTE - | MONTH - | MSCK - | NAMESPACE - | NAMESPACES - | NO - | NOT - | NULL - | NULLS - | OF - | ONLY - | OPTION - | OPTIONS - | OR - | ORDER - | OUT - | OUTER - | OUTPUTFORMAT - | OVER - | OVERLAPS - | OVERLAY - | OVERWRITE - | PARTITION - | PARTITIONED - | PARTITIONS - | PERCENTLIT - | PIVOT - | PLACING - | POSITION - | PRECEDING - | PRIMARY - | PRINCIPALS - | PROPERTIES - | PURGE - | QUERY - | RANGE - | RECORDREADER - | RECORDWRITER - | RECOVER - | REDUCE - | REFERENCES - | REFRESH - | RENAME - | REPAIR - | REPLACE - | RESET - | RESTRICT - | REVOKE - | RLIKE - | ROLE - | ROLES - | ROLLBACK - | ROLLUP - | ROW - | ROWS - | SCHEMA - | SECOND - | SELECT - | SEPARATED - | SERDE - | SERDEPROPERTIES - | SESSION_USER - | SET - | SETS - | SHOW - | SKEWED - | SOME - | SORT - | SORTED - | START - | STATISTICS - | STORED - | STRATIFY - | STRUCT - | SUBSTR - | SUBSTRING - | TABLE - | TABLES - | TABLESAMPLE - | TBLPROPERTIES - | TEMPORARY - | TERMINATED - | THEN - | TO - | TOUCH - | TRAILING - | TRANSACTION - | TRANSACTIONS - | TRANSFORM - | TRIM - | TRUE - | TRUNCATE - | TYPE - | UNARCHIVE - | UNBOUNDED - | UNCACHE - | UNIQUE - | UNKNOWN - | UNLOCK - | UNSET - | UPDATE - | USE - | USER - | VALUES - | VIEW - | VIEWS - | WHEN - | WHERE - | WINDOW - | WITH - | YEAR - ; - -// NOTE: If you add a new token in the list below, you should update the list of keywords -// in `docs/sql-keywords.md`. If the token is a non-reserved keyword, -// please update `ansiNonReserved` and `nonReserved` as well. - -//============================ -// Start of the keywords list -//============================ -ADD: 'ADD'; -AFTER: 'AFTER'; -ALL: 'ALL'; -ALTER: 'ALTER'; -ANALYZE: 'ANALYZE'; -AND: 'AND'; -ANTI: 'ANTI'; -ANY: 'ANY'; -ARCHIVE: 'ARCHIVE'; -ARRAY: 'ARRAY'; -AS: 'AS'; -ASC: 'ASC'; -AT: 'AT'; -AUTHORIZATION: 'AUTHORIZATION'; -BETWEEN: 'BETWEEN'; -BOTH: 'BOTH'; -BUCKET: 'BUCKET'; -BUCKETS: 'BUCKETS'; -BY: 'BY'; -CACHE: 'CACHE'; -CASCADE: 'CASCADE'; -CASE: 'CASE'; -CAST: 'CAST'; -CHANGE: 'CHANGE'; -CHECK: 'CHECK'; -CLEAR: 'CLEAR'; -CLUSTER: 'CLUSTER'; -CLUSTERED: 'CLUSTERED'; -CODEGEN: 'CODEGEN'; -COLLATE: 'COLLATE'; -COLLECTION: 'COLLECTION'; -COLUMN: 'COLUMN'; -COLUMNS: 'COLUMNS'; -COMMENT: 'COMMENT'; -COMMIT: 'COMMIT'; -COMPACT: 'COMPACT'; -COMPACTIONS: 'COMPACTIONS'; -COMPUTE: 'COMPUTE'; -CONCATENATE: 'CONCATENATE'; -CONSTRAINT: 'CONSTRAINT'; -COST: 'COST'; -CREATE: 'CREATE'; -CROSS: 'CROSS'; -CUBE: 'CUBE'; -CURRENT: 'CURRENT'; -CURRENT_DATE: 'CURRENT_DATE'; -CURRENT_TIME: 'CURRENT_TIME'; -CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; -CURRENT_USER: 'CURRENT_USER'; -DATA: 'DATA'; -DATABASE: 'DATABASE'; -DATABASES: 'DATABASES' | 'SCHEMAS'; -DAY: 'DAY'; -DBPROPERTIES: 'DBPROPERTIES'; -DEFINED: 'DEFINED'; -DELETE: 'DELETE'; -DELIMITED: 'DELIMITED'; -DESC: 'DESC'; -DESCRIBE: 'DESCRIBE'; -DFS: 'DFS'; -DIRECTORIES: 'DIRECTORIES'; -DIRECTORY: 'DIRECTORY'; -DISTINCT: 'DISTINCT'; -DISTRIBUTE: 'DISTRIBUTE'; -DROP: 'DROP'; -ELSE: 'ELSE'; -END: 'END'; -ESCAPE: 'ESCAPE'; -ESCAPED: 'ESCAPED'; -EXCEPT: 'EXCEPT'; -EXCHANGE: 'EXCHANGE'; -EXISTS: 'EXISTS'; -EXPLAIN: 'EXPLAIN'; -EXPORT: 'EXPORT'; -EXTENDED: 'EXTENDED'; -EXTERNAL: 'EXTERNAL'; -EXTRACT: 'EXTRACT'; -FALSE: 'FALSE'; -FETCH: 'FETCH'; -FIELDS: 'FIELDS'; -FILTER: 'FILTER'; -FILEFORMAT: 'FILEFORMAT'; -FIRST: 'FIRST'; -FOLLOWING: 'FOLLOWING'; -FOR: 'FOR'; -FOREIGN: 'FOREIGN'; -FORMAT: 'FORMAT'; -FORMATTED: 'FORMATTED'; -FROM: 'FROM'; -FULL: 'FULL'; -FUNCTION: 'FUNCTION'; -FUNCTIONS: 'FUNCTIONS'; -GLOBAL: 'GLOBAL'; -GRANT: 'GRANT'; -GROUP: 'GROUP'; -GROUPING: 'GROUPING'; -HAVING: 'HAVING'; -HOUR: 'HOUR'; -IF: 'IF'; -IGNORE: 'IGNORE'; -IMPORT: 'IMPORT'; -IN: 'IN'; -INDEX: 'INDEX'; -INDEXES: 'INDEXES'; -INNER: 'INNER'; -INPATH: 'INPATH'; -INPUTFORMAT: 'INPUTFORMAT'; -INSERT: 'INSERT'; -INTERSECT: 'INTERSECT'; -INTERVAL: 'INTERVAL'; -INTO: 'INTO'; -IS: 'IS'; -ITEMS: 'ITEMS'; -JOIN: 'JOIN'; -KEYS: 'KEYS'; -LAST: 'LAST'; -LATERAL: 'LATERAL'; -LAZY: 'LAZY'; -LEADING: 'LEADING'; -LEFT: 'LEFT'; -LIKE: 'LIKE'; -LIMIT: 'LIMIT'; -LINES: 'LINES'; -LIST: 'LIST'; -LOAD: 'LOAD'; -LOCAL: 'LOCAL'; -LOCATION: 'LOCATION'; -LOCK: 'LOCK'; -LOCKS: 'LOCKS'; -LOGICAL: 'LOGICAL'; -MACRO: 'MACRO'; -MAP: 'MAP'; -MATCHED: 'MATCHED'; -MERGE: 'MERGE'; -MINUTE: 'MINUTE'; -MONTH: 'MONTH'; -MSCK: 'MSCK'; -NAMESPACE: 'NAMESPACE'; -NAMESPACES: 'NAMESPACES'; -NATURAL: 'NATURAL'; -NO: 'NO'; -NOT: 'NOT' | '!'; -NULL: 'NULL'; -NULLS: 'NULLS'; -OF: 'OF'; -ON: 'ON'; -ONLY: 'ONLY'; -OPTION: 'OPTION'; -OPTIONS: 'OPTIONS'; -OR: 'OR'; -ORDER: 'ORDER'; -OUT: 'OUT'; -OUTER: 'OUTER'; -OUTPUTFORMAT: 'OUTPUTFORMAT'; -OVER: 'OVER'; -OVERLAPS: 'OVERLAPS'; -OVERLAY: 'OVERLAY'; -OVERWRITE: 'OVERWRITE'; -PARTITION: 'PARTITION'; -PARTITIONED: 'PARTITIONED'; -PARTITIONS: 'PARTITIONS'; -PERCENTLIT: 'PERCENT'; -PIVOT: 'PIVOT'; -PLACING: 'PLACING'; -POSITION: 'POSITION'; -PRECEDING: 'PRECEDING'; -PRIMARY: 'PRIMARY'; -PRINCIPALS: 'PRINCIPALS'; -PROPERTIES: 'PROPERTIES'; -PURGE: 'PURGE'; -QUERY: 'QUERY'; -RANGE: 'RANGE'; -RECORDREADER: 'RECORDREADER'; -RECORDWRITER: 'RECORDWRITER'; -RECOVER: 'RECOVER'; -REDUCE: 'REDUCE'; -REFERENCES: 'REFERENCES'; -REFRESH: 'REFRESH'; -RENAME: 'RENAME'; -REPAIR: 'REPAIR'; -REPLACE: 'REPLACE'; -RESET: 'RESET'; -RESTRICT: 'RESTRICT'; -REVOKE: 'REVOKE'; -RIGHT: 'RIGHT'; -RLIKE: 'RLIKE' | 'REGEXP'; -ROLE: 'ROLE'; -ROLES: 'ROLES'; -ROLLBACK: 'ROLLBACK'; -ROLLUP: 'ROLLUP'; -ROW: 'ROW'; -ROWS: 'ROWS'; -SCHEMA: 'SCHEMA'; -SECOND: 'SECOND'; -SELECT: 'SELECT'; -SEMI: 'SEMI'; -SEPARATED: 'SEPARATED'; -SERDE: 'SERDE'; -SERDEPROPERTIES: 'SERDEPROPERTIES'; -SESSION_USER: 'SESSION_USER'; -SET: 'SET'; -SETMINUS: 'MINUS'; -SETS: 'SETS'; -SHOW: 'SHOW'; -SKEWED: 'SKEWED'; -SOME: 'SOME'; -SORT: 'SORT'; -SORTED: 'SORTED'; -START: 'START'; -STATISTICS: 'STATISTICS'; -STORED: 'STORED'; -STRATIFY: 'STRATIFY'; -STRUCT: 'STRUCT'; -SUBSTR: 'SUBSTR'; -SUBSTRING: 'SUBSTRING'; -TABLE: 'TABLE'; -TABLES: 'TABLES'; -TABLESAMPLE: 'TABLESAMPLE'; -TBLPROPERTIES: 'TBLPROPERTIES'; -TEMPORARY: 'TEMPORARY' | 'TEMP'; -TERMINATED: 'TERMINATED'; -THEN: 'THEN'; -TO: 'TO'; -TOUCH: 'TOUCH'; -TRAILING: 'TRAILING'; -TRANSACTION: 'TRANSACTION'; -TRANSACTIONS: 'TRANSACTIONS'; -TRANSFORM: 'TRANSFORM'; -TRIM: 'TRIM'; -TRUE: 'TRUE'; -TRUNCATE: 'TRUNCATE'; -TYPE: 'TYPE'; -UNARCHIVE: 'UNARCHIVE'; -UNBOUNDED: 'UNBOUNDED'; -UNCACHE: 'UNCACHE'; -UNION: 'UNION'; -UNIQUE: 'UNIQUE'; -UNKNOWN: 'UNKNOWN'; -UNLOCK: 'UNLOCK'; -UNSET: 'UNSET'; -UPDATE: 'UPDATE'; -USE: 'USE'; -USER: 'USER'; -USING: 'USING'; -VALUES: 'VALUES'; -VIEW: 'VIEW'; -VIEWS: 'VIEWS'; -WHEN: 'WHEN'; -WHERE: 'WHERE'; -WINDOW: 'WINDOW'; -WITH: 'WITH'; -YEAR: 'YEAR'; -//============================ -// End of the keywords list -//============================ - -EQ : '=' | '=='; -NSEQ: '<=>'; -NEQ : '<>'; -NEQJ: '!='; -LT : '<'; -LTE : '<=' | '!>'; -GT : '>'; -GTE : '>=' | '!<'; - -PLUS: '+'; -MINUS: '-'; -ASTERISK: '*'; -SLASH: '/'; -PERCENT: '%'; -DIV: 'DIV'; -TILDE: '~'; -AMPERSAND: '&'; -PIPE: '|'; -CONCAT_PIPE: '||'; -HAT: '^'; - -STRING - : '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' - | '"' ( ~('"'|'\\') | ('\\' .) )* '"' - ; - -BIGINT_LITERAL - : DIGIT+ 'L' - ; - -SMALLINT_LITERAL - : DIGIT+ 'S' - ; - -TINYINT_LITERAL - : DIGIT+ 'Y' - ; - -INTEGER_VALUE - : DIGIT+ - ; - -EXPONENT_VALUE - : DIGIT+ EXPONENT - | DECIMAL_DIGITS EXPONENT {self.isValidDecimal()}? - ; - -DECIMAL_VALUE - : DECIMAL_DIGITS {self.isValidDecimal()}? - ; - -DOUBLE_LITERAL - : DIGIT+ EXPONENT? 'D' - | DECIMAL_DIGITS EXPONENT? 'D' {self.isValidDecimal()}? - ; - -BIGDECIMAL_LITERAL - : DIGIT+ EXPONENT? 'BD' - | DECIMAL_DIGITS EXPONENT? 'BD' {self.isValidDecimal()}? - ; - -IDENTIFIER - : (LETTER | DIGIT | '_')+ - ; - -BACKQUOTED_IDENTIFIER - : '`' ( ~'`' | '``' )* '`' - ; - -fragment DECIMAL_DIGITS - : DIGIT+ '.' DIGIT* - | '.' DIGIT+ - ; - -fragment EXPONENT - : 'E' [+-]? DIGIT+ - ; - -fragment DIGIT - : [0-9] - ; - -fragment LETTER - : [A-Z] - ; - -SIMPLE_COMMENT - : '--' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN) - ; - -BRACKETED_COMMENT - : '/*' {not self.isHint()}? (BRACKETED_COMMENT|.)*? '*/' -> channel(HIDDEN) - ; - -WS - : [ \r\n\t]+ -> channel(HIDDEN) - ; - -// Catch-all for anything we can't recognize. -// We use this to be able to ignore and recover all the text -// when splitting statements with DelimiterLexer -UNRECOGNIZED - : . - ; diff --git a/pysparkling/sql/ast/parser.py b/pysparkling/sql/ast/parser.py deleted file mode 100644 index 1b5d6a609..000000000 --- a/pysparkling/sql/ast/parser.py +++ /dev/null @@ -1,78 +0,0 @@ -import antlr4 -from antlr4 import InputStream -from antlr4.error.ErrorListener import ErrorListener - -from pysparkling.sql.ast.generated.SqlBaseLexer import SqlBaseLexer -from pysparkling.sql.ast.generated.SqlBaseParser import SqlBaseParser - - -class PostProcessor(antlr4.ParseTreeListener): - @staticmethod - def exitQuotedIdentifier(ctx): - def identity(token): - return token - - return identity - - @staticmethod - def enterNonReserved(ctx): - def add_backtick(token): - return "`{0}`".format(token) - - return add_backtick - - @staticmethod - def replace_token_by_identifier(ctx): - def do_replace_token_by_identifier(token): - parent = ctx.parent - parent.removeLastChild() - token = ctx.getChild(0).getPayload - parent.addChild() - - return do_replace_token_by_identifier - - -class ParseErrorListener(ErrorListener): - def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): - raise Exception("Parse error", msg) - - -class UpperCaseCharStream: - """ - Make SQL token detection case insensitive - """ - - def __init__(self, wrapped): - self.wrapped = wrapped - - def getText(self, interval, *args): - if args or (self.size() > 0 and (interval.b - interval.a >= 0)): - return self.wrapped.getText(interval, *args) - else: - return "" - - def LA(self, i: int): - la = self.wrapped.LA(i) - if la == 0 or la == -1: - return la - else: - return ord(chr(la).upper()) - - def __getattr__(self, item): - return getattr(self.wrapped, item) - - -def build_ast(stream): - lexer = SqlBaseLexer(UpperCaseCharStream(stream)) - lexer.removeErrorListeners() - lexer.addErrorListener(ParseErrorListener()) - token_stream = antlr4.CommonTokenStream(lexer) - parser = SqlBaseParser(token_stream) - parser.addParseListener(PostProcessor()) - parser.removeErrorListeners() - parser.addErrorListener(ParseErrorListener()) - return parser - - -def ast_parser(string): - return build_ast(InputStream(string)) diff --git a/pysparkling/sql/ast/tests/test_functions.py b/pysparkling/sql/ast/tests/test_functions.py index fe2037625..d429689a9 100644 --- a/pysparkling/sql/ast/tests/test_functions.py +++ b/pysparkling/sql/ast/tests/test_functions.py @@ -5,10 +5,13 @@ from pysparkling import Row from pysparkling.sql.ast.ast_to_python import parse_expression -from pysparkling.sql.types import StructType +from pysparkling.sql.types import StructType, IntegerType, StructField -ROW = Row() -SCHEMA = StructType() +ROW = Row(a=1, b=2, c=3) +SCHEMA = StructType([ + StructField("a", IntegerType()), + StructField("b", IntegerType()), +]) def format_test_name(func, num, p): @@ -22,8 +25,10 @@ class TestFunctions(TestCase): SCENARIOS = { 'Least(-1,0,1)': ('least', 'least(-1, 0, 1)', -1), 'GREATEST(-1,0,1)': ('greatest', 'greatest(-1, 0, 1)', 1), - 'shiftRight ( 42, 1 )': ('shiftRight', 'shiftRight(42, 1)', 1), - 'ShiftLeft ( 42, 1 )': ('shiftRight', 'shiftleft(42, 1)', 1), + 'shiftRight ( 42, 1 )': ('shiftRight', 'shiftright(42, 1)', 21), + 'ShiftLeft ( 42, 1 )': ('shiftLeft', 'shiftleft(42, 1)', 84), + 'concat_ws(/, a, b )': ('shiftLeft', 'shiftleft(42, 1)', 84), + 'instr(a, a)': ('shiftLeft', 'shiftleft(42, 1)', 84), } @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) @@ -31,5 +36,5 @@ def test_functions(self, string, expected): operator, expected_parsed, expected_result = expected actual_parsed = parse_expression(string, True) self.assertEqual(expected_parsed, str(actual_parsed)) - actual_result = actual_parsed.eval(Row(), SCHEMA) + actual_result = actual_parsed.eval(ROW, SCHEMA) self.assertEqual(expected_result, actual_result) diff --git a/pysparkling/sql/ast/utils.py b/pysparkling/sql/ast/utils.py deleted file mode 100644 index 98e6bb965..000000000 --- a/pysparkling/sql/ast/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -def print_tree(tree): - print(type(tree).__name__) - print_sub_tree(tree, indent=0) - - -def print_sub_tree(tree, indent=0): - for c in tree.children: - print( - "|" + "-" * indent, - type(c).__name__, - "\033[0;34m" + (c.symbol.text if hasattr(c, "symbol") else "") + "\033[0m" - ) - if hasattr(c, 'children') and c.children: - print_sub_tree(c, indent + 2) diff --git a/setup.py b/setup.py index da27c42f7..b3c691dcf 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,8 @@ 'future>=0.15', 'requests>=2.6.0', 'pytz>=2019.3', - 'python-dateutil>=2.8.0' + 'python-dateutil>=2.8.0', + 'pythonsqlparser==0.1.0', ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], From 9245ff08cc90cadd28301b516bd527e4a22d7c4e Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:34:04 +0100 Subject: [PATCH 054/118] Align Expression APIs with SQL syntax --- .../sql/expressions/aggregate/collectors.py | 2 +- pysparkling/sql/expressions/arrays.py | 14 +++--- pysparkling/sql/expressions/mappers.py | 18 ++++---- pysparkling/sql/functions.py | 43 ++++++++++--------- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/pysparkling/sql/expressions/aggregate/collectors.py b/pysparkling/sql/expressions/aggregate/collectors.py index 96e14dff9..19edb9a53 100644 --- a/pysparkling/sql/expressions/aggregate/collectors.py +++ b/pysparkling/sql/expressions/aggregate/collectors.py @@ -124,7 +124,7 @@ def args(self): class CountDistinct(Aggregation): pretty_name = "count" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns self.items = set() diff --git a/pysparkling/sql/expressions/arrays.py b/pysparkling/sql/expressions/arrays.py index 2511d75d6..0be678c9a 100644 --- a/pysparkling/sql/expressions/arrays.py +++ b/pysparkling/sql/expressions/arrays.py @@ -40,7 +40,7 @@ def args(self): class ArrayColumn(Expression): pretty_name = "array" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -54,7 +54,7 @@ def args(self): class MapColumn(Expression): pretty_name = "map" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns self.keys = columns[::2] @@ -253,20 +253,20 @@ def args(self): class ArraysZip(Expression): pretty_name = "arrays_zip" - def __init__(self, cols): - super().__init__(*cols) - self.cols = cols + def __init__(self, columns): + super().__init__(*columns) + self.columns = columns def eval(self, row, schema): return [ list(combination) for combination in zip( - *(c.eval(row, schema) for c in self.cols) + *(c.eval(row, schema) for c in self.columns) ) ] def args(self): - return self.cols + return self.columns class Flatten(UnaryExpression): diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index f862632e0..016be9cca 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -243,7 +243,7 @@ def args(self): class Coalesce(Expression): pretty_name = "coalesce" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -575,7 +575,7 @@ def args(self): class CreateStruct(Expression): pretty_name = "struct" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -656,7 +656,7 @@ def args(self): class Greatest(Expression): pretty_name = "greatest" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -671,7 +671,7 @@ def args(self): class Least(Expression): pretty_name = "least" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -707,7 +707,7 @@ def eval(self, row, schema): class Concat(Expression): pretty_name = "concat" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(columns) self.columns = columns @@ -721,7 +721,7 @@ def args(self): class ConcatWs(Expression): pretty_name = "concat_ws" - def __init__(self, sep, columns): + def __init__(self, sep, *columns): super().__init__(columns) self.sep = sep.get_literal_value() self.columns = columns @@ -731,7 +731,7 @@ def eval(self, row, schema): def args(self): if self.columns: - return [self.sep] + self.columns + return [self.sep] + list(self.columns) return [self.sep] @@ -773,7 +773,7 @@ def eval(self, row, schema): class MapConcat(Expression): pretty_name = "map_concat" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(*columns) self.columns = columns @@ -990,7 +990,7 @@ def eval(self, row, schema): class GroupingID(Expression): pretty_name = "grouping_id" - def __init__(self, columns): + def __init__(self, *columns): super().__init__(*columns) self.columns = columns diff --git a/pysparkling/sql/functions.py b/pysparkling/sql/functions.py index 0ab2d0855..409d4d6db 100644 --- a/pysparkling/sql/functions.py +++ b/pysparkling/sql/functions.py @@ -355,8 +355,8 @@ def struct(*exprs): """ if len(exprs) == 1 and isinstance(exprs[0], list): exprs = exprs[0] - cols = [parse(e) for e in exprs] - return col(CreateStruct(cols)) + columns = [parse(e) for e in exprs] + return col(CreateStruct(*columns)) def array(*exprs): @@ -364,7 +364,7 @@ def array(*exprs): :rtype: Column """ columns = [parse(e) for e in exprs] - return col(ArrayColumn(columns)) + return col(ArrayColumn(*columns)) def map_from_arrays(col1, col2): @@ -412,7 +412,7 @@ def countDistinct(*exprs): :rtype: Column """ columns = [parse(e) for e in exprs] - return col(CountDistinct(columns=columns)) + return col(CountDistinct(*columns)) def collect_set(e): @@ -532,8 +532,8 @@ def grouping_id(*exprs): :rtype: Column """ - cols = [parse(e) for e in exprs] - return col(GroupingID(cols)) + columns = [parse(e) for e in exprs] + return col(GroupingID(*columns)) def kurtosis(e): @@ -725,9 +725,9 @@ def create_map(*exprs): """ if len(exprs) == 1 and isinstance(exprs[0], (list, set)): exprs = exprs[0] - cols = [parse(e) for e in exprs] + columns = [parse(e) for e in exprs] - return col(MapColumn(cols)) + return col(MapColumn(*columns)) def broadcast(df): @@ -743,7 +743,7 @@ def coalesce(*exprs): :rtype: Column """ columns = [parse(e) for e in exprs] - return col(Coalesce(columns)) + return col(Coalesce(*columns)) def input_file_name(): @@ -945,8 +945,8 @@ def greatest(*exprs): """ :rtype: Column """ - cols = [parse(e) for e in exprs] - return col(Greatest(cols)) + columns = [parse(e) for e in exprs] + return col(Greatest(*columns)) # noinspection PyShadowingBuiltins @@ -978,8 +978,8 @@ def least(*exprs): """ :rtype: Column """ - cols = [parse(e) for e in exprs] - return col(Least(cols)) + columns = [parse(e) for e in exprs] + return col(Least(*columns)) def log(arg1, arg2=None): @@ -1288,8 +1288,8 @@ def concat_ws(sep, *exprs): +--------------+ """ - cols = [parse(e) for e in exprs] - return col(ConcatWs(lit(sep), cols)) + columns = [parse(e) for e in exprs] + return col(ConcatWs(lit(sep), *columns)) def decode(value, charset): @@ -2177,8 +2177,8 @@ def concat(*exprs): """ :rtype: Column """ - cols = [parse(e) for e in exprs] - return col(Concat(cols)) + columns = [parse(e) for e in exprs] + return col(Concat(*columns)) def array_position(column, value): @@ -2432,7 +2432,8 @@ def arrays_zip(*exprs): """ :rtype: Column """ - return col(ArraysZip([parse(e) for e in exprs])) + columns = [parse(e) for e in exprs] + return col(ArraysZip(*columns)) def map_concat(*exprs): @@ -2453,8 +2454,8 @@ def map_concat(*exprs): [Row(map_concat(m1, m2)={1: 'a', 2: 'c', 3: 'd'})] """ - cols = [parse(e) for e in exprs] - return col(MapConcat(cols)) + columns = [parse(e) for e in exprs] + return col(MapConcat(*columns)) def from_csv(e, schema, options=None): @@ -2538,7 +2539,7 @@ def pandas_udf(f=None, returnType=None, functionType=None): raise NotImplementedError("Pysparkling does not support yet this function") -def callUDF(udfName, *cols): +def callUDF(udfName, *columns): raise NotImplementedError("Pysparkling does not support yet this function") From 1371dcbfc86e9b8c0f6d0facc60b9e7fa6151ca8 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:34:46 +0100 Subject: [PATCH 055/118] Rename expression registering class --- pysparkling/sql/expressions/expressions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/expressions/expressions.py b/pysparkling/sql/expressions/expressions.py index 838247c27..3a02fd176 100644 --- a/pysparkling/sql/expressions/expressions.py +++ b/pysparkling/sql/expressions/expressions.py @@ -5,16 +5,16 @@ expression_registry = {} -class RegisterExpressions(type): +class RegisteredExpressions(type): pretty_name = None def __init__(cls, what, bases, dct): super().__init__(what, bases, dct) if cls.pretty_name is not None: - expression_registry[cls.pretty_name] = cls + expression_registry[cls.pretty_name.lower()] = cls -class Expression(metaclass=RegisterExpressions): +class Expression(metaclass=RegisteredExpressions): pretty_name = None def __init__(self, *children): From a1d5a178149ae9e43c8a7b70065b17412ae98336 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:35:05 +0100 Subject: [PATCH 056/118] Fix instr implementation --- pysparkling/sql/expressions/strings.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/expressions/strings.py b/pysparkling/sql/expressions/strings.py index 2665d69a1..7fd73c56c 100644 --- a/pysparkling/sql/expressions/strings.py +++ b/pysparkling/sql/expressions/strings.py @@ -32,13 +32,14 @@ class StringInStr(Expression): def __init__(self, column, substr): super().__init__(column) self.column = column - self.substr = substr.get_literal_value() + self.substr = substr def eval(self, row, schema): value = self.column.cast(StringType()).eval(row, schema) + substr_value = self.substr.cast(StringType()).eval(row, schema) try: - return value.index(self.substr) - except IndexError: + return value.index(substr_value) + 1 + except ValueError: return 0 def args(self): From ff90059af970b5e2ba4bc25aa160d2a8702fdb87 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:36:59 +0100 Subject: [PATCH 057/118] Align code with sql parser extraction --- pysparkling/sql/ast/ast_to_python.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index d302a7aed..1950facda 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,9 +1,6 @@ import ast import logging -import sys -from pysparkling.sql.ast.parser import ast_parser -from pysparkling.sql.ast.utils import print_tree from pysparkling.sql.column import parse from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.mappers import CreateStruct, Concat @@ -12,6 +9,7 @@ BitwiseNot, UnaryPositive, Alias from pysparkling.sql import functions from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type +from sqlparser import string_to_ast class SqlParsingError(Exception): @@ -428,7 +426,7 @@ def debug(*children): def parse_sql(string, rule, debug=False): - tree = string_to_ast(string, rule, debug) + tree = string_to_ast(string, rule, debug=debug) return convert_tree(tree) From a1727e9e6b6a3f342de503bcc703e340ce2657c4 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:38:19 +0100 Subject: [PATCH 058/118] Fix column reference handling --- pysparkling/sql/ast/ast_to_python.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 1950facda..004cc40b0 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,7 +1,7 @@ import ast import logging -from pysparkling.sql.column import parse +from pysparkling.sql.column import parse, Column from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.mappers import CreateStruct, Concat from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ @@ -141,6 +141,12 @@ def convert_to_literal(*children): return Literal(value) +def parse_column(*children): + check_children(1, children) + value = convert_tree(children[0]) + return Column(value) + + def convert_to_null(*children): return None @@ -256,7 +262,7 @@ def debug(*children): 'IdentityTransformContext': unwrap, 'ValueExpressionDefaultContext': unwrap, 'ConstantDefaultContext': convert_to_literal, - 'ColumnReferenceContext': unwrap, + 'ColumnReferenceContext': parse_column, 'NullLiteralContext': convert_to_null, 'IntervalLiteralContext': unwrap, 'NumericLiteralContext': unwrap, From fb4cdf20ca1bcd96f5f5555d3e52f415b3766fc6 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:39:20 +0100 Subject: [PATCH 059/118] Rely on expression for function call --- pysparkling/sql/ast/ast_to_python.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 004cc40b0..d22b0f43f 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -2,6 +2,7 @@ import logging from pysparkling.sql.column import parse, Column +from pysparkling.sql.expressions.expressions import expression_registry from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.mappers import CreateStruct, Concat from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ @@ -62,11 +63,14 @@ def call_function(*children): (name for name in functions.__all__ if name.lower() == raw_function_name.lower()), None ) - # function = getattr(functions, function_name) - this should get an Expression init, not a function + function_expression = expression_registry.get(function_name.lower()) params = [convert_tree(c) for c in children[2:-1]] - complex_function = ')' in params + # todo: there must be a cleaner way to do that + complex_function = any( + not isinstance(param, Column) and param == ')' + for param in params + ) if not complex_function: last_argument_position = None filter_clause = None @@ -80,7 +84,7 @@ def call_function(*children): # parameters are comma separated function_arguments = params[0:last_argument_position:2] - return function(*function_arguments) + return function_expression(*function_arguments) def binary_operation(*children): From 0b4416d16adfd02c4ecc169822ebc81825b014d1 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:45:10 +0100 Subject: [PATCH 060/118] Directly use Cast in expressions instead of wrapping column method --- pysparkling/sql/expressions/dates.py | 51 +++++++++++++------------- pysparkling/sql/expressions/mappers.py | 3 +- pysparkling/sql/expressions/strings.py | 23 ++++++------ 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/pysparkling/sql/expressions/dates.py b/pysparkling/sql/expressions/dates.py index a081099ad..d546ca926 100644 --- a/pysparkling/sql/expressions/dates.py +++ b/pysparkling/sql/expressions/dates.py @@ -7,6 +7,7 @@ from ..casts import get_time_formatter, get_unix_timestamp_parser from ..types import DateType, FloatType, TimestampType from .expressions import Expression, UnaryExpression +from .operators import Cast GMT_TIMEZONE = pytz.timezone("GMT") @@ -23,7 +24,7 @@ def __init__(self, start_date, num_months): self.timedelta = datetime.timedelta(days=self.num_months) def eval(self, row, schema): - return self.start_date.cast(DateType()).eval(row, schema) + self.timedelta + return Cast(self.start_date, DateType()).eval(row, schema) + self.timedelta def args(self): return ( @@ -42,7 +43,7 @@ def __init__(self, start_date, num_days): self.timedelta = datetime.timedelta(days=self.num_days) def eval(self, row, schema): - return self.start_date.cast(DateType()).eval(row, schema) + self.timedelta + return Cast(self.start_date, DateType()).eval(row, schema) + self.timedelta def args(self): return ( @@ -61,7 +62,7 @@ def __init__(self, start_date, num_days): self.timedelta = datetime.timedelta(days=self.num_days) def eval(self, row, schema): - return self.start_date.cast(DateType()).eval(row, schema) - self.timedelta + return Cast(self.start_date, DateType()).eval(row, schema) - self.timedelta def args(self): return ( @@ -74,21 +75,21 @@ class Year(UnaryExpression): pretty_name = "year" def eval(self, row, schema): - return self.column.cast(DateType()).eval(row, schema).year + return Cast(self.column, DateType()).eval(row, schema).year class Month(UnaryExpression): pretty_name = "month" def eval(self, row, schema): - return self.column.cast(DateType()).eval(row, schema).month + return Cast(self.column, DateType()).eval(row, schema).month class Quarter(UnaryExpression): pretty_name = "quarter" def eval(self, row, schema): - month = self.column.cast(DateType()).eval(row, schema).month + month = Cast(self.column, DateType()).eval(row, schema).month return 1 + int((month - 1) / 3) @@ -96,35 +97,35 @@ class Hour(UnaryExpression): pretty_name = "hour" def eval(self, row, schema): - return self.column.cast(TimestampType()).eval(row, schema).hour + return Cast(self.column, TimestampType()).eval(row, schema).hour class Minute(UnaryExpression): pretty_name = "minute" def eval(self, row, schema): - return self.column.cast(TimestampType()).eval(row, schema).minute + return Cast(self.column, TimestampType()).eval(row, schema).minute class Second(UnaryExpression): pretty_name = "second" def eval(self, row, schema): - return self.column.cast(TimestampType()).eval(row, schema).second + return Cast(self.column, TimestampType()).eval(row, schema).second class DayOfMonth(UnaryExpression): pretty_name = "dayofmonth" def eval(self, row, schema): - return self.column.cast(DateType()).eval(row, schema).day + return Cast(self.column, DateType()).eval(row, schema).day class DayOfYear(UnaryExpression): pretty_name = "dayofyear" def eval(self, row, schema): - value = self.column.cast(DateType()).eval(row, schema) + value = Cast(self.column, DateType()).eval(row, schema) day_from_the_first = value - datetime.date(value.year, 1, 1) return 1 + day_from_the_first.days @@ -133,7 +134,7 @@ class LastDay(UnaryExpression): pretty_name = "last_day" def eval(self, row, schema): - value = self.column.cast(DateType()).eval(row, schema) + value = Cast(self.column, DateType()).eval(row, schema) first_of_next_month = value + relativedelta(months=1, day=1) return first_of_next_month - datetime.timedelta(days=1) @@ -142,14 +143,14 @@ class WeekOfYear(UnaryExpression): pretty_name = "weekofyear" def eval(self, row, schema): - return self.column.cast(DateType()).eval(row, schema).isocalendar()[1] + return Cast(self.column, DateType()).eval(row, schema).isocalendar()[1] class DayOfWeek(UnaryExpression): pretty_name = "dayofweek" def eval(self, row, schema): - date = self.column.cast(DateType()).eval(row, schema) + date = Cast(self.column, DateType()).eval(row, schema) return date.isoweekday() + 1 if date.isoweekday() != 7 else 1 @@ -162,7 +163,7 @@ def __init__(self, column, day_of_week): self.day_of_week = day_of_week.get_literal_value() def eval(self, row, schema): - value = self.column.cast(DateType()).eval(row, schema) + value = Cast(self.column, DateType()).eval(row, schema) if self.day_of_week.upper() not in DAYS_OF_WEEK: return None @@ -191,8 +192,8 @@ def __init__(self, column1, column2, round_off): self.round_off = round_off.get_literal_value() def eval(self, row, schema): - value_1 = self.column1.cast(TimestampType()).eval(row, schema) - value_2 = self.column2.cast(TimestampType()).eval(row, schema) + value_1 = Cast(self.column1, TimestampType()).eval(row, schema) + value_2 = Cast(self.column2, TimestampType()).eval(row, schema) if (not isinstance(value_1, datetime.datetime) or not isinstance(value_2, datetime.datetime)): @@ -237,8 +238,8 @@ def __init__(self, column1, column2): self.column2 = column2 def eval(self, row, schema): - value_1 = self.column1.cast(DateType()).eval(row, schema) - value_2 = self.column2.cast(DateType()).eval(row, schema) + value_1 = Cast(self.column1, DateType()).eval(row, schema) + value_2 = Cast(self.column2, DateType()).eval(row, schema) if (not isinstance(value_1, datetime.date) or not isinstance(value_2, datetime.date)): @@ -263,7 +264,7 @@ def __init__(self, column, f): self.formatter = get_time_formatter(self.format) def eval(self, row, schema): - timestamp = self.column.cast(FloatType()).eval(row, schema) + timestamp = Cast(self.column, FloatType()).eval(row, schema) return self.formatter(datetime.datetime.fromtimestamp(timestamp)) def args(self): @@ -283,7 +284,7 @@ def __init__(self, column, f): self.formatter = get_time_formatter(self.format) def eval(self, row, schema): - timestamp = self.column.cast(TimestampType()).eval(row, schema) + timestamp = Cast(self.column, TimestampType()).eval(row, schema) return self.formatter(timestamp) def args(self): @@ -406,7 +407,7 @@ def __init__(self, column, level): self.level = level.get_literal_value() def eval(self, row, schema): - value = self.column.cast(DateType()).eval(row, schema) + value = Cast(self.column, DateType()).eval(row, schema) if self.level in ('year', 'yyyy', 'yy'): return datetime.date(value.year, 1, 1) if self.level in ('month', 'mon', 'mm'): @@ -429,7 +430,7 @@ def __init__(self, level, column): self.column = column def eval(self, row, schema): - value = self.column.cast(TimestampType()).eval(row, schema) + value = Cast(self.column, TimestampType()).eval(row, schema) day_truncation = self.truncate_to_day(value) if day_truncation: @@ -485,7 +486,7 @@ def __init__(self, column, tz): self.pytz = parse_tz(self.tz) def eval(self, row, schema): - value = self.column.cast(TimestampType()).eval(row, schema) + value = Cast(self.column, TimestampType()).eval(row, schema) if self.pytz is None: return value gmt_date = GMT_TIMEZONE.localize(value) @@ -509,7 +510,7 @@ def __init__(self, column, tz): self.pytz = parse_tz(self.tz) def eval(self, row, schema): - value = self.column.cast(TimestampType()).eval(row, schema) + value = Cast(self.column, TimestampType()).eval(row, schema) if self.pytz is None: return value local_date = self.pytz.localize(value) diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index 016be9cca..2e52d777a 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -9,6 +9,7 @@ from ..types import create_row, StringType from ..utils import AnalysisException from .expressions import Expression, NullSafeColumnOperation, UnaryExpression +from .operators import Cast JVM_MAX_INTEGER_SIZE = 2 ** 63 @@ -826,7 +827,7 @@ def __init__(self, column, from_base, to_base): self.to_base = to_base.get_literal_value() def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) return self.convert( value, self.from_base, diff --git a/pysparkling/sql/expressions/strings.py b/pysparkling/sql/expressions/strings.py index 7fd73c56c..c9ef35a43 100644 --- a/pysparkling/sql/expressions/strings.py +++ b/pysparkling/sql/expressions/strings.py @@ -3,6 +3,7 @@ from ...utils import levenshtein_distance from ..types import StringType from .expressions import Expression, UnaryExpression +from .operators import Cast class StringTrim(UnaryExpression): @@ -35,8 +36,8 @@ def __init__(self, column, substr): self.substr = substr def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) - substr_value = self.substr.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) + substr_value = Cast(self.substr, StringType()).eval(row, schema) try: return value.index(substr_value) + 1 except ValueError: @@ -59,7 +60,7 @@ def __init__(self, substr, column, pos): self.start = pos.get_literal_value() - 1 def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) if self.substr not in value[self.start:]: return 0 return value.index(self.substr, self.start) + 1 @@ -87,7 +88,7 @@ def __init__(self, column, length, pad): self.pad = pad.get_literal_value() def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) delta = self.length - len(value) padding = (self.pad * delta)[:delta] # Handle pad with multiple characters return f"{padding}{value}" @@ -110,7 +111,7 @@ def __init__(self, column, length, pad): self.pad = pad.get_literal_value() def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) delta = self.length - len(value) padding = (self.pad * delta)[:delta] # Handle pad with multiple characters return f"{value}{padding}" @@ -132,7 +133,7 @@ def __init__(self, column, n): self.n = n.get_literal_value() def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) return value * self.n def args(self): @@ -158,7 +159,7 @@ def __init__(self, column, matching_string, replace_string): ) def eval(self, row, schema): - return self.column.cast(StringType()).eval(row, schema).translate(self.translation_table) + return Cast(self.column, StringType()).eval(row, schema).translate(self.translation_table) def args(self): return ( @@ -172,7 +173,7 @@ class InitCap(UnaryExpression): pretty_name = "initcap" def eval(self, row, schema): - value = self.column.cast(StringType()).eval(row, schema) + value = Cast(self.column, StringType()).eval(row, schema) return " ".join(word.capitalize() for word in value.split()) @@ -185,8 +186,8 @@ def __init__(self, column1, column2): self.column2 = column2 def eval(self, row, schema): - value_1 = self.column1.cast(StringType()).eval(row, schema) - value_2 = self.column2.cast(StringType()).eval(row, schema) + value_1 = Cast(self.column1, StringType()).eval(row, schema) + value_2 = Cast(self.column2, StringType()).eval(row, schema) if value_1 is None or value_2 is None: return None return levenshtein_distance(value_1, value_2) @@ -210,7 +211,7 @@ class SoundEx(UnaryExpression): } def eval(self, row, schema): - raw_value = self.column.cast(StringType()).eval(row, schema) + raw_value = Cast(self.column, StringType()).eval(row, schema) if raw_value is None: return None From 1ee83091dfcb10b11c6edce4339b8345c9b58cf9 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:45:26 +0100 Subject: [PATCH 061/118] Add test on fucntion evaluation --- pysparkling/sql/ast/tests/test_functions.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_functions.py b/pysparkling/sql/ast/tests/test_functions.py index d429689a9..5eaac4e88 100644 --- a/pysparkling/sql/ast/tests/test_functions.py +++ b/pysparkling/sql/ast/tests/test_functions.py @@ -27,8 +27,10 @@ class TestFunctions(TestCase): 'GREATEST(-1,0,1)': ('greatest', 'greatest(-1, 0, 1)', 1), 'shiftRight ( 42, 1 )': ('shiftRight', 'shiftright(42, 1)', 21), 'ShiftLeft ( 42, 1 )': ('shiftLeft', 'shiftleft(42, 1)', 84), - 'concat_ws(/, a, b )': ('shiftLeft', 'shiftleft(42, 1)', 84), - 'instr(a, a)': ('shiftLeft', 'shiftleft(42, 1)', 84), + "concat_ws('/', a, b )": ('concat_ws', 'concat_ws(/, a, b)', "1/2"), + 'instr(a, a)': ('instr', 'instr(a, a)', 1), # rely on columns + 'instr(a, b)': ('instr', 'instr(a, b)', 0), # rely on columns + "instr('abc', 'c')": ('instr', 'instr(abc, c)', 3), # rely on lit } @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) From 8f17ad4f12224846dd9128fe3872c4bcfbc73442 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:52:20 +0100 Subject: [PATCH 062/118] Remove redundant parentheses --- pysparkling/sql/ast/ast_to_python.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index d22b0f43f..5d22f9acb 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -216,10 +216,10 @@ def check_identifier(*children): identifier = convert_tree(children[0]) if children[1].children: extra = convert_tree(children[1]) - raise SqlParsingError(( - "Possibly unquoted identifier {0}{1} detected. " - "Please consider quoting it with back-quotes as `{0}{1}`" - ).format(identifier, extra)) + raise SqlParsingError( + "Possibly unquoted identifier {0}{1} detected. " + "Please consider quoting it with back-quotes as `{0}{1}`".format(identifier, extra) + ) return identifier From ae13310d07bf2ae7cadd44a0f8332eb92d52834f Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:57:00 +0100 Subject: [PATCH 063/118] Add tests on expression names --- pysparkling/sql/ast/tests/test_functions.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_functions.py b/pysparkling/sql/ast/tests/test_functions.py index 5eaac4e88..4756e211d 100644 --- a/pysparkling/sql/ast/tests/test_functions.py +++ b/pysparkling/sql/ast/tests/test_functions.py @@ -25,8 +25,8 @@ class TestFunctions(TestCase): SCENARIOS = { 'Least(-1,0,1)': ('least', 'least(-1, 0, 1)', -1), 'GREATEST(-1,0,1)': ('greatest', 'greatest(-1, 0, 1)', 1), - 'shiftRight ( 42, 1 )': ('shiftRight', 'shiftright(42, 1)', 21), - 'ShiftLeft ( 42, 1 )': ('shiftLeft', 'shiftleft(42, 1)', 84), + 'shiftRight ( 42, 1 )': ('shiftright', 'shiftright(42, 1)', 21), + 'ShiftLeft ( 42, 1 )': ('shiftleft', 'shiftleft(42, 1)', 84), "concat_ws('/', a, b )": ('concat_ws', 'concat_ws(/, a, b)', "1/2"), 'instr(a, a)': ('instr', 'instr(a, a)', 1), # rely on columns 'instr(a, b)': ('instr', 'instr(a, b)', 0), # rely on columns @@ -38,5 +38,6 @@ def test_functions(self, string, expected): operator, expected_parsed, expected_result = expected actual_parsed = parse_expression(string, True) self.assertEqual(expected_parsed, str(actual_parsed)) + self.assertEqual(operator, actual_parsed.pretty_name) actual_result = actual_parsed.eval(ROW, SCHEMA) self.assertEqual(expected_result, actual_result) From 37c5f7703f6c70fed8888f48e2930d8087c81215 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 15:59:56 +0100 Subject: [PATCH 064/118] Replace star import with classic import --- pysparkling/sql/ast/tests/test_type_parsing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index 16487bf9b..692168cf0 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -2,9 +2,11 @@ from parameterized import parameterized -from pysparkling.sql.types import * from pysparkling.sql.ast.ast_to_python import parse_data_type +from pysparkling.sql.types import BooleanType, ByteType, ShortType, IntegerType, \ + LongType, FloatType, DoubleType, DateType, TimestampType, StringType, BinaryType, \ + DecimalType, ArrayType, MapType, StructType, StructField class TypeParsingTest(TestCase): From 2e9d54bd01fbcc6970b89ddd198122bb92e90a54 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 16:00:05 +0100 Subject: [PATCH 065/118] Add logs --- pysparkling/sql/ast/tests/test_operations.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysparkling/sql/ast/tests/test_operations.py b/pysparkling/sql/ast/tests/test_operations.py index 76f556321..697e5931b 100644 --- a/pysparkling/sql/ast/tests/test_operations.py +++ b/pysparkling/sql/ast/tests/test_operations.py @@ -1,3 +1,4 @@ +import logging from unittest import TestCase from parameterized import parameterized @@ -58,6 +59,7 @@ class TestOperations(TestCase): @parameterized.expand(SCENARIOS.items(), name_func=format_test_name) def test_operations(self, string, expected): operator, expected_parsed, expected_result = expected + logging.debug("Testing %s", operator) actual_parsed = parse_expression(string, True) self.assertEqual(expected_parsed, str(actual_parsed)) actual_result = actual_parsed.eval(Row(), SCHEMA) From 043dfb48c1e30272ac8e51f9fe8465b0c56f6f27 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 16:00:56 +0100 Subject: [PATCH 066/118] Reduce line length --- pysparkling/sql/types.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 211eec109..31414c978 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1878,7 +1878,9 @@ def parsed_string_to_type(data_type, arguments): StructField(name, data_type) for name, data_type in arguments[0] ]) - raise ParseException("Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "")) + raise ParseException( + "Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "") + ) # Internal type hierarchy: From d2ee9a2968387657cd14a2766721dd1867fb55b0 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 21 Nov 2020 16:01:58 +0100 Subject: [PATCH 067/118] Move external module import before module import --- pysparkling/sql/ast/ast_to_python.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 5d22f9acb..2ae578096 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -1,6 +1,8 @@ import ast import logging +from sqlparser import string_to_ast + from pysparkling.sql.column import parse, Column from pysparkling.sql.expressions.expressions import expression_registry from pysparkling.sql.expressions.literals import Literal @@ -10,7 +12,6 @@ BitwiseNot, UnaryPositive, Alias from pysparkling.sql import functions from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type -from sqlparser import string_to_ast class SqlParsingError(Exception): From 426a6d0ddcf39c5360897148a998d895f45ca812 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 30 Jan 2021 19:36:56 +0100 Subject: [PATCH 068/118] Enhance error handling --- pysparkling/sql/ast/ast_to_python.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 2ae578096..8c45c7e53 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -18,9 +18,17 @@ class SqlParsingError(Exception): pass +class UnsupportedStatement(SqlParsingError): + pass + + def check_children(expected, children): if len(children) != expected: - raise SqlParsingError("Expecting {0} children, got {1}: {2}".format(expected, len(children), children)) + raise SqlParsingError( + "Expecting {0} children, got {1}: {2}".format( + expected, len(children), children + ) + ) def unwrap(*children): @@ -34,7 +42,7 @@ def never_found(*children): def unsupported(*children): - raise SqlParsingError("Unsupported statement") + raise UnsupportedStatement def empty(*children): @@ -54,7 +62,10 @@ def convert_tree(tree): tree_type = tree.__class__.__name__ if not hasattr(tree, "children"): return get_leaf_value(tree) - converter = CONVERTERS[tree_type] + try: + converter = CONVERTERS[tree_type] + except UnsupportedStatement: + raise SqlParsingError("Unsupported statement {0}".format(tree_type)) return converter(*tree.children) @@ -160,7 +171,7 @@ def get_leaf_value(*children): check_children(1, children) value = children[0] if value.__class__.__name__ != "TerminalNodeImpl": - raise SqlParsingError("Expecting TerminalNodeImpl, got {0}".format(value.__class__.__name__)) + raise SqlParsingError("Expecting TerminalNodeImpl, got {0}".format(type(value).__name__)) if not hasattr(value, "symbol"): raise SqlParsingError("Got leaf value but without symbol") return value.symbol.text From 3e673d6f7743138a192394125059c67d60373649 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 30 Jan 2021 19:37:48 +0100 Subject: [PATCH 069/118] Fix struct parsing --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 8c45c7e53..2877da452 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -209,7 +209,7 @@ def concat_strings(*children): def build_struct(*children): - return CreateStruct([convert_tree(c) for c in children[2:-1:2]]) + return CreateStruct(*(convert_tree(c) for c in children[2:-1:2])) def potential_alias(*chidren): From ccb9109c56554ad3af246574de7ad5affbd742c2 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 30 Jan 2021 19:37:57 +0100 Subject: [PATCH 070/118] Fix typo --- pysparkling/sql/ast/ast_to_python.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 2877da452..82c18939f 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -212,15 +212,15 @@ def build_struct(*children): return CreateStruct(*(convert_tree(c) for c in children[2:-1:2])) -def potential_alias(*chidren): - if len(chidren) == 1: - return convert_tree(chidren[0]) - if len(chidren) in (2, 3): +def potential_alias(*children): + if len(children) == 1: + return convert_tree(children[0]) + if len(children) in (2, 3): return Alias( - convert_tree(chidren[0]), - convert_tree(chidren[-1]) + convert_tree(children[0]), + convert_tree(children[-1]) ) - raise SqlParsingError("Expecting 1, 2 or 3 children, got {0}".format(len(chidren))) + raise SqlParsingError("Expecting 1, 2 or 3 children, got {0}".format(len(children))) def check_identifier(*children): From 2fb9c7e8601c87478977dbfc6f22e4cc8b5ba3b6 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 30 Jan 2021 19:40:21 +0100 Subject: [PATCH 071/118] Specify handling of more SQL grammar context --- pysparkling/sql/ast/ast_to_python.py | 420 +++++++++++++++++---------- 1 file changed, 266 insertions(+), 154 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 82c18939f..a51b23ae1 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -235,183 +235,295 @@ def check_identifier(*children): return identifier -def debug(*children): - pass - - CONVERTERS = { - "SingleStatementContext": first_child_only, - "SingleExpressionContext": child_and_eof, - "SingleTableIdentifierContext": child_and_eof, - "SingleMultipartIdentifierContext": child_and_eof, - "SingleFunctionIdentifierContext": child_and_eof, - "SingleDataTypeContext": child_and_eof, - "SingleTableSchemaContext": child_and_eof, - 'NamespaceContext': get_leaf_value, - 'SetQuantifierContext': get_leaf_value, - 'ComparisonOperatorContext': get_leaf_value, + 'AddTableColumnsContext': unsupported, + 'AddTablePartitionContext': unsupported, + 'AggregationClauseContext': unsupported, + 'AliasedQueryContext': unsupported, + 'AliasedRelationContext': unsupported, + 'AlterColumnActionContext': unsupported, + 'AlterTableAlterColumnContext': unsupported, + 'AlterViewQueryContext': unsupported, + 'AnalyzeContext': unsupported, + 'AnsiNonReservedContext': get_leaf_value, + 'ApplyTransformContext': unsupported, + 'ArithmeticBinaryContext': binary_operation, 'ArithmeticOperatorContext': get_leaf_value, - 'PredicateOperatorContext': get_leaf_value, + 'ArithmeticUnaryContext': unary_operation, + 'AssignmentContext': unsupported, + 'AssignmentListContext': implicit_list, + 'BigDecimalLiteralContext': concat_to_value, + 'BigIntLiteralContext': concat_to_value, + 'BooleanExpressionContext': never_found, + 'BooleanLiteralContext': unwrap, 'BooleanValueContext': parse_boolean, - 'QuotedIdentifierContext': get_leaf_value, - 'AnsiNonReservedContext': get_leaf_value, - 'StrictNonReservedContext': get_leaf_value, - 'NonReservedContext': get_leaf_value, - 'TerminalNodeImpl': get_leaf_value, - "StringLiteralContext": remove_delimiter, - "UnquotedIdentifierContext": get_leaf_value, + 'BucketSpecContext': unsupported, + 'CacheTableContext': unsupported, + 'CastContext': cast_context, + 'ClearCacheContext': unsupported, + 'ColPositionContext': unsupported, + 'ColTypeContext': unsupported, + 'ColTypeListContext': implicit_list, + 'ColumnReferenceContext': parse_column, + 'CommentNamespaceContext': unsupported, + 'CommentSpecContext': unsupported, + 'CommentTableContext': unsupported, + 'ComparisonContext': binary_operation, + 'ComparisonOperatorContext': get_leaf_value, + 'ComplexColTypeContext': implicit_list, + 'ComplexColTypeListContext': implicit_list, + 'ComplexDataTypeContext': detect_data_type, + 'ConstantContext': never_found, + 'ConstantDefaultContext': convert_to_literal, + 'ConstantListContext': explicit_list, + 'CreateFileFormatContext': unsupported, + 'CreateFunctionContext': unsupported, + 'CreateHiveTableContext': unsupported, + 'CreateNamespaceContext': unsupported, + 'CreateTableClausesContext': unsupported, + 'CreateTableContext': unsupported, + 'CreateTableHeaderContext': unsupported, + 'CreateTableLikeContext': unsupported, + 'CreateTempViewUsingContext': unsupported, + 'CreateViewContext': unsupported, + 'CtesContext': unsupported, + 'CurrentDatetimeContext': unsupported, + 'DataTypeContext': never_found, + 'DecimalLiteralContext': concat_to_value, + 'DeleteFromTableContext': unsupported, + 'DereferenceContext': unsupported, + 'DescribeColNameContext': unsupported, 'DescribeFuncNameContext': unwrap, - 'TablePropertyValueContext': unwrap, - 'TransformArgumentContext': unwrap, + 'DescribeFunctionContext': unsupported, + 'DescribeNamespaceContext': unsupported, + 'DescribeQueryContext': unsupported, + 'DescribeRelationContext': unsupported, + 'DmlStatementContext': unsupported, + 'DmlStatementNoWithContext': never_found, + 'DoubleLiteralContext': concat_to_value, + 'DropFunctionContext': unsupported, + 'DropNamespaceContext': unsupported, + 'DropTableColumnsContext': unsupported, + 'DropTableContext': unsupported, + 'DropTablePartitionsContext': unsupported, + 'DropViewContext': unsupported, + 'ErrorCapturingIdentifierContext': check_identifier, + 'ErrorCapturingIdentifierExtraContext': never_found, + 'ErrorCapturingMultiUnitsIntervalContext': unsupported, + 'ErrorCapturingUnitToUnitIntervalContext': unsupported, + 'ErrorIdentContext': concat_strings, + 'ExistsContext': unsupported, + 'ExplainContext': unsupported, + 'ExponentLiteralContext': concat_to_value, 'ExpressionContext': unwrap, - 'IntervalUnitContext': unwrap, + 'ExtractContext': unsupported, + 'FailNativeCommandContext': unsupported, + 'FileFormatContext': never_found, + 'FirstContext': unsupported, + 'FrameBoundContext': unsupported, + 'FromClauseContext': unsupported, + 'FromStatementBodyContext': unsupported, + 'FromStatementContext': unsupported, + 'FromStmtContext': unwrap, + 'FunctionCallContext': call_function, + 'FunctionIdentifierContext': unsupported, 'FunctionNameContext': unwrap, - 'StatementDefaultContext': unwrap, - 'ResetConfigurationContext': unwrap, + 'FunctionTableContext': unsupported, 'GenericFileFormatContext': unwrap, - 'QueryTermDefaultContext': unwrap, - 'QueryPrimaryDefaultContext': unwrap, - 'FromStmtContext': unwrap, + 'GroupingSetContext': unsupported, + 'HavingClauseContext': unsupported, + 'HintContext': unsupported, + 'HintStatementContext': unsupported, + 'HiveChangeColumnContext': unsupported, + 'HiveReplaceColumnsContext': unsupported, + 'IdentifierCommentContext': unsupported, + 'IdentifierCommentListContext': explicit_list, + 'IdentifierContext': unwrap, + 'IdentifierListContext': explicit_list, + 'IdentifierSeqContext': unsupported, + 'IdentityTransformContext': unwrap, + 'InlineTableContext': unsupported, 'InlineTableDefault1Context': unwrap, 'InlineTableDefault2Context': unwrap, - 'TableValuedFunctionContext': unwrap, - 'IdentityTransformContext': unwrap, - 'ValueExpressionDefaultContext': unwrap, - 'ConstantDefaultContext': convert_to_literal, - 'ColumnReferenceContext': parse_column, - 'NullLiteralContext': convert_to_null, + 'InsertIntoContext': never_found, + 'InsertIntoTableContext': unsupported, + 'InsertOverwriteDirContext': unsupported, + 'InsertOverwriteHiveDirContext': unsupported, + 'InsertOverwriteTableContext': unsupported, + 'IntegerLiteralContext': concat_to_value, + 'IntervalContext': unsupported, 'IntervalLiteralContext': unwrap, - 'NumericLiteralContext': unwrap, - 'BooleanLiteralContext': unwrap, - 'QuotedIdentifierAlternativeContext': unwrap, - "IdentifierContext": unwrap, - "BooleanExpressionContext": never_found, - "ConstantContext": never_found, - "DataTypeContext": never_found, - "DmlStatementNoWithContext": never_found, - "ErrorCapturingIdentifierExtraContext": never_found, - "FileFormatContext": never_found, - "InsertIntoContext": never_found, - "NumberContext": never_found, - "PrimaryExpressionContext": never_found, - "QueryPrimaryContext": never_found, - "QueryTermContext": never_found, - "RelationPrimaryContext": never_found, - "RowFormatContext": never_found, - "SampleMethodContext": never_found, - "StatementContext": never_found, - "StrictIdentifierContext": never_found, - "TransformContext": never_found, - "ValueExpressionContext": never_found, - "WindowSpecContext": never_found, - 'ExponentLiteralContext': concat_to_value, - 'DecimalLiteralContext': concat_to_value, + 'IntervalUnitContext': unwrap, + 'IntervalValueContext': unsupported, + 'JoinCriteriaContext': unsupported, + 'JoinRelationContext': unsupported, + 'JoinTypeContext': concat_keywords, + 'LambdaContext': unsupported, + 'LastContext': unsupported, + 'LateralViewContext': unsupported, 'LegacyDecimalLiteralContext': concat_to_value, - 'IntegerLiteralContext': concat_to_value, - 'BigIntLiteralContext': concat_to_value, - 'SmallIntLiteralContext': concat_to_value, - 'TinyIntLiteralContext': concat_to_value, - 'DoubleLiteralContext': concat_to_value, - 'BigDecimalLiteralContext': concat_to_value, - 'TablePropertyListContext': explicit_list, - 'ConstantListContext': explicit_list, + 'LoadDataContext': unsupported, + 'LocationSpecContext': unsupported, + 'LogicalBinaryContext': binary_operation, + 'LogicalNotContext': unary_operation, + 'ManageResourceContext': unsupported, + 'MatchedActionContext': unsupported, + 'MatchedClauseContext': unsupported, + 'MergeIntoTableContext': unsupported, + 'MultiInsertQueryBodyContext': unsupported, + 'MultiInsertQueryContext': unsupported, + 'MultipartIdentifierContext': unsupported, + 'MultipartIdentifierListContext': implicit_list, + 'MultiUnitsIntervalContext': unsupported, + 'NamedExpressionContext': potential_alias, + 'NamedExpressionSeqContext': unsupported, + 'NamedQueryContext': unsupported, + 'NamedWindowContext': unsupported, + 'NamespaceContext': get_leaf_value, 'NestedConstantListContext': explicit_list, - 'IdentifierListContext': explicit_list, + 'NonReservedContext': get_leaf_value, + 'NotMatchedActionContext': unsupported, + 'NotMatchedClauseContext': unsupported, + 'NullLiteralContext': convert_to_null, + 'NumberContext': never_found, + 'NumericLiteralContext': unwrap, + 'OrderedIdentifierContext': unsupported, 'OrderedIdentifierListContext': explicit_list, - 'IdentifierCommentListContext': explicit_list, - 'TransformListContext': explicit_list, - 'AssignmentListContext': implicit_list, - 'MultipartIdentifierListContext': implicit_list, + 'OverlayContext': unsupported, + 'ParenthesizedExpressionContext': parenthesis_context, + 'PartitionSpecContext': unsupported, + 'PartitionSpecLocationContext': unsupported, + 'PartitionValContext': unsupported, + 'PivotClauseContext': unsupported, + 'PivotColumnContext': unsupported, + 'PivotValueContext': unsupported, + 'PositionContext': unsupported, + 'PredicateContext': unsupported, + 'PredicatedContext': unwrap, + 'PredicateOperatorContext': get_leaf_value, + 'PrimaryExpressionContext': never_found, + 'PrimitiveDataTypeContext': detect_data_type, + 'QualifiedColTypeWithPositionContext': unsupported, 'QualifiedColTypeWithPositionListContext': implicit_list, - 'ColTypeListContext': implicit_list, - 'ComplexColTypeListContext': implicit_list, + 'QualifiedNameContext': concat_strings, 'QualifiedNameListContext': implicit_list, - 'ComplexColTypeContext': implicit_list, - "ComparisonContext": binary_operation, - "ArithmeticBinaryContext": binary_operation, - "LogicalBinaryContext": binary_operation, - "RealIdentContext": empty, - "ParenthesizedExpressionContext": parenthesis_context, - "SubqueryContext": parenthesis_context, - "SubqueryExpressionContext": parenthesis_context, - "ArithmeticUnaryContext": unary_operation, - "LogicalNotContext": unary_operation, - 'CreateTableHeaderContext': unsupported, - 'ReplaceTableHeaderContext': unsupported, - 'CreateTableClausesContext': unsupported, - 'InlineTableContext': unsupported, - 'FunctionTableContext': unsupported, - 'CreateTableContext': unsupported, - 'CreateHiveTableContext': unsupported, - 'CreateTableLikeContext': unsupported, - 'ReplaceTableContext': unsupported, - 'AnalyzeContext': unsupported, - 'AddTableColumnsContext': unsupported, + 'QueryContext': unsupported, + 'QueryOrganizationContext': unsupported, + 'QueryPrimaryContext': never_found, + 'QueryPrimaryDefaultContext': unwrap, + 'QuerySpecificationContext': unsupported, + 'QueryTermContext': never_found, + 'QueryTermDefaultContext': unwrap, + 'QuotedIdentifierAlternativeContext': unwrap, + 'QuotedIdentifierContext': get_leaf_value, + 'RealIdentContext': empty, + 'RecoverPartitionsContext': unsupported, + 'RefreshResourceContext': unsupported, + 'RefreshTableContext': unsupported, + 'RegularQuerySpecificationContext': unsupported, + 'RelationContext': unsupported, + 'RelationPrimaryContext': never_found, 'RenameTableColumnContext': unsupported, - 'DropTableColumnsContext': unsupported, 'RenameTableContext': unsupported, - 'SetTablePropertiesContext': unsupported, - 'UnsetTablePropertiesContext': unsupported, - 'AlterTableAlterColumnContext': unsupported, - 'HiveChangeColumnContext': unsupported, - 'HiveReplaceColumnsContext': unsupported, - 'SetTableSerDeContext': unsupported, - 'AddTablePartitionContext': unsupported, 'RenameTablePartitionContext': unsupported, - 'DropTablePartitionsContext': unsupported, + 'RepairTableContext': unsupported, + 'ReplaceTableContext': unsupported, + 'ReplaceTableHeaderContext': unsupported, + 'ResetConfigurationContext': unwrap, + 'ResourceContext': unsupported, + 'RowConstructorContext': unsupported, + 'RowFormatContext': never_found, + 'RowFormatDelimitedContext': unsupported, + 'RowFormatSerdeContext': unsupported, + 'SampleByBucketContext': unsupported, + 'SampleByBytesContext': unsupported, + 'SampleByPercentileContext': unsupported, + 'SampleByRowsContext': unsupported, + 'SampleContext': unsupported, + 'SampleMethodContext': never_found, + 'SearchedCaseContext': unsupported, + 'SelectClauseContext': unsupported, + 'SetClauseContext': unsupported, + 'SetConfigurationContext': unsupported, + 'SetNamespaceLocationContext': unsupported, + 'SetNamespacePropertiesContext': unsupported, + 'SetOperationContext': unsupported, + 'SetQuantifierContext': get_leaf_value, 'SetTableLocationContext': unsupported, - 'RecoverPartitionsContext': unsupported, - 'DropTableContext': unsupported, - 'ShowTablesContext': unsupported, - 'ShowTableContext': unsupported, + 'SetTablePropertiesContext': unsupported, + 'SetTableSerDeContext': unsupported, + 'ShowColumnsContext': unsupported, 'ShowCreateTableContext': unsupported, - 'DescribeRelationContext': unsupported, - 'CommentTableContext': unsupported, - 'RefreshTableContext': unsupported, - 'CacheTableContext': unsupported, - 'UncacheTableContext': unsupported, - 'LoadDataContext': unsupported, + 'ShowCurrentNamespaceContext': unsupported, + 'ShowFunctionsContext': unsupported, + 'ShowNamespacesContext': unsupported, + 'ShowPartitionsContext': unsupported, + 'ShowTableContext': unsupported, + 'ShowTablesContext': unsupported, + 'ShowTblPropertiesContext': unsupported, + 'ShowViewsContext': unsupported, + 'SimpleCaseContext': unsupported, + 'SingleDataTypeContext': child_and_eof, + 'SingleExpressionContext': child_and_eof, + 'SingleFunctionIdentifierContext': child_and_eof, + 'SingleInsertQueryContext': unsupported, + 'SingleMultipartIdentifierContext': child_and_eof, + 'SingleStatementContext': first_child_only, + 'SingleTableIdentifierContext': child_and_eof, + 'SingleTableSchemaContext': child_and_eof, + 'SkewSpecContext': unsupported, + 'SmallIntLiteralContext': concat_to_value, + 'SortItemContext': unsupported, + 'SqlBaseParser': unsupported, + 'StarContext': unsupported, + 'StatementContext': never_found, + 'StatementDefaultContext': unwrap, + 'StorageHandlerContext': unsupported, + 'StrictIdentifierContext': never_found, + 'StrictNonReservedContext': get_leaf_value, + 'StringLiteralContext': remove_delimiter, + 'StructContext': build_struct, + 'SubqueryContext': parenthesis_context, + 'SubqueryExpressionContext': parenthesis_context, + 'SubscriptContext': unsupported, + 'SubstringContext': unsupported, + 'TableAliasContext': unsupported, + 'TableContext': unsupported, + 'TableFileFormatContext': unsupported, + 'TableIdentifierContext': unsupported, + 'TableNameContext': unsupported, + 'TablePropertyContext': unsupported, + 'TablePropertyKeyContext': unsupported, + 'TablePropertyListContext': explicit_list, + 'TablePropertyValueContext': unwrap, + 'TableProviderContext': unsupported, + 'onContext': unwrap, + 'TerminalNodeImpl': get_leaf_value, + 'TinyIntLiteralContext': concat_to_value, + 'TransformArgumentContext': unwrap, + 'TransformClauseContext': unsupported, + 'TransformContext': never_found, + 'TransformListContext': explicit_list, + 'TransformQuerySpecificationContext': unsupported, + 'TrimContext': unsupported, 'TruncateTableContext': unsupported, - 'RepairTableContext': unsupported, - 'InsertOverwriteTableContext': unsupported, - 'InsertIntoTableContext': unsupported, - 'DeleteFromTableContext': unsupported, - 'UpdateTableContext': unsupported, - 'MergeIntoTableContext': unsupported, + 'TypeConstructorContext': unsupported, + 'UncacheTableContext': unsupported, + 'UnitToUnitIntervalContext': unsupported, + 'UnquotedIdentifierContext': get_leaf_value, + 'UnsetTablePropertiesContext': unsupported, 'UnsupportedHiveNativeCommandsContext': unsupported, - 'CreateFileFormatContext': unsupported, - 'CreateNamespaceContext': unsupported, - 'CreateViewContext': unsupported, - 'CreateTempViewUsingContext': unsupported, - 'CreateFunctionContext': unsupported, - 'DropNamespaceContext': unsupported, - 'DropViewContext': unsupported, - 'DropFunctionContext': unsupported, - 'LateralViewContext': unsupported, - 'AlterViewQueryContext': unsupported, - 'ShowViewsContext': unsupported, - 'SetNamespacePropertiesContext': unsupported, - 'SetNamespaceLocationContext': unsupported, - 'ShowNamespacesContext': unsupported, - 'ShowCurrentNamespaceContext': unsupported, - 'DescribeNamespaceContext': unsupported, - 'CommentNamespaceContext': unsupported, + 'UpdateTableContext': unsupported, 'UseContext': unsupported, - 'JoinTypeContext': concat_keywords, - 'CastContext': cast_context, - 'PrimitiveDataTypeContext': detect_data_type, - 'ComplexDataTypeContext': detect_data_type, - 'StructContext': build_struct, - "NamedExpressionContext": potential_alias, - "ErrorCapturingIdentifierContext": check_identifier, - "ErrorIdentContext": concat_strings, - "FunctionCallContext": call_function, - "QualifiedNameContext": concat_strings, - # WIP! - # todo: check that all context are there - # including yyy: definition - # and definition #xxx - "PredicatedContext": unwrap, + 'ValueExpressionContext': never_found, + 'ValueExpressionDefaultContext': unwrap, + 'WhenClauseContext': unsupported, + 'WhereClauseContext': unsupported, + 'WindowClauseContext': unsupported, + 'WindowDefContext': unsupported, + 'WindowFrameContext': unsupported, + 'WindowRefContext': unsupported, + 'WindowSpecContext': never_found, } binary_operations = { From 6336aac13e61a0b15cba871c3c9e82a074b86fe1 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 31 Jan 2021 17:00:50 +0100 Subject: [PATCH 072/118] Simplify SQL alias definition parsing by using str for identifier --- pysparkling/sql/column.py | 2 +- pysparkling/sql/expressions/operators.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index f62c36ab6..c12b4a9e1 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -470,7 +470,7 @@ def alias(self, *alias, **kwargs): raise ValueError('Pysparkling does not support alias with metadata') if len(alias) == 1: - return Column(Alias(self, Literal(alias[0]))) + return Column(Alias(self, alias[0])) # pylint: disable=W0511 # todo: support it raise ValueError('Pysparkling does not support multiple aliases') diff --git a/pysparkling/sql/expressions/operators.py b/pysparkling/sql/expressions/operators.py index ce7c9cb85..ba30432e6 100644 --- a/pysparkling/sql/expressions/operators.py +++ b/pysparkling/sql/expressions/operators.py @@ -333,10 +333,10 @@ def args(self): class Alias(Expression): - def __init__(self, expr, alias): + def __init__(self, expr, alias: str): super().__init__(expr, alias) self.expr = expr - self.alias = alias.get_literal_value() + self.alias = alias @property def may_output_multiple_cols(self): From 5345821810c591d153c59c0a9df5d84d2469199f Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 15:32:38 +0100 Subject: [PATCH 073/118] Fix cyclic import --- pysparkling/sql/column.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index c12b4a9e1..6af1dcc76 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -1,4 +1,3 @@ -from pysparkling.sql.ast.ast_to_python import parse_data_type from .expressions.expressions import Expression from .expressions.fields import find_position_in_schema from .expressions.literals import Literal @@ -512,6 +511,8 @@ def cast(self, dataType): """ if isinstance(dataType, str): + # pylint: disable=import-outside-toplevel, cyclic-import + from pysparkling.sql.ast.ast_to_python import parse_data_type dataType = parse_data_type(dataType) elif not isinstance(dataType, DataType): raise NotImplementedError(f"Unknown cast type: {dataType}") From 14039afebcc56a59e2a6f11049c8ce5785c0f429 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 18:12:18 +0100 Subject: [PATCH 074/118] Upgrade pythonsqlparser --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b3c691dcf..485844f85 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ 'requests>=2.6.0', 'pytz>=2019.3', 'python-dateutil>=2.8.0', - 'pythonsqlparser==0.1.0', + 'pythonsqlparser==0.1.1', ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], From 242982d0ce919ea6e9c99e161df7da9d3bcfc084 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 19:14:08 +0100 Subject: [PATCH 075/118] Rely on sql parsing for schema parsing --- pysparkling/sql/ast/ast_to_python.py | 38 +++++++++++++----- .../sql/ast/tests/test_type_parsing.py | 40 ++++++++++++++++++- pysparkling/sql/types.py | 26 ++---------- 3 files changed, 71 insertions(+), 33 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index a51b23ae1..00efb4f29 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -7,11 +7,14 @@ from pysparkling.sql.expressions.expressions import expression_registry from pysparkling.sql.expressions.literals import Literal from pysparkling.sql.expressions.mappers import CreateStruct, Concat -from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, GreaterThan, \ - GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, Or, Negate, \ +from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, \ + GreaterThan, \ + GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, \ + Or, Negate, \ BitwiseNot, UnaryPositive, Alias from pysparkling.sql import functions -from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type +from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type, StructField, \ + StructType class SqlParsingError(Exception): @@ -122,6 +125,8 @@ def cast_context(*children): def detect_data_type(*children): + if children[0].__class__.__name__ == 'ErrorNodeImpl': + children = children[1:] data_type = convert_tree(children[0]) params = [convert_tree(c) for c in children[2:-1:2]] return parsed_string_to_type(data_type, params) @@ -141,7 +146,7 @@ def parenthesis_context(*children): return convert_tree(children[1]) -def parse_boolean(*children): +def convert_boolean(*children): check_children(1, children) value = convert_tree(children[0]) if value.lower() == "false": @@ -157,12 +162,23 @@ def convert_to_literal(*children): return Literal(value) -def parse_column(*children): +def convert_column(*children): check_children(1, children) value = convert_tree(children[0]) return Column(value) +def convert_field(*children): + name = convert_tree(children[0]) + data_type = convert_tree(children[1]) + return StructField(name, data_type) + + +def convert_table_schema(*children): + check_children(2, children) + return StructType(fields=convert_tree(children[0])) + + def convert_to_null(*children): return None @@ -256,15 +272,15 @@ def check_identifier(*children): 'BigIntLiteralContext': concat_to_value, 'BooleanExpressionContext': never_found, 'BooleanLiteralContext': unwrap, - 'BooleanValueContext': parse_boolean, + 'BooleanValueContext': convert_boolean, 'BucketSpecContext': unsupported, 'CacheTableContext': unsupported, 'CastContext': cast_context, 'ClearCacheContext': unsupported, 'ColPositionContext': unsupported, - 'ColTypeContext': unsupported, + 'ColTypeContext': convert_field, 'ColTypeListContext': implicit_list, - 'ColumnReferenceContext': parse_column, + 'ColumnReferenceContext': convert_column, 'CommentNamespaceContext': unsupported, 'CommentSpecContext': unsupported, 'CommentTableContext': unsupported, @@ -470,7 +486,7 @@ def check_identifier(*children): 'SingleMultipartIdentifierContext': child_and_eof, 'SingleStatementContext': first_child_only, 'SingleTableIdentifierContext': child_and_eof, - 'SingleTableSchemaContext': child_and_eof, + 'SingleTableSchemaContext': convert_table_schema, 'SkewSpecContext': unsupported, 'SmallIntLiteralContext': concat_to_value, 'SortItemContext': unsupported, @@ -568,5 +584,9 @@ def parse_data_type(string, debug=False): return parse_sql(string, "singleDataType", debug) +def parse_schema(string, debug=False): + return parse_sql(string, "singleTableSchema", debug) + + def parse_expression(string, debug=False): return parse_sql(string, "singleExpression", debug) diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index 692168cf0..0236f0a69 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -1,3 +1,5 @@ +import contextlib +import io from unittest import TestCase from parameterized import parameterized @@ -10,7 +12,7 @@ class TypeParsingTest(TestCase): - SCENARIOS = { + DATA_TYPE_SCENARIOS = { "boolean": BooleanType(), "tinyint": ByteType(), "byte": ByteType(), @@ -46,6 +48,40 @@ class TypeParsingTest(TestCase): # todo: "varchar": VarChar(), + with param } - @parameterized.expand(SCENARIOS.items()) + @parameterized.expand(DATA_TYPE_SCENARIOS.items()) def test_equal(self, string, data_type): self.assertEqual(parse_data_type(string), data_type) + + SCHEMA_SCENARIOS = { + 'some_str: string, some_int: integer, some_date: date': ( + 'root\n' + ' |-- some_str: string (nullable = true)\n' + ' |-- some_int: integer (nullable = true)\n' + ' |-- some_date: date (nullable = true)\n' + ), + 'some_str: string, arr: array': ( + 'root\n' + ' |-- some_str: string (nullable = true)\n' + ' |-- arr: array (nullable = true)\n' + ' | |-- element: string (containsNull = true)\n' + ), + 'some_str: string, arr: array>': ( + 'root\n' + ' |-- some_str: string (nullable = true)\n' + ' |-- arr: array (nullable = true)\n' + ' | |-- element: array (containsNull = true)\n' + ' | | |-- element: string (containsNull = true)\n' + ), + } + + @parameterized.expand(SCHEMA_SCENARIOS.items()) + def test_dataframe_schema_parsing(self, schema, printed_schema): + from pysparkling import Context + from pysparkling.sql.session import SparkSession + spark = SparkSession(Context()) + df = spark.createDataFrame([], schema=schema) + + f = io.StringIO() + with contextlib.redirect_stdout(f): + df.printSchema() + self.assertEqual(printed_schema, f.getvalue()) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 31414c978..a39511732 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -693,26 +693,8 @@ def fromInternal(self, obj): @classmethod def fromDDL(cls, string): - def get_class(type_: str) -> DataType: - type_to_load = f'{type_.strip().title()}Type' - - if type_to_load not in globals(): - match = re.match(r'^\s*array\s*<(.*)>\s*$', type_, flags=re.IGNORECASE) - if match: - return ArrayType(get_class(match.group(1))) - - raise ValueError(f"Couldn't find '{type_to_load}'?") - - return globals()[type_to_load]() - - fields = StructType() - - for description in string.split(','): - name, type_ = [x.strip() for x in description.split(':')] - - fields.add(StructField(name.strip(), get_class(type_), True)) - - return fields + from .ast.ast_to_python import parse_schema + return parse_schema(string) class UserDefinedType(DataType): @@ -1840,8 +1822,8 @@ def _check_series_convert_timestamps_tz_local(s, timezone): byte=ByteType(), smallint=ShortType(), short=ShortType(), - int=LongType(), - integer=LongType(), + int=IntegerType(), + integer=IntegerType(), bigint=LongType(), long=LongType(), float=FloatType(), From c5f3d3f993e15f9f313b204b34302686c34872c5 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 19:32:16 +0100 Subject: [PATCH 076/118] Remove duplicated dependency --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 485844f85..0b1ac9ad4 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,6 @@ ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], - 'pandas': ['pandas>=0.23.2'], 'performance': ['matplotlib>=1.5.3'], 'streaming': ['tornado>=4.3'], 'dev': ['antlr4-python3-runtime==4.7.1'], From add0a9c6cbcfd73767176d04a7e855d8356ca8de Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 20:17:16 +0100 Subject: [PATCH 077/118] Sort imports --- pysparkling/sql/ast/ast_to_python.py | 18 ++++++++---------- pysparkling/sql/ast/tests/test_functions.py | 2 +- pysparkling/sql/ast/tests/test_type_parsing.py | 8 ++++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 00efb4f29..bbe46e38f 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -3,18 +3,16 @@ from sqlparser import string_to_ast -from pysparkling.sql.column import parse, Column +from pysparkling.sql import functions +from pysparkling.sql.column import Column, parse from pysparkling.sql.expressions.expressions import expression_registry from pysparkling.sql.expressions.literals import Literal -from pysparkling.sql.expressions.mappers import CreateStruct, Concat -from pysparkling.sql.expressions.operators import Equal, Invert, LessThan, LessThanOrEqual, \ - GreaterThan, \ - GreaterThanOrEqual, Add, Minus, Time, Divide, Mod, Cast, And, BitwiseAnd, BitwiseOr, BitwiseXor, \ - Or, Negate, \ - BitwiseNot, UnaryPositive, Alias -from pysparkling.sql import functions -from pysparkling.sql.types import DoubleType, StringType, parsed_string_to_type, StructField, \ - StructType +from pysparkling.sql.expressions.mappers import Concat, CreateStruct +from pysparkling.sql.expressions.operators import ( + Add, Alias, And, BitwiseAnd, BitwiseNot, BitwiseOr, BitwiseXor, Cast, Divide, Equal, GreaterThan, + GreaterThanOrEqual, Invert, LessThan, LessThanOrEqual, Minus, Mod, Negate, Or, Time, UnaryPositive +) +from pysparkling.sql.types import DoubleType, parsed_string_to_type, StringType, StructField, StructType class SqlParsingError(Exception): diff --git a/pysparkling/sql/ast/tests/test_functions.py b/pysparkling/sql/ast/tests/test_functions.py index 4756e211d..f8792d158 100644 --- a/pysparkling/sql/ast/tests/test_functions.py +++ b/pysparkling/sql/ast/tests/test_functions.py @@ -5,7 +5,7 @@ from pysparkling import Row from pysparkling.sql.ast.ast_to_python import parse_expression -from pysparkling.sql.types import StructType, IntegerType, StructField +from pysparkling.sql.types import IntegerType, StructField, StructType ROW = Row(a=1, b=2, c=3) SCHEMA = StructType([ diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index 0236f0a69..ea570b0b5 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -4,11 +4,11 @@ from parameterized import parameterized - from pysparkling.sql.ast.ast_to_python import parse_data_type -from pysparkling.sql.types import BooleanType, ByteType, ShortType, IntegerType, \ - LongType, FloatType, DoubleType, DateType, TimestampType, StringType, BinaryType, \ - DecimalType, ArrayType, MapType, StructType, StructField +from pysparkling.sql.types import ( + ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, IntegerType, LongType, + MapType, ShortType, StringType, StructField, StructType, TimestampType +) class TypeParsingTest(TestCase): From c36eafb9e064e4e1dbc5b375d118539373517fef Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sat, 27 Feb 2021 20:26:51 +0100 Subject: [PATCH 078/118] Upgrade pylint --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0b1ac9ad4..c89cf98a4 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ 'backports.tempfile==1.0rc1', 'cloudpickle>=0.1.0', 'futures>=3.0.1', - 'pylint>=2.3,<2.6', + 'pylint~=2.7', 'pylzma', 'memory-profiler>=0.47', 'pycodestyle', From b271ac574638949a6bfd450020a4555352b413ff Mon Sep 17 00:00:00 2001 From: Steven Van Ingelgem Date: Sun, 28 Feb 2021 13:13:16 +0100 Subject: [PATCH 079/118] Fixed pylint issues. --- pysparkling/sql/ast/ast_to_python.py | 28 +++++++++---------- .../sql/ast/tests/test_type_parsing.py | 4 +-- pysparkling/sql/types.py | 1 + setup.py | 7 +++-- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index bbe46e38f..b117003dc 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -3,16 +3,16 @@ from sqlparser import string_to_ast -from pysparkling.sql import functions -from pysparkling.sql.column import Column, parse -from pysparkling.sql.expressions.expressions import expression_registry -from pysparkling.sql.expressions.literals import Literal -from pysparkling.sql.expressions.mappers import Concat, CreateStruct -from pysparkling.sql.expressions.operators import ( +from ...sql import functions +from ..column import Column, parse +from ..expressions.expressions import expression_registry +from ..expressions.literals import Literal +from ..expressions.mappers import Concat, CreateStruct +from ..expressions.operators import ( Add, Alias, And, BitwiseAnd, BitwiseNot, BitwiseOr, BitwiseXor, Cast, Divide, Equal, GreaterThan, GreaterThanOrEqual, Invert, LessThan, LessThanOrEqual, Minus, Mod, Negate, Or, Time, UnaryPositive ) -from pysparkling.sql.types import DoubleType, parsed_string_to_type, StringType, StructField, StructType +from ..types import DoubleType, parsed_string_to_type, StringType, StructField, StructType class SqlParsingError(Exception): @@ -66,7 +66,7 @@ def convert_tree(tree): try: converter = CONVERTERS[tree_type] except UnsupportedStatement: - raise SqlParsingError("Unsupported statement {0}".format(tree_type)) + raise SqlParsingError("Unsupported statement {0}".format(tree_type)) from None return converter(*tree.children) @@ -86,14 +86,14 @@ def call_function(*children): ) if not complex_function: last_argument_position = None - filter_clause = None - over_clause = None - set_clause = None + # filter_clause = None + # over_clause = None + # set_clause = None else: last_argument_position = params.index(")") - filter_clause = ... # todo - over_clause = ... # todo - set_clause = ... # todo + # filter_clause = ... # todo + # over_clause = ... # todo + # set_clause = ... # todo # parameters are comma separated function_arguments = params[0:last_argument_position:2] diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index ea570b0b5..d21e888ba 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -4,7 +4,9 @@ from parameterized import parameterized +from pysparkling import Context from pysparkling.sql.ast.ast_to_python import parse_data_type +from pysparkling.sql.session import SparkSession from pysparkling.sql.types import ( ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, IntegerType, LongType, MapType, ShortType, StringType, StructField, StructType, TimestampType @@ -76,8 +78,6 @@ def test_equal(self, string, data_type): @parameterized.expand(SCHEMA_SCENARIOS.items()) def test_dataframe_schema_parsing(self, schema, printed_schema): - from pysparkling import Context - from pysparkling.sql.session import SparkSession spark = SparkSession(Context()) df = spark.createDataFrame([], schema=schema) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index a39511732..3eb8fc1c8 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -693,6 +693,7 @@ def fromInternal(self, obj): @classmethod def fromDDL(cls, string): + # pylint: disable=import-outside-toplevel, cyclic-import from .ast.ast_to_python import parse_schema return parse_schema(string) diff --git a/setup.py b/setup.py index c89cf98a4..7f28d577a 100644 --- a/setup.py +++ b/setup.py @@ -18,13 +18,16 @@ 'requests>=2.6.0', 'pytz>=2019.3', 'python-dateutil>=2.8.0', - 'pythonsqlparser==0.1.1', + 'pythonsqlparser', ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], 'performance': ['matplotlib>=1.5.3'], 'streaming': ['tornado>=4.3'], - 'dev': ['antlr4-python3-runtime==4.7.1'], + 'dev': [ + 'antlr4-python3-runtime==4.7.1', + 'parameterized', + ], 'sql': [ 'numpy', 'pandas>=0.23.2', From 9d7d3df93d014c2569176682a497e8e22474f1a6 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:32:54 +0100 Subject: [PATCH 080/118] Add tests on parse_ddl_string --- .../sql/ast/tests/test_parse_ddl_string.py | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 pysparkling/sql/ast/tests/test_parse_ddl_string.py diff --git a/pysparkling/sql/ast/tests/test_parse_ddl_string.py b/pysparkling/sql/ast/tests/test_parse_ddl_string.py new file mode 100644 index 000000000..5a59f7a40 --- /dev/null +++ b/pysparkling/sql/ast/tests/test_parse_ddl_string.py @@ -0,0 +1,112 @@ +from unittest import TestCase + +import pytest +from pysparkling.sql.ast.ast_to_python import parse_ddl_string + +from pysparkling.sql.types import ( + ArrayType, ByteType, DateType, DecimalType, DoubleType, IntegerType, LongType, MapType, + ShortType, StringType, + StructField, StructType +) +from pysparkling.sql.utils import ParseException + + +class TestFunctions(TestCase): + def test_basic_entries(self): + schema = parse_ddl_string('some_str: string, some_int: integer, some_date: date not null') + assert schema == StructType([ + StructField('some_str', StringType(), True), + StructField('some_int', IntegerType(), True), + StructField('some_date', DateType(), False), + ]) + assert str(schema) == ( + 'StructType(List(' + 'StructField(some_str,StringType,true),' + 'StructField(some_int,IntegerType,true),' + 'StructField(some_date,DateType,true)' + '))' + ) + + def test_just_returning_the_type(self): + schema = parse_ddl_string('int') + assert schema == IntegerType() + + schema = parse_ddl_string('INT') + assert schema == IntegerType() + + def test_byte_decimal(self): + schema = parse_ddl_string("a: byte, b: decimal( 16 , 8 ) ") + assert schema == StructType([ + StructField('a', ByteType(), True), + StructField('b', DecimalType(16, 8), True), + ]) + assert str( + schema) == 'StructType(List(StructField(a,ByteType,true),StructField(b,DecimalType(16,8),true)))' + + def test_double_string(self): + schema = parse_ddl_string("a DOUBLE, b STRING") + assert schema == StructType([ + StructField('a', DoubleType(), True), + StructField('b', StringType(), True), + ]) + assert str( + schema) == 'StructType(List(StructField(a,DoubleType,true),StructField(b,StringType,true)))' + + def test_array_short(self): + schema = parse_ddl_string("a: array< short>") + assert schema == StructType([ + StructField('a', ArrayType(ShortType()), True), + ]) + assert str(schema) == 'StructType(List(StructField(a,ArrayType(ShortType,true),true)))' + + def test_map(self): + schema = parse_ddl_string(" map ") + assert schema == MapType(StringType(), StringType(), True) + assert str(schema) == 'MapType(StringType,StringType,true)' + + def test_array(self): + schema = parse_ddl_string('some_str: string, arr: array') + assert schema == StructType([ + StructField('some_str', StringType(), True), + StructField('arr', ArrayType(StringType()), True), + ]) + assert str(schema) == 'StructType(List(' \ + 'StructField(some_str,StringType,true),' \ + 'StructField(arr,ArrayType(StringType,true),true)' \ + '))' + + def test_nested_array(self): + schema = parse_ddl_string('some_str: string, arr: array>') + assert schema == StructType([ + StructField('some_str', StringType(), True), + StructField('arr', ArrayType(ArrayType(StringType())), True), + ]) + assert str(schema) == 'StructType(List(' \ + 'StructField(some_str,StringType,true),' \ + 'StructField(arr,ArrayType(ArrayType(StringType,true),true),true)' \ + '))' + + def test_alias__long_bigint(self): + schema = parse_ddl_string('i1: long, i2: bigint') + assert schema == StructType([ + StructField('i1', LongType(), True), + StructField('i2', LongType(), True), + ]) + assert str(schema) == 'StructType(List(StructField(i1,LongType,true),StructField(i2,LongType,true)))' + + # Error cases + def test_wrong_type(self): + with pytest.raises(ParseException): + parse_ddl_string("blabla") + + def test_comma_at_end(self): + with pytest.raises(ParseException): + parse_ddl_string("a: int,") + + def test_unclosed_array(self): + with pytest.raises(ParseException): + parse_ddl_string("array>") From 9e354baacd5b9923fe39932be81b01596be1848a Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:33:14 +0100 Subject: [PATCH 081/118] Add tests on type parsing --- .../sql/ast/tests/test_type_parsing.py | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index d21e888ba..3e751fd00 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -8,20 +8,23 @@ from pysparkling.sql.ast.ast_to_python import parse_data_type from pysparkling.sql.session import SparkSession from pysparkling.sql.types import ( - ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, IntegerType, LongType, - MapType, ShortType, StringType, StructField, StructType, TimestampType + ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, + IntegerType, LongType, + MapType, ShortType, StringType, StructField, StructType, TimestampType, NullType ) class TypeParsingTest(TestCase): DATA_TYPE_SCENARIOS = { "boolean": BooleanType(), + "booLean": BooleanType(), "tinyint": ByteType(), "byte": ByteType(), "smallint": ShortType(), "short": ShortType(), "int": IntegerType(), "integer": IntegerType(), + "INTeger": IntegerType(), "bigint": LongType(), "long": LongType(), "float": FloatType(), @@ -32,28 +35,96 @@ class TypeParsingTest(TestCase): "string": StringType(), "binary": BinaryType(), "decimal": DecimalType(10, 0), + "decimal(10,5)": DecimalType(10, 5), "decimal(5)": DecimalType(5, 0), "decimal(5, 2)": DecimalType(5, 2), "dec": DecimalType(10, 0), + "dec(25)": DecimalType(25, 0), + "dec(25, 21)": DecimalType(25, 21), "numeric": DecimalType(10, 0), "Array": ArrayType(StringType()), "Array": ArrayType(IntegerType()), + "array": ArrayType(DoubleType()), + "Array>": ArrayType(MapType(IntegerType(), ByteType(), True), True), + "MAP": MapType(IntegerType(), StringType()), "Map": MapType(StringType(), IntegerType()), "Map < integer, String >": MapType(IntegerType(), StringType()), "Struct": StructType([ StructField(name="name", dataType=StringType()), StructField(name="age", dataType=IntegerType()), ]), - # todo: "interval": CalendarIntervalType(), - # todo: "char": CharType(), + with param - # todo: "character": CharType(), + with param - # todo: "varchar": VarChar(), + with param + "array>": ArrayType( + StructType([StructField('tinYint', ByteType(), True)]), + True + ), + "MAp>": MapType(IntegerType(), ArrayType(DoubleType(), True), True), + "MAP>": MapType( + IntegerType(), + StructType([StructField("varchar", StringType(), True)]), + True + ), + "struct": StructType([ + StructField("intType", IntegerType(), True), + StructField("ts", TimestampType(), True) + ]), + "Struct": StructType([ + StructField("int", IntegerType(), True), + StructField("timestamp", TimestampType(), True) + ]), + """ + struct< + struct:struct, + MAP:Map, + arrAy:Array, + anotherArray:Array + > + """: ( + StructType([ + StructField("struct", StructType([ + StructField("deciMal", DecimalType(), True), + StructField("anotherDecimal", DecimalType(5, 2), True) + ]), True), + # StructField("MAP", MapType(TimestampType(), VarcharType(10)), True), + StructField("MAP", MapType(TimestampType(), StringType()), True), + StructField("arrAy", ArrayType(DoubleType(), True), True), + # StructField("anotherArray", ArrayType(CharType(9), True), True)]) + StructField("anotherArray", ArrayType(StringType(), True), True) + ]) + ), + "struct<`x+y`:int, `!@#$%^&*()`:string, `1_2.345<>:\"`:varchar(20)>": StructType([ + StructField("x+y", IntegerType(), True), + StructField("!@#$%^&*()", StringType(), True), + # StructField("1_2.345<>:\"", VarcharType(20), True)]) + StructField("1_2.345<>:\"", StringType(), True) + ]), + "strUCt<>": StructType([]), + "Struct": StructType([ + StructField("TABLE", StringType(), True), + StructField("DATE", BooleanType(), True) + ]), + "struct": StructType([ + StructField("end", LongType(), True), + StructField("select", IntegerType(), True), + StructField("from", StringType(), True), + ]), + "Struct": StructType([ + StructField("x", IntegerType(), True), + StructField("y", StringType(), True, {'comment': 'test'}), + ]) } @parameterized.expand(DATA_TYPE_SCENARIOS.items()) def test_equal(self, string, data_type): self.assertEqual(parse_data_type(string), data_type) + def test_adhoc(self): + string = "Struct" + data_type = StructType([ + StructField("x", IntegerType(), True), + StructField("y", StringType(), True, {'comment': 'test'}), + ]) + self.assertEqual(parse_data_type(string), data_type) + SCHEMA_SCENARIOS = { 'some_str: string, some_int: integer, some_date: date': ( 'root\n' From 42327c89b90051bb9cee41c87caf7a7d0584b168 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:33:52 +0100 Subject: [PATCH 082/118] Make SqlParsingError a ParseException --- pysparkling/sql/ast/ast_to_python.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index b117003dc..543ad7e4f 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -2,6 +2,7 @@ import logging from sqlparser import string_to_ast +from ..utils import ParseException from ...sql import functions from ..column import Column, parse @@ -15,7 +16,7 @@ from ..types import DoubleType, parsed_string_to_type, StringType, StructField, StructType -class SqlParsingError(Exception): +class SqlParsingError(ParseException): pass From 620105fab1efbe9085cd1055a8cab6ab793ec783 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:36:22 +0100 Subject: [PATCH 083/118] Enhance ErrorNodeImpl handling --- pysparkling/sql/ast/ast_to_python.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 543ad7e4f..580c3fce1 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -68,7 +68,11 @@ def convert_tree(tree): converter = CONVERTERS[tree_type] except UnsupportedStatement: raise SqlParsingError("Unsupported statement {0}".format(tree_type)) from None - return converter(*tree.children) + children = tree.children or () + for c in tree.children: + if c.__class__.__name__ == 'ErrorNodeImpl': + raise SqlParsingError(f'Unable to parse data type, unexpected {c.symbol}') + return converter(*children) def call_function(*children): @@ -124,8 +128,6 @@ def cast_context(*children): def detect_data_type(*children): - if children[0].__class__.__name__ == 'ErrorNodeImpl': - children = children[1:] data_type = convert_tree(children[0]) params = [convert_tree(c) for c in children[2:-1:2]] return parsed_string_to_type(data_type, params) From 50c198415ceac583f74dedab867780c482fdac96 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:36:35 +0100 Subject: [PATCH 084/118] Fix StructType generation --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 580c3fce1..77f1be632 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -177,7 +177,7 @@ def convert_field(*children): def convert_table_schema(*children): check_children(2, children) - return StructType(fields=convert_tree(children[0])) + return StructType(fields=list(convert_tree(children[0]))) def convert_to_null(*children): From 41100b68ef3215946ec38604aeda2195726167e4 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:37:32 +0100 Subject: [PATCH 085/118] Fix some conversion from sql to python --- pysparkling/sql/ast/ast_to_python.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 77f1be632..a00409145 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -206,6 +206,19 @@ def explicit_list(*children): ) +def convert_to_complex_col_type(*children): + name = convert_tree(children[0]) + data_type = convert_tree(children[2]) + if len(children) > 3: + params = [convert_tree(c) for c in children[3:]] + nullable = not (params[0].lower() == 'not' and params[1].lower() == ['null']) + metadata = params[3:] or None + else: + nullable = False + metadata = None + return name, data_type, nullable, metadata + + def implicit_list(*children): return tuple( convert_tree(c) @@ -240,8 +253,15 @@ def potential_alias(*children): raise SqlParsingError("Expecting 1, 2 or 3 children, got {0}".format(len(children))) +def get_quoted_identifier(*children): + value = get_leaf_value(*children) + return value[1:-1] + + def check_identifier(*children): check_children(2, children) + if children[0].children is None: + raise SqlParsingError("Expected identifier not found") from children[0].exception identifier = convert_tree(children[0]) if children[1].children: extra = convert_tree(children[1]) @@ -287,7 +307,7 @@ def check_identifier(*children): 'CommentTableContext': unsupported, 'ComparisonContext': binary_operation, 'ComparisonOperatorContext': get_leaf_value, - 'ComplexColTypeContext': implicit_list, + 'ComplexColTypeContext': convert_to_complex_col_type, 'ComplexColTypeListContext': implicit_list, 'ComplexDataTypeContext': detect_data_type, 'ConstantContext': never_found, @@ -432,7 +452,7 @@ def check_identifier(*children): 'QueryTermContext': never_found, 'QueryTermDefaultContext': unwrap, 'QuotedIdentifierAlternativeContext': unwrap, - 'QuotedIdentifierContext': get_leaf_value, + 'QuotedIdentifierContext': get_quoted_identifier, 'RealIdentContext': empty, 'RecoverPartitionsContext': unsupported, 'RefreshResourceContext': unsupported, @@ -527,7 +547,7 @@ def check_identifier(*children): 'TypeConstructorContext': unsupported, 'UncacheTableContext': unsupported, 'UnitToUnitIntervalContext': unsupported, - 'UnquotedIdentifierContext': get_leaf_value, + 'UnquotedIdentifierContext': unwrap, 'UnsetTablePropertiesContext': unsupported, 'UnsupportedHiveNativeCommandsContext': unsupported, 'UpdateTableContext': unsupported, From bfb6b1b76cbc02b5dbaa423867a249cda727129d Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:37:41 +0100 Subject: [PATCH 086/118] Implement parse_ddl_string --- pysparkling/sql/ast/ast_to_python.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index a00409145..44ecf5729 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -611,3 +611,13 @@ def parse_schema(string, debug=False): def parse_expression(string, debug=False): return parse_sql(string, "singleExpression", debug) + + +def parse_ddl_string(string, debug=False): + try: + return parse_schema(string, debug) + except ParseException: + try: + return parse_data_type(string, debug) + except ParseException: + return parse_data_type(f"struct<{string.strip()}>") From a168162e69c53a726f66abd2dd393102521cd1b3 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Wed, 17 Mar 2021 17:38:48 +0100 Subject: [PATCH 087/118] Replace StructType.fromDDL by a more versatile parse_ddl_string --- pysparkling/sql/session.py | 3 ++- pysparkling/sql/types.py | 43 ++++++-------------------------------- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/pysparkling/sql/session.py b/pysparkling/sql/session.py index babd55d99..4f71004db 100644 --- a/pysparkling/sql/session.py +++ b/pysparkling/sql/session.py @@ -1,5 +1,6 @@ from threading import RLock +from .ast.ast_to_python import parse_ddl_string from ..__version__ import __version__ from ..context import Context from ..rdd import RDD @@ -223,7 +224,7 @@ def createDataFrame(self, data, schema=None, samplingRatio=None, verifySchema=Tr raise TypeError("data is already a DataFrame") if isinstance(schema, str): - schema = StructType.fromDDL(schema) + schema = parse_ddl_string(schema) elif isinstance(schema, (list, tuple)): # Must re-encode any unicode strings to be consistent with StructField names schema = [x.encode('utf-8') if not isinstance(x, str) else x for x in schema] diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 3eb8fc1c8..21e9a81d6 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -553,19 +553,20 @@ def simpleString(self): def treeString(self): """ - >>> schema = StructType.fromDDL('some_str: string, some_int: integer, some_date: date') + >>> from pysparkling.sql.ast.ast_to_python import parse_ddl_string + >>> schema = parse_ddl_string('some_str: string, some_int: integer, some_date: date') >>> print(schema.treeString()) |-- some_str: string (nullable = true) |-- some_int: integer (nullable = true) |-- some_date: date (nullable = true) - >>> schema = StructType.fromDDL('some_str: string, arr: array') + >>> schema = parse_ddl_string('some_str: string, arr: array') >>> print(schema.treeString()) |-- some_str: string (nullable = true) |-- arr: array (nullable = true) | |-- element: string (containsNull = true) - >>> schema = StructType.fromDDL('some_str: string, arr: array>') + >>> schema = parse_ddl_string('some_str: string, arr: array>') >>> print(schema.treeString()) |-- some_str: string (nullable = true) |-- arr: array (nullable = true) @@ -691,12 +692,6 @@ def fromInternal(self, obj): values = obj return create_row(self.names, values) - @classmethod - def fromDDL(cls, string): - # pylint: disable=import-outside-toplevel, cyclic-import - from .ast.ast_to_python import parse_schema - return parse_schema(string) - class UserDefinedType(DataType): """User-defined type (UDT). @@ -829,34 +824,8 @@ def _parse_datatype_string(s): for :class:`IntegerType`. Since Spark 2.3, this also supports a schema in a DDL-formatted string and case-insensitive strings. """ - raise NotImplementedError("_parse_datatype_string is not yet supported by pysparkling") - # pylint: disable=W0511 - # todo: implement in pure Python the code below - # NB: it probably requires to use antl4r - - # sc = SparkContext._active_spark_context - # - # def from_ddl_schema(type_str): - # return _parse_datatype_json_string( - # sc._jvm.org.apache.spark.sql.types.StructType.fromDDL(type_str).json()) - # - # def from_ddl_datatype(type_str): - # return _parse_datatype_json_string( - # sc._jvm.org.apache.spark.sql.api.python.PythonSQLUtils.parseDataType(type_str).json()) - # - # try: - # # DDL format, "fieldname datatype, fieldname datatype". - # return from_ddl_schema(s) - # except Exception as e: - # try: - # # For backwards compatibility, "integer", "struct" and etc. - # return from_ddl_datatype(s) - # except: - # try: - # # For backwards compatibility, "fieldname: datatype, fieldname: datatype" case. - # return from_ddl_datatype("struct<%s>" % s.strip()) - # except: - # raise e + from pysparkling.sql.ast.ast_to_python import parse_ddl_string + return parse_ddl_string(s) def _parse_datatype_json_string(json_string): From 2423ccf02df48360bd0b177d802980e638c4bacf Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 21 Mar 2021 14:54:53 +0100 Subject: [PATCH 088/118] tmp test --- pysparkling/sql/ast/tests/test_type_parsing.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index 3e751fd00..ce222eeae 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -117,11 +117,18 @@ class TypeParsingTest(TestCase): def test_equal(self, string, data_type): self.assertEqual(parse_data_type(string), data_type) - def test_adhoc(self): - string = "Struct" + def test_comment(self): + string = ( + "Struct<" + "x: INT Not null, " + "y: STRING COMMENT 'nullable', " + "z: string not null COMMENT 'test'" + ">" + ) data_type = StructType([ - StructField("x", IntegerType(), True), - StructField("y", StringType(), True, {'comment': 'test'}), + StructField("x", IntegerType(), False), + StructField("y", StringType(), True, {'comment': 'nullable'}), + StructField("z", StringType(), False, {'comment': 'test'}), ]) self.assertEqual(parse_data_type(string), data_type) From 6e11ec6dd530d76af5eb2930c9ff71894b681cac Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 21 Mar 2021 14:55:32 +0100 Subject: [PATCH 089/118] tmp error node imp --- pysparkling/sql/ast/ast_to_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 44ecf5729..c4e10c96a 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -69,7 +69,7 @@ def convert_tree(tree): except UnsupportedStatement: raise SqlParsingError("Unsupported statement {0}".format(tree_type)) from None children = tree.children or () - for c in tree.children: + for c in children: if c.__class__.__name__ == 'ErrorNodeImpl': raise SqlParsingError(f'Unable to parse data type, unexpected {c.symbol}') return converter(*children) From 4d1411673ac958267ddb2830a156dcd3a9fffda1 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 14:20:30 +0200 Subject: [PATCH 090/118] Enhance error handling --- pysparkling/sql/ast/ast_to_python.py | 19 +++++++++++-------- .../sql/ast/tests/test_parse_ddl_string.py | 10 +++++----- pysparkling/sql/types.py | 16 ++++++++-------- pysparkling/sql/utils.py | 4 ---- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index c4e10c96a..78816ec17 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -2,7 +2,7 @@ import logging from sqlparser import string_to_ast -from ..utils import ParseException +from sqlparser.internalparser import SqlParsingError from ...sql import functions from ..column import Column, parse @@ -16,10 +16,6 @@ from ..types import DoubleType, parsed_string_to_type, StringType, StructField, StructType -class SqlParsingError(ParseException): - pass - - class UnsupportedStatement(SqlParsingError): pass @@ -44,7 +40,11 @@ def never_found(*children): def unsupported(*children): - raise UnsupportedStatement + if children: + parent_context = children[0].parentCtx.__class__.__name__ + else: + parent_context = 'unknown' + raise UnsupportedStatement(parent_context) def empty(*children): @@ -615,9 +615,12 @@ def parse_expression(string, debug=False): def parse_ddl_string(string, debug=False): try: + # DDL format, "fieldname datatype, fieldname datatype". return parse_schema(string, debug) - except ParseException: + except SqlParsingError: try: + # For backwards compatibility, "integer", "struct" and etc. return parse_data_type(string, debug) - except ParseException: + except SqlParsingError: + # For backwards compatibility, "fieldname: datatype, fieldname: datatype" case. return parse_data_type(f"struct<{string.strip()}>") diff --git a/pysparkling/sql/ast/tests/test_parse_ddl_string.py b/pysparkling/sql/ast/tests/test_parse_ddl_string.py index 5a59f7a40..71fc9be2a 100644 --- a/pysparkling/sql/ast/tests/test_parse_ddl_string.py +++ b/pysparkling/sql/ast/tests/test_parse_ddl_string.py @@ -8,7 +8,7 @@ ShortType, StringType, StructField, StructType ) -from pysparkling.sql.utils import ParseException +from sqlparser import SqlParsingError class TestFunctions(TestCase): @@ -96,17 +96,17 @@ def test_alias__long_bigint(self): # Error cases def test_wrong_type(self): - with pytest.raises(ParseException): + with pytest.raises(SqlParsingError): parse_ddl_string("blabla") def test_comma_at_end(self): - with pytest.raises(ParseException): + with pytest.raises(SqlParsingError): parse_ddl_string("a: int,") def test_unclosed_array(self): - with pytest.raises(ParseException): + with pytest.raises(SqlParsingError): parse_ddl_string("array>") diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 21e9a81d6..d59b64f50 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -24,7 +24,8 @@ import re import sys -from .utils import ParseException, require_minimum_pandas_version +from sqlparser.internalparser import SqlParsingError +from .utils import require_minimum_pandas_version __all__ = [ "DataType", "NullType", "StringType", "BinaryType", "BooleanType", "DateType", @@ -1819,18 +1820,17 @@ def parsed_string_to_type(data_type, arguments): elif len(arguments) == 1: precision, scale = arguments[0], 0 else: - raise ParseException("Unrecognized decimal parameters: {0}".format(arguments)) + raise SqlParsingError("Unrecognized decimal parameters: {0}".format(arguments)) return DecimalType(precision=int(precision), scale=int(scale)) if data_type == "array" and len(arguments) == 1: return ArrayType(arguments[0]) if data_type == "map" and len(arguments) == 2: return MapType(arguments[0], arguments[1]) - if data_type == "struct" and len(arguments) == 1: - return StructType([ - StructField(name, data_type) - for name, data_type in arguments[0] - ]) - raise ParseException( + if data_type == "struct" and len(arguments) == 1 and all(len(arg) >= 2 for arg in arguments[0]): + return StructType([StructField(*arg) for arg in arguments[0]]) + if data_type in ("char", "varchar") and len(arguments) == 1: + return StringType() + raise SqlParsingError( "Unable to parse data type {0}{1}".format(data_type, arguments if arguments else "") ) diff --git a/pysparkling/sql/utils.py b/pysparkling/sql/utils.py index d5dcfcd15..ac08f7335 100644 --- a/pysparkling/sql/utils.py +++ b/pysparkling/sql/utils.py @@ -6,10 +6,6 @@ class AnalysisException(CapturedException): pass -class ParseException(CapturedException): - pass - - class IllegalArgumentException(CapturedException): pass From e28e6bb1549052fdfafe510301aaf3541df8a2b5 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 14:20:53 +0200 Subject: [PATCH 091/118] Enhance type parsing --- pysparkling/sql/ast/ast_to_python.py | 20 ++++++++++++++----- .../sql/ast/tests/test_parse_ddl_string.py | 2 +- pysparkling/sql/types.py | 5 +++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 78816ec17..68370f037 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -211,10 +211,15 @@ def convert_to_complex_col_type(*children): data_type = convert_tree(children[2]) if len(children) > 3: params = [convert_tree(c) for c in children[3:]] - nullable = not (params[0].lower() == 'not' and params[1].lower() == ['null']) - metadata = params[3:] or None + if len(params) >= 2 and isinstance(params[0], str) and isinstance(params[1], str): + nullable = (params[0].lower(), params[1].lower()) != ('not', 'null') + raw_metadata = params[2:] + else: + nullable = True + raw_metadata = params + metadata = {k.lower(): v for k, v in raw_metadata} or None else: - nullable = False + nullable = True metadata = None return name, data_type, nullable, metadata @@ -272,6 +277,11 @@ def check_identifier(*children): return identifier +def convert_comment(*children): + check_children(2, children) + return "COMMENT", convert_tree(children[1])[1:-1] + + CONVERTERS = { 'AddTableColumnsContext': unsupported, 'AddTablePartitionContext': unsupported, @@ -303,7 +313,7 @@ def check_identifier(*children): 'ColTypeListContext': implicit_list, 'ColumnReferenceContext': convert_column, 'CommentNamespaceContext': unsupported, - 'CommentSpecContext': unsupported, + 'CommentSpecContext': convert_comment, 'CommentTableContext': unsupported, 'ComparisonContext': binary_operation, 'ComparisonOperatorContext': get_leaf_value, @@ -325,7 +335,7 @@ def check_identifier(*children): 'CreateViewContext': unsupported, 'CtesContext': unsupported, 'CurrentDatetimeContext': unsupported, - 'DataTypeContext': never_found, + 'DataTypeContext': empty, 'DecimalLiteralContext': concat_to_value, 'DeleteFromTableContext': unsupported, 'DereferenceContext': unsupported, diff --git a/pysparkling/sql/ast/tests/test_parse_ddl_string.py b/pysparkling/sql/ast/tests/test_parse_ddl_string.py index 71fc9be2a..055193151 100644 --- a/pysparkling/sql/ast/tests/test_parse_ddl_string.py +++ b/pysparkling/sql/ast/tests/test_parse_ddl_string.py @@ -23,7 +23,7 @@ def test_basic_entries(self): 'StructType(List(' 'StructField(some_str,StringType,true),' 'StructField(some_int,IntegerType,true),' - 'StructField(some_date,DateType,true)' + 'StructField(some_date,DateType,false)' '))' ) diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index d59b64f50..4f70b43b9 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -1806,7 +1806,8 @@ def _check_series_convert_timestamps_tz_local(s, timezone): binary=BinaryType(), decimal=DecimalType(), dec=DecimalType(), - numeric=DecimalType() + numeric=DecimalType(), + struct=StructType(), ) @@ -1814,7 +1815,7 @@ def parsed_string_to_type(data_type, arguments): data_type = data_type.lower() if not arguments and data_type in STRING_TO_TYPE: return STRING_TO_TYPE[data_type] - if data_type == "decimal": + if data_type in ("dec", "decimal"): if len(arguments) == 2: precision, scale = arguments elif len(arguments) == 1: From 1b303ec3bc2241f095cbe98c70aeef1f3b4a6b27 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 14:10:40 +0200 Subject: [PATCH 092/118] Fix test by applying timezone offset when needed --- pysparkling/sql/casts.py | 12 ++++++ pysparkling/sql/tests/test_casts.py | 66 +++++++++++++++-------------- pysparkling/sql/tests/test_write.py | 43 ++++++++++++++----- 3 files changed, 79 insertions(+), 42 deletions(-) diff --git a/pysparkling/sql/casts.py b/pysparkling/sql/casts.py index 076a589cc..544b27a92 100644 --- a/pysparkling/sql/casts.py +++ b/pysparkling/sql/casts.py @@ -515,3 +515,15 @@ def get_datetime_parser(java_time_format): for token, _ in JAVA_TIME_FORMAT_TOKENS.findall(java_time_format): python_pattern += FORMAT_MAPPING.get(token, token) return lambda value: datetime.datetime.strptime(value, python_pattern) + + +def tz_diff(date): + """ + Return as a timedelta the offset on this date for the local timezone compared to UTC + """ + time_here = date.astimezone() + time_utc = time_here.replace(tzinfo=pytz.utc) + + offset = time_utc - time_here + + return offset diff --git a/pysparkling/sql/tests/test_casts.py b/pysparkling/sql/tests/test_casts.py index 70fb82dac..ac40cd42f 100644 --- a/pysparkling/sql/tests/test_casts.py +++ b/pysparkling/sql/tests/test_casts.py @@ -2,12 +2,10 @@ import datetime from unittest import TestCase -import pytz - from pysparkling.sql.casts import ( - cast_from_none, cast_to_array, cast_to_binary, cast_to_boolean, cast_to_byte, cast_to_date, cast_to_decimal, - cast_to_float, cast_to_int, cast_to_long, cast_to_map, cast_to_short, cast_to_string, cast_to_struct, - cast_to_timestamp, FloatType, identity + cast_from_none, cast_to_array, cast_to_binary, cast_to_boolean, cast_to_byte, cast_to_date, + cast_to_decimal, cast_to_float, cast_to_int, cast_to_long, cast_to_map, cast_to_short, + cast_to_string, cast_to_struct, cast_to_timestamp, FloatType, identity, tz_diff ) from pysparkling.sql.types import ( ArrayType, BooleanType, ByteType, DataType, DateType, DecimalType, DoubleType, IntegerType, LongType, MapType, @@ -20,19 +18,6 @@ class CastTests(TestCase): maxDiff = None - def setUp(self): - # TODO: what is the behaviour of Spark when you load up something in another timezone? - # - # os.environ['TZ'] = 'Europe/Paris' - # - # if hasattr(time, 'tzset'): - # time.tzset() # pylint: disable=no-member - - now_here = datetime.datetime.now().astimezone() - now_utc = now_here.replace(tzinfo=pytz.utc) - - self.tz_diff = now_utc - now_here - def test_identity(self): x = object() self.assertEqual(identity(x, options=BASE_OPTIONS), x) @@ -246,13 +231,14 @@ def test_cast_timestamp_to_float_without_jump_issue(self): # there is a discrepancy in behaviours # This test is using a value for which Spark can handle the exact value # Hence the behaviour is the same in pysparkling and PySpark + input_date = datetime.datetime(2019, 8, 28, 0, 2, 40) self.assertEqual( cast_to_float( - datetime.datetime(2019, 8, 28, 0, 2, 40), + input_date, TimestampType(), options=BASE_OPTIONS ), - 1566939760.0 + self.tz_diff.seconds + 1566950560.0 - tz_diff(input_date).seconds ) def test_cast_string_to_binary(self): @@ -327,43 +313,51 @@ def test_cast_basic_string_to_timestamp(self): ) def test_cast_gmt_string_to_timestamp(self): + gmt_expectation = datetime.datetime(2019, 10, 1, 5, 40, 36) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( "2019-10-01T05:40:36Z", StringType(), options=BASE_OPTIONS ), - datetime.datetime(2019, 10, 1, 6, 40, 36) + self.tz_diff + expected ) def test_cast_weird_tz_string_to_timestamp(self): + gmt_expectation = datetime.datetime(2019, 10, 1, 2, 35, 36) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( "2019-10-01T05:40:36+3:5", StringType(), options=BASE_OPTIONS ), - datetime.datetime(2019, 10, 1, 3, 35, 36) + self.tz_diff + expected ) def test_cast_short_tz_string_to_timestamp(self): + gmt_expectation = datetime.datetime(2019, 10, 1, 2, 40, 36) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( "2019-10-01T05:40:36+03", StringType(), options=BASE_OPTIONS ), - datetime.datetime(2019, 10, 1, 3, 40, 36) + self.tz_diff + expected ) def test_cast_longer_tz_string_to_timestamp(self): + gmt_expectation = datetime.datetime(2019, 10, 1, 2, 40, 36) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( "2019-10-01T05:40:36+03:", StringType(), options=BASE_OPTIONS ), - datetime.datetime(2019, 10, 1, 3, 40, 36) + self.tz_diff + expected ) def test_cast_date_string_to_timestamp(self): @@ -422,33 +416,39 @@ def test_cast_hour_string_to_timestamp(self): ) def test_cast_bool_to_timestamp(self): + gmt_expectation = datetime.datetime(1970, 1, 1, 0, 0, 1) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( True, BooleanType(), options=BASE_OPTIONS ), - datetime.datetime(1970, 1, 1, 0, 0, 1) + self.tz_diff + expected ) def test_cast_int_to_timestamp(self): + gmt_expectation = datetime.datetime(1971, 1, 1, 0, 0, 0) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( 86400 * 365, IntegerType(), options=BASE_OPTIONS ), - datetime.datetime(1971, 1, 1, 0, 0, 0) + self.tz_diff + expected ) def test_cast_decimal_to_timestamp(self): + gmt_expectation = datetime.datetime(1970, 1, 1, 0, 2, 27, 580000) + expected = gmt_expectation + tz_diff(gmt_expectation) self.assertEqual( cast_to_timestamp( 147.58, DecimalType(), options=BASE_OPTIONS ), - datetime.datetime(1970, 1, 1, 0, 2, 27, 580000) + self.tz_diff + expected ) def test_cast_date_to_decimal(self): @@ -463,14 +463,16 @@ def test_cast_date_to_decimal(self): ) def test_cast_timestamp_to_decimal_without_scale(self): + input_date = datetime.datetime(2019, 8, 28) + gmt_expectation = 1566950400.0 self.assertEqual( cast_to_decimal( - datetime.datetime(2019, 8, 28), + input_date, TimestampType(), DecimalType(), options=BASE_OPTIONS ), - 1566939600.0 + self.tz_diff.seconds + gmt_expectation - tz_diff(input_date).seconds ) def test_cast_timestamp_to_decimal_with_too_small_precision(self): @@ -485,14 +487,16 @@ def test_cast_timestamp_to_decimal_with_too_small_precision(self): ) def test_cast_timestamp_to_decimal_with_scale(self): + input_date = datetime.datetime(2019, 8, 28) + gmt_expectation = 1566950400.0 self.assertEqual( cast_to_decimal( - datetime.datetime(2019, 8, 28), + input_date, TimestampType(), DecimalType(precision=11, scale=1), options=BASE_OPTIONS ), - 1566939600.0 + self.tz_diff.seconds + gmt_expectation - tz_diff(input_date).seconds ) def test_cast_float_to_decimal_with_scale(self): diff --git a/pysparkling/sql/tests/test_write.py b/pysparkling/sql/tests/test_write.py index 88ce6c4de..896479c25 100644 --- a/pysparkling/sql/tests/test_write.py +++ b/pysparkling/sql/tests/test_write.py @@ -6,6 +6,7 @@ from dateutil.tz import tzlocal from pysparkling import Context, Row +from pysparkling.sql.casts import tz_diff from pysparkling.sql.session import SparkSession from pysparkling.sql.utils import AnalysisException @@ -23,6 +24,21 @@ def get_folder_content(folder_path): return folder_content +def format_as_offset(delta: datetime.timedelta): + """ + Format a timedelta as a timezone offset string, e.g. "+01:00" + """ + if delta.days < 0: + sign = "-" + delta = -delta + else: + sign = "+" + hours = delta.seconds // 3600 + minutes = (delta.seconds % 3600) // 60 + formatted = f'{sign}{hours:02d}:{minutes:02d}' + return formatted + + class DataFrameWriterTests(TestCase): maxDiff = None @@ -34,16 +50,17 @@ def clean(): def setUp(self): self.clean() - tz = datetime.datetime.now().astimezone().strftime('%z') # +0100 - self.tz = f'{tz[:3]}:{tz[3:]}' # --> +01:00 - def tearDown(self): self.clean() def test_write_to_csv(self): + alice_time = datetime.datetime(2017, 1, 1, tzinfo=tzlocal()) + bob_time = datetime.datetime(2014, 3, 2, tzinfo=tzlocal()) + alice_tz = format_as_offset(tz_diff(alice_time)) + bob_tz = format_as_offset(tz_diff(bob_time)) df = spark.createDataFrame( - [Row(age=2, name='Alice', time=datetime.datetime(2017, 1, 1, tzinfo=tzlocal()), ), - Row(age=5, name='Bob', time=datetime.datetime(2014, 3, 2, tzinfo=tzlocal()))] + [Row(age=2, name='Alice', time=alice_time), + Row(age=5, name='Bob', time=bob_time)] ) df.write.csv(".tmp/wonderland/") self.assertDictEqual( @@ -51,8 +68,8 @@ def test_write_to_csv(self): { '_SUCCESS': [], 'part-00000-8447389540241120843.csv': [ - f'2,Alice,2017-01-01T00:00:00.000{self.tz}\n', - f'5,Bob,2014-03-02T00:00:00.000{self.tz}\n' + f'2,Alice,2017-01-01T00:00:00.000{alice_tz}\n', + f'5,Bob,2014-03-02T00:00:00.000{bob_tz}\n' ] } ) @@ -98,9 +115,13 @@ def test_write_to_csv_fail_when_overwrite(self): ) def test_write_to_json(self): + alice_time = datetime.datetime(2017, 1, 1, tzinfo=tzlocal()) + bob_time = datetime.datetime(2014, 3, 2, tzinfo=tzlocal()) + alice_tz = format_as_offset(tz_diff(alice_time)) + bob_tz = format_as_offset(tz_diff(bob_time)) df = spark.createDataFrame( - [Row(age=2, name='Alice', time=datetime.datetime(2017, 1, 1, tzinfo=tzlocal()), ), - Row(age=5, name='Bob', time=datetime.datetime(2014, 3, 2, tzinfo=tzlocal()))] + [Row(age=2, name='Alice', time=alice_time), + Row(age=5, name='Bob', time=bob_time)] ) df.write.json(".tmp/wonderland/") self.assertDictEqual( @@ -108,8 +129,8 @@ def test_write_to_json(self): { '_SUCCESS': [], 'part-00000-8447389540241120843.json': [ - f'{{"age":2,"name":"Alice","time":"2017-01-01T00:00:00.000{self.tz}"}}\n', - f'{{"age":5,"name":"Bob","time":"2014-03-02T00:00:00.000{self.tz}"}}\n', + f'{{"age":2,"name":"Alice","time":"2017-01-01T00:00:00.000{alice_tz}"}}\n', + f'{{"age":5,"name":"Bob","time":"2014-03-02T00:00:00.000{bob_tz}"}}\n', ], } ) From b3775561fbf754bcf66ccadb4ec74a095ae5c49e Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 14:35:20 +0200 Subject: [PATCH 093/118] Modify import order --- pysparkling/sql/ast/tests/test_parse_ddl_string.py | 7 +++---- pysparkling/sql/ast/tests/test_type_parsing.py | 5 ++--- pysparkling/sql/session.py | 2 +- pysparkling/sql/tests/test_casts.py | 6 +++--- pysparkling/sql/types.py | 1 + 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/pysparkling/sql/ast/tests/test_parse_ddl_string.py b/pysparkling/sql/ast/tests/test_parse_ddl_string.py index 055193151..fa75c5193 100644 --- a/pysparkling/sql/ast/tests/test_parse_ddl_string.py +++ b/pysparkling/sql/ast/tests/test_parse_ddl_string.py @@ -1,14 +1,13 @@ from unittest import TestCase import pytest -from pysparkling.sql.ast.ast_to_python import parse_ddl_string +from sqlparser import SqlParsingError +from pysparkling.sql.ast.ast_to_python import parse_ddl_string from pysparkling.sql.types import ( - ArrayType, ByteType, DateType, DecimalType, DoubleType, IntegerType, LongType, MapType, - ShortType, StringType, + ArrayType, ByteType, DateType, DecimalType, DoubleType, IntegerType, LongType, MapType, ShortType, StringType, StructField, StructType ) -from sqlparser import SqlParsingError class TestFunctions(TestCase): diff --git a/pysparkling/sql/ast/tests/test_type_parsing.py b/pysparkling/sql/ast/tests/test_type_parsing.py index ce222eeae..f035e8005 100644 --- a/pysparkling/sql/ast/tests/test_type_parsing.py +++ b/pysparkling/sql/ast/tests/test_type_parsing.py @@ -8,9 +8,8 @@ from pysparkling.sql.ast.ast_to_python import parse_data_type from pysparkling.sql.session import SparkSession from pysparkling.sql.types import ( - ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, - IntegerType, LongType, - MapType, ShortType, StringType, StructField, StructType, TimestampType, NullType + ArrayType, BinaryType, BooleanType, ByteType, DateType, DecimalType, DoubleType, FloatType, IntegerType, LongType, + MapType, ShortType, StringType, StructField, StructType, TimestampType ) diff --git a/pysparkling/sql/session.py b/pysparkling/sql/session.py index 4f71004db..0e19fadf5 100644 --- a/pysparkling/sql/session.py +++ b/pysparkling/sql/session.py @@ -1,9 +1,9 @@ from threading import RLock -from .ast.ast_to_python import parse_ddl_string from ..__version__ import __version__ from ..context import Context from ..rdd import RDD +from .ast.ast_to_python import parse_ddl_string from .conf import RuntimeConfig from .dataframe import DataFrame from .internals import DataFrameInternal diff --git a/pysparkling/sql/tests/test_casts.py b/pysparkling/sql/tests/test_casts.py index ac40cd42f..eefd0ef83 100644 --- a/pysparkling/sql/tests/test_casts.py +++ b/pysparkling/sql/tests/test_casts.py @@ -3,9 +3,9 @@ from unittest import TestCase from pysparkling.sql.casts import ( - cast_from_none, cast_to_array, cast_to_binary, cast_to_boolean, cast_to_byte, cast_to_date, - cast_to_decimal, cast_to_float, cast_to_int, cast_to_long, cast_to_map, cast_to_short, - cast_to_string, cast_to_struct, cast_to_timestamp, FloatType, identity, tz_diff + cast_from_none, cast_to_array, cast_to_binary, cast_to_boolean, cast_to_byte, cast_to_date, cast_to_decimal, + cast_to_float, cast_to_int, cast_to_long, cast_to_map, cast_to_short, cast_to_string, cast_to_struct, + cast_to_timestamp, FloatType, identity, tz_diff ) from pysparkling.sql.types import ( ArrayType, BooleanType, ByteType, DataType, DateType, DecimalType, DoubleType, IntegerType, LongType, MapType, diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 4f70b43b9..b24ee4297 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -25,6 +25,7 @@ import sys from sqlparser.internalparser import SqlParsingError + from .utils import require_minimum_pandas_version __all__ = [ From 0f1928b613dcdad5618df18b0583636304238efe Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 14:35:44 +0200 Subject: [PATCH 094/118] Update imports --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 7f28d577a..b996bce6e 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ 'backports.tempfile==1.0rc1', 'cloudpickle>=0.1.0', 'futures>=3.0.1', - 'pylint~=2.7', + 'pylint', 'pylzma', 'memory-profiler>=0.47', 'pycodestyle', @@ -44,7 +44,7 @@ 'pytest-cov', 'isort', 'tornado>=4.3', - 'parameterized>=0.7.4', + 'parameterized==0.7.4', ], 'scripts': [ 'ipyparallel', From a6f9702a290b6079312c0cd54d11232ba606bbfc Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 15:04:25 +0200 Subject: [PATCH 095/118] Align with new isort behavior --- pysparkling/sql/dataframe.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pysparkling/sql/dataframe.py b/pysparkling/sql/dataframe.py index 7e5e27fe9..b0e5dae8f 100644 --- a/pysparkling/sql/dataframe.py +++ b/pysparkling/sql/dataframe.py @@ -7,8 +7,7 @@ from .internal_utils.joins import CROSS_JOIN, JOIN_TYPES from .internals import CUBE_TYPE, InternalGroupedDataFrame, ROLLUP_TYPE from .types import ( - _check_series_convert_timestamps_local_tz, ByteType, FloatType, IntegerType, IntegralType, ShortType, - TimestampType + _check_series_convert_timestamps_local_tz, ByteType, FloatType, IntegerType, IntegralType, ShortType, TimestampType ) from .utils import AnalysisException, IllegalArgumentException, require_minimum_pandas_version From e9aba34263aecb76d22021701299d5be3621c1ea Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 15:04:28 +0200 Subject: [PATCH 096/118] Ensure dependencies have the same behavior across machines and time --- setup.py | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/setup.py b/setup.py index b996bce6e..d1c869518 100644 --- a/setup.py +++ b/setup.py @@ -13,43 +13,42 @@ url='https://github.com/svenkreiss/pysparkling', install_requires=[ - 'boto>=2.36.0', - 'future>=0.15', - 'requests>=2.6.0', - 'pytz>=2019.3', - 'python-dateutil>=2.8.0', - 'pythonsqlparser', + 'boto==2.49.0', + 'future==0.18.2', + 'requests==2.26.0', + 'pytz==2021.1', + 'python-dateutil==2.8.2', + 'pythonsqlparser==0.1.2', ], extras_require={ 'hdfs': ['hdfs>=2.0.0'], - 'performance': ['matplotlib>=1.5.3'], - 'streaming': ['tornado>=4.3'], + 'performance': ['matplotlib==3.3.4'], + 'streaming': ['tornado==6.1'], 'dev': [ 'antlr4-python3-runtime==4.7.1', - 'parameterized', ], 'sql': [ - 'numpy', - 'pandas>=0.23.2', + 'numpy==1.19.5', + 'pandas==1.1.5', ], 'tests': [ 'backports.tempfile==1.0rc1', - 'cloudpickle>=0.1.0', - 'futures>=3.0.1', - 'pylint', - 'pylzma', - 'memory-profiler>=0.47', - 'pycodestyle', - 'pytest', - 'pytest-cov', - 'isort', - 'tornado>=4.3', + 'cloudpickle==1.6.0', + 'futures==3.1.1', + 'pylint==2.10.2', + 'pylzma==0.5.0', + 'memory-profiler==0.58.0', + 'pycodestyle==2.7.0', + 'pytest==6.2.4', + 'pytest-cov==2.12.1', + 'isort==5.9.3', + 'tornado==6.1', 'parameterized==0.7.4', ], 'scripts': [ - 'ipyparallel', - 'pyspark', - 'matplotlib', + 'ipyparallel==6.3.0', + 'pyspark==3.1.2', + 'matplotlib==3.3.4', ] }, From 50b06110c061b23fd67800fe508e57463dda727f Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 15:14:07 +0200 Subject: [PATCH 097/118] Fix import --- pysparkling/sql/ast/tests/test_parse_ddl_string.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/ast/tests/test_parse_ddl_string.py b/pysparkling/sql/ast/tests/test_parse_ddl_string.py index fa75c5193..ea709bffb 100644 --- a/pysparkling/sql/ast/tests/test_parse_ddl_string.py +++ b/pysparkling/sql/ast/tests/test_parse_ddl_string.py @@ -1,7 +1,7 @@ from unittest import TestCase import pytest -from sqlparser import SqlParsingError +from sqlparser.internalparser import SqlParsingError from pysparkling.sql.ast.ast_to_python import parse_ddl_string from pysparkling.sql.types import ( From e37339ddfcbf9310396f4c771f322f6a944bceb9 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 15:23:50 +0200 Subject: [PATCH 098/118] Adapt to new pylint behavior --- .pylintrc | 2 +- pysparkling/sql/ast/ast_to_python.py | 9 +++++---- pysparkling/sql/types.py | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.pylintrc b/.pylintrc index d913d9d0c..89f503418 100644 --- a/.pylintrc +++ b/.pylintrc @@ -3,7 +3,7 @@ variable-rgx=[a-z0-9_]{1,30}$ good-names=log -disable=invalid-name,unused-argument,too-few-public-methods,no-self-use,missing-docstring,logging-format-interpolation,too-many-instance-attributes,duplicate-code,too-many-public-methods,too-many-arguments,protected-access,too-many-lines +disable=invalid-name,unused-argument,too-few-public-methods,no-self-use,missing-docstring,logging-format-interpolation,too-many-instance-attributes,duplicate-code,too-many-public-methods,too-many-arguments,protected-access,too-many-lines,unspecified-encoding,consider-using-dict-items,consider-using-with [FORMAT] max-line-length=119 diff --git a/pysparkling/sql/ast/ast_to_python.py b/pysparkling/sql/ast/ast_to_python.py index 68370f037..5a395bf1f 100644 --- a/pysparkling/sql/ast/ast_to_python.py +++ b/pysparkling/sql/ast/ast_to_python.py @@ -84,7 +84,6 @@ def call_function(*children): function_expression = expression_registry.get(function_name.lower()) params = [convert_tree(c) for c in children[2:-1]] - # todo: there must be a cleaner way to do that complex_function = any( not isinstance(param, Column) and param == ')' for param in params @@ -95,10 +94,12 @@ def call_function(*children): # over_clause = None # set_clause = None else: + # pylint: disable=fixme + # todo: Handle complex functions last_argument_position = params.index(")") - # filter_clause = ... # todo - # over_clause = ... # todo - # set_clause = ... # todo + # filter_clause = ... + # over_clause = ... + # set_clause = ... # parameters are comma separated function_arguments = params[0:last_argument_position:2] diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index b24ee4297..698ab65ef 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -826,6 +826,7 @@ def _parse_datatype_string(s): for :class:`IntegerType`. Since Spark 2.3, this also supports a schema in a DDL-formatted string and case-insensitive strings. """ + # pylint: disable=import-outside-toplevel, cyclic-import from pysparkling.sql.ast.ast_to_python import parse_ddl_string return parse_ddl_string(s) From 86ab1fab151713e1e6c19bf8705dc9d66f2bd92b Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 15:32:13 +0200 Subject: [PATCH 099/118] Remove Python2 specific syntax --- pysparkling/tests/test_textFile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysparkling/tests/test_textFile.py b/pysparkling/tests/test_textFile.py index ec43f4c64..be09f95ad 100644 --- a/pysparkling/tests/test_textFile.py +++ b/pysparkling/tests/test_textFile.py @@ -260,21 +260,21 @@ def test_pyspark_compatibility_txt(): kv = Context().textFile( f'{LOCAL_TEST_PATH}/pyspark/key_value.txt').collect() print(kv) - assert u"('a', 1)" in kv and u"('b', 2)" in kv and len(kv) == 2 + assert "('a', 1)" in kv and "('b', 2)" in kv and len(kv) == 2 def test_pyspark_compatibility_bz2(): kv = Context().textFile( f'{LOCAL_TEST_PATH}/pyspark/key_value.txt.bz2').collect() print(kv) - assert u"a\t1" in kv and u"b\t2" in kv and len(kv) == 2 + assert "a\t1" in kv and "b\t2" in kv and len(kv) == 2 def test_pyspark_compatibility_gz(): kv = Context().textFile( f'{LOCAL_TEST_PATH}/pyspark/key_value.txt.gz').collect() print(kv) - assert u"a\t1" in kv and u"b\t2" in kv and len(kv) == 2 + assert "a\t1" in kv and "b\t2" in kv and len(kv) == 2 def test_local_regex_read(): From 1dd366003e806d09519c42d3bc7c2eb4de124007 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 18:45:59 +0200 Subject: [PATCH 100/118] Enhance types support --- pysparkling/sql/column.py | 23 ++++++++++++++-------- pysparkling/sql/expressions/expressions.py | 5 ++--- pysparkling/sql/expressions/operators.py | 12 +++++++---- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index 6af1dcc76..7deca5bff 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -1,4 +1,4 @@ -from .expressions.expressions import Expression +from .expressions.expressions import Expression, RegisteredExpressions from .expressions.fields import find_position_in_schema from .expressions.literals import Literal from .expressions.mappers import CaseWhen, StarOperator @@ -630,7 +630,7 @@ def output_fields(self, schema): return self.expr.output_fields(schema) return [StructField( name=self.col_name, - dataType=self.data_type, + dataType=self.data_type(schema), nullable=self.is_nullable )] @@ -647,7 +647,6 @@ def mergeStats(self, row, schema): def initialize(self, partition_index): if isinstance(self.expr, Expression): self.expr.recursive_initialize(partition_index) - return self def with_pre_evaluation_schema(self, pre_evaluation_schema): if isinstance(self.expr, Expression): @@ -682,11 +681,19 @@ def __nonzero__(self): __bool__ = __nonzero__ - @property - def data_type(self): - # pylint: disable=W0511 - # todo: be more specific - return DataType() + def data_type(self, schema): + if isinstance(self.expr, (Expression, RegisteredExpressions)): + return self.expr.data_type(schema) + if isinstance(self.expr, str): + try: + return schema[self.expr].dataType + except KeyError: + raise AnalysisException( + f"cannot resolve '`{self.expr}`' given input columns: {schema.fields};" + ) + raise AnalysisException( + f"cannot resolve '`{self.expr}`' type, expecting str or Expression but got {type(self.expr)};" + ) @property def is_nullable(self): diff --git a/pysparkling/sql/expressions/expressions.py b/pysparkling/sql/expressions/expressions.py index 3a02fd176..eb51d6976 100644 --- a/pysparkling/sql/expressions/expressions.py +++ b/pysparkling/sql/expressions/expressions.py @@ -36,12 +36,11 @@ def __repr__(self): def output_fields(self, schema): return [StructField( name=str(self), - dataType=self.data_type, + dataType=self.data_type(schema), nullable=self.is_nullable )] - @property - def data_type(self): + def data_type(self, schema): # pylint: disable=W0511 # todo: be more specific return DataType() diff --git a/pysparkling/sql/expressions/operators.py b/pysparkling/sql/expressions/operators.py index ba30432e6..3b091ee59 100644 --- a/pysparkling/sql/expressions/operators.py +++ b/pysparkling/sql/expressions/operators.py @@ -292,12 +292,16 @@ def __init__(self, column, destination_type): super().__init__(column) self.column = column self.destination_type = destination_type - self.caster = get_caster( - from_type=self.column.data_type, to_type=destination_type, options={} - ) def eval(self, row, schema): - return self.caster(self.column.eval(row, schema)) + caster = get_caster( + from_type=self.column.data_type(schema), + to_type=self.destination_type, + options={} + ) + return caster( + self.column.eval(row, schema) + ) def __str__(self): return str(self.column) From 35049147096f7d2f7ba23e015e251ed78bc7ad4a Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 18:46:14 +0200 Subject: [PATCH 101/118] Add types to date expressions --- pysparkling/sql/expressions/dates.py | 84 +++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/expressions/dates.py b/pysparkling/sql/expressions/dates.py index d546ca926..224073753 100644 --- a/pysparkling/sql/expressions/dates.py +++ b/pysparkling/sql/expressions/dates.py @@ -5,7 +5,7 @@ from ...utils import parse_tz from ..casts import get_time_formatter, get_unix_timestamp_parser -from ..types import DateType, FloatType, TimestampType +from ..types import DateType, FloatType, TimestampType, IntegerType, DoubleType, StringType, LongType from .expressions import Expression, UnaryExpression from .operators import Cast @@ -32,6 +32,8 @@ def args(self): self.num_months ) + def data_type(self, schema): + return DateType() class DateAdd(Expression): pretty_name = "date_add" @@ -51,6 +53,8 @@ def args(self): self.num_days ) + def data_type(self, schema): + return DateType() class DateSub(Expression): pretty_name = "date_sub" @@ -70,6 +74,9 @@ def args(self): self.num_days ) + def data_type(self, schema): + return DateType() + class Year(UnaryExpression): pretty_name = "year" @@ -77,6 +84,9 @@ class Year(UnaryExpression): def eval(self, row, schema): return Cast(self.column, DateType()).eval(row, schema).year + def data_type(self, schema): + return IntegerType() + class Month(UnaryExpression): pretty_name = "month" @@ -84,6 +94,9 @@ class Month(UnaryExpression): def eval(self, row, schema): return Cast(self.column, DateType()).eval(row, schema).month + def data_type(self, schema): + return IntegerType() + class Quarter(UnaryExpression): pretty_name = "quarter" @@ -92,6 +105,9 @@ def eval(self, row, schema): month = Cast(self.column, DateType()).eval(row, schema).month return 1 + int((month - 1) / 3) + def data_type(self, schema): + return IntegerType() + class Hour(UnaryExpression): pretty_name = "hour" @@ -99,6 +115,9 @@ class Hour(UnaryExpression): def eval(self, row, schema): return Cast(self.column, TimestampType()).eval(row, schema).hour + def data_type(self, schema): + return IntegerType() + class Minute(UnaryExpression): pretty_name = "minute" @@ -106,6 +125,9 @@ class Minute(UnaryExpression): def eval(self, row, schema): return Cast(self.column, TimestampType()).eval(row, schema).minute + def data_type(self, schema): + return IntegerType() + class Second(UnaryExpression): pretty_name = "second" @@ -113,6 +135,9 @@ class Second(UnaryExpression): def eval(self, row, schema): return Cast(self.column, TimestampType()).eval(row, schema).second + def data_type(self, schema): + return IntegerType() + class DayOfMonth(UnaryExpression): pretty_name = "dayofmonth" @@ -120,6 +145,9 @@ class DayOfMonth(UnaryExpression): def eval(self, row, schema): return Cast(self.column, DateType()).eval(row, schema).day + def data_type(self, schema): + return IntegerType() + class DayOfYear(UnaryExpression): pretty_name = "dayofyear" @@ -129,6 +157,9 @@ def eval(self, row, schema): day_from_the_first = value - datetime.date(value.year, 1, 1) return 1 + day_from_the_first.days + def data_type(self, schema): + return IntegerType() + class LastDay(UnaryExpression): pretty_name = "last_day" @@ -138,6 +169,9 @@ def eval(self, row, schema): first_of_next_month = value + relativedelta(months=1, day=1) return first_of_next_month - datetime.timedelta(days=1) + def data_type(self, schema): + return DateType() + class WeekOfYear(UnaryExpression): pretty_name = "weekofyear" @@ -145,6 +179,9 @@ class WeekOfYear(UnaryExpression): def eval(self, row, schema): return Cast(self.column, DateType()).eval(row, schema).isocalendar()[1] + def data_type(self, schema): + return IntegerType() + class DayOfWeek(UnaryExpression): pretty_name = "dayofweek" @@ -153,6 +190,9 @@ def eval(self, row, schema): date = Cast(self.column, DateType()).eval(row, schema) return date.isoweekday() + 1 if date.isoweekday() != 7 else 1 + def data_type(self, schema): + return IntegerType() + class NextDay(Expression): pretty_name = "next_day" @@ -181,6 +221,9 @@ def args(self): self.day_of_week ) + def data_type(self, schema): + return DateType() + class MonthsBetween(Expression): pretty_name = "months_between" @@ -228,6 +271,9 @@ def args(self): str(self.round_off).lower() ) + def data_type(self, schema): + return DoubleType() + class DateDiff(Expression): pretty_name = "datediff" @@ -253,6 +299,9 @@ def args(self): self.column2 ) + def data_type(self, schema): + return IntegerType() + class FromUnixTime(Expression): pretty_name = "from_unixtime" @@ -273,6 +322,9 @@ def args(self): self.format ) + def data_type(self, schema): + return StringType() + class DateFormat(Expression): pretty_name = "date_format" @@ -293,6 +345,9 @@ def args(self): self.format ) + def data_type(self, schema): + return StringType() + class CurrentTimestamp(Expression): pretty_name = "current_timestamp" @@ -311,6 +366,9 @@ def initialize(self, partition_index): def args(self): return () + def data_type(self, schema): + return TimestampType() + class CurrentDate(Expression): pretty_name = "current_date" @@ -329,6 +387,9 @@ def initialize(self, partition_index): def args(self): return () + def data_type(self, schema): + return DateType() + class UnixTimestamp(Expression): pretty_name = "unix_timestamp" @@ -349,6 +410,9 @@ def args(self): self.format ) + def data_type(self, schema): + return LongType() + class ParseToTimestamp(Expression): pretty_name = "to_timestamp" @@ -373,6 +437,9 @@ def args(self): f"'{self.format}'" ) + def data_type(self, schema): + return TimestampType() + class ParseToDate(Expression): pretty_name = "to_date" @@ -397,6 +464,9 @@ def args(self): f"'{self.format}'" ) + def data_type(self, schema): + return DateType() + class TruncDate(Expression): pretty_name = "trunc" @@ -420,6 +490,9 @@ def args(self): self.level ) + def data_type(self, schema): + return DateType() + class TruncTimestamp(Expression): pretty_name = "date_trunc" @@ -475,6 +548,9 @@ def args(self): self.column ) + def data_type(self, schema): + return TimestampType() + class FromUTCTimestamp(Expression): pretty_name = "from_utc_timestamp" @@ -499,6 +575,9 @@ def args(self): self.tz ) + def data_type(self, schema): + return TimestampType() + class ToUTCTimestamp(Expression): pretty_name = "to_utc_timestamp" @@ -523,6 +602,9 @@ def args(self): self.tz ) + def data_type(self, schema): + return TimestampType() + __all__ = [ "ToUTCTimestamp", "FromUTCTimestamp", "TruncTimestamp", "TruncDate", "ParseToDate", From d1f62631ad0571d03a21ea4f7d76e2bef5410eaf Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 19:17:42 +0200 Subject: [PATCH 102/118] Add types to array expressions --- pysparkling/sql/expressions/arrays.py | 121 ++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 7 deletions(-) diff --git a/pysparkling/sql/expressions/arrays.py b/pysparkling/sql/expressions/arrays.py index 0be678c9a..e6297fd9b 100644 --- a/pysparkling/sql/expressions/arrays.py +++ b/pysparkling/sql/expressions/arrays.py @@ -1,3 +1,4 @@ +from ..types import BooleanType, ArrayType, NullType, MapType, IntegerType, StringType, StructType from ..utils import AnalysisException from .expressions import BinaryOperation, Expression, UnaryExpression @@ -15,6 +16,9 @@ def eval(self, row, schema): return None return False + def data_type(self, schema): + return BooleanType() + class ArrayContains(Expression): pretty_name = "array_contains" @@ -36,6 +40,9 @@ def args(self): self.value ) + def data_type(self, schema): + return BooleanType() + class ArrayColumn(Expression): pretty_name = "array" @@ -50,6 +57,11 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + if not self.columns: + return ArrayType(elementType=NullType) + return ArrayType(elementType=self.columns[0].data_type(schema)) + class MapColumn(Expression): pretty_name = "map" @@ -57,6 +69,11 @@ class MapColumn(Expression): def __init__(self, *columns): super().__init__(columns) self.columns = columns + if len(columns) % 2 != 0: + raise AnalysisException( + f"Cannot resolve '{self}' due to data type mismatch: " + f"map expects a positive even number of arguments." + ) self.keys = columns[::2] self.values = columns[1::2] @@ -69,6 +86,14 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + if not self.columns: + return MapType(keyType=NullType, valueType=NullType) + return MapType( + keyType=self.keys[0].data_type(schema), + valueType=self.values[0].data_type(schema), + ) + class MapFromArraysColumn(Expression): pretty_name = "map_from_arrays" @@ -79,9 +104,13 @@ def __init__(self, keys, values): self.values = values def eval(self, row, schema): - return dict( - zip(self.keys.eval(row, schema), self.values.eval(row, schema)) - ) + keys = self.keys.eval(row, schema) + values = self.values.eval(row, schema) + if len(keys) != len(values): + raise AnalysisException( + f"Error in '{self}': The key array and value array of MapData must have the same length." + ) + return dict(zip(keys, values)) def args(self): return ( @@ -89,6 +118,14 @@ def args(self): self.values ) + def data_type(self, schema): + if not self.keys: + return MapType(keyType=NullType, valueType=NullType) + return MapType( + keyType=self.keys[0].data_type(schema), + valueType=self.values[0].data_type(schema), + ) + class Size(UnaryExpression): pretty_name = "size" @@ -101,6 +138,9 @@ def eval(self, row, schema): f"{self.column} value should be an array or a map, got {type(column_value)}" ) + def data_type(self, schema): + return IntegerType() + class ArraySort(UnaryExpression): pretty_name = "array_sort" @@ -108,19 +148,42 @@ class ArraySort(UnaryExpression): def eval(self, row, schema): return sorted(self.column.eval(row, schema)) + def data_type(self, schema): + return self.column.data_type(schema) + class ArrayMin(UnaryExpression): pretty_name = "array_min" def eval(self, row, schema): - return min(self.column.eval(row, schema)) + column_type = self.column.data_type(schema) + column_value = self.column.eval(row, schema) + if not column_type == ArrayType: + raise AnalysisException( + f"Cannot resolve '{self}' due to data type mismatch: argument 1 requires array type, " + f"however, '{column_value}' is of {column_type} type." + ) + return min(column_value) + + def data_type(self, schema): + return self.column.data_type(schema).elementType() class ArrayMax(UnaryExpression): pretty_name = "array_max" def eval(self, row, schema): - return max(self.column.eval(row, schema)) + column_type = self.column.data_type(schema) + column_value = self.column.eval(row, schema) + if not column_type == ArrayType: + raise AnalysisException( + f"Cannot resolve '{self}' due to data type mismatch: argument 1 requires array type, " + f"however, '{column_value}' is of {column_type} type." + ) + return max(column_value) + + def data_type(self, schema): + return self.column.data_type(schema).elementType() class Slice(Expression): @@ -142,6 +205,9 @@ def args(self): self.length ) + def data_type(self, schema): + return self.column.data_type(schema) + class ArrayRepeat(Expression): pretty_name = "array_repeat" @@ -161,9 +227,12 @@ def args(self): self.count ) + def data_type(self, schema): + return ArrayType(self.col.data_type(schema)) + class Sequence(Expression): - pretty_name = "array_join" + pretty_name = "sequence" def __init__(self, start, stop, step): super().__init__(start, stop, step) @@ -201,6 +270,9 @@ def args(self): self.step ) + def data_type(self, schema): + return ArrayType(self.start.data_type(schema)) + class ArrayJoin(Expression): pretty_name = "array_join" @@ -231,6 +303,9 @@ def args(self): self.nullReplacement ) + def data_type(self, schema): + return StringType() + class SortArray(Expression): pretty_name = "sort_array" @@ -249,6 +324,9 @@ def args(self): self.asc ) + def data_type(self, schema): + return self.col.data_type(schema) + class ArraysZip(Expression): pretty_name = "arrays_zip" @@ -259,7 +337,7 @@ def __init__(self, columns): def eval(self, row, schema): return [ - list(combination) + {i: v for i, v in enumerate(combination)} for combination in zip( *(c.eval(row, schema) for c in self.columns) ) @@ -268,6 +346,11 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + return ArrayType(StructType([ + col.data_type(schema) for col in self.columns + ])) + class Flatten(UnaryExpression): pretty_name = "flatten" @@ -279,6 +362,9 @@ def eval(self, row, schema): for value in array ] + def data_type(self, schema): + return self.column.data_type(schema).elementType + class ArrayPosition(Expression): pretty_name = "array_position" @@ -303,6 +389,9 @@ def args(self): self.value ) + def data_type(self, schema): + return IntegerType() + class ElementAt(Expression): pretty_name = "element_at" @@ -324,6 +413,9 @@ def args(self): self.extraction ) + def data_type(self, schema): + return self.col.data_type(schema).elementType + class ArrayRemove(Expression): pretty_name = "array_remove" @@ -343,6 +435,9 @@ def args(self): self.element ) + def data_type(self, schema): + return self.col.data_type(schema) + class ArrayDistinct(UnaryExpression): pretty_name = "array_distinct" @@ -350,6 +445,9 @@ class ArrayDistinct(UnaryExpression): def eval(self, row, schema): return list(set(self.column.eval(row, schema))) + def data_type(self, schema): + return self.column.data_type(schema) + class ArrayIntersect(BinaryOperation): pretty_name = "array_intersect" @@ -357,6 +455,9 @@ class ArrayIntersect(BinaryOperation): def eval(self, row, schema): return list(set(self.arg1.eval(row, schema)) & set(self.arg2.eval(row, schema))) + def data_type(self, schema): + return self.arg1.data_type(schema) + class ArrayUnion(BinaryOperation): pretty_name = "array_union" @@ -364,6 +465,9 @@ class ArrayUnion(BinaryOperation): def eval(self, row, schema): return list(set(self.arg1.eval(row, schema)) | set(self.arg2.eval(row, schema))) + def data_type(self, schema): + return self.arg1.data_type(schema) + class ArrayExcept(BinaryOperation): pretty_name = "array_except" @@ -371,6 +475,9 @@ class ArrayExcept(BinaryOperation): def eval(self, row, schema): return list(set(self.arg1.eval(row, schema)) - set(self.arg2.eval(row, schema))) + def data_type(self, schema): + return self.arg1.data_type(schema) + __all__ = [ "ArraysZip", "ArrayRepeat", "Flatten", "ArrayMax", "ArrayMin", "SortArray", "Size", From 2ecdde77e90eef043424ff1e948d3dfea5eaa336 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 19:18:40 +0200 Subject: [PATCH 103/118] Add types to csv expression --- pysparkling/sql/expressions/csvs.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pysparkling/sql/expressions/csvs.py b/pysparkling/sql/expressions/csvs.py index 275c26e87..f2ba4644e 100644 --- a/pysparkling/sql/expressions/csvs.py +++ b/pysparkling/sql/expressions/csvs.py @@ -2,6 +2,7 @@ from ..internal_utils.options import Options from ..internal_utils.readers.csvreader import csv_record_to_row, CSVReader from ..internal_utils.readers.utils import guess_schema_from_strings +from ..types import StringType from ..utils import AnalysisException from .expressions import Expression @@ -33,3 +34,6 @@ def eval(self, row, schema): def args(self): return (self.column,) + + def data_type(self, schema): + return StringType() From a1106892817f9a2d9aea95c7d48ccb284999757e Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 19:21:52 +0200 Subject: [PATCH 104/118] Add types to explode expressions --- pysparkling/sql/expressions/explodes.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/expressions/explodes.py b/pysparkling/sql/expressions/explodes.py index e70d040c5..c55ffdef5 100644 --- a/pysparkling/sql/expressions/explodes.py +++ b/pysparkling/sql/expressions/explodes.py @@ -1,4 +1,4 @@ -from ..types import DataType, IntegerType, StructField +from ..types import DataType, IntegerType, StructField, StructType from .expressions import UnaryExpression @@ -20,6 +20,9 @@ def eval(self, row, schema): def __str__(self): return "col" + def data_type(self, schema): + return self.column.data_type(schema).elementType + class ExplodeOuter(Explode): def eval(self, row, schema): @@ -31,6 +34,9 @@ def eval(self, row, schema): def __str__(self): return "col" + def data_type(self, schema): + return self.column.data_type(schema).elementType + class PosExplode(UnaryExpression): def eval(self, row, schema): @@ -53,9 +59,12 @@ def may_output_multiple_cols(self): def output_fields(self, schema): return [ StructField("pos", IntegerType(), False), - StructField("col", DataType(), False) + StructField("col", self.column.data_type(schema).elementType, False) ] + def data_type(self, schema): + return StructType(self.output_fields(schema)) + class PosExplodeOuter(PosExplode): def eval(self, row, schema): From 020b7bda549f89c3ce150f7235819ae6cdc88e2e Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 29 Aug 2021 19:26:15 +0200 Subject: [PATCH 105/118] Add types to json expression --- pysparkling/sql/expressions/jsons.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pysparkling/sql/expressions/jsons.py b/pysparkling/sql/expressions/jsons.py index bc508ee4a..fa2ef94a8 100644 --- a/pysparkling/sql/expressions/jsons.py +++ b/pysparkling/sql/expressions/jsons.py @@ -1,5 +1,6 @@ import json +from ..types import StringType from ...utils import get_json_encoder from ..internal_utils.options import Options from ..internal_utils.readers.jsonreader import JSONReader @@ -37,5 +38,8 @@ def args(self): self.input_options ) + def data_type(self, schema): + return StringType() + __all__ = ["StructsToJson"] From 55a4d78cff8f7d41a4927101e30e2ec104ce05f4 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:38:16 +0200 Subject: [PATCH 106/118] Add types to literals --- pysparkling/sql/expressions/literals.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pysparkling/sql/expressions/literals.py b/pysparkling/sql/expressions/literals.py index 775087ff0..e22040250 100644 --- a/pysparkling/sql/expressions/literals.py +++ b/pysparkling/sql/expressions/literals.py @@ -1,3 +1,4 @@ +from ..types import _infer_type from ..utils import AnalysisException from .expressions import Expression @@ -6,6 +7,7 @@ class Literal(Expression): def __init__(self, value): super().__init__() self.value = value + self._data_type = _infer_type(self.value) def eval(self, row, schema): return self.value @@ -28,5 +30,8 @@ def get_literal_value(self): def args(self): return (self.value, ) + def data_type(self, schema): + return self._data_type + __all__ = ["Literal"] From 9af2a6d15a38bfaaf3666d75092343bee33f6d69 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:40:38 +0200 Subject: [PATCH 107/118] Add types to column operators --- pysparkling/sql/expressions/operators.py | 108 ++++++++++++++++++++++- pysparkling/sql/types.py | 69 ++++++++++++++- 2 files changed, 175 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/expressions/operators.py b/pysparkling/sql/expressions/operators.py index 3b091ee59..2dc012292 100644 --- a/pysparkling/sql/expressions/operators.py +++ b/pysparkling/sql/expressions/operators.py @@ -1,5 +1,5 @@ from ..casts import get_caster -from ..types import Row, StructType +from ..types import Row, StructType, DoubleType, BooleanType, StringType, largest_numeric_type from .expressions import BinaryOperation, Expression, NullSafeBinaryOperation, TypeSafeBinaryOperation, UnaryExpression @@ -10,6 +10,9 @@ def eval(self, row, schema): def __str__(self): return f"(- {self.column})" + def data_type(self, schema): + return self.column.data_type(schema) + class Add(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -18,6 +21,11 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"({self.arg1} + {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="add") + class Minus(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -26,6 +34,11 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"({self.arg1} - {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="minus") + class Time(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -34,6 +47,11 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"({self.arg1} * {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="multiply") + class Divide(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -42,6 +60,11 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"({self.arg1} / {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="divide") + class Mod(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -50,6 +73,11 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"({self.arg1} % {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="mod") + class Pow(NullSafeBinaryOperation): def unsafe_operation(self, value1, value2): @@ -58,6 +86,9 @@ def unsafe_operation(self, value1, value2): def __str__(self): return f"POWER({self.arg1}, {self.arg2})" + def data_type(self, schema): + return DoubleType() + class Equal(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -66,6 +97,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} = {self.arg2})" + def data_type(self, schema): + return BooleanType() + class LessThan(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -74,6 +108,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} < {self.arg2})" + def data_type(self, schema): + return BooleanType() + class LessThanOrEqual(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -82,6 +119,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} <= {self.arg2})" + def data_type(self, schema): + return BooleanType() + class GreaterThan(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -90,6 +130,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} > {self.arg2})" + def data_type(self, schema): + return BooleanType() + class GreaterThanOrEqual(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -98,6 +141,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} >= {self.arg2})" + def data_type(self, schema): + return BooleanType() + class And(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -106,6 +152,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} AND {self.arg2})" + def data_type(self, schema): + return BooleanType() + class Or(TypeSafeBinaryOperation): def unsafe_operation(self, value_1, value_2): @@ -114,6 +163,9 @@ def unsafe_operation(self, value_1, value_2): def __str__(self): return f"({self.arg1} OR {self.arg2})" + def data_type(self, schema): + return BooleanType() + class Invert(UnaryExpression): def eval(self, row, schema): @@ -125,6 +177,9 @@ def eval(self, row, schema): def __str__(self): return f"(NOT {self.column})" + def data_type(self, schema): + return BooleanType() + class BitwiseOr(BinaryOperation): def eval(self, row, schema): @@ -133,6 +188,11 @@ def eval(self, row, schema): def __str__(self): return f"({self.arg1} | {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="bitwise_or") + class BitwiseAnd(BinaryOperation): def eval(self, row, schema): @@ -141,6 +201,11 @@ def eval(self, row, schema): def __str__(self): return f"({self.arg1} & {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="bitwise_and") + class BitwiseXor(BinaryOperation): def eval(self, row, schema): @@ -149,6 +214,11 @@ def eval(self, row, schema): def __str__(self): return f"({self.arg1} ^ {self.arg2})" + def data_type(self, schema): + type1 = self.arg1.data_type(schema) + type2 = self.arg2.data_type(schema) + return largest_numeric_type(type1, type2, operation="bitwise_xor") + class BitwiseNot(UnaryExpression): def eval(self, row, schema): @@ -157,6 +227,9 @@ def eval(self, row, schema): def __str__(self): return f"~{self.column}" + def data_type(self, schema): + return self.column.data_type(schema) + class EqNullSafe(BinaryOperation): def eval(self, row, schema): @@ -165,6 +238,9 @@ def eval(self, row, schema): def __str__(self): return f"({self.arg1} <=> {self.arg2})" + def data_type(self, schema): + return BooleanType() + class GetField(Expression): def __init__(self, item, field): @@ -217,6 +293,9 @@ def args(self): self.value ) + def data_type(self, schema): + return BooleanType() + class StartsWith(Expression): pretty_name = "startswith" @@ -235,6 +314,9 @@ def args(self): self.substr ) + def data_type(self, schema): + return BooleanType() + class EndsWith(Expression): pretty_name = "endswith" @@ -253,6 +335,9 @@ def args(self): self.substr ) + def data_type(self, schema): + return BooleanType() + class IsIn(Expression): def __init__(self, arg1, cols): @@ -270,6 +355,9 @@ def __str__(self): def args(self): return [self.arg1] + self.cols + def data_type(self, schema): + return BooleanType() + class IsNotNull(UnaryExpression): def eval(self, row, schema): @@ -278,6 +366,9 @@ def eval(self, row, schema): def __str__(self): return f"({self.column} IS NOT NULL)" + def data_type(self, schema): + return BooleanType() + class IsNull(UnaryExpression): def eval(self, row, schema): @@ -286,6 +377,9 @@ def eval(self, row, schema): def __str__(self): return f"({self.column} IS NULL)" + def data_type(self, schema): + return BooleanType() + class Cast(Expression): def __init__(self, column, destination_type): @@ -315,6 +409,9 @@ def args(self): self.destination_type ) + def data_type(self, schema): + return self.destination_type + class Substring(Expression): pretty_name = "substring" @@ -335,6 +432,9 @@ def args(self): self.length ) + def data_type(self, schema): + return StringType() + class Alias(Expression): def __init__(self, expr, alias: str): @@ -366,6 +466,9 @@ def args(self): self.alias ) + def data_type(self, schema): + return self.expr.data_type(schema) + class UnaryPositive(UnaryExpression): def eval(self, row, schema): @@ -374,6 +477,9 @@ def eval(self, row, schema): def __str__(self): return f"(+ {self.column})" + def data_type(self, schema): + return self.column.data_type(schema) + __all__ = [ "Negate", diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 698ab65ef..9cb4ac893 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -26,7 +26,7 @@ from sqlparser.internalparser import SqlParsingError -from .utils import require_minimum_pandas_version +from .utils import require_minimum_pandas_version, AnalysisException __all__ = [ "DataType", "NullType", "StringType", "BinaryType", "BooleanType", "DateType", @@ -199,6 +199,9 @@ class DecimalType(FractionalType): :param scale: the number of digits on right side of dot. (default: 0) """ + _MAX_PRECISION = 38 + _MINIMUM_ADJUSTED_SCALE = 6 + def __init__(self, precision=10, scale=0): self.precision = precision self.scale = scale @@ -213,6 +216,19 @@ def jsonValue(self): def __repr__(self): return "DecimalType(%d,%d)" % (self.precision, self.scale) + @classmethod + def adjust_precision_scale(cls, precision, scale): + if precision <= cls._MAX_PRECISION: + return cls(precision, scale) + if scale < 0: + return cls(cls._MAX_PRECISION, scale) + + current_digits = precision - scale + min_scale_value = min(scale, cls._MINIMUM_ADJUSTED_SCALE) + adjusted_scale = max(cls._MAX_PRECISION - current_digits, min_scale_value) + + return cls(cls._MAX_PRECISION, adjusted_scale) + class DoubleType(FractionalType): """Double data type, representing double precision floats. @@ -1093,6 +1109,57 @@ def _merge_type(a, b, name=None): return a +INTEGRAL_TYPES_ORDER = ( + # DecimalType, FloatType, DoubleType, + ByteType, ShortType, IntegerType, LongType +) + + +def largest_numeric_type(a, b, operation): + if a == b: + return a + if not isinstance(a, NumericType) or not isinstance(b, NumericType): + raise AnalysisException(f"Expected two numeric types, got {a} and {b}") + a_is_fractional = isinstance(a, FractionalType) + b_is_fractional = isinstance(b, FractionalType) + if not a_is_fractional and not b_is_fractional: + a_index = INTEGRAL_TYPES_ORDER.index(a) + b_index = INTEGRAL_TYPES_ORDER.index(b) + return INTEGRAL_TYPES_ORDER[max(a_index, b_index)] + if a_is_fractional and not b_is_fractional: + return a + if not a_is_fractional and b_is_fractional: + return b + if isinstance(a, (FloatType, DoubleType)) and isinstance(b, (FloatType, DoubleType)): + return DoubleType() + if isinstance(a, DecimalType) and isinstance(b, DecimalType): + return merge_decimal_types(a.precision, a.scale, b.precision, b.scale, operation) + raise AnalysisException(f"Unable to merge types {a} and {b}") + + +def merge_decimal_types(p1, s1, p2, s2, operation): + """ + Computes from 2 decimals precision and scale the operation result type + """ + if operation in ("add", "minus"): + result_scale = max(s1, s2) + return DecimalType.adjust_precision_scale(max(p1 - s1, p2 - s2) + result_scale + 1, result_scale) + elif operation == "multiply": + return DecimalType.adjust_precision_scale(p1 + p2 + 1, s1 + s2) + elif operation == "divide": + result_scale = max(6, s1 + p2 + 1) + return DecimalType.adjust_precision_scale(p1 - s1 + s2 + result_scale, result_scale) + elif operation == "mod": + result_scale = max(s1, s2) + return DecimalType.adjust_precision_scale(min(p1 - s1, p2 - s2) + result_scale, result_scale) + elif operation in ("bitwise_or", "bitwise_and", "bitwise_xor"): + if (p1, s1) != (p2, s2): + raise AnalysisException("data type mismatch: differing types") + return DecimalType.adjust_precision_scale(p1, s1) + else: + raise ValueError(f"Unknown operation {operation}") + + def _need_converter(dataType): if isinstance(dataType, StructType): return True From 4029a614da1513603aba1a2a85e4508671cad8e9 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:41:15 +0200 Subject: [PATCH 108/118] Add types to user defined expressions --- pysparkling/sql/expressions/userdefined.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysparkling/sql/expressions/userdefined.py b/pysparkling/sql/expressions/userdefined.py index f9559e18f..ae5cc386a 100644 --- a/pysparkling/sql/expressions/userdefined.py +++ b/pysparkling/sql/expressions/userdefined.py @@ -18,5 +18,8 @@ def __str__(self): def args(self): return self.exprs + def data_type(self, schema): + return self.return_type + __all__ = ["UserDefinedFunction"] From 59ebc4eca91234288247314ceea6c35555612569 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:41:35 +0200 Subject: [PATCH 109/118] Add types to string expressions --- pysparkling/sql/expressions/strings.py | 38 +++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/pysparkling/sql/expressions/strings.py b/pysparkling/sql/expressions/strings.py index c9ef35a43..a9f7a97da 100644 --- a/pysparkling/sql/expressions/strings.py +++ b/pysparkling/sql/expressions/strings.py @@ -1,7 +1,7 @@ import string from ...utils import levenshtein_distance -from ..types import StringType +from ..types import StringType, IntegerType from .expressions import Expression, UnaryExpression from .operators import Cast @@ -12,6 +12,9 @@ class StringTrim(UnaryExpression): def eval(self, row, schema): return self.column.eval(row, schema).strip() + def data_type(self, schema): + return StringType() + class StringLTrim(UnaryExpression): pretty_name = "ltrim" @@ -19,6 +22,9 @@ class StringLTrim(UnaryExpression): def eval(self, row, schema): return self.column.eval(row, schema).lstrip() + def data_type(self, schema): + return StringType() + class StringRTrim(UnaryExpression): pretty_name = "rtrim" @@ -26,6 +32,9 @@ class StringRTrim(UnaryExpression): def eval(self, row, schema): return self.column.eval(row, schema).rstrip() + def data_type(self, schema): + return StringType() + class StringInStr(Expression): pretty_name = "instr" @@ -49,6 +58,9 @@ def args(self): self.substr ) + def data_type(self, schema): + return IntegerType() + class StringLocate(Expression): pretty_name = "locate" @@ -77,6 +89,9 @@ def args(self): self.start ) + def data_type(self, schema): + return IntegerType() + class StringLPad(Expression): pretty_name = "lpad" @@ -100,6 +115,9 @@ def args(self): self.pad ) + def data_type(self, schema): + return StringType() + class StringRPad(Expression): pretty_name = "rpad" @@ -123,6 +141,9 @@ def args(self): self.pad ) + def data_type(self, schema): + return StringType() + class StringRepeat(Expression): pretty_name = "repeat" @@ -142,6 +163,9 @@ def args(self): self.n ) + def data_type(self, schema): + return StringType() + class StringTranslate(Expression): pretty_name = "translate" @@ -168,6 +192,9 @@ def args(self): self.replace_string ) + def data_type(self, schema): + return StringType() + class InitCap(UnaryExpression): pretty_name = "initcap" @@ -176,6 +203,9 @@ def eval(self, row, schema): value = Cast(self.column, StringType()).eval(row, schema) return " ".join(word.capitalize() for word in value.split()) + def data_type(self, schema): + return StringType() + class Levenshtein(Expression): pretty_name = "levenshtein" @@ -198,6 +228,9 @@ def args(self): self.column2 ) + def data_type(self, schema): + return IntegerType() + class SoundEx(UnaryExpression): pretty_name = "soundex" @@ -248,6 +281,9 @@ def _encode(self, letter): """ return self._soundex_mapping.get(letter) + def data_type(self, schema): + return StringType() + __all__ = [ "StringTrim", "StringTranslate", "StringRTrim", "StringRepeat", "StringRPad", From a5de2f7405632899d5fb7f19aa15121d1077a8af Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:41:47 +0200 Subject: [PATCH 110/118] Add types to order expressions --- pysparkling/sql/expressions/orders.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysparkling/sql/expressions/orders.py b/pysparkling/sql/expressions/orders.py index 6429abe43..8432d36f4 100644 --- a/pysparkling/sql/expressions/orders.py +++ b/pysparkling/sql/expressions/orders.py @@ -17,6 +17,9 @@ def __str__(self): def args(self): return (self.column,) + def data_type(self, schema): + return self.column.data_type(schema) + class AscNullsFirst(SortOrder): sort_order = "ASC NULLS FIRST" From 37b3e692fedcc918fa910f2db7ae70c7e2cdece9 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:57:39 +0200 Subject: [PATCH 111/118] Add types to mapper expressions --- pysparkling/sql/expressions/mappers.py | 234 ++++++++++++++++++++++++- 1 file changed, 232 insertions(+), 2 deletions(-) diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index 2e52d777a..21f1fc118 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -6,7 +6,8 @@ from ...utils import half_even_round, half_up_round, MonotonicallyIncreasingIDGenerator, XORShiftRandom from ..internal_utils.column import resolve_column -from ..types import create_row, StringType +from ..types import create_row, StringType, NullType, BooleanType, DoubleType, LongType, IntegerType, ArrayType, \ + StructType, StructField, MapType, BinaryType from ..utils import AnalysisException from .expressions import Expression, NullSafeColumnOperation, UnaryExpression from .operators import Cast @@ -72,6 +73,9 @@ def set_otherwise(self, default): default ) + def data_type(self, schema): + return self.values[0].data_type(schema) + class Otherwise(Expression): def __init__(self, conditions, values, default): @@ -105,6 +109,9 @@ def args(self): self.default ) + def data_type(self, schema): + return self.values[0].data_type(schema) + class RegExpExtract(Expression): pretty_name = "regexp_extract" @@ -137,6 +144,9 @@ def args(self): self.groupIdx ) + def data_type(self, schema): + return StringType() + class RegExpReplace(Expression): pretty_name = "regexp_replace" @@ -161,6 +171,9 @@ def args(self): self.replacement ) + def data_type(self, schema): + return StringType() + class Round(NullSafeColumnOperation): pretty_name = "round" @@ -178,6 +191,9 @@ def args(self): self.scale ) + def data_type(self, schema): + return self.column.data_type(schema) + class Bround(NullSafeColumnOperation): pretty_name = "bround" @@ -195,6 +211,9 @@ def args(self): self.scale ) + def data_type(self, schema): + return self.column.data_type(schema) + class FormatNumber(Expression): pretty_name = "format_number" @@ -219,6 +238,9 @@ def args(self): self.digits ) + def data_type(self, schema): + return StringType() + class SubstringIndex(Expression): pretty_name = "substring_index" @@ -240,6 +262,9 @@ def args(self): self.count ) + def data_type(self, schema): + return StringType() + class Coalesce(Expression): pretty_name = "coalesce" @@ -258,6 +283,13 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + for col in self.columns: + col_type = col.data_type(schema) + if col_type != NullType(): + return col_type + return NullType() + class IsNaN(UnaryExpression): pretty_name = "isnan" @@ -265,6 +297,9 @@ class IsNaN(UnaryExpression): def eval(self, row, schema): return math.isnan(self.eval(row, schema)) + def data_type(self, schema): + return BooleanType() + class NaNvl(Expression): pretty_name = "nanvl" @@ -287,6 +322,9 @@ def args(self): self.col2 ) + def data_type(self, schema): + return DoubleType() + class Hypot(Expression): pretty_name = "hypot" @@ -305,6 +343,9 @@ def args(self): self.b ) + def data_type(self, schema): + return DoubleType() + class Sqrt(UnaryExpression): pretty_name = "SQRT" @@ -312,6 +353,9 @@ class Sqrt(UnaryExpression): def eval(self, row, schema): return math.sqrt(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Cbrt(UnaryExpression): pretty_name = "CBRT" @@ -319,6 +363,9 @@ class Cbrt(UnaryExpression): def eval(self, row, schema): return self.column.eval(row, schema) ** 1. / 3. + def data_type(self, schema): + return DoubleType() + class Abs(UnaryExpression): pretty_name = "ABS" @@ -326,6 +373,9 @@ class Abs(UnaryExpression): def eval(self, row, schema): return abs(self.column.eval(row, schema)) + def data_type(self, schema): + return self.column.data_type(schema) + class Acos(UnaryExpression): pretty_name = "ACOS" @@ -333,6 +383,9 @@ class Acos(UnaryExpression): def eval(self, row, schema): return math.acos(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Asin(UnaryExpression): pretty_name = "ASIN" @@ -340,6 +393,9 @@ class Asin(UnaryExpression): def eval(self, row, schema): return math.asin(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Atan(UnaryExpression): pretty_name = "ATAN" @@ -347,6 +403,9 @@ class Atan(UnaryExpression): def eval(self, row, schema): return math.atan(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Atan2(Expression): pretty_name = "ATAN" @@ -365,6 +424,9 @@ def args(self): self.x ) + def data_type(self, schema): + return DoubleType() + class Tan(UnaryExpression): pretty_name = "TAN" @@ -372,6 +434,9 @@ class Tan(UnaryExpression): def eval(self, row, schema): return math.tan(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Tanh(UnaryExpression): pretty_name = "TANH" @@ -379,6 +444,9 @@ class Tanh(UnaryExpression): def eval(self, row, schema): return math.tanh(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Cos(UnaryExpression): pretty_name = "COS" @@ -386,6 +454,9 @@ class Cos(UnaryExpression): def eval(self, row, schema): return math.cos(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Cosh(UnaryExpression): pretty_name = "COSH" @@ -393,6 +464,9 @@ class Cosh(UnaryExpression): def eval(self, row, schema): return math.cosh(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Sin(UnaryExpression): pretty_name = "SIN" @@ -400,6 +474,9 @@ class Sin(UnaryExpression): def eval(self, row, schema): return math.sin(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Sinh(UnaryExpression): pretty_name = "SINH" @@ -407,6 +484,9 @@ class Sinh(UnaryExpression): def eval(self, row, schema): return math.sinh(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Exp(UnaryExpression): pretty_name = "EXP" @@ -414,6 +494,9 @@ class Exp(UnaryExpression): def eval(self, row, schema): return math.exp(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class ExpM1(UnaryExpression): pretty_name = "EXPM1" @@ -421,6 +504,9 @@ class ExpM1(UnaryExpression): def eval(self, row, schema): return math.expm1(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Factorial(UnaryExpression): pretty_name = "factorial" @@ -428,6 +514,9 @@ class Factorial(UnaryExpression): def eval(self, row, schema): return math.factorial(self.column.eval(row, schema)) + def data_type(self, schema): + return LongType() + class Floor(UnaryExpression): pretty_name = "FLOOR" @@ -435,6 +524,9 @@ class Floor(UnaryExpression): def eval(self, row, schema): return math.floor(self.column.eval(row, schema)) + def data_type(self, schema): + return LongType() + class Ceil(UnaryExpression): pretty_name = "CEIL" @@ -442,6 +534,9 @@ class Ceil(UnaryExpression): def eval(self, row, schema): return math.ceil(self.column.eval(row, schema)) + def data_type(self, schema): + return LongType() + class Log(Expression): pretty_name = "LOG" @@ -459,12 +554,15 @@ def eval(self, row, schema): def args(self): if self.base == math.e: - return (self.value, ) + return (self.value,) return ( self.base, self.value ) + def data_type(self, schema): + return DoubleType() + class Log10(UnaryExpression): pretty_name = "LOG10" @@ -472,6 +570,9 @@ class Log10(UnaryExpression): def eval(self, row, schema): return math.log10(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Log2(UnaryExpression): pretty_name = "LOG2" @@ -479,6 +580,9 @@ class Log2(UnaryExpression): def eval(self, row, schema): return math.log(self.column.eval(row, schema), 2) + def data_type(self, schema): + return DoubleType() + class Log1p(UnaryExpression): pretty_name = "LOG1P" @@ -486,6 +590,9 @@ class Log1p(UnaryExpression): def eval(self, row, schema): return math.log1p(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Rint(UnaryExpression): pretty_name = "ROUND" @@ -493,6 +600,9 @@ class Rint(UnaryExpression): def eval(self, row, schema): return round(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Signum(UnaryExpression): pretty_name = "SIGNUM" @@ -505,6 +615,9 @@ def eval(self, row, schema): return 1.0 return -1.0 + def data_type(self, schema): + return DoubleType() + class ToDegrees(UnaryExpression): pretty_name = "DEGREES" @@ -512,6 +625,9 @@ class ToDegrees(UnaryExpression): def eval(self, row, schema): return math.degrees(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class ToRadians(UnaryExpression): pretty_name = "RADIANS" @@ -519,6 +635,9 @@ class ToRadians(UnaryExpression): def eval(self, row, schema): return math.radians(self.column.eval(row, schema)) + def data_type(self, schema): + return DoubleType() + class Rand(Expression): pretty_name = "rand" @@ -537,6 +656,9 @@ def initialize(self, partition_index): def args(self): return self.seed + def data_type(self, schema): + return DoubleType() + class Randn(Expression): pretty_name = "randn" @@ -555,6 +677,9 @@ def initialize(self, partition_index): def args(self): return self.seed + def data_type(self, schema): + return DoubleType() + class SparkPartitionID(Expression): pretty_name = "SPARK_PARTITION_ID" @@ -572,6 +697,9 @@ def initialize(self, partition_index): def args(self): return () + def data_type(self, schema): + return IntegerType() + class CreateStruct(Expression): pretty_name = "struct" @@ -591,6 +719,12 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + return StructType([ + StructField(name=str(col), dataType=col.data_type(schema), nullable=True) + for col in self.columns + ]) + class Bin(UnaryExpression): pretty_name = "bin" @@ -598,6 +732,9 @@ class Bin(UnaryExpression): def eval(self, row, schema): return format(self.column.eval(row, schema), 'b') + def data_type(self, schema): + return StringType() + class ShiftLeft(Expression): pretty_name = "shiftleft" @@ -616,6 +753,9 @@ def args(self): self.num_bits ) + def data_type(self, schema): + return IntegerType() + class ShiftRight(Expression): pretty_name = "shiftright" @@ -634,6 +774,9 @@ def args(self): self.num_bits ) + def data_type(self, schema): + return IntegerType() + class ShiftRightUnsigned(Expression): pretty_name = "shiftrightunsigned" @@ -653,6 +796,9 @@ def args(self): self.num_bits ) + def data_type(self, schema): + return IntegerType() + class Greatest(Expression): pretty_name = "greatest" @@ -668,6 +814,11 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + if not self.columns: + return NullType() + return self.columns[0].data_type(schema) + class Least(Expression): pretty_name = "least" @@ -683,6 +834,11 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + if not self.columns: + return NullType() + return self.columns[0].data_type(schema) + class Length(UnaryExpression): pretty_name = "length" @@ -690,6 +846,9 @@ class Length(UnaryExpression): def eval(self, row, schema): return len(str(self.column.eval(row, schema))) + def data_type(self, schema): + return IntegerType() + class Lower(UnaryExpression): pretty_name = "lower" @@ -697,6 +856,9 @@ class Lower(UnaryExpression): def eval(self, row, schema): return str(self.column.eval(row, schema)).lower() + def data_type(self, schema): + return StringType() + class Upper(UnaryExpression): pretty_name = "upper" @@ -704,6 +866,9 @@ class Upper(UnaryExpression): def eval(self, row, schema): return str(self.column.eval(row, schema)).upper() + def data_type(self, schema): + return StringType() + class Concat(Expression): pretty_name = "concat" @@ -718,6 +883,9 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + return StringType() + class ConcatWs(Expression): pretty_name = "concat_ws" @@ -735,6 +903,9 @@ def args(self): return [self.sep] + list(self.columns) return [self.sep] + def data_type(self, schema): + return StringType() + class Reverse(UnaryExpression): pretty_name = "reverse" @@ -742,6 +913,9 @@ class Reverse(UnaryExpression): def eval(self, row, schema): return str(self.column.eval(row, schema))[::-1] + def data_type(self, schema): + return StringType() + class MapKeys(UnaryExpression): pretty_name = "map_keys" @@ -749,6 +923,9 @@ class MapKeys(UnaryExpression): def eval(self, row, schema): return list(self.column.eval(row, schema).keys()) + def data_type(self, schema): + return ArrayType(elementType=self.column.data_type(schema).keyType) + class MapValues(UnaryExpression): pretty_name = "map_values" @@ -756,6 +933,9 @@ class MapValues(UnaryExpression): def eval(self, row, schema): return list(self.column.eval(row, schema).values()) + def data_type(self, schema): + return ArrayType(elementType=self.column.data_type(schema).valueType) + class MapEntries(UnaryExpression): pretty_name = "map_entries" @@ -763,6 +943,9 @@ class MapEntries(UnaryExpression): def eval(self, row, schema): return list(self.column.eval(row, schema).items()) + def data_type(self, schema): + return ArrayType(elementType=self.column.data_type(schema).valueType) + class MapFromEntries(UnaryExpression): pretty_name = "map_from_entries" @@ -770,6 +953,15 @@ class MapFromEntries(UnaryExpression): def eval(self, row, schema): return dict(self.column.eval(row, schema)) + def data_type(self, schema): + map_type = self.column.data_type(schema) + key_type = map_type.keyType + value_type = map_type.valueType + return ArrayType(elementType=StructType([ + StructField("key", key_type, True), + StructField("value", value_type, True), + ])) + class MapConcat(Expression): pretty_name = "map_concat" @@ -789,6 +981,11 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + if not self.columns: + return MapType(keyType=StringType(), valueType=StringType) + return self.columns[0].data_type(schema) + class StringSplit(Expression): pretty_name = "split" @@ -816,6 +1013,9 @@ def args(self): self.limit ) + def data_type(self, schema): + return ArrayType(elementType=StringType()) + class Conv(Expression): pretty_name = "conv" @@ -916,6 +1116,9 @@ def convert(from_string, from_base, to_base, positive_only=False): return returned_string + def data_type(self, schema): + return StringType() + class Hex(UnaryExpression): pretty_name = "hex" @@ -928,6 +1131,9 @@ def eval(self, row, schema): positive_only=True ) + def data_type(self, schema): + return StringType() + class Unhex(UnaryExpression): pretty_name = "unhex" @@ -940,6 +1146,9 @@ def eval(self, row, schema): positive_only=True ) + def data_type(self, schema): + return StringType() + class Ascii(UnaryExpression): pretty_name = "ascii" @@ -953,6 +1162,9 @@ def eval(self, row, schema): return None return ord(value_as_string[0]) + def data_type(self, schema): + return StringType() + class MonotonicallyIncreasingID(Expression): pretty_name = "monotonically_increasing_id" @@ -970,6 +1182,9 @@ def initialize(self, partition_index): def args(self): return () + def data_type(self, schema): + return LongType() + class Base64(UnaryExpression): pretty_name = "base64" @@ -979,6 +1194,9 @@ def eval(self, row, schema): encoded = base64.b64encode(bytes(value, encoding="utf-8")) return str(encoded)[2:-1] + def data_type(self, schema): + return StringType() + class UnBase64(UnaryExpression): pretty_name = "unbase64" @@ -987,6 +1205,9 @@ def eval(self, row, schema): value = self.column.eval(row, schema) return bytearray(base64.b64decode(value)) + def data_type(self, schema): + return BinaryType() + class GroupingID(Expression): pretty_name = "grouping_id" @@ -1007,6 +1228,9 @@ def eval(self, row, schema): def args(self): return self.columns + def data_type(self, schema): + return IntegerType() + class Grouping(UnaryExpression): pretty_name = "grouping" @@ -1018,6 +1242,9 @@ def eval(self, row, schema): pos = self.column.find_position_in_schema(schema) return int(metadata["grouping"][pos]) + def data_type(self, schema): + return self.column.data_type(schema) + class InputFileName(Expression): pretty_name = "input_file_name" @@ -1031,6 +1258,9 @@ def eval(self, row, schema): def args(self): return () + def data_type(self, schema): + return StringType() + __all__ = [ "Grouping", "GroupingID", "Coalesce", "IsNaN", "MonotonicallyIncreasingID", "NaNvl", "Rand", From 91b2e3de660c26c7ab3a34458e5cbbfc468d6cf3 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:58:52 +0200 Subject: [PATCH 112/118] Fix type handling in some expression --- pysparkling/sql/expressions/mappers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index 21f1fc118..5ec2aa02d 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -598,7 +598,7 @@ class Rint(UnaryExpression): pretty_name = "ROUND" def eval(self, row, schema): - return round(self.column.eval(row, schema)) + return float(round(self.column.eval(row, schema))) def data_type(self, schema): return DoubleType() @@ -745,7 +745,7 @@ def __init__(self, arg, num_bits): self.num_bits = num_bits.get_literal_value() def eval(self, row, schema): - return self.arg.eval(row, schema) << self.num_bits + return int(self.arg.eval(row, schema)) << self.num_bits def args(self): return ( @@ -766,7 +766,7 @@ def __init__(self, arg, num_bits): self.num_bits = num_bits.get_literal_value() def eval(self, row, schema): - return self.arg.eval(row, schema) >> self.num_bits + return int(self.arg.eval(row, schema)) >> self.num_bits def args(self): return ( @@ -787,7 +787,7 @@ def __init__(self, arg, num_bits): self.num_bits = num_bits.get_literal_value() def eval(self, row, schema): - rightShifted = self.arg.eval(row, schema) >> self.num_bits + rightShifted = int(self.arg.eval(row, schema)) >> self.num_bits return rightShifted % JVM_MAX_INTEGER_SIZE def args(self): From 78fc641c40ba6219918eedea43fb65161b78ac1c Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 10:59:13 +0200 Subject: [PATCH 113/118] Fix typo in error message --- pysparkling/sql/expressions/mappers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index 5ec2aa02d..bde7127d2 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -1238,7 +1238,7 @@ class Grouping(UnaryExpression): def eval(self, row, schema): metadata = row.get_metadata() if metadata is None or "grouping" not in metadata: - raise AnalysisException("grouping_id() can only be used with GroupingSets/Cube/Rollup") + raise AnalysisException("grouping() can only be used with GroupingSets/Cube/Rollup") pos = self.column.find_position_in_schema(schema) return int(metadata["grouping"][pos]) From b44adf6efde9ad2f6af8ea26520cf3527b4e67ee Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 12:03:57 +0200 Subject: [PATCH 114/118] Fix Column handling in arrays --- pysparkling/sql/expressions/arrays.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysparkling/sql/expressions/arrays.py b/pysparkling/sql/expressions/arrays.py index e6297fd9b..1758202d2 100644 --- a/pysparkling/sql/expressions/arrays.py +++ b/pysparkling/sql/expressions/arrays.py @@ -119,7 +119,7 @@ def args(self): ) def data_type(self, schema): - if not self.keys: + if not isinstance(self.keys, Column) and not self.keys: return MapType(keyType=NullType, valueType=NullType) return MapType( keyType=self.keys[0].data_type(schema), From b87e861c3c501219a677d78281d9699a65e43bca Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 12:04:47 +0200 Subject: [PATCH 115/118] Add types to field expressions --- pysparkling/sql/expressions/fields.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysparkling/sql/expressions/fields.py b/pysparkling/sql/expressions/fields.py index 23c794590..1cb8c9815 100644 --- a/pysparkling/sql/expressions/fields.py +++ b/pysparkling/sql/expressions/fields.py @@ -20,6 +20,9 @@ def output_fields(self, schema): def args(self): return (self.field,) + def data_type(self, schema): + return schema[find_position_in_schema(schema, self.field)].dataType + def find_position_in_schema(schema, expr): if isinstance(expr, str): From 6d60eb2c80c946f52437be11e4fbb6c40d711621 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 12:23:36 +0200 Subject: [PATCH 116/118] Clarify non deterministic column initialization code --- pysparkling/sql/internals.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pysparkling/sql/internals.py b/pysparkling/sql/internals.py index 9acefd147..8aff7a30d 100644 --- a/pysparkling/sql/internals.py +++ b/pysparkling/sql/internals.py @@ -358,20 +358,21 @@ def select(self, *exprs): def select_mapper(partition_index, partition): # Initialize non deterministic functions so that they are reproducible - initialized_cols = [col.initialize(partition_index) for col in cols] - generators = [col for col in initialized_cols if col.may_output_multiple_rows] - non_generators = [col for col in initialized_cols if not col.may_output_multiple_rows] + for col in cols: + col.initialize(partition_index) + generators = [col for col in cols if col.may_output_multiple_rows] + non_generators = [col for col in cols if not col.may_output_multiple_rows] number_of_generators = len(generators) if number_of_generators > 1: raise Exception( "Only one generator allowed per select clause" - f" but found {number_of_generators}: {', '.join(generators)}" + f" but found {number_of_generators}: {', '.join(str(g) for g in generators)}" ) return self.get_select_output_field_lists( partition, non_generators, - initialized_cols, + cols, generators[0] if generators else None ) @@ -423,8 +424,8 @@ def filter(self, condition): condition = parse(condition) def mapper(partition_index, partition): - initialized_condition = condition.initialize(partition_index) - return (row for row in partition if initialized_condition.eval(row, self.bound_schema)) + condition.initialize(partition_index) + return (row for row in partition if condition.eval(row, self.bound_schema)) return self._with_rdd( self._rdd.mapPartitionsWithIndex(mapper), From 507f4f7a6fde44021e07437ceaed1f3977e4e324 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 12:35:10 +0200 Subject: [PATCH 117/118] Apply linter guidelines --- pysparkling/sql/column.py | 1 + pysparkling/sql/expressions/arrays.py | 5 +++-- pysparkling/sql/expressions/dates.py | 4 +++- pysparkling/sql/expressions/explodes.py | 2 +- pysparkling/sql/expressions/jsons.py | 2 +- pysparkling/sql/expressions/mappers.py | 6 ++++-- pysparkling/sql/expressions/operators.py | 2 +- pysparkling/sql/expressions/strings.py | 2 +- pysparkling/sql/types.py | 13 ++++++------- 9 files changed, 21 insertions(+), 16 deletions(-) diff --git a/pysparkling/sql/column.py b/pysparkling/sql/column.py index 7deca5bff..822212ee4 100644 --- a/pysparkling/sql/column.py +++ b/pysparkling/sql/column.py @@ -688,6 +688,7 @@ def data_type(self, schema): try: return schema[self.expr].dataType except KeyError: + # pylint: disable=raise-missing-from raise AnalysisException( f"cannot resolve '`{self.expr}`' given input columns: {schema.fields};" ) diff --git a/pysparkling/sql/expressions/arrays.py b/pysparkling/sql/expressions/arrays.py index 1758202d2..edf901c27 100644 --- a/pysparkling/sql/expressions/arrays.py +++ b/pysparkling/sql/expressions/arrays.py @@ -1,4 +1,5 @@ -from ..types import BooleanType, ArrayType, NullType, MapType, IntegerType, StringType, StructType +from ..column import Column +from ..types import ArrayType, BooleanType, IntegerType, MapType, NullType, StringType, StructType from ..utils import AnalysisException from .expressions import BinaryOperation, Expression, UnaryExpression @@ -337,7 +338,7 @@ def __init__(self, columns): def eval(self, row, schema): return [ - {i: v for i, v in enumerate(combination)} + dict(enumerate(combination)) for combination in zip( *(c.eval(row, schema) for c in self.columns) ) diff --git a/pysparkling/sql/expressions/dates.py b/pysparkling/sql/expressions/dates.py index 224073753..f68389b30 100644 --- a/pysparkling/sql/expressions/dates.py +++ b/pysparkling/sql/expressions/dates.py @@ -5,7 +5,7 @@ from ...utils import parse_tz from ..casts import get_time_formatter, get_unix_timestamp_parser -from ..types import DateType, FloatType, TimestampType, IntegerType, DoubleType, StringType, LongType +from ..types import DateType, DoubleType, FloatType, IntegerType, LongType, StringType, TimestampType from .expressions import Expression, UnaryExpression from .operators import Cast @@ -35,6 +35,7 @@ def args(self): def data_type(self, schema): return DateType() + class DateAdd(Expression): pretty_name = "date_add" @@ -56,6 +57,7 @@ def args(self): def data_type(self, schema): return DateType() + class DateSub(Expression): pretty_name = "date_sub" diff --git a/pysparkling/sql/expressions/explodes.py b/pysparkling/sql/expressions/explodes.py index c55ffdef5..6612dd774 100644 --- a/pysparkling/sql/expressions/explodes.py +++ b/pysparkling/sql/expressions/explodes.py @@ -1,4 +1,4 @@ -from ..types import DataType, IntegerType, StructField, StructType +from ..types import IntegerType, StructField, StructType from .expressions import UnaryExpression diff --git a/pysparkling/sql/expressions/jsons.py b/pysparkling/sql/expressions/jsons.py index fa2ef94a8..96de60d7f 100644 --- a/pysparkling/sql/expressions/jsons.py +++ b/pysparkling/sql/expressions/jsons.py @@ -1,9 +1,9 @@ import json -from ..types import StringType from ...utils import get_json_encoder from ..internal_utils.options import Options from ..internal_utils.readers.jsonreader import JSONReader +from ..types import StringType from .expressions import Expression diff --git a/pysparkling/sql/expressions/mappers.py b/pysparkling/sql/expressions/mappers.py index bde7127d2..657e9d5f9 100644 --- a/pysparkling/sql/expressions/mappers.py +++ b/pysparkling/sql/expressions/mappers.py @@ -6,8 +6,10 @@ from ...utils import half_even_round, half_up_round, MonotonicallyIncreasingIDGenerator, XORShiftRandom from ..internal_utils.column import resolve_column -from ..types import create_row, StringType, NullType, BooleanType, DoubleType, LongType, IntegerType, ArrayType, \ - StructType, StructField, MapType, BinaryType +from ..types import ( + ArrayType, BinaryType, BooleanType, create_row, DoubleType, IntegerType, LongType, MapType, NullType, StringType, + StructField, StructType +) from ..utils import AnalysisException from .expressions import Expression, NullSafeColumnOperation, UnaryExpression from .operators import Cast diff --git a/pysparkling/sql/expressions/operators.py b/pysparkling/sql/expressions/operators.py index 2dc012292..70310b6ae 100644 --- a/pysparkling/sql/expressions/operators.py +++ b/pysparkling/sql/expressions/operators.py @@ -1,5 +1,5 @@ from ..casts import get_caster -from ..types import Row, StructType, DoubleType, BooleanType, StringType, largest_numeric_type +from ..types import BooleanType, DoubleType, largest_numeric_type, Row, StringType, StructType from .expressions import BinaryOperation, Expression, NullSafeBinaryOperation, TypeSafeBinaryOperation, UnaryExpression diff --git a/pysparkling/sql/expressions/strings.py b/pysparkling/sql/expressions/strings.py index a9f7a97da..3f5311ddb 100644 --- a/pysparkling/sql/expressions/strings.py +++ b/pysparkling/sql/expressions/strings.py @@ -1,7 +1,7 @@ import string from ...utils import levenshtein_distance -from ..types import StringType, IntegerType +from ..types import IntegerType, StringType from .expressions import Expression, UnaryExpression from .operators import Cast diff --git a/pysparkling/sql/types.py b/pysparkling/sql/types.py index 9cb4ac893..5447b52b9 100644 --- a/pysparkling/sql/types.py +++ b/pysparkling/sql/types.py @@ -26,7 +26,7 @@ from sqlparser.internalparser import SqlParsingError -from .utils import require_minimum_pandas_version, AnalysisException +from .utils import AnalysisException, require_minimum_pandas_version __all__ = [ "DataType", "NullType", "StringType", "BinaryType", "BooleanType", "DateType", @@ -1144,20 +1144,19 @@ def merge_decimal_types(p1, s1, p2, s2, operation): if operation in ("add", "minus"): result_scale = max(s1, s2) return DecimalType.adjust_precision_scale(max(p1 - s1, p2 - s2) + result_scale + 1, result_scale) - elif operation == "multiply": + if operation == "multiply": return DecimalType.adjust_precision_scale(p1 + p2 + 1, s1 + s2) - elif operation == "divide": + if operation == "divide": result_scale = max(6, s1 + p2 + 1) return DecimalType.adjust_precision_scale(p1 - s1 + s2 + result_scale, result_scale) - elif operation == "mod": + if operation == "mod": result_scale = max(s1, s2) return DecimalType.adjust_precision_scale(min(p1 - s1, p2 - s2) + result_scale, result_scale) - elif operation in ("bitwise_or", "bitwise_and", "bitwise_xor"): + if operation in ("bitwise_or", "bitwise_and", "bitwise_xor"): if (p1, s1) != (p2, s2): raise AnalysisException("data type mismatch: differing types") return DecimalType.adjust_precision_scale(p1, s1) - else: - raise ValueError(f"Unknown operation {operation}") + raise ValueError(f"Unknown operation {operation}") def _need_converter(dataType): From 9eb755a9411d9157cd1e803a1cd7d6d19bf27f00 Mon Sep 17 00:00:00 2001 From: tools4origins Date: Sun, 26 Sep 2021 12:38:18 +0200 Subject: [PATCH 118/118] fix(dataFrameShow): Remove extra new lines --- pysparkling/sql/internals.py | 2 +- setup.cfg | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pysparkling/sql/internals.py b/pysparkling/sql/internals.py index 8aff7a30d..fccd187bf 100644 --- a/pysparkling/sql/internals.py +++ b/pysparkling/sql/internals.py @@ -638,7 +638,7 @@ def horizontal_show(rows, cols, truncate, min_col_width): output += sep output += _generate_show_layout('|', padded_header) output += sep - output += '\n'.join(_generate_show_layout('|', row) for row in padded_rows) + output += ''.join(_generate_show_layout('|', row) for row in padded_rows) output += sep return output diff --git a/setup.cfg b/setup.cfg index fbb7bd5a2..ba9e7fdbb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,7 +6,6 @@ max-line-length = 119 [tool:pytest] addopts = --doctest-modules --cov=pysparkling --cov-report=html --cov-branch testpaths = pysparkling -doctest_optionflags = ALLOW_UNICODE NORMALIZE_WHITESPACE [pycodestyle] max-line-length=119 @@ -47,4 +46,4 @@ order_by_type = False case_sensitive = False multi_line_output = 5 force_sort_within_sections = True -skip = versioneer.py \ No newline at end of file +skip = versioneer.py